[
  {
    "path": ".github/FUNDING.yml",
    "content": "github: maxgoedjen\n"
  },
  {
    "path": ".github/scripts/signing.sh",
    "content": "#!/bin/bash\n\n# Import certificate and private key\necho $SIGNING_DATA | base64 -d -o Signing.p12\nsecurity create-keychain -p ci ci.keychain\nsecurity default-keychain -s ci.keychain\nsecurity list-keychains -s ci.keychain\nsecurity import ./Signing.p12 -k ci.keychain -P $SIGNING_PASSWORD -A\nsecurity set-key-partition-list -S apple-tool:,apple:,codesign: -s -k ci ci.keychain\n\n# Import Profiles\nmkdir -p ~/Library/MobileDevice/Provisioning\\ Profiles\necho $HOST_PROFILE_DATA | base64 -d -o Host.provisionprofile\nHOST_UUID=`grep UUID -A1 -a Host.provisionprofile | grep -io \"[-A-F0-9]\\{36\\}\"`\ncp Host.provisionprofile ~/Library/MobileDevice/Provisioning\\ Profiles/$HOST_UUID.provisionprofile\necho $AGENT_PROFILE_DATA | base64 -d -o Agent.provisionprofile\nAGENT_UUID=`grep UUID -A1 -a Agent.provisionprofile | grep -io \"[-A-F0-9]\\{36\\}\"`\ncp Agent.provisionprofile ~/Library/MobileDevice/Provisioning\\ Profiles/$AGENT_UUID.provisionprofile\n\n# Create directories for ASC key\nmkdir ~/.private_keys\necho -n \"$APPLE_API_KEY_DATA\" > ~/.private_keys/AuthKey_$APPLE_API_KEY_ID.p8\n"
  },
  {
    "path": ".github/templates/release.md",
    "content": "Update description\n\n## Features\n\n\n## Fixes\n\n\n## Minimum macOS Version\n\n\n## Build\nhttps://github.com/maxgoedjen/secretive/actions/runs/RUN_ID\n\n## Attestation\nhttps://github.com/maxgoedjen/secretive/attestations/ATTESTATION_ID\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL Advanced\"\n\non:\n  push:\n    branches: [ \"main\" ]\n  pull_request:\n    branches: [ \"main\" ]\n  schedule:\n    - cron: '26 15 * * 3'\n\njobs:\n  analyze:\n    name: Analyze (${{ matrix.language }})\n    runs-on: ${{ (matrix.language == 'swift' && 'macos-26') || 'ubuntu-latest' }}\n    permissions:\n      security-events: write\n      packages: read\n      actions: read\n      contents: read\n\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n        - language: actions\n          build-mode: none\n        # Disable this until CodeQL supports Xcode 26 builds.\n        # - language: swift\n        #   build-mode: manual\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: ${{ matrix.language }}\n        build-mode: ${{ matrix.build-mode }}\n    - if: matrix.build-mode == 'manual'\n      name: \"Select Xcode\"\n      run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app\n    - if: matrix.build-mode == 'manual'\n      name: \"Build\"\n      run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme Secretive CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n      with:\n        category: \"/language:${{matrix.language}}\"\n"
  },
  {
    "path": ".github/workflows/nightly.yml",
    "content": "name: Nightly\n\non: \n  schedule: \n    - cron: \"0 8 * * *\"\n  \njobs:\n  build:\n    runs-on: macos-26\n    permissions:\n      id-token: write\n      contents: write\n      attestations: write\n      actions: read\n    timeout-minutes: 10\n    steps:\n    - uses: actions/checkout@v5\n    - name: Setup Signing\n      env: \n        SIGNING_DATA: ${{ secrets.SIGNING_DATA }}\n        SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}\n        HOST_PROFILE_DATA: ${{ secrets.HOST_PROFILE_DATA }}\n        AGENT_PROFILE_DATA: ${{ secrets.AGENT_PROFILE_DATA }}\n        APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}\n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n      run: ./.github/scripts/signing.sh\n    - name: Set Environment\n      run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app\n    - name: Update Build Number\n      env:\n        RUN_ID: ${{ github.run_id }}\n      run: |\n            DATE=$(date \"+%Y-%m-%d\")\n            sed -i '' -e \"s/GITHUB_CI_VERSION/0.0.0_nightly-$DATE/g\" Sources/Config/Config.xcconfig\n            sed -i '' -e \"s/GITHUB_BUILD_NUMBER/1.$RUN_ID/g\" Sources/Config/Config.xcconfig\n            sed -i '' -e \"s/GITHUB_BUILD_URL/https:\\/\\/github.com\\/maxgoedjen\\/secretive\\/actions\\/runs\\/$RUN_ID/g\" Sources/Config/Config.xcconfig\n    - name: Build\n      run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme Secretive -configuration Release -archivePath Archive.xcarchive archive\n    - name: Move to Artifact Folder\n      run: mkdir Artifact; cp -r Archive.xcarchive/Products/Applications/Secretive.app Artifact\n    - name: Upload App to Artifacts\n      id: upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: Secretive\n        path: Artifact\n    - name: Download Zipped Artifact\n      id: download\n      env: \n        ZIP_ID: ${{ steps.upload.outputs.artifact-id }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n            curl -L -H \"Authorization: Bearer $GITHUB_TOKEN\" -L \\\n            https://api.github.com/repos/maxgoedjen/secretive/actions/artifacts/$ZIP_ID/zip > Secretive.zip\n    - name: Notarize\n      env: \n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n        APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}\n      run: xcrun notarytool submit --key ~/.private_keys/AuthKey_$APPLE_API_KEY_ID.p8 --key-id $APPLE_API_KEY_ID --issuer $APPLE_API_ISSUER Secretive.zip\n    - name: Attest\n      id: attest\n      uses: actions/attest-build-provenance@v2\n      with:\n        subject-name: \"Secretive.zip\"\n        subject-digest: sha256:${{ steps.upload.outputs.artifact-digest }}\n"
  },
  {
    "path": ".github/workflows/oneoff.yml",
    "content": "name: One-Off Build\n\non: \n  workflow_dispatch:\n  \njobs:\n  build:\n    runs-on: macos-26\n    permissions:\n      id-token: write\n      contents: write\n      attestations: write\n      actions: read\n    timeout-minutes: 10\n    steps:\n    - uses: actions/checkout@v5\n    - name: Setup Signing\n      env: \n        SIGNING_DATA: ${{ secrets.SIGNING_DATA }}\n        SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}\n        HOST_PROFILE_DATA: ${{ secrets.HOST_PROFILE_DATA }}\n        AGENT_PROFILE_DATA: ${{ secrets.AGENT_PROFILE_DATA }}\n        APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}\n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n      run: ./.github/scripts/signing.sh\n    - name: Set Environment\n      run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app\n    - name: Update Build Number\n      env:\n        RUN_ID: ${{ github.run_id }}\n      run: |\n            DATE=$(date \"+%Y-%m-%d\")\n            sed -i '' -e \"s/GITHUB_CI_VERSION/0.0.0_oneoff-$DATE/g\" Sources/Config/Config.xcconfig\n            sed -i '' -e \"s/GITHUB_BUILD_NUMBER/1.$RUN_ID/g\" Sources/Config/Config.xcconfig\n            sed -i '' -e \"s/GITHUB_BUILD_URL/https:\\/\\/github.com\\/maxgoedjen\\/secretive\\/actions\\/runs\\/$RUN_ID/g\" Sources/Config/Config.xcconfig\n    - name: Build\n      run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme Secretive -configuration Release -archivePath Archive.xcarchive archive\n    - name: Move to Artifact Folder\n      run: mkdir Artifact; cp -r Archive.xcarchive/Products/Applications/Secretive.app Artifact\n    - name: Upload App to Artifacts\n      id: upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: Secretive\n        path: Artifact\n    - name: Download Zipped Artifact\n      id: download\n      env: \n        ZIP_ID: ${{ steps.upload.outputs.artifact-id }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n            curl -L -H \"Authorization: Bearer $GITHUB_TOKEN\" -L \\\n            https://api.github.com/repos/maxgoedjen/secretive/actions/artifacts/$ZIP_ID/zip > Secretive.zip\n    - name: Notarize\n      env: \n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n        APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}\n      run: xcrun notarytool submit --key ~/.private_keys/AuthKey_$APPLE_API_KEY_ID.p8 --key-id $APPLE_API_KEY_ID --issuer $APPLE_API_ISSUER Secretive.zip\n    - name: Attest\n      id: attest\n      uses: actions/attest-build-provenance@v2\n      with:\n        subject-name: \"Secretive.zip\"\n        subject-digest: sha256:${{ steps.upload.outputs.artifact-digest }}\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non: \n  push:\n    tags:\n      - '*'\njobs:\n  test:\n    permissions:\n        contents: read\n    runs-on: macos-26\n    timeout-minutes: 10\n    steps:\n    - uses: actions/checkout@v5\n    - name: Setup Signing\n      env: \n        SIGNING_DATA: ${{ secrets.SIGNING_DATA }}\n        SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}\n        HOST_PROFILE_DATA: ${{ secrets.HOST_PROFILE_DATA }}\n        AGENT_PROFILE_DATA: ${{ secrets.AGENT_PROFILE_DATA }}\n        APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}\n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n      run: ./.github/scripts/signing.sh\n    - name: Set Environment\n      run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app\n    - name: Test\n      run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme PackageTests test\n      # SPM doesn't seem to pick up on the tests currently?\n      # run: swift test --build-system swiftbuild --package-path Sources/Packages\n  build:\n    permissions:\n      id-token: write\n      contents: write\n      attestations: write\n      actions: read\n    runs-on: macos-26\n    timeout-minutes: 10\n    steps:\n    - uses: actions/checkout@v5\n    - name: Setup Signing\n      env: \n        SIGNING_DATA: ${{ secrets.SIGNING_DATA }}\n        SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}\n        HOST_PROFILE_DATA: ${{ secrets.HOST_PROFILE_DATA }}\n        AGENT_PROFILE_DATA: ${{ secrets.AGENT_PROFILE_DATA }}\n        APPLE_API_KEY_DATA: ${{ secrets.APPLE_API_KEY_DATA }}\n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n      run: ./.github/scripts/signing.sh\n    - name: Set Environment\n      run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app\n    - name: Update Build Number\n      env:\n        TAG_NAME: ${{ github.ref }}\n        RUN_ID: ${{ github.run_id }}\n      run: |\n            export CLEAN_TAG=$(echo $TAG_NAME | sed -e 's/refs\\/tags\\/v//')\n            sed -i '' -e \"s/GITHUB_CI_VERSION/$CLEAN_TAG/g\" Sources/Config/Config.xcconfig\n            sed -i '' -e \"s/GITHUB_BUILD_NUMBER/1.$RUN_ID/g\" Sources/Config/Config.xcconfig\n            sed -i '' -e \"s/GITHUB_BUILD_URL/github.com\\/maxgoedjen\\/secretive\\/actions\\/runs\\/$RUN_ID/g\" Sources/Config/Config.xcconfig\n    - name: Build\n      run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme Secretive -configuration Release -archivePath Archive.xcarchive archive\n    - name: Move to Artifact Folder\n      run: mkdir Artifact; cp -r Archive.xcarchive/Products/Applications/Secretive.app Artifact\n    - name: Upload App to Artifacts\n      id: upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: Secretive.zip\n        path: Artifact\n    - name: Download Zipped Artifact\n      id: download\n      env: \n        ZIP_ID: ${{ steps.upload.outputs.artifact-id }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n            curl -L -H \"Authorization: Bearer $GITHUB_TOKEN\" -L \\\n            https://api.github.com/repos/maxgoedjen/secretive/actions/artifacts/$ZIP_ID/zip > Secretive.zip\n    - name: Notarize\n      env: \n        APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}\n        APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}\n      run: xcrun notarytool submit --key ~/.private_keys/AuthKey_$APPLE_API_KEY_ID.p8 --key-id $APPLE_API_KEY_ID --issuer $APPLE_API_ISSUER Secretive.zip\n    - name: Attest\n      id: attest\n      uses: actions/attest-build-provenance@v2\n      with:\n        subject-path: \"Secretive.zip\"\n    - name: Create Release\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        TAG_NAME: ${{ github.ref }}\n        RUN_ID: ${{ github.run_id }}\n        ATTESTATION_ID: ${{ steps.attest.outputs.attestation-id }}\n      run: |\n            sed -i.tmp \"s/RUN_ID/$RUN_ID/g\" .github/templates/release.md\n            sed -i.tmp \"s/ATTESTATION_ID/$ATTESTATION_ID/g\" .github/templates/release.md\n            gh release create $TAG_NAME -d -F .github/templates/release.md\n            gh release upload $TAG_NAME Secretive.zip\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\n\non: [push, pull_request]\njobs:\n  test:\n    permissions:\n        contents: read\n    runs-on: macos-26\n    timeout-minutes: 10\n    steps:\n    - uses: actions/checkout@v5\n    - name: Set Environment\n      run: sudo xcrun xcode-select -s /Applications/Xcode_26.4.app\n    - name: Test Main Packages\n      run: xcrun xcodebuild -project Sources/Secretive.xcodeproj -scheme PackageTests test\n      # SPM doesn't seem to pick up on the tests currently?\n      # run: swift test --build-system swiftbuild --package-path Sources/Packages\n    - name: Test SecretKit Packages\n      run: swift test --build-system swiftbuild\n"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## User settings\nxcuserdata/\n\n## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)\n*.xcscmblueprint\n*.xccheckout\n\n## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)\nbuild/\nDerivedData/\n*.moved-aside\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\n\n## Obj-C/Swift specific\n*.hmap\n\n## App packaging\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n# *.xcodeproj\n#\n# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata\n# hence it is not needed unless you have added a package configuration file to your project\n# .swiftpm\n\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n#\n# Add this line if you want to avoid checking in source code from the Xcode workspace\n# *.xcworkspace\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build/\n\n# Accio dependency management\nDependencies/\n.accio/\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo.\n# Instead, use fastlane to re-generate the screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots/**/*.png\nfastlane/test_output\n\n# Code Injection\n#\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n\n# Build script products\nArchive.xcarchive\n.DS_Store\ncontents.xcworkspacedata\n\n# Per-User Configs\n\nSources/Config/OpenSource.xcconfig"
  },
  {
    "path": "APP_CONFIG.md",
    "content": "# App Configuration\n\nInstructions for setting up apps and shells has moved to [secretive-config-instructions](https://github.com/maxgoedjen/secretive-config-instructions)!\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at max.goedjen@gmail.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Secretive\n\nThanks for your interest in contributing to Secretive! Before you contribute, there are a few things I'd like to lay out.\n\n## Security\n\nSecurity is obviously paramount for a project like Secretive. As such, any contributions that compromise the security or auditabilty of the project will be rejected.\n\n### Dependencies\n\nSecretive is designed to be easily auditable by people who are considering using it. In keeping with this, Secretive has no third party dependencies, and any contributions which bring in new dependencies will be rejected.\n\n## Code of Conduct\n\nAll contributors must abide by the [Code of Conduct](CODE_OF_CONDUCT.md)\n\n## Localization\n\nIf you'd like to contribute a translation, please see [Localizing](LOCALIZING.md) to get started.\n\n## Credits\n\nIf you make a material contribution to the app, please add yourself to the end of the [credits](https://github.com/maxgoedjen/secretive/blob/main/Sources/Secretive/Credits.rtf).\n\n## Collaborator Status\n\nI will not grant collaborator access to any contributors for this repository. This is basically just because collaborators [can accesss the secrets Secretive uses for the signing credentials stored in the repository](https://docs.github.com/en/actions/reference/encrypted-secrets#accessing-your-secrets).\n\n## Secretive is Opinionated\n\nI'm releasing Secretive as open source so that other people can use it and audit it, feeling comfortable in knowing that the source is available so they can see what it's doing. I have a pretty strong idea of what I'd like this project to look like, and I may respectfully decline contributions that don't line up with that vision. If you'd like to propose a change before implementing, please feel free to [Open an Issue with the proposed tag](https://github.com/maxgoedjen/secretive/issues/new?labels=proposed).\n"
  },
  {
    "path": "Design/DESIGN.md",
    "content": "# Design\n\nThe art assets for the App Icon and GitHub image are located on [Sketch Cloud](https://www.sketch.com/s/574333cd-8ceb-40e1-a6d9-189da3f1e5dd)."
  },
  {
    "path": "FAQ.md",
    "content": "# FAQ\n\n### How do I import my current SSH keys, or export my Secretive Keys?\n\nThe secure enclave doesn't allow import or export of private keys. For any new computer, you should just create a new set of keys. If you're using a smart card, you _might_ be able to export your private key from the vendor's software.\n\n### Secretive doesn't work with my git client/app\n\nSecretive relies on the `SSH_AUTH_SOCK` environment variable being respected. The `git` and `ssh` command line tools natively respect this, but third party apps may require some configuration to work. A non-exhaustive list of setup steps is provided in the [secretive-config-instructions](https://github.com/maxgoedjen/secretive-config-instructions) repo.\n\n### Secretive isn't working for me\n\nPlease run `ssh -Tv git@github.com` in your terminal and paste the output in a [new GitHub issue](https://github.com/maxgoedjen/secretive/issues/new) with a description of your issue.\n\n### Secretive was working for me, but now it has stopped\n\nTry running the \"Setup Secretive\" process by clicking on \"Help\", then \"Setup Secretive.\" If that doesn't work, follow the process above.\n\n### Secretive prompts me to type my password instead of using my Apple Watch\n\n1) Make sure you have enabled \"Use your Apple Watch to unlock apps and your Mac\" in System Preferences --> Security & Privacy:\n\n![System Preferences Setting](.github/readme/apple_watch_system_prefs.png)\n\n2) Ensure that unlocking your Mac with Apple Watch is working (lock and unlock at least once)\n3) Now you should get prompted on the watch when your key is accessed. Double click the side button to approve:\n\n![Apple Watch Prompt](.github/readme/apple_watch_auth_mac.png)\n![Apple Watch Prompt](.github/readme/apple_watch_auth_watch.png)\n\n### How do I tell SSH to use a specific key?\n\nBeginning with Secretive 2.2, every secret has an automatically generated public key file representation on disk, and the path to it is listed under \"Public Key Path\" in Secretive. You can specify that you want to use that key in your `~/.ssh/config`.  [This ServerFault answer](https://serverfault.com/a/295771) has more details on setting that up.\n\n### How can I generate an RSA key?\n\nThe Mac's Secure Enclave only supports 256-bit EC keys, so inherently Secretive cannot support generating RSA keys.\n\n### Can I use Secretive for SSH Agent Forwarding?\n\nYes, you can! Once you've set up Secretive, just add `ForwardAgent yes` to the hosts you want to forward to in your SSH config file. Afterwards, any use of one of your SSH keys on the remote host must be authenticated through Secretive.\n\n### Why should I trust you?\n\nYou shouldn't, for a piece of software like this. Secretive, by design, has an auditable build process. Each build has a fully auditable build log, showing the source it was built from and a SHA of the build product. You can check the SHA of the zip you download against the SHA output in the build log (which is linked in the About window).\n\n### I want to build Secretive from source\n\nAwesome! Just bear in mind that because an app only has access to the keychain items that it created, if you have secrets that you created with the prebuilt version of Secretive, you'll be unable to access them using your own custom build (since you'll have changed the bundled ID).\n\n### What's this network request to GitHub?\n\nSecretive checks in with GitHub's releases API to check if there's a new version of Secretive available. You can audit the source code for this feature [here](https://github.com/maxgoedjen/secretive/blob/main/Sources/Packages/Sources/Brief/Updater.swift).\n\n### How do I uninstall Secretive?\n\nDrag Secretive.app to the trash and remove `~/Library/Containers/com.maxgoedjen.Secretive.SecretAgent`. `SecretAgent` may continue running until you quit it or reboot.\n\n### I have a security issue\n\nPlease contact [max.goedjen@gmail.com](mailto:max.goedjen@gmail.com) with a subject containing \"SECRETIVE SECURITY\" immediately with details, and I'll address the issue and credit you ASAP.\n\n### I have a non-security related bug\n\nPlease file a [GitHub issue](https://github.com/maxgoedjen/secretive/issues/new) for it. I will not provide email support with the exception of the critical security issues mentioned above.\n\n### I want to contribute to Secretive\n\nSweet! Please check out the [contributing guidelines](CONTRIBUTING.md) and go from there.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Max Goedjen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "LOCALIZING.md",
    "content": "# Localizing Secretive\n\nIf you speak another language, and would like to help translate Secretive to support that language, we'd love your help!\n\n## Crowdin\n\n[Secretive uses Crowdin for localization](https://crowdin.com/project/secretive/). Open the link and select your language to translate!\n\n### Manual Translation\n\nCrowdin is the easiest way to translate Secretive, but I'm happy to accept Pull Requests directly as well.\n\n### Questions\n\nPlease open an issue if you have a question about translating the app. I'm more than happy to clarify any terms that are ambiguous or confusing. Thanks for contributing!\n\n### Thank You\n\nThanks to all the folks who have contributed localizations so far!\n\n- @mtardy for the French localization\n- @GravityRyu for the Chinese localization\n- @Saeger for the Portuguese (Brazil) localization\n- @moritzsternemann for the German localization\n- @RoboRich00A16 for the Italian localization\n- @akx for the Finnish localization\n- @mog422 for the Korean localization\n- @niw for the Japanese localization\n- @truita for the Catalan localization\n- @Adimac93 for the Polish localization\n- @alongotv for the Russian localization\n\n\n\n\nA special thanks to [Crowdin](https://crowdin.com) for their [generous support of open source projects](https://crowdin.com/page/open-source-project-setup-request).\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:6.2\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\n// This is basically the same package as `Sources/Packages/Package.swift`, but thinned slightly.\n// Ideally this would be the same package, but SPM requires it to be at the root of the project,\n// and Xcode does _not_ like that, so they're separate.\nlet package = Package(\n    name: \"SecretKit\",\n    defaultLocalization: \"en\",\n    platforms: [\n        .macOS(.v14)\n    ],\n    products: [\n        .library(\n            name: \"SecretKit\",\n            targets: [\"SecretKit\"]),\n        .library(\n            name: \"SecureEnclaveSecretKit\",\n            targets: [\"SecureEnclaveSecretKit\"]),\n        .library(\n            name: \"SmartCardSecretKit\",\n            targets: [\"SmartCardSecretKit\"]),\n        .library(\n            name: \"SSHProtocolKit\",\n            targets: [\"SSHProtocolKit\"]),\n    ],\n    dependencies: [\n    ],\n    targets: [\n        .target(\n            name: \"SecretKit\",\n            dependencies: [],\n            path: \"Sources/Packages/Sources/SecretKit\",\n            resources: [localization],\n            swiftSettings: swiftSettings\n        ),\n        .testTarget(\n            name: \"SecretKitTests\",\n            dependencies: [\"SecretKit\", \"SecureEnclaveSecretKit\", \"SmartCardSecretKit\"],\n            path: \"Sources/Packages/Tests/SecretKitTests\",\n            swiftSettings: swiftSettings\n        ),\n        .target(\n            name: \"SecureEnclaveSecretKit\",\n            dependencies: [\"SecretKit\"],\n            path: \"Sources/Packages/Sources/SecureEnclaveSecretKit\",\n            resources: [localization],\n            swiftSettings: swiftSettings\n        ),\n        .target(\n            name: \"SmartCardSecretKit\",\n            dependencies: [\"SecretKit\"],\n            path: \"Sources/Packages/Sources/SmartCardSecretKit\",\n            resources: [localization],\n            swiftSettings: swiftSettings\n        ),\n        .target(\n            name: \"SSHProtocolKit\",\n            dependencies: [\"SecretKit\"],\n            path: \"Sources/Packages/Sources/SSHProtocolKit\",\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .testTarget(\n            name: \"SSHProtocolKitTests\",\n            dependencies: [\"SSHProtocolKit\"],\n            path: \"Sources/Packages/Tests/SSHProtocolKitTests\",\n            swiftSettings: swiftSettings,\n        ),\n    ]\n)\n\nvar localization: Resource {\n    .process(\"../../Resources/Localizable.xcstrings\")\n}\n\nvar swiftSettings: [PackageDescription.SwiftSetting] {\n    [\n        .swiftLanguageMode(.v6),\n        // This freaks out Xcode in a dependency context.\n        // .treatAllWarnings(as: .error),\n    ]\n}\n"
  },
  {
    "path": "README.md",
    "content": "# Secretive [![Test](https://github.com/maxgoedjen/secretive/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/maxgoedjen/secretive/actions/workflows/test.yml) ![Release](https://github.com/maxgoedjen/secretive/workflows/Release/badge.svg)\n\n\nSecretive is an app for protecting and managing SSH keys with the Secure Enclave.\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"/.github/readme/app-dark.png\">\n  <source media=\"(prefers-color-scheme: light)\" srcset=\"/.github/readme/app-light.png\">\n  <img src=\"/.github/readme/app-dark.png\" alt=\"Screenshot of Secretive\" width=\"600\">\n</picture>\n\n\n## Why?\n\n### Safer Storage\n\nThe most common setup for SSH keys is just keeping them on disk, guarded by proper permissions. This is fine in most cases, but it's not super hard for malicious users or malware to copy your private key. If you protect your keys with the Secure Enclave, it's impossible to export them, by design.\n\n### Access Control\n\nIf your Mac has a Secure Enclave, it also has support for strong access controls like Touch ID, or authentication with Apple Watch. You can configure your keys so that they require Touch ID (or Watch) authentication before they're accessed.\n\n<img src=\"/.github/readme/touchid.png\" alt=\"Screenshot of Secretive authenticating with Touch ID\" width=\"400\">\n\n### Notifications\n\nSecretive also notifies you whenever your keys are accessed, so you're never caught off guard.\n\n<img src=\"/.github/readme/notification.png\" alt=\"Screenshot of Secretive notifying the user\" width=\"600\">\n\n### Support for Smart Cards Too!\n\nFor Macs without Secure Enclaves, you can configure a Smart Card (such as a YubiKey) and use it for signing as well.\n\n## Getting Started\n\n### Installation\n\n#### Direct Download\n\nYou can download the latest release over on the [Releases Page](https://github.com/maxgoedjen/secretive/releases)\n\n#### Using Homebrew\n\n    brew install secretive\n\n### FAQ\n\nThere's a [FAQ here](FAQ.md).\n\n### Auditable Build Process\n\nBuilds are produced by GitHub Actions with an auditable build and release generation process. Starting with Secretive 3.0, builds are attested using [GitHub Artifact Attestation](https://docs.github.com/en/actions/concepts/security/artifact-attestations). Attestations are viewable in the build log for a build, and also on the [main attestation page](https://github.com/maxgoedjen/secretive/attestations).\n\n### A Note Around Code Signing and Keychains\n\nWhile Secretive uses the Secure Enclave to protect keys, it still relies on Keychain APIs to store and access them. Keychain restricts reads of keys to the app (and specifically, the bundle ID) that created them. If you build Secretive from source, make sure you are consistent in which bundle ID you use so that the Keychain is able to locate your keys.\n\n### Backups and Transfers to New Machines\n\nBecause secrets in the Secure Enclave are not exportable, they are not able to be backed up, and you will not be able to transfer them to a new machine. If you get a new Mac, just create a new set of secrets specific to that Mac.\n\n## Security\n\nSecretive's security policy is detailed in [SECURITY.md](SECURITY.md). To report security issues, please use [GitHub's private reporting feature.](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability)\n\n## Acknowledgements\n\n### sekey\nSecretive was inspired by the [sekey project](https://github.com/sekey/sekey).\n\n### Localization\nSecretive is localized to many languages by a generous team of volunteers. To learn more, see [LOCALIZING.md](LOCALIZING.md). Secretive's localization workflow is generously provided by [Crowdin](https://crowdin.com).\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Security Principles\n\nSecretive is designed with a few general tenets in mind:\n\n### It's Hard to Leak a Key Secretive Can't Read The Key Material\n\nSecretive only operates on hardware-backed keys. In general terms, this means that it should be _very_ hard for Secretive to have any sort of bug that causes a key to be shared, because Secretive can't access private key data even if it wants to.\n\n### Simplicity and Auditability\n\nSecretive won't expand to have every feature it could possibly have. Part of the goal of the app is that it is possible for consumers to reasonably audit the code, and that often means not implementing features that might be cool, but which would significantly inflate the size of the codebase.\n\n### Dependencies\n\nBoth in support of the previous principle and to rule out supply chain attacks, Secretive does not rely on any third party dependencies. \n\nThere are limited exceptions to this, particularly in the build process, but the app itself does not depend on any third party code.\n\n## Supported Versions\n\nThe latest version on the [Releases page](https://github.com/maxgoedjen/secretive/releases) is the only currently supported version.\n\n## Reporting a Vulnerability\n\nTo report security issues, please use [GitHub's private reporting feature.](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability)\n"
  },
  {
    "path": "Sources/Config/Config.xcconfig",
    "content": "CI_VERSION = GITHUB_CI_VERSION\nCI_BUILD_NUMBER = GITHUB_BUILD_NUMBER\nCI_BUILD_LINK = GITHUB_BUILD_URL\n\n#include? \"OpenSource.xcconfig\"\n\nSECRETIVE_BASE_BUNDLE_ID = $(SECRETIVE_BASE_BUNDLE_ID_OSS:default=com.maxgoedjen.Secretive)\nSECRETIVE_DEVELOPMENT_TEAM = $(SECRETIVE_DEVELOPMENT_TEAM_OSS:default=Z72PRUAWF6)\n"
  },
  {
    "path": "Sources/Config/Secretive.xctestplan",
    "content": "{\n  \"configurations\" : [\n    {\n      \"id\" : \"5896AE5A-6D5A-48D3-837B-668B646A3273\",\n      \"name\" : \"Configuration 1\",\n      \"options\" : {\n\n      }\n    }\n  ],\n  \"defaultOptions\" : {\n\n  },\n  \"testTargets\" : [\n    {\n      \"target\" : {\n        \"containerPath\" : \"container:Packages\",\n        \"identifier\" : \"BriefTests\",\n        \"name\" : \"BriefTests\"\n      }\n    },\n    {\n      \"target\" : {\n        \"containerPath\" : \"container:Packages\",\n        \"identifier\" : \"SecretKitTests\",\n        \"name\" : \"SecretKitTests\"\n      }\n    },\n    {\n      \"target\" : {\n        \"containerPath\" : \"container:Packages\",\n        \"identifier\" : \"SecretAgentKitTests\",\n        \"name\" : \"SecretAgentKitTests\"\n      }\n    }\n  ],\n  \"version\" : 1\n}\n"
  },
  {
    "path": "Sources/Packages/Package.swift",
    "content": "// swift-tools-version:6.2\n// The swift-tools-version declares the minimum version of Swift required to build this package.\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"SecretivePackages\",\n    defaultLocalization: \"en\",\n    platforms: [\n        .macOS(.v14)\n    ],\n    products: [\n        .library(\n            name: \"SecretKit\",\n            targets: [\"SecretKit\"]),\n        .library(\n            name: \"SecureEnclaveSecretKit\",\n            targets: [\"SecureEnclaveSecretKit\"]),\n        .library(\n            name: \"SmartCardSecretKit\",\n            targets: [\"SmartCardSecretKit\"]),\n        .library(\n            name: \"SecretAgentKit\",\n            targets: [\"SecretAgentKit\"]),\n        .library(\n            name: \"Common\",\n            targets: [\"Common\"]),\n        .library(\n            name: \"Brief\",\n            targets: [\"Brief\"]),\n        .library(\n            name: \"XPCWrappers\",\n            targets: [\"XPCWrappers\"]),\n        .library(\n            name: \"SSHProtocolKit\",\n            targets: [\"SSHProtocolKit\"]),\n    ],\n    dependencies: [\n    ],\n    targets: [\n        .target(\n            name: \"SecretKit\",\n            dependencies: [],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .testTarget(\n            name: \"SecretKitTests\",\n            dependencies: [\"SecretKit\", \"SecretAgentKit\", \"SecureEnclaveSecretKit\", \"SmartCardSecretKit\"],\n            swiftSettings: swiftSettings,\n        ),\n        .target(\n            name: \"SecureEnclaveSecretKit\",\n            dependencies: [\"SecretKit\"],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .target(\n            name: \"SmartCardSecretKit\",\n            dependencies: [\"SecretKit\"],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .target(\n            name: \"SecretAgentKit\",\n            dependencies: [\"SecretKit\", \"SSHProtocolKit\", \"Common\"],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .testTarget(\n            name: \"SecretAgentKitTests\",\n            dependencies: [\"SecretAgentKit\"],\n        ),\n        .target(\n            name: \"SSHProtocolKit\",\n            dependencies: [\"SecretKit\"],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .testTarget(\n            name: \"SSHProtocolKitTests\",\n            dependencies: [\"SSHProtocolKit\"],\n            swiftSettings: swiftSettings,\n        ),\n        .target(\n            name: \"Common\",\n            dependencies: [\"SSHProtocolKit\", \"SecretKit\"],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .target(\n            name: \"Brief\",\n            dependencies: [\"XPCWrappers\", \"SSHProtocolKit\"],\n            resources: [localization],\n            swiftSettings: swiftSettings,\n        ),\n        .testTarget(\n            name: \"BriefTests\",\n            dependencies: [\"Brief\"],\n        ),\n        .target(\n            name: \"XPCWrappers\",\n            swiftSettings: swiftSettings,\n        ),\n    ]\n)\n\nvar localization: Resource {\n    .process(\"../../Resources/Localizable.xcstrings\")\n}\n\nvar swiftSettings: [PackageDescription.SwiftSetting] {\n    [\n        .swiftLanguageMode(.v6),\n        .treatAllWarnings(as: .error),\n        .strictMemorySafety()\n    ]\n}\n"
  },
  {
    "path": "Sources/Packages/Resources/Localizable.xcstrings",
    "content": "{\n  \"sourceLanguage\" : \"en\",\n  \"strings\" : {\n    \"\" : {\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"**%@** (%@)\" : {\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"**%1$@** (%2$@)\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"about_build_log_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Journal de version\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ビルドログ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"빌드 로그\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Build Log\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"构建日志\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"構建日誌\"\n          }\n        }\n      }\n    },\n    \"about_menu_bar_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"A propos\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveについて\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive에 대해서\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"About Secretive\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"关于Secretive\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"關於Secretive\"\n          }\n        }\n      }\n    },\n    \"about_open_source_notice\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive est Open Source et sous licence MIT\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveはオープンソースです。MITライセンスで提供されています。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive는 오픈 소스이며 MIT 라이선스입니다\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive is Open Source and MIT Licensed\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive是开源软件并以MIT协议授权\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive是開源軟體並以MIT協議授權\"\n          }\n        }\n      }\n    },\n    \"about_thanks\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Remerciements spéciaux à nos [Contributeurs](%1$(contributorsLink)@) et [Mécène](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"[コントリビューター](%1$(contributorsLink)@)と[スポンサー](%2$(sponsorsLink)@)に感謝します\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"[기여자](%1$(contributorsLink)@)와 [후원자](%2$(sponsorsLink)@)에게 특별히 감사드립니다\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Special thanks our [Contributors](%1$(contributorsLink)@) and [Sponsors](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"特别感谢我们的[贡献者](%1$(contributorsLink)@)和[赞助者](%2$(sponsorsLink)@)\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"特別感謝我們的[貢獻者](%1$(contributorsLink)@)和[贊助者](%2$(sponsorsLink)@)\"\n          }\n        }\n      }\n    },\n    \"about_view_on_github_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Voir sur GitHub\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub에서 보기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在GitHub上查看\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在GitHub上檢視\"\n          }\n        }\n      }\n    },\n    \"agent_details_could_not_start_error\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive no ha aconseguit arrancar l'agent segur (SecretAgent). Prova de reiniciar el teu Mac, i si açò no funciona, obri una “issue” al GitHub.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive konnte den SecretAgent nicht starten. Bitte versuche Deinen Mac neu zu starten und wenn das nicht funktioniert, ein Issue auf GitHub zu erstellen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Το Secretive δεν μπόρεσε να εκκινήσει τον SecretAgent. Παρακαλώ δοκιμάστε να επανεκκινήσετε τον Mac σας, και αν αυτό δεν λειτουργήσει, ανοίξτε ένα issue στο GitHub.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive ei saanut SecretAgent-apuohjelmaa käyntiin. Kokeile käynnistää Macisi uudestaan, ja jos se ei tepsi, raportoi ongelmasta GitHubissa.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive n'a pas pu démarrer le SecretAgent. Veuillez redémarrer votre Mac, si cela ne fonctionne pas, signalez le problème sur GitHub.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretiveアプリはSecretAgentを起動できませんでした。Macを再起動するか、それでも起動しない場合はGitHubのIssueで問題を報告してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive에서 SecretAgent를 실행할 수 없습니다. Mac을 재시작해 보시고, 그래도 문제가 해결되지 않으면 GitHub에 문제를 제출해 주세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive nie udało się uruchomić programu SecretAgent. Spróbuj ponownie uruchomić komputer Mac, a jeśli to nie zadziała, zgłoś problem na GitHub.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive não foi capaz de obter o SecretAgent para iniciar. Por favor tente reiniciar seu Mac e se isso não resolver, registre um problema em nosso GitHub.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive не получлось запустить SecretAgent. Пожалуйста, попробуйте перезапустить Ваш Mac, и если это не поможет – создайте issue на GitHub.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive was unable to get SecretAgent to launch. Please try restarting your Mac, and if that doesn't work, file an issue on GitHub.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive无法启动SecretAgent。请尝试重启Mac，如果没有效果，请在GitHub上提交一个issue。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive無法啟動SecretAgent。請嘗試重啟Mac，如果沒有效果，請在GitHub上提交一個issue。\"\n          }\n        }\n      }\n    },\n    \"agent_details_disable_agent_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Desactiva l'agent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent deaktivieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απενεργοποίηση Πράκτορα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Poista agentti käytöstä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Désactiver l'agent\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントを無効にする\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"에이전트 비활성화\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wyłącz Agenta\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Desabilitar o Agente\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Отключить агент\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Disable Agent\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"禁用Agent\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"禁用Agent\"\n          }\n        }\n      }\n    },\n    \"agent_details_restart_agent_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Reinicia l'agent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent neu starten\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Επανεκκίνηση Πράκτορα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Käynnistä agentti uudelleen\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Redémarrer l'agent\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントを再起動\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"에이전트 재시작\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zrestartuj Agenta\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Reiniciar o Agente\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Перезапустить агент\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Restart Agent\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重启Agent\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重啟Agent\"\n          }\n        }\n      }\n    },\n    \"agent_details_running_since_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Funcionant des de\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Läuft seit\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εκτελείται Από\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Käynnissä alkaen\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actif depuis\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"最後に起動した日時\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"실행 시각\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uruchomiony od\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Rodando desde\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запущено с\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Running Since\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"运行时间始于\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"執行時間始於\"\n          }\n        }\n      }\n    },\n    \"agent_details_socket_path_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Camí del sòcol\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Socket-Pfad\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Socket-polku\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chemin vers le socket\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ソケットのパス\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"소켓 경로\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ścieżka Socketu\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Caminho do Socket\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Путь к сокету\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Socket Path\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Socket路径\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Socket路徑\"\n          }\n        }\n      }\n    },\n    \"agent_details_start_agent_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inicia l'agent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent starten\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Έναρξη SecretAgent\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Käynnistä agentti\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Démarrer l'agent\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントを起動\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"에이전트 시작\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uruchom Agenta\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Iniciar o Agente\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Запустить агент\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Start Agent\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"启动Agent\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"啟動Agent\"\n          }\n        }\n      }\n    },\n    \"agent_details_start_agent_button_starting\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Iniciant l'agent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent wird gestartet\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Έναρξη Πράκτορα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agentti käynnistyy\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Démarrage de l'agent\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントを起動中\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"에이전트 시작중\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uruchamianie Agenta\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agente iniciando\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Агент запускается\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Starting Agent\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent启动中\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent啟動中\"\n          }\n        }\n      }\n    },\n    \"agent_details_version_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Versió\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Έκδοση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Versio\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"バージョン\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"버전\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wersja\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Versão\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Версия\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Version\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"版本\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"版本\"\n          }\n        }\n      }\n    },\n    \"agent_not_running_notice_detail_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"L'agent segur (SecretAgent) és un procés que funciona en rerefons per signar peticions, tal que no hages de tindre Secretive obert tot el temps.\\n\\n**Secretive no funcionarà correctament a menys que l'agent estiga instal·lat i en funcionament.**\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent ist ein Hintergrund-Prozess, der Anfragen signiert, sodass Du Secretive nicht durchgehend geöffnet haben musst.\\n\\n**Secretive wird nicht richtig funktionieren, wenn der Agent nicht installiert und ausgeführt wird.**\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Το SecretAgent είναι μια διεργασία που εκτελείται στο παρασκήνιο για να υπογράφει αιτήματα. Δεν χρειάζεται να κρατάτε παράθυρο του Secretive ανοιχτό συνεχώς.\\n\\n**Το Secretive δεν θα μπορεί να λειτουργήσει σωστά εκτός και αν o Agent είναι εγκατεστημένος και εκτελείται.**\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent-agenttiprosessi toimii taustalla ja allekirjoittaa pyyntöjä, jotta Secretive-käyttöliittymää ei tarvitse pitää aina auki.\\n\\n**Secretive ei toimi oikein, jollei agentti ole asennettu ja käynnissä.**\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent est un processus qui s'exécute en arrière-plan pour signer les demandes, de sorte que vous n'ayez pas besoin de garder Secretive ouvert en permanence.\\n\\n**Secretive ne pourra pas fonctionner correctement sans que l'agent soit installé et fonctionne.**\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgentはバックグラウンドで稼働し署名を行います。Secretiveアプリを常に実行する必要はありません。\\n\\n**Secretiveアプリはエージェントがインストールされて稼働しない限り正しく動作しません。**\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent는 백그라운드에서 실행되어 요청에 서명하는 프로세스이므로 Secretive를 항상 열어 둘 필요는 없습니다.\\n\\n**Secretive 에이전트가 설치되어 실행 중이어야 Secretive가 제대로 작동합니다.**\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent to proces działający w tle, który podpisuje żądania, dzięki czemu nie musisz mieć otwartego programu Secretive przez cały czas.\\n\\n**Program Secretive nie będzie działał poprawnie, jeśli agent nie zostanie zainstalowany i uruchomiony.**\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent é um processo que é executado em segundo plano para assinar pedidos, então não há necessidade de manter Secretive aberto o tempo todo.\\n\\n**Secretive não funcionará corretamente a menos que o agente esteja instalado e executando.**\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent это процесс, который работает в фоне чтобы подписывать запросы. Так Вам не придется все время держать Secretive открытым.\\n\\n**Secretive не сможет нормально функционировать, пока агент не установлен и не запущен.**\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**Secretive will not be able to function properly unless the agent is installed and running.**\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent是个在后台处理签名请求的进程，让您无需将Secretive一直保持在前台。\\n\\n**需要安装并运行Agent，否则Secretive无法正常工作。**\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent是個在後台處理簽名請求的行程，讓您無需將Secretive一直保持在前台。\\n\\n**需要安裝並執行Agent，否則Secretive無法正常工作。**\"\n          }\n        }\n      }\n    },\n    \"agent_not_running_notice_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent inactiu\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent wird Nicht Ausgeführt\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ο Agent Δεν Εκτελείται\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agentti ei ole käynnissä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"L'agent n'est pas actif\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent non è in esecuzione\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントが稼働していません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent가 실행되고 있지 않음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent nie jest uruchomiony\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent não está rodando\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Агент не запущен\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent Is Not Running\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent尚未运行\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent尚未執行\"\n          }\n        }\n      }\n    },\n    \"agent_running_notice_detail_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent és un procés que s'executa en segon pla per signar peticions, per tal que no necessites tindre Secretive obert tot el temps.\\n\\n**Pots tancar Secretive, i tot continuarà funcionant.**\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent ist ein Prozess, der im Hintergrund läuft, um Anfragen zu signieren, so dass du Secretive nicht durchgehend geöffnet halten musst.\\n\\n**Du kannst Secretive schließen, und alles funktioniert weiter.**\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Το SecretAgent είναι μια διεργασία που εκτελείται στο παρασκήνιο για να υπογράφει αιτήματα. Δεν χρειάζεται να κρατάτε παράθυρο του Secretive ανοιχτό συνεχώς.\\n\\n**Το Secretive δεν θα μπορεί να λειτουργήσει σωστά εκτός και αν o Agent είναι εγκατεστημένος και εκτελείται.**\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent on taustaprosessi joka allekirjoittaa pyyntöjä, joten Secretiveä ei tarvitse pitää käynnissä koko aikaa.  **Voit sulkea Secretiven, ja kaikki toimii yhä.**\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent est un processus qui s'exécute en arrière-plan pour signer les demandes, de sorte que vous n'ayez pas besoin de garder Secretive ouvert en permanence.\\n\\n**Vous pouvez fermer Secretive, et tout continuera à fonctionner.**\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent è un processo che viene eseguito in background per firmare le richieste, così che non devi tenere aperto Secretive tutto il tempo.\\n\\n**Puoi chiudere Secretive, e continuerà a funzionare.**\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgentはバックグラウンドで稼働し署名を行います。Secretiveアプリを常に実行する必要はありません。\\n\\n**Secretiveアプリは終了しても問題ありません。アプリは機能し続けます。**\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent는 요청에 서명하기 위해 백그라운드에서 실행되는 프로세스이므로 Secretive를 항상 열어 둘 필요가 없습니다.\\n\\n**Secretive를 닫아도 모든 것이 계속 작동합니다.**\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent to proces, który działa w tle, aby popisywać zapytania. Dzięki temu nie musisz mieć uruchomionej aplikacji Secretive cały czas.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent é um processo que roda em background para assinar requisições para que você não precise manter o Secretive aberto a todo momento.\\n\\n**Você pode fechar o Secretive e tudo continuará funcionando.**\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent это процесс, который работает в фоне, чтобы подписывать запросы – так Вам не нужно держать Secretive открытым все время.\\n\\n**Вы можете закрыть Secretive, и все продолжит работать штатно.**\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SecretAgent is a process that runs in the background to sign requests, so you don't need to keep Secretive open all the time.\\n\\n**You can close Secretive, and everything will still keep working.**\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent是个在后台处理签名请求的进程，让您无需将Secretive一直保持在前台。\\n\\n**您可以关闭Secretive，所有服务都将正常运行。**\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent是個在後台處理簽名請求的行程，讓您無需將Secretive一直保持在前台。\\n\\n**您可以關閉Secretive，所有服務都將正常執行。**\"\n          }\n        }\n      }\n    },\n    \"agent_running_notice_detail_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"L'agent secret està actiu\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent wird Ausgeführt\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ο Πράκτορας εκτελείται\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent on käynnissä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent est actif\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent è in esecuzione\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントは稼働中\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent가 실행 중입니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent jest uruchomiony\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent está rodando\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent запущен\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent is Running\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent运行中\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent執行中\"\n          }\n        }\n      }\n    },\n    \"agent_running_notice_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent actiu\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent wird Ausgeführt\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agentti on käynnissä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"L'agent est actif\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent è in esecuzione\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントは稼働中\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent가 실행중\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent jest uruchomiony\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent está rodando\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Агент запущен\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Agent is Running\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent运行中\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent執行中\"\n          }\n        }\n      }\n    },\n    \"agentDetailsLocationTitle\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ubicació de l'agent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgent-Pfad\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Τοποθεσία Secret Agent\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretAgentin sijainti\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Emplacement du SecretAgent\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントの場所\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent 경로\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Lokalizacja Secret Agent\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Localização do SecretAgent\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Расположение Secret Agent\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret Agent Location\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent的位置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret Agent的位置\"\n          }\n        }\n      }\n    },\n    \"app_menu_help_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ajuda\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hilfe\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Apua\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aide\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aiuto\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ヘルプ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"도움말\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pomoc\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ajuda\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Помощь\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Help\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"帮助\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"幫助\"\n          }\n        }\n      }\n    },\n    \"app_menu_new_secret_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nou secret\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Neues Secret\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uusi salaisuus\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nouveau Secret\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nuovo Segreto\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"新規シークレット\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"새 비밀\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nowy sekret\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Novo Segredo\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Новый секрет\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"New Secret\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"新密钥串\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"新建Secret\"\n          }\n        }\n      }\n    },\n    \"app_not_in_applications_notice_cancel_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Εφαρμογή αργότερα\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Plus tard\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"後にする\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"나중에\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Позже\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Later\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"稍后\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"稍後\"\n          }\n        }\n      }\n    },\n    \"app_not_in_applications_notice_detail_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive necessita estar a la carpeta Apps per funcionar correctament. Per favor mogueu-lo i reobriu.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive muss sich in deinem Programme Ordner befinden, damit es richtig funktioniert. Bitte verschiebe die App und starten sie neu.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiven tulee olla Ohjelmat-kansiossa toimiakseen oikein. Ole hyvä ja käynnistä se uudelleen siirrettyäsi sen.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive doit se trouver dans votre dossier Applications pour fonctionner correctement. Veuillez le déplacer et relancer.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive deve trovarsi nella cartella delle Applicazioni per funzionare correttamente. Per favore spostala e riavvia.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveは正しく動作するためにアプリケーションフォルダにある必要があります。アプリを移動して再度実行してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive가 제대로 작동하려면 Applications 폴더에 있어야 합니다. 이동한 후 다시 실행해 주세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive musi być w katalogu Applications, aby działać prawidłowo. Zmień lokalizację aplikacji i uruchom ją ponownie.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive necessita estar no seu diretório de Aplicações para funcionar corretamente. Por favor mova-o e abra novamente.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive должен находиться в папке Applications чтобы работать правильно. Пожалуйста, переместите его и перезапустите приложение.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to be in your Applications folder to work properly. Please move it and relaunch.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive需要在“应用程序”文件夹中才能正常运行。请移动并重新启动Secretive。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive需要在「應用程式」資料夾中才能正常執行。請移動並重新啟動Secretive。\"\n          }\n        }\n      }\n    },\n    \"app_not_in_applications_notice_quit_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Έξοδος\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Quitter\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"終了\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"종료\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Выйти\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Quit\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"退出\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"退出\"\n          }\n        }\n      }\n    },\n    \"app_not_in_applications_notice_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive no es troba a la carpeta Apps\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive ist Nicht im Programme Ordner\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive ei ole Ohjelmat-kansiossa\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive n'est pas dans le dossier Applications\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive non è nella cartella delle Applicazioni\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveがアプリケーションフォルダにありません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive가 Applications 폴더에 없음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive nie jest w folderze Applications\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive não está no diretório de Aplicações\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive находится не в папке Applications\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive Is Not in Applications Folder\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive不在“应用程序”文件夹中\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive不在「應用程式」資料夾中\"\n          }\n        }\n      }\n    },\n    \"auth_context_persist_for_duration\" : {\n      \"comment\" : \"When the user clicks the notification to leave a secret unlocked, they are shown a prompt to approve the action. This is the description, showing which secret will used. The first placeholder is the name of the secret. The second placeholder is a localized description of the time period it will remain unlocked for (eg: “five minutes”)\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"desbloqueja el secret “%1$(secretName)@” per a %2$(duration)@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret “%1$(secretName)@” für %2$(duration)@ entsperren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"avaa salaisuuden “%1$(secretName)@” lukitus ajaksi %2$(duration)@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"déverrouiller le secret “%1$(secretName)@” pendant %2$(duration)@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"sblocca il Segreto “%1$(secretName)@” per %2$(duration)@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレット“%1$(secretName)@”のロックを解除します (%2$(duration)@間)\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀 “%1$(secretName)@”를 %2$(duration)@ 동안 잠금 해제\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"odblokuj sekret “%1$(secretName)@” dla %2$(duration)@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"destravar segredo “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"разблокировать секрет “%1$(secretName)@” на %2$(duration)@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"unlock secret “%1$(secretName)@” for %2$(duration)@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"解锁密钥串“%1$(secretName)@”%2$(duration)@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"解鎖Secret「%1$(secretName)@」%2$(duration)@\"\n          }\n        }\n      }\n    },\n    \"auth_context_request_deny_button\" : {\n      \"comment\" : \"When the user chooses to perform an action that requires Touch ID/password authentication, they are shown a prompt to approve the action. This is the deny button for that prompt.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Denega\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ablehnen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kiellä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Refuser\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nega\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"拒否\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"거부\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Odrzuć\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Negar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Отказать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Deny\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"拒绝\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"拒絕\"\n          }\n        }\n      }\n    },\n    \"auth_context_request_signature_description\" : {\n      \"comment\" : \"When the user performs a signature action using a secret, they are shown a prompt to approve the action. This is the description, showing which secret will be used, and where the request is coming from. The first placeholder is the name of the app requesting the operation. The second placeholder is the name of the secret.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"signa una petición de “%1$(appName)@” usant el secret “%2$(secretName)@”\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"eine Anfrage von “%1$(appName)@” mit dem Secret “%2$(secretName)@” signieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"allekirjoita pyyntö lähteestä “%1$(appName)@” käyttäen salaisuutta “%2$(secretName)@”\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"signer une requête de “%1$(appName)@” en utilisant le secret “%2$(secretName)@”\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"firma la richiesta di “%1$(appName)@” usando il Segreto “%2$(secretName)@”\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレット“%2$(secretName)@”を使って“%1$(appName)@”の要求に署名します\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀 “%2$(secretName)@”를 사용해서 “%1$(appName)@”의 요청에 서명\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"podpisz zapytanie od “%1$(appName)@” za pomocą sekretu “%2$(secretName)@”\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"assinar requisição a partir do “%1$(appName)@” utilizando o segredo “%2$(secretName)@”\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"подписать запрос от “%1$(appName)@” используя секрет “%2$(secretName)@”\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"sign a request from “%1$(appName)@” using secret “%2$(secretName)@”\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"用密钥串“%2$(secretName)@”认证来自“%1$(appName)@”的请求\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"用Secret「%2$(secretName)@」認證来自「%1$(appName)@」的请求\"\n          }\n        }\n      }\n    },\n    \"copyable_click_to_copy_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clica per copiar\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zum Kopieren Anklicken\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Klikkaa kopioidaksesi\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cliquer pour copier\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clicca per copiare\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"クリックしてコピー\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"복사하기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kliknij aby skopiować\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clique para Copiar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кликните чтобы скопировать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Copy\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"点击拷贝\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"點選以拷貝\"\n          }\n        }\n      }\n    },\n    \"copyable_copied\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Copiat\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kopiert\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kopioitu\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Copié\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Copiato\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"コピーしました\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"복사됨\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Skopiowano\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Copiado\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Скопировано\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Copied\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"已拷贝\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"已拷貝\"\n          }\n        }\n      }\n    },\n    \"create_secret_advanced_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Avançat\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Erweitert\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Lisäasetukset\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Avancé\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"詳細\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"고급\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zaawansowane\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Avançado\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Расширенное\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Advanced\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"高级选项\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"高階選項\"\n          }\n        }\n      }\n    },\n    \"create_secret_biometry_current_warning\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si canvieu la configuració de biometria de _qualsevol manera_, incloent-hi afegir-ne una nova empremta, esta clau ja no serà accessible.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wenn Du Deine Biometrie-Einstellungen _irgendwie_, einschließlich des Hinzufügens eines neuen Fingerabdrucks, änderst, wird dieser Schlüssel nicht mehr zugänglich sein.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos muutat biometrisiä asetuksia _millä tahansa tavalla_, esim. lisäämällä uuden sormenjäljen, tätä avainta ei voi enää käyttää.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si vous modifiez vos paramètres biométriques, y compris en ajoutant une nouvelle empreinte digitale, cette clé ne sera plus accessible.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"新しい指紋の追加を含め、現在の生体認証の設定を少しでも変更すると、このシークレットにはアクセスできなくなります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"새로운 지문을 추가하는 등 생체 인식 설정을 _어떤 식으로든_ 변경하면 이 키에 더 이상 접근할 수 없습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeśli zmienisz ustawienia biometryczne w _jakikolwiek sposób_, włącznie z dodaniem nowego odcisku palca, ten klucz nie będzie już dostępny.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você mudar suas configurações de biometria de _qualquer forma_, incluindo adicionar uma nova impressão digital, esta chave não estará mais acessível.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы сделаете _любые_ изменения в Ваших настройках биометрии, включая добавление нового отпечатка пальца, этот ключ перестанет быть доступным.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you change your biometric settings in _any way_, including adding a new fingerprint, this key will no longer be accessible.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您以_任何方式_更改生物识别设置，包括新增指纹，此密钥将不再可用。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您以_任何方式_更改生物識別設定，包括新增指紋，此金鑰將不再可用。\"\n          }\n        }\n      }\n    },\n    \"create_secret_cancel_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cancel·la\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Abbrechen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Άκυρο\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Peru\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Annuler\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Annulla\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"キャンセル\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"취소\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Anuluj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cancelar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Отменить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"取消\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"取消\"\n          }\n        }\n      }\n    },\n    \"create_secret_create_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Crea\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Erstellen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Luo\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Créer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Crea\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"作成\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"생성\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utwórz\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Criar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Создать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"创建\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"建立\"\n          }\n        }\n      }\n    },\n    \"create_secret_key_attribution_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Açò mostra el fi de la teua clau pública. Usualment és una adreça de correu electrònic.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sie wird am Ende Deines öffentlichen Schlüssels angezeigt und ist üblicherweise eine E-Mail-Adresse.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αυτό εμφανίζεται στο τέλος του δημόσιου κλειδιού σας. Είναι συνήθως μια διεύθυνση ηλεκτρονικού ταχυδρομείου.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tämä näyttää julkisavaimesi loppuosan. Se on usein sähköpostiosoite.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cela apparaît à la fin de votre clé publique. Il s'agit généralement d'une adresse e-mail.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"これは公開鍵の末尾に表示されます。通常はメールアドレスです。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"공개 키 끝에 표시되는 정보입니다. 보통 이메일 주소입니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jest to widoczne na końcu klucza publicznego. Zazwyczaj jest to adres e-mail.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Isto é exibido ao final da sua chave pública. É geralmente um endereço de email.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Это отображается в конце Вашего публичного ключа. Как правило, это email адрес.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This shows at the end of your public key. It’s usually an email address.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"会显示在公钥末尾。通常为电子邮箱地址。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"會顯示在公鑰末尾。通常為電郵地址。\"\n          }\n        }\n      }\n    },\n    \"create_secret_key_attribution_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atribució de la clau\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Schlüssel-Zuordnung\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Απόδοση Κλειδιού\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Avaimen nimike\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Attribution de la clé\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"鍵の帰属\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"키 속성\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Przypisanie klucza\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atribuição de Chave\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Принадлежность ключа\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Attribution\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"密钥归属\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"金鑰歸屬\"\n          }\n        }\n      }\n    },\n    \"create_secret_key_type_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tipus de clau\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Schlüsseltyp\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Avaintyyppi\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Type de clé\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"鍵の種類\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"키 유형\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Rodzaj klucza\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tipo de Chave\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Тип ключа\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Key Type\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"密钥类型\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"金鑰型別\"\n          }\n        }\n      }\n    },\n    \"create_secret_key_type_macOS_update_required_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Indisponible sur cette version de macOS\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"このバージョンのmacOSには対応していません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이 버전의 macOS에서는 사용할 수 없습니다\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unavailable on this version of macOS\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在当前版本的macOS上不可用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在當前版本的macOS上不可用\"\n          }\n        }\n      }\n    },\n    \"create_secret_mldsa_warning\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Advertència: les claus ML-DSA són molt noves, i encara no estan suportades per molts servidors. Verifica que els servidors pels quals utilitzaràs esta clau accepten claus ML-DSA.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Varoitus: ML-DSA-avaimet ovat hyvin uusia, ja monet palvelimet eivät vielä tue niitä. Varmista, että palvelin, jolla aiot avainta käyttää, tukee niitä.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Avertissement : les clés ML-DSA sont très récentes et ne sont pas encore prises en charge par de nombreux serveurs. Veuillez vérifier que le serveur sur lequel vous utiliserez cette clé accepte les clés ML-DSA.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"警告: ML-DSAは非常に新しい鍵の種類で、多くのサーバーはまだサポートしていません。使用する前にサーバーでML-DSAが利用可能か確認してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"경고: ML-DSA 키는 매우 최신 버전이므로 아직 많은 서버에서 지원되지 않습니다. 이 키를 사용할 서버가 ML-DSA 키를 허용하는지 확인하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ostrzeżenie: klucze ML-DSA są bardzo nowe i nie są jeszcze wspierane przez wiele serwerów. Zweryfikuj czy serwer, który zamierzasz użyć z tym kluczem akceptuje klucze ML-DSA.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aviso: Chaves ML-DSA são muito novas e não são suportadas por muitos servidores ainda. Por favor, verifique se o servidor que você estará utilizando esta chave aceita chaves ML-DSA.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Внимание: Ключи ML-DSA совсем новые, и не пока поддерживаются многими серверами. Пожалуйста удостоверьтесь, что используемый с этим ключом сервер поддерживает ключи ML-DSA.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Warning: ML-DSA keys are very new, and not supported by many servers yet. Please verify the server you'll be using this key for accepts ML-DSA keys.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"警告：ML-DSA密钥非常新，许多服务器尚不支持。 请验证您将使用此密钥的服务器能接受ML-DSA密钥。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"警告：ML-DSA金鑰非常新，許多伺服器尚不支援。 請驗證您將使用此金鑰的伺服器能接受ML-DSA金鑰。\"\n          }\n        }\n      }\n    },\n    \"create_secret_name_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nom\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Τίτλος\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nimi\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nom\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nome\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"名前\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이름\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nazwa\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nome\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Название\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Name\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"名称\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"名稱\"\n          }\n        }\n      }\n    },\n    \"create_secret_name_placeholder\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Psssst\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Hysssss\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chuuut\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットの名前\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"쉿\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Тссссс\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shhhhh\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"张三的主机\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"某某\"\n          }\n        }\n      }\n    },\n    \"create_secret_notify_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"No es requerirà cap autenticació mentre el Mac estiga desbloquejat, però seràs notificat quan s'utilitze ùn secret.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Es ist keine Authentifizierung erforderlich solange dein Mac entsperrt ist, aber du wirst benachrichtigt, wenn ein Secret verwendet wird.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Todennusta ei vaadita Macisi ollessa lukitsematta, mutta saat ilmoituksen kun salaisuutta käytetään.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aucune authentification n'est requise lorsque votre Mac est déverrouillé, mais vous serez averti lorsqu'un secret sera utilisé.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Non è richiesta alcuna autenticazione finché il tuo Mac è sbloccato, ma verrete notificati quando un Segreto viene usato.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"お使いのMacでロックが解除されている間は認証が必要になりません。シークレットが利用されると通知されます。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mac이 잠금 해제되어 있는 동안에는 인증이 필요하지 않지만 비밀이 사용되면 알림을 받게 됩니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Uwierzytelnianie nie jest wymagane gdy twój Mac jest odblokowany. Otrzymasz powiadomienie kiedy sekret zostanie użyty.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Autenticação não é requerida enquanto seu Mac estiver destravado, mas você será notificado quando um segredo for utilizado.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Аутентификация не потребуется пока Ваш Mac разблокирован, но Вы получите уведомление, если секрет будет использован.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No authentication is required while your Mac is unlocked, but you will be notified when a secret is used.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"当Mac已解锁时无需验证，但密钥串被使用时会通知您。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"當Mac已解鎖時無需驗證，但Secret被使用时會通知您。\"\n          }\n        }\n      }\n    },\n    \"create_secret_notify_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notifica\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Benachrichtigen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ilmoita\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notifier\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notifica\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"通知のみ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"알림\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Powiadom\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notificar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Уведомить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Notify\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"通知\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"通知\"\n          }\n        }\n      }\n    },\n    \"create_secret_protection_level_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nivell de protecció\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Suojaustaso\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Niveau de protection\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"保護のレベル\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"보호 수준\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Poziom Ochrony\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nível de proteção\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Уровень защиты\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Protection Level\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"保护级别\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"保護級別\"\n          }\n        }\n      }\n    },\n    \"create_secret_require_authentication_biometric_current_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Requereix autenticació amb la biometria configurada actualment.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vaadi todennus nykyisellä biometriikkajoukolla.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Exiger l'authentification à l'aide de l'ensemble actuel de données biométriques.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"現在登録されている生体認証が必要になります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"현재의 생체 인식 정보들를 사용하여 인증을 요구합니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wymagaj uwierzytelnienia przy użyciu aktualnego zestawu danych biometrycznych.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Exigir autenticação com o conjunto atual de biometria.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Требовать аутентификацию с текущим набором биометрии.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require authentication with current set of biometrics.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"需要用当前的生物识别特征集来认证。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"需要用當前的生物識別特徵集來認證。\"\n          }\n        }\n      }\n    },\n    \"create_secret_require_authentication_biometric_current_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Biometria actual\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktuelle Biometrie\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nykyiset biometriikat\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Données biométriques actuelles\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"現在の生体認証\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"현재 생체 인식들\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualne dane biometryczne\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Biometria atual\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Текущая биометрия\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Current Biometrics\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"当前的生物识别\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"當前的生物識別\"\n          }\n        }\n      }\n    },\n    \"create_secret_require_authentication_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Necessitaràs autenticar amp Touch ID, Apple Watch o contrasenya abans de cada ús.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Du musst dich vor jeder Nutzung mit Touch ID, Apple Watch oder einem Passwort authentifizieren.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Touch ID-, Apple Watch- tai salasanatodennus vaaditaan joka käytöllä.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vous devrez vous authentifier à l'aide de Touch ID, de l'Apple Watch ou d'un mot de passe avant chaque utilisation.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"È richiesta l’autenticazione tramite Touch ID, Apple Watch, o password prima di ciascun uso.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットを利用する前に、Touch ID、Apple Watch、またはパスワードを使って認証が必要になります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"매번 사용하기 전에 Touch ID, Apple Watch 또는 비밀번호를 사용하여 인증해야 합니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wymagane będzie uwierzytelnienie za pomocą Touch ID, Apple Watch lub hasła przed każdym użyciem.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Você será requerido a autenticar utilizando Touch ID, Apple Watch ou senha antes de cada uso.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вам потребуется аутентифицироваться при помощи Touch ID, Apple Watch или пароля перед каждым использованием.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You will be required to authenticate using Touch ID, Apple Watch, or password before each use.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"每次使用前都会要求您使用触控ID、Apple Watch或密码进行验证。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"每次使用前都會要求您使用Touch ID、Apple Watch或密碼進行認證。\"\n          }\n        }\n      }\n    },\n    \"create_secret_require_authentication_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Requereix autenticació\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Authentifizierung Erforderlich\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vaadi todennus\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Exiger l'authentification\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Autenticazione richiesta\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"認証を要求する\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"인증 요구\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wymagaj uwierzytelnienia\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Requer Autenticação\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Требовать аутентификацию\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Require Authentication\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"需要验证\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"需要驗證\"\n          }\n        }\n      }\n    },\n    \"create_secret_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Crea un nou secret\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ein Neues Secret Erstellen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Luo uusi salaisuus\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Créer un nouveau secret\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Crea un nuovo Segreto\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットを新規作成\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"새 비밀 생성\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utwórz nowy sekret\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Criar um Novo Segredo\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Создать новый секрет\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a New Secret\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"创建一个新的密钥串\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"建立新Secret\"\n          }\n        }\n      }\n    },\n    \"delete_confirmation_cancel_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"No esborres\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nicht Löschen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Älä poista\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ne pas supprimer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Non eliminare\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"キャンセル\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"삭제하지 않기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nie usuwaj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Não Apagar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Не удалять\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Don't Delete\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"禁止删除\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"禁止刪除\"\n          }\n        }\n      }\n    },\n    \"delete_confirmation_delete_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Esborra\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Löschen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Poista\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Supprimer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Elimina\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"削除\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"삭제\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Usuń\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Apagar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Удалить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"删除\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"刪除\"\n          }\n        }\n      }\n    },\n    \"delete_confirmation_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si esborres %1$(secretName)@, no podràs recuperar-la. Escriu “%2$(confirmSecretName)@” per a confirmar.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wenn du %1$(secretName)@ löschst, kannst du es nicht wiederherstellen. Gib zur Bestätigung “%2$(confirmSecretName)@” ein.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos poistat kohteen %1$(secretName)@, sitä ei pysty palauttamaan. Kirjoita “%2$(confirmSecretName)@” vahvistaaksesi poiston.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si vous effacez %1$(secretName)@, vous ne pourrez pas le récupérer. Tapez “%2$(confirmSecretName)@” pour confirmer.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se elimini %1$(secretName)@, non sarai più in grado di recuperarlo. Digita “%1$(secretName)@” per confermare.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"一旦%1$(secretName)@を削除すると二度と元には戻せません。“%2$(confirmSecretName)@”と入力して確認してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(secretName)@를 삭제하면 복구할 수 없습니다. 확인하려면 “%2$(confirmSecretName)@”를 입력하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeżeli usuniesz %1$(secretName)@, nie będziesz w stanie go odzyskać. Napisz “%2$(confirmSecretName)@” aby potwierdzić.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você deletar %1$(secretName)@, você não será permitido recuperá-lo. Digite “%2$(confirmSecretName)@” para confirmar.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы удалите %1$(secretName)@, вы не сможете его восстановить. Введите “%2$(confirmSecretName)@” для подтверждения.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you delete %1$(secretName)@, you will not be able to recover it. Type “%2$(confirmSecretName)@” to confirm.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果删除%1$(secretName)@，您将无法恢复它。输入 “%2$(confirmSecretName)@”以确认。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果刪除%1$(secretName)@，您將無法恢復它。輸入“%2$(confirmSecretName)@”以確認。\"\n          }\n        }\n      }\n    },\n    \"delete_confirmation_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Esborrar %1$(secretName)@?\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(secretName)@ Löschen?\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Poista %1$(secretName)@?\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Supprimer %1$(secretName)@?\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Eliminare %1$(secretName)@?\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(secretName)@を削除しますか?\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(secretName)@를 지우겠습니까?\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Usunąć %1$(secretName)@?\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deletar %1$(secretName)@?\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Удалить %1$(secretName)@?\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete %1$(secretName)@?\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"删除“%1$(secretName)@”吗？\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"刪除「%1$(secretName)@」嗎？\"\n          }\n        }\n      }\n    },\n    \"edit_cancel_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cancel·la\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Abbrechen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Άκυρο\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Peru\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Annuler\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Annulla\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"キャンセル\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"취소\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Anuluj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cancelar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Отменить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Cancel\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"取消\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"取消\"\n          }\n        }\n      }\n    },\n    \"edit_save_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Canvia el nom\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Umbenennen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Αποθήκευση\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Tallenna\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Renommer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Rinomina\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"名前の変更\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이름 변경\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zmień nazwę\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Renomear\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Переименовать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Save\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"保存\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"儲存\"\n          }\n        }\n      }\n    },\n    \"empty_store_modifiable_click_here_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Crea una nova clicant ací.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Klicke hier um ein neues zu erstellen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Luo uusi klikkaamalla tästä.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Créez-en un nouveau en cliquant ici.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Creane uno nuovo cliccando qui.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ここをクリックして新規作成\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"여기를 클릭해서 새로운 비밀 만들기.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utwórz nowy klikając tutaj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Criar um novo clicando aqui.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Создайте новый, кликнув сюда.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Create a new one by clicking here.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"点击这里创建一个新的密钥串。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"點選這裡建立一個新的Secret。\"\n          }\n        }\n      }\n    },\n    \"empty_store_modifiable_click_here_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sense secrets\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Keine Secrets\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ei salaisuuksia\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aucun secret\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nessun Segreto\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットがありません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀이 없음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Brak sekretów\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sem Segredos\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Нет секретов\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"没有密钥串\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有Secret\"\n          }\n        }\n      }\n    },\n    \"empty_store_modifiable_empty_os_warning_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sembla que heu actualitzat macOS recentment. De vegades açò posa el xip segur en un estat estrany, potser necessiteu un reinici del vostre Mac perquè tot torne a funcionar.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Näyttää siltä, että olet päivittänyt macOS:n äskettäin. Joskus tämä saa Secure Enclaven omituiseen tilaan, joten voi olla, että joudut käynnistämään Macisi uudelleen jotta asiat alkavat jälleen toimia.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Il semble que vous ayez récemment mis à jour macOS. Cela peut parfois perturber l'état de la Secure Enclave, et vous devrez peut-être redémarrer votre Mac pour que tout fonctionne à nouveau.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"macOSが最近アップデートされたようです。これによりSecure Enclaveが正しく動作せず、Macを再起動する必要がある場合があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"최근에 macOS를 업데이트하신 것 같습니다. 업데이트 후 Secure Enclave가 이상한 상태로 전환되는 경우가 있는데, Mac을 재부팅해야 다시 작동할 수 있습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wygląda na to, że niedawno zaktualizowałeś system macOS. Czasami powoduje to dziwne zachowanie modułu Secure Enclave i może być konieczne ponowne uruchomienie komputera, aby wszystko znów działało poprawnie.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Parece que você pode ter atualizado recentemente o macOS. Às vezes, isto coloca o Secure Enclave em um estado estranho, e talvez você precise reiniciar seu Mac antes que as coisas comecem a funcionar novamente.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Похоже, что Вы могли недавно обновить MacOS. Иногда из-за этого возникают проблемы с Secure Enclave, и возможно Вам потребуется перезапустить Ваш Mac, чтобы их исправить.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"It looks like you may have recently updated macOS. Sometimes this puts the Secure Enclave into a weird state, and you might need to reboot your Mac before things start working again.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"看起来您最近可能更新了macOS。 有时这会使安全隔区状态异常，可能需要重启Mac才能恢复正常。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"看起來您最近可能更新了macOS。 有時這會使安全隔離區狀態異常，可能需要重啟Mac才能恢復正常。\"\n          }\n        }\n      }\n    },\n    \"empty_store_modifiable_empty_os_warning_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Falten secrets?\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fehlende Secrets?\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Puuttuvia salaisuuksia?\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secrets manquants?\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットが見つからない場合\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret이 사라졌나요?\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Brakuje sekretów?\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Credenciais faltando?\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Не хватает секретов?\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Missing Secrets?\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"密钥串不见了？\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret不見了？\"\n          }\n        }\n      }\n    },\n    \"empty_store_nonmodifiable_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utilitza \"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Verwende das Verwaltungstool deiner Chipkarte um ein Secret zu erstellen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Käytä älykorttisi hallintatyökalua luodaksesi salaisuuden.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utilisez l'outil de gestion de votre carte à puce pour créer un secret.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Usa lo strumento di gestione della tua Smart Card per creare un Segreto.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"お使いのスマートカードの管理ツールを使い、シークレットを作成してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스마트 카드의 관리 도구를 사용하여 비밀을 생성하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Użyj oprogramowania twojego Smart Card, aby stworzyć sekret.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utilize sua ferramenta de gestão de Smart Card para criar um segredo.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Для создания секрета воспользуйтесь инструментом управления Вашей смарт-картой.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Use your Smart Card's management tool to create a secret.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"使用您的智能卡管理工具创建一个新的密钥串。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"使用您的智慧卡管理工具建立一個新的Secret。\"\n          }\n        }\n      }\n    },\n    \"empty_store_nonmodifiable_supported_key_types\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive suporta claus EC256, EC384, RSA1024 i RSA2048.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive unterstützt EC256, EC384, RSA1024 und RSA2048 Schlüssel.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive tukee EC256-, EC384-, RSA1024- ja RSA2048-avaimia.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive prend en charge les clés EC256, EC384, RSA1024 et RSA2048.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive supporta la cifratura EC256, EC384, RSA1024 e RSA2048.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SecretiveはEC256、EC384、RSA1024、またはRSA2048の鍵に対応しています。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive는 EC256, EC384, RSA1024 및 RSA2048 키를 지원합니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive wspiera klucze EC256, EC384, RSA1024 i RSA2048.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive suporta chaves EC256, EC384, RSA1024 e RSA2048.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive поддерживает ключи EC256, EC384, RSA1024, и RSA2048.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive supports EC256, EC384, and RSA2048 keys.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive支持EC256、EC384、RSA2048密钥。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive支援EC256、EC384、RSA2048金鑰。\"\n          }\n        }\n      }\n    },\n    \"empty_store_nonmodifiable_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sense secrets\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Keine Secrets\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ei salaisuuksia\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aucun secret\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nessun Segreto\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットがありません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀이 없음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Brak sekretów\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sem Segredos\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Нет секретов\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secrets\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"没有密钥串\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有Secret\"\n          }\n        }\n      }\n    },\n    \"export SSH_AUTH_SOCK=%@\" : {\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"export SSH_AUTH_SOCK=%@\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"Host *\\n\\tIdentityAgent %@\" : {\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Host *\\n\\tIdentityAgent %@\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"integrations_add_this_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Afegeix açò:\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Folgendes hinzufügen:\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Lisää tämä:\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ajouter cela:\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"追加する設定:\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이것을 추가하세요:\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dodaj to:\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Adicione isto:\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Добавить следующее:\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Add This:\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"添加这些内容：\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"新增這些內容：\"\n          }\n        }\n      }\n    },\n    \"integrations_apps_row_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aplicacions\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sovellukset\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Applications\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アプリ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"앱들\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aplikacje\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aplicativos\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Приложения\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Apps\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"应用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"應用\"\n          }\n        }\n      }\n    },\n    \"integrations_community_apps_list_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Existeix una llista d'instruccions per a aplicacions (en anglès) mantinguda per la comunitat a GitHub. Si l'aplicació que cerques no està suportada, crea una “issue” i la comunitat podria ajudar-te.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHubista löytyy yhteisön ylläpitämiä ohjeita eri sovelluksia varten. Jos haluamaasi sovellusta ei löydy, luo issue ja yhteisö saattaa pystyä auttamaan.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Il existe une liste d'instructions pour les applications, gérée par la communauté, sur GitHub. Si l'application que vous recherchez n'est pas prise en charge, créez un ticket et la communauté pourra peut-être vous aider.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHubにコミュニティが作成したアプリのガイドがあります。お探しのアプリがサポートされていない場合は、問題を報告することでコミュニティが解決の手助けになる場合があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub에는 커뮤니티에서 관리하는 앱 관련 지침 목록이 있습니다. 찾고 있는 앱이 지원되지 않는 경우, 이슈를 생성하시면 커뮤니티에서 도움을 드릴 수 있습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Na GitHubie znajduje się lista instrukcji dotyczących aplikacji, która jest utrzymywana przez społeczność. Jeśli aplikacja, której szukasz, nie jest obsługiwana, utwórz zgłoszenie, a społeczność może być w stanie pomóc.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Há uma lista de instruções para aplicativos no GitHub, mantida pela comunidade. Se o aplicativo que você está procurando não é suportado, registre um ticket para que a comunidade possa ajudar.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Существует список инструкций, поддерживаемый сообществом, к приложениям на GitHub. Если нужное Вам приложение не поддерживается, создайте issue, возможно сообщество сможет помочь Вам.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of instructions for apps on GitHub. If the app you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub上有份由社区维护的清单介绍如何配置应用。若尚不支持您要找的应用，请创建一个issue，社区或许能提供帮助。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub上有份由社群維護的清單介紹如何配置應用。若尚不支援您要找的應用，請建立一個issue，社群或許能提供幫助。\"\n          }\n        }\n      }\n    },\n    \"integrations_community_shell_list_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Existeix una llista d'instruccions per a shells (en anglès) mantinguda per la comunitat a GitHub. Si l'aplicació que cerques no està suportada, crea una “issue” i la comunitat podria ajudar-te.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHubista löytyy yhteisön ylläpitämiä ohjeita eri shellejä varten. Jos haluamaasi shelliä ei löydy, luo issue ja yhteisö saattaa pystyä auttamaan.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Il existe une liste d'instructions shell maintenue par la communauté sur GitHub. Si le shell que vous recherchez n'est pas pris en charge, créez un ticket et la communauté pourra peut-être vous aider.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHubにコミュニティが作成したシェルのガイドがあります。お探しのシェルがサポートされていない場合は、問題を報告することでコミュニティが解決の手助けになる場合があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub에는 커뮤니티에서 관리하는 셸 지침 목록이 있습니다. 찾고 있는 셸이 지원되지 않는 경우, 이슈를 생성하면 커뮤니티에서 도움을 드릴 수 있습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Na GitHubie znajduje się lista instrukcji dotyczących powłoki, utrzymywana przez społeczność. Jeśli powłoka, której szukasz, nie jest obsługiwana, utwórz zgłoszenie, a społeczność może być w stanie pomóc.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Há uma lista de instruções para aplicativos no GitHub, mantida pela comunidade. Se o aplicativo que você está procurando não é suportado, registre um ticket para que a comunidade possa ajudar.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Существует список shell-скриптов, поддерживаемый сообществом на GitHub. Если нужный Вам shell-скрипт не поддерживается, создайте issue, возможно сообщество сможет помочь Вам.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"There's a community-maintained list of shell instructions on GitHub. If the shell you're looking for isn't supported, create an issue and the community may be able to help.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub上有份由社区维护的清单介绍如何配置shell。若尚不支持您要找的shell，请创建一个issue，社区或许能提供帮助。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub上有份由社群維護的清單介紹如何配置shell。若尚不支援您要找的shell，請建立一個issue，社群或許能提供幫助。\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_email_placeholder\" : {\n      \"comment\" : \"Only “your_email” can be (optionally) localized. “example.com” should remain as-is.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"your_email@example.com\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_email_subtitle\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"The email address you set when you configured git (visible in gitconfig).\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_email_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Email Address\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_secret_empty_create\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Necessitaràs crear un secret abans de configurar esta acció.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sinun tulee luoda salaisuus ennen kun voit määrittää tämän toiminnon.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vous devrez créer un secret avant de configurer cette action.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"この設定をする前にシークレットを作成する必要があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이 작업을 구성하기 전에 Secret을 만들어야 합니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Musisz utworzyć Sekret przed skonfigurowaniem tej akcji.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Você precisará criar uma Credencial antes de configurar esta ação.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вам потребуется создать секрет перед настройкой этого действия.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You'll need to create a Secret before configuring this action.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在配置此操作前，您需要先创建一个密钥串。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在配置此操作前，您需要先建立一個Secret。\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_secret_header\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configura usant secret\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mit Secret konfigurieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Määritä salaisuuden avulla\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurez en utilisant un secret\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットを利用する設定\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret을 사용하여 구성\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Skonfiguruj Używając Sekretu\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurar Usando Credencial\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настроить используя секрет\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Using Secret\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"用密钥串来配置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"用Secret來配置\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_secret_no_secret\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cap secret\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kein Secret\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ei salaisuutta\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pas de secret\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレットなし\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀이 없음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Brak Sekretu\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sem Credenciais\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Без секрета\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secret\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"没有密钥串\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有Secret\"\n          }\n        }\n      }\n    },\n    \"integrations_configure_using_secret_secret_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Salaisuus\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secrets\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シークレット\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sekret\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Credencial\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"С секретом\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secret\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"密钥串\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secret\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_multiple_config\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pots configurar més d'un programa, generalment no interfereixen entre ells.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Voit määrittää useamman työkalun. Ne eivät yleensä häiritse toisiaan.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vous pouvez configurer plus d'un outil, ils n'interfèrent généralement pas entre eux.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"複数のツールを設定することができます。複数のツールが干渉することは通常ありません。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"여러 도구를 구성할 수 있으며, 일반적으로 서로 간섭하지 않습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Można skonfigurować więcej niż jedno narzędzie, zazwyczaj nie będą one ze sobą kolidować.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Você pode configurar mais de uma ferramenta, eles geralmente não interferem uns com os outros.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вы можете настроить более чем один инструмент. Обычно это не вызывает конфликтов при работе.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can configure more than one tool, they generally won't interfere with each other.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您可以配置多个工具，它们通常不会相互干扰。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您可以配置多個工具，它們通常不會相互干擾。\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_row_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Com començar\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Erste Schritte\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aloitus\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pour commencer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"はじめに\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"처음 시작하기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pierwsze Kroki\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Primeiros passos\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Начало работы\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Getting Started\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"入门指南\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"入門指南\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_section_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integracions\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integrationen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integraatiot\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Intégrations\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"連携\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"통합\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integracje\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integrações\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Интеграции\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"第三方集成\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"第三方整合\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_suggestion_git\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si tracteu de signar els vostres commits de git, configureu el signat a git.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos tarkoituksesi on allekirjoittaa Git-commiteja, määritä Git-allekirjoittaminen.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si vous essayez de signer vos commits git, configurez la signature Git.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Gitのコミットに署名する場合は、Gitの署名の設定をしてください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Git 커밋에 서명하려면 Git 서명을 설정하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeśli chcesz podpisywać swoje commity w git, skonfiguruj Git Signing.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você estiver tentando registrar seus commits no git, configure o Git Signing.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы хотите подписывать ваши git коммиты, настройте подпись Git.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to sign your git commits, set up Git Signing.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您打算签署git提交，请配置“Git签名”。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您打算簽署git提交，請配置「Git簽名」。\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_suggestion_shell\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si tracteu de configurar qualsevol cosa arrancada mitjançant la terminal, configureu la vostra shell.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos tarkoituksesi on määrittää komentorivityökaluja käyttämään Secretiveä, määritä shell.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"コマンドラインで実行するツールでSecretiveを利用する場合は、シェルの設定をしてください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive를 사용하기 위해 명령줄에서 실행되는 모든 것을 구성하려는 경우 셸을 구성하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeśli próbujesz skonfigurować cokolwiek w wierszu poleceń, najpierw skonfiguruj swoją powłokę, aby używać Secretive.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você está tentando configurar qualquer coisa em sua linha de comando para usar com Secretive, configure seu shell.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы хотите наладить работу Secretive с Вашими скриптами в Терминале, настройте Ваш Терминал.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to configure anything your command line runs to use Secretive, configure your shell.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您打算让命令行运行的任何命令使用Secretive，请配置“Shell”。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您打算讓命令列執行的任何命令使用Secretive，請配置「Shell」。\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_suggestion_shell_default\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si no sabeu quina shell utilitzes i no l'heu canviada, probablement utilitzeu `%(shellName)@`.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos et tiedä mitä shelliä käytät, etkä ole muuttanut sitä, todennäköisesti se on `%(shellName)@`.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si vous ne savez pas quel shell vous utilisez et que vous ne l'avez pas modifié, vous utilisez probablement `%(shellName)@`.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"どのシェルを利用しているか不明で変更されていない場合は、おそらく `%(shellName)@` が利用されています。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"어떤 셸을 사용하는지 모르고 변경하지 않은 경우, 아마도 `%(shellName)@`를 사용하고 있을 것입니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeśli nie wiesz jaką powłokę używasz i nie była ostatnio zmieniana, prawdopodobnie używasz `%(shellName)@`.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você não sabia qual shell você usa e não alterou, você provavelmente está usando `%(shellName)@`.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы не знаете, какой Терминал используете и не меняли его раннее, то скорее всего Вы используете `%(shellName)@`.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you don't known what shell you use and haven't changed it, you're probably using `%(shellName)@`.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您不知道自己在用哪个shell且未曾更改它，您大概在用`%(shellName)@`。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您不知道自己在用哪個shell且未曾更改它，您大概在用`%(shellName)@`。\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_suggestion_ssh\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si tracteu d'autenticar-vos amb un servidor SSH o autenticar-vos amb un servei com GitHub per SSH, configureu el vostre client SSH.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos yrität todentua SSH-palvelimelle tai palveluun kuten GitHub SSH:n yli, määritä SSH-asiakasohjelma.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si vous essayez de vous authentifier à un serveur SSH ou un service comme GitHub via SSH, configurez le client SSH.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SSHサーバーかSSH経由でGitHubのようなサービスで認証する場合は、SSHクライアントの設定をしてください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SSH 서버로 인증하거나 SSH를 통해 GitHub와 같은 서비스로 인증하려는 경우 SSH 클라이언트를 구성하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeśli próbujesz uwierzytelnić się z serwerem SSH lub uwierzytelniać za pomocą serwisu takiego jak GitHub przez SSH, najpierw skonfiguruj swojego klienta SSH.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você está tentando autenticar com um servidor SSH ou autenticando com um serviço como o GitHub por SSH, configure seu cliente SSH.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы хотите аутентифицироваться с SSH сервером, или с сервисом как GitHub через SSH, настройте Ваш SSH клиент.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're trying to authenticate with an SSH server or authenticating with a service like GitHub over SSH, configure your SSH client.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您打算为SSH服务器配置身份认证或通过SSH与GitHub之类的服务认证身份，请配置SSH客户端。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您打算為SSH伺服器配置身份認證或透過SSH與GitHub之類的服務認證身份，請配置SSH客戶端。\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurant programes per a Secretive\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Työkalujen määrittäminen käyttämään Secretiveä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configuration des outils pour Secretive\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveをツールで利用する設定\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive를 위한 도구 구성\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Konfigurowanie Narzędzi dla Secretive\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurando Ferramentas para Secretive\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настройка инструментов для Secretive\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuring Tools for Secretive\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"为Secretive配置工具\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"為Secretive配置工具\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_title_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"La majoria de programes tracten d'utilitzar claus SSH a la carpeta `~/.ssh`. Per usar Secretive, hem de configurar-los perquè es connecten a Secretive en lloc d'açò.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Suurin osa työkaluista etsii SSH-avaimia kotihakemistostasi, `~/.ssh`. Ne pitää sen sijaan määrittää puhumaan Secretivelle.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"La plupart des outils vont essayer de lire les clés SSH sur le disque dans `~/.ssh`. Pour utiliser Secretive, vous devez configurer ces outils pour qu'ils communiquent avec Secretive.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ほとんどのツールはSSH鍵をディスク上の `~/.ssh` から探します。Secretiveを利用するには、代わりにSecretiveを利用するようにツールを設定する必要があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"대부분의 도구는 디스크의 `~/.ssh`에서 SSH 키를 찾으려고 합니다. Secretive를 사용하려면 해당 도구가 Secretive와 통신하도록 설정해야 합니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Większość narzędzi próbuje szukać kluczy SSH na dysku w `~/.ssh`. Aby korzystać z kluczy umieszczonych w Secretive, musimy skonfigurować te narzędzia, aby komunikowały się z Secretive.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"A maioria das ferramentas tentará procurar chaves SSH no disco em `~/.ssh`. Para usar o Secretive, precisamos configurar essas ferramentas para comunicar com o Secretive.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Большинство инструментов попробуют найти SSH ключи в `~/.ssh`. Для того, чтобы использовать Secretive, нам потребуется настроить эти инструменты, чтобы они работали с Secretive.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Most tools will try and look for SSH keys on disk in `~/.ssh`. To use Secretive, we need to configure those tools to talk to Secretive instead.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"多数工具会尝试在`~/.ssh`中查找磁盘上的SSH密钥。要使用Secretive，我们需要配置这些工具来与Secretive通信。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"多數工具會嘗試在`~/.ssh`中查詢磁碟上的SSH金鑰。要使用Secretive，我們需要配置這些工具來與Secretive通訊。\"\n          }\n        }\n      }\n    },\n    \"integrations_getting_started_what_should_i_configure_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Què deuria configurar?\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mitä määrittäisin?\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Qu'est-ce que je devrais configurer?\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定方法\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"무엇을 구성해야 할까요?\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Co powinienem skonfigurować?\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"O que devo Configurar?\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Что мне следует настроить?\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"What Should I Configure?\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"我应该配置什么？\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"我應該配置什麼？\"\n          }\n        }\n      }\n    },\n    \"integrations_git_step_gitallowedsigners_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners probablement no existirà. Heu de crear-lo en eixe cas.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners -tiedostoa ei todennäköisesti ole olemassa. Sinun täytyy luoda se.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"`~/.gitallowedsigners` n'existe probablement pas. Vous devrez le créer.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners がおそらく存在しないので、作成する必要があります。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners가 존재하지 않을 수 있습니다. 직접 만들어야 합니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedSigers prawdopodobnie nie istnieje. Musisz go utworzyć.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners provavelmente não existe. Você precisará criá-lo.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Возможно, директория ~/.gitallowedsigners не существует. Вам потребуется создать ее.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"~/.gitallowedsigners probably does not exist. You'll need to create it.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners 可能不存在。您需要创建它。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"~/.gitallowedsigners 可能不存在。您需要建立它。\"\n          }\n        }\n      }\n    },\n    \"integrations_git_step_gitconfig_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"[user]\\n    signingkey = %1$(publicKeyPathPlaceholder)@\\n[commit]\\n    gpgsign = true\\n[gpg]\\n    format = ssh\\n[gpg \\\"ssh\\\"]\\n    allowedSignersFile = ~/.gitallowedsigners\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"integrations_menu_bar_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integracions…\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integrationen…\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integraatiot…\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Intégrations…\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"連携…\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"통합…\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integracje…\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integrações…\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Интеграции…\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Integrations…\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"第三方集成…\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"第三方整合…\"\n          }\n        }\n      }\n    },\n    \"integrations_other_section_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Altres\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sonstige\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Muu\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Autre\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"その他\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"기타\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inne\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Outros\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Другое\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Other\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        }\n      }\n    },\n    \"integrations_other_shell_row_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"altres\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"sonstige\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"muu\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"autre\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"その他\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이외의 셸\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"inne\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"outros\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"другое\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"other\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"其他\"\n          }\n        }\n      }\n    },\n    \"integrations_path_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Arxiu de configuració\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Konfigurationsdatei\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Asetustiedosto\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fichier de configuration\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定ファイル\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"설정 파일\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Plik konfiguracyjny\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Arquivo de Configuração\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Файл конфигурации\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configuration File\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"配置文件\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"配置檔案\"\n          }\n        }\n      }\n    },\n    \"integrations_shell_section_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shells\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"シェル\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Powłoka\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Shell\"\n          }\n        }\n      }\n    },\n    \"integrations_ssh_specific_key_note\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pots configurar SSH perquè use una clau específica depenent del host. Vegeu la documentació a la web per més detalls.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Voit kehottaa SSH:ta käyttämään tiettyä avainta tietylle isännälle. Katso lisätietoja web-dokumentaatiosta.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Vous pouvez demander à SSH d'utiliser une clé spécifique pour un hôte donné. Consulter la documentation en ligne pour plus de détails.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"特定のホストで特定の鍵を利用するようにSSHを設定することができます。詳細についてはWebのドキュメントを参照してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SSH가 특정 호스트에 대해 특정 키를 사용하도록 설정할 수 있습니다. 자세한 내용은 웹 문서를 참조하세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Możesz nakazać SSH użycie określonego klucza dla danego hosta. Więcej szczegółów znajdziesz w dokumentacji internetowej.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Você pode pedir ao SSH para usar uma chave específica para um determinado host. Consulte a documentação na web para mais detalhes.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Вы можете настроить SSH так, чтобы использовался конкретный ключ для выбранного хоста. Посмотрите документацию в интернете, чтобы узнать подробности.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"You can tell SSH to use a specific key for a given host. See the web documentation for more details.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您可以让SSH为指定的主机使用特定密钥。详情请参阅在线文档。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您可以讓SSH為指定的主機使用特定金鑰。詳情請參閱線上手冊。\"\n          }\n        }\n      }\n    },\n    \"integrations_system_section_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sistema\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"System\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Järjestelmä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Système\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"システム\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"시스템\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"System\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sistema\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Система\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"System\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"系统\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"系統\"\n          }\n        }\n      }\n    },\n    \"integrations_tool_name_bash\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"bash\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"integrations_tool_name_fish\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"fish\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"integrations_tool_name_git_signing\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Signat de Git\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Git-allekirjoitus\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Signature Git\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Gitの署名\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Git 서명\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Assinatura Git\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Подпись Git\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Git Signing\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Git签名\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Git簽名\"\n          }\n        }\n      }\n    },\n    \"integrations_tool_name_ssh\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SSH\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"integrations_tool_name_zsh\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"zsh\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"integrations_view_other_github_link\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Veure a GitHub\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Auf GitHub anzeigen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Näytä GitHubissa\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Voir sur GitHub\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHubを表示\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"GitHub에서 보기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zobacz na GitHub\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Visualizar no GitHub\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Посмотреть на GitHub\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View on GitHub\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在GitHub上查看\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在GitHub上檢視\"\n          }\n        }\n      }\n    },\n    \"integrations_web_link\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Veure documentació a la web\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dokumentation im Web ansehen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Näytä dokumentaatio Webissä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Voir la documentation en ligne\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Webでドキュメントを表示\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"웹에서 문서 보기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zobacz dokumentację w Internecie\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ver Documentação na Web\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Найти документацию в интернете\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"View Documentation on Web\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"查看在线文档\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"檢視線上手冊\"\n          }\n        }\n      }\n    },\n    \"integrationsGitStepGitconfigSectionNote\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si qualsevol secció (com [user]) existeix, simplement afegiu les entrades en la secció existent.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wenn ein Abschnitt (wie [user]) bereits existiert, füge die Einträge einfach in dem vorhandenen Abschnitt hinzu.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos jokin osio (kuten [user]) on jo olemassa, lisää merkinnät olemassaolevaan osioon.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si une section (comme [user]) existe déjà, ajoutez simplement les entrées dans la section existante.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"[user]のようなセクションがすでに存在する場合、既存のセクションに設定を追加してください。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"섹션(예: [user])이 이미 있는 경우 기존 섹션에 항목을 추가하기만 하면 됩니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeśli jakakolwiek sekcja (jak [user]) już istnieje, po prostu dodaj wpisy w istniejącej sekcji.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se alguma seção (como [user]) já existir, basta adicionar as entradas na seção existente.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если любой раздел (как [user]) уже существует, просто добавьте новые записи в него.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If any section (like [user]) already exists, just add the entries in the existing section.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"若某小节（比如 [user]）已存在，只需在现有小节中添加条目。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果某小節（比如 [user]）已存在，只需在現有小節中新增條目。\"\n          }\n        }\n      }\n    },\n    \"no_secure_storage_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"El teu Mac no té un Secure Enclave, i no hi ha una targeta intel·ligent compatible conectada.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Dein Mac verfügt nicht über einen Secure Enclave, und es ist keine kompatible Chipkarte eingelegt.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Macissasi ei ole Secure Enclavea, eikä tuettu älykortti ole syötettynä.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Votre Mac n'est pas équipé d'une Secure Enclave et aucune carte à puce compatible n'est insérée.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Il tuo Mac non ha Secure Enclave, e non è inserita una Smart Card compatibile.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"お使いのMacにはSecure Enclaveがありません。また、互換性のあるスマートカードが挿入されていません。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mac에 Secure Enclave가 없고 호환되는 스마트 카드가 삽입되어 있지 않습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Twój Mac nie posiada Secure Enclave i nie ma podpiętego kompatybilnego urządzenia Smart Card.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Seu Mac não possui o Secure Enclave e não há um Smart Card compatível inserido.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ваш Mac не поддерживает Secure Enclave, и не обнаружено совместимой смарт-карты.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Your Mac doesn't have a Secure Enclave, and there's not a compatible Smart Card inserted.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您的Mac没有安全隔区，也没有插入兼容的智能卡。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"您的Mac沒有安全隔離區，也沒有插入相容的智慧卡。\"\n          }\n        }\n      }\n    },\n    \"no_secure_storage_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"No hi ha cap emmagatzematge segur disponible\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kein Sicherer Speicher Verfügbar\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Turvasäilö ei saatavilla\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pas de stockage sécurisé disponible\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secure Storage non è disponibile\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"安全なストレージがありません\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"보안 저장소를 사용할 수 없음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nie znaleziono urządzenia obsługującego Secure Storage\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sem Armazenamento Seguro Disponível\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Защищенное хранилище недоступно\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"No Secure Storage Available\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"没有可用的安全存储区\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"沒有可用的安全儲存區\"\n          }\n        }\n      }\n    },\n    \"no_secure_storage_yubico_link\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si busques afegir una al teu Mac, les Yubikey 5 Series són genials.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wenn du deinen Mac mit sicherem Speicher ausstatten möchtest, eignet sich die YubiKey 5 Serie super.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jos haluat lisätä Maciisi sellaisen, YubiKey 5 -sarja on mainio.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Si vous souhaitez en ajouter une à votre Mac, les YubiKey 5 Series sont parfaites.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se stai cercando di aggiungerne una al tuo Mac, le YubiKey 5 Series sono ottime.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"お使いのMacに追加するには、YubiKey 5シリーズがおすすめです。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mac에 하나를 추가하고 싶다면 YubiKey 5 시리즈가 좋습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jeżeli chcesz dodać takie urządzenie do twojego Maca, YubiKey serii 5 są warte uwagi.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Se você está buscando adicionar um para seu Mac, o YubiKey 5 Series é muito bom.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Если Вы собираетесь добавить его к Вашему Mac, YubiKey 5 серии - отличный выбор.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"If you're looking to add one to your Mac, the YubiKey 5 Series are great.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您想为Mac添加一个智能卡， YubiKey 5系列是个不错的选择。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"如果您想為Mac新增一個智慧卡，YubiKey 5系列是個不錯的選擇。\"\n          }\n        }\n      }\n    },\n    \"persist_authentication_accept_button\" : {\n      \"comment\" : \"When the user authorizes an action using a secret that requires unlock, they're shown a notification offering to leave the secret unlocked for a set period of time. This is the title for the notification.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mantín desbloquejat\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Entsperrt Lassen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Jätä lukitsematta\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Laisser déverrouillé\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Lascia sbloccato\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ロックを解除したままにする\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"잠금 해제 상태로 유지\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pozostaw odblokowany\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Deixar Destrancado\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Оставить разблокированным\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Leave Unlocked\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"自动验证\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"保持解鎖\"\n          }\n        }\n      }\n    },\n    \"persist_authentication_decline_button\" : {\n      \"comment\" : \"When the user authorizes an action using a secret that requires unlock, they're shown a notification offering to leave the secret unlocked for a set period of time. This is the decline button for the notification.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"No desbloqueges\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nicht Entsperren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Älä avaa lukitusta\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ne pas déverrouiller\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Non sbloccare\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ロックを解除しない\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"잠금 해제하지 않음\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nie odblokowuj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Não Destravar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Не разблокировать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Do Not Unlock\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"不要自动验证\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"不要解鎖\"\n          }\n        }\n      }\n    },\n    \"reveal_in_finder_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mostra al Finder\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"In Finder anzeigen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Näytä Finderissa\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Afficher dans le Finder\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Finderに表示\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Finder에서 보기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pokaż w Finder\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mostrar no Finder\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Открыть в Finder\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Reveal in Finder\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在访达中查看\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"在Finder中檢視\"\n          }\n        }\n      }\n    },\n    \"secret_detail_md5_fingerprint_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Empremta MD5\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MD5 Fingerabdruck\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MD5-sormenjälki\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Empreinte MD5\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Impronta MD5\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MD5指紋\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MD5 지문\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Suma kontrolna MD5\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Impressão Digital MD5\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Отпечаток MD5\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"MD5 Fingerprint\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MD5指纹\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"MD5指紋\"\n          }\n        }\n      }\n    },\n    \"secret_detail_public_key_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clau pública\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Öffentlicher Schlüssel\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Julkisavain\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clé publique\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chiave pubblica\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"公開鍵\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"공개 키\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Klucz publiczny\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chave Pública\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Публичный ключ\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"公钥\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"公鑰\"\n          }\n        }\n      }\n    },\n    \"secret_detail_public_key_path_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Camí de la clau pública\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pfad des Öffentlichen Schlüssels\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Julkisavaimen polku\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chemin vers la clé publique\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Percorso della chiave pubblica\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"公開鍵のパス\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"공개 키 경로\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ścieżka klucza publicznego\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Caminho da Chave Pública\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Путь к публичному ключу\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Public Key Path\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"公钥路径\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"公鑰路徑\"\n          }\n        }\n      }\n    },\n    \"secret_detail_sha256_fingerprint_label\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Empremta SHA256\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SHA256 Fingerabdruck\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SHA256-sormenjälki\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Empreinte SHA256\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Impronta SHA256\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SHA256指紋\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SHA256 지문\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Suma kontrolna SHA256\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Impressão Digital SHA256\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Отпечаток SHA256\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"SHA256 Fingerprint\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SHA256指纹\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"SHA256指紋\"\n          }\n        }\n      }\n    },\n    \"secret_list_delete_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Esborra\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Löschen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Poista\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Supprimer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Elimina\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"削除\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"삭제\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Usuń\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Apagar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Удалить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Delete\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"删除\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"刪除\"\n          }\n        }\n      }\n    },\n    \"secret_list_edit_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Canvia el nom\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Umbenennen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Muokkaa\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Renommer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Rinomina\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"名前を変更\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이름 변경\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zmień nazwę\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Renomear\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Переименовать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Edit\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"编辑\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"編輯\"\n          }\n        }\n      }\n    },\n    \"secure_enclave\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Xip segur\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Enclave sécurisée\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bezpieczna Enklawa\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secure Enclave\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"安全隔区\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"安全隔離區\"\n          }\n        }\n      }\n    },\n    \"set -x SSH_AUTH_SOCK %@\" : {\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"set -x SSH_AUTH_SOCK %@\"\n          }\n        }\n      },\n      \"shouldTranslate\" : false\n    },\n    \"setup_agent_activity_monitor_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aquesta aplicació s'anomena **Secret Agent** i potser la vegas en Monitor d'Activitat.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Diese Hilfsanwendung heißt **Secret Agent**, und du kannst sie gelegentlich in der Aktivitätsanzeige sehen.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Apusovelluksen nimi on **Secret Agent** ja voit nähdä sen Activity Managerissa aika ajoin.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cette application auxiliaire s'appelle **Secret Agent** et vous pouvez la voir dans le Gestionnaire d'activités de temps en temps.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Quest’app ausiliare è chiamata **Secret Agent** e potrebbe comparire in Monitoraggio Attività di tanto in tanto.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"この補助アプリは**SecretAgent**といいます。アクティビティモニタに表示されます。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"이 도우미 앱은 **Secret Agent**이라고 하며 활성 상태 보기에서 수시로 볼 수 있습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ta aplikacja pomocnicza nazywa się **Secret Agent** i możesz zobaczyć ją od czasu do czasu w Monitorze Aktywności.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Este aplicativo de ajuda é chamado **Secret Agent** e você pode vê-lo no Monitor de Atividades de tempo em tempo.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Это вспомогательное приложение назвается **Secret Agent**, Вы можете видеть его в Activity Monitor время от времени.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"This helper app is called **Secret Agent** and you may see it in Activity Manager from time to time.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"这个辅助程序叫做**Secret Agent**， 之后您会时不时在活动监视器中看见它。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"這個輔助程式叫做**Secret Agent**，之後您會時不時在活動監視器中看見它。\"\n          }\n        }\n      }\n    },\n    \"setup_agent_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive necessita iniciar una aplicació secundària per funcionar correctament. Signarà les peticions dels clients SSH en segon pla, per tal que no necessites mantenir la aplicació principal de Secretive oberta.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive muss eine Hilfsanwendung einrichten, damit es richtig funktioniert. Sie signiert Anfragen von SSH-Clients im Hintergrund, sodass du die Secretive-Hauptanwendung nicht geöffnet halten musst.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiven pitää määrittää apusovellus toimiakseen oikein. Se allekirjoittaa SSH-asiakasohjelmien pyyntöjä taustalla, jotta Secretive-pääohjelmaa ei tarvitse pitää auki koko ajan.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive a besoin de mettre en place une application auxiliaire pour fonctionner correctement. Elle signera les requêtes des clients SSH en arrière-plan, de sorte que vous n'ayez pas besoin de garder l'application principale Secretive ouverte.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive ha bisogno di impostare un’app ausiliaria per funzionare. Firmerà le richieste dai client SSH in background, così che non dovrai tenere l’app principale Secretive aperta.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveは補助アプリを利用します。補助アプリはバックグラウンドで稼働し、SSHクライアントからの要求に署名をします。Secretiveアプリを常に実行する必要はありません。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive가 제대로 작동하려면 도우미 앱을 설치해야 합니다. 백그라운드에서 SSH 클라이언트의 요청에 서명하므로 기본 Secretive 앱을 열어 둘 필요가 없습니다.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive potrzebuje ustawić aplikację pomocniczą, aby działać prawidłowo. Będzie podpisywać zapytania od klientów SSH w tle. Dzięki temu główna aplikacja Secretive nie musi być ciągle uruchomiona.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive precisa configurar um aplicativo de ajuda para funcionar corretamente. Isso irá assinar requisições de clientes SSH no plano de fundo para que você não precise manter o aplicativo Secretive aberto.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive требуется настроить вспомогательное приложение, чтобы работать правильно. Оно будет подписывать запросы от SSH клиентов в фоне, так Вам не придется держать основное приложение Secretive открытым.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive needs to set up a helper app to work properly. It will sign requests from SSH clients in the background, so you don't need to keep the main Secretive app open.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive需要设置一个辅助程序才能正常工作。它会在后台处理SSH客户端的签名请求，这样您就不需要在前台一直保持Secretive开启了。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive需要設定一個輔助程式才能正常工作。它會在後台處理SSH客戶端的簽名請求，這樣您就不需要在前臺一直保持Secretive開啟了。\"\n          }\n        }\n      }\n    },\n    \"setup_agent_install_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Instal·la\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Installieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Asenna\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Installer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Installa\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"インストール\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"설치\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zainstaluj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Instalar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Установить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Install\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"安装\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"安裝\"\n          }\n        }\n      }\n    },\n    \"setup_agent_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Inicialitza l'agent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent Einrichten\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Määritä agentti\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurer l'agent\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Imposta Secret Agent\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"エージェントをセットアップ\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Agent 설치\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Konfiguracja agenta\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurar Agent\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настроить агент\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Setup Agent\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"设置Agent\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定Agent\"\n          }\n        }\n      }\n    },\n    \"setup_done_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fet\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Valmis\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Terminé\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"完了\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"완료\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Gotowe\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Concluir\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Готово\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"完成\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"完成\"\n          }\n        }\n      }\n    },\n    \"setup_integrations_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configura\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Konfigurieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Määritä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"設定\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"설정\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Skonfiguruj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настроить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"配置\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"配置\"\n          }\n        }\n      }\n    },\n    \"setup_integrations_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configura els programes que utilitzes perquè gasten Secretive.\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sag den Tools, die Du benutzt, wie sie mit Secretive kommunizieren können.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kerro käyttämillesi työkaluille, miten puhua Secretivelle.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Indiquez aux outils que vous utilisez comment communiquer avec Secretive.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"お使いのツールとSecretiveを連携できます。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive와 대화하는 방법을 사용하는 도구를 알려주세요.\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wskaż narzędziom, z których korzystasz, jak komunikować się z Secretive.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Diga às ferramentas que você usa como falar com o Secretive.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настройте Ваши инструменты для работы с Secretive\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Tell the tools you use how to talk to Secretive.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"让您用的工具知道如何与Secretive通信。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"讓您用的工具知道如何與Secretive通訊。\"\n          }\n        }\n      }\n    },\n    \"setup_integrations_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configura integracions\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Integration konfigurieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Määritä integraatiot\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurer les intégrations\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"連携の設定\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"통합 설정\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Skonfiguruj integracje\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Configurar Integrações\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Настроить интеграции\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Configure Integrations\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"配置第三方集成\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"配置第三方整合\"\n          }\n        }\n      }\n    },\n    \"setup_updates_description\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive comprovarà periòdicament amb GitHub per comprovar si existeix una nova versió. \"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive prüft regelmäßig bei GitHub, ob es eine neue Version gibt. Wenn du Netzwerkanfragen an GitHub siehst, ist das der Grund.\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive tarkistaa päivityksiä GitHubista aika ajoin. Tämä selittää, jos näet verkkopyyntöjä GitHubiin.\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive vérifie périodiquement sur GitHub s'il existe une nouvelle version. C'est pour cette raison que vous pouvez voir des requêtes réseau vers GitHub.\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive controllerà periodicamente GitHub per vedere se ci sono nuove versioni rilasciate. Se vedi una richiesta network per GitHub, eccola spiegata.\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretiveは定期的にGitHubにアプリのアップデートがあるか確認します。GitHubへの通信が表示されることがあるのはそのためです。\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive는 주기적으로 GitHub를 확인하여 새 릴리스가 있는지 확인합니다. GitHub에 대한 네트워크 요청이 표시되는 이유입니다. \"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive będzie co jakiś czas będzie sprawdzał GitHub, aby zobaczyć czy dostępna jest nowsza wersja aplikacji. Jeżeli zobaczysz jakikolwiek ruch sieciowy do GitHub, to właśnie dlatego.\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive irá periodicamente verificar com o GitHub para verificar se existe uma nova versão. Se você ver alguma requisição de rede para o GitHub, este é o porque.\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive будет проверять обновления на GitHub. Если Вы видите сетевые запросы к GitHub, вот их причина.\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive will periodically check with GitHub to see if there's a new release. If you see any network requests to GitHub, that's why.\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive会定期访问GitHub来检查更新。这就是为什么您会看见发往GitHub的网络请求。\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive會定期訪問GitHub來檢查更新。這就是為什麼您會看見發往GitHub的網路請求。\"\n          }\n        }\n      }\n    },\n    \"setup_updates_ok_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"D'acord\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"D'accord\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"확인\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"ОК\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"OK\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"好的\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"好的\"\n          }\n        }\n      }\n    },\n    \"setup_updates_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actualitzacions\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Päivitykset\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mises à jour\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aggiornamenti\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アップデート\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"업데이트\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizacje\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualizações\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Обновления\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Updates\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        }\n      }\n    },\n    \"setupStepCompleteButton\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fet\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fertig\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Valmis\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Terminé\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"完了\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"완료됨\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Gotowe\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Concluir\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Готово\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Done\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"已完成\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"已完成\"\n          }\n        }\n      }\n    },\n    \"signed_notification_description\" : {\n      \"comment\" : \"When the user performs an action using a secret, they're shown a notification describing what happened. This is the description, showing which secret was used. The placeholder is the name of the secret.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Usant secret %1$(secretName)@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Benutze Secret %1$(secretName)@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Käytetään salaisuutta %1$(secretName)@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utilisation du secret %1$(secretName)@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Usato il Segreto %1$(secretName)@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(secretName)@を使用中\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"비밀 %1$(secretName)@ 사용됨\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Użyto sekretu %1$(secretName)@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Utilizando o segredo %1$(secretName)@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Используя секрет %1$(secretName)@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Using secret %1$(secretName)@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"使用密钥串 %1$(secretName)@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"使用Secret「%1$(secretName)@」\"\n          }\n        }\n      }\n    },\n    \"signed_notification_title\" : {\n      \"comment\" : \"When the user performs an action using a secret, they're shown a notification describing what happened. This is the title, showing which app requested the action. The placeholder is the name of the app.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Petició signada de %1$(appName)@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Signierte Anfrage von %1$(appName)@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Allekirjoitettu %1$(appName)@:n pyyntö\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Requête signée de %1$(appName)@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Firmata la richiesta da %1$(appName)@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(appName)@の要求に署名しました\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"%1$(appName)@에서 서명 요청\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Podpisano żądanie od %1$(appName)@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Requisição Assinada fr %1$(appName)@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Подписан запрос от %1$(appName)@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Signed Request from %1$(appName)@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"已认证来自“%1$(appName)@”的请求\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"已認證來自「%1$(appName)@」的請求\"\n          }\n        }\n      }\n    },\n    \"smart_card\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Targeta intel·ligent\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Chipkarte\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Älykortti\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Carte à puce\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"スマートカード\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"스마트 카드\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Karta inteligenta\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cartões com chip\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Смарт-карта\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Smart Card\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"智能卡\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"智慧卡\"\n          }\n        }\n      }\n    },\n    \"unnamed_secret\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sense nom\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Unbenannt\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Nimetön\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sans nom\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Anonimo\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"名前なし\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"무명\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Bez nazwy\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Sem Nome\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Без названия\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Unnamed\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"未命名\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"未命名\"\n          }\n        }\n      }\n    },\n    \"update_critical_notice_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actualització de seguretat crítica requerida\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kritisches Sicherheitsupdate Erforderlich\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kriittinen turvallisuuspäivitys vaaditaan\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mise à jour de sécurité critique requise\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Richiesto aggiornamento di sicurezza critico\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重要なセキュリティアップデートが必要です\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"치명적 보안 업데이트 필요\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Krytyczna aktualizacja bezpieczeństwa jest wymagana\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualização Crítica de Segurança Requerida\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Требуется критическое обновление безопасности\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update Required\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重要安全更新可用\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"需要重要安全更新\"\n          }\n        }\n      }\n    },\n    \"update_ignore_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignora\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignorieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ohita\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignorer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignora\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無視\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"무시하기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignoruj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignorar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Игнорировать\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"忽略\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"忽略\"\n          }\n        }\n      }\n    },\n    \"update_normal_notice_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actualización disponible\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Update Verfügbar\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Päivitys saatavilla\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mise à jour disponible\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aggiornamento disponibile\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アップデートがあります\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"사용가능한 업데이트\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizacja dostępna\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualização Disponível\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Доступно обновление\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"有可用更新\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"有可用更新\"\n          }\n        }\n      }\n    },\n    \"update_notification_ignore_button\" : {\n      \"comment\" : \"When an update is available, a notification is shown. This is the button to decline an update.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignora\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignorieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ohita\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignorer\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignora\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"無視\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"무시\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignoruj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Ignorar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Пропустить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Ignore\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"忽略\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"忽略\"\n          }\n        }\n      }\n    },\n    \"update_notification_update_button\" : {\n      \"comment\" : \"When an update is available, a notification is shown. This is the button to download an update.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actuailtza\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualisieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Päivitä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mettre à jour\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aggiorna\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アップデート\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"업데이트\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizuj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualizar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Обновить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        }\n      }\n    },\n    \"update_notification_update_critical_title\" : {\n      \"comment\" : \"When an update is available, a notification is shown. This is the title for a very high priority update with security fixes. The placeholder is for the application version, eg \\\"Critical Security Update - 2.0\\\"\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actualització de seguretat crítica - %1$(updateName)@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kritisches Sicherheitsupdate - %1$(updateName)@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kriittinen turvallisuuspäivitys - %1$(updateName)@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mise à jour critique de sécurité - %1$(updateName)@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aggiornamento di sicurezza critico - %1$(updateName)@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重要なセキュリティアップデート - %1$(updateName)@\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"치명적 보안 업데이트 - %1$(updateName)@\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Krytyczna aktualizacja bezpieczeństwa - %1$(updateName)@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualização de Segurança Crítica - %1$(updateName)@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Критическое обновление безопасности - %1$(updateName)@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Critical Security Update - %1$(updateName)@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重要安全更新 - %1$(updateName)@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"重要安全更新 - %1$(updateName)@\"\n          }\n        }\n      }\n    },\n    \"update_notification_update_description\" : {\n      \"comment\" : \"When an update is available, a notification is shown. This is the description to download an update.\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Fes clic per actualitzar\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Zum Aktualisieren Klicken\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Päivitä napsauttamalla\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Cliquer pour mettre à jour\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clicca per aggiornare\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"クリックしてアップデート\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"클릭해서 업데이트 하기\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Kliknij aby zaktualizować\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Clique para Atualizar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Кликните, чтобы обновить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Click to Update\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"点击更新\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"點選以更新\"\n          }\n        }\n      }\n    },\n    \"update_notification_update_normal_title\" : {\n      \"comment\" : \"When an update is available, a notification is shown. This is the title for a normal priority update. The placeholder is for the application version, eg \\\"Update Available - 2.0\\\"\",\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actualizació disponible - %1$(updateName)@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Update Verfügbar - %1$(updateName)@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Päivitys saatavilla - %1$(updateName)@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mise à jour disponible - %1$(updateName)@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aggiornamento disponibile - %1$(updateName)@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アップデートがあります - %1$(updateName)@\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"사용 가능한 업데이트 - %1$(updateName)@\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizacja dostępna - %1$(updateName)@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualização disponível - %1$(updateName)@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Доступно обновление - %1$(updateName)@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update Available - %1$(updateName)@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"有可用更新 - %1$(updateName)@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"有可用更新 - %1$(updateName)@\"\n          }\n        }\n      }\n    },\n    \"update_release_notes_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notes de la versió\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Versionshinweise\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Julkaisutiedot\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notes de mise à jour\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Note di rilascio\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"リリースノート\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"릴리즈 노트\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Informacje o wersji\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Notas de Mudanças\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Список изменений\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Release Notes\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"发布说明\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"發行說明\"\n          }\n        }\n      }\n    },\n    \"update_test_notice_title\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Versió de prova\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Testversion\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Testiversio\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Test build\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Build di test\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"テスト版\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"테스트 빌드\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Wersja testowa\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Versão de Teste\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Тестовая сборка\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Test Build\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"测试版本\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"測試版本\"\n          }\n        }\n      }\n    },\n    \"update_update_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Actualitza\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualisieren\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Päivitä\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Mettre à jour\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aggiorna\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"アップデート\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"업데이트\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Aktualizuj\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Atualizar\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Обновить\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Update\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"更新\"\n          }\n        }\n      }\n    },\n    \"update_version_name\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Секретный %1$(updateName)@\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Secretive %1$(updateName)@\"\n          }\n        }\n      }\n    },\n    \"updater_download_latest_nightly_button\" : {\n      \"extractionState\" : \"manual\",\n      \"localizations\" : {\n        \"af\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"ar\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"ca\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Baixa l'última versió nightly\"\n          }\n        },\n        \"cs\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"da\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"de\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Letzte Nightly-Version herunterladen\"\n          }\n        },\n        \"el\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"en\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"es\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"fi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Lataa viimeisin jokaöinen versio\"\n          }\n        },\n        \"fr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Télécharger la dernière Nightly Build\"\n          }\n        },\n        \"he\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"hu\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"it\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"ja\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"開発最新版をダウンロード\"\n          }\n        },\n        \"ko\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"최신 Nightly Build 다운로드\"\n          }\n        },\n        \"nb\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"nl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"pl\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Pobierz najnowszą wersję Nightly\"\n          }\n        },\n        \"pt\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"pt-BR\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Baixar a última Nightly Build\"\n          }\n        },\n        \"ro\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"ru\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"Скачать последнюю ночную сборку\"\n          }\n        },\n        \"sr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"sv\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"tr\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"uk\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"vi\" : {\n          \"stringUnit\" : {\n            \"state\" : \"new\",\n            \"value\" : \"Download Latest Nightly Build\"\n          }\n        },\n        \"zh-Hans\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"下载最新的每日构建版本\"\n          }\n        },\n        \"zh-Hant\" : {\n          \"stringUnit\" : {\n            \"state\" : \"translated\",\n            \"value\" : \"下載最新的每日構建版本\"\n          }\n        }\n      }\n    }\n  },\n  \"version\" : \"1.0\"\n}"
  },
  {
    "path": "Sources/Packages/Sources/Brief/Documentation.docc/Documentation.md",
    "content": "# ``Brief``\n\nBrief is a collection of protocols and concrete implmentation describing updates.\n\n## Topics\n\n### Versioning\n\n- ``SemVer``\n- ``Release``\n\n### Updater\n\n- ``UpdaterProtocol``\n- ``Updater``\n"
  },
  {
    "path": "Sources/Packages/Sources/Brief/Release.swift",
    "content": "import Foundation\nimport SwiftUI\n\n/// A release is a representation of a downloadable update.\npublic struct Release: Codable, Sendable, Hashable {\n\n    /// The user-facing name of the release. Typically \"Secretive 1.2.3\"\n    public let name: String\n\n    /// A boolean describing whether or not the release is a prerelase build.\n    public let prerelease: Bool\n\n    /// A URL pointing to the HTML page for the release.\n    public let html_url: URL\n\n    /// A user-facing description of the contents of the update.\n    public let body: String\n\n    public let attributedBody: AttributedString\n\n    /// Initializes a Release.\n    /// - Parameters:\n    ///   - name: The user-facing name of the release.\n    ///   - prerelease: A boolean describing whether or not the release is a prerelase build.\n    ///   - html_url: A URL pointing to the HTML page for the release.\n    ///   - body: A user-facing description of the contents of the update.\n    public init(name: String, prerelease: Bool, html_url: URL, body: String) {\n        self.name = name\n        self.prerelease = prerelease\n        self.html_url = html_url\n        self.body = body\n        self.attributedBody = AttributedString(_markdown: body)\n    }\n\n    public init(_ release: GitHubRelease) {\n        self.name = release.name\n        self.prerelease = release.prerelease\n        self.html_url = release.html_url\n        self.body = release.body\n        self.attributedBody = AttributedString(_markdown: release.body)\n    }\n\n}\n\npublic struct GitHubRelease: Codable, Sendable {\n    let name: String\n    let prerelease: Bool\n    let html_url: URL\n    let body: String\n}\n\nfileprivate extension AttributedString {\n\n    init(_markdown markdown: String) {\n        let split = markdown.split(whereSeparator: \\.isNewline)\n        let lines = split\n            .compactMap {\n                try? AttributedString(markdown: String($0), options: .init(allowsExtendedAttributes: true, interpretedSyntax: .full))\n            }\n            .map { (string: AttributedString) in\n                guard case let .header(level) = string.runs.first?.presentationIntent?.components.first?.kind else { return string }\n                return AttributedString(\"\\n\") + string\n                    .transformingAttributes(\\.font) { font in\n                        font.value = switch level {\n                        case 2: .headline.bold()\n                        case 3: .headline\n                        default: .subheadline\n                        }\n                    }\n                    .transformingAttributes(\\.underlineStyle) { underline in\n                        underline.value = switch level {\n                        case 2: .single\n                        default: .none\n                        }\n                    }\n                + AttributedString(\"\\n\")\n            }\n        self = lines.reduce(into: AttributedString()) { partialResult, next in\n            partialResult.append(next)\n            partialResult.append(AttributedString(\"\\n\"))\n        }\n    }\n\n}\n\nextension Release: Identifiable {\n\n    public var id: String {\n        html_url.absoluteString\n    }\n\n}\n\nextension Release: Comparable {\n\n    public static func < (lhs: Release, rhs: Release) -> Bool {\n        lhs.version < rhs.version\n    }\n\n}\n\nextension Release {\n\n    /// A boolean describing whether or not the release contains critical security content.\n    /// - Note: this is determined by the presence of the phrase \"Critical Security Update\" in the ``body``.\n    /// - Warning: If this property is true, the user will not be able to dismiss UI or reminders associated with the update.\n    public var critical: Bool {\n        body.contains(Constants.securityContent)\n    }\n\n    /// A ``SemVer`` representation of the version number of the release.\n    public var version: SemVer {\n        SemVer(name)\n    }\n\n    /// The minimum macOS version required to run the update.\n    public var minimumOSVersion: SemVer {\n        guard let range = body.range(of: \"Minimum macOS Version\"),\n              let numberStart = body.rangeOfCharacter(from: CharacterSet.decimalDigits, options: [], range: range.upperBound..<body.endIndex) else { return SemVer(\"11.0.0\") }\n        let numbersEnd = body.rangeOfCharacter(from: CharacterSet.whitespacesAndNewlines, options: [], range: numberStart.upperBound..<body.endIndex)?.lowerBound ?? body.endIndex\n        let version = numberStart.lowerBound..<numbersEnd\n        return SemVer(String(body[version]))\n    }\n\n}\n\nextension Release {\n\n    enum Constants {\n        static let securityContent = \"Critical Security Update\"\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/Brief/SemVer.swift",
    "content": "import Foundation\n\n/// A representation of a Semantic Version.\npublic struct SemVer: Sendable {\n\n    /// The SemVer broken into an array of integers.\n    let versionNumbers: [Int]\n    public let previewDescription: String?\n\n    public var isTestBuild: Bool {\n        versionNumbers == [0, 0, 0]\n    }\n\n    /// Initializes a SemVer from a string representation.\n    /// - Parameter version: A string representation of the SemVer, formatted as \"major.minor.patch\".\n    public init(_ version: String) {\n        // Betas have the format 1.2.3_beta1\n        // Nightlies have the format 0.0.0_nightly-2025-09-03\n        let splitFull = version.split(separator: \"_\")\n        let strippedBeta = splitFull.first!\n        previewDescription = splitFull.count > 1 ? String(splitFull[1]) : nil\n        var split = strippedBeta.split(separator: \".\").compactMap { Int($0) }\n        while split.count < 3 {\n            split.append(0)\n        }\n        versionNumbers = split\n    }\n\n    /// Initializes a SemVer from an `OperatingSystemVersion` representation.\n    /// - Parameter version: An  `OperatingSystemVersion` representation of the SemVer.\n    public init(_ version: OperatingSystemVersion) {\n        versionNumbers = [version.majorVersion, version.minorVersion, version.patchVersion]\n        previewDescription = nil\n    }\n\n}\n\nextension SemVer: Comparable {\n\n    public static func < (lhs: SemVer, rhs: SemVer) -> Bool {\n        for (latest, current) in zip(lhs.versionNumbers, rhs.versionNumbers) {\n            if latest < current {\n                return true\n            } else if latest > current {\n                return false\n            }\n        }\n        return false\n    }\n\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/Brief/Updater.swift",
    "content": "import Foundation\nimport Observation\nimport XPCWrappers\n\n/// A concrete implementation of ``UpdaterProtocol`` which considers the current release and OS version.\n@Observable public final class Updater: UpdaterProtocol, Sendable {\n\n    private let state = State()\n    @MainActor @Observable public final class State {\n        var update: Release? = nil\n        nonisolated init() {}\n    }\n    public var update: Release? {\n        state.update\n    }\n\n    /// The current version of the app that is running.\n    public let currentVersion: SemVer\n\n    /// The current OS version.\n    private let osVersion: SemVer\n\n    /// Initializes an Updater.\n    /// - Parameters:\n    ///   - checkOnLaunch: A boolean describing whether the Updater should check for available updates on launch.\n    ///   - checkFrequency: The interval at which the Updater should check for updates. Subject to a tolerance of 1 hour.\n    ///   - osVersion: The current OS version.\n    ///   - currentVersion: The current version of the app that is running.\n    public init(\n        checkOnLaunch: Bool,\n        checkFrequency: TimeInterval = Measurement(value: 24, unit: UnitDuration.hours).converted(to: .seconds).value,\n        osVersion: SemVer = SemVer(ProcessInfo.processInfo.operatingSystemVersion),\n        currentVersion: SemVer = SemVer(Bundle.main.infoDictionary?[\"CFBundleShortVersionString\"] as? String ?? \"0.0.0\")\n    ) {\n        self.osVersion = osVersion\n        self.currentVersion = currentVersion\n        Task {\n            if checkOnLaunch {\n                try await checkForUpdates()\n            }\n            while !Task.isCancelled {\n                try? await Task.sleep(for: .seconds(Int(checkFrequency)))\n                try await checkForUpdates()\n            }\n        }\n    }\n\n    /// Manually trigger an update check.\n    public func checkForUpdates() async throws {\n        let session = try await XPCTypedSession<[Release], Never>(serviceName: \"com.maxgoedjen.Secretive.SecretiveUpdater\")\n        await evaluate(releases: try await session.send())\n        session.complete()\n    }\n\n\n    /// Ignores a specified release. `update` will be nil if the user has ignored the latest available release.\n    /// - Parameter release: The release to ignore.\n    public func ignore(release: Release) async {\n        guard !release.critical else { return }\n        defaults.set(true, forKey: release.name)\n        await MainActor.run {\n            state.update = nil\n        }\n    }\n\n}\n\nextension Updater {\n\n    /// Evaluates the available downloadable releases, and selects the newest non-prerelease release that the user is able to run.\n    /// - Parameter releases: An array of ``Release`` objects.\n    func evaluate(releases: [Release]) async {\n        guard let release = releases\n                .sorted()\n                .reversed()\n                .filter({ !$0.prerelease })\n                .first(where: { $0.minimumOSVersion <= osVersion }) else { return }\n        guard !userIgnored(release: release) else { return }\n        guard !release.prerelease else { return }\n        let latestVersion = SemVer(release.name)\n        if latestVersion > currentVersion {\n            await MainActor.run {\n                state.update = release\n            }\n        }\n    }\n\n    /// Checks whether the user has ignored a release.\n    /// - Parameter release: The release to check.\n    /// - Returns: A boolean describing whether the user has ignored the release. Will always be false if the release is critical.\n    func userIgnored(release: Release) -> Bool {\n        guard !release.critical else { return false }\n        return defaults.bool(forKey: release.name)\n    }\n\n    /// The user defaults used to store user ignore state.\n    var defaults: UserDefaults {\n        UserDefaults(suiteName: \"com.maxgoedjen.Secretive.updater.ignorelist\")!\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/Brief/UpdaterProtocol.swift",
    "content": "import Foundation\n\n/// A protocol for retreiving the latest available version of an app.\npublic protocol UpdaterProtocol: Observable, Sendable {\n\n    /// The latest update\n    @MainActor var update: Release? { get }\n\n    var currentVersion: SemVer { get }\n\n    func ignore(release: Release) async\n}\n\n"
  },
  {
    "path": "Sources/Packages/Sources/Common/BundleIDs.swift",
    "content": "import Foundation\n\nextension Bundle {\n    public static var agentBundleID: String {\n        Bundle.main.bundleIdentifier!.replacingOccurrences(of: \"Host\", with: \"SecretAgent\")\n    }\n\n    public static var hostBundleID: String {\n        Bundle.main.bundleIdentifier!.replacingOccurrences(of: \"SecretAgent\", with: \"Host\")\n    }\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/Common/URLs.swift",
    "content": "import Foundation\nimport SSHProtocolKit\nimport SecretKit\n\nextension URL {\n\n    public static var agentHomeURL: URL {\n        URL(fileURLWithPath: URL.homeDirectory.path().replacingOccurrences(of: Bundle.hostBundleID, with: Bundle.agentBundleID))\n    }\n\n    public static var socketPath: String {\n        #if DEBUG\n        URL.agentHomeURL.appendingPathComponent(\"socket-debug.ssh\").path()\n        #else\n        URL.agentHomeURL.appendingPathComponent(\"socket.ssh\").path()\n        #endif\n    }\n\n    public static var publicKeyDirectory: URL {\n        agentHomeURL.appending(component: \"PublicKeys\")\n    }\n\n    /// The path for a Secret's public key.\n    /// - Parameter secret: The Secret to return the path for.\n    /// - Returns: The path to the Secret's public key.\n    /// - Warning: This method returning a path does not imply that a key has been written to disk already. This method only describes where it will be written to.\n    public static func publicKeyPath<SecretType: Secret>(for secret: SecretType, in directory: URL) -> String {\n        let keyWriter = OpenSSHPublicKeyWriter()\n        let minimalHex = keyWriter.openSSHMD5Fingerprint(secret: secret).replacingOccurrences(of: \":\", with: \"\")\n        return directory.appending(component: \"\\(minimalHex).pub\").path()\n    }\n\n}\n\nextension String {\n\n    public var normalizedPathAndFolder: (String, String) {\n        // All foundation-based normalization methods replace this with the container directly.\n        let processedPath = replacingOccurrences(of: \"~\", with: \"/Users/\\(NSUserName())\")\n        let url = URL(filePath: processedPath)\n        let folder = url.deletingLastPathComponent().path()\n        return (processedPath, folder)\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/Packages/Sources/SSHProtocolKit/Data+Hex.swift",
    "content": "import Foundation\nimport CryptoKit\n\npublic struct HexDataStyle<SequenceType: Sequence>: Hashable, Codable {\n\n    let separator: String\n\n    public init(separator: String) {\n        self.separator = separator\n    }\n\n}\n\nextension HexDataStyle: FormatStyle where SequenceType.Element == UInt8 {\n\n    public func format(_ value: SequenceType) -> String {\n        value\n            .compactMap { (\"0\" + String($0, radix: 16, uppercase: false)).suffix(2) }\n            .joined(separator: separator)\n    }\n\n}\n\nextension FormatStyle where Self == HexDataStyle<Data> {\n\n    public static func hex(separator: String = \"\") -> HexDataStyle<Data> {\n        HexDataStyle(separator: separator)\n    }\n\n}\nextension FormatStyle where Self == HexDataStyle<Insecure.MD5Digest> {\n\n    public static func hex(separator: String = \":\") -> HexDataStyle<Insecure.MD5Digest> {\n        HexDataStyle(separator: separator)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SSHProtocolKit/LengthAndData.swift",
    "content": "import Foundation\n\nextension Data {\n\n    /// Creates an OpenSSH protocol style data object, which has a length header, followed by the data payload.\n    /// - Returns: OpenSSH data.\n    package var lengthAndData: Data {\n        let rawLength = UInt32(count)\n        var endian = rawLength.bigEndian\n        return unsafe Data(bytes: &endian, count: MemoryLayout<UInt32>.size) + self\n    }\n\n}\n\nextension String {\n\n    /// Creates an OpenSSH protocol style data object, which has a length header, followed by the data payload.\n    /// - Returns: OpenSSH data.\n    package var lengthAndData: Data {\n        Data(utf8).lengthAndData\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SSHProtocolKit/OpenSSHPublicKeyWriter.swift",
    "content": "import Foundation\nimport CryptoKit\nimport SecretKit\n\n/// Generates OpenSSH representations of the public key sof secrets.\npublic struct OpenSSHPublicKeyWriter: Sendable {\n\n    /// Initializes the writer.\n    public init() {\n    }\n\n    /// Generates an OpenSSH data payload identifying the secret.\n    /// - Returns: OpenSSH data payload identifying the secret.\n    public func data<SecretType: Secret>(secret: SecretType) -> Data {\n        switch secret.keyType.algorithm {\n        case .ecdsa:\n            // https://datatracker.ietf.org/doc/html/rfc5656#section-3.1\n            openSSHIdentifier(for: secret.keyType).lengthAndData +\n            (\"nistp\" + String(describing: secret.keyType.size)).lengthAndData +\n            secret.publicKey.lengthAndData\n        case .mldsa:\n            // https://www.ietf.org/archive/id/draft-sfluhrer-ssh-mldsa-04.txt\n            openSSHIdentifier(for: secret.keyType).lengthAndData +\n            secret.publicKey.lengthAndData\n        case .rsa:\n            // https://datatracker.ietf.org/doc/html/rfc4253#section-6.6\n            openSSHIdentifier(for: secret.keyType).lengthAndData +\n            rsaPublicKeyBlob(secret: secret)\n        }\n    }\n\n    /// Generates an OpenSSH string representation of the secret.\n    /// - Returns: OpenSSH string representation of the secret.\n    public func openSSHString<SecretType: Secret>(secret: SecretType) -> String {\n        return [openSSHIdentifier(for: secret.keyType), data(secret: secret).base64EncodedString(), comment(secret: secret)]\n            .compactMap { $0 }\n            .joined(separator: \" \")\n    }\n\n    /// Generates an OpenSSH SHA256 fingerprint string.\n    /// - Returns: OpenSSH SHA256 fingerprint string.\n    public func openSSHSHA256Fingerprint<SecretType: Secret>(secret: SecretType) -> String {\n        // OpenSSL format seems to strip the padding at the end.\n        let base64 = Data(SHA256.hash(data: data(secret: secret))).base64EncodedString()\n        let paddingRange = base64.index(base64.endIndex, offsetBy: -2)..<base64.endIndex\n        let cleaned = base64.replacingOccurrences(of: \"=\", with: \"\", range: paddingRange)\n        return \"SHA256:\\(cleaned)\"\n    }\n\n    /// Generates an OpenSSH MD5 fingerprint string.\n    /// - Returns: OpenSSH MD5 fingerprint string.\n    public func openSSHMD5Fingerprint<SecretType: Secret>(secret: SecretType) -> String {\n        Insecure.MD5.hash(data: data(secret: secret)).formatted(.hex(separator: \":\"))\n    }\n\n    public func comment<SecretType: Secret>(secret: SecretType) -> String {\n        if let comment = secret.publicKeyAttribution {\n            return comment\n        } else {\n            let dashedKeyName = secret.name.replacingOccurrences(of: \" \", with: \"-\")\n            let dashedHostName = [\"secretive\", Host.current().localizedName, \"local\"]\n                .compactMap { $0 }\n                .joined(separator: \".\")\n                .replacingOccurrences(of: \" \", with: \"-\")\n            return \"\\(dashedKeyName)@\\(dashedHostName)\"\n        }\n\n    }\n}\n\nextension OpenSSHPublicKeyWriter {\n\n    /// The fully qualified OpenSSH identifier for the algorithm.\n    /// - Parameters:\n    ///   - algorithm: The algorithm to identify.\n    ///   - length: The key length of the algorithm.\n    /// - Returns: The OpenSSH identifier for the algorithm.\n    public func openSSHIdentifier(for keyType: KeyType) -> String {\n        switch keyType {\n        case .ecdsa256:\n            \"ecdsa-sha2-nistp256\"\n        case .ecdsa384:\n            \"ecdsa-sha2-nistp384\"\n        case .mldsa65:\n            \"ssh-mldsa-65\"\n        case .mldsa87:\n            \"ssh-mldsa-87\"\n        case .rsa2048:\n            \"ssh-rsa\"\n        default:\n            \"unknown\"\n        }\n    }\n\n}\n\nextension OpenSSHPublicKeyWriter {\n\n    func rsaPublicKeyBlob<SecretType: Secret>(secret: SecretType) -> Data {\n        // Cheap way to pull out e and n as defined in https://datatracker.ietf.org/doc/html/rfc4253\n        // Keychain stores it as a thin ASN.1 wrapper with this format:\n        // [4 byte prefix][2 byte prefix][n][2 byte prefix][e]\n        // Rather than parse out the whole ASN.1 blob, we'll cheat and pull values directly since\n        // we only support one key type, and the keychain always gives it in a specific format.\n        guard secret.keyType == .rsa2048 else { fatalError() }\n        let length = secret.keyType.size/8\n        let data = secret.publicKey\n        let n = Data(data[8..<(9+length)])\n        let e = Data(data[(2+9+length)...])\n        return e.lengthAndData + n.lengthAndData\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SSHProtocolKit/OpenSSHReader.swift",
    "content": "import Foundation\n\n/// Reads OpenSSH protocol data.\npublic final class OpenSSHReader {\n\n    var remaining: Data\n    var done = false\n\n    /// Initialize the reader with an OpenSSH data payload.\n    /// - Parameter data: The data to read.\n    public init(data: Data) {\n        remaining = Data(data)\n    }\n\n    /// Reads the next chunk of data from the playload.\n    /// - Returns: The next chunk of data.\n    public func readNextChunk(convertEndianness: Bool = true) throws(OpenSSHReaderError) -> Data {\n        let length = try readNextBytes(as: UInt32.self, convertEndianness: convertEndianness)\n        guard remaining.count >= length else { throw .beyondBounds }\n        let dataRange = 0..<Int(length)\n        let ret = Data(remaining[dataRange])\n        remaining.removeSubrange(dataRange)\n        if remaining.isEmpty {\n            done = true\n        }\n        return ret\n    }\n\n    public func readNextBytes<T: FixedWidthInteger>(as: T.Type, convertEndianness: Bool = true) throws(OpenSSHReaderError) -> T {\n        let size = MemoryLayout<T>.size\n        guard remaining.count >= size else { throw .beyondBounds }\n        let lengthRange = 0..<size\n        let lengthChunk = remaining[lengthRange]\n        remaining.removeSubrange(lengthRange)\n        if remaining.isEmpty {\n            done = true\n        }\n        let value = unsafe lengthChunk.bytes.unsafeLoad(as: T.self)\n        return convertEndianness ? T(value.bigEndian) : T(value)\n    }\n\n    public func readNextChunkAsString(convertEndianness: Bool = true) throws(OpenSSHReaderError) -> String {\n        try String(decoding: readNextChunk(convertEndianness: convertEndianness), as: UTF8.self)\n    }\n\n    public func readNextChunkAsSubReader(convertEndianness: Bool = true) throws(OpenSSHReaderError) -> OpenSSHReader {\n        OpenSSHReader(data: try readNextChunk(convertEndianness: convertEndianness))\n    }\n\n}\n\npublic enum OpenSSHReaderError: Error, Codable {\n    case beyondBounds\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SSHProtocolKit/OpenSSHSignatureWriter.swift",
    "content": "import Foundation\nimport CryptoKit\nimport SecretKit\n\n/// Generates OpenSSH representations of Secrets.\npublic struct OpenSSHSignatureWriter: Sendable {\n\n    /// Initializes the writer.\n    public init() {\n    }\n\n    /// Generates an OpenSSH data payload identifying the secret.\n    /// - Returns: OpenSSH data payload identifying the secret.\n    public func data<SecretType: Secret>(secret: SecretType, signature: Data) -> Data {\n        switch secret.keyType.algorithm {\n        case .ecdsa:\n            // https://datatracker.ietf.org/doc/html/rfc5656#section-3.1\n            ecdsaSignature(signature, keyType: secret.keyType)\n        case .mldsa:\n            // https://datatracker.ietf.org/doc/html/draft-sfluhrer-ssh-mldsa-00#name-public-key-algorithms\n            mldsaSignature(signature, keyType: secret.keyType)\n        case .rsa:\n            // https://datatracker.ietf.org/doc/html/rfc4253#section-6.6\n            rsaSignature(signature)\n        }\n    }\n\n}\n\n\nextension OpenSSHSignatureWriter {\n\n    /// Converts a fixed-width big-endian integer (e.g. r/s from CryptoKit rawRepresentation) into an SSH mpint.\n    /// Strips unnecessary leading zeros and prefixes `0x00` if needed to keep the value positive.\n    private func mpint(fromFixedWidthPositiveBytes bytes: Data) -> Data {\n        // mpint zero is encoded as a string with zero bytes of data.\n        guard let firstNonZeroIndex = bytes.firstIndex(where: { $0 != 0x00 }) else {\n            return Data()\n        }\n\n        let trimmed = Data(bytes[firstNonZeroIndex...])\n\n        if let first = trimmed.first, first >= 0x80 {\n            var prefixed = Data([0x00])\n            prefixed.append(trimmed)\n            return prefixed\n        }\n        return trimmed\n    }\n\n    func ecdsaSignature(_ rawRepresentation: Data, keyType: KeyType) -> Data {\n        let rawLength = rawRepresentation.count/2\n        let r = mpint(fromFixedWidthPositiveBytes: Data(rawRepresentation[0..<rawLength]))\n        let s = mpint(fromFixedWidthPositiveBytes: Data(rawRepresentation[rawLength...]))\n\n        var signatureChunk = Data()\n        signatureChunk.append(r.lengthAndData)\n        signatureChunk.append(s.lengthAndData)\n        var mutSignedData = Data()\n        var sub = Data()\n        sub.append(OpenSSHPublicKeyWriter().openSSHIdentifier(for: keyType).lengthAndData)\n        sub.append(signatureChunk.lengthAndData)\n        mutSignedData.append(sub.lengthAndData)\n        return mutSignedData\n    }\n\n    func mldsaSignature(_ rawRepresentation: Data, keyType: KeyType) -> Data {\n        var mutSignedData = Data()\n        var sub = Data()\n        sub.append(OpenSSHPublicKeyWriter().openSSHIdentifier(for: keyType).lengthAndData)\n        sub.append(rawRepresentation.lengthAndData)\n        mutSignedData.append(sub.lengthAndData)\n        return mutSignedData\n    }\n\n    func rsaSignature(_ rawRepresentation: Data) -> Data {\n        var mutSignedData = Data()\n        var sub = Data()\n        sub.append(\"rsa-sha2-512\".lengthAndData)\n        sub.append(rawRepresentation.lengthAndData)\n        mutSignedData.append(sub.lengthAndData)\n        return mutSignedData\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SSHProtocolKit/SSHAgentProtocol.swift",
    "content": "import Foundation\n\n/// A namespace for the SSH Agent Protocol, as described in https://datatracker.ietf.org/doc/html/draft-miller-ssh-agent#section-5.1\npublic enum SSHAgent {}\n\nextension SSHAgent {\n\n    /// The type of the SSH Agent Request, as described in https://datatracker.ietf.org/doc/html/draft-miller-ssh-agent#section-5.1\n    public enum Request: CustomDebugStringConvertible, Codable, Sendable {\n\n        case requestIdentities\n        case signRequest(SignatureRequestContext)\n        case addIdentity\n        case removeIdentity\n        case removeAllIdentities\n        case addIDConstrained\n        case addSmartcardKey\n        case removeSmartcardKey\n        case lock\n        case unlock\n        case addSmartcardKeyConstrained\n        case protocolExtension\n        case unknown(UInt8)\n\n        public var protocolID: UInt8 {\n            switch self {\n            case .requestIdentities: 11\n            case .signRequest: 13\n            case .addIdentity: 17\n            case .removeIdentity: 18\n            case .removeAllIdentities: 19\n            case .addIDConstrained: 25\n            case .addSmartcardKey: 20\n            case .removeSmartcardKey: 21\n            case .lock: 22\n            case .unlock: 23\n            case .addSmartcardKeyConstrained: 26\n            case .protocolExtension: 27\n            case .unknown(let value): value\n            }\n        }\n\n        public var debugDescription: String {\n            switch self {\n            case .requestIdentities: \"SSH_AGENTC_REQUEST_IDENTITIES\"\n            case .signRequest: \"SSH_AGENTC_SIGN_REQUEST\"\n            case .addIdentity: \"SSH_AGENTC_ADD_IDENTITY\"\n            case .removeIdentity: \"SSH_AGENTC_REMOVE_IDENTITY\"\n            case .removeAllIdentities: \"SSH_AGENTC_REMOVE_ALL_IDENTITIES\"\n            case .addIDConstrained: \"SSH_AGENTC_ADD_ID_CONSTRAINED\"\n            case .addSmartcardKey: \"SSH_AGENTC_ADD_SMARTCARD_KEY\"\n            case .removeSmartcardKey: \"SSH_AGENTC_REMOVE_SMARTCARD_KEY\"\n            case .lock: \"SSH_AGENTC_LOCK\"\n            case .unlock: \"SSH_AGENTC_UNLOCK\"\n            case .addSmartcardKeyConstrained: \"SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED\"\n            case .protocolExtension: \"SSH_AGENTC_EXTENSION\"\n            case .unknown: \"UNKNOWN_MESSAGE\"\n            }\n        }\n\n        public struct SignatureRequestContext: Sendable, Codable {\n            public let keyBlob: Data\n            public let dataToSign: Data\n\n            public init(keyBlob: Data, dataToSign: Data) {\n                self.keyBlob = keyBlob\n                self.dataToSign = dataToSign\n            }\n\n            public static var empty: SignatureRequestContext {\n                SignatureRequestContext(keyBlob: Data(), dataToSign: Data())\n            }\n        }\n\n    }\n\n    /// The type of the SSH Agent Response, as described in https://datatracker.ietf.org/doc/html/draft-miller-ssh-agent#section-5.1\n    public enum Response: UInt8, CustomDebugStringConvertible {\n        \n        case agentFailure = 5\n        case agentSuccess = 6\n        case agentIdentitiesAnswer = 12\n        case agentSignResponse = 14\n        case agentExtensionFailure = 28\n        case agentExtensionResponse = 29\n\n        public var debugDescription: String {\n            switch self {\n            case .agentFailure: \"SSH_AGENT_FAILURE\"\n            case .agentSuccess: \"SSH_AGENT_SUCCESS\"\n            case .agentIdentitiesAnswer: \"SSH_AGENT_IDENTITIES_ANSWER\"\n            case .agentSignResponse: \"SSH_AGENT_SIGN_RESPONSE\"\n            case .agentExtensionFailure: \"SSH_AGENT_EXTENSION_FAILURE\"\n            case .agentExtensionResponse: \"SSH_AGENT_EXTENSION_RESPONSE\"\n            }\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/Agent.swift",
    "content": "import Foundation\nimport CryptoKit\nimport OSLog\nimport SecretKit\nimport AppKit\nimport SSHProtocolKit\n\n/// The `Agent` is an implementation of an SSH agent. It manages coordination and access between a socket, traces requests, notifies witnesses and passes requests to stores.\npublic final class Agent: Sendable {\n\n    private let storeList: SecretStoreList\n    private let witness: SigningWitness?\n    private let publicKeyWriter = OpenSSHPublicKeyWriter()\n    private let signatureWriter = OpenSSHSignatureWriter()\n    private let certificateHandler = OpenSSHCertificateHandler()\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"Agent\")\n\n    /// Initializes an agent with a store list and a witness.\n    /// - Parameters:\n    ///   - storeList: The `SecretStoreList` to make available.\n    ///   - witness: A witness to notify of requests.\n    public init(storeList: SecretStoreList, witness: SigningWitness? = nil) {\n        logger.debug(\"Agent is running\")\n        self.storeList = storeList\n        self.witness = witness\n        Task { @MainActor in\n            await certificateHandler.reloadCertificates(for: storeList.allSecrets)\n        }\n    }\n    \n}\n\nextension Agent {\n\n    public func handle(request: SSHAgent.Request, provenance: SigningRequestProvenance) async -> Data {\n        // Depending on the launch context (such as after macOS update), the agent may need to reload secrets before acting\n        await reloadSecretsIfNeccessary()\n        var response = Data()\n        do {\n            switch request {\n            case .requestIdentities:\n                response.append(SSHAgent.Response.agentIdentitiesAnswer.data)\n                response.append(await identities())\n                logger.debug(\"Agent returned \\(SSHAgent.Response.agentIdentitiesAnswer.debugDescription)\")\n            case .signRequest(let context):\n                response.append(SSHAgent.Response.agentSignResponse.data)\n                response.append(try await sign(data: context.dataToSign, keyBlob: context.keyBlob, provenance: provenance))\n                logger.debug(\"Agent returned \\(SSHAgent.Response.agentSignResponse.debugDescription)\")\n            case .unknown(let value):\n                logger.error(\"Agent received unknown request of type \\(value).\")\n                throw UnhandledRequestError()\n            default:\n                logger.debug(\"Agent received valid request of type \\(request.debugDescription), but not currently supported.\")\n                throw UnhandledRequestError()\n            }\n        } catch {\n            response = SSHAgent.Response.agentFailure.data\n            logger.debug(\"Agent returned \\(SSHAgent.Response.agentFailure.debugDescription)\")\n        }\n        return response.lengthAndData\n    }\n\n}\n\nextension Agent {\n\n    /// Lists the identities available for signing operations\n    /// - Returns: An OpenSSH formatted Data payload listing the identities available for signing operations.\n    func identities() async -> Data {\n        let secrets = await storeList.allSecrets\n        await certificateHandler.reloadCertificates(for: secrets)\n        var count = 0\n        var keyData = Data()\n\n        for secret in secrets {\n            let keyBlob = publicKeyWriter.data(secret: secret)\n            keyData.append(keyBlob.lengthAndData)\n            keyData.append(publicKeyWriter.comment(secret: secret).lengthAndData)\n            count += 1\n\n            if let (certificateData, name) = try? await certificateHandler.keyBlobAndName(for: secret) {\n                keyData.append(certificateData.lengthAndData)\n                keyData.append(name.lengthAndData)\n                count += 1\n            }\n        }\n        logger.log(\"Agent enumerated \\(count) identities\")\n        var countBigEndian = UInt32(count).bigEndian\n        let countData = unsafe Data(bytes: &countBigEndian, count: MemoryLayout<UInt32>.size)\n        return countData + keyData\n    }\n\n    /// Notifies witnesses of a pending signature request, and performs the signing operation if none object.\n    /// - Parameters:\n    ///   - data: The data to sign.\n    ///   - provenance: A ``SecretKit.SigningRequestProvenance`` object describing the origin of the request.\n    /// - Returns: An OpenSSH formatted Data payload containing the signed data response.\n    func sign(data: Data, keyBlob: Data, provenance: SigningRequestProvenance) async throws -> Data {\n        guard let (secret, store) = await secret(matching: keyBlob) else {\n            let keyBlobHex = keyBlob.compactMap { (\"0\" + String($0, radix: 16, uppercase: false)).suffix(2) }.joined()\n            logger.debug(\"Agent did not have a key matching \\(keyBlobHex)\")\n            throw NoMatchingKeyError()\n        }\n\n        try await witness?.speakNowOrForeverHoldYourPeace(forAccessTo: secret, from: store, by: provenance)\n\n        let rawRepresentation = try await store.sign(data: data, with: secret, for: provenance)\n        let signedData = signatureWriter.data(secret: secret, signature: rawRepresentation)\n\n        try await witness?.witness(accessTo: secret, from: store, by: provenance)\n\n        logger.debug(\"Agent signed request\")\n\n        return signedData\n    }\n\n}\n\nextension Agent {\n\n    /// Gives any store with no loaded secrets a chance to reload.\n    func reloadSecretsIfNeccessary() async {\n        for store in await storeList.stores {\n            if await store.secrets.isEmpty {\n                let name = await store.name\n                logger.debug(\"Store \\(name, privacy: .public) has no loaded secrets. Reloading.\")\n                await store.reloadSecrets()\n            }\n        }\n    }\n\n    /// Finds a ``Secret`` matching a specified hash whos signature was requested.\n    /// - Parameter hash: The hash to match against.\n    /// - Returns: A ``Secret`` and the ``SecretStore`` containing it, if a match is found.\n    func secret(matching hash: Data) async -> (AnySecret, AnySecretStore)? {\n        await storeList.allSecretsWithStores.first {\n            hash == publicKeyWriter.data(secret: $0.0)\n        }\n    }\n\n}\n\n\nextension Agent {\n\n    struct NoMatchingKeyError: Error {}\n    struct UnhandledRequestError: Error {}\n\n}\n\nextension SSHAgent.Response {\n\n    var data: Data {\n        var raw = self.rawValue\n        return unsafe Data(bytes: &raw, count: MemoryLayout<UInt8>.size)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/Documentation.docc/Documentation.md",
    "content": "# ``SecretAgentKit``\n\nSecretAgentKit is a collection of types that allow SecretAgent to conform to the SSH agent protocol.\n\n## Topics\n\n### Agent\n\n- ``Agent``\n\n### Protocol\n\n- ``SSHAgent``\n\n### Request Notification\n\n- ``SigningWitness``\n\n### Socket Operations\n\n- ``SocketController``\n- ``FileHandleReader``\n- ``FileHandleWriter``\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/FileHandleProtocols.swift",
    "content": "import Foundation\n\nextension FileHandle {\n\n    public var pidOfConnectedProcess: Int32 {\n        let pidPointer = UnsafeMutableRawPointer.allocate(byteCount: MemoryLayout<Int32>.size, alignment: 1)\n        var len = socklen_t(MemoryLayout<Int32>.size)\n        unsafe getsockopt(fileDescriptor, SOCK_STREAM, LOCAL_PEERPID, pidPointer, &len)\n        return unsafe pidPointer.load(as: Int32.self)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/OpenSSHCertificateHandler.swift",
    "content": "import Foundation\nimport OSLog\nimport SecretKit\nimport SSHProtocolKit\n\n/// Manages storage and lookup for OpenSSH certificates.\npublic actor OpenSSHCertificateHandler: Sendable {\n\n    private let publicKeyFileStoreController = PublicKeyFileStoreController(directory: URL.publicKeyDirectory)\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"OpenSSHCertificateHandler\")\n    private let writer = OpenSSHPublicKeyWriter()\n    private var keyBlobsAndNames: [AnySecret: (Data, Data)] = [:]\n\n    /// Initializes an OpenSSHCertificateHandler.\n    public init() {\n    }\n\n    /// Reloads any certificates in the PublicKeys folder.\n    /// - Parameter secrets: the secrets to look up corresponding certificates for.\n    public func reloadCertificates(for secrets: [AnySecret]) {\n        guard publicKeyFileStoreController.hasAnyCertificates else {\n            logger.log(\"No certificates, short circuiting\")\n            return\n        }\n        keyBlobsAndNames = secrets.reduce(into: [:]) { partialResult, next in\n            partialResult[next] = try? loadKeyblobAndName(for: next)\n        }\n    }\n\n    /// Attempts to find an OpenSSH Certificate  that corresponds to a ``Secret``\n    /// - Parameter secret: The secret to search for a certificate with\n    /// - Returns: A (``Data``, ``Data``) tuple containing the certificate and certificate name, respectively.\n    public func keyBlobAndName<SecretType: Secret>(for secret: SecretType) throws -> (Data, Data)? {\n        keyBlobsAndNames[AnySecret(secret)]\n    }\n    \n    /// Attempts to find an OpenSSH Certificate  that corresponds to a ``Secret``\n    /// - Parameter secret: The secret to search for a certificate with\n    /// - Returns: A (``Data``, ``Data``) tuple containing the certificate and certificate name, respectively.\n    private func loadKeyblobAndName<SecretType: Secret>(for secret: SecretType) throws -> (Data, Data)? {\n        let certificatePath = publicKeyFileStoreController.sshCertificatePath(for: secret)\n        guard FileManager.default.fileExists(atPath: certificatePath) else {\n            return nil\n        }\n\n        logger.debug(\"Found certificate for \\(secret.name)\")\n        let certContent = try String(contentsOfFile:certificatePath, encoding: .utf8)\n        let certElements = certContent.trimmingCharacters(in: .whitespacesAndNewlines).components(separatedBy: \" \")\n\n        guard certElements.count >= 2 else {\n            logger.warning(\"Certificate found for \\(secret.name) but failed to load\")\n            throw OpenSSHCertificateError.parsingFailed\n        }\n        guard let certDecoded = Data(base64Encoded: certElements[1] as String)  else {\n            logger.warning(\"Certificate found for \\(secret.name) but failed to decode base64 key\")\n            throw OpenSSHCertificateError.parsingFailed\n        }\n\n        if certElements.count >= 3 {\n            let certName = Data(certElements[2].utf8)\n            return (certDecoded, certName)\n        }\n        let certName = Data(secret.name.utf8)\n        logger.info(\"Certificate for \\(secret.name) does not have a name tag, using secret name instead\")\n        return (certDecoded, certName)\n    }\n\n}\n\nextension OpenSSHCertificateHandler {\n\n    enum OpenSSHCertificateError: LocalizedError {\n        case unsupportedType\n        case parsingFailed\n        case doesNotExist\n\n        public var errorDescription: String? {\n            switch self {\n            case .unsupportedType:\n                return \"The key type was unsupported\"\n            case .parsingFailed:\n                return \"Failed to properly parse the SSH certificate\"\n            case .doesNotExist:\n                return \"Certificate does not exist\"\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/PublicKeyStandinFileController.swift",
    "content": "import Foundation\nimport OSLog\nimport SecretKit\nimport SSHProtocolKit\nimport Common\n\n/// Controller responsible for writing public keys to disk, so that they're easily accessible by scripts.\npublic final class PublicKeyFileStoreController: Sendable {\n\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"PublicKeyFileStoreController\")\n    private let directory: URL\n    private let keyWriter = OpenSSHPublicKeyWriter()\n\n    /// Initializes a PublicKeyFileStoreController.\n    public init(directory: URL) {\n        self.directory = directory\n    }\n\n    /// Writes out the keys specified to disk.\n    /// - Parameter secrets: The Secrets to generate keys for.\n    /// - Parameter clear: Whether or not any untracked files in the directory should be removed.\n    public func generatePublicKeys(for secrets: [AnySecret], clear: Bool = false) throws {\n        logger.log(\"Writing public keys to disk\")\n        if clear {\n            let validPaths = Set(secrets.map { URL.publicKeyPath(for: $0, in: directory) })\n                .union(Set(secrets.map { sshCertificatePath(for: $0) }))\n            let contentsOfDirectory = (try? FileManager.default.contentsOfDirectory(atPath: directory.path())) ?? []\n            let fullPathContents = contentsOfDirectory.map { directory.appending(path: $0).path() }\n\n            let untracked = Set(fullPathContents)\n                .subtracting(validPaths)\n            for path in untracked {\n                // string instead of fileURLWithPath since we're already using fileURL format.\n                try? FileManager.default.removeItem(at: URL(string: path)!)\n            }\n        }\n        try? FileManager.default.createDirectory(at: directory, withIntermediateDirectories: false, attributes: nil)\n        for secret in secrets {\n            let path = URL.publicKeyPath(for: secret, in: directory)\n            let data = Data(keyWriter.openSSHString(secret: secret).utf8)\n            FileManager.default.createFile(atPath: path, contents: data, attributes: nil)\n        }\n        logger.log(\"Finished writing public keys\")\n    }\n\n\n    /// Short-circuit check to ship enumerating a bunch of paths if there's nothing in the cert directory.\n    public var hasAnyCertificates: Bool {\n        do {\n            return try FileManager.default\n                .contentsOfDirectory(atPath: directory.path())\n                .filter { $0.hasSuffix(\"-cert.pub\") }\n                .isEmpty == false\n        } catch {\n            return false\n        }\n    }\n\n    /// The path for a Secret's SSH Certificate public key.\n    /// - Parameter secret: The Secret to return the path for.\n    /// - Returns: The path to the SSH Certificate public key.\n    /// - Warning: This method returning a path does not imply that a key has a SSH certificates. This method only describes where it will be.\n    public func sshCertificatePath<SecretType: Secret>(for secret: SecretType) -> String {\n        let minimalHex = keyWriter.openSSHMD5Fingerprint(secret: secret).replacingOccurrences(of: \":\", with: \"\")\n        return directory.appending(component: \"\\(minimalHex)-cert.pub\").path()\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/SSHAgentInputParser.swift",
    "content": "import Foundation\nimport OSLog\nimport SecretKit\nimport SSHProtocolKit\n\npublic protocol SSHAgentInputParserProtocol {\n\n    func parse(data: Data) async throws -> SSHAgent.Request\n\n}\n\npublic struct SSHAgentInputParser: SSHAgentInputParserProtocol {\n\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"InputParser\")\n\n    public init() {\n\n    }\n\n    public func parse(data: Data) throws(AgentParsingError) -> SSHAgent.Request {\n        logger.debug(\"Parsing new data\")\n        guard data.count > 4 else {\n            throw .invalidData\n        }\n        let specifiedLength = unsafe (data[0..<4].bytes.unsafeLoad(as: UInt32.self).bigEndian) + 4\n        let rawRequestInt = data[4]\n        let remainingDataRange = 5..<min(Int(specifiedLength), data.count)\n        lazy var body: Data = { Data(data[remainingDataRange]) }()\n        switch rawRequestInt {\n        case SSHAgent.Request.requestIdentities.protocolID:\n            return .requestIdentities\n        case SSHAgent.Request.signRequest(.empty).protocolID:\n            do {\n                return .signRequest(try signatureRequestContext(from: body))\n            } catch {\n                throw .openSSHReader(error)\n            }\n        case SSHAgent.Request.addIdentity.protocolID:\n            return .addIdentity\n        case SSHAgent.Request.removeIdentity.protocolID:\n            return .removeIdentity\n        case SSHAgent.Request.removeAllIdentities.protocolID:\n            return .removeAllIdentities\n        case SSHAgent.Request.addIDConstrained.protocolID:\n            return .addIDConstrained\n        case SSHAgent.Request.addSmartcardKey.protocolID:\n            return .addSmartcardKey\n        case SSHAgent.Request.removeSmartcardKey.protocolID:\n            return .removeSmartcardKey\n        case SSHAgent.Request.lock.protocolID:\n            return .lock\n        case SSHAgent.Request.unlock.protocolID:\n            return .unlock\n        case SSHAgent.Request.addSmartcardKeyConstrained.protocolID:\n            return .addSmartcardKeyConstrained\n        case SSHAgent.Request.protocolExtension.protocolID:\n            return .protocolExtension\n        default:\n            return .unknown(rawRequestInt)\n        }\n    }\n\n}\n\nextension SSHAgentInputParser {\n\n    func signatureRequestContext(from data: Data) throws(OpenSSHReaderError) -> SSHAgent.Request.SignatureRequestContext {\n        let reader = OpenSSHReader(data: data)\n        let rawKeyBlob = try reader.readNextChunk()\n        let keyBlob = certificatePublicKeyBlob(from: rawKeyBlob) ?? rawKeyBlob\n        let dataToSign = try reader.readNextChunk()\n        return SSHAgent.Request.SignatureRequestContext(keyBlob: keyBlob, dataToSign: dataToSign)\n    }\n\n    func certificatePublicKeyBlob(from hash: Data) -> Data? {\n        let reader = OpenSSHReader(data: hash)\n        do {\n            let certType = String(decoding: try reader.readNextChunk(), as: UTF8.self)\n            switch certType {\n            case \"ecdsa-sha2-nistp256-cert-v01@openssh.com\",\n                \"ecdsa-sha2-nistp384-cert-v01@openssh.com\",\n                \"ecdsa-sha2-nistp521-cert-v01@openssh.com\":\n                _ = try reader.readNextChunk() // nonce\n                let curveIdentifier = try reader.readNextChunk()\n                let publicKey = try reader.readNextChunk()\n                let openSSHIdentifier = certType.replacingOccurrences(of: \"-cert-v01@openssh.com\", with: \"\")\n                return openSSHIdentifier.lengthAndData +\n                curveIdentifier.lengthAndData +\n                publicKey.lengthAndData\n            default:\n                return nil\n            }\n        } catch {\n            return nil\n        }\n    }\n\n}\n\n\nextension SSHAgentInputParser {\n\n    public enum AgentParsingError: Error, Codable {\n        case unknownRequest\n        case unhandledRequest\n        case invalidData\n        case openSSHReader(OpenSSHReaderError)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/SigningRequestTracer.swift",
    "content": "import Foundation\nimport AppKit\nimport Security\nimport SecretKit\n\n/// An object responsible for generating ``SecretKit.SigningRequestProvenance`` objects.\nstruct SigningRequestTracer {\n}\n\nextension SigningRequestTracer {\n\n    /// Generates a ``SecretKit.SigningRequestProvenance`` from a ``FileHandle``.\n    /// - Parameter fileHandle: The reader involved in processing the request.\n    /// - Returns: A ``SecretKit.SigningRequestProvenance`` describing the origin of the request.\n    func provenance(from fileHandle: FileHandle) -> SigningRequestProvenance {\n        let firstInfo = process(from: fileHandle.pidOfConnectedProcess)\n        var provenance = SigningRequestProvenance(root: firstInfo)\n        while NSRunningApplication(processIdentifier: provenance.origin.pid) == nil && provenance.origin.parentPID != nil {\n            provenance.chain.append(process(from: provenance.origin.parentPID!))\n        }\n        return provenance\n    }\n\n    /// Generates a `kinfo_proc` representation of the provided process ID.\n    /// - Parameter pid: The process ID to look up.\n    /// - Returns: a `kinfo_proc` struct describing the process ID.\n    func pidAndNameInfo(from pid: Int32) -> kinfo_proc {\n        var len = unsafe MemoryLayout<kinfo_proc>.size\n        let infoPointer = UnsafeMutableRawPointer.allocate(byteCount: len, alignment: 1)\n        var name: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, pid]\n        unsafe sysctl(&name, UInt32(name.count), infoPointer, &len, nil, 0)\n        return unsafe infoPointer.load(as: kinfo_proc.self)\n    }\n\n    /// Generates a ``SecretKit.SigningRequestProvenance.Process`` from a provided process ID.\n    /// - Parameter pid: The process ID to look up.\n    /// - Returns: A ``SecretKit.SigningRequestProvenance.Process`` describing the process.\n    func process(from pid: Int32) -> SigningRequestProvenance.Process {\n        var pidAndNameInfo = unsafe self.pidAndNameInfo(from: pid)\n        let ppid = unsafe pidAndNameInfo.kp_eproc.e_ppid != 0 ? pidAndNameInfo.kp_eproc.e_ppid : nil\n        let procName = unsafe withUnsafeMutablePointer(to: &pidAndNameInfo.kp_proc.p_comm.0) { pointer in\n            unsafe String(cString: pointer)\n        }\n\n        let pathPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: Int(MAXPATHLEN))\n        _ = unsafe proc_pidpath(pid, pathPointer, UInt32(MAXPATHLEN))\n        let path = unsafe String(cString: pathPointer)\n        var secCode: Unmanaged<SecCode>!\n        let flags: SecCSFlags = [.considerExpiration, .enforceRevocationChecks]\n        unsafe SecCodeCreateWithPID(pid, SecCSFlags(), &secCode)\n        let valid = unsafe SecCodeCheckValidity(secCode.takeRetainedValue(), flags, nil) == errSecSuccess\n        return SigningRequestProvenance.Process(pid: pid, processName: procName, appName: appName(for: pid), iconURL: iconURL(for: pid), path: path, validSignature: valid, parentPID: ppid)\n    }\n\n    /// Looks up the URL for the icon of a process ID, if it has one.\n    /// - Parameter pid: The process ID to look up.\n    /// - Returns: A URL to the icon, if the process has one.\n    func iconURL(for pid: Int32) -> URL? {\n        do {\n            if let app = NSRunningApplication(processIdentifier: pid), let icon = app.icon?.tiffRepresentation {\n                let temporaryURL = URL(fileURLWithPath: (NSTemporaryDirectory() as NSString).appendingPathComponent(\"\\(app.bundleIdentifier ?? UUID().uuidString).png\"))\n                if FileManager.default.fileExists(atPath: temporaryURL.path) {\n                    return temporaryURL\n                }\n                let bitmap = NSBitmapImageRep(data: icon)\n                try bitmap?.representation(using: .png, properties: [:])?.write(to: temporaryURL)\n                return temporaryURL\n            }\n        } catch {\n        }\n        return nil\n    }\n\n    /// Looks up the application name of a process ID, if it has one.\n    /// - Parameter pid: The process ID to look up.\n    /// - Returns: The process's display name, if the process has one.\n    func appName(for pid: Int32) -> String? {\n        NSRunningApplication(processIdentifier: pid)?.localizedName\n    }\n\n}\n\n// from libproc.h\n@_silgen_name(\"proc_pidpath\")\n@discardableResult func proc_pidpath(_ pid: Int32, _ buffer: UnsafeMutableRawPointer!, _ buffersize: UInt32) -> Int32\n\n//// from SecTask.h\n@_silgen_name(\"SecCodeCreateWithPID\")\n@discardableResult func SecCodeCreateWithPID(_: Int32, _: SecCSFlags, _: UnsafeMutablePointer<Unmanaged<SecCode>?>!) -> OSStatus\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/SigningWitness.swift",
    "content": "import Foundation\nimport SecretKit\n\n/// A protocol that allows conformers to be notified of access to secrets, and optionally prevent access.\npublic protocol SigningWitness: Sendable {\n\n    /// A ridiculously named method that notifies the callee that a signing operation is about to be performed using a secret. The callee may `throw` an `Error` to prevent access from occurring.\n    /// - Parameters:\n    ///   - secret: The `Secret` that will be used to sign the request.\n    ///   - store: The `Store` being asked to sign the request..\n    ///   - provenance: A `SigningRequestProvenance` object describing the origin of the request.\n    ///   - Note: This method being called does not imply that the requst has been authorized. If a secret requires authentication, authentication will still need to be performed by the user before the request will be performed. If the user declines or fails to authenticate, the request will fail.\n    func speakNowOrForeverHoldYourPeace(forAccessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) async throws\n\n    /// Notifies the callee that a signing operation has been performed for a given secret.\n    /// - Parameters:\n    ///   - secret: The `Secret` that will was used to sign the request.\n    ///   - store: The `Store` that signed the request..\n    ///   - provenance: A `SigningRequestProvenance` object describing the origin of the request.\n    func witness(accessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) async throws\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretAgentKit/SocketController.swift",
    "content": "import Foundation\nimport OSLog\nimport SecretKit\n\n/// A controller that manages socket configuration and request dispatching.\npublic struct SocketController {\n\n    /// A stream of Sessions. Each session represents one connection to a class communicating with the socket. Multiple Sessions may be active simultaneously.\n    public let sessions: AsyncStream<Session>\n\n    /// A continuation to create new sessions.\n    private let sessionsContinuation: AsyncStream<Session>.Continuation\n\n    /// The active SocketPort. Must be retained to be kept valid.\n    private let port: SocketPort\n\n    /// The FileHandle for the main socket.\n    private let fileHandle: FileHandle\n    \n    /// Logger for the socket controller.\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"SocketController\")\n\n    /// Tracer which determines who originates a socket connection.\n    private let requestTracer = SigningRequestTracer()\n\n    /// Initializes a socket controller with a specified path.\n    /// - Parameter path: The path to use as a socket.\n    public init(path: String) {\n        (sessions, sessionsContinuation) = AsyncStream<Session>.makeStream()\n        logger.debug(\"Socket controller setting up at \\(path)\")\n        if let _ = try? FileManager.default.removeItem(atPath: path) {\n            logger.debug(\"Socket controller removed existing socket\")\n        }\n        let exists = FileManager.default.fileExists(atPath: path)\n        assert(!exists)\n        logger.debug(\"Socket controller path is clear\")\n        port = SocketPort(path: path)\n        fileHandle = FileHandle(fileDescriptor: port.socket, closeOnDealloc: true)\n        Task { @MainActor [fileHandle, sessionsContinuation, logger] in\n            // Create the sequence before triggering the notification to\n            // ensure it will not be missed.\n            let connectionAcceptedNotifications = NotificationCenter.default.notifications(named: .NSFileHandleConnectionAccepted)\n\n            fileHandle.acceptConnectionInBackgroundAndNotify()\n\n            for await notification in connectionAcceptedNotifications {\n                logger.debug(\"Socket controller accepted connection\")\n                guard let new = notification.userInfo?[NSFileHandleNotificationFileHandleItem] as? FileHandle else { continue }\n                let session = Session(fileHandle: new)\n                sessionsContinuation.yield(session)\n                fileHandle.acceptConnectionInBackgroundAndNotify()\n            }\n        }\n        logger.debug(\"Socket listening at \\(path)\")\n    }\n\n}\n\nextension SocketController {\n    \n    /// A session represents a connection that has been established between the two ends of the socket.\n    public struct Session: Sendable {\n        \n        /// Data received by the socket.\n        public let messages: AsyncStream<Data>\n\n        /// The provenance of the process that established the session.\n        public let provenance: SigningRequestProvenance\n        \n        /// A FileHandle used to communicate with the socket.\n        private let fileHandle: FileHandle\n\n        /// A continuation for issuing new messages.\n        private let messagesContinuation: AsyncStream<Data>.Continuation\n\n        /// A logger for the session.\n        private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"Session\")\n        \n        /// Initializes a new Session.\n        /// - Parameter fileHandle: The FileHandle used to communicate with the socket.\n        init(fileHandle: FileHandle) {\n            self.fileHandle = fileHandle\n            provenance = SigningRequestTracer().provenance(from: fileHandle)\n            (messages, messagesContinuation) = AsyncStream.makeStream()\n            Task { @MainActor [messagesContinuation, logger] in\n                // Create the sequence before triggering the notification to\n                // ensure it will not be missed.\n                let dataAvailableNotifications = NotificationCenter.default.notifications(named: .NSFileHandleDataAvailable, object: fileHandle)\n\n                fileHandle.waitForDataInBackgroundAndNotify()\n\n                for await _ in dataAvailableNotifications {\n                    let data = fileHandle.availableData\n                    guard !data.isEmpty else {\n                        logger.debug(\"Socket controller received empty data, ending continuation.\")\n                        messagesContinuation.finish()\n                        try fileHandle.close()\n                        return\n                    }\n                    messagesContinuation.yield(data)\n                    logger.debug(\"Socket controller yielded data.\")\n                }\n            }\n        }\n        \n        /// Writes new data to the socket.\n        /// - Parameter data: The data to write.\n        @MainActor public func write(_ data: Data) throws {\n          try fileHandle.write(contentsOf: data)\n          fileHandle.waitForDataInBackgroundAndNotify()\n        }\n        \n        /// Closes the socket and cleans up resources.\n        public func close() throws {\n            logger.debug(\"Session closed.\")\n            messagesContinuation.finish()\n            try fileHandle.close()\n        }\n\n    }\n\n}\n\nprivate extension SocketPort {\n\n    convenience init(path: String) {\n        var addr = sockaddr_un()\n\n        let length = unsafe withUnsafeMutablePointer(to: &addr.sun_path.0) { pointer in\n            unsafe path.withCString { cstring in\n                let len = unsafe strlen(cstring)\n                unsafe strncpy(pointer, cstring, len)\n                return len\n            }\n        }\n        // This doesn't seem to be _strictly_ neccessary with SocketPort.\n        // but just for good form.\n        addr.sun_family = sa_family_t(AF_UNIX)\n        // This mirrors the SUN_LEN macro format.\n        addr.sun_len = UInt8(MemoryLayout<sockaddr_un>.size - MemoryLayout.size(ofValue: addr.sun_path) + length)\n\n        let data = unsafe Data(bytes: &addr, count: MemoryLayout<sockaddr_un>.size)\n        self.init(protocolFamily: AF_UNIX, socketType: SOCK_STREAM, protocol: 0, address: data)!\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Convenience/PersistentAuthenticationHandler.swift",
    "content": "import LocalAuthentication\n\n/// A context describing a persisted authentication.\npackage final class PersistentAuthenticationContext<SecretType: Secret>: PersistedAuthenticationContext {\n\n    /// The Secret to persist authentication for.\n    let secret: SecretType\n    /// The LAContext used to authorize the persistent context.\n    package nonisolated(unsafe) let context: LAContext\n    /// An expiration date for the context.\n    /// - Note -  Monotonic time instead of Date() to prevent people setting the clock back.\n    let monotonicExpiration: UInt64\n\n    /// Initializes a context.\n    /// - Parameters:\n    ///   - secret: The Secret to persist authentication for.\n    ///   - context: The LAContext used to authorize the persistent context.\n    ///   - duration: The duration of the authorization context, in seconds.\n    init(secret: SecretType, context: LAContext, duration: TimeInterval) {\n        self.secret = secret\n        unsafe self.context = context\n        let durationInNanoSeconds = Measurement(value: duration, unit: UnitDuration.seconds).converted(to: .nanoseconds).value\n        self.monotonicExpiration = clock_gettime_nsec_np(CLOCK_MONOTONIC) + UInt64(durationInNanoSeconds)\n    }\n\n    /// A boolean describing whether or not the context is still valid.\n    package var valid: Bool {\n        clock_gettime_nsec_np(CLOCK_MONOTONIC) < monotonicExpiration\n    }\n\n    package var expiration: Date {\n        let remainingNanoseconds = monotonicExpiration - clock_gettime_nsec_np(CLOCK_MONOTONIC)\n        let remainingInSeconds = Measurement(value: Double(remainingNanoseconds), unit: UnitDuration.nanoseconds).converted(to: .seconds).value\n        return Date(timeIntervalSinceNow: remainingInSeconds)\n    }\n}\n\npackage actor PersistentAuthenticationHandler<SecretType: Secret>: Sendable {\n\n    private var persistedAuthenticationContexts: [SecretType: PersistentAuthenticationContext<SecretType>] = [:]\n\n    package init() {\n    }\n\n    package func existingPersistedAuthenticationContext(secret: SecretType) -> PersistentAuthenticationContext<SecretType>? {\n        guard let persisted = persistedAuthenticationContexts[secret], persisted.valid else { return nil }\n        return persisted\n    }\n\n    package func persistAuthentication(secret: SecretType, forDuration duration: TimeInterval) async throws {\n        let newContext = LAContext()\n        newContext.touchIDAuthenticationAllowableReuseDuration = duration\n        newContext.localizedCancelTitle = String(localized: .authContextRequestDenyButton)\n\n        let formatter = DateComponentsFormatter()\n        formatter.unitsStyle = .spellOut\n        formatter.allowedUnits = [.hour, .minute, .day]\n\n\n        let durationString = formatter.string(from: duration)!\n        newContext.localizedReason = String(localized: .authContextPersistForDuration(secretName: secret.name, duration: durationString))\n        let success = try await newContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: newContext.localizedReason)\n        guard success else { return }\n        let context = PersistentAuthenticationContext(secret: secret, context: newContext, duration: duration)\n        persistedAuthenticationContexts[secret] = context\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Documentation.docc/Documentation.md",
    "content": "# ``SecretKit``\n\nSecretKit is a collection of protocols describing secrets and stores.\n\n## Topics\n\n### Base Protocols\n\n- ``Secret``\n- ``SecretStore``\n- ``SecretStoreModifiable``\n\n### Store List\n\n- ``SecretStoreList``\n\n### Type Erasers\n\n- ``AnySecret``\n- ``AnySecretStore``\n- ``AnySecretStoreModifiable``\n\n### OpenSSH \n\n- ``OpenSSHPublicKeyWriter``\n- ``OpenSSHReader``\n\n### Signing Process\n\n- ``SigningRequestProvenance``\n\n### Authentication Persistence\n\n- ``PersistedAuthenticationContext``\n\n### Errors\n\n- ``KeychainError``\n- ``SigningError``\n- ``SecurityError``\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Erasers/AnySecret.swift",
    "content": "import Foundation\n\n/// Type eraser for Secret.\npublic struct AnySecret: Secret, @unchecked Sendable {\n\n    public let base: any Secret\n    private let _id: () -> AnyHashable\n    private let _name: () -> String\n    private let _publicKey: () -> Data\n    private let _attributes: () -> Attributes\n    private let _eq: (AnySecret) -> Bool\n\n    public init<T>(_ secret: T) where T: Secret {\n        if let secret = secret as? AnySecret {\n            base = secret.base\n            _id = secret._id\n            _name = secret._name\n            _publicKey = secret._publicKey\n            _attributes = secret._attributes\n            _eq = secret._eq\n        } else {\n            base = secret\n            _id = { secret.id as AnyHashable }\n            _name = { secret.name }\n            _publicKey = { secret.publicKey }\n            _attributes = { secret.attributes }\n            _eq = { secret == $0.base as? T }\n        }\n    }\n\n    public var id: AnyHashable {\n        _id()\n    }\n\n    public var name: String {\n        _name()\n    }\n\n    public var publicKey: Data {\n        _publicKey()\n    }\n    \n    public var attributes: Attributes {\n        _attributes()\n    }\n\n    public static func == (lhs: AnySecret, rhs: AnySecret) -> Bool {\n        lhs._eq(rhs)\n    }\n\n    public func hash(into hasher: inout Hasher) {\n        id.hash(into: &hasher)\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Erasers/AnySecretStore.swift",
    "content": "import Foundation\n\n/// Type eraser for SecretStore.\nopen class AnySecretStore: SecretStore, @unchecked Sendable {\n\n    let base: any SecretStore\n    private let _isAvailable: @MainActor @Sendable () -> Bool\n    private let _id: @Sendable () -> UUID\n    private let _name: @MainActor @Sendable () -> String\n    private let _secrets: @MainActor @Sendable () -> [AnySecret]\n    private let _sign: @Sendable (Data, AnySecret, SigningRequestProvenance) async throws -> Data\n    private let _existingPersistedAuthenticationContext: @Sendable (AnySecret) async -> PersistedAuthenticationContext?\n    private let _persistAuthentication: @Sendable (AnySecret, TimeInterval) async throws -> Void\n    private let _reloadSecrets: @Sendable () async -> Void\n\n    public init<SecretStoreType>(_ secretStore: SecretStoreType) where SecretStoreType: SecretStore {\n        base = secretStore\n        _isAvailable = { secretStore.isAvailable }\n        _name = { secretStore.name }\n        _id = { secretStore.id }\n        _secrets = { secretStore.secrets.map { AnySecret($0) } }\n        _sign = { try await secretStore.sign(data: $0, with: $1.base as! SecretStoreType.SecretType, for: $2) }\n        _existingPersistedAuthenticationContext = { await secretStore.existingPersistedAuthenticationContext(secret: $0.base as! SecretStoreType.SecretType) }\n        _persistAuthentication = { try await secretStore.persistAuthentication(secret: $0.base as! SecretStoreType.SecretType, forDuration: $1) }\n        _reloadSecrets = { await secretStore.reloadSecrets() }\n    }\n\n    @MainActor public var isAvailable: Bool {\n        return _isAvailable()\n    }\n\n    public var id: UUID {\n        return _id()\n    }\n\n    @MainActor public var name: String {\n        return _name()\n    }\n\n    @MainActor public var secrets: [AnySecret] {\n        return _secrets()\n    }\n\n    public func sign(data: Data, with secret: AnySecret, for provenance: SigningRequestProvenance) async throws -> Data {\n        try await _sign(data, secret, provenance)\n    }\n\n    public func existingPersistedAuthenticationContext(secret: AnySecret) async -> PersistedAuthenticationContext? {\n        await _existingPersistedAuthenticationContext(secret)\n    }\n\n    public func persistAuthentication(secret: AnySecret, forDuration duration: TimeInterval) async throws {\n        try await _persistAuthentication(secret, duration)\n    }\n\n    public func reloadSecrets() async {\n        await _reloadSecrets()\n    }\n\n}\n\npublic final class AnySecretStoreModifiable: AnySecretStore, SecretStoreModifiable, @unchecked Sendable {\n\n    private let _create: @Sendable (String, Attributes) async throws -> AnySecret\n    private let _delete: @Sendable (AnySecret) async throws -> Void\n    private let _update: @Sendable (AnySecret, String, Attributes) async throws -> Void\n    private let _supportedKeyTypes: @Sendable () -> KeyAvailability\n\n    public init<SecretStoreType>(_ secretStore: SecretStoreType) where SecretStoreType: SecretStoreModifiable {\n        _create = { AnySecret(try await secretStore.create(name: $0, attributes: $1)) }\n        _delete = { try await secretStore.delete(secret: $0.base as! SecretStoreType.SecretType) }\n        _update = { try await secretStore.update(secret: $0.base as! SecretStoreType.SecretType, name: $1, attributes: $2) }\n        _supportedKeyTypes = { secretStore.supportedKeyTypes }\n        super.init(secretStore)\n    }\n\n    @discardableResult\n    public func create(name: String, attributes: Attributes) async throws -> SecretType {\n        try await _create(name, attributes)\n    }\n\n    public func delete(secret: AnySecret) async throws {\n        try await _delete(secret)\n    }\n\n    public func update(secret: AnySecret, name: String, attributes: Attributes) async throws {\n        try await _update(secret, name, attributes)\n    }\n\n    public var supportedKeyTypes: KeyAvailability {\n        _supportedKeyTypes()\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/KeychainTypes.swift",
    "content": "import Foundation\n\npublic typealias SecurityError = Unmanaged<CFError>\n\n/// Wraps a Swift dictionary in a CFDictionary.\n/// - Parameter dictionary: The Swift dictionary to wrap.\n/// - Returns: A CFDictionary containing the keys and values.\npublic func KeychainDictionary(_ dictionary: [CFString: Any]) -> CFDictionary {\n    dictionary as CFDictionary\n}\n\npublic extension CFError {\n\n    /// The CFError returned when a verification operation fails.\n    static let verifyError = CFErrorCreate(nil, NSOSStatusErrorDomain as CFErrorDomain, CFIndex(errSecVerifyFailed), nil)!\n\n    /// Equality operation that only considers domain and code.\n    static func ~=(lhs: CFError, rhs: CFError) -> Bool {\n        CFErrorGetDomain(lhs) == CFErrorGetDomain(rhs) && CFErrorGetCode(lhs) == CFErrorGetCode(rhs)\n    }\n\n}\n\n/// A wrapper around an error code reported by a Keychain API.\npublic struct KeychainError: Error {\n    /// The status code involved, if one was reported.\n    public let statusCode: OSStatus?\n\n    /// Initializes a KeychainError with an optional error code.\n    /// - Parameter statusCode: The status code returned by the keychain operation, if one is applicable.\n    public init(statusCode: OSStatus?) {\n        self.statusCode = statusCode\n    }\n}\n\n/// A signing-related error.\npublic struct SigningError: Error {\n    /// The underlying error reported by the API, if one was returned.\n    public let error: CFError?\n\n    /// Initializes a SigningError with an optional SecurityError.\n    /// - Parameter statusCode: The SecurityError, if one is applicable.\n    public init(error: SecurityError?) {\n        self.error = unsafe error?.takeRetainedValue()\n    }\n\n}\n\npublic extension SecretStore {\n\n    /// Returns the appropriate keychian signature algorithm to use for a given secret.\n    /// - Parameters:\n    ///   - secret: The secret which will be used for signing.\n    /// - Returns: The appropriate algorithm.\n    func signatureAlgorithm(for secret: SecretType) -> SecKeyAlgorithm? {\n        switch secret.keyType {\n        case .ecdsa256:\n            .ecdsaSignatureMessageX962SHA256\n        case .ecdsa384:\n            .ecdsaSignatureMessageX962SHA384\n        case .rsa2048:\n            .rsaSignatureMessagePKCS1v15SHA512\n        default:\n            nil\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/SecretStoreList.swift",
    "content": "import Foundation\nimport Observation\n\n/// A \"Store Store,\" which holds a list of type-erased stores.\n@Observable @MainActor public final class SecretStoreList: Sendable {\n\n    /// The Stores managed by the SecretStoreList.\n    public var stores: [AnySecretStore] = []\n    /// A modifiable store, if one is available.\n    public var modifiableStore: AnySecretStoreModifiable? = nil\n\n    /// Initializes a SecretStoreList.\n    public nonisolated init() {\n    }\n\n    /// Adds a non-type-erased SecretStore to the list.\n    public func add<SecretStoreType: SecretStore>(store: SecretStoreType) {\n        stores.append(AnySecretStore(store))\n    }\n\n    /// Adds a non-type-erased modifiable SecretStore.\n    public func add<SecretStoreType: SecretStoreModifiable>(store: SecretStoreType) {\n        let modifiable = AnySecretStoreModifiable(store)\n        if modifiableStore == nil {\n            modifiableStore = modifiable\n        }\n        stores.append(modifiable)\n    }\n\n    /// A boolean describing whether there are any Stores available.\n    public var anyAvailable: Bool {\n        stores.contains(where: \\.isAvailable)\n    }\n\n    public var allSecrets: [AnySecret] {\n        stores.flatMap(\\.secrets)\n    }\n\n    public var allSecretsWithStores: [(AnySecret, AnySecretStore)] {\n        stores.flatMap { store in\n            store.secrets.map { secret in\n                (secret, store)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Types/CreationOptions.swift",
    "content": "import Foundation\n\npublic struct Attributes: Sendable, Codable, Hashable {\n    \n    /// The type of key involved.\n    public let keyType: KeyType\n\n    /// The authentication requirements for the key. This is simply a description of the option recorded at creation – modifying it doers not modify the key's authentication requirements.\n    public let authentication: AuthenticationRequirement\n    \n    /// The string appended to the end of the SSH Public Key.\n    /// If nil, a default value will be used.\n    public var publicKeyAttribution: String?\n\n    public init(\n        keyType: KeyType,\n        authentication: AuthenticationRequirement,\n        publicKeyAttribution: String? = nil\n    ) {\n        self.keyType = keyType\n        self.authentication = authentication\n        self.publicKeyAttribution = publicKeyAttribution\n    }\n\n    public struct UnsupportedOptionError: Error {\n        package init() {}\n    }\n    \n}\n\n/// The option specified\npublic enum AuthenticationRequirement: String, Hashable, Sendable, Codable, Identifiable {\n\n    /// Authentication is not required for usage.\n    case notRequired\n    \n    /// The user needs to authenticate, using either a biometric option, a connected authorized watch, or password entry..\n    case presenceRequired\n    \n    /// ONLY the current set of biometric data, as matching at time of creation, is accepted.\n    /// - Warning: This is a dangerous option prone to data loss. The user should be warned before configuring this key that if they modify their enrolled biometry INCLUDING by simply adding a new entry (ie, adding another fingeprting), the key will no longer be able to be accessed. This cannot be overridden with a password.\n    case biometryCurrent\n    \n    /// The authentication requirement was not recorded at creation, and is unknown.\n    case unknown\n    \n    /// Whether or not the key is known to require authentication.\n    public var required: Bool {\n        self == .presenceRequired || self == .biometryCurrent\n    }\n\n    public var id: AuthenticationRequirement {\n        self\n    }\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Types/PersistedAuthenticationContext.swift",
    "content": "import Foundation\n\n/// Protocol describing a persisted authentication context. This is an authorization that can be reused for multiple access to a secret that requires authentication for a specific period of time.\npublic protocol PersistedAuthenticationContext: Sendable {\n    /// Whether the context remains valid.\n    var valid: Bool { get }\n    /// The date at which the authorization expires and the context becomes invalid.\n    var expiration: Date { get }\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Types/Secret.swift",
    "content": "import Foundation\n\n/// The base protocol for describing a Secret\npublic protocol Secret: Identifiable, Hashable, Sendable {\n\n    /// A user-facing string identifying the Secret.\n    var name: String { get }\n    /// The public key data for the secret.\n    var publicKey: Data { get }\n    /// The attributes of the key.\n    var attributes: Attributes { get }\n\n}\n\npublic extension Secret {\n\n    /// The algorithm and key size this secret uses.\n    var keyType: KeyType {\n        attributes.keyType\n    }\n\n    /// Whether the secret requires authentication before use.\n    var authenticationRequirement: AuthenticationRequirement {\n        attributes.authentication\n    }\n    /// An attribution string to apply to the generated public key.\n    var publicKeyAttribution: String? {\n        attributes.publicKeyAttribution\n    }\n\n}\n\n/// The type of algorithm the Secret uses.\npublic struct KeyType: Hashable, Sendable, Codable, CustomStringConvertible {\n\n    public static let ecdsa256 = KeyType(algorithm: .ecdsa, size: 256)\n    public static let ecdsa384 = KeyType(algorithm: .ecdsa, size: 384)\n    public static let mldsa65 = KeyType(algorithm: .mldsa, size: 65)\n    public static let mldsa87 = KeyType(algorithm: .mldsa, size: 87)\n    public static let rsa2048 = KeyType(algorithm: .rsa, size: 2048)\n\n    public enum Algorithm: Hashable, Sendable, Codable {\n        case ecdsa\n        case mldsa\n        case rsa\n    }\n\n    public var algorithm: Algorithm\n    public var size: Int\n\n    public init(algorithm: Algorithm, size: Int) {\n        self.algorithm = algorithm\n        self.size = size\n    }\n\n    /// Initializes the Algorithm with a secAttr representation of an algorithm.\n    /// - Parameter secAttr: the secAttr, represented as an NSNumber.\n    public init?(secAttr: NSNumber, size: Int) {\n        let secAttrString = secAttr.stringValue as CFString\n        switch secAttrString {\n        case kSecAttrKeyTypeEC:\n            algorithm = .ecdsa\n        case kSecAttrKeyTypeRSA:\n            algorithm = .rsa\n        default:\n            return nil\n        }\n        self.size = size\n    }\n    \n    public var secAttrKeyType: CFString? {\n        switch algorithm {\n        case .ecdsa:\n            kSecAttrKeyTypeEC\n        case .rsa:\n            kSecAttrKeyTypeRSA\n        case .mldsa:\n            nil\n        }\n    }\n    \n    public var description: String {\n        \"\\(algorithm)-\\(size)\"\n    }\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Types/SecretStore.swift",
    "content": "import Foundation\n\n/// Manages access to Secrets, and performs signature operations on data using those Secrets.\npublic protocol SecretStore<SecretType>: Identifiable, Sendable {\n\n    associatedtype SecretType: Secret\n\n    /// A boolean indicating whether or not the store is available.\n    @MainActor var isAvailable: Bool { get }\n    /// A unique identifier for the store.\n    var id: UUID { get }\n    /// A user-facing name for the store.\n    @MainActor var name: String { get }\n    /// The secrets the store manages.\n    @MainActor var secrets: [SecretType] { get }\n\n    /// Signs a data payload with a specified Secret.\n    /// - Parameters:\n    ///   - data: The data to sign.\n    ///   - secret: The ``Secret`` to sign with.\n    ///   - provenance: A ``SigningRequestProvenance`` describing where the request came from.\n    /// - Returns: The signed data.\n    func sign(data: Data, with secret: SecretType, for provenance: SigningRequestProvenance) async throws -> Data\n\n    /// Checks to see if there is currently a valid persisted authentication for a given secret.\n    /// - Parameters:\n    ///   - secret: The ``Secret`` to check if there is a persisted authentication for.\n    /// - Returns: A persisted authentication context, if a valid one exists.\n    func existingPersistedAuthenticationContext(secret: SecretType) async -> PersistedAuthenticationContext?\n\n    /// Persists user authorization for access to a secret.\n    /// - Parameters:\n    ///   - secret: The ``Secret`` to persist the authorization for.\n    ///   - duration: The duration that the authorization should persist for.\n    ///  - Note: This is used for temporarily unlocking access to a secret which would otherwise require authentication every single use. This is useful for situations where the user anticipates several rapid accesses to a authorization-guarded secret.\n    func persistAuthentication(secret: SecretType, forDuration duration: TimeInterval) async throws\n\n    /// Requests that the store reload secrets from any backing store, if neccessary.\n    func reloadSecrets() async\n\n}\n\n/// A SecretStore that the Secretive admin app can modify.\npublic protocol SecretStoreModifiable<SecretType>: SecretStore {\n\n    /// Creates a new ``Secret`` in the store.\n    /// - Parameters:\n    ///   - name: The user-facing name for the ``Secret``.\n    ///   - attributes: A struct describing the options for creating the key.'\n    @discardableResult\n    func create(name: String, attributes: Attributes) async throws -> SecretType\n\n    /// Deletes a Secret in the store.\n    /// - Parameters:\n    ///   - secret: The ``Secret`` to delete.\n    func delete(secret: SecretType) async throws\n\n    /// Updates the name of a Secret in the store.\n    /// - Parameters:\n    ///   - secret: The ``Secret`` to update.\n    ///   - name: The new name for the Secret.\n    ///   - attributes: The new attributes for the secret.\n    func update(secret: SecretType, name: String, attributes: Attributes) async throws\n\n    var supportedKeyTypes: KeyAvailability { get }\n\n}\n\npublic struct KeyAvailability: Sendable {\n\n    public let available: [KeyType]\n    public let unavailable: [UnavailableKeyType]\n\n    public init(available: [KeyType], unavailable: [UnavailableKeyType]) {\n        self.available = available\n        self.unavailable = unavailable\n    }\n\n    public struct UnavailableKeyType: Sendable {\n        public let keyType: KeyType\n        public let reason: Reason\n\n        public init(keyType: KeyType, reason: Reason) {\n            self.keyType = keyType\n            self.reason = reason\n        }\n\n        public enum Reason: Sendable {\n            case macOSUpdateRequired\n        }\n    }\n\n}\n\n\nextension NSNotification.Name {\n\n    // Distributed notification that keys were modified out of process (ie, that the management tool added/removed secrets)\n    public static let secretStoreUpdated = NSNotification.Name(\"com.maxgoedjen.Secretive.secretStore.updated\")\n    // Internal notification that keys were reloaded from the backing store.\n    public static let secretStoreReloaded = NSNotification.Name(\"com.maxgoedjen.Secretive.secretStore.reloaded\")\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecretKit/Types/SigningRequestProvenance.swift",
    "content": "import Foundation\nimport AppKit\n\n/// Describes the chain of applications that requested a signature operation.\npublic struct SigningRequestProvenance: Equatable, Sendable {\n\n    /// A list of processes involved in the request.\n    /// - Note: A chain will typically consist of many elements even for a simple request. For example, running `git fetch` in Terminal.app would generate a request chain of `ssh` -> `git` -> `zsh` -> `login` -> `Terminal.app`\n    public var chain: [Process]\n    public init(root: Process) {\n        self.chain = [root]\n    }\n\n}\n\nextension SigningRequestProvenance {\n\n    /// The `Process` which initiated the signing request.\n    public var origin: Process {\n        chain.last!\n    }\n\n    /// A boolean describing whether all processes in the request chain had a valid code signature.\n    public var intact: Bool {\n        chain.allSatisfy { $0.validSignature }\n    }\n\n}\n\nextension SigningRequestProvenance {\n\n    /// Describes a process in a `SigningRequestProvenance` chain.\n    public struct Process: Equatable, Sendable {\n\n        /// The pid of the process.\n        public let pid: Int32\n        /// A user-facing name for the process.\n        public let processName: String\n        /// A user-facing name for the application, if one exists.\n        public let appName: String?\n        /// An icon representation of the application, if one exists.\n        public let iconURL: URL?\n        /// The path the process exists at.\n        public let path: String\n        /// A boolean describing whether or not the process has a valid code signature.\n        public let validSignature: Bool\n        /// The pid of the process's parent.\n        public let parentPID: Int32?\n\n        /// Initializes a Process.\n        /// - Parameters:\n        ///   - pid: The pid of the process.\n        ///   - processName: A user-facing name for the process.\n        ///   - appName: A user-facing name for the application, if one exists.\n        ///   - iconURL: An icon representation of the application, if one exists.\n        ///   - path: The path the process exists at.\n        ///   - validSignature: A boolean describing whether or not the process has a valid code signature.\n        ///   - parentPID: The pid of the process's parent.\n        public init(pid: Int32, processName: String, appName: String?, iconURL: URL?, path: String, validSignature: Bool, parentPID: Int32?) {\n            self.pid = pid\n            self.processName = processName\n            self.appName = appName\n            self.iconURL = iconURL\n            self.path = path\n            self.validSignature = validSignature\n            self.parentPID = parentPID\n        }\n\n        /// The best user-facing name to display for the process.\n        public var displayName: String {\n            appName ?? processName\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecureEnclaveSecretKit/CryptoKitMigrator.swift",
    "content": "import Foundation\nimport Security\nimport CryptoTokenKit\nimport CryptoKit\nimport SecretKit\nimport os\n\nextension SecureEnclave {\n\n    public struct CryptoKitMigrator {\n\n        private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.migration\", category: \"CryptoKitMigrator\")\n\n        public init() {\n        }\n        \n        /// Keys prior to 3.0 were created and stored directly using the keychain as kSecClassKey items. CryptoKit operates a little differently, in that it creates a key on your behalf which you can persist using an opaque data blob to a generic keychain item. Keychain created keys _also_ use this blob under the hood, but it's stored in the \"toid\" attribute. This migrates the old keys from kSecClassKey to generic items, copying the \"toid\" to be the main stored data. If the key is migrated successfully, the old key's identifier is renamed to indicate it's been migrated.\n        /// - Note: Migration is non-destructive – users can still see and use their keys in older versions of Secretive.\n        @MainActor public func migrate(to store: Store) throws {\n            let privateAttributes = KeychainDictionary([\n                kSecClass: kSecClassKey,\n                kSecAttrKeyType: Constants.oldKeyType,\n                kSecAttrApplicationTag: SecureEnclave.Store.Constants.keyTag,\n                kSecAttrKeyClass: kSecAttrKeyClassPrivate,\n                kSecReturnRef: true,\n                kSecMatchLimit: kSecMatchLimitAll,\n                kSecReturnAttributes: true\n            ])\n            var privateUntyped: CFTypeRef?\n            unsafe SecItemCopyMatching(privateAttributes, &privateUntyped)\n            guard let privateTyped = privateUntyped as? [[CFString: Any]] else { return }\n            let migratedPublicKeys = Set(store.secrets.map(\\.publicKey))\n            var migratedAny = false\n            for key in privateTyped {\n                let name = key[kSecAttrLabel] as? String ?? String(localized: .unnamedSecret)\n                let id = key[kSecAttrApplicationLabel] as! Data\n                guard !id.contains(Constants.migrationMagicNumber) else {\n                    logger.log(\"Skipping \\(name), already migrated.\")\n                    continue\n                }\n                let ref = key[kSecValueRef] as! SecKey\n                let attributes = SecKeyCopyAttributes(ref) as! [CFString: Any]\n                let tokenObjectID = unsafe attributes[Constants.tokenObjectID] as! Data\n                let accessControl = attributes[kSecAttrAccessControl] as! SecAccessControl\n                // Best guess.\n                let auth: AuthenticationRequirement = String(describing: accessControl)\n                    .contains(\"DeviceOwnerAuthentication\") ? .presenceRequired : .unknown\n                do {\n                    let parsed = try CryptoKit.SecureEnclave.P256.Signing.PrivateKey(dataRepresentation: tokenObjectID)\n                    let secret = Secret(id: UUID().uuidString, name: name, publicKey: parsed.publicKey.x963Representation, attributes: Attributes(keyType: .init(algorithm: .ecdsa, size: 256), authentication: auth))\n                    guard !migratedPublicKeys.contains(parsed.publicKey.x963Representation) else {\n                        logger.log(\"Skipping \\(name), public key already present. Marking as migrated.\")\n                        markMigrated(secret: secret, oldID: id)\n                        continue\n                    }\n                    logger.log(\"Migrating \\(name).\")\n                    try store.saveKey(tokenObjectID, name: name, attributes: secret.attributes)\n                    logger.log(\"Migrated \\(name).\")\n                    markMigrated(secret: secret, oldID: id)\n                    migratedAny = true\n                } catch {\n                    logger.error(\"Failed to migrate \\(name): \\(error.localizedDescription).\")\n                }\n            }\n            if migratedAny {\n                store.reloadSecrets()\n            }\n        }\n\n\n\n        public func markMigrated(secret: Secret, oldID: Data) {\n            let updateQuery = KeychainDictionary([\n                kSecClass: kSecClassKey,\n                kSecAttrApplicationLabel: oldID\n            ])\n\n            let newID = oldID + Constants.migrationMagicNumber\n            let updatedAttributes = KeychainDictionary([\n                kSecAttrApplicationLabel: newID as CFData\n            ])\n\n            let status = SecItemUpdate(updateQuery, updatedAttributes)\n            if status != errSecSuccess {\n                logger.warning(\"Failed to mark \\(secret.name) as migrated: \\(status).\")\n            }\n        }\n\n\n    }\n\n}\n\nextension SecureEnclave.CryptoKitMigrator {\n\n    enum Constants {\n        public static let oldKeyType = kSecAttrKeyTypeECSECPrimeRandom as String\n        public static let migrationMagicNumber = Data(\"_cryptokit_1\".utf8)\n        // https://github.com/apple-opensource/Security/blob/5e9101b3bd1fb096bae4f40e79d50426ba1db8e9/OSX/sec/Security/SecItemConstants.c#L111\n        public static nonisolated(unsafe) let tokenObjectID = \"toid\" as CFString\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecureEnclaveSecretKit/Documentation.docc/Documentation.md",
    "content": "# ``SecureEnclaveSecretKit``\n\nSecureEnclaveSecretKit contains implementations of SecretKit protocols backed by the Secure Enclave.\n"
  },
  {
    "path": "Sources/Packages/Sources/SecureEnclaveSecretKit/Documentation.docc/SecureEnclave.md",
    "content": "# ``SecureEnclaveSecretKit/SecureEnclave``\n\n## Topics\n\n### Implementations\n\n- ``Secret``\n- ``Store``\n\n### Errors\n\n- ``KeychainError``\n- ``SigningError``\n- ``SecurityError``\n"
  },
  {
    "path": "Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclave.swift",
    "content": "/// Namespace for the Secure Enclave implementations.\npublic enum SecureEnclave {}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclaveSecret.swift",
    "content": "import Foundation\nimport SecretKit\n\nextension SecureEnclave {\n\n    /// An implementation of Secret backed by the Secure Enclave.\n    public struct Secret: SecretKit.Secret {\n\n        public let id: String\n        public let name: String\n        public let publicKey: Data\n        public let attributes: Attributes\n\n        init(\n            id: String,\n            name: String,\n            publicKey: Data,\n            attributes: Attributes\n        ) {\n            self.id = id\n            self.name = name\n            self.publicKey = publicKey\n            self.attributes = attributes\n        }\n\n        public static func ==(lhs: Self, rhs: Self) -> Bool {\n            lhs.id == rhs.id\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SecureEnclaveSecretKit/SecureEnclaveStore.swift",
    "content": "import Foundation\nimport Observation\nimport Security\nimport CryptoKit\nimport LocalAuthentication\nimport SecretKit\nimport os\n\nextension SecureEnclave {\n\n    /// An implementation of Store backed by the Secure Enclave using CryptoKit API.\n    @Observable public final class Store: SecretStoreModifiable {\n\n        @MainActor public var secrets: [Secret] = []\n        public var isAvailable: Bool {\n            CryptoKit.SecureEnclave.isAvailable\n        }\n        public let id = UUID()\n        public let name = String(localized: .secureEnclave)\n        private let persistentAuthenticationHandler = PersistentAuthenticationHandler<Secret>()\n\n        /// Initializes a Store.\n        @MainActor public init() {\n            loadSecrets()\n            Task {\n                for await note in DistributedNotificationCenter.default().notifications(named: .secretStoreUpdated) {\n                    guard Constants.notificationToken != (note.object as? String) else {\n                        // Don't reload if we're the ones triggering this by reloading.\n                        continue\n                    }\n                    reloadSecrets()\n                }\n            }\n        }\n\n        // MARK: - Public API\n        \n        // MARK: SecretStore\n        \n        public func sign(data: Data, with secret: Secret, for provenance: SigningRequestProvenance) async throws -> Data {\n            var context: LAContext\n            if let existing = await persistentAuthenticationHandler.existingPersistedAuthenticationContext(secret: secret) {\n                context = unsafe existing.context\n            } else {\n                let newContext = LAContext()\n                newContext.localizedReason = String(localized: .authContextRequestSignatureDescription(appName: provenance.origin.displayName, secretName: secret.name))\n                newContext.localizedCancelTitle = String(localized: .authContextRequestDenyButton)\n                context = newContext\n            }\n\n            let queryAttributes = KeychainDictionary([\n                kSecClass: Constants.keyClass,\n                kSecAttrService: Constants.keyTag,\n                kSecUseDataProtectionKeychain: true,\n                kSecAttrAccount: secret.id,\n                kSecReturnAttributes: true,\n                kSecReturnData: true,\n            ])\n            var untyped: CFTypeRef?\n            let status = unsafe SecItemCopyMatching(queryAttributes, &untyped)\n            if status != errSecSuccess {\n                throw KeychainError(statusCode: status)\n            }\n            guard let untypedSafe = untyped as? [CFString: Any] else {\n                throw KeychainError(statusCode: errSecSuccess)\n            }\n            guard let attributesData = untypedSafe[kSecAttrGeneric] as? Data,\n                  let keyData = untypedSafe[kSecValueData] as? Data else {\n                throw MissingAttributesError()\n            }\n            let attributes = try JSONDecoder().decode(Attributes.self, from: attributesData)\n\n            switch attributes.keyType {\n            case .ecdsa256:\n                let key = try CryptoKit.SecureEnclave.P256.Signing.PrivateKey(dataRepresentation: keyData, authenticationContext: context)\n                return try key.signature(for: data).rawRepresentation\n            case .mldsa65:\n                guard #available(macOS 26.0, *)  else { throw UnsupportedAlgorithmError() }\n                let key = try CryptoKit.SecureEnclave.MLDSA65.PrivateKey(dataRepresentation: keyData, authenticationContext: context)\n                return try key.signature(for: data)\n            case .mldsa87:\n                guard #available(macOS 26.0, *)  else { throw UnsupportedAlgorithmError() }\n                let key = try CryptoKit.SecureEnclave.MLDSA87.PrivateKey(dataRepresentation: keyData, authenticationContext: context)\n                return try key.signature(for: data)\n            default:\n                throw UnsupportedAlgorithmError()\n            }\n\n        }\n\n        public func existingPersistedAuthenticationContext(secret: Secret) async -> PersistedAuthenticationContext? {\n            await persistentAuthenticationHandler.existingPersistedAuthenticationContext(secret: secret)\n        }\n\n        public func persistAuthentication(secret: Secret, forDuration duration: TimeInterval) async throws {\n            try await persistentAuthenticationHandler.persistAuthentication(secret: secret, forDuration: duration)\n        }\n\n        @MainActor public func reloadSecrets() {\n            let before = secrets\n            secrets.removeAll()\n            loadSecrets()\n            if secrets != before {\n                NotificationCenter.default.post(name: .secretStoreReloaded, object: self)\n                DistributedNotificationCenter.default().postNotificationName(.secretStoreUpdated, object: Constants.notificationToken, deliverImmediately: true)\n            }\n        }\n\n        // MARK: SecretStoreModifiable\n        \n        public func create(name: String, attributes: Attributes) async throws -> Secret {\n            var accessError: SecurityError?\n            let flags: SecAccessControlCreateFlags = switch attributes.authentication {\n            case .notRequired:\n                [.privateKeyUsage]\n            case .presenceRequired:\n                [.userPresence, .privateKeyUsage]\n            case .biometryCurrent:\n                [.biometryCurrentSet, .privateKeyUsage]\n            case .unknown:\n                fatalError()\n            }\n            let access =\n            unsafe SecAccessControlCreateWithFlags(kCFAllocatorDefault,\n                                                kSecAttrAccessibleWhenUnlockedThisDeviceOnly,\n                                                flags,\n                                                &accessError)\n            if let error = unsafe accessError {\n                throw unsafe error.takeRetainedValue() as Error\n            }\n            let dataRep: Data\n            let publicKey: Data\n            switch attributes.keyType {\n            case .ecdsa256:\n                let created = try CryptoKit.SecureEnclave.P256.Signing.PrivateKey(accessControl: access!)\n                dataRep = created.dataRepresentation\n                publicKey = created.publicKey.x963Representation\n            case .mldsa65:\n                guard #available(macOS 26.0, *) else { throw Attributes.UnsupportedOptionError() }\n                let created = try CryptoKit.SecureEnclave.MLDSA65.PrivateKey(accessControl: access!)\n                dataRep = created.dataRepresentation\n                publicKey = created.publicKey.rawRepresentation\n            case .mldsa87:\n                guard #available(macOS 26.0, *) else { throw Attributes.UnsupportedOptionError() }\n                let created = try CryptoKit.SecureEnclave.MLDSA87.PrivateKey(accessControl: access!)\n                dataRep = created.dataRepresentation\n                publicKey = created.publicKey.rawRepresentation\n            default:\n                throw Attributes.UnsupportedOptionError()\n            }\n            let id = try saveKey(dataRep, name: name, attributes: attributes)\n            await reloadSecrets()\n            return Secret(id: id, name: name, publicKey: publicKey, attributes: attributes)\n        }\n\n        public func delete(secret: Secret) async throws {\n            let deleteAttributes = KeychainDictionary([\n                kSecClass: Constants.keyClass,\n                kSecAttrService: Constants.keyTag,\n                kSecUseDataProtectionKeychain: true,\n                kSecAttrAccount: secret.id,\n            ])\n            let status = SecItemDelete(deleteAttributes)\n            if status != errSecSuccess {\n                throw KeychainError(statusCode: status)\n            }\n            await reloadSecrets()\n        }\n\n        public func update(secret: Secret, name: String, attributes: Attributes) async throws {\n            let updateQuery = KeychainDictionary([\n                kSecClass: Constants.keyClass,\n                kSecAttrAccount: secret.id,\n            ])\n\n            let attributes = try JSONEncoder().encode(attributes)\n            let updatedAttributes = KeychainDictionary([\n                kSecAttrLabel: name,\n                kSecAttrGeneric: attributes,\n            ])\n\n            let status = SecItemUpdate(updateQuery, updatedAttributes)\n            if status != errSecSuccess {\n                throw KeychainError(statusCode: status)\n            }\n            await reloadSecrets()\n        }\n        \n        public let supportedKeyTypes: KeyAvailability = {\n            let macOS26Keys: [KeyType] = [.mldsa65, .mldsa87]\n            let isAtLeastMacOS26 = if #available(macOS 26, *) {\n                true\n            } else {\n                false\n            }\n            return KeyAvailability(\n                available: [\n                    .ecdsa256,\n                ] + (isAtLeastMacOS26 ? macOS26Keys : []),\n                unavailable: (isAtLeastMacOS26 ? [] : macOS26Keys).map {\n                    KeyAvailability.UnavailableKeyType(keyType: $0, reason: .macOSUpdateRequired)\n                }\n            )\n        }()\n    }\n\n}\n\nextension SecureEnclave.Store {\n\n    /// Loads all secrets from the store.\n    @MainActor private func loadSecrets() {\n        let queryAttributes = KeychainDictionary([\n            kSecClass: Constants.keyClass,\n            kSecAttrService: Constants.keyTag,\n            kSecUseDataProtectionKeychain: true,\n            kSecReturnData: true,\n            kSecMatchLimit: kSecMatchLimitAll,\n            kSecReturnAttributes: true\n            ])\n        var untyped: CFTypeRef?\n        unsafe SecItemCopyMatching(queryAttributes, &untyped)\n        guard let typed = untyped as? [[CFString: Any]] else { return }\n        let wrapped: [SecureEnclave.Secret] = typed.compactMap {\n            do {\n                let name = $0[kSecAttrLabel] as? String ?? String(localized: \"unnamed_secret\")\n                guard let attributesData = $0[kSecAttrGeneric] as? Data,\n                let id = $0[kSecAttrAccount] as? String else {\n                    throw MissingAttributesError()\n                }\n                let attributes = try JSONDecoder().decode(Attributes.self, from: attributesData)\n                let keyData = $0[kSecValueData] as! Data\n                let publicKey: Data\n                switch attributes.keyType {\n                case .ecdsa256:\n                    let key = try CryptoKit.SecureEnclave.P256.Signing.PrivateKey(dataRepresentation: keyData)\n                    publicKey = key.publicKey.x963Representation\n                case .mldsa65:\n                    guard #available(macOS 26.0, *)  else { throw UnsupportedAlgorithmError() }\n                    let key = try CryptoKit.SecureEnclave.MLDSA65.PrivateKey(dataRepresentation: keyData)\n                    publicKey = key.publicKey.rawRepresentation\n                case .mldsa87:\n                    guard #available(macOS 26.0, *)  else { throw UnsupportedAlgorithmError() }\n                    let key = try CryptoKit.SecureEnclave.MLDSA87.PrivateKey(dataRepresentation: keyData)\n                    publicKey = key.publicKey.rawRepresentation\n                default:\n                    throw UnsupportedAlgorithmError()\n                }\n                return SecureEnclave.Secret(id: id, name: name, publicKey: publicKey, attributes: attributes)\n            } catch {\n                return nil\n            }\n        }\n        secrets.append(contentsOf: wrapped)\n    }\n\n    /// Saves a public key.\n    /// - Parameters:\n    ///   - key: The data representation key to save.\n    ///   - name: A user-facing name for the key.\n    ///   - attributes: Attributes of the key.\n    /// - Note: Despite the name, the \"Data\" of the key is _not_ actual key material. This is an opaque data representation that the SEP can manipulate.\n    @discardableResult\n    func saveKey(_ key: Data, name: String, attributes: Attributes) throws -> String {\n        let attributes = try JSONEncoder().encode(attributes)\n        let id = UUID().uuidString\n        let keychainAttributes = KeychainDictionary([\n            kSecClass: Constants.keyClass,\n            kSecAttrService: Constants.keyTag,\n            kSecUseDataProtectionKeychain: true,\n            kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,\n            kSecAttrAccount: id,\n            kSecValueData: key,\n            kSecAttrLabel: name,\n            kSecAttrGeneric: attributes\n        ])\n        let status = SecItemAdd(keychainAttributes, nil)\n        if status != errSecSuccess {\n            throw KeychainError(statusCode: status)\n        }\n        return id\n    }\n    \n}\n\nextension SecureEnclave.Store {\n\n    enum Constants {\n        static let keyClass = kSecClassGenericPassword as String\n        static let keyTag = Data(\"com.maxgoedjen.secretive.secureenclave.key\".utf8)\n        static let notificationToken = UUID().uuidString\n    }\n    \n    struct UnsupportedAlgorithmError: Error {}\n    struct MissingAttributesError: Error {}\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SmartCardSecretKit/Documentation.docc/Documentation.md",
    "content": "# ``SmartCardSecretKit``\n\nSmartCardSecretKit contains implementations of SecretKit protocols backed by a Smart Card.\n"
  },
  {
    "path": "Sources/Packages/Sources/SmartCardSecretKit/Documentation.docc/SmartCard.md",
    "content": "# ``SmartCardSecretKit/SmartCard``\n\n## Topics\n\n### Implementations\n\n- ``Secret``\n- ``Store``\n"
  },
  {
    "path": "Sources/Packages/Sources/SmartCardSecretKit/SmartCard.swift",
    "content": "/// Namespace for the Smart Card implementations.\npublic enum SmartCard {}\n"
  },
  {
    "path": "Sources/Packages/Sources/SmartCardSecretKit/SmartCardSecret.swift",
    "content": "import Foundation\nimport SecretKit\n\nextension SmartCard {\n\n    /// An implementation of Secret backed by a Smart Card.\n    public struct Secret: SecretKit.Secret {\n\n        public let id: Data\n        public let name: String\n        public let publicKey: Data\n        public var attributes: Attributes\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/SmartCardSecretKit/SmartCardStore.swift",
    "content": "import Foundation\nimport Observation\nimport Security\n@unsafe @preconcurrency import CryptoTokenKit\nimport LocalAuthentication\nimport SecretKit\n\nextension SmartCard {\n    \n    @MainActor @Observable fileprivate final class State {\n        var isAvailable = false\n        var name = String(localized: .smartCard)\n        var secrets: [Secret] = []\n        let watcher = TKTokenWatcher()\n        var tokenID: String? = nil\n        nonisolated init() {}\n    }\n\n    /// An implementation of Store backed by a Smart Card.\n    @Observable public final class Store: SecretStore {\n\n        private let state = State()\n        public var isAvailable: Bool {\n            state.isAvailable\n        }\n        @MainActor public var smartcardTokenID: String? {\n            state.tokenID\n        }\n\n        public let id = UUID()\n        @MainActor public var name: String {\n            state.name\n        }\n        public var secrets: [Secret] {\n            state.secrets\n        }\n        private let persistentAuthenticationHandler = PersistentAuthenticationHandler<Secret>()\n\n        /// Initializes a Store.\n        public init() {\n            Task {\n                await MainActor.run {\n                    if let tokenID = smartcardTokenID {\n                        state.isAvailable = true\n                        state.watcher.addRemovalHandler(self.smartcardRemoved, forTokenID: tokenID)\n                    }\n                    loadSecrets()\n                }\n                // Doing this inside a regular mainactor handler casues thread assertions in CryptoTokenKit to blow up when the handler executes.\n                await state.watcher.setInsertionHandler { id in\n                    Task {\n                        await self.smartcardInserted(for: id)\n                    }\n                }\n            }\n        }\n\n        // MARK: Public API\n\n        public func sign(data: Data, with secret: Secret, for provenance: SigningRequestProvenance) async throws -> Data {\n            guard let tokenID = await state.tokenID else { fatalError() }\n            var context: LAContext\n            if let existing = await persistentAuthenticationHandler.existingPersistedAuthenticationContext(secret: secret) {\n                context = unsafe existing.context\n            } else {\n                let newContext = LAContext()\n                newContext.localizedReason = String(localized: .authContextRequestSignatureDescription(appName: provenance.origin.displayName, secretName: secret.name))\n                newContext.localizedCancelTitle = String(localized: .authContextRequestDenyButton)\n                context = newContext\n            }\n            let attributes = KeychainDictionary([\n                kSecClass: kSecClassKey,\n                kSecAttrKeyClass: kSecAttrKeyClassPrivate,\n                kSecAttrApplicationLabel: secret.id as CFData,\n                kSecAttrTokenID: tokenID,\n                kSecUseAuthenticationContext: context,\n                kSecReturnRef: true\n            ])\n            var untyped: CFTypeRef?\n            let status = unsafe SecItemCopyMatching(attributes, &untyped)\n            if status != errSecSuccess {\n                throw KeychainError(statusCode: status)\n            }\n            guard let untypedSafe = untyped else {\n                throw KeychainError(statusCode: errSecSuccess)\n            }\n            let key = untypedSafe as! SecKey\n            var signError: SecurityError?\n            guard let algorithm = signatureAlgorithm(for: secret) else { throw UnsupportKeyType() }\n            guard let signature = unsafe SecKeyCreateSignature(key, algorithm, data as CFData, &signError) else {\n                throw unsafe SigningError(error: signError)\n            }\n            return signature as Data\n        }\n        \n        public func existingPersistedAuthenticationContext(secret: Secret) async -> PersistedAuthenticationContext? {\n            await persistentAuthenticationHandler.existingPersistedAuthenticationContext(secret: secret)\n        }\n\n        public func persistAuthentication(secret: Secret, forDuration duration: TimeInterval) async throws {\n            try await persistentAuthenticationHandler.persistAuthentication(secret: secret, forDuration: duration)\n        }\n\n        /// Reloads all secrets from the store.\n        @MainActor public func reloadSecrets() {\n            reloadSecretsInternal()\n        }\n\n    }\n\n}\n\nextension SmartCard.Store {\n\n    @MainActor private func reloadSecretsInternal() {\n        let before = state.secrets\n        state.isAvailable = state.tokenID != nil\n        state.secrets.removeAll()\n        loadSecrets()\n        if self.secrets != before {\n            NotificationCenter.default.post(name: .secretStoreReloaded, object: self)\n        }\n    }\n\n    /// Resets the token ID and reloads secrets.\n    /// - Parameter tokenID: The ID of the token that was inserted.\n    @MainActor private func smartcardInserted(for tokenID: String? = nil) {\n        guard let string = state.watcher.nonSecureEnclaveTokens.first else { return }\n        guard state.tokenID == nil else { return }\n        guard !string.contains(\"setoken\") else { return }\n        state.tokenID = string\n        state.watcher.addRemovalHandler(self.smartcardRemoved, forTokenID: string)\n        state.tokenID = string\n        reloadSecretsInternal()\n    }\n\n    /// Resets the token ID and reloads secrets.\n    /// - Parameter tokenID: The ID of the token that was removed.\n    @MainActor private func smartcardRemoved(for tokenID: String? = nil) {\n        state.tokenID = nil\n        reloadSecrets()\n    }\n\n    /// Loads all secrets from the store.\n    @MainActor private func loadSecrets() {\n        guard let tokenID = state.tokenID  else { return }\n\n        let fallbackName = String(localized: .smartCard)\n        if let driverName = state.watcher.tokenInfo(forTokenID: tokenID)?.driverName  {\n            state.name = driverName\n        } else {\n            state.name = fallbackName\n        }\n\n        let attributes = KeychainDictionary([\n            kSecClass: kSecClassKey,\n            kSecAttrTokenID: tokenID,\n            kSecReturnRef: true,\n            kSecMatchLimit: kSecMatchLimitAll,\n            kSecReturnAttributes: true\n        ])\n        var untyped: CFTypeRef?\n        unsafe SecItemCopyMatching(attributes, &untyped)\n        guard let typed = untyped as? [[CFString: Any]] else { return }\n        let wrapped: [SecretType] = typed.compactMap {\n            let name = $0[kSecAttrLabel] as? String ?? String(localized: .unnamedSecret)\n            let tokenID = $0[kSecAttrApplicationLabel] as! Data\n            let algorithmSecAttr = $0[kSecAttrKeyType] as! NSNumber\n            let keySize = $0[kSecAttrKeySizeInBits] as! Int\n            let publicKeyRef = $0[kSecValueRef] as! SecKey\n            let publicKeySecRef = SecKeyCopyPublicKey(publicKeyRef)!\n            let publicKeyAttributes = SecKeyCopyAttributes(publicKeySecRef) as! [CFString: Any]\n            let publicKey = publicKeyAttributes[kSecValueData] as! Data\n            let attributes = Attributes(keyType: KeyType(secAttr: algorithmSecAttr, size: keySize)!, authentication: .presenceRequired)\n            let secret = SmartCard.Secret(id: tokenID, name: name, publicKey: publicKey, attributes: attributes)\n            guard signatureAlgorithm(for: secret) != nil else { return nil }\n            return secret\n        }\n        state.secrets.append(contentsOf: wrapped)\n    }\n\n}\n\nextension TKTokenWatcher {\n\n    /// All available tokens, excluding the Secure Enclave.\n    fileprivate var nonSecureEnclaveTokens: [String] {\n        tokenIDs.filter { !$0.contains(\"setoken\") }\n    }\n\n}\n\nextension SmartCard {\n\n    public struct UnsupportKeyType: Error {}\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/XPCWrappers/TeamID.swift",
    "content": "import Foundation\n\nextension ProcessInfo {\n    private static let fallbackTeamID = \"Z72PRUAWF6\"\n\n    private static let teamID: String = {\n        #if DEBUG\n        guard let task = SecTaskCreateFromSelf(nil) else {\n            assertionFailure(\"SecTaskCreateFromSelf failed\")\n            return fallbackTeamID\n        }\n\n        guard let value = SecTaskCopyValueForEntitlement(task, \"com.apple.developer.team-identifier\" as CFString, nil) as? String else {\n            assertionFailure(\"SecTaskCopyValueForEntitlement(com.apple.developer.team-identifier) failed\")\n            return fallbackTeamID\n        }\n\n        return value\n        #else\n        /// Always use hardcoded team ID for release builds, just in case.\n        return fallbackTeamID\n        #endif\n    }()\n\n    public var teamID: String { Self.teamID }\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/XPCWrappers/XPCProtocol.swift",
    "content": "import Foundation\n\n@objc protocol _XPCProtocol: Sendable {\n    func process(_ data: Data, with reply: @Sendable @escaping (Data?, Error?) -> Void)\n}\n\npublic protocol XPCProtocol<Input, Output>: Sendable {\n\n    associatedtype Input: Codable\n    associatedtype Output: Codable\n\n    func process(_ data: Input) async throws -> Output\n\n}\n"
  },
  {
    "path": "Sources/Packages/Sources/XPCWrappers/XPCServiceDelegate.swift",
    "content": "import Foundation\n\npublic final class XPCServiceDelegate: NSObject, NSXPCListenerDelegate {\n\n    private let exportedObject: ErasedXPCProtocol\n\n    public init<XPCProtocolType: XPCProtocol>(exportedObject: XPCProtocolType) {\n        self.exportedObject = ErasedXPCProtocol(exportedObject)\n    }\n\n    public func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {\n        newConnection.exportedInterface = NSXPCInterface(with: (any _XPCProtocol).self)\n        let exportedObject = exportedObject\n        newConnection.exportedObject = exportedObject\n        newConnection.setCodeSigningRequirement(\"anchor apple generic and certificate leaf[subject.OU] = \\\"\\(ProcessInfo.processInfo.teamID)\\\"\")\n        newConnection.resume()\n        return true\n    }\n}\n\n@objc private final class ErasedXPCProtocol: NSObject, _XPCProtocol {\n\n    let _process: @Sendable (Data, @Sendable @escaping (Data?, (any Error)?) -> Void) -> Void\n\n    public init<XPCProtocolType: XPCProtocol>(_ exportedObject: XPCProtocolType) {\n        _process = { data, reply in\n            Task { [reply] in\n                do {\n                    let decoded = try JSONDecoder().decode(XPCProtocolType.Input.self, from: data)\n                    let result = try await exportedObject.process(decoded)\n                    let encoded = try JSONEncoder().encode(result)\n                    reply(encoded, nil)\n                } catch {\n                    if let error = error as? Codable & Error {\n                        reply(nil, NSError(error))\n                    } else {\n                        // Sending cast directly tries to serialize it and crashes XPCEncoder.\n                        let cast = error as NSError\n                        reply(nil, NSError(domain: cast.domain, code: cast.code, userInfo: [NSLocalizedDescriptionKey: error.localizedDescription]))\n                    }\n                }\n            }\n        }\n    }\n\n    func process(_ data: Data, with reply: @Sendable @escaping (Data?, (any Error)?) -> Void) {\n        _process(data, reply)\n    }\n\n\n}\n\nextension NSError {\n\n    private enum Constants {\n        static let domain = \"com.maxgoedjen.secretive.xpcwrappers\"\n        static let code = -1\n        static let dataKey = \"underlying\"\n    }\n\n    @nonobjc convenience init<ErrorType: Codable & Error>(_ error: ErrorType) {\n        let encoded = try? JSONEncoder().encode(error)\n        self.init(domain: Constants.domain, code: Constants.code, userInfo: [Constants.dataKey: encoded as Any])\n    }\n\n    @nonobjc public func underlying<ErrorType: Codable & Error>(as errorType: ErrorType.Type) -> ErrorType? {\n        guard domain == Constants.domain && code == Constants.code, let data = userInfo[Constants.dataKey] as? Data else { return nil }\n        return try? JSONDecoder().decode(ErrorType.self, from: data)\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/Packages/Sources/XPCWrappers/XPCTypedSession.swift",
    "content": "import Foundation\n\npublic struct XPCTypedSession<ResponseType: Codable & Sendable, ErrorType: Error & Codable>: ~Copyable {\n\n    private let connection: NSXPCConnection\n    private let proxy: _XPCProtocol\n\n    public init(serviceName: String, warmup: Bool = false) async throws {\n        let connection = NSXPCConnection(serviceName: serviceName)\n        connection.remoteObjectInterface = NSXPCInterface(with: (any _XPCProtocol).self)\n        connection.setCodeSigningRequirement(\"anchor apple generic and certificate leaf[subject.OU] = \\\"\\(ProcessInfo.processInfo.teamID)\\\"\")\n        connection.resume()\n        guard let proxy = connection.remoteObjectProxy as? _XPCProtocol else { fatalError() }\n        self.connection = connection\n        self.proxy = proxy\n        if warmup {\n            _ = try? await send()\n        }\n    }\n\n    public func send(_ message: some Encodable = Data()) async throws -> ResponseType {\n        let encoded = try JSONEncoder().encode(message)\n        return try await withCheckedThrowingContinuation { continuation in\n            proxy.process(encoded) { data, error in\n                do {\n                    if let error {\n                        throw error\n                    }\n                    guard let data else {\n                        throw NoDataError()\n                    }\n                    let decoded = try JSONDecoder().decode(ResponseType.self, from: data)\n                    continuation.resume(returning: decoded)\n                } catch {\n                    if let typed = (error as NSError).underlying(as: ErrorType.self) {\n                        continuation.resume(throwing: typed)\n                    } else {\n                        continuation.resume(throwing: error)\n                    }\n                }\n            }\n        }\n    }\n\n\n    public func complete() {\n        connection.invalidate()\n    }\n\n    public struct NoDataError: Error {}\n\n}\n\n"
  },
  {
    "path": "Sources/Packages/Tests/BriefTests/ReleaseParsingTests.swift",
    "content": "import Testing\nimport Foundation\n@testable import Brief\n\n@Suite struct ReleaseParsingTests {\n\n    @Test\n    func nonCritical() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Initial release\")\n        #expect(release.critical == false)\n    }\n\n    @Test\n    func critical() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update\")\n        #expect(release.critical == true)\n    }\n\n    @Test\n    func osMissing() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update\")\n        #expect(release.minimumOSVersion == SemVer(\"11.0.0\"))\n    }\n\n    @Test\n    func osPresentWithContentBelow() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update ##Minimum macOS Version\\n1.2.3\\nBuild info\")\n        #expect(release.minimumOSVersion == SemVer(\"1.2.3\"))\n    }\n\n    @Test\n    func osPresentAtEnd() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update Minimum macOS Version: 1.2.3\")\n        #expect(release.minimumOSVersion == SemVer(\"1.2.3\"))\n    }\n\n    @Test\n    func osWithMacOSPrefix() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update Minimum macOS Version: macOS 1.2.3\")\n        #expect(release.minimumOSVersion == SemVer(\"1.2.3\"))\n    }\n\n    @Test\n    func osGreaterThanMinimum() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update Minimum macOS Version: 1.2.3\")\n        #expect(release.minimumOSVersion < SemVer(\"11.0.0\"))\n    }\n\n    @Test\n    func osEqualToMinimum() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update Minimum macOS Version: 11.2.3\")\n        #expect(release.minimumOSVersion <= SemVer(\"11.2.3\"))\n    }\n\n    @Test\n    func osLessThanMinimum() {\n        let release = Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update Minimum macOS Version: 1.2.3\")\n        #expect(release.minimumOSVersion > SemVer(\"1.0.0\"))\n    }\n\n    @Test\n    @MainActor func greatestSelectedIfOldPatchIsPublishedLater() async throws {\n        // If 2.x.x series has been published, and a patch for 1.x.x is issued\n        // 2.x.x should still be selected if user can run it.\n        let updater = Updater(checkOnLaunch: false, osVersion: SemVer(\"2.2.3\"), currentVersion: SemVer(\"1.0.0\"))\n        let two = Release(name: \"2.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"2.0 available! Minimum macOS Version: 2.2.3\")\n        let releases = [\n            Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Initial release Minimum macOS Version: 1.2.3\"),\n            Release(name: \"1.0.1\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Bug fixes Minimum macOS Version: 1.2.3\"),\n            two,\n            Release(name: \"1.0.2\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Emergency patch! Minimum macOS Version: 1.2.3\"),\n        ]\n\n        await updater.evaluate(releases: releases)\n        try await Task.sleep(nanoseconds: 1)\n        #expect(updater.update == two)\n    }\n\n    @Test\n    @MainActor func latestVersionIsRunnable() async throws {\n        // If the 2.x.x series has been published but the user can't run it\n        // the last version the user can run should be selected.\n        let updater = Updater(checkOnLaunch: false, osVersion: SemVer(\"1.2.3\"), currentVersion: SemVer(\"1.0.0\"))\n        let oneOhTwo = Release(name: \"1.0.2\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Emergency patch! Minimum macOS Version: 1.2.3\")\n        let releases = [\n            Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Initial release Minimum macOS Version: 1.2.3\"),\n            Release(name: \"1.0.1\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Bug fixes Minimum macOS Version: 1.2.3\"),\n            Release(name: \"2.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"2.0 available! Minimum macOS Version: 2.2.3\"),\n            Release(name: \"1.0.2\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Emergency patch! Minimum macOS Version: 1.2.3\"),\n        ]\n        await updater.evaluate(releases: releases)\n        try await Task.sleep(nanoseconds: 1)\n        #expect(updater.update == oneOhTwo)\n    }\n\n    @Test\n    func sorting() {\n        let two = Release(name: \"2.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"2.0 available!\")\n        let releases = [\n            Release(name: \"1.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Initial release\"),\n            Release(name: \"1.0.1\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Bug fixes\"),\n            two,\n            Release(name: \"1.0.2\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Emergency patch!\"),\n        ]\n        let sorted = releases.sorted().reversed().first\n        #expect(sorted == two)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/BriefTests/SemVerTests.swift",
    "content": "import Testing\nimport Foundation\n@testable import Brief\n\n@Suite struct SemVerTests {\n\n    @Test func equal() {\n        let current = SemVer(\"1.0.2\")\n        let old = SemVer(\"1.0.2\")\n        #expect(!(current > old))\n    }\n\n    @Test func patchGreaterButMinorLess() {\n        let current = SemVer(\"1.1.0\")\n        let old = SemVer(\"1.0.2\")\n        #expect(current > old)\n    }\n\n    @Test func majorSameMinorGreater() {\n        let current = SemVer(\"1.0.2\")\n        let new = SemVer(\"1.0.3\")\n        #expect(current < new)\n    }\n\n    @Test func majorGreaterMinorLesser() {\n        let current = SemVer(\"1.0.2\")\n        let new = SemVer(\"2.0.0\")\n        #expect(current < new)\n    }\n\n    @Test func regularParsing() {\n        let current = SemVer(\"1.0.2\")\n        #expect(current.versionNumbers == [1, 0, 2])\n    }\n\n    @Test func noPatch() {\n        let current = SemVer(\"1.1\")\n        #expect(current.versionNumbers == [1, 1, 0])\n    }\n\n    @Test func garbage() {\n        let current = SemVer(\"Test\")\n        #expect(current.versionNumbers == [0, 0, 0])\n    }\n\n    @Test func beta() {\n        let current = SemVer(\"1.0.2\")\n        let new = SemVer(\"1.1.0_beta1\")\n        #expect(current < new)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SSHProtocolKitTests/OpenSSHPublicKeyWriterTests.swift",
    "content": "import Foundation\nimport Testing\n@testable import SecretKit\nimport SSHProtocolKit\n\n@Suite struct OpenSSHPublicKeyWriterTests {\n\n    let writer = OpenSSHPublicKeyWriter()\n\n    @Test func ecdsa256MD5Fingerprint() {\n        #expect(writer.openSSHMD5Fingerprint(secret:  Constants.ecdsa256Secret) == \"dc:60:4d:ff:c2:d9:18:8b:2f:24:40:b5:7f:43:47:e5\")\n    }\n\n    @Test func ecdsa256SHA256Fingerprint() {\n        #expect(writer.openSSHSHA256Fingerprint(secret:  Constants.ecdsa256Secret) == \"SHA256:/VQFeGyM8qKA8rB6WGMuZZxZLJln2UgXLk3F0uTF650\")\n    }\n\n    @Test func ecdsa256PublicKey() {\n        #expect(writer.openSSHString(secret:  Constants.ecdsa256Secret) ==\n        \"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOVEjgAA5PHqRgwykjN5qM21uWCHFSY/Sqo5gkHAkn+e1MMQKHOLga7ucB9b3mif33MBid59GRK9GEPVlMiSQwo= test@example.com\")\n    }\n\n    @Test func ecdsa256Hash() {\n    #expect(writer.data(secret: Constants.ecdsa256Secret) == Data(base64Encoded: \"AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOVEjgAA5PHqRgwykjN5qM21uWCHFSY/Sqo5gkHAkn+e1MMQKHOLga7ucB9b3mif33MBid59GRK9GEPVlMiSQwo=\"))\n    }\n\n    @Test func ecdsa384MD5Fingerprint() {\n        #expect(writer.openSSHMD5Fingerprint(secret:  Constants.ecdsa384Secret) == \"66:e0:66:d7:41:ed:19:8e:e2:20:df:ce:ac:7e:2b:6e\")\n    }\n\n    @Test func ecdsa384SHA256Fingerprint() {\n        #expect(writer.openSSHSHA256Fingerprint(secret:  Constants.ecdsa384Secret) == \"SHA256:GJUEymQNL9ymaMRRJCMGY4rWIJHu/Lm8Yhao/PAiz1I\")\n    }\n\n    @Test func ecdsa384PublicKey() {\n        #expect(writer.openSSHString(secret:  Constants.ecdsa384Secret) ==\n                       \"ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBG2MNc/C5OTHFE2tBvbZCVcpOGa8vBMquiTLkH4lwkeqOPxhi+PyYUfQZMTRJNPiTyWPoMBqNiCIFRVv60yPN/AHufHaOgbdTP42EgMlMMImkAjYUEv9DESHTVIs2PW1yQ== test@example.com\")\n    }\n\n    @Test func ecdsa384Hash() {\n        #expect(writer.data(secret: Constants.ecdsa384Secret) == Data(base64Encoded: \"AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBG2MNc/C5OTHFE2tBvbZCVcpOGa8vBMquiTLkH4lwkeqOPxhi+PyYUfQZMTRJNPiTyWPoMBqNiCIFRVv60yPN/AHufHaOgbdTP42EgMlMMImkAjYUEv9DESHTVIs2PW1yQ==\"))\n    }\n\n}\n\nextension OpenSSHPublicKeyWriterTests {\n\n    enum Constants {\n        static let ecdsa256Secret =  TestSecret(id: Data(), name: \"Test Key (ECDSA 256)\", publicKey: Data(base64Encoded: \"BOVEjgAA5PHqRgwykjN5qM21uWCHFSY/Sqo5gkHAkn+e1MMQKHOLga7ucB9b3mif33MBid59GRK9GEPVlMiSQwo=\")!, attributes: Attributes(keyType: KeyType(algorithm: .ecdsa, size: 256), authentication: .notRequired, publicKeyAttribution: \"test@example.com\"))\n        static let ecdsa384Secret = TestSecret(id: Data(), name: \"Test Key (ECDSA 384)\", publicKey: Data(base64Encoded: \"BG2MNc/C5OTHFE2tBvbZCVcpOGa8vBMquiTLkH4lwkeqOPxhi+PyYUfQZMTRJNPiTyWPoMBqNiCIFRVv60yPN/AHufHaOgbdTP42EgMlMMImkAjYUEv9DESHTVIs2PW1yQ==\")!, attributes: Attributes(keyType: KeyType(algorithm: .ecdsa, size: 384), authentication: .notRequired, publicKeyAttribution: \"test@example.com\"))\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SSHProtocolKitTests/OpenSSHReaderTests.swift",
    "content": "import Foundation\nimport Testing\nimport SSHProtocolKit\n\n@Suite struct OpenSSHReaderTests {\n\n    @Test func signatureRequest() throws {\n        let reader = OpenSSHReader(data: Constants.signatureRequest)\n        let hash = try reader.readNextChunk()\n        #expect(hash == Data(base64Encoded: \"AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBEqCbkJbOHy5S1wVCaJoKPmpS0egM4frMqllgnlRRQ/Uvnn6EVS8oV03cPA2Bz0EdESyRKA/sbmn0aBtgjIwGELxu45UXEW1TEz6TxyS0u3vuIqR3Wo1CrQWRDnkrG/pBQ==\"))\n        let dataToSign = try reader.readNextChunk()\n        #expect(dataToSign == Data(base64Encoded: \"AAAAICi5xf1ixOestUlxdjvt/BDcM+rzhwy7Vo8cW5YcxA8+MgAAAANnaXQAAAAOc3NoLWNvbm5lY3Rpb24AAAAJcHVibGlja2V5AQAAABNlY2RzYS1zaGEyLW5pc3RwMzg0AAAAiAAAABNlY2RzYS1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQRKgm5CWzh8uUtcFQmiaCj5qUtHoDOH6zKpZYJ5UUUP1L55+hFUvKFdN3DwNgc9BHREskSgP7G5p9GgbYIyMBhC8buOVFxFtUxM+k8cktLt77iKkd1qNQq0FkQ55Kxv6QU=\"))\n        let empty = try reader.readNextChunk()\n        #expect(empty.isEmpty)\n    }\n\n}\n\nextension OpenSSHReaderTests {\n\n    enum Constants {\n        static let signatureRequest = Data(base64Encoded: \"AAAAiAAAABNlY2RzYS1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQRKgm5CWzh8uUtcFQmiaCj5qUtHoDOH6zKpZYJ5UUUP1L55+hFUvKFdN3DwNgc9BHREskSgP7G5p9GgbYIyMBhC8buOVFxFtUxM+k8cktLt77iKkd1qNQq0FkQ55Kxv6QUAAADvAAAAICi5xf1ixOestUlxdjvt/BDcM+rzhwy7Vo8cW5YcxA8+MgAAAANnaXQAAAAOc3NoLWNvbm5lY3Rpb24AAAAJcHVibGlja2V5AQAAABNlY2RzYS1zaGEyLW5pc3RwMzg0AAAAiAAAABNlY2RzYS1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQRKgm5CWzh8uUtcFQmiaCj5qUtHoDOH6zKpZYJ5UUUP1L55+hFUvKFdN3DwNgc9BHREskSgP7G5p9GgbYIyMBhC8buOVFxFtUxM+k8cktLt77iKkd1qNQq0FkQ55Kxv6QUAAAAA\")!\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SSHProtocolKitTests/OpenSSHSignatureWriterTests.swift",
    "content": "import Foundation\nimport Testing\nimport SSHProtocolKit\n@testable import SecretKit\n\n@Suite struct OpenSSHSignatureWriterTests {\n\n    private let writer = OpenSSHSignatureWriter()\n\n    @Test func ecdsaMpintStripsUnnecessaryLeadingZeros() throws {\n        let secret = Constants.ecdsa256Secret\n\n        // r has a leading 0x00 followed by 0x01 (< 0x80): the mpint must not keep the leading zero.\n        let rBytes: [UInt8] = [0x00] + (1...31).map { UInt8($0) }\n        let r = Data(rBytes)\n        // s has two leading 0x00 bytes followed by 0x7f (< 0x80): the mpint must not keep the leading zeros.\n        let sBytes: [UInt8] = [0x00, 0x00, 0x7f] + Array(repeating: UInt8(0x01), count: 29)\n        let s = Data(sBytes)\n        let rawRepresentation = r + s\n\n        let response = writer.data(secret: secret, signature: rawRepresentation)\n        let (parsedR, parsedS) = try parseEcdsaSignatureMpints(from: response)\n\n        #expect(parsedR == Data((1...31).map { UInt8($0) }))\n        #expect(parsedS == Data([0x7f] + Array(repeating: UInt8(0x01), count: 29)))\n    }\n\n    @Test func ecdsaMpintPrefixesZeroWhenHighBitSet() throws {\n        let secret = Constants.ecdsa256Secret\n\n        // r starts with 0x80 (high bit set): mpint must be prefixed with 0x00.\n        let r = Data([UInt8(0x80)] + Array(repeating: UInt8(0x01), count: 31))\n        let s = Data([UInt8(0x01)] + Array(repeating: UInt8(0x02), count: 31))\n        let rawRepresentation = r + s\n\n        let response = writer.data(secret: secret, signature: rawRepresentation)\n        let (parsedR, parsedS) = try parseEcdsaSignatureMpints(from: response)\n\n        #expect(parsedR == Data([0x00, 0x80] + Array(repeating: UInt8(0x01), count: 31)))\n        #expect(parsedS == Data([0x01] + Array(repeating: UInt8(0x02), count: 31)))\n    }\n\n}\n\nprivate extension OpenSSHSignatureWriterTests {\n\n    enum Constants {\n        static let ecdsa256Secret = TestSecret(\n            id: Data(),\n            name: \"Test Key (ECDSA 256)\",\n            publicKey: Data(repeating: 0x01, count: 65),\n            attributes: Attributes(\n                keyType: KeyType(algorithm: .ecdsa, size: 256),\n                authentication: .notRequired,\n                publicKeyAttribution: \"test@example.com\"\n            )\n        )\n    }\n\n    enum ParseError: Error {\n        case eof\n        case invalidAlgorithm\n    }\n\n    func parseEcdsaSignatureMpints(from openSSHSignedData: Data) throws -> (r: Data, s: Data) {\n        let reader = OpenSSHReader(data: openSSHSignedData)\n\n        // Prefix\n        _ = try reader.readNextBytes(as: UInt32.self)\n\n        let algorithm = try reader.readNextChunkAsString()\n        guard algorithm == \"ecdsa-sha2-nistp256\" else {\n            throw ParseError.invalidAlgorithm\n        }\n\n        let sigReader = try reader.readNextChunkAsSubReader()\n        let r = try sigReader.readNextChunk()\n        let s = try sigReader.readNextChunk()\n        return (r, s)\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/Packages/Tests/SSHProtocolKitTests/TestSecret.swift",
    "content": "import Foundation\nimport SecretKit\n\npublic struct TestSecret: SecretKit.Secret {\n    \n    public let id: Data\n    public let name: String\n    public let publicKey: Data\n    public var attributes: Attributes\n    \n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SecretAgentKitTests/AgentTests.swift",
    "content": "import Foundation\nimport Testing\nimport CryptoKit\n@testable import SSHProtocolKit\n@testable import SecretKit\n@testable import SecretAgentKit\n\n@Suite struct AgentTests {\n\n    // MARK: Identity Listing\n\n    @Test func emptyStores() async throws {\n        let agent = Agent(storeList: SecretStoreList())\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestIdentities)\n        let response = await agent.handle(request: request, provenance: .test)\n        #expect(response == Constants.Responses.requestIdentitiesEmpty)\n    }\n\n    @Test func identitiesList() async throws {\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])\n        let agent = Agent(storeList: list)\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestIdentities)\n        let response = await agent.handle(request: request, provenance: .test)\n\n        let actual = OpenSSHReader(data: response)\n        let expected = OpenSSHReader(data: Constants.Responses.requestIdentitiesMultiple)\n        print(actual, expected)\n        #expect(response == Constants.Responses.requestIdentitiesMultiple)\n    }\n\n    // MARK: Signatures\n\n    @Test func noMatchingIdentities() async throws {\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])\n        let agent = Agent(storeList: list)\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignatureWithNoneMatching)\n        let response = await agent.handle(request: request, provenance: .test)\n        #expect(response == Constants.Responses.requestFailure)\n    }\n\n    @Test func ecdsaSignature() async throws {\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)\n        guard case SSHAgent.Request.signRequest(let context) = request else { return }\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])\n        let agent = Agent(storeList: list)\n        let response = await agent.handle(request: request, provenance: .test)\n        let responseReader = OpenSSHReader(data: response)\n        let length = try responseReader.readNextBytes(as: UInt32.self)\n        let type = try responseReader.readNextBytes(as: UInt8.self)\n        #expect(length == response.count - MemoryLayout<UInt32>.size)\n        #expect(type == SSHAgent.Response.agentSignResponse.rawValue)\n        let outer = OpenSSHReader(data: responseReader.remaining)\n        let inner = try outer.readNextChunkAsSubReader()\n        _ = try inner.readNextChunk()\n        let rsData = try inner.readNextChunkAsSubReader()\n        var r = try rsData.readNextChunk()\n        var s = try rsData.readNextChunk()\n        // This is fine IRL, but it freaks out CryptoKit\n        if r[0] == 0 {\n            r.removeFirst()\n        }\n        if s[0] == 0 {\n            s.removeFirst()\n        }\n        var rs = r\n        rs.append(s)\n        let signature = try P256.Signing.ECDSASignature(rawRepresentation: rs)\n        // Correct signature\n        #expect(try P256.Signing.PublicKey(x963Representation: Constants.Secrets.ecdsa256Secret.publicKey)\n            .isValidSignature(signature, for: context.dataToSign))\n    }\n\n    // MARK: Witness protocol\n\n    @Test func witnessObjectionStopsRequest() async throws {\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret])\n        let witness = StubWitness(speakNow: { _,_  in\n            return true\n        }, witness: { _, _ in })\n        let agent = Agent(storeList: list, witness: witness)\n        let response = await agent.handle(request: .signRequest(.empty), provenance: .test)\n        #expect(response == Constants.Responses.requestFailure)\n    }\n\n    @Test func witnessSignature() async throws {\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret])\n        nonisolated(unsafe) var witnessed = false\n        let witness = StubWitness(speakNow: { _, trace  in\n            return false\n        }, witness: { _, trace in\n            witnessed = true\n        })\n        let agent = Agent(storeList: list, witness: witness)\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)\n        _ = await agent.handle(request: request, provenance: .test)\n        #expect(witnessed)\n    }\n\n    @Test func requestTracing() async throws {\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret])\n        nonisolated(unsafe) var speakNowTrace: SigningRequestProvenance?\n        nonisolated(unsafe) var witnessTrace: SigningRequestProvenance?\n        let witness = StubWitness(speakNow: { _, trace  in\n            speakNowTrace = trace\n            return false\n        }, witness: { _, trace in\n            witnessTrace = trace\n        })\n        let agent = Agent(storeList: list, witness: witness)\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)\n        _ = await agent.handle(request: request, provenance: .test)\n        #expect(witnessTrace == speakNowTrace)\n        #expect(witnessTrace == .test)\n    }\n\n    // MARK: Exception Handling\n\n    @Test func signatureException() async throws {\n        let list = await storeList(with: [Constants.Secrets.ecdsa256Secret, Constants.Secrets.ecdsa384Secret])\n        let store = await list.stores.first?.base as! Stub.Store\n        store.shouldThrow = true\n        let agent = Agent(storeList: list)\n        let request = try SSHAgentInputParser().parse(data: Constants.Requests.requestSignature)\n        let response = await agent.handle(request: request, provenance: .test)\n        #expect(response == Constants.Responses.requestFailure)\n    }\n\n    // MARK: Unsupported\n\n    @Test func unhandledAdd() async throws {\n        let agent = Agent(storeList: SecretStoreList())\n        let response = await agent.handle(request: .addIdentity, provenance: .test)\n        #expect(response == Constants.Responses.requestFailure)\n    }\n\n}\n\nextension SigningRequestProvenance {\n\n    static let test = SigningRequestProvenance(root: .init(pid: 0, processName: \"test\", appName: nil, iconURL: nil, path: \"/\", validSignature: true, parentPID: 0))\n\n}\n\nextension AgentTests {\n\n    @MainActor func storeList(with secrets: [Stub.Secret]) async -> SecretStoreList {\n        let store = Stub.Store()\n        store.secrets.append(contentsOf: secrets)\n        let storeList = SecretStoreList()\n        storeList.add(store: store)\n        return storeList\n    }\n\n    enum Constants {\n\n        enum Requests {\n            static let requestIdentities = Data(base64Encoded: \"AAAAAQs=\")!\n            static let requestSignatureWithNoneMatching = Data(base64Encoded: \"AAABhA0AAACIAAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBEqCbkJbOHy5S1wVCaJoKPmpS0egM4frMqllgnlRRQ/Uvnn6EVS8oV03cPA2Bz0EdESyRKA/sbmn0aBtgjIwGELxu45UXEW1TEz6TxyS0u3vuIqR3Wo1CrQWRDnkrG/pBQAAAO8AAAAgbqmrqPUtJ8mmrtaSVexjMYyXWNqjHSnoto7zgv86xvcyAAAAA2dpdAAAAA5zc2gtY29ubmVjdGlvbgAAAAlwdWJsaWNrZXkBAAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAACIAAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBEqCbkJbOHy5S1wVCaJoKPmpS0egM4frMqllgnlRRQ/Uvnn6EVS8oV03cPA2Bz0EdESyRKA/sbmn0aBtgjIwGELxu45UXEW1TEz6TxyS0u3vuIqR3Wo1CrQWRDnkrG/pBQAAAAA=\")!\n            static let requestSignature = Data(base64Encoded: \"AAABRA0AAABoAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKzOkUiVJEcACMtAd9X7xalbc0FYZyhbmv2dsWl4IP2GWIi+RcsaHQNw+nAIQ8CKEYmLnl0VLDp5Ef8KMhgIy08AAADPAAAAIBIFsbCZ4/dhBmLNGHm0GKj7EJ4N8k/jXRxlyg+LFIYzMgAAAANnaXQAAAAOc3NoLWNvbm5lY3Rpb24AAAAJcHVibGlja2V5AQAAABNlY2RzYS1zaGEyLW5pc3RwMjU2AAAAaAAAABNlY2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQSszpFIlSRHAAjLQHfV+8WpW3NBWGcoW5r9nbFpeCD9hliIvkXLGh0DcPpwCEPAihGJi55dFSw6eRH/CjIYCMtPAAAAAA==\")!\n        }\n\n        enum Responses {\n            static let requestIdentitiesEmpty = Data(base64Encoded: \"AAAABQwAAAAA\")!\n            static let requestIdentitiesMultiple = Data(base64Encoded: \"AAABLwwAAAACAAAAaAAAABNlY2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQSszpFIlSRHAAjLQHfV+8WpW3NBWGcoW5r9nbFpeCD9hliIvkXLGh0DcPpwCEPAihGJi55dFSw6eRH/CjIYCMtPAAAAFWVjZHNhLTI1NkBleGFtcGxlLmNvbQAAAIgAAAATZWNkc2Etc2hhMi1uaXN0cDM4NAAAAAhuaXN0cDM4NAAAAGEEspLMDmreMJverQkqKC9zF9ZUasn5uSWkbRlz1jNTCtuyH1KKm+VImL6wdAj47SbzwM6lEEC24AdfrR64P9i/bnS2i83v/4wQVtcZn+Et13QGgWlZst8lxCPzTookaVwMAAAAFWVjZHNhLTM4NEBleGFtcGxlLmNvbQ==\")!\n            static let requestFailure = Data(base64Encoded: \"AAAAAQU=\")!\n        }\n\n        enum Secrets {\n            static let ecdsa256Secret =  Stub.Secret(keySize: 256, publicKey: Data(base64Encoded: \"BKzOkUiVJEcACMtAd9X7xalbc0FYZyhbmv2dsWl4IP2GWIi+RcsaHQNw+nAIQ8CKEYmLnl0VLDp5Ef8KMhgIy08=\")!, privateKey: Data(base64Encoded: \"BKzOkUiVJEcACMtAd9X7xalbc0FYZyhbmv2dsWl4IP2GWIi+RcsaHQNw+nAIQ8CKEYmLnl0VLDp5Ef8KMhgIy09nw780wy/TSfUmzj15iJkV234AaCLNl+H8qFL6qK8VIg==\")!)\n            static let ecdsa384Secret =  Stub.Secret(keySize: 384, publicKey: Data(base64Encoded: \"BLKSzA5q3jCb3q0JKigvcxfWVGrJ+bklpG0Zc9YzUwrbsh9SipvlSJi+sHQI+O0m88DOpRBAtuAHX60euD/Yv250tovN7/+MEFbXGZ/hLdd0BoFpWbLfJcQj806KJGlcDA==\")!, privateKey: Data(base64Encoded: \"BLKSzA5q3jCb3q0JKigvcxfWVGrJ+bklpG0Zc9YzUwrbsh9SipvlSJi+sHQI+O0m88DOpRBAtuAHX60euD/Yv250tovN7/+MEFbXGZ/hLdd0BoFpWbLfJcQj806KJGlcDHNapAOzrt9E+9QC4/KYoXS7Uw4pmdAz53uIj02tttiq3c0ZyIQ7XoscWWRqRrz8Kw==\")!)\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SecretAgentKitTests/StubStore.swift",
    "content": "import Foundation\nimport SecretKit\nimport CryptoKit\nimport SSHProtocolKit\n\nstruct Stub {}\n\nextension Stub {\n\n    public final class Store: SecretStore, @unchecked Sendable {\n\n        public let isAvailable = true\n        public let id = UUID()\n        public let name = \"Stub\"\n        public var secrets: [Secret] = []\n        public var shouldThrow = false\n\n        public init() {\n//            try! create(size: 256)\n//            try! create(size: 384)\n        }\n\n        public func create(size: Int) throws {\n            let flags: SecAccessControlCreateFlags = []\n            let access =\n                SecAccessControlCreateWithFlags(kCFAllocatorDefault,\n                                                kSecAttrAccessibleWhenUnlockedThisDeviceOnly,\n                                                flags,\n                                                nil) as Any\n\n            let attributes = KeychainDictionary([\n                kSecAttrLabel: name,\n                kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,\n                kSecAttrKeySizeInBits: size,\n                kSecPrivateKeyAttrs: [\n                    kSecAttrIsPermanent: true,\n                    kSecAttrAccessControl: access\n                ]\n                ])\n\n            let privateKey = SecKeyCreateRandomKey(attributes, nil)!\n            let publicKey = SecKeyCopyPublicKey(privateKey)!\n            let publicAttributes = SecKeyCopyAttributes(publicKey) as! [CFString: Any]\n            let privateAttributes = SecKeyCopyAttributes(privateKey) as! [CFString: Any]\n            let publicData = (publicAttributes[kSecValueData] as! Data)\n            let privateData = (privateAttributes[kSecValueData] as! Data)\n            let secret = Secret(keySize: size, publicKey: publicData, privateKey: privateData)\n            print(secret)\n            print(\"Public Key OpenSSH: \\(OpenSSHPublicKeyWriter().openSSHString(secret: secret))\")\n        }\n\n        public func sign(data: Data, with secret: Secret, for provenance: SigningRequestProvenance) throws -> Data {\n            guard !shouldThrow else {\n                throw NSError(domain: \"test\", code: 0, userInfo: nil)\n            }\n            let privateKey = try CryptoKit.P256.Signing.PrivateKey(x963Representation: secret.privateKey)\n            return try privateKey.signature(for: data).rawRepresentation\n        }\n\n        public func existingPersistedAuthenticationContext(secret: Stub.Secret) -> PersistedAuthenticationContext? {\n            nil\n        }\n\n        public func persistAuthentication(secret: Stub.Secret, forDuration duration: TimeInterval) throws {\n        }\n\n        public func reloadSecrets() {\n        }\n\n    }\n\n}\n\nextension Stub {\n\n    struct Secret: SecretKit.Secret, CustomDebugStringConvertible {\n\n        let id = Data(UUID().uuidString.utf8)\n        let name = UUID().uuidString\n        let attributes: Attributes\n        let publicKey: Data\n        let requiresAuthentication = false\n        let privateKey: Data\n\n        init(keySize: Int, publicKey: Data, privateKey: Data) {\n            self.attributes = Attributes(keyType: .init(algorithm: .ecdsa, size: keySize), authentication: .notRequired, publicKeyAttribution: \"ecdsa-\\(keySize)@example.com\")\n            self.publicKey = publicKey\n            self.privateKey = privateKey\n        }\n\n        var debugDescription: String {\n            \"\"\"\n            Key Size \\(attributes.keyType.size)\n            Private: \\(privateKey.base64EncodedString())\n            Public: \\(publicKey.base64EncodedString())\n            \"\"\"\n        }\n\n    }\n\n}\n\n\nextension Stub.Store {\n\n    struct StubError: Error {\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SecretAgentKitTests/StubWitness.swift",
    "content": "import SecretKit\nimport SecretAgentKit\n\nstruct StubWitness {\n\n    let speakNow: @Sendable (AnySecret, SigningRequestProvenance) -> Bool\n    let witness: @Sendable (AnySecret, SigningRequestProvenance) -> ()\n\n}\n\nextension StubWitness: SigningWitness {\n\nfunc speakNowOrForeverHoldYourPeace(forAccessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) throws {\n        let objection = speakNow(secret, provenance)\n        if objection {\n            throw TheresMyChance()\n        }\n    }\n\nfunc witness(accessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) throws {\n        witness(secret, provenance)\n    }\n\n}\n\nextension StubWitness {\n\n    struct TheresMyChance: Error {\n\n    }\n\n}\n"
  },
  {
    "path": "Sources/Packages/Tests/SecretKitTests/AnySecretTests.swift",
    "content": "import Foundation\nimport Testing\n@testable import SecretKit\n@testable import SecureEnclaveSecretKit\n@testable import SmartCardSecretKit\n\n\n@Suite struct AnySecretTests {\n\n    @Test func eraser() {\n        let data = Data(UUID().uuidString.utf8)\n        let secret = SmartCard.Secret(id: data, name: \"Name\", publicKey: data, attributes: Attributes(keyType: KeyType(algorithm: .ecdsa, size: 256), authentication: .notRequired))\n        let erased = AnySecret(secret)\n        #expect(erased.id == secret.id as AnyHashable)\n        #expect(erased.name == secret.name)\n        #expect(erased.keyType == secret.keyType)\n        #expect(erased.publicKey == secret.publicKey)\n    }\n\n}\n"
  },
  {
    "path": "Sources/SecretAgent/AppDelegate.swift",
    "content": "import Cocoa\nimport OSLog\nimport SecretKit\nimport SecureEnclaveSecretKit\nimport SmartCardSecretKit\nimport SecretAgentKit\nimport Brief\nimport Observation\nimport Common\n\n@main\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n    @MainActor private let storeList: SecretStoreList = {\n        let list = SecretStoreList()\n        let cryptoKit = SecureEnclave.Store()\n        let migrator = SecureEnclave.CryptoKitMigrator()\n        try? migrator.migrate(to: cryptoKit)\n        list.add(store: cryptoKit)\n        list.add(store: SmartCard.Store())\n        return list\n    }()\n    private let updater = Updater(checkOnLaunch: true)\n    private let notifier = Notifier()\n    private let publicKeyFileStoreController = PublicKeyFileStoreController(directory: URL.publicKeyDirectory)\n    private lazy var agent: Agent = {\n        Agent(storeList: storeList, witness: notifier)\n    }()\n    private lazy var socketController: SocketController = {\n        let path = URL.socketPath as String\n        return SocketController(path: path)\n    }()\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"AppDelegate\")\n\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        logger.debug(\"SecretAgent finished launching\")\n        Task {\n            for await session in socketController.sessions {\n                Task {\n                    let inputParser = try await XPCAgentInputParser()\n                    do {\n                        for await message in session.messages {\n                            let request = try await inputParser.parse(data: message)\n                            let agentResponse = await agent.handle(request: request, provenance: session.provenance)\n                            try session.write(agentResponse)\n                        }\n                    } catch {\n                        try session.close()\n                    }\n                }\n            }\n        }\n        Task {\n            for await _ in NotificationCenter.default.notifications(named: .secretStoreReloaded) {\n                try? publicKeyFileStoreController.generatePublicKeys(for: storeList.allSecrets, clear: true)\n            }\n        }\n        try? publicKeyFileStoreController.generatePublicKeys(for: storeList.allSecrets, clear: true)\n        notifier.prompt()\n        _ = withObservationTracking {\n            updater.update\n        } onChange: { [updater, notifier] in\n            Task {\n                guard !updater.currentVersion.isTestBuild else { return }\n                await notifier.notify(update: updater.update!) { release in\n                    await updater.ignore(release: release)\n                }\n            }\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/SecretAgent/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(CI_VERSION)</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>$(PRODUCT_NAME) is MIT Licensed.</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSSupportsAutomaticTermination</key>\n\t<false/>\n\t<key>NSSupportsSuddenTermination</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretAgent/InternetAccessPolicy.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ApplicationDescription</key>\n\t<string>Secretive is an app for storing and managing SSH keys in the Secure Enclave. SecretAgent is a helper process that runs in the background to sign requests, so that you don&apos;t always have to keep the main Secretive app open.</string>\n\t<key>DeveloperName</key>\n\t<string>Max Goedjen</string>\n\t<key>Website</key>\n\t<string>https://github.com/maxgoedjen/secretive</string>\n\t<key>Connections</key>\n\t<array/>\n\t<key>Services</key>\n\t<array/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretAgent/Notifier.swift",
    "content": "import Foundation\nimport UserNotifications\nimport AppKit\nimport SecretKit\nimport SecretAgentKit\nimport Brief\n\nfinal class Notifier: Sendable {\n\n    private let notificationDelegate = NotificationDelegate()\n\n    init() {\n        let updateAction = UNNotificationAction(identifier: Constants.updateActionIdentitifier, title: String(localized: .updateNotificationUpdateButton), options: [])\n        let ignoreAction = UNNotificationAction(identifier: Constants.ignoreActionIdentitifier, title: String(localized: .updateNotificationIgnoreButton), options: [])\n        let updateCategory = UNNotificationCategory(identifier: Constants.updateCategoryIdentitifier, actions: [updateAction, ignoreAction], intentIdentifiers: [], options: [])\n        let criticalUpdateCategory = UNNotificationCategory(identifier: Constants.criticalUpdateCategoryIdentitifier, actions: [updateAction], intentIdentifiers: [], options: [])\n\n        let rawDurations = [\n            Measurement(value: 1, unit: UnitDuration.minutes),\n            Measurement(value: 5, unit: UnitDuration.minutes),\n            Measurement(value: 1, unit: UnitDuration.hours),\n            Measurement(value: 24, unit: UnitDuration.hours)\n        ]\n\n        let doNotPersistAction = UNNotificationAction(identifier: Constants.doNotPersistActionIdentitifier, title: String(localized: .persistAuthenticationDeclineButton), options: [])\n        var allPersistenceActions = [doNotPersistAction]\n\n        let formatter = DateComponentsFormatter()\n        formatter.unitsStyle = .spellOut\n        formatter.allowedUnits = [.hour, .minute, .day]\n\n        var identifiers: [String: TimeInterval] = [:]\n        for duration in rawDurations {\n            let seconds = duration.converted(to: .seconds).value\n            guard let string = formatter.string(from: seconds)?.capitalized else { continue }\n            let identifier = Constants.persistAuthenticationCategoryIdentitifier.appending(\"\\(seconds)\")\n            let action = UNNotificationAction(identifier: identifier, title: string, options: [])\n            identifiers[identifier] = seconds\n            allPersistenceActions.append(action)\n        }\n\n        let persistAuthenticationCategory = UNNotificationCategory(identifier: Constants.persistAuthenticationCategoryIdentitifier, actions: allPersistenceActions, intentIdentifiers: [], options: [])\n        if persistAuthenticationCategory.responds(to: Selector((\"actionsMenuTitle\"))) {\n            persistAuthenticationCategory.setValue(String(localized: .persistAuthenticationAcceptButton), forKey: \"_actionsMenuTitle\")\n        }\n        UNUserNotificationCenter.current().setNotificationCategories([updateCategory, criticalUpdateCategory, persistAuthenticationCategory])\n        UNUserNotificationCenter.current().delegate = notificationDelegate\n\n        Task {\n            await notificationDelegate.state.setPersistenceState(options: identifiers) { secret, store, duration in\n                guard let duration = duration else { return }\n                try? await store.persistAuthentication(secret: secret, forDuration: duration)\n            }\n        }\n\n    }\n\n    func prompt() {\n        let notificationCenter = UNUserNotificationCenter.current()\n        notificationCenter.requestAuthorization(options: .alert) { _, _ in }\n    }\n\n    func notify(accessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) async {\n        await notificationDelegate.state.setPending(secret: secret, store: store)\n        let notificationCenter = UNUserNotificationCenter.current()\n        let notificationContent = UNMutableNotificationContent()\n        notificationContent.title = String(localized: .signedNotificationTitle(appName: provenance.origin.displayName))\n        notificationContent.subtitle = String(localized: .signedNotificationDescription(secretName: secret.name))\n        notificationContent.userInfo[Constants.persistSecretIDKey] = secret.id.description\n        notificationContent.userInfo[Constants.persistStoreIDKey] = store.id.description\n        notificationContent.interruptionLevel = .timeSensitive\n        if await store.existingPersistedAuthenticationContext(secret: secret) == nil && secret.authenticationRequirement.required {\n            notificationContent.categoryIdentifier = Constants.persistAuthenticationCategoryIdentitifier\n        }\n        if let iconURL = provenance.origin.iconURL, let attachment = try? UNNotificationAttachment(identifier: \"icon\", url: iconURL, options: nil) {\n            notificationContent.attachments = [attachment]\n        }\n        let request = UNNotificationRequest(identifier: UUID().uuidString, content: notificationContent, trigger: nil)\n        try? await notificationCenter.add(request)\n    }\n\n    func notify(update: Release, ignore: (@Sendable (Release) async -> Void)?) async {\n        await notificationDelegate.state.prepareForNotification(release: update, ignoreAction: ignore)\n        let notificationCenter = UNUserNotificationCenter.current()\n        let notificationContent = UNMutableNotificationContent()\n        if update.critical {\n            notificationContent.interruptionLevel = .critical\n            notificationContent.title = String(localized: .updateNotificationUpdateCriticalTitle(updateName: update.name))\n        } else {\n            notificationContent.title = String(localized: .updateNotificationUpdateNormalTitle(updateName: update.name))\n        }\n        notificationContent.subtitle = String(localized: .updateNotificationUpdateDescription)\n        notificationContent.body = update.body\n        notificationContent.categoryIdentifier = update.critical ? Constants.criticalUpdateCategoryIdentitifier : Constants.updateCategoryIdentitifier\n        let request = UNNotificationRequest(identifier: UUID().uuidString, content: notificationContent, trigger: nil)\n        try? await notificationCenter.add(request)\n    }\n\n}\n\nextension Notifier: SigningWitness {\n\n    func speakNowOrForeverHoldYourPeace(forAccessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) async throws {\n    }\n\n    func witness(accessTo secret: AnySecret, from store: AnySecretStore, by provenance: SigningRequestProvenance) async throws {\n        await notify(accessTo: secret, from: store, by: provenance)\n    }\n\n}\n\nextension Notifier {\n\n    enum Constants {\n\n        // Update notifications\n        static let updateCategoryIdentitifier  = \"com.maxgoedjen.Secretive.SecretAgent.update\"\n        static let criticalUpdateCategoryIdentitifier  = \"com.maxgoedjen.Secretive.SecretAgent.update.critical\"\n        static let updateActionIdentitifier  = \"com.maxgoedjen.Secretive.SecretAgent.update.updateaction\"\n        static let ignoreActionIdentitifier  = \"com.maxgoedjen.Secretive.SecretAgent.update.ignoreaction\"\n\n        // Authorization persistence notificatoins\n        static let persistAuthenticationCategoryIdentitifier  = \"com.maxgoedjen.Secretive.SecretAgent.persistauthentication\"\n        static let doNotPersistActionIdentitifier  = \"com.maxgoedjen.Secretive.SecretAgent.persistauthentication.donotpersist\"\n        static let persistForActionIdentitifierPrefix  = \"com.maxgoedjen.Secretive.SecretAgent.persistauthentication.persist.\"\n\n        static let persistSecretIDKey  = \"com.maxgoedjen.Secretive.SecretAgent.persistauthentication.secretidkey\"\n        static let persistStoreIDKey  = \"com.maxgoedjen.Secretive.SecretAgent.persistauthentication.storeidkey\"\n    }\n\n}\n\nfinal class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate, Sendable {\n\n    fileprivate actor State {\n        typealias PersistAction = (@Sendable (AnySecret, AnySecretStore, TimeInterval?) async -> Void)\n        typealias IgnoreAction = (@Sendable (Release) async -> Void)\n        fileprivate var release: Release?\n        fileprivate var ignoreAction: IgnoreAction?\n        fileprivate var persistAction: PersistAction?\n        fileprivate var persistOptions: [String: TimeInterval] = [:]\n        fileprivate var pendingPersistableStores: [String: AnySecretStore] = [:]\n        fileprivate var pendingPersistableSecrets: [String: AnySecret] = [:]\n\n        func setPending(secret: AnySecret, store: AnySecretStore) {\n            pendingPersistableSecrets[secret.id.description] = secret\n            pendingPersistableStores[store.id.description] = store\n        }\n\n        func retrievePending(secretID: String, storeID: String, optionID: String) -> (AnySecret, AnySecretStore, TimeInterval)? {\n            guard let secret = pendingPersistableSecrets[secretID],\n                  let store = pendingPersistableStores[storeID],\n                  let options = persistOptions[optionID] else {\n                return nil\n            }\n            pendingPersistableSecrets.removeValue(forKey: secretID)\n            return (secret, store, options)\n        }\n\n        func setPersistenceState(options: [String: TimeInterval], action: @escaping PersistAction) {\n            self.persistOptions = options\n            self.persistAction = action\n        }\n\n        func prepareForNotification(release: Release, ignoreAction: IgnoreAction?) {\n            self.release = release\n            self.ignoreAction = ignoreAction\n        }\n\n        \n    }\n\n    fileprivate let state = State()\n\n    func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) {\n\n    }\n\n    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) async {\n        let category = response.notification.request.content.categoryIdentifier\n        switch category {\n        case Notifier.Constants.updateCategoryIdentitifier:\n            await handleUpdateResponse(response: response)\n        case Notifier.Constants.persistAuthenticationCategoryIdentitifier:\n            await handlePersistAuthenticationResponse(response: response)\n        default:\n            break\n        }\n    }\n\n    func handleUpdateResponse(response: UNNotificationResponse) async {\n        let id = response.actionIdentifier\n        guard let update = await state.release else { return }\n        switch id {\n        case Notifier.Constants.updateActionIdentitifier, UNNotificationDefaultActionIdentifier:\n            NSWorkspace.shared.open(update.html_url)\n        case Notifier.Constants.ignoreActionIdentitifier:\n            await state.ignoreAction?(update)\n        default:\n            fatalError()\n        }\n    }\n\n    func handlePersistAuthenticationResponse(response: UNNotificationResponse) async {\n        guard let secretID = response.notification.request.content.userInfo[Notifier.Constants.persistSecretIDKey] as? String,\n              let storeID = response.notification.request.content.userInfo[Notifier.Constants.persistStoreIDKey] as? String else {\n            return\n        }\n        let optionID = response.actionIdentifier\n        guard let (secret, store, persistOptions) = await state.retrievePending(secretID: secretID, storeID: storeID, optionID: optionID) else { return }\n        await state.persistAction?(secret, store, persistOptions)\n    }\n\n\n    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {\n        [.list, .banner]\n    }\n\n}\n\n"
  },
  {
    "path": "Sources/SecretAgent/Preview Content/Preview Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Sources/SecretAgent/SecretAgent.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.hardened-process</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.enable-pure-data</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.no-tagged-receive</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.dyld-ro</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.enhanced-security-version-string</key>\n\t<string>1</string>\n\t<key>com.apple.security.hardened-process.hardened-heap</key>\n\t<true/>\n\t<key>com.apple.security.smartcard</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.platform-restrictions-string</key>\n\t<string>2</string>\n\t<key>keychain-access-groups</key>\n\t<array>\n\t\t<string>$(AppIdentifierPrefix)com.maxgoedjen.Secretive</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretAgent/XPCInputParser.swift",
    "content": "import Foundation\nimport SecretAgentKit\nimport Brief\nimport XPCWrappers\nimport OSLog\nimport SSHProtocolKit\n\n/// Delegates all agent input parsing to an XPC service which wraps OpenSSH\npublic final class XPCAgentInputParser: SSHAgentInputParserProtocol {\n\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.secretagent\", category: \"XPCAgentInputParser\")\n    private let session: XPCTypedSession<SSHAgent.Request, SSHAgentInputParser.AgentParsingError>\n\n    public init() async throws {\n        logger.debug(\"Creating XPCAgentInputParser\")\n        session = try await XPCTypedSession(serviceName: \"com.maxgoedjen.Secretive.SecretAgentInputParser\", warmup: true)\n        logger.debug(\"XPCAgentInputParser is warmed up.\")\n    }\n\n    public func parse(data: Data) async throws -> SSHAgent.Request {\n        logger.debug(\"Parsing input\")\n        defer { logger.debug(\"Parsed input\") }\n        return try await session.send(data)\n    }\n\n    deinit {\n        session.complete()\n    }\n\n}\n"
  },
  {
    "path": "Sources/SecretAgent/en.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14814\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14814\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"SecretAgent\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"SecretAgent\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About SecretAgent\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide SecretAgent\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit SecretAgent\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontFontPanel:\" target=\"YLy-65-1bz\" id=\"WHr-nq-2xA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"hqk-hr-sYV\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\">\n                                                        <connections>\n                                                            <action selector=\"addFontTrait:\" target=\"YLy-65-1bz\" id=\"IHV-OB-c03\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"Uc7-di-UnL\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\">\n                                                        <connections>\n                                                            <action selector=\"modifyFont:\" target=\"YLy-65-1bz\" id=\"HcX-Lf-eNd\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSidebar:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"SecretAgent Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModuleProvider=\"target\"/>\n                <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Sources/SecretAgentInputParser/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>XPCService</key>\n\t<dict>\n\t\t<key>ServiceType</key>\n\t\t<string>Application</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretAgentInputParser/SecretAgentInputParser.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.hardened-process</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.enable-pure-data</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.no-tagged-receive</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.dyld-ro</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.hardened-heap</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.enhanced-security-version-string</key>\n\t<string>1</string>\n\t<key>com.apple.security.hardened-process.platform-restrictions-string</key>\n\t<string>2</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretAgentInputParser/SecretAgentInputParser.swift",
    "content": "import Foundation\nimport OSLog\nimport XPCWrappers\nimport SecretAgentKit\nimport SSHProtocolKit\n\nfinal class SecretAgentInputParser: NSObject, XPCProtocol {\n\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive.SecretAgentInputParser\", category: \"SecretAgentInputParser\")\n\n    func process(_ data: Data) async throws -> SSHAgent.Request {\n        let parser = SSHAgentInputParser()\n        let result = try parser.parse(data: data)\n        logger.log(\"Parser parsed message as type \\(result.debugDescription)\")\n        return result\n    }\n\n}\n"
  },
  {
    "path": "Sources/SecretAgentInputParser/main.swift",
    "content": "import Foundation\nimport XPCWrappers\n\nlet delegate = XPCServiceDelegate(exportedObject: SecretAgentInputParser())\nlet listener = NSXPCListener.service()\nlistener.delegate = delegate\nlistener.resume()\n"
  },
  {
    "path": "Sources/Secretive/App.swift",
    "content": "import SwiftUI\nimport SecretKit\nimport SecureEnclaveSecretKit\nimport SmartCardSecretKit\nimport Brief\n\n@main\nstruct Secretive: App {\n    \n    @Environment(\\.agentLaunchController) var agentLaunchController\n    @Environment(\\.justUpdatedChecker) var justUpdatedChecker\n\n    @SceneBuilder var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .environment(EnvironmentValues._secretStoreList)\n                .onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification)) { _ in\n                    Task {\n                        @AppStorage(\"defaultsHasRunSetup\") var hasRunSetup = false\n                        @AppStorage(\"explicitlyDisabled\") var explicitlyDisabled = false\n                        guard hasRunSetup && !explicitlyDisabled else { return }\n                        agentLaunchController.check()\n                        guard !agentLaunchController.developmentBuild else { return }\n                        if justUpdatedChecker.justUpdatedBuild || !agentLaunchController.running {\n                            // Relaunch the agent, since it'll be running from earlier update still\n                            try await agentLaunchController.forceLaunch()\n                        }\n                    }\n                }\n        }\n        .commands {\n            AppCommands()\n        }\n        WindowGroup(id: String(describing: IntegrationsView.self)) {\n            IntegrationsView()\n        }\n        .windowResizability(.contentMinSize)\n        WindowGroup(id: String(describing: AboutView.self)) {\n            AboutView()\n        }\n        .windowStyle(.hiddenTitleBar)\n        .windowResizability(.contentSize)\n    }\n\n}\n\nextension Secretive {\n\n    struct AppCommands: Commands {\n\n        @Environment(\\.openWindow) var openWindow\n        @Environment(\\.openURL) var openURL\n        @FocusedValue(\\.showCreateSecret) var showCreateSecret\n\n        var body: some Commands {\n            CommandGroup(replacing: .appInfo) {\n                Button(.aboutMenuBarTitle, systemImage: \"info.circle\") {\n                    openWindow(id: String(describing: AboutView.self))\n                }\n            }\n            CommandGroup(before: CommandGroupPlacement.appSettings) {\n                Button(.integrationsMenuBarTitle, systemImage: \"app.connected.to.app.below.fill\") {\n                    openWindow(id: String(describing: IntegrationsView.self))\n                }\n            }\n            CommandGroup(after: CommandGroupPlacement.newItem) {\n                Button(.appMenuNewSecretButton, systemImage: \"plus\") {\n                    showCreateSecret?()\n                }\n                .keyboardShortcut(KeyboardShortcut(KeyEquivalent(\"N\"), modifiers: [.command, .shift]))\n                .disabled(showCreateSecret?.isEnabled == false)\n            }\n            CommandGroup(replacing: .help) {\n                Button(.appMenuHelpButton) {\n                    openURL(Constants.helpURL)\n                }\n            }\n            SidebarCommands()\n        }\n    }\n\n}\n\nprivate enum Constants {\n    static let helpURL = URL(string: \"https://github.com/maxgoedjen/secretive/blob/main/FAQ.md\")!\n}\n\n\nextension EnvironmentValues {\n\n    // This is injected through .environment modifier below instead of @Entry for performance reasons (basially, restrictions around init/mainactor causing delay in loading secrets/\"empty screen\" blip).\n    @MainActor fileprivate static let _secretStoreList: SecretStoreList = {\n        let list = SecretStoreList()\n        let cryptoKit = SecureEnclave.Store()\n        let migrator = SecureEnclave.CryptoKitMigrator()\n        try? migrator.migrate(to: cryptoKit)\n        list.add(store: cryptoKit)\n        list.add(store: SmartCard.Store())\n        return list\n    }()\n\n    private static let _agentLaunchController = AgentLaunchController()\n    @Entry var agentLaunchController: any AgentLaunchControllerProtocol = _agentLaunchController\n    private static let _updater: any UpdaterProtocol = {\n        @AppStorage(\"defaultsHasRunSetup\") var hasRunSetup = false\n        return Updater(checkOnLaunch: hasRunSetup)\n    }()\n    @Entry var updater: any UpdaterProtocol = _updater\n\n    private static let _justUpdatedChecker = JustUpdatedChecker()\n    @Entry var justUpdatedChecker: any JustUpdatedCheckerProtocol = _justUpdatedChecker\n\n    @MainActor var secretStoreList: SecretStoreList {\n        EnvironmentValues._secretStoreList\n    }\n}\n\nextension FocusedValues {\n    @Entry var showCreateSecret: OpenSheet?\n}\n\nfinal class OpenSheet {\n\n    let closure: () -> Void\n    let isEnabled: Bool\n\n    init(isEnabled: Bool = true, closure: @escaping () -> Void) {\n        self.isEnabled = isEnabled\n        self.closure = closure\n    }\n\n    func callAsFunction() {\n        closure()\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/AppIcon.icon/icon.json",
    "content": "{\n  \"fill\" : {\n    \"solid\" : \"srgb:0.00000,0.53333,1.00000,0.00000\"\n  },\n  \"groups\" : [\n    {\n      \"blur-material\" : 0.5,\n      \"layers\" : [\n        {\n          \"image-name\" : \"Icon 7.png\",\n          \"name\" : \"Signature\",\n          \"position\" : {\n            \"scale\" : 1,\n            \"translation-in-points\" : [\n              64.00083178971097,\n              -58.21801551632592\n            ]\n          }\n        },\n        {\n          \"image-name\" : \"Rectangle Copy 10.png\",\n          \"name\" : \"Border\"\n        },\n        {\n          \"fill-specializations\" : [\n            {\n              \"appearance\" : \"tinted\",\n              \"value\" : {\n                \"solid\" : \"display-p3:0.00000,0.00000,0.00000,0.50000\"\n              }\n            }\n          ],\n          \"image-name\" : \"Rectangle 2 8.png\",\n          \"name\" : \"Backing\",\n          \"opacity-specializations\" : [\n            {\n              \"appearance\" : \"tinted\",\n              \"value\" : 1\n            }\n          ]\n        }\n      ],\n      \"shadow\" : {\n        \"kind\" : \"layer-color\",\n        \"opacity\" : 0.5\n      },\n      \"specular\" : true,\n      \"translucency\" : {\n        \"enabled\" : true,\n        \"value\" : 0.5\n      }\n    }\n  ],\n  \"supported-platforms\" : {\n    \"squares\" : [\n      \"macOS\"\n    ]\n  }\n}"
  },
  {
    "path": "Sources/Secretive/Controllers/AgentStatusChecker.swift",
    "content": "import Foundation\nimport AppKit\nimport SecretKit\nimport Observation\nimport OSLog\nimport ServiceManagement\nimport Common\n\n@MainActor protocol AgentLaunchControllerProtocol: Observable, Sendable {\n    var running: Bool { get }\n    var developmentBuild: Bool { get }\n    var process: NSRunningApplication? { get }\n    func check()\n    func install() async throws\n    func uninstall() async throws\n    func forceLaunch() async throws\n}\n\n@Observable @MainActor final class AgentLaunchController: AgentLaunchControllerProtocol {\n\n    var running: Bool = false\n    var process: NSRunningApplication? = nil\n    private let logger = Logger(subsystem: \"com.maxgoedjen.secretive\", category: \"LaunchAgentController\")\n    private let service = SMAppService.loginItem(identifier: Bundle.agentBundleID)\n\n    nonisolated init() {\n        Task { @MainActor in\n            check()\n        }\n    }\n\n    func check() {\n        process = instanceSecretAgentProcess\n        running = process != nil\n    }\n\n    // All processes, including ones from older versions, etc\n    var allSecretAgentProcesses: [NSRunningApplication] {\n        NSRunningApplication.runningApplications(withBundleIdentifier: Bundle.agentBundleID)\n    }\n\n    // The process corresponding to this instance of Secretive\n    var instanceSecretAgentProcess: NSRunningApplication? {\n        // TODO: CHECK VERSION\n        let agents = allSecretAgentProcesses\n        for agent in agents {\n            guard let url = agent.bundleURL else { continue }\n            if url.absoluteString.hasPrefix(Bundle.main.bundleURL.absoluteString) || (url.isXcodeURL && developmentBuild) {\n                return agent\n            }\n        }\n        return nil\n    }\n\n    // Whether Secretive is being run in an Xcode environment.\n    var developmentBuild: Bool {\n        Bundle.main.bundleURL.isXcodeURL\n    }\n\n    func install() async throws {\n        logger.debug(\"Installing agent\")\n        try? await service.unregister()\n        // This is definitely a bit of a \"seems to work better\" thing but:\n        // Seems to more reliably hit if these are on separate runloops, otherwise it seems like it sometimes doesn't kill old\n        // and start new?\n        try await Task.sleep(for: .seconds(1))\n        try service.register()\n        try await Task.sleep(for: .seconds(1))\n        check()\n    }\n\n    func uninstall() async throws {\n        logger.debug(\"Uninstalling agent\")\n        try await Task.sleep(for: .seconds(1))\n        try await service.unregister()\n        try await Task.sleep(for: .seconds(1))\n        check()\n    }\n\n    func forceLaunch() async throws {\n        logger.debug(\"Agent is not running, attempting to force launch by reinstalling\")\n        try await install()\n        if running {\n            logger.debug(\"Agent successfully force launched by reinstalling\")\n            return\n        }\n        logger.debug(\"Agent is not running, attempting to force launch by launching directly\")\n        let url = Bundle.main.bundleURL.appendingPathComponent(\"Contents/Library/LoginItems/SecretAgent.app\")\n        let config = NSWorkspace.OpenConfiguration()\n        config.activates = false\n        do {\n            try await NSWorkspace.shared.openApplication(at: url, configuration: config)\n            logger.debug(\"Agent force launched\")\n            try await Task.sleep(for: .seconds(1))\n        } catch {\n            logger.error(\"Error force launching \\(error.localizedDescription)\")\n        }\n        check()\n    }\n\n}\n\nextension URL {\n\n    var isXcodeURL: Bool {\n        absoluteString.contains(\"/Library/Developer/Xcode\")\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Controllers/ApplicationDirectoryController.swift",
    "content": "import Foundation\n\nstruct ApplicationDirectoryController {\n}\n\nextension ApplicationDirectoryController {\n\n    var isInApplicationsDirectory: Bool {\n        let bundlePath = Bundle.main.bundlePath\n        for directory in NSSearchPathForDirectoriesInDomains(.allApplicationsDirectory, .allDomainsMask, true) {\n            if bundlePath.hasPrefix(directory) {\n                return true\n            }\n        }\n        if bundlePath.contains(\"/Library/Developer/Xcode\") {\n            return true\n        }\n        return false\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Controllers/JustUpdatedChecker.swift",
    "content": "import Foundation\nimport AppKit\n\n@MainActor protocol JustUpdatedCheckerProtocol: Observable {\n    var justUpdatedBuild: Bool { get }\n    var justUpdatedOS: Bool { get }\n}\n\n@Observable @MainActor class JustUpdatedChecker: JustUpdatedCheckerProtocol {\n\n    var justUpdatedBuild: Bool = false\n    var justUpdatedOS: Bool = false\n\n    nonisolated init() {\n        Task { @MainActor in\n            check()\n        }\n    }\n\n    private func check() {\n        let lastBuild = UserDefaults.standard.object(forKey: Constants.previousVersionUserDefaultsKey) as? String\n        let lastOS = UserDefaults.standard.object(forKey: Constants.previousOSVersionUserDefaultsKey) as? String\n        let currentBuild = Bundle.main.infoDictionary![\"CFBundleShortVersionString\"] as! String\n        let osRaw = ProcessInfo.processInfo.operatingSystemVersion\n        let currentOS = \"\\(osRaw.majorVersion).\\(osRaw.minorVersion).\\(osRaw.patchVersion)\"\n        UserDefaults.standard.set(currentBuild, forKey: Constants.previousVersionUserDefaultsKey)\n        UserDefaults.standard.set(currentOS, forKey: Constants.previousOSVersionUserDefaultsKey)\n        justUpdatedBuild = lastBuild != currentBuild\n        // To prevent this showing on first lauch for every user, only show if lastBuild is non-nil.\n        justUpdatedOS = lastBuild != nil && lastOS != currentOS\n    }\n\n\n\n}\n\nextension JustUpdatedChecker {\n\n    enum Constants {\n        static let previousVersionUserDefaultsKey = \"com.maxgoedjen.Secretive.lastBuild\"\n        static let previousOSVersionUserDefaultsKey = \"com.maxgoedjen.Secretive.lastOS\"\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(CI_VERSION)</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CI_BUILD_NUMBER)</string>\n\t<key>GitHubBuildLog</key>\n\t<string>https://$(CI_BUILD_LINK)</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>$(PRODUCT_NAME) is MIT Licensed.</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>NSSupportsAutomaticTermination</key>\n\t<true/>\n\t<key>NSSupportsSuddenTermination</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/Secretive/InternetAccessPolicy.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ApplicationDescription</key>\n\t<string>Secretive is an app for storing and managing SSH keys in the Secure Enclave</string>\n\t<key>DeveloperName</key>\n\t<string>Max Goedjen</string>\n\t<key>Website</key>\n\t<string>https://github.com/maxgoedjen/secretive</string>\n\t<key>Connections</key>\n\t<array/>\n\t<key>Services</key>\n\t<array/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/Secretive/Preview Content/Preview Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sources/Secretive/Preview Content/PreviewAgentStatusChecker.swift",
    "content": "import Foundation\nimport AppKit\n\nclass PreviewAgentLaunchController: AgentLaunchControllerProtocol {\n\n    let running: Bool\n    let process: NSRunningApplication?\n    let developmentBuild = false\n\n    init(running: Bool = true, process: NSRunningApplication? = nil) {\n        self.running = running\n        self.process = process\n    }\n\n    func check() {\n    }\n\n    func install() async throws {\n    }\n\n    func uninstall() async throws {\n    }\n\n    func forceLaunch() async throws {\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Preview Content/PreviewStore.swift",
    "content": "import Foundation\nimport SecretKit\n\nenum Preview {}\n\nextension Preview {\n\n    struct Secret: SecretKit.Secret {\n\n        let id = UUID().uuidString\n        let name: String\n        let publicKey = Data(UUID().uuidString.utf8)\n        var attributes: Attributes {\n            Attributes(\n                keyType: .init(algorithm: .ecdsa, size: 256),\n                authentication: .presenceRequired,\n            )\n        }\n    }\n\n}\n\nextension Preview {\n\n    @Observable final class Store: SecretStore {\n\n        let isAvailable = true\n        let id = UUID()\n        var name: String { \"Preview Store\" }\n        let secrets: [Secret]\n\n        init(secrets: [Secret]) {\n            self.secrets = secrets\n        }\n\n        convenience init(numberOfRandomSecrets: Int = 5) {\n            let new = (0..<numberOfRandomSecrets).map { Secret(name: String(describing: $0)) }\n            self.init(secrets: new)\n        }\n\n        func sign(data: Data, with secret: Preview.Secret, for provenance: SigningRequestProvenance) throws -> Data {\n            return data\n        }\n\n        func existingPersistedAuthenticationContext(secret: Preview.Secret) -> PersistedAuthenticationContext? {\n            nil\n        }\n\n        func persistAuthentication(secret: Preview.Secret, forDuration duration: TimeInterval) throws {\n        }\n\n        func reloadSecrets() {\n        }\n\n    }\n\n    final class StoreModifiable: SecretStoreModifiable {\n        \n        let isAvailable = true\n        let id = UUID()\n        var name: String { \"Modifiable Preview Store\" }\n        let secrets: [Secret]\n        var supportedKeyTypes: KeyAvailability {\n            return KeyAvailability(\n                available: [\n                    .ecdsa256,\n                    .mldsa65,\n                    .mldsa87\n                ],\n                unavailable: [\n                    .init(keyType: .ecdsa384, reason: .macOSUpdateRequired)\n                ]\n            )\n        }\n        \n        init(secrets: [Secret]) {\n            self.secrets = secrets\n        }\n\n        convenience init(numberOfRandomSecrets: Int = 5) {\n            let new = (0..<numberOfRandomSecrets).map { Secret(name: String(describing: $0)) }\n            self.init(secrets: new)\n        }\n\n        func sign(data: Data, with secret: Preview.Secret, for provenance: SigningRequestProvenance) throws -> Data {\n            return data\n        }\n\n        func existingPersistedAuthenticationContext(secret: Preview.Secret) -> PersistedAuthenticationContext? {\n            nil\n        }\n\n        func persistAuthentication(secret: Preview.Secret, forDuration duration: TimeInterval) throws {\n        }\n\n        func reloadSecrets() {\n        }\n\n\n        func create(name: String, attributes: Attributes) throws -> Secret {\n            fatalError()\n        }\n\n        func delete(secret: Preview.Secret) throws {\n        }\n\n        func update(secret: Preview.Secret, name: String, attributes: Attributes) throws {\n        }\n    }\n}\n\nextension Preview {\n\n    @MainActor static func storeList(stores: [Store] = [], modifiableStores: [StoreModifiable] = []) -> SecretStoreList {\n        let list = SecretStoreList()\n        for store in stores {\n            list.add(store: store)\n        }\n        for storeModifiable in modifiableStores {\n            list.add(store: storeModifiable)\n        }\n        return list\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Preview Content/PreviewUpdater.swift",
    "content": "import Foundation\nimport Observation\nimport Brief\n\n@Observable @MainActor final class PreviewUpdater: UpdaterProtocol {\n\n    var update: Release? = nil\n\n    let currentVersion = SemVer(\"0.0.0_preview\")\n\n    init(update: Update = .none) {\n        switch update {\n        case .none:\n            self.update = nil\n        case .advisory:\n            self.update = Release(name: \"10.10.10\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Some regular update\")\n        case .critical:\n            self.update = Release(name: \"10.10.10\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Critical Security Update\")\n        }\n    }\n\n    func ignore(release: Release) async {\n    }\n    \n}\n\nextension PreviewUpdater {\n\n    enum Update {\n        case none, advisory, critical\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Secretive.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.hardened-process</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.enable-pure-data</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.no-tagged-receive</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.dyld-ro</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.hardened-heap</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.enhanced-security-version-string</key>\n\t<string>1</string>\n\t<key>com.apple.security.smartcard</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.platform-restrictions-string</key>\n\t<string>2</string>\n\t<key>keychain-access-groups</key>\n\t<array>\n\t\t<string>$(AppIdentifierPrefix)com.maxgoedjen.Secretive</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/Secretive/Views/Configuration/ConfigurationItemView.swift",
    "content": "import SwiftUI\n\nstruct ConfigurationItemView<Content: View>: View {\n\n    enum Action: Hashable {\n        case copy(String)\n        case revealInFinder(String)\n    }\n\n    let title: LocalizedStringResource\n    let content: Content\n    let action: Action?\n\n    init(title: LocalizedStringResource, value: String, action: Action? = nil) where Content == Text {\n        self.title = title\n        self.content = Text(value)\n            .font(.subheadline)\n            .foregroundStyle(.secondary)\n        self.action = action\n    }\n\n    init(title: LocalizedStringResource, action: Action? = nil, content: () -> Content) {\n        self.title = title\n        self.content = content()\n        self.action = action\n    }\n\n    var body: some View {\n        VStack(alignment: .leading) {\n            HStack {\n                Text(title)\n                Spacer()\n                switch action {\n                case .copy(let string):\n                    Button(.copyableClickToCopyButton, systemImage: \"doc.on.doc\") {\n                        NSPasteboard.general.declareTypes([.string], owner: nil)\n                        NSPasteboard.general.setString(string, forType: .string)\n                    }\n                    .labelStyle(.iconOnly)\n                    .buttonStyle(.borderless)\n                case .revealInFinder(let rawPath):\n                    Button(.revealInFinderButton, systemImage: \"folder\") {\n                        let (processedPath, folder) = rawPath.normalizedPathAndFolder\n                        NSWorkspace.shared.selectFile(processedPath, inFileViewerRootedAtPath: folder)\n                    }\n                    .labelStyle(.iconOnly)\n                    .buttonStyle(.borderless)\n                case nil:\n                    EmptyView()\n                }\n            }\n            content\n        }\n    }\n}\n\n"
  },
  {
    "path": "Sources/Secretive/Views/Configuration/GettingStartedView.swift",
    "content": "import SwiftUI\n\nstruct GettingStartedView: View {\n\n    private let instructions = Instructions()\n\n    @Binding var selectedInstruction: ConfigurationFileInstructions?\n\n    init(selectedInstruction: Binding<ConfigurationFileInstructions?>) {\n        _selectedInstruction = selectedInstruction\n    }\n\n    var body: some View {\n        Form {\n            Section(.integrationsGettingStartedTitle) {\n                Text(.integrationsGettingStartedTitleDescription)\n            }\n            Section {\n                Group {\n                    Text(.integrationsGettingStartedSuggestionSsh)\n                        .onTapGesture {\n                            self.selectedInstruction = instructions.ssh\n                        }\n                    VStack(alignment: .leading, spacing: 5) {\n                        Text(.integrationsGettingStartedSuggestionShell)\n                        Text(.integrationsGettingStartedSuggestionShellDefault(shellName: String(localized: instructions.defaultShell.tool)))\n                            .font(.caption2)\n                    }\n                    .onTapGesture {\n                        self.selectedInstruction = instructions.defaultShell\n                    }\n                    Text(.integrationsGettingStartedSuggestionGit)\n                        .onTapGesture {\n                            self.selectedInstruction = instructions.git\n                        }\n                }\n                .foregroundStyle(.link)\n\n            } header: {\n                Text(.integrationsGettingStartedWhatShouldIConfigureTitle)\n            }\n            footer: {\n                Text(.integrationsGettingStartedMultipleConfig)\n            }\n        }\n        .formStyle(.grouped)\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Configuration/Instructions.swift",
    "content": "import Foundation\n\nstruct Instructions {\n\n    enum Constants {\n        static let publicKeyPathPlaceholder = \"_PUBLIC_KEY_PATH_PLACEHOLDER_\"\n        static let publicKeyPlaceholder = \"_PUBLIC_KEY_PLACEHOLDER_\"\n    }\n\n    var defaultShell: ConfigurationFileInstructions {\n        zsh\n    }\n\n    var gettingStarted: ConfigurationFileInstructions = ConfigurationFileInstructions(.integrationsGettingStartedRowTitle, id: .gettingStarted)\n\n    var ssh: ConfigurationFileInstructions {\n        ConfigurationFileInstructions(\n            tool: LocalizedStringResource.integrationsToolNameSsh,\n            configPath: \"~/.ssh/config\",\n            configText: \"Host *\\n\\tIdentityAgent \\(URL.socketPath)\",\n            website: URL(string: \"https://man.openbsd.org/ssh_config.5\")!,\n            note: .integrationsSshSpecificKeyNote,\n        )\n    }\n\n    var git: ConfigurationFileInstructions {\n        ConfigurationFileInstructions(\n            tool: .integrationsToolNameGitSigning,\n            steps: [\n                .init(path: \"~/.gitconfig\", steps: [\n                    .integrationsGitStepGitconfigDescription(publicKeyPathPlaceholder: Constants.publicKeyPathPlaceholder)\n                ],\n                      note: .integrationsGitStepGitconfigSectionNote\n                ),\n                .init(\n                    path: \"~/.gitallowedsigners\",\n                    steps: [\n                        LocalizedStringResource(stringLiteral: Constants.publicKeyPlaceholder)\n                    ],\n                    note: .integrationsGitStepGitallowedsignersDescription\n                ),\n            ],\n            website:  URL(string: \"https://git-scm.com/docs/git-config\")!,\n        )\n    }\n\n    var zsh: ConfigurationFileInstructions {\n        ConfigurationFileInstructions(\n            tool: .integrationsToolNameZsh,\n            configPath: \"~/.zshrc\",\n            configText: \"export SSH_AUTH_SOCK=\\(URL.socketPath)\"\n        )\n    }\n\n    var instructions: [ConfigurationGroup] {\n        [\n            ConfigurationGroup(name: .integrationsGettingStartedSectionTitle, instructions: [\n                gettingStarted\n            ]),\n            ConfigurationGroup(\n                name: .integrationsSystemSectionTitle,\n                instructions: [\n                    ssh,\n                    git,\n                ]\n            ),\n            ConfigurationGroup(name: .integrationsShellSectionTitle, instructions: [\n                zsh,\n                ConfigurationFileInstructions(\n                    tool: .integrationsToolNameBash,\n                    configPath: \"~/.bashrc\",\n                    configText: \"export SSH_AUTH_SOCK=\\(URL.socketPath)\"\n                ),\n                ConfigurationFileInstructions(\n                    tool: .integrationsToolNameFish,\n                    configPath: \"~/.config/fish/config.fish\",\n                    configText: \"set -x SSH_AUTH_SOCK \\(URL.socketPath)\"\n                ),\n                ConfigurationFileInstructions(.integrationsOtherShellRowTitle, id: .otherShell),\n            ]),\n            ConfigurationGroup(name: .integrationsOtherSectionTitle, instructions: [\n                ConfigurationFileInstructions(.integrationsAppsRowTitle, id: .otherApp),\n            ]),\n        ]\n    }\n\n}\n\nstruct ConfigurationGroup: Identifiable {\n    let id = UUID()\n    var name: LocalizedStringResource\n    var instructions: [ConfigurationFileInstructions] = []\n}\n\nstruct ConfigurationFileInstructions: Hashable, Identifiable {\n\n    struct StepGroup: Hashable, Identifiable {\n        let path: String\n        let steps: [LocalizedStringResource]\n        let note: LocalizedStringResource?\n        var id: String { path }\n\n        init(path: String, steps: [LocalizedStringResource], note: LocalizedStringResource? = nil) {\n            self.path = path\n            self.steps = steps\n            self.note = note\n        }\n\n        func hash(into hasher: inout Hasher) {\n            id.hash(into: &hasher)\n        }\n    }\n\n    var id: ID\n    var tool: LocalizedStringResource\n    var steps: [StepGroup]\n    var requiresSecret: Bool\n    var website: URL?\n\n    init(\n        tool: LocalizedStringResource,\n        configPath: String,\n        configText: LocalizedStringResource,\n        requiresSecret: Bool = false,\n        website: URL? = nil,\n        note: LocalizedStringResource? = nil\n    ) {\n        self.id = .tool(String(localized: tool))\n        self.tool = tool\n        self.steps = [StepGroup(path: configPath, steps: [configText], note: note)]\n        self.requiresSecret = requiresSecret\n        self.website = website\n    }\n\n    init(\n        tool: LocalizedStringResource,\n        steps: [StepGroup],\n        requiresSecret: Bool = false,\n        website: URL? = nil\n    ) {\n        self.id = .tool(String(localized: tool))\n        self.tool = tool\n        self.steps = steps\n        self.requiresSecret = true\n        self.website = website\n    }\n\n    init(_ name: LocalizedStringResource, id: ID) {\n        self.id = id\n        tool = name\n        steps = []\n        requiresSecret = false\n    }\n\n    func hash(into hasher: inout Hasher) {\n        id.hash(into: &hasher)\n    }\n\n    enum ID: Identifiable, Hashable {\n        case gettingStarted\n        case tool(String)\n        case otherShell\n        case otherApp\n\n        var id: String {\n            switch self {\n            case .gettingStarted:\n                \"getting_started\"\n            case .tool(let name):\n                name\n            case .otherShell:\n                \"other_shell\"\n            case .otherApp:\n                \"other_app\"\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Configuration/IntegrationsView.swift",
    "content": "import SwiftUI\n\nstruct IntegrationsView: View {\n\n    @Environment(\\.dismiss) private var dismiss\n\n    @State private var selectedInstruction: ConfigurationFileInstructions?\n    private let instructions = Instructions()\n\n    var body: some View {\n        NavigationSplitView {\n            List(selection: $selectedInstruction) {\n                ForEach(instructions.instructions) { group in\n                    Section(group.name) {\n                        ForEach(group.instructions) { instruction in\n                            Text(instruction.tool)\n                                .padding(.vertical, 8)\n                                .tag(instruction)\n                        }\n                    }\n                }\n            }\n        } detail: {\n            IntegrationsDetailView(selectedInstruction: $selectedInstruction)\n        }\n        .toolbar {\n            Button(.setupDoneButton) {\n                dismiss()\n            }\n        }\n        .hiddenToolbar()\n        .windowBackgroundStyle(.thinMaterial)\n        .onAppear {\n            selectedInstruction = instructions.gettingStarted\n        }\n        .frame(minWidth: 400, minHeight: 400)\n    }\n\n}\n\nstruct IntegrationsDetailView: View {\n\n    @Binding private var selectedInstruction: ConfigurationFileInstructions?\n\n    init(selectedInstruction: Binding<ConfigurationFileInstructions?>) {\n        _selectedInstruction = selectedInstruction\n    }\n\n    var body: some View {\n        if let selectedInstruction {\n            switch selectedInstruction.id {\n            case .gettingStarted:\n                GettingStartedView(selectedInstruction: $selectedInstruction)\n                case .tool:\n                    ToolConfigurationView(selectedInstruction: selectedInstruction)\n                case .otherShell:\n                    Form {\n                        Section {\n                            Link(.integrationsViewOtherGithubLink, destination: URL(string: \"https://github.com/maxgoedjen/secretive-config-instructions/tree/main/shells\")!)\n                        } header: {\n                            Text(.integrationsCommunityShellListDescription)\n                                .font(.body)\n                        }\n                    }\n                    .formStyle(.grouped)\n\n                case .otherApp:\n                    Form {\n                        Section {\n                            Link(.integrationsViewOtherGithubLink, destination: URL(string: \"https://github.com/maxgoedjen/secretive-config-instructions/tree/main/apps\")!)\n                        } header: {\n                            Text(.integrationsCommunityAppsListDescription)\n                                .font(.body)\n                        }\n                    }\n                    .formStyle(.grouped)\n                }\n        }\n\n    }\n\n}\n\n#Preview {\n    IntegrationsView()\n        .frame(height: 500)\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Configuration/SetupView.swift",
    "content": "import SwiftUI\n\nstruct SetupView: View {\n\n    @Environment(\\.dismiss) private var dismiss\n    @Environment(\\.agentLaunchController) private var agentLaunchController\n    @Binding var setupComplete: Bool\n\n    @State var showingIntegrations = false\n    @State var buttonWidth: CGFloat?\n\n    @State var installed = false\n    @State var updates = false\n    @State var integrations = false\n    var allDone: Bool {\n        installed && updates && integrations\n    }\n\n    var body: some View {\n        VStack {\n            VStack(alignment: .leading, spacing: 0) {\n                StepView(\n                    title: .setupAgentTitle,\n                    description: .setupAgentDescription,\n                    detail: .setupAgentActivityMonitorDescription,\n                    systemImage: \"lock.laptopcomputer\",\n                ) {\n                    SetupButton(\n                        .setupAgentInstallButton,\n                        complete: installed,\n                        width: buttonWidth\n                    ) {\n                        installed = true\n                        Task {\n                            try? await agentLaunchController.install()\n                        }\n                    }\n                }\n                Divider()\n                StepView(\n                    title: .setupUpdatesTitle,\n                    description: .setupUpdatesDescription,\n                    systemImage: \"network.badge.shield.half.filled\",\n                ) {\n                    SetupButton(\n                        .setupUpdatesOkButton,\n                        complete: updates,\n                        width: buttonWidth\n                    ) {\n                        updates = true\n                    }\n                }\n                Divider()\n                StepView(\n                    title: .setupIntegrationsTitle,\n                    description: .setupIntegrationsDescription,\n                    systemImage: \"firewall\",\n                ) {\n                    SetupButton(\n                        .setupIntegrationsButton,\n                        complete: integrations,\n                        width: buttonWidth\n                    ) {\n                        showingIntegrations = true\n                    }\n                }\n            }\n            .onPreferenceChange(SetupButton.WidthKey.self) { width in\n                buttonWidth = width\n            }\n            .background(.white.opacity(0.1), in: RoundedRectangle(cornerRadius: 10))\n            .frame(minWidth: 600, maxWidth: .infinity)\n            HStack {\n                Spacer()\n                Button(.setupDoneButton) {\n                    setupComplete = true\n                    dismiss()\n                }\n                .disabled(!allDone)\n                .primaryButton()\n            }\n        }\n        .interactiveDismissDisabled()\n        .padding()\n        .sheet(isPresented: $showingIntegrations, onDismiss: {\n            integrations = true\n        }, content: {\n            IntegrationsView()\n                .frame(minWidth: 500, minHeight: 400)\n        })\n        .frame(idealWidth: 600)\n        .fixedSize(horizontal: false, vertical: true)\n    }\n}\n\nstruct SetupButton: View {\n\n    struct WidthKey: @MainActor PreferenceKey {\n        @MainActor static var defaultValue: CGFloat? = nil\n        static func reduce(value: inout CGFloat?, nextValue: () -> CGFloat?) {\n            if let next = nextValue(), next > (value ?? -1) {\n                value = next\n            }\n        }\n\n    }\n\n    let label: LocalizedStringResource\n    let complete: Bool\n    let action: () -> Void\n    let width: CGFloat?\n    @State var currentWidth: CGFloat?\n\n    init(_ label: LocalizedStringResource, complete: Bool, width: CGFloat? = nil, action: @escaping () -> Void) {\n        self.label = label\n        self.complete = complete\n        self.action = action\n        self.width = width\n    }\n    \n    var body: some View {\n        Button(action: action) {\n            HStack(spacing: 6) {\n                if complete {\n                    Text(.setupStepCompleteButton)\n                    Image(systemName: \"checkmark.circle.fill\")\n                } else {\n                    Text(label)\n                }\n            }\n            .frame(width: width)\n            .padding(.vertical, 2)\n            .onGeometryChange(for: CGFloat.self) { proxy in\n                proxy.size.width\n            } action: { newValue in\n                currentWidth = newValue\n            }\n        }\n        .preference(key: WidthKey.self, value: currentWidth)\n        .primaryButton()\n        .disabled(complete)\n        .tint(complete ? .green : nil)\n    }\n        \n}\n\nstruct StepView<Content: View>: View {\n    \n    let title: LocalizedStringResource\n    let icon: Image\n    let description: LocalizedStringResource\n    let detail: LocalizedStringResource?\n    let actions: Content\n    \n    init(\n        title: LocalizedStringResource,\n        description: LocalizedStringResource,\n        detail: LocalizedStringResource? = nil,\n        systemImage: String,\n        actions: () -> Content\n    ) {\n        self.title = title\n        self.icon = Image(systemName: systemImage)\n        self.description = description\n        self.detail = detail\n        self.actions = actions()\n    }\n    \n    var body: some View {\n        HStack(spacing: 0) {\n            icon\n                .resizable()\n                .aspectRatio(contentMode: .fit)\n                .frame(width: 24)\n            Spacer()\n                .frame(width: 20)\n            VStack(alignment: .leading, spacing: 4) {\n                Text(title)\n                    .fixedSize(horizontal: false, vertical: true)\n                    .bold()\n                Text(description)\n                    .fixedSize(horizontal: false, vertical: true)\n                if let detail {\n                    Text(detail)\n                        .fixedSize(horizontal: false, vertical: true)\n                        .font(.callout)\n                        .italic()\n                }\n            }\n            Spacer(minLength: 20)\n            actions\n        }\n        .padding(20)\n    }\n    \n}\n\nextension SetupView {\n\n    enum Constants {\n        static let updaterFAQURL = URL(string: \"https://github.com/maxgoedjen/secretive/blob/main/FAQ.md#whats-this-network-request-to-github\")!\n    }\n\n}\n\n#Preview {\n    SetupView(setupComplete: .constant(false))\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Configuration/ToolConfigurationView.swift",
    "content": "import SwiftUI\nimport SecretKit\nimport SSHProtocolKit\nimport Common\n\nstruct ToolConfigurationView: View {\n\n    private let instructions = Instructions()\n    let selectedInstruction: ConfigurationFileInstructions\n    \n    @Environment(\\.secretStoreList) private var secretStoreList\n\n    @State var creating = false\n    @State var selectedSecret: AnySecret?\n    @State var email = \"\"\n\n    init(selectedInstruction: ConfigurationFileInstructions) {\n        self.selectedInstruction = selectedInstruction\n    }\n\n    var body: some View {\n        Form {\n            if selectedInstruction.requiresSecret {\n                if secretStoreList.allSecrets.isEmpty {\n                    Section {\n                        Text(.integrationsConfigureUsingSecretEmptyCreate)\n                        if let store = secretStoreList.modifiableStore {\n                            HStack {\n                                Spacer()\n                                Button(.createSecretTitle) {\n                                    creating = true\n                                }\n                                .sheet(isPresented: $creating) {\n                                    CreateSecretView(store: store) { created in\n                                        selectedSecret = created\n                                    }\n                                }\n                                .fixedSize()\n                            }\n                        }\n                    }\n                } else {\n                    Section {\n                        Picker(.integrationsConfigureUsingSecretSecretTitle, selection: $selectedSecret) {\n                            if selectedSecret == nil {\n                                Text(.integrationsConfigureUsingSecretNoSecret)\n                                    .tag(nil as (AnySecret?))\n                            }\n                            ForEach(secretStoreList.allSecrets) { secret in\n                                Text(secret.name)\n                                    .tag(secret)\n                            }\n                        }\n                        TextField(text: $email, prompt: Text(.integrationsConfigureUsingEmailPlaceholder)) {\n                            Text(.integrationsConfigureUsingEmailTitle)\n                            Text(.integrationsConfigureUsingEmailSubtitle)\n                                .font(.subheadline)\n                                .foregroundStyle(.secondary)\n                        }\n                    } header: {\n                        Text(.integrationsConfigureUsingSecretHeader)\n                    }\n                    .onAppear {\n                        selectedSecret = secretStoreList.allSecrets.first\n                    }\n                }\n            }\n            ForEach(selectedInstruction.steps) { stepGroup in\n                Section {\n                    ConfigurationItemView(title: .integrationsPathTitle, value: stepGroup.path, action: .revealInFinder(stepGroup.path))\n                    ForEach(stepGroup.steps, id: \\.self.key) { step in\n                        ConfigurationItemView(title: .integrationsAddThisTitle, action: .copy(placeholdersReplaced(text: String(localized: step)))) {\n                            HStack {\n                                Text(placeholdersReplaced(text: String(localized: step)))\n                                    .padding(8)\n                                    .font(.system(.subheadline, design: .monospaced))\n                                Spacer()\n                            }\n                            .frame(maxWidth: .infinity)\n                            .background {\n                                RoundedRectangle(cornerRadius: 6)\n                                    .fill(.black.opacity(0.05))\n                                    .stroke(.separator, lineWidth: 1)\n                            }\n                        }\n                    }\n                } footer: {\n                    if let note = stepGroup.note {\n                        Text(note)\n                            .font(.caption)\n                    }\n                }\n            }\n            if let url = selectedInstruction.website {\n                Section {\n                    Link(destination: url) {\n                        VStack(alignment: .leading, spacing: 5) {\n                            Text(.integrationsWebLink)\n                                .font(.headline)\n                            Text(url.absoluteString)\n                                .font(.caption2)\n                        }\n                    }\n                }\n            }\n        }\n        .formStyle(.grouped)\n\n    }\n\n    func placeholdersReplaced(text: String) -> String {\n        guard let selectedSecret else { return text }\n        let writer = OpenSSHPublicKeyWriter()\n        let gitAllowedSignersString = [email.isEmpty ? String(localized: .integrationsConfigureUsingEmailPlaceholder) : email, writer.openSSHString(secret: selectedSecret)]\n            .joined(separator: \" \")\n        return text\n            .replacingOccurrences(of: Instructions.Constants.publicKeyPlaceholder, with: gitAllowedSignersString)\n            .replacingOccurrences(of: Instructions.Constants.publicKeyPathPlaceholder, with: URL.publicKeyPath(for: selectedSecret, in: URL.publicKeyDirectory))\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Modifiers/ActionButtonStyle.swift",
    "content": "import SwiftUI\n\nstruct PrimaryButtonModifier: ViewModifier {\n\n    @Environment(\\.colorScheme) var colorScheme\n    @Environment(\\.isEnabled) var isEnabled\n\n    func body(content: Content) -> some View {\n        // Tinted glass prominent is really hard to read on 26.0.\n        if #available(macOS 26.0, *), colorScheme == .dark, isEnabled {\n            content.buttonStyle(.glassProminent)\n        } else {\n            content.buttonStyle(.borderedProminent)\n        }\n    }\n\n}\n\nextension View {\n\n    func primaryButton() -> some View {\n        modifier(PrimaryButtonModifier())\n    }\n\n}\n\nstruct ToolbarCircleButtonModifier: ViewModifier {\n\n    func body(content: Content) -> some View {\n        if #available(macOS 26.0, *) {\n            content\n                .glassEffect(.regular.tint(.white.opacity(0.1)), in: .circle)\n        } else {\n            content\n                .buttonStyle(.borderless)\n        }\n    }\n\n}\n\nextension View {\n\n    func toolbarCircleButton() -> some View {\n        modifier(ToolbarCircleButtonModifier())\n    }\n\n}\n\nstruct NormalButtonModifier: ViewModifier {\n\n    func body(content: Content) -> some View {\n        if #available(macOS 26.0, *) {\n            content.buttonStyle(.glass)\n        } else {\n            content.buttonStyle(.bordered)\n        }\n    }\n\n}\n\nextension View {\n\n    func normalButton() -> some View {\n        modifier(NormalButtonModifier())\n    }\n\n}\n\nstruct DangerButtonModifier: ViewModifier {\n\n    @Environment(\\.colorScheme) var colorScheme\n\n    func body(content: Content) -> some View {\n        // Tinted glass prominent is really hard to read on 26.0.\n        if #available(macOS 26.0, *), colorScheme == .dark {\n            content.buttonStyle(.glassProminent)\n                .tint(.red)\n                .foregroundStyle(.white)\n        } else {\n            content.buttonStyle(.borderedProminent)\n                .tint(.red)\n                .foregroundStyle(.white)\n        }\n    }\n\n}\n\nextension View {\n\n    func danger() -> some View {\n        modifier(DangerButtonModifier())\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Modifiers/BoxBackgroundStyle.swift",
    "content": "import SwiftUI\n\nstruct BoxBackgroundModifier: ViewModifier {\n\n    let color: Color\n\n    func body(content: Content) -> some View {\n        content\n            .background {\n                RoundedRectangle(cornerRadius: 5)\n                    .fill(color.opacity(0.3))\n                    .stroke(color, lineWidth: 1)\n            }\n    }\n}\n\nextension View {\n\n    func boxBackground(color: Color) -> some View {\n        modifier(BoxBackgroundModifier(color: color))\n    }\n\n}\n\n#Preview {\n    Text(\"Hello\")\n        .boxBackground(color: .red)\n        .padding()\n    Text(\"Hello\")\n        .boxBackground(color: .orange)\n        .padding()\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Modifiers/ErrorStyle.swift",
    "content": "import SwiftUI\n\nstruct ErrorStyleModifier: ViewModifier {\n\n    func body(content: Content) -> some View {\n        content\n            .foregroundStyle(.red)\n            .font(.callout)\n    }\n    \n}\n\nextension View {\n\n    func errorStyle() -> some View {\n        modifier(ErrorStyleModifier())\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Modifiers/ToolbarButtonStyle.swift",
    "content": "import SwiftUI\n\nstruct ToolbarStatusButtonStyle: ButtonStyle {\n\n    private let lightColor: Color\n    private let darkColor: Color\n    @Environment(\\.colorScheme) var colorScheme\n    @State var hovering = false\n\n    init(color: Color) {\n        self.lightColor = color\n        self.darkColor = color\n    }\n\n    init(lightColor: Color, darkColor: Color) {\n        self.lightColor = lightColor\n        self.darkColor = darkColor\n    }\n        \n    @available(macOS 26.0, *)\n    private var glassTint: Color {\n        if !hovering {\n            colorScheme == .light ? lightColor : darkColor\n        } else {\n            colorScheme == .light ? lightColor.exposureAdjust(1) : darkColor.exposureAdjust(1)\n        }\n    }\n\n    func makeBody(configuration: Configuration) -> some View {\n        if #available(macOS 26.0, *) {\n            configuration\n                .label\n                .foregroundColor(.white)\n                .padding(EdgeInsets(top: 6, leading: 8, bottom: 6, trailing: 8))\n                .glassEffect(.regular.tint(glassTint), in: .capsule)\n                .onHover { hovering in\n                    self.hovering = hovering\n                }\n        } else {\n            configuration\n                .label\n                .padding(EdgeInsets(top: 6, leading: 8, bottom: 6, trailing: 8))\n                .background(colorScheme == .light ? lightColor : darkColor)\n                .foregroundColor(.white)\n                .clipShape(RoundedRectangle(cornerRadius: 5))\n                .overlay(\n                    RoundedRectangle(cornerRadius: 5)\n                        .stroke(colorScheme == .light ? .black.opacity(0.15) : .white.opacity(0.15), lineWidth: 1)\n                        .background(hovering ? (colorScheme == .light ? .black.opacity(0.1) : .white.opacity(0.05)) : Color.clear)\n                )\n                .onHover { hovering in\n                    withAnimation {\n                        self.hovering = hovering\n                    }\n                }\n        }\n    }\n}\n\nstruct ToolbarButtonStyle: PrimitiveButtonStyle {\n\n    var tint: Color = .white.opacity(0.1)\n\n    func makeBody(configuration: Configuration) -> some View {\n        if #available(macOS 26.0, *) {\n            configuration\n                .label\n                .padding(.vertical, 10)\n                .padding(.horizontal, 12)\n                .glassEffect(.regular.interactive().tint(tint))\n                .onTapGesture {\n                    configuration.trigger()\n                }\n        } else {\n            BorderedButtonStyle().makeBody(configuration: configuration)\n                .padding(EdgeInsets(top: 6, leading: 8, bottom: 6, trailing: 8))\n                .foregroundColor(.white)\n                .clipShape(RoundedRectangle(cornerRadius: 5))\n        }\n    }\n}\n\n"
  },
  {
    "path": "Sources/Secretive/Views/Modifiers/WindowBackgroundStyle.swift",
    "content": "import SwiftUI\n\nstruct WindowBackgroundStyleModifier: ViewModifier {\n\n    let shapeStyle: any ShapeStyle\n\n    func body(content: Content) -> some View {\n        if #available(macOS 15.0, *) {\n            content\n                .containerBackground(\n                    shapeStyle, for: .window\n                )\n        } else {\n            content\n        }\n    }\n\n}\n\nextension View {\n\n    func windowBackgroundStyle(_ style: some ShapeStyle) -> some View {\n        modifier(WindowBackgroundStyleModifier(shapeStyle: style))\n    }\n\n}\n\nstruct HiddenToolbarModifier: ViewModifier {\n\n    func body(content: Content) -> some View {\n        if #available(macOS 15.0, *) {\n            content\n                .toolbarBackgroundVisibility(.hidden, for: .automatic)\n        } else {\n            content\n        }\n    }\n\n}\n\nextension View {\n\n    func hiddenToolbar() -> some View {\n        modifier(HiddenToolbarModifier())\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/CreateSecretView.swift",
    "content": "import SwiftUI\nimport SecretKit\n\nstruct CreateSecretView<StoreType: SecretStoreModifiable>: View {\n\n    @State var store: StoreType\n    @Environment(\\.dismiss) private var dismiss\n    var createdSecret: (AnySecret?) -> Void\n\n    @State private var name = \"\"\n    @State private var keyAttribution = \"\"\n    @State private var authenticationRequirement: AuthenticationRequirement = .presenceRequired\n    @State private var keyType: KeyType?\n    @State var advanced = false\n    @State var errorText: String?\n\n    private var authenticationOptions: [AuthenticationRequirement] {\n        if advanced || authenticationRequirement == .biometryCurrent {\n            [.presenceRequired, .notRequired, .biometryCurrent]\n        } else {\n            [.presenceRequired, .notRequired]\n        }\n    }\n\n    var body: some View {\n        VStack(alignment: .trailing) {\n            Form {\n                Section {\n                    TextField(String(localized: .createSecretNameLabel), text: $name, prompt: Text(.createSecretNamePlaceholder))\n                    VStack(alignment: .leading, spacing: 10) {\n                        Picker(.createSecretProtectionLevelTitle, selection: $authenticationRequirement) {\n                            ForEach(authenticationOptions) { option in\n                                HStack {\n                                    switch option {\n                                    case .notRequired:\n                                        Image(systemName: \"bell\")\n                                        Text(.createSecretNotifyTitle)\n                                    case .presenceRequired:\n                                        Image(systemName: \"lock\")\n                                        Text(.createSecretRequireAuthenticationTitle)\n                                    case .biometryCurrent:\n                                        Image(systemName: \"lock.trianglebadge.exclamationmark.fill\")\n                                        Text(.createSecretRequireAuthenticationBiometricCurrentTitle)\n                                    case .unknown:\n                                        EmptyView()\n                                    }\n                                }\n                                .tag(option)\n                            }\n                        }\n                        Group {\n                            switch  authenticationRequirement {\n                            case .notRequired:\n                                Text(.createSecretNotifyDescription)\n                            case .presenceRequired:\n                                Text(.createSecretRequireAuthenticationDescription)\n                            case .biometryCurrent:\n                                Text(.createSecretRequireAuthenticationBiometricCurrentDescription)\n                            case .unknown:\n                                EmptyView()\n                            }\n                        }\n                        .font(.subheadline)\n                        .foregroundStyle(.secondary)\n                        if authenticationRequirement == .biometryCurrent {\n                            Text(.createSecretBiometryCurrentWarning)\n                                .padding(.horizontal, 10)\n                                .padding(.vertical, 3)\n                                .boxBackground(color: .red)\n                        }\n\n                    }\n                }\n                if advanced {\n                    Section {\n                        VStack {\n                            Picker(.createSecretKeyTypeLabel, selection: $keyType) {\n                                ForEach(store.supportedKeyTypes.available, id: \\.self) { option in\n                                    Text(String(describing: option))\n                                        .tag(option)\n                                }\n                                Divider()\n                                ForEach(store.supportedKeyTypes.unavailable, id: \\.keyType) { option in\n                                    VStack {\n                                        Button {\n                                        } label: {\n                                            Text(String(describing: option.keyType))\n                                            switch option.reason {\n                                            case .macOSUpdateRequired:\n                                                Text(.createSecretKeyTypeMacOSUpdateRequiredLabel)\n                                            }\n                                        }\n                                    }\n                                    .selectionDisabled()\n                                }\n                            }\n                            if keyType?.algorithm == .mldsa {\n                                Text(.createSecretMldsaWarning)\n                                    .padding(.horizontal, 10)\n                                    .padding(.vertical, 3)\n                                    .boxBackground(color: .orange)\n                            }\n                        }\n                        VStack(alignment: .leading) {\n                            TextField(.createSecretKeyAttributionLabel, text: $keyAttribution, prompt: Text(verbatim: \"test@example.com\"))\n                            Text(.createSecretKeyAttributionDescription)\n                                .font(.subheadline)\n                                .foregroundStyle(.secondary)\n                        }\n                    }\n                }\n                if let errorText {\n                    Section {\n                    } footer: {\n                        Text(verbatim: errorText)\n                            .errorStyle()\n                    }\n                }\n            }\n            HStack {\n                Toggle(.createSecretAdvancedLabel, isOn: $advanced)\n                    .toggleStyle(.button)\n                Spacer()\n                Button(.createSecretCancelButton, role: .cancel) {\n                    dismiss()\n                }\n                Button(.createSecretCreateButton, action: save)\n                    .keyboardShortcut(.return)\n                    .primaryButton()\n                    .disabled(name.isEmpty)\n            }\n            .padding()\n        }\n        .onAppear {\n            keyType = store.supportedKeyTypes.available.first\n        }\n        .formStyle(.grouped)\n    }\n\n    func save() {\n        let attribution = keyAttribution.isEmpty ? nil : keyAttribution\n        Task {\n            do {\n                let new = try await store.create(\n                    name: name,\n                    attributes: .init(\n                        keyType: keyType!,\n                        authentication: authenticationRequirement,\n                        publicKeyAttribution: attribution\n                    )\n                )\n                createdSecret(AnySecret(new))\n                dismiss()\n            } catch {\n                errorText = error.localizedDescription\n            }\n        }\n    }\n\n}\n\n//#Preview {\n//    CreateSecretView(store: Preview.StoreModifiable()) { _ in }\n//}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/DeleteSecretView.swift",
    "content": "import SwiftUI\nimport SecretKit\n\nextension View {\n\n    func showingDeleteConfirmation(isPresented: Binding<Bool>, _ secret: AnySecret,  _ store: AnySecretStoreModifiable?, dismissalBlock: @escaping (Bool) -> ()) -> some View {\n        modifier(DeleteSecretConfirmationModifier(isPresented: isPresented, secret: secret, store: store, dismissalBlock: dismissalBlock))\n    }\n\n}\n\nstruct DeleteSecretConfirmationModifier: ViewModifier {\n\n    var isPresented: Binding<Bool>\n    var secret: AnySecret\n    var store: AnySecretStoreModifiable?\n    var dismissalBlock: (Bool) -> ()\n    @State var confirmedSecretName = \"\"\n    @State private var errorText: String?\n\n    func body(content: Content) -> some View {\n        content\n            .confirmationDialog(\n                .deleteConfirmationTitle(secretName: secret.name),\n                isPresented: isPresented,\n                titleVisibility: .visible,\n                actions: {\n                    TextField(secret.name, text: $confirmedSecretName)\n                    if let errorText {\n                        Text(verbatim: errorText)\n                            .errorStyle()\n                    }\n                    Button(.deleteConfirmationDeleteButton, action: delete)\n                        .disabled(confirmedSecretName != secret.name)\n                    Button(.deleteConfirmationCancelButton, role: .cancel) {\n                        dismissalBlock(false)\n                    }\n                },\n                message: {\n                    Text(.deleteConfirmationDescription(secretName: secret.name, confirmSecretName: secret.name))\n                }\n            )\n            .dialogIcon(Image(systemName: \"lock.trianglebadge.exclamationmark.fill\"))\n            .onExitCommand {\n                dismissalBlock(false)\n            }\n    }\n\n    func delete() {\n        Task {\n            do {\n                try await store!.delete(secret: secret)\n                dismissalBlock(true)\n            } catch {\n                errorText = error.localizedDescription\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/EditSecretView.swift",
    "content": "import SwiftUI\nimport SecretKit\n\nstruct EditSecretView<StoreType: SecretStoreModifiable>: View {\n\n    let store: StoreType\n    let secret: StoreType.SecretType\n\n    @State private var name: String\n    @State private var publicKeyAttribution: String\n    @State var errorText: String?\n\n    @Environment(\\.dismiss) var dismiss\n\n    init(store: StoreType, secret: StoreType.SecretType) {\n        self.store = store\n        self.secret = secret\n        name = secret.name\n        publicKeyAttribution = secret.publicKeyAttribution ?? \"\"\n    }\n\n    var body: some View {\n        VStack(alignment: .trailing) {\n            Form {\n                Section {\n                    TextField(String(localized: .createSecretNameLabel), text: $name, prompt: Text(.createSecretNamePlaceholder))\n                    VStack(alignment: .leading) {\n                        TextField(.createSecretKeyAttributionLabel, text: $publicKeyAttribution, prompt: Text(verbatim: \"test@example.com\"))\n                        Text(.createSecretKeyAttributionDescription)\n                            .font(.subheadline)\n                            .foregroundStyle(.secondary)\n                    }\n                } footer: {\n                    if let errorText {\n                        Text(verbatim: errorText)\n                            .errorStyle()\n                    }\n                }\n            }\n            HStack {\n                Button(.editCancelButton) {\n                    dismiss()\n                }\n                .keyboardShortcut(.cancelAction)\n                Button(.editSaveButton, action: rename)\n                    .disabled(name.isEmpty)\n                    .keyboardShortcut(.return)\n                    .primaryButton()\n            }\n            .padding()\n        }\n        .formStyle(.grouped)\n    }\n\n    func rename() {\n        var attributes = secret.attributes\n        attributes.publicKeyAttribution = publicKeyAttribution.isEmpty ? nil : publicKeyAttribution\n        Task {\n            do {\n                try await store.update(secret: secret, name: name, attributes: attributes)\n                dismiss()\n            } catch {\n                errorText = error.localizedDescription\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/EmptyStoreView.swift",
    "content": "import SwiftUI\nimport SecretKit\n\nstruct EmptyStoreView: View {\n\n    @State var store: AnySecretStore?\n    \n    var body: some View {\n        if store is AnySecretStoreModifiable {\n            EmptyStoreModifiableView()\n        } else {\n            EmptyStoreImmutableView()\n        }\n    }\n}\n\nstruct EmptyStoreImmutableView: View {\n    \n    var body: some View {\n        VStack {\n            Text(.emptyStoreNonmodifiableTitle).bold()\n            Text(.emptyStoreNonmodifiableDescription)\n            Text(.emptyStoreNonmodifiableSupportedKeyTypes)\n        }.frame(maxWidth: .infinity, maxHeight: .infinity)\n    }\n    \n}\n\nstruct EmptyStoreModifiableView: View {\n\n    @Environment(\\.justUpdatedChecker) var justUpdatedChecker\n\n    var body: some View {\n        GeometryReader { windowGeometry in\n            VStack {\n                GeometryReader { g in\n                    Path { path in\n                        path.move(to: CGPoint(x: g.size.width / 2, y: g.size.height))\n                        path.addCurve(to:\n                            CGPoint(x: g.size.width * (3/4), y: g.size.height * (1/2)), control1:\n                            CGPoint(x: g.size.width / 2, y: g.size.height * (1/2)), control2:\n                            CGPoint(x: g.size.width * (3/4), y: g.size.height * (1/2)))\n                        path.addCurve(to:\n                            CGPoint(x: g.size.width - 13, y: 0), control1:\n                            CGPoint(x: g.size.width - 13 , y: g.size.height * (1/2)), control2:\n                            CGPoint(x: g.size.width - 13, y: 0))\n                    }.stroke(style: StrokeStyle(lineWidth: 5, lineCap: .round))\n                    Path { path in\n                        path.move(to: CGPoint(x: g.size.width - 23, y: 0))\n                        path.addLine(to: CGPoint(x: g.size.width - 13, y: -10))\n                        path.addLine(to: CGPoint(x: g.size.width - 3, y: 0))\n                    }.fill()\n                }.frame(height: (windowGeometry.size.height/2) - 20).padding()\n                Text(.emptyStoreModifiableClickHereTitle).bold()\n                Text(.emptyStoreModifiableClickHereDescription)\n                if justUpdatedChecker.justUpdatedOS {\n                    Spacer()\n                        .frame(height: 20)\n                    VStack(spacing: 10) {\n                        Text(.emptyStoreModifiableEmptyOsWarningTitle)\n                            .font(.title2)\n                            .bold()\n                        Text(.emptyStoreModifiableEmptyOsWarningDescription)\n                            .fixedSize(horizontal: false, vertical: true)\n                            .bold()\n                    }\n                    .padding()\n                    .boxBackground(color: .orange)\n                    .padding()\n                }\n                Spacer()\n            }.frame(maxWidth: .infinity, maxHeight: .infinity)\n        }\n    }\n}\n\n\n#Preview {\n    EmptyStoreImmutableView()\n}\n#Preview {\n    EmptyStoreImmutableView()\n//        .environment(\\.justUpdatedChecker, <#T##value: V##V#>)\n}\n#Preview {\n    EmptyStoreModifiableView()\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/NoStoresView.swift",
    "content": "import SwiftUI\n\nstruct NoStoresView: View {\n\n    var body: some View {\n        VStack {\n            Text(.noSecureStorageTitle)\n                .bold()\n            Text(.noSecureStorageDescription)\n            Link(.noSecureStorageYubicoLink, destination: URL(string: \"https://www.yubico.com/products/compare-yubikey-5-series/\")!)\n        }.padding()\n    }\n    \n}\n\n#Preview {\n    NoStoresView()\n}\n\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/SecretDetailView.swift",
    "content": "import SwiftUI\nimport SecretKit\nimport Common\nimport SSHProtocolKit\n\nstruct SecretDetailView<SecretType: Secret>: View {\n    \n    let secret: SecretType\n\n    private let keyWriter = OpenSSHPublicKeyWriter()\n\n    var body: some View {\n        ScrollView {\n            Form {\n                Section {\n                    CopyableView(title: .secretDetailSha256FingerprintLabel, image: Image(systemName: \"touchid\"), text: keyWriter.openSSHSHA256Fingerprint(secret: secret))\n                    Spacer()\n                        .frame(height: 20)\n                    CopyableView(title: .secretDetailMd5FingerprintLabel, image: Image(systemName: \"touchid\"), text: keyWriter.openSSHMD5Fingerprint(secret: secret))\n                    Spacer()\n                        .frame(height: 20)\n                    CopyableView(title: .secretDetailPublicKeyLabel, image: Image(systemName: \"key\"), text: keyString)\n                    Spacer()\n                        .frame(height: 20)\n                    CopyableView(title: .secretDetailPublicKeyPathLabel, image: Image(systemName: \"lock.doc\"), text: URL.publicKeyPath(for: secret, in: URL.publicKeyDirectory), showRevealInFinder: true)\n                    Spacer()\n                }\n            }\n            .padding()\n        }\n        .frame(minHeight: 200, maxHeight: .infinity)\n    }\n\n\n    var keyString: String {\n        keyWriter.openSSHString(secret: secret)\n    }\n\n}\n\n//#Preview {\n//    SecretDetailView(secret: Preview.Secret(name: \"Demonstration Secret\"))\n//}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/SecretListItemView.swift",
    "content": "import SwiftUI\nimport SecretKit\n\nstruct SecretListItemView: View {\n    \n    @State var store: AnySecretStore\n    var secret: AnySecret\n    \n    @State var isDeleting: Bool = false\n    @State var isRenaming: Bool = false\n    \n    var deletedSecret: (AnySecret) -> Void\n    var renamedSecret: (AnySecret) -> Void\n    \n    var body: some View {\n        NavigationLink(value: secret) {\n            if secret.authenticationRequirement.required {\n                HStack {\n                    Text(secret.name)\n                    Spacer()\n                    Image(systemName: \"lock\")\n                }\n            } else {\n                Text(secret.name)\n            }\n        }\n        .sheet(isPresented: $isRenaming, onDismiss: {\n            renamedSecret(secret)\n        }, content: {\n            if let modifiable = store as? AnySecretStoreModifiable {\n                EditSecretView(store: modifiable, secret: secret)\n            }\n        })\n        .showingDeleteConfirmation(isPresented: $isDeleting, secret, store as? AnySecretStoreModifiable) { deleted in\n            if deleted {\n                deletedSecret(secret)\n            }\n        }\n        .contextMenu {\n            if store is AnySecretStoreModifiable {\n                Button(action: { isRenaming = true }) {\n                    Image(systemName: \"pencil\")\n                    Text(.secretListEditButton)\n                }\n                Button(action: { isDeleting = true }) {\n                    Image(systemName: \"trash\")\n                    Text(.secretListDeleteButton)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Secrets/StoreListView.swift",
    "content": "import SwiftUI\nimport SecretKit\n\nstruct StoreListView: View {\n\n    @Binding var activeSecret: AnySecret?\n\n    @Environment(\\.secretStoreList) private var storeList\n\n    private func secretDeleted(secret: AnySecret) {\n        activeSecret = nextDefaultSecret\n    }\n\n    private func secretRenamed(secret: AnySecret) {\n        // Pull new version from store, so we get all updated attributes\n        activeSecret = nil\n        activeSecret = storeList.allSecrets.first(where: { $0.id == secret.id })\n    }\n\n    var body: some View {\n        NavigationSplitView {\n            List(selection: $activeSecret) {\n                ForEach(storeList.stores) { store in\n                    if store.isAvailable {\n                        Section(header: Text(store.name)) {\n                            ForEach(store.secrets) { secret in\n                                SecretListItemView(\n                                    store: store,\n                                    secret: secret,\n                                    deletedSecret: secretDeleted,\n                                    renamedSecret: secretRenamed,\n                                )\n                            }\n                        }\n                    }\n                }\n            }\n        } detail: {\n            if let activeSecret {\n                SecretDetailView(secret: activeSecret)\n            } else if let nextDefaultSecret {\n                // This just means onAppear hasn't executed yet.\n                // Do this to avoid a blip.\n                SecretDetailView(secret: nextDefaultSecret)\n            } else {\n                if let modifiable = storeList.modifiableStore, modifiable.isAvailable {\n                    EmptyStoreView(store: modifiable)\n                } else {\n                    EmptyStoreView(store: storeList.stores.first(where: \\.isAvailable))\n                }\n            }\n        }\n        .navigationSplitViewStyle(.balanced)\n        .onAppear {\n            activeSecret = nextDefaultSecret\n        }\n        .frame(minWidth: 100, idealWidth: 240)\n\n    }\n}\n\nextension StoreListView {\n\n    private var nextDefaultSecret: AnySecret? {\n        return storeList.allSecrets.first\n    }\n    \n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Views/AboutView.swift",
    "content": "import SwiftUI\n\nstruct AboutView: View {\n    var body: some View {\n        if #available(macOS 15.0, *) {\n            AboutViewContent()\n                .containerBackground(\n                    .thinMaterial, for: .window\n                )\n        } else {\n            AboutViewContent()\n        }\n    }\n}\n\nstruct AboutViewContent: View {\n\n    @Environment(\\.openURL) var openURL\n    var body: some View {\n        VStack(spacing: 10) {\n            HStack {\n                Image(nsImage: NSApplication.shared.applicationIconImage)\n                VStack(alignment: .leading) {\n                    Text(verbatim: \"Secretive\")\n                        .font(.system(.largeTitle, weight: .bold))\n                    Text(\"**\\(Bundle.main.versionNumber)** (\\(Bundle.main.buildNumber))\")\n                        .fixedSize(horizontal: true, vertical: false)\n                    HStack {\n                        Button(.aboutViewOnGithubButton) {\n                            openURL(URL(string: \"https://github.com/maxgoedjen/secretive\")!)\n                        }\n                            .normalButton()\n                        Button(.aboutBuildLogButton) {\n                            openURL(Bundle.main.buildLog)\n                        }\n                        .normalButton()\n                    }\n                }\n            }\n            Text(.aboutThanks(contributorsLink: \"https://github.com/maxgoedjen/secretive/graphs/contributors\", sponsorsLink: \"https://github.com/sponsors/maxgoedjen\"))\n                .font(.headline)\n            Text(.aboutOpenSourceNotice)\n                .font(.subheadline)\n        }\n        .padding(EdgeInsets(top: 10, leading: 30, bottom: 30, trailing: 30))\n    }\n\n}\n\nprivate extension Bundle {\n\n    var buildLog: URL {\n        URL(string: infoDictionary![\"GitHubBuildLog\"] as! String)!\n    }\n\n    var versionNumber: String {\n        infoDictionary?[\"CFBundleShortVersionString\"] as? String ?? \"0.0.0\"\n    }\n\n    var buildNumber: String {\n        infoDictionary?[\"CFBundleVersion\"] as? String ?? \"0.0\"\n    }\n\n}\n\n#Preview {\n    AboutView()\n        .frame(width: 500, height: 250)\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Views/AgentStatusView.swift",
    "content": "import SwiftUI\n\nstruct AgentStatusView: View {\n\n    @Environment(\\.agentLaunchController) private var agentLaunchController: any AgentLaunchControllerProtocol\n\n    var body: some View {\n        if agentLaunchController.running {\n            AgentRunningView()\n        } else {\n            AgentNotRunningView()\n        }\n    }\n}\nstruct AgentRunningView: View {\n\n    @Environment(\\.agentLaunchController) private var agentLaunchController: any AgentLaunchControllerProtocol\n    @AppStorage(\"explicitlyDisabled\") var explicitlyDisabled = false\n\n    var body: some View {\n        Form {\n            Section {\n                if let process = agentLaunchController.process {\n                    ConfigurationItemView(\n                        title: .agentDetailsLocationTitle,\n                        value: process.bundleURL!.path(),\n                        action: .revealInFinder(process.bundleURL!.path()),\n                    )\n                    ConfigurationItemView(\n                        title: .agentDetailsSocketPathTitle,\n                        value: URL.socketPath,\n                        action: .copy(URL.socketPath),\n                    )\n                    ConfigurationItemView(\n                        title: .agentDetailsVersionTitle,\n                        value: Bundle(url: process.bundleURL!)!.infoDictionary![\"CFBundleShortVersionString\"] as! String\n                    )\n                    if let launchDate = process.launchDate {\n                        ConfigurationItemView(\n                            title: .agentDetailsRunningSinceTitle,\n                            value: launchDate.formatted()\n                        )\n                    }\n                }\n            } header: {\n                Text(.agentRunningNoticeDetailTitle)\n                    .font(.headline)\n                    .padding(.top)\n            } footer: {\n                VStack(alignment: .leading, spacing: 10) {\n                    Text(.agentRunningNoticeDetailDescription)\n                    HStack {\n                        Spacer()\n                        Menu(.agentDetailsRestartAgentButton) {\n                            Button(.agentDetailsDisableAgentButton) {\n                                Task {\n                                    explicitlyDisabled = true\n                                    try? await agentLaunchController\n                                        .uninstall()\n                                }\n                            }\n                        } primaryAction: {\n                            Task {\n                                try? await agentLaunchController.forceLaunch()\n                            }\n                        }\n                    }\n                }\n                .padding(.vertical)\n            }\n\n        }\n        .formStyle(.grouped)\n        .frame(width: 400)\n    }\n\n}\n\nstruct AgentNotRunningView: View {\n\n    @Environment(\\.agentLaunchController) private var agentLaunchController\n    @State var triedRestart = false\n    @State var loading = false\n    @AppStorage(\"explicitlyDisabled\") var explicitlyDisabled = false\n\n    var body: some View {\n        Form {\n            Section {\n            } header: {\n                Text(.agentNotRunningNoticeTitle)\n                    .font(.headline)\n                    .padding(.top)\n            } footer: {\n                VStack(alignment: .leading, spacing: 10) {\n                    Text(.agentNotRunningNoticeDetailDescription)\n                    HStack {\n                        if !triedRestart {\n                            Spacer()\n                            Button {\n                                explicitlyDisabled = false\n                                guard !loading else { return }\n                                loading = true\n                                Task {\n                                    try await agentLaunchController.forceLaunch()\n                                    loading = false\n\n                                    if !agentLaunchController.running {\n                                        triedRestart = true\n                                    }\n                                }\n                            } label: {\n                                if !loading {\n                                    Text(.agentDetailsStartAgentButton)\n                                } else {\n                                    HStack {\n                                        Text(.agentDetailsStartAgentButtonStarting)\n                                        ProgressView()\n                                            .controlSize(.mini)\n                                    }\n                                }\n                            }\n                            .primaryButton()\n                        } else {\n                            Text(.agentDetailsCouldNotStartError)\n                                .bold()\n                                .foregroundStyle(.red)\n                        }\n                    }\n                }\n                .padding(.bottom)\n            }\n        }\n        .formStyle(.grouped)\n        .frame(width: 400)\n    }\n\n}\n\n//#Preview {\n//    AgentStatusView()\n//        .environment(\\.agentLaunchController, PreviewAgentLaunchController(running: false))\n//}\n//#Preview {\n//    AgentStatusView()\n//        .environment(\\.agentLaunchController, PreviewAgentLaunchController(running: true, process: .current))\n//}\n"
  },
  {
    "path": "Sources/Secretive/Views/Views/ContentView.swift",
    "content": "import SwiftUI\nimport SecretKit\nimport SecureEnclaveSecretKit\nimport SmartCardSecretKit\nimport Brief\n\nstruct ContentView: View {\n\n    @State var activeSecret: AnySecret?\n\n    @State private var selectedUpdate: Release?\n\n    @Environment(\\.colorScheme) private var colorScheme\n    @Environment(\\.openWindow) private var openWindow\n    @Environment(\\.secretStoreList) private var storeList\n    @Environment(\\.updater) private var updater\n    @Environment(\\.agentLaunchController) private var agentLaunchController\n\n    @AppStorage(\"defaultsHasRunSetup\") private var hasRunSetup = false\n    @State private var showingCreation = false\n    @State private var showingAppPathNotice = false\n    @State private var runningSetup = false\n    @State private var showingAgentInfo = false\n\n    var body: some View {\n        VStack {\n            if storeList.anyAvailable {\n                StoreListView(activeSecret: $activeSecret)\n            } else {\n                NoStoresView()\n            }\n        }\n        .frame(minWidth: 640, minHeight: 320)\n        .toolbar {\n            toolbarItem(updateNoticeView, id: \"update\")\n            toolbarItem(runningOrRunSetupView, id: \"setup\")\n            toolbarItem(appPathNoticeView, id: \"appPath\")\n            toolbarItem(newItemView, id: \"new\")\n        }\n        .onAppear {\n            if !hasRunSetup {\n                runningSetup = true\n            }\n        }\n        .focusedSceneValue(\\.showCreateSecret,  .init(isEnabled: !runningSetup) {\n            showingCreation = true\n        })\n        .sheet(isPresented: $showingCreation) {\n            if let modifiable = storeList.modifiableStore {\n                CreateSecretView(store: modifiable) { created in\n                    if let created {\n                        activeSecret = created\n                    }\n                }\n            }\n        }\n        .sheet(isPresented: $runningSetup) {\n            SetupView(setupComplete: $hasRunSetup)\n        }\n    }\n\n}\n\nextension ContentView {\n\n\n    @ToolbarContentBuilder\n    func toolbarItem(_ view: some View, id: String) -> some ToolbarContent {\n        if #available(macOS 26.0, *) {\n            ToolbarItem(id: id) { view }\n                .sharedBackgroundVisibility(.hidden)\n        } else {\n            ToolbarItem(id: id) { view }\n        }\n    }\n\n    /// Item either showing a \"everything's good, here's more info\" or \"something's wrong, re-run setup\" message\n    /// These two are mutually exclusive\n    @ViewBuilder\n    var runningOrRunSetupView: some View {\n        agentStatusToolbarView\n    }\n\n    var updateNoticeContent: (LocalizedStringResource, Color)? {\n        guard let update = updater.update else { return nil }\n        if update.critical {\n            return (.updateCriticalNoticeTitle, .red)\n        } else {\n            if updater.currentVersion.isTestBuild {\n                return (.updateTestNoticeTitle, .blue)\n            } else {\n                return (.updateNormalNoticeTitle, .orange)\n            }\n        }\n    }\n\n    @ViewBuilder\n    var updateNoticeView: some View {\n        if let update = updater.update, let (text, color) = updateNoticeContent {\n            Button(action: {\n                selectedUpdate = update\n            }, label: {\n                Text(text)\n                    .font(.headline)\n                    .foregroundColor(.white)\n            })\n            .buttonStyle(ToolbarStatusButtonStyle(color: color))\n            .sheet(item: $selectedUpdate) { update in\n                UpdateDetailView(update: update)\n            }\n        }\n    }\n\n    @ViewBuilder\n    var newItemView: some View {\n        if storeList.modifiableStore?.isAvailable ?? false {\n            Button(.appMenuNewSecretButton, systemImage: \"plus\") {\n                showingCreation = true\n            }\n            .toolbarCircleButton()\n        }\n    }\n\n    @ViewBuilder\n    var agentStatusToolbarView: some View {\n        Button(action: {\n            showingAgentInfo = true\n        }, label: {\n            HStack {\n                if agentLaunchController.running {\n                    Text(.agentRunningNoticeTitle)\n                        .font(.headline)\n                        .foregroundColor(colorScheme == .light ? Color(white: 0.3) : .white)\n                    Circle()\n                        .frame(width: 10, height: 10)\n                        .foregroundColor(Color.green)\n                } else {\n                    Text(.agentNotRunningNoticeTitle)\n                        .font(.headline)\n                    Circle()\n                        .frame(width: 10, height: 10)\n                        .foregroundColor(Color.red)\n                }\n            }\n        })\n        .buttonStyle(\n            ToolbarStatusButtonStyle(\n                lightColor: agentLaunchController.running ? .black.opacity(0.05) : .red.opacity(0.75),\n                darkColor: agentLaunchController.running ? .white.opacity(0.05) : .red.opacity(0.5),\n            )\n        )\n        .popover(isPresented: $showingAgentInfo, attachmentAnchor: attachmentAnchor, arrowEdge: .bottom) {\n            AgentStatusView()\n        }\n    }\n\n    @ViewBuilder\n    var appPathNoticeView: some View {\n        if !ApplicationDirectoryController().isInApplicationsDirectory {\n            Button(action: {\n                showingAppPathNotice = true\n            }, label: {\n                Group {\n                    Text(.appNotInApplicationsNoticeTitle)\n                }\n                .font(.headline)\n                .foregroundColor(.white)\n            })\n            .buttonStyle(ToolbarStatusButtonStyle(color: .orange))\n            .confirmationDialog(.appNotInApplicationsNoticeTitle, isPresented: $showingAppPathNotice) {\n                Button(.appNotInApplicationsNoticeCancelButton, role:  .cancel) {\n                }\n                Button(.appNotInApplicationsNoticeQuitButton) {\n                    NSWorkspace.shared.selectFile(Bundle.main.bundlePath, inFileViewerRootedAtPath: Bundle.main.bundlePath)\n                    NSApplication.shared.terminate(nil)\n                }\n            } message: {\n                Text(.appNotInApplicationsNoticeDetailDescription)\n            }\n            .dialogIcon(Image(systemName: \"folder.fill.badge.questionmark\"))\n        }\n    }\n\n    var attachmentAnchor: PopoverAttachmentAnchor {\n        .rect(.bounds)\n    }\n\n}\n\n\n//#Preview {\n//    // Empty on modifiable and nonmodifiable\n//    ContentView(showingCreation: .constant(false), runningSetup: .constant(false), hasRunSetup: .constant(true))\n//        .environment(Preview.storeList(stores: [Preview.Store(numberOfRandomSecrets: 0)], modifiableStores: [Preview.StoreModifiable(numberOfRandomSecrets: 0)]))\n//        .environment(PreviewUpdater())\n//}\n//\n//#Preview {\n//    // 5 items on modifiable and nonmodifiable\n//    ContentView(showingCreation: .constant(false), runningSetup: .constant(false), hasRunSetup: .constant(true))\n//        .environment(Preview.storeList(stores: [Preview.Store()], modifiableStores: [Preview.StoreModifiable()]))\n//        .environment(PreviewUpdater())\n//}\n"
  },
  {
    "path": "Sources/Secretive/Views/Views/CopyableView.swift",
    "content": "import SwiftUI\nimport UniformTypeIdentifiers\n\nstruct CopyableView: View {\n\n    var title: LocalizedStringResource\n    var image: Image\n    var text: String\n    var showRevealInFinder = false\n\n    @State private var interactionState: InteractionState = .normal\n    \n    var content: some View {\n        VStack(alignment: .leading, spacing: 15) {\n            HStack {\n                image\n                    .renderingMode(.template)\n                    .imageScale(.large)\n                    .foregroundColor(primaryTextColor)\n                Text(title)\n                    .font(.headline)\n                    .foregroundColor(primaryTextColor)\n                Spacer()\n                if interactionState != .normal {\n                    HStack {\n                        if showRevealInFinder {\n                            revealInFinderButton\n                        }\n                        copyButton\n                    }\n                    .foregroundColor(secondaryTextColor)\n                    .transition(.opacity)\n                }\n            }\n            Divider()\n                .ignoresSafeArea()\n            Text(text)\n                .fixedSize(horizontal: false, vertical: true)\n                .foregroundColor(primaryTextColor)\n                .multilineTextAlignment(.leading)\n                .font(.system(.body, design: .monospaced))\n        }\n        .safeAreaPadding(20)\n        ._background(interactionState: interactionState)\n        .frame(minWidth: 150, maxWidth: .infinity)\n    }\n\n    var body: some View {\n        content\n        .onHover { hovering in\n            withAnimation {\n                interactionState = hovering ? .hovering : .normal\n            }\n        }\n        .draggable(text) {\n                content\n                .lineLimit(3)\n                .frame(maxWidth: 300)\n                ._background(interactionState: .dragging)\n        }\n        .onTapGesture {\n            copy()\n            withAnimation {\n                interactionState = .clicking\n            }\n        }\n        .gesture(\n            TapGesture()\n                .onEnded {\n                    withAnimation {\n                        interactionState = .normal\n                    }\n                }\n        )\n    }\n\n    @ViewBuilder\n    var copyButton: some View {\n        switch interactionState {\n        case .hovering:\n            Button(.copyableClickToCopyButton, systemImage: \"doc.on.doc\") {\n                withAnimation {\n                    // Button will eat the click, so we set interaction state manually.\n                    interactionState = .clicking\n                }\n                copy()\n            }\n            .labelStyle(.iconOnly)\n            .buttonStyle(.borderless)\n        case .clicking:\n            Image(systemName: \"checkmark.circle.fill\")\n                .accessibilityLabel(String(localized: .copyableCopied))\n        case .normal, .dragging:\n            EmptyView()\n        }\n    }\n\n    var revealInFinderButton: some View {\n        Button(.revealInFinderButton, systemImage: \"folder\") {\n            let (processedPath, folder) = text.normalizedPathAndFolder\n            NSWorkspace.shared.selectFile(processedPath, inFileViewerRootedAtPath: folder)\n        }\n        .labelStyle(.iconOnly)\n        .buttonStyle(.borderless)\n    }\n\n    var primaryTextColor: Color {\n        switch interactionState {\n        case .normal, .hovering, .dragging:\n            return Color(.textColor)\n        case .clicking:\n            return .white\n        }\n    }\n\n    var secondaryTextColor: Color {\n        switch interactionState {\n        case .normal, .hovering, .dragging:\n            return Color(.secondaryLabelColor)\n        case .clicking:\n            return .white\n        }\n    }\n\n    func copy() {\n        NSPasteboard.general.declareTypes([.string], owner: nil)\n        NSPasteboard.general.setString(text, forType: .string)\n    }\n\n}\n\nfileprivate enum InteractionState {\n    case normal, hovering, clicking, dragging\n}\n\nextension View {\n       \n    fileprivate func _background(interactionState: InteractionState) -> some View {\n        modifier(BackgroundViewModifier(interactionState: interactionState))\n    }\n    \n}\n\nfileprivate struct BackgroundViewModifier: ViewModifier {\n    \n    @Environment(\\.colorScheme) private var colorScheme\n    @Environment(\\.appearsActive) private var appearsActive\n\n    let interactionState: InteractionState\n\n    func body(content: Content) -> some View {\n        if interactionState == .dragging {\n            content\n                .background(backgroundColor(interactionState: interactionState), in: RoundedRectangle(cornerRadius: 15))\n        } else {\n            if #available(macOS 26.0, *) {\n                content\n                // Very thin opacity lets user hover anywhere over the view, glassEffect doesn't allow.\n                    .background(.white.opacity(0.01), in: RoundedRectangle(cornerRadius: 15))\n                    .glassEffect(.regular.tint(backgroundColor(interactionState: interactionState)), in: RoundedRectangle(cornerRadius: 15))\n                    .mask(RoundedRectangle(cornerRadius: 15))\n                    .shadow(color: .black.opacity(0.1), radius: 5)\n            } else {\n                content\n                    .background(backgroundColor(interactionState: interactionState))\n                    .cornerRadius(10)\n            }\n        }\n    }\n    \n    func backgroundColor(interactionState: InteractionState) -> Color {\n        guard appearsActive else { return Color.clear }\n        if #available(macOS 26.0, *) {\n            let base = colorScheme == .dark ? Color(white: 0.2) : Color(white: 1)\n            switch interactionState {\n            case .normal:\n                return base\n            case .hovering:\n                return base.mix(with: .accentColor, by: colorScheme == .dark ? 0.2 : 0.1)\n            case .clicking, .dragging:\n                return base.mix(with: .accentColor, by: 0.8)\n            }\n        } else {\n            switch interactionState {\n            case .normal:\n                return colorScheme == .dark ? Color(white: 0.2) : Color(white: 0.885)\n            case .hovering:\n                return colorScheme == .dark ? Color(white: 0.275) : Color(white: 0.82)\n            case .clicking, .dragging:\n                return .accentColor\n            }\n        }\n    }\n\n    \n}\n\n#Preview {\n    VStack {\n        CopyableView(title: .secretDetailSha256FingerprintLabel, image: Image(systemName: \"figure.wave\"), text: \"Hello world.\")\n        CopyableView(title: .secretDetailSha256FingerprintLabel, image: Image(systemName: \"figure.wave\"), text: \"Hello world.\")\n    }\n        .padding()\n}\n\n#Preview {\n    CopyableView(title: .secretDetailSha256FingerprintLabel, image: Image(systemName: \"figure.wave\"), text: \"Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. Long text. \")\n        .padding()\n}\n"
  },
  {
    "path": "Sources/Secretive/Views/Views/UpdateView.swift",
    "content": "import SwiftUI\nimport Brief\n\nstruct UpdateDetailView: View {\n\n    @Environment(\\.updater) var updater\n    @Environment(\\.openURL) var openURL\n\n    let update: Release\n\n    var body: some View {\n            VStack(spacing: 0) {\n                HStack {\n                    if !update.critical {\n                        Button(.updateIgnoreButton) {\n                            Task {\n                                await updater.ignore(release: update)\n                            }\n                        }\n                        .buttonStyle(ToolbarButtonStyle())\n                    }\n                    Spacer()\n                    if updater.currentVersion.isTestBuild {\n                        Button(.updaterDownloadLatestNightlyButton) {\n                            openURL(URL(string: \"https://github.com/maxgoedjen/secretive/actions/workflows/nightly.yml\")!)\n                        }\n                        .buttonStyle(ToolbarButtonStyle(tint: .accentColor))\n                    }\n                    Button(.updateUpdateButton) {\n                        openURL(update.html_url)\n                    }\n                    .buttonStyle(ToolbarButtonStyle(tint: .accentColor))\n                    .keyboardShortcut(.defaultAction)\n                }\n                .padding()\n                Divider()\n                Form {\n                    Section {\n                        Text(update.attributedBody)\n                    } header: {\n                        Text(.updateVersionName(updateName: update.name))                    .headerProminence(.increased)\n                    }\n                }\n                .formStyle(.grouped)\n        }\n    }\n\n}\n\n#Preview {\n    UpdateDetailView(update: .init(name: \"3.0.0\", prerelease: false, html_url: URL(string: \"https://example.com\")!, body: \"Hello\"))\n}\n"
  },
  {
    "path": "Sources/Secretive.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t2C4A9D2F2636FFD3008CC8E2 /* EditSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C4A9D2E2636FFD3008CC8E2 /* EditSecretView.swift */; };\n\t\t50020BB024064869003D4025 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50020BAF24064869003D4025 /* AppDelegate.swift */; };\n\t\t5002C3AB2EEF483300FFAD22 /* XPCWrappers in Frameworks */ = {isa = PBXBuildFile; productRef = 5002C3AA2EEF483300FFAD22 /* XPCWrappers */; };\n\t\t5003EF3B278005E800DF2006 /* SecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF3A278005E800DF2006 /* SecretKit */; };\n\t\t5003EF3D278005F300DF2006 /* Brief in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF3C278005F300DF2006 /* Brief */; };\n\t\t5003EF3F278005F300DF2006 /* SecretAgentKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF3E278005F300DF2006 /* SecretAgentKit */; };\n\t\t5003EF41278005FA00DF2006 /* SecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF40278005FA00DF2006 /* SecretKit */; };\n\t\t5003EF5F2780081600DF2006 /* SecureEnclaveSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF5E2780081600DF2006 /* SecureEnclaveSecretKit */; };\n\t\t5003EF612780081600DF2006 /* SmartCardSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF602780081600DF2006 /* SmartCardSecretKit */; };\n\t\t5003EF632780081B00DF2006 /* SecureEnclaveSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF622780081B00DF2006 /* SecureEnclaveSecretKit */; };\n\t\t5003EF652780081B00DF2006 /* SmartCardSecretKit in Frameworks */ = {isa = PBXBuildFile; productRef = 5003EF642780081B00DF2006 /* SmartCardSecretKit */; };\n\t\t5008C23E2E525D8900507AC2 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 5008C23D2E525D8200507AC2 /* Localizable.xcstrings */; };\n\t\t5008C2412E52D18700507AC2 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 5008C23D2E525D8200507AC2 /* Localizable.xcstrings */; };\n\t\t501421622781262300BBAA70 /* Brief in Frameworks */ = {isa = PBXBuildFile; productRef = 501421612781262300BBAA70 /* Brief */; };\n\t\t501421652781268000BBAA70 /* SecretAgent.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 50A3B78A24026B7500D209EA /* SecretAgent.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t50153E20250AFCB200525160 /* UpdateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50153E1F250AFCB200525160 /* UpdateView.swift */; };\n\t\t50153E22250DECA300525160 /* SecretListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50153E21250DECA300525160 /* SecretListItemView.swift */; };\n\t\t501578132E6C0479004A37D0 /* XPCInputParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501578122E6C0479004A37D0 /* XPCInputParser.swift */; };\n\t\t5018F54F24064786002EB505 /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5018F54E24064786002EB505 /* Notifier.swift */; };\n\t\t504788F22E681F3A00B4556F /* Instructions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504788F12E681F3A00B4556F /* Instructions.swift */; };\n\t\t504788F42E681F6900B4556F /* ToolConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504788F32E681F6900B4556F /* ToolConfigurationView.swift */; };\n\t\t504788F62E68206F00B4556F /* GettingStartedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504788F52E68206F00B4556F /* GettingStartedView.swift */; };\n\t\t504789232E697DD300B4556F /* BoxBackgroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504789222E697DD300B4556F /* BoxBackgroundStyle.swift */; };\n\t\t50571E0324393C2600F76F6C /* JustUpdatedChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */; };\n\t\t50617D8323FCE48E0099B055 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617D8223FCE48E0099B055 /* App.swift */; };\n\t\t50617D8523FCE48E0099B055 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617D8423FCE48E0099B055 /* ContentView.swift */; };\n\t\t50617D8A23FCE48E0099B055 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50617D8923FCE48E0099B055 /* Preview Assets.xcassets */; };\n\t\t50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617DD123FCEFA90099B055 /* PreviewStore.swift */; };\n\t\t5065E313295517C500E16645 /* ToolbarButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5065E312295517C500E16645 /* ToolbarButtonStyle.swift */; };\n\t\t5066A6C22516F303004B5A36 /* SetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5066A6C12516F303004B5A36 /* SetupView.swift */; };\n\t\t5066A6C82516FE6E004B5A36 /* CopyableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5066A6C72516FE6E004B5A36 /* CopyableView.swift */; };\n\t\t506772C92425BB8500034DED /* NoStoresView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506772C82425BB8500034DED /* NoStoresView.swift */; };\n\t\t50692D1D2E6FDB880043C7BB /* SecretiveUpdater.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 50692D122E6FDB880043C7BB /* SecretiveUpdater.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t50692D282E6FDB8D0043C7BB /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50692D242E6FDB8D0043C7BB /* main.swift */; };\n\t\t50692D2D2E6FDC000043C7BB /* XPCWrappers in Frameworks */ = {isa = PBXBuildFile; productRef = 50692D2C2E6FDC000043C7BB /* XPCWrappers */; };\n\t\t50692D2F2E6FDC2B0043C7BB /* SecretiveUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50692D2E2E6FDC290043C7BB /* SecretiveUpdater.swift */; };\n\t\t50692D312E6FDC390043C7BB /* Brief in Frameworks */ = {isa = PBXBuildFile; productRef = 50692D302E6FDC390043C7BB /* Brief */; };\n\t\t50692E5B2E6FF9D20043C7BB /* SecretAgentInputParser.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 50692E502E6FF9D20043C7BB /* SecretAgentInputParser.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t50692E682E6FF9E20043C7BB /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50692E632E6FF9E20043C7BB /* main.swift */; };\n\t\t50692E692E6FF9E20043C7BB /* SecretAgentInputParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50692E642E6FF9E20043C7BB /* SecretAgentInputParser.swift */; };\n\t\t50692E6C2E6FFA510043C7BB /* SecretAgentKit in Frameworks */ = {isa = PBXBuildFile; productRef = 50692E6B2E6FFA510043C7BB /* SecretAgentKit */; };\n\t\t50692E6D2E6FFA5F0043C7BB /* SecretiveUpdater.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 50692D122E6FDB880043C7BB /* SecretiveUpdater.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t50692E702E6FFA6E0043C7BB /* SecretAgentInputParser.xpc in Embed XPC Services */ = {isa = PBXBuildFile; fileRef = 50692E502E6FF9D20043C7BB /* SecretAgentInputParser.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t5079BA0F250F29BF00EA86F4 /* StoreListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5079BA0E250F29BF00EA86F4 /* StoreListView.swift */; };\n\t\t508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58A9241E06B40069DC07 /* PreviewUpdater.swift */; };\n\t\t508A58B3241ED2180069DC07 /* AgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */; };\n\t\t508A58B5241ED48F0069DC07 /* PreviewAgentStatusChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508A58B4241ED48F0069DC07 /* PreviewAgentStatusChecker.swift */; };\n\t\t508BF28E25B4F005009EFB7E /* InternetAccessPolicy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 508BF28D25B4F005009EFB7E /* InternetAccessPolicy.plist */; };\n\t\t508BF2AA25B4F1CB009EFB7E /* InternetAccessPolicy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 508BF29425B4F140009EFB7E /* InternetAccessPolicy.plist */; };\n\t\t5091D2BC25183B830049FD9B /* ApplicationDirectoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5091D2BB25183B830049FD9B /* ApplicationDirectoryController.swift */; };\n\t\t5099A02423FD2AAA0062B6F2 /* CreateSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */; };\n\t\t50A3B79424026B7600D209EA /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50A3B79324026B7600D209EA /* Preview Assets.xcassets */; };\n\t\t50A3B79724026B7600D209EA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50A3B79524026B7600D209EA /* Main.storyboard */; };\n\t\t50AE97002E5C1A420018C710 /* IntegrationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AE96FF2E5C1A420018C710 /* IntegrationsView.swift */; };\n\t\t50B832C02F62202A00D2FCB8 /* InternetAccessPolicy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 50692BA52E6D5CC90043C7BB /* InternetAccessPolicy.plist */; };\n\t\t50B8550D24138C4F009958AC /* DeleteSecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B8550C24138C4F009958AC /* DeleteSecretView.swift */; };\n\t\t50BB046B2418AAAE00D6E079 /* EmptyStoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BB046A2418AAAE00D6E079 /* EmptyStoreView.swift */; };\n\t\t50BDCB722E63BAF20072D2E7 /* AgentStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BDCB712E63BAF20072D2E7 /* AgentStatusView.swift */; };\n\t\t50BDCB742E6436CA0072D2E7 /* ErrorStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BDCB732E6436C60072D2E7 /* ErrorStyle.swift */; };\n\t\t50BDCB762E6450950072D2E7 /* ConfigurationItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BDCB752E6450950072D2E7 /* ConfigurationItemView.swift */; };\n\t\t50C385A52407A76D00AF2719 /* SecretDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C385A42407A76D00AF2719 /* SecretDetailView.swift */; };\n\t\t50CF4ABC2E601B0F005588DC /* ActionButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CF4ABB2E601B0F005588DC /* ActionButtonStyle.swift */; };\n\t\t50E0145C2EDB9CDF00B121F1 /* Common in Frameworks */ = {isa = PBXBuildFile; productRef = 50E0145B2EDB9CDF00B121F1 /* Common */; };\n\t\t50E0145E2EDB9CE400B121F1 /* Common in Frameworks */ = {isa = PBXBuildFile; productRef = 50E0145D2EDB9CE400B121F1 /* Common */; };\n\t\t50E4C4532E73C78C00C73783 /* WindowBackgroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E4C4522E73C78900C73783 /* WindowBackgroundStyle.swift */; };\n\t\t50E4C4C32E7765DF00C73783 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E4C4C22E7765DF00C73783 /* AboutView.swift */; };\n\t\t50E4C4C82E777E4200C73783 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 50E4C4C72E777E4200C73783 /* AppIcon.icon */; };\n\t\t50E4C4C92E777E4200C73783 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 50E4C4C72E777E4200C73783 /* AppIcon.icon */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t50142166278126B500BBAA70 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 50617D7723FCE48D0099B055 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 50A3B78924026B7500D209EA;\n\t\t\tremoteInfo = SecretAgent;\n\t\t};\n\t\t501577D32E6BC5DD004A37D0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 50617D7723FCE48D0099B055 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 501577BC2E6BC5B4004A37D0;\n\t\t\tremoteInfo = ReleasesDownloader;\n\t\t};\n\t\t50692D1B2E6FDB880043C7BB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 50617D7723FCE48D0099B055 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 50692D112E6FDB880043C7BB;\n\t\t\tremoteInfo = SecretiveUpdater;\n\t\t};\n\t\t50692E592E6FF9D20043C7BB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 50617D7723FCE48D0099B055 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 50692E4F2E6FF9D20043C7BB;\n\t\t\tremoteInfo = SecretAgentInputParser;\n\t\t};\n\t\t50692E6E2E6FFA5F0043C7BB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 50617D7723FCE48D0099B055 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 50692D112E6FDB880043C7BB;\n\t\t\tremoteInfo = SecretiveUpdater;\n\t\t};\n\t\t50692E712E6FFA6E0043C7BB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 50617D7723FCE48D0099B055 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 50692E4F2E6FF9D20043C7BB;\n\t\t\tremoteInfo = SecretAgentInputParser;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t501577C92E6BC5B4004A37D0 /* Embed XPC Services */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"$(CONTENTS_FOLDER_PATH)/XPCServices\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t\t50692D1D2E6FDB880043C7BB /* SecretiveUpdater.xpc in Embed XPC Services */,\n\t\t\t\t50692E5B2E6FF9D20043C7BB /* SecretAgentInputParser.xpc in Embed XPC Services */,\n\t\t\t);\n\t\t\tname = \"Embed XPC Services\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t501577D22E6BC5D4004A37D0 /* Embed XPC Services */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"$(CONTENTS_FOLDER_PATH)/XPCServices\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t\t50692E6D2E6FFA5F0043C7BB /* SecretiveUpdater.xpc in Embed XPC Services */,\n\t\t\t\t50692E702E6FFA6E0043C7BB /* SecretAgentInputParser.xpc in Embed XPC Services */,\n\t\t\t);\n\t\t\tname = \"Embed XPC Services\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50617DBF23FCE4AB0099B055 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50A5C18E240E4B4B00E2996C /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50C385AF240E438B00AF2719 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = Contents/Library/LoginItems;\n\t\t\tdstSubfolderSpec = 1;\n\t\t\tfiles = (\n\t\t\t\t501421652781268000BBAA70 /* SecretAgent.app in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t2C4A9D2E2636FFD3008CC8E2 /* EditSecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSecretView.swift; sourceTree = \"<group>\"; };\n\t\t50020BAF24064869003D4025 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t5003EF39278005C800DF2006 /* Packages */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Packages; sourceTree = \"<group>\"; };\n\t\t500666D02F04786900328939 /* SecretiveUpdater.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SecretiveUpdater.entitlements; sourceTree = \"<group>\"; };\n\t\t500666D12F04787200328939 /* SecretAgentInputParser.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SecretAgentInputParser.entitlements; sourceTree = \"<group>\"; };\n\t\t5008C23D2E525D8200507AC2 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Localizable.xcstrings; path = Packages/Resources/Localizable.xcstrings; sourceTree = SOURCE_ROOT; };\n\t\t50153E1F250AFCB200525160 /* UpdateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateView.swift; sourceTree = \"<group>\"; };\n\t\t50153E21250DECA300525160 /* SecretListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretListItemView.swift; sourceTree = \"<group>\"; };\n\t\t501578122E6C0479004A37D0 /* XPCInputParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XPCInputParser.swift; sourceTree = \"<group>\"; };\n\t\t5018F54E24064786002EB505 /* Notifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifier.swift; sourceTree = \"<group>\"; };\n\t\t504788F12E681F3A00B4556F /* Instructions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Instructions.swift; sourceTree = \"<group>\"; };\n\t\t504788F32E681F6900B4556F /* ToolConfigurationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolConfigurationView.swift; sourceTree = \"<group>\"; };\n\t\t504788F52E68206F00B4556F /* GettingStartedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GettingStartedView.swift; sourceTree = \"<group>\"; };\n\t\t504789222E697DD300B4556F /* BoxBackgroundStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoxBackgroundStyle.swift; sourceTree = \"<group>\"; };\n\t\t50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JustUpdatedChecker.swift; sourceTree = \"<group>\"; };\n\t\t5059933F2E7A3B5B0092CFFA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t50617D7F23FCE48E0099B055 /* Secretive.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Secretive.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50617D8223FCE48E0099B055 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = \"<group>\"; };\n\t\t50617D8423FCE48E0099B055 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n\t\t50617D8923FCE48E0099B055 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = \"Preview Assets.xcassets\"; sourceTree = \"<group>\"; };\n\t\t50617D8E23FCE48E0099B055 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t50617D8F23FCE48E0099B055 /* Secretive.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Secretive.entitlements; sourceTree = \"<group>\"; };\n\t\t50617DD123FCEFA90099B055 /* PreviewStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewStore.swift; sourceTree = \"<group>\"; };\n\t\t5065E312295517C500E16645 /* ToolbarButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarButtonStyle.swift; sourceTree = \"<group>\"; };\n\t\t5066A6C12516F303004B5A36 /* SetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupView.swift; sourceTree = \"<group>\"; };\n\t\t5066A6C72516FE6E004B5A36 /* CopyableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyableView.swift; sourceTree = \"<group>\"; };\n\t\t506772C82425BB8500034DED /* NoStoresView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoStoresView.swift; sourceTree = \"<group>\"; };\n\t\t50692BA52E6D5CC90043C7BB /* InternetAccessPolicy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InternetAccessPolicy.plist; sourceTree = \"<group>\"; };\n\t\t50692D122E6FDB880043C7BB /* SecretiveUpdater.xpc */ = {isa = PBXFileReference; explicitFileType = \"wrapper.xpc-service\"; includeInIndex = 0; path = SecretiveUpdater.xpc; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50692D232E6FDB8D0043C7BB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t50692D242E6FDB8D0043C7BB /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t50692D2E2E6FDC290043C7BB /* SecretiveUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretiveUpdater.swift; sourceTree = \"<group>\"; };\n\t\t50692E502E6FF9D20043C7BB /* SecretAgentInputParser.xpc */ = {isa = PBXFileReference; explicitFileType = \"wrapper.xpc-service\"; includeInIndex = 0; path = SecretAgentInputParser.xpc; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50692E622E6FF9E20043C7BB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t50692E632E6FF9E20043C7BB /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n\t\t50692E642E6FF9E20043C7BB /* SecretAgentInputParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretAgentInputParser.swift; sourceTree = \"<group>\"; };\n\t\t5079BA0E250F29BF00EA86F4 /* StoreListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreListView.swift; sourceTree = \"<group>\"; };\n\t\t508A58A9241E06B40069DC07 /* PreviewUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewUpdater.swift; sourceTree = \"<group>\"; };\n\t\t508A58AB241E121B0069DC07 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = \"<group>\"; };\n\t\t508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentStatusChecker.swift; sourceTree = \"<group>\"; };\n\t\t508A58B4241ED48F0069DC07 /* PreviewAgentStatusChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewAgentStatusChecker.swift; sourceTree = \"<group>\"; };\n\t\t508A590F241EEF6D0069DC07 /* Secretive.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Secretive.xctestplan; sourceTree = \"<group>\"; };\n\t\t508BF28D25B4F005009EFB7E /* InternetAccessPolicy.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = InternetAccessPolicy.plist; sourceTree = \"<group>\"; };\n\t\t508BF29425B4F140009EFB7E /* InternetAccessPolicy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = InternetAccessPolicy.plist; path = SecretAgent/InternetAccessPolicy.plist; sourceTree = SOURCE_ROOT; };\n\t\t5091D2BB25183B830049FD9B /* ApplicationDirectoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationDirectoryController.swift; sourceTree = \"<group>\"; };\n\t\t5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateSecretView.swift; sourceTree = \"<group>\"; };\n\t\t50A3B78A24026B7500D209EA /* SecretAgent.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SecretAgent.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t50A3B79324026B7600D209EA /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = \"Preview Assets.xcassets\"; sourceTree = \"<group>\"; };\n\t\t50A3B79824026B7600D209EA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t50A3B79924026B7600D209EA /* SecretAgent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SecretAgent.entitlements; sourceTree = \"<group>\"; };\n\t\t50AE96FF2E5C1A420018C710 /* IntegrationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrationsView.swift; sourceTree = \"<group>\"; };\n\t\t50B8550C24138C4F009958AC /* DeleteSecretView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeleteSecretView.swift; sourceTree = \"<group>\"; };\n\t\t50BB046A2418AAAE00D6E079 /* EmptyStoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyStoreView.swift; sourceTree = \"<group>\"; };\n\t\t50BDCB712E63BAF20072D2E7 /* AgentStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentStatusView.swift; sourceTree = \"<group>\"; };\n\t\t50BDCB732E6436C60072D2E7 /* ErrorStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorStyle.swift; sourceTree = \"<group>\"; };\n\t\t50BDCB752E6450950072D2E7 /* ConfigurationItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationItemView.swift; sourceTree = \"<group>\"; };\n\t\t50C385A42407A76D00AF2719 /* SecretDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretDetailView.swift; sourceTree = \"<group>\"; };\n\t\t50CF4ABB2E601B0F005588DC /* ActionButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionButtonStyle.swift; sourceTree = \"<group>\"; };\n\t\t50E4C4522E73C78900C73783 /* WindowBackgroundStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowBackgroundStyle.swift; sourceTree = \"<group>\"; };\n\t\t50E4C4C22E7765DF00C73783 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = \"<group>\"; };\n\t\t50E4C4C72E777E4200C73783 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = \"<group>\"; };\n\t\tF418C9A82F0C57F000E9ADF8 /* OpenSource.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = OpenSource.xcconfig; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t50617D7C23FCE48D0099B055 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50E0145C2EDB9CDF00B121F1 /* Common in Frameworks */,\n\t\t\t\t5003EF3B278005E800DF2006 /* SecretKit in Frameworks */,\n\t\t\t\t501421622781262300BBAA70 /* Brief in Frameworks */,\n\t\t\t\t5003EF5F2780081600DF2006 /* SecureEnclaveSecretKit in Frameworks */,\n\t\t\t\t5003EF612780081600DF2006 /* SmartCardSecretKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50692D0F2E6FDB880043C7BB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50692D2D2E6FDC000043C7BB /* XPCWrappers in Frameworks */,\n\t\t\t\t50692D312E6FDC390043C7BB /* Brief in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50692E4D2E6FF9D20043C7BB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5002C3AB2EEF483300FFAD22 /* XPCWrappers in Frameworks */,\n\t\t\t\t50692E6C2E6FFA510043C7BB /* SecretAgentKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50A3B78724026B7500D209EA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5003EF3D278005F300DF2006 /* Brief in Frameworks */,\n\t\t\t\t5003EF632780081B00DF2006 /* SecureEnclaveSecretKit in Frameworks */,\n\t\t\t\t5003EF652780081B00DF2006 /* SmartCardSecretKit in Frameworks */,\n\t\t\t\t5003EF3F278005F300DF2006 /* SecretAgentKit in Frameworks */,\n\t\t\t\t5003EF41278005FA00DF2006 /* SecretKit in Frameworks */,\n\t\t\t\t50E0145E2EDB9CE400B121F1 /* Common in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t504788ED2E681EB200B4556F /* Modifiers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50E4C4522E73C78900C73783 /* WindowBackgroundStyle.swift */,\n\t\t\t\t50CF4ABB2E601B0F005588DC /* ActionButtonStyle.swift */,\n\t\t\t\t50BDCB732E6436C60072D2E7 /* ErrorStyle.swift */,\n\t\t\t\t504789222E697DD300B4556F /* BoxBackgroundStyle.swift */,\n\t\t\t\t5065E312295517C500E16645 /* ToolbarButtonStyle.swift */,\n\t\t\t);\n\t\t\tpath = Modifiers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t504788EE2E681EC300B4556F /* Secrets */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */,\n\t\t\t\t50B8550C24138C4F009958AC /* DeleteSecretView.swift */,\n\t\t\t\t2C4A9D2E2636FFD3008CC8E2 /* EditSecretView.swift */,\n\t\t\t\t50BB046A2418AAAE00D6E079 /* EmptyStoreView.swift */,\n\t\t\t\t506772C82425BB8500034DED /* NoStoresView.swift */,\n\t\t\t\t50C385A42407A76D00AF2719 /* SecretDetailView.swift */,\n\t\t\t\t50153E21250DECA300525160 /* SecretListItemView.swift */,\n\t\t\t\t5079BA0E250F29BF00EA86F4 /* StoreListView.swift */,\n\t\t\t);\n\t\t\tpath = Secrets;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t504788EF2E681ED700B4556F /* Configuration */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50BDCB752E6450950072D2E7 /* ConfigurationItemView.swift */,\n\t\t\t\t50AE96FF2E5C1A420018C710 /* IntegrationsView.swift */,\n\t\t\t\t504788F12E681F3A00B4556F /* Instructions.swift */,\n\t\t\t\t504788F32E681F6900B4556F /* ToolConfigurationView.swift */,\n\t\t\t\t5066A6C12516F303004B5A36 /* SetupView.swift */,\n\t\t\t\t504788F52E68206F00B4556F /* GettingStartedView.swift */,\n\t\t\t);\n\t\t\tpath = Configuration;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t504788F02E681F0100B4556F /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50E4C4C22E7765DF00C73783 /* AboutView.swift */,\n\t\t\t\t50BDCB712E63BAF20072D2E7 /* AgentStatusView.swift */,\n\t\t\t\t50617D8423FCE48E0099B055 /* ContentView.swift */,\n\t\t\t\t5066A6C72516FE6E004B5A36 /* CopyableView.swift */,\n\t\t\t\t50153E1F250AFCB200525160 /* UpdateView.swift */,\n\t\t\t);\n\t\t\tpath = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50617D7623FCE48D0099B055 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5003EF39278005C800DF2006 /* Packages */,\n\t\t\t\t50617D8123FCE48E0099B055 /* Secretive */,\n\t\t\t\t50A3B78B24026B7500D209EA /* SecretAgent */,\n\t\t\t\t508A58AF241E144C0069DC07 /* Config */,\n\t\t\t\t50692D272E6FDB8D0043C7BB /* SecretiveUpdater */,\n\t\t\t\t50692E662E6FF9E20043C7BB /* SecretAgentInputParser */,\n\t\t\t\t50617D8023FCE48E0099B055 /* Products */,\n\t\t\t\t5099A08B240243730062B6F2 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50617D8023FCE48E0099B055 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50617D7F23FCE48E0099B055 /* Secretive.app */,\n\t\t\t\t50A3B78A24026B7500D209EA /* SecretAgent.app */,\n\t\t\t\t50692D122E6FDB880043C7BB /* SecretiveUpdater.xpc */,\n\t\t\t\t50692E502E6FF9D20043C7BB /* SecretAgentInputParser.xpc */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50617D8123FCE48E0099B055 /* Secretive */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50617D8223FCE48E0099B055 /* App.swift */,\n\t\t\t\t508A58B0241ED1C40069DC07 /* Views */,\n\t\t\t\t508A58B1241ED1EA0069DC07 /* Controllers */,\n\t\t\t\t50617D8E23FCE48E0099B055 /* Info.plist */,\n\t\t\t\t508BF28D25B4F005009EFB7E /* InternetAccessPolicy.plist */,\n\t\t\t\t50E4C4C72E777E4200C73783 /* AppIcon.icon */,\n\t\t\t\t50617D8F23FCE48E0099B055 /* Secretive.entitlements */,\n\t\t\t\t5008C23D2E525D8200507AC2 /* Localizable.xcstrings */,\n\t\t\t\t50617D8823FCE48E0099B055 /* Preview Content */,\n\t\t\t);\n\t\t\tpath = Secretive;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50617D8823FCE48E0099B055 /* Preview Content */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50617D8923FCE48E0099B055 /* Preview Assets.xcassets */,\n\t\t\t\t50617DD123FCEFA90099B055 /* PreviewStore.swift */,\n\t\t\t\t508A58A9241E06B40069DC07 /* PreviewUpdater.swift */,\n\t\t\t\t508A58B4241ED48F0069DC07 /* PreviewAgentStatusChecker.swift */,\n\t\t\t);\n\t\t\tpath = \"Preview Content\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50692D272E6FDB8D0043C7BB /* SecretiveUpdater */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t500666D02F04786900328939 /* SecretiveUpdater.entitlements */,\n\t\t\t\t50692D232E6FDB8D0043C7BB /* Info.plist */,\n\t\t\t\t50692BA52E6D5CC90043C7BB /* InternetAccessPolicy.plist */,\n\t\t\t\t50692D242E6FDB8D0043C7BB /* main.swift */,\n\t\t\t\t50692D2E2E6FDC290043C7BB /* SecretiveUpdater.swift */,\n\t\t\t);\n\t\t\tpath = SecretiveUpdater;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50692E662E6FF9E20043C7BB /* SecretAgentInputParser */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t500666D12F04787200328939 /* SecretAgentInputParser.entitlements */,\n\t\t\t\t50692E622E6FF9E20043C7BB /* Info.plist */,\n\t\t\t\t50692E632E6FF9E20043C7BB /* main.swift */,\n\t\t\t\t50692E642E6FF9E20043C7BB /* SecretAgentInputParser.swift */,\n\t\t\t);\n\t\t\tpath = SecretAgentInputParser;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t508A58AF241E144C0069DC07 /* Config */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t508A590F241EEF6D0069DC07 /* Secretive.xctestplan */,\n\t\t\t\t508A58AB241E121B0069DC07 /* Config.xcconfig */,\n\t\t\t\tF418C9A82F0C57F000E9ADF8 /* OpenSource.xcconfig */,\n\t\t\t);\n\t\t\tpath = Config;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t508A58B0241ED1C40069DC07 /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t504788EF2E681ED700B4556F /* Configuration */,\n\t\t\t\t504788EE2E681EC300B4556F /* Secrets */,\n\t\t\t\t504788ED2E681EB200B4556F /* Modifiers */,\n\t\t\t\t504788F02E681F0100B4556F /* Views */,\n\t\t\t);\n\t\t\tpath = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t508A58B1241ED1EA0069DC07 /* Controllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t508A58B2241ED2180069DC07 /* AgentStatusChecker.swift */,\n\t\t\t\t5091D2BB25183B830049FD9B /* ApplicationDirectoryController.swift */,\n\t\t\t\t50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */,\n\t\t\t);\n\t\t\tpath = Controllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5099A08B240243730062B6F2 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50A3B78B24026B7500D209EA /* SecretAgent */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50020BAF24064869003D4025 /* AppDelegate.swift */,\n\t\t\t\t5018F54E24064786002EB505 /* Notifier.swift */,\n\t\t\t\t501578122E6C0479004A37D0 /* XPCInputParser.swift */,\n\t\t\t\t50A3B79524026B7600D209EA /* Main.storyboard */,\n\t\t\t\t50A3B79824026B7600D209EA /* Info.plist */,\n\t\t\t\t508BF29425B4F140009EFB7E /* InternetAccessPolicy.plist */,\n\t\t\t\t50A3B79924026B7600D209EA /* SecretAgent.entitlements */,\n\t\t\t\t50A3B79224026B7600D209EA /* Preview Content */,\n\t\t\t);\n\t\t\tpath = SecretAgent;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t50A3B79224026B7600D209EA /* Preview Content */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t50A3B79324026B7600D209EA /* Preview Assets.xcassets */,\n\t\t\t);\n\t\t\tpath = \"Preview Content\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t50617D7E23FCE48D0099B055 /* Secretive */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50617D9D23FCE48E0099B055 /* Build configuration list for PBXNativeTarget \"Secretive\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50617D7B23FCE48D0099B055 /* Sources */,\n\t\t\t\t50617D7C23FCE48D0099B055 /* Frameworks */,\n\t\t\t\t50617D7D23FCE48D0099B055 /* Resources */,\n\t\t\t\t50617DBF23FCE4AB0099B055 /* Embed Frameworks */,\n\t\t\t\t50C385AF240E438B00AF2719 /* CopyFiles */,\n\t\t\t\t501577C92E6BC5B4004A37D0 /* Embed XPC Services */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t50142167278126B500BBAA70 /* PBXTargetDependency */,\n\t\t\t\t50692D1C2E6FDB880043C7BB /* PBXTargetDependency */,\n\t\t\t\t50692E5A2E6FF9D20043C7BB /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Secretive;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t5003EF3A278005E800DF2006 /* SecretKit */,\n\t\t\t\t5003EF5E2780081600DF2006 /* SecureEnclaveSecretKit */,\n\t\t\t\t5003EF602780081600DF2006 /* SmartCardSecretKit */,\n\t\t\t\t501421612781262300BBAA70 /* Brief */,\n\t\t\t\t50E0145B2EDB9CDF00B121F1 /* Common */,\n\t\t\t);\n\t\t\tproductName = Secretive;\n\t\t\tproductReference = 50617D7F23FCE48E0099B055 /* Secretive.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t50692D112E6FDB880043C7BB /* SecretiveUpdater */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50692D1F2E6FDB880043C7BB /* Build configuration list for PBXNativeTarget \"SecretiveUpdater\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50692D0E2E6FDB880043C7BB /* Sources */,\n\t\t\t\t50692D0F2E6FDB880043C7BB /* Frameworks */,\n\t\t\t\t50692D102E6FDB880043C7BB /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SecretiveUpdater;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50692D2C2E6FDC000043C7BB /* XPCWrappers */,\n\t\t\t\t50692D302E6FDC390043C7BB /* Brief */,\n\t\t\t);\n\t\t\tproductName = SecretiveUpdater;\n\t\t\tproductReference = 50692D122E6FDB880043C7BB /* SecretiveUpdater.xpc */;\n\t\t\tproductType = \"com.apple.product-type.xpc-service\";\n\t\t};\n\t\t50692E4F2E6FF9D20043C7BB /* SecretAgentInputParser */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50692E5D2E6FF9D20043C7BB /* Build configuration list for PBXNativeTarget \"SecretAgentInputParser\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50692E4C2E6FF9D20043C7BB /* Sources */,\n\t\t\t\t50692E4D2E6FF9D20043C7BB /* Frameworks */,\n\t\t\t\t50692E4E2E6FF9D20043C7BB /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SecretAgentInputParser;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t50692E6B2E6FFA510043C7BB /* SecretAgentKit */,\n\t\t\t\t5002C3AA2EEF483300FFAD22 /* XPCWrappers */,\n\t\t\t);\n\t\t\tproductName = SecretAgentInputParser;\n\t\t\tproductReference = 50692E502E6FF9D20043C7BB /* SecretAgentInputParser.xpc */;\n\t\t\tproductType = \"com.apple.product-type.xpc-service\";\n\t\t};\n\t\t50A3B78924026B7500D209EA /* SecretAgent */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 50A3B79A24026B7600D209EA /* Build configuration list for PBXNativeTarget \"SecretAgent\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t50A3B78624026B7500D209EA /* Sources */,\n\t\t\t\t50A3B78724026B7500D209EA /* Frameworks */,\n\t\t\t\t50A3B78824026B7500D209EA /* Resources */,\n\t\t\t\t50A5C18E240E4B4B00E2996C /* Embed Frameworks */,\n\t\t\t\t501577D22E6BC5D4004A37D0 /* Embed XPC Services */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t501577D42E6BC5DD004A37D0 /* PBXTargetDependency */,\n\t\t\t\t50692E6F2E6FFA5F0043C7BB /* PBXTargetDependency */,\n\t\t\t\t50692E722E6FFA6E0043C7BB /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SecretAgent;\n\t\t\tpackageProductDependencies = (\n\t\t\t\t5003EF3C278005F300DF2006 /* Brief */,\n\t\t\t\t5003EF3E278005F300DF2006 /* SecretAgentKit */,\n\t\t\t\t5003EF40278005FA00DF2006 /* SecretKit */,\n\t\t\t\t5003EF622780081B00DF2006 /* SecureEnclaveSecretKit */,\n\t\t\t\t5003EF642780081B00DF2006 /* SmartCardSecretKit */,\n\t\t\t\t50E0145D2EDB9CE400B121F1 /* Common */,\n\t\t\t);\n\t\t\tproductName = SecretAgent;\n\t\t\tproductReference = 50A3B78A24026B7500D209EA /* SecretAgent.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t50617D7723FCE48D0099B055 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 2600;\n\t\t\t\tLastUpgradeCheck = 2640;\n\t\t\t\tORGANIZATIONNAME = \"Max Goedjen\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t50617D7E23FCE48D0099B055 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.3;\n\t\t\t\t\t};\n\t\t\t\t\t50692D112E6FDB880043C7BB = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 26.0;\n\t\t\t\t\t};\n\t\t\t\t\t50692E4F2E6FF9D20043C7BB = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 26.0;\n\t\t\t\t\t};\n\t\t\t\t\t50A3B78924026B7500D209EA = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.4;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 50617D7A23FCE48D0099B055 /* Build configuration list for PBXProject \"Secretive\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tit,\n\t\t\t\tfr,\n\t\t\t\tde,\n\t\t\t\t\"pt-BR\",\n\t\t\t\tfi,\n\t\t\t\tko,\n\t\t\t\tca,\n\t\t\t\tru,\n\t\t\t\tpl,\n\t\t\t);\n\t\t\tmainGroup = 50617D7623FCE48D0099B055;\n\t\t\tproductRefGroup = 50617D8023FCE48E0099B055 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t50617D7E23FCE48D0099B055 /* Secretive */,\n\t\t\t\t50A3B78924026B7500D209EA /* SecretAgent */,\n\t\t\t\t50692D112E6FDB880043C7BB /* SecretiveUpdater */,\n\t\t\t\t50692E4F2E6FF9D20043C7BB /* SecretAgentInputParser */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t50617D7D23FCE48D0099B055 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50617D8A23FCE48E0099B055 /* Preview Assets.xcassets in Resources */,\n\t\t\t\t50E4C4C82E777E4200C73783 /* AppIcon.icon in Resources */,\n\t\t\t\t5008C23E2E525D8900507AC2 /* Localizable.xcstrings in Resources */,\n\t\t\t\t508BF28E25B4F005009EFB7E /* InternetAccessPolicy.plist in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50692D102E6FDB880043C7BB /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50B832C02F62202A00D2FCB8 /* InternetAccessPolicy.plist in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50692E4E2E6FF9D20043C7BB /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50A3B78824026B7500D209EA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50A3B79724026B7600D209EA /* Main.storyboard in Resources */,\n\t\t\t\t5008C2412E52D18700507AC2 /* Localizable.xcstrings in Resources */,\n\t\t\t\t50A3B79424026B7600D209EA /* Preview Assets.xcassets in Resources */,\n\t\t\t\t50E4C4C92E777E4200C73783 /* AppIcon.icon in Resources */,\n\t\t\t\t508BF2AA25B4F1CB009EFB7E /* InternetAccessPolicy.plist in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t50617D7B23FCE48D0099B055 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t504788F22E681F3A00B4556F /* Instructions.swift in Sources */,\n\t\t\t\t50BDCB742E6436CA0072D2E7 /* ErrorStyle.swift in Sources */,\n\t\t\t\t50E4C4C32E7765DF00C73783 /* AboutView.swift in Sources */,\n\t\t\t\t2C4A9D2F2636FFD3008CC8E2 /* EditSecretView.swift in Sources */,\n\t\t\t\t50E4C4532E73C78C00C73783 /* WindowBackgroundStyle.swift in Sources */,\n\t\t\t\t5091D2BC25183B830049FD9B /* ApplicationDirectoryController.swift in Sources */,\n\t\t\t\t504789232E697DD300B4556F /* BoxBackgroundStyle.swift in Sources */,\n\t\t\t\t5066A6C22516F303004B5A36 /* SetupView.swift in Sources */,\n\t\t\t\t5065E313295517C500E16645 /* ToolbarButtonStyle.swift in Sources */,\n\t\t\t\t50617D8523FCE48E0099B055 /* ContentView.swift in Sources */,\n\t\t\t\t504788F62E68206F00B4556F /* GettingStartedView.swift in Sources */,\n\t\t\t\t50CF4ABC2E601B0F005588DC /* ActionButtonStyle.swift in Sources */,\n\t\t\t\t50571E0324393C2600F76F6C /* JustUpdatedChecker.swift in Sources */,\n\t\t\t\t5079BA0F250F29BF00EA86F4 /* StoreListView.swift in Sources */,\n\t\t\t\t50617DD223FCEFA90099B055 /* PreviewStore.swift in Sources */,\n\t\t\t\t50BDCB722E63BAF20072D2E7 /* AgentStatusView.swift in Sources */,\n\t\t\t\t508A58B3241ED2180069DC07 /* AgentStatusChecker.swift in Sources */,\n\t\t\t\t50C385A52407A76D00AF2719 /* SecretDetailView.swift in Sources */,\n\t\t\t\t5099A02423FD2AAA0062B6F2 /* CreateSecretView.swift in Sources */,\n\t\t\t\t50AE97002E5C1A420018C710 /* IntegrationsView.swift in Sources */,\n\t\t\t\t50153E20250AFCB200525160 /* UpdateView.swift in Sources */,\n\t\t\t\t5066A6C82516FE6E004B5A36 /* CopyableView.swift in Sources */,\n\t\t\t\t50B8550D24138C4F009958AC /* DeleteSecretView.swift in Sources */,\n\t\t\t\t50BB046B2418AAAE00D6E079 /* EmptyStoreView.swift in Sources */,\n\t\t\t\t50BDCB762E6450950072D2E7 /* ConfigurationItemView.swift in Sources */,\n\t\t\t\t50617D8323FCE48E0099B055 /* App.swift in Sources */,\n\t\t\t\t504788F42E681F6900B4556F /* ToolConfigurationView.swift in Sources */,\n\t\t\t\t506772C92425BB8500034DED /* NoStoresView.swift in Sources */,\n\t\t\t\t50153E22250DECA300525160 /* SecretListItemView.swift in Sources */,\n\t\t\t\t508A58B5241ED48F0069DC07 /* PreviewAgentStatusChecker.swift in Sources */,\n\t\t\t\t508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50692D0E2E6FDB880043C7BB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50692D2F2E6FDC2B0043C7BB /* SecretiveUpdater.swift in Sources */,\n\t\t\t\t50692D282E6FDB8D0043C7BB /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50692E4C2E6FF9D20043C7BB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50692E682E6FF9E20043C7BB /* main.swift in Sources */,\n\t\t\t\t50692E692E6FF9E20043C7BB /* SecretAgentInputParser.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t50A3B78624026B7500D209EA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t50020BB024064869003D4025 /* AppDelegate.swift in Sources */,\n\t\t\t\t5018F54F24064786002EB505 /* Notifier.swift in Sources */,\n\t\t\t\t501578132E6C0479004A37D0 /* XPCInputParser.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t50142167278126B500BBAA70 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 50A3B78924026B7500D209EA /* SecretAgent */;\n\t\t\ttargetProxy = 50142166278126B500BBAA70 /* PBXContainerItemProxy */;\n\t\t};\n\t\t501577D42E6BC5DD004A37D0 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttargetProxy = 501577D32E6BC5DD004A37D0 /* PBXContainerItemProxy */;\n\t\t};\n\t\t50692D1C2E6FDB880043C7BB /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 50692D112E6FDB880043C7BB /* SecretiveUpdater */;\n\t\t\ttargetProxy = 50692D1B2E6FDB880043C7BB /* PBXContainerItemProxy */;\n\t\t};\n\t\t50692E5A2E6FF9D20043C7BB /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 50692E4F2E6FF9D20043C7BB /* SecretAgentInputParser */;\n\t\t\ttargetProxy = 50692E592E6FF9D20043C7BB /* PBXContainerItemProxy */;\n\t\t};\n\t\t50692E6F2E6FFA5F0043C7BB /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 50692D112E6FDB880043C7BB /* SecretiveUpdater */;\n\t\t\ttargetProxy = 50692E6E2E6FFA5F0043C7BB /* PBXContainerItemProxy */;\n\t\t};\n\t\t50692E722E6FFA6E0043C7BB /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 50692E4F2E6FF9D20043C7BB /* SecretAgentInputParser */;\n\t\t\ttargetProxy = 50692E712E6FFA6E0043C7BB /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t50A3B79524026B7600D209EA /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5059933F2E7A3B5B0092CFFA /* en */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t50617D9B23FCE48E0099B055 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 508A58AB241E121B0069DC07 /* Config.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_STRICT_MEMORY_SAFETY = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 6.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50617D9C23FCE48E0099B055 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 508A58AB241E121B0069DC07 /* Config.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_STRICT_MEMORY_SAFETY = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 6.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50617D9E23FCE48E0099B055 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"Secretive/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tINFOPLIST_FILE = Secretive/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).Host\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50617D9F23FCE48E0099B055 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"Secretive/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tINFOPLIST_FILE = Secretive/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).Host\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"Secretive - Host\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50692D202E6FDB880043C7BB /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretiveUpdater/SecretiveUpdater.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = SecretiveUpdater/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = SecretiveUpdater;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2025 Max Goedjen. All rights reserved.\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretiveUpdater\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tREGISTER_APP_GROUPS = YES;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_APPROACHABLE_CONCURRENCY = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50692D212E6FDB880043C7BB /* Test */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretiveUpdater/SecretiveUpdater.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = SecretiveUpdater/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = SecretiveUpdater;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2025 Max Goedjen. All rights reserved.\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretiveUpdater\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tREGISTER_APP_GROUPS = YES;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_APPROACHABLE_CONCURRENCY = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Test;\n\t\t};\n\t\t50692D222E6FDB880043C7BB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretiveUpdater/SecretiveUpdater.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\t\"DEVELOPMENT_TEAM[sdk=macosx*]\" = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = SecretiveUpdater/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = SecretiveUpdater;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2025 Max Goedjen. All rights reserved.\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretiveUpdater\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tREGISTER_APP_GROUPS = YES;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_APPROACHABLE_CONCURRENCY = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t50692E5E2E6FF9D20043C7BB /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretAgentInputParser/SecretAgentInputParser.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = SecretAgentInputParser/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = SecretAgentInputParser;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2025 Max Goedjen. All rights reserved.\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretAgentInputParser\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tREGISTER_APP_GROUPS = YES;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"DEBUG $(inherited)\";\n\t\t\t\tSWIFT_APPROACHABLE_CONCURRENCY = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50692E5F2E6FF9D20043C7BB /* Test */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretAgentInputParser/SecretAgentInputParser.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = SecretAgentInputParser/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = SecretAgentInputParser;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2025 Max Goedjen. All rights reserved.\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretAgentInputParser\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tREGISTER_APP_GROUPS = YES;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_APPROACHABLE_CONCURRENCY = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Test;\n\t\t};\n\t\t50692E602E6FF9D20043C7BB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++20\";\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretAgentInputParser/SecretAgentInputParser.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\t\"DEVELOPMENT_TEAM[sdk=macosx*]\" = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu17;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tINFOPLIST_FILE = SecretAgentInputParser/Info.plist;\n\t\t\t\tINFOPLIST_KEY_CFBundleDisplayName = SecretAgentInputParser;\n\t\t\t\tINFOPLIST_KEY_NSHumanReadableCopyright = \"Copyright © 2025 Max Goedjen. All rights reserved.\";\n\t\t\t\tLOCALIZATION_PREFERS_STRING_CATALOGS = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretAgentInputParser\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tREGISTER_APP_GROUPS = YES;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSWIFT_APPROACHABLE_CONCURRENCY = YES;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t508A5914241EF1A00069DC07 /* Test */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 508A58AB241E121B0069DC07 /* Config.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 15.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSTRING_CATALOG_GENERATE_SYMBOLS = YES;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_EMIT_LOC_STRINGS = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_STRICT_MEMORY_SAFETY = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 6.0;\n\t\t\t};\n\t\t\tname = Test;\n\t\t};\n\t\t508A5915241EF1A00069DC07 /* Test */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = Secretive/Secretive.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"Secretive/Preview Content\\\"\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = NO;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tINFOPLIST_FILE = Secretive/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).Host\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Test;\n\t\t};\n\t\t508A5917241EF1A00069DC07 /* Test */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretAgent/SecretAgent.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"SecretAgent/Preview Content\\\"\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tINFOPLIST_FILE = SecretAgent/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretAgent\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Test;\n\t\t};\n\t\t50A3B79B24026B7600D209EA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretAgent/SecretAgent.entitlements;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"SecretAgent/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tINFOPLIST_FILE = SecretAgent/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretAgent\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t50A3B79C24026B7600D209EA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = SecretAgent/SecretAgent.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Developer ID Application\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_ASSET_PATHS = \"\\\"SecretAgent/Preview Content\\\"\";\n\t\t\t\tDEVELOPMENT_TEAM = \"$(SECRETIVE_DEVELOPMENT_TEAM)\";\n\t\t\t\tENABLE_APP_SANDBOX = YES;\n\t\t\t\tENABLE_ENHANCED_SECURITY = YES;\n\t\t\t\tENABLE_HARDENED_RUNTIME = YES;\n\t\t\t\tENABLE_INCOMING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_OUTGOING_NETWORK_CONNECTIONS = NO;\n\t\t\t\tENABLE_POINTER_AUTHENTICATION = YES;\n\t\t\t\tENABLE_PREVIEWS = YES;\n\t\t\t\tENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CALENDARS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CAMERA = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_CONTACTS = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_LOCATION = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_PRINTING = NO;\n\t\t\t\tENABLE_RESOURCE_ACCESS_USB = NO;\n\t\t\t\tINFOPLIST_FILE = SecretAgent/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 14.0;\n\t\t\t\tMARKETING_VERSION = 1;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"$(SECRETIVE_BASE_BUNDLE_ID).SecretAgent\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"Secretive - Secret Agent\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t50617D7A23FCE48D0099B055 /* Build configuration list for PBXProject \"Secretive\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50617D9B23FCE48E0099B055 /* Debug */,\n\t\t\t\t508A5914241EF1A00069DC07 /* Test */,\n\t\t\t\t50617D9C23FCE48E0099B055 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50617D9D23FCE48E0099B055 /* Build configuration list for PBXNativeTarget \"Secretive\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50617D9E23FCE48E0099B055 /* Debug */,\n\t\t\t\t508A5915241EF1A00069DC07 /* Test */,\n\t\t\t\t50617D9F23FCE48E0099B055 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50692D1F2E6FDB880043C7BB /* Build configuration list for PBXNativeTarget \"SecretiveUpdater\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50692D202E6FDB880043C7BB /* Debug */,\n\t\t\t\t50692D212E6FDB880043C7BB /* Test */,\n\t\t\t\t50692D222E6FDB880043C7BB /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50692E5D2E6FF9D20043C7BB /* Build configuration list for PBXNativeTarget \"SecretAgentInputParser\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50692E5E2E6FF9D20043C7BB /* Debug */,\n\t\t\t\t50692E5F2E6FF9D20043C7BB /* Test */,\n\t\t\t\t50692E602E6FF9D20043C7BB /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t50A3B79A24026B7600D209EA /* Build configuration list for PBXNativeTarget \"SecretAgent\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t50A3B79B24026B7600D209EA /* Debug */,\n\t\t\t\t508A5917241EF1A00069DC07 /* Test */,\n\t\t\t\t50A3B79C24026B7600D209EA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\t5002C3AA2EEF483300FFAD22 /* XPCWrappers */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = XPCWrappers;\n\t\t};\n\t\t5003EF3A278005E800DF2006 /* SecretKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SecretKit;\n\t\t};\n\t\t5003EF3C278005F300DF2006 /* Brief */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Brief;\n\t\t};\n\t\t5003EF3E278005F300DF2006 /* SecretAgentKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SecretAgentKit;\n\t\t};\n\t\t5003EF40278005FA00DF2006 /* SecretKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SecretKit;\n\t\t};\n\t\t5003EF5E2780081600DF2006 /* SecureEnclaveSecretKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SecureEnclaveSecretKit;\n\t\t};\n\t\t5003EF602780081600DF2006 /* SmartCardSecretKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SmartCardSecretKit;\n\t\t};\n\t\t5003EF622780081B00DF2006 /* SecureEnclaveSecretKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SecureEnclaveSecretKit;\n\t\t};\n\t\t5003EF642780081B00DF2006 /* SmartCardSecretKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SmartCardSecretKit;\n\t\t};\n\t\t501421612781262300BBAA70 /* Brief */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Brief;\n\t\t};\n\t\t50692D2C2E6FDC000043C7BB /* XPCWrappers */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = XPCWrappers;\n\t\t};\n\t\t50692D302E6FDC390043C7BB /* Brief */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Brief;\n\t\t};\n\t\t50692E6B2E6FFA510043C7BB /* SecretAgentKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = SecretAgentKit;\n\t\t};\n\t\t50E0145B2EDB9CDF00B121F1 /* Common */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Common;\n\t\t};\n\t\t50E0145D2EDB9CE400B121F1 /* Common */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Common;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 50617D7723FCE48D0099B055 /* Project object */;\n}\n"
  },
  {
    "path": "Sources/Secretive.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/Secretive.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>iOSPackagesShouldBuildARM64e</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/Secretive.xcodeproj/xcshareddata/xcschemes/PackageTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2640\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\"\n      buildArchitectures = \"Automatic\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <TestPlans>\n         <TestPlanReference\n            reference = \"container:Config/Secretive.xctestplan\"\n            default = \"YES\">\n         </TestPlanReference>\n      </TestPlans>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Sources/Secretive.xcodeproj/xcshareddata/xcschemes/SecretAgent.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2640\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50A3B78924026B7500D209EA\"\n               BuildableName = \"SecretAgent.app\"\n               BlueprintName = \"SecretAgent\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Test\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <TestPlans>\n         <TestPlanReference\n            reference = \"container:Config/Secretive.xctestplan\"\n            default = \"YES\">\n         </TestPlanReference>\n      </TestPlans>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"5099A073240242BA0062B6F2\"\n               BuildableName = \"SecretAgentKitTests.xctest\"\n               BlueprintName = \"SecretAgentKitTests\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50617DAF23FCE4AB0099B055\"\n               BuildableName = \"SecretKitTests.xctest\"\n               BlueprintName = \"SecretKitTests\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50617D9323FCE48E0099B055\"\n               BuildableName = \"SecretiveTests.xctest\"\n               BlueprintName = \"SecretiveTests\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50A3B78924026B7500D209EA\"\n            BuildableName = \"SecretAgent.app\"\n            BlueprintName = \"SecretAgent\"\n            ReferencedContainer = \"container:Secretive.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50A3B78924026B7500D209EA\"\n            BuildableName = \"SecretAgent.app\"\n            BlueprintName = \"SecretAgent\"\n            ReferencedContainer = \"container:Secretive.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Sources/Secretive.xcodeproj/xcshareddata/xcschemes/Secretive.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2640\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50617D7E23FCE48D0099B055\"\n               BuildableName = \"Secretive.app\"\n               BlueprintName = \"Secretive\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Test\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <TestPlans>\n         <TestPlanReference\n            reference = \"container:Config/Secretive.xctestplan\"\n            default = \"YES\">\n         </TestPlanReference>\n      </TestPlans>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50617D9323FCE48E0099B055\"\n               BuildableName = \"SecretiveTests.xctest\"\n               BlueprintName = \"SecretiveTests\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"50617DAF23FCE4AB0099B055\"\n               BuildableName = \"SecretKitTests.xctest\"\n               BlueprintName = \"SecretKitTests\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"5099A073240242BA0062B6F2\"\n               BuildableName = \"SecretAgentKitTests.xctest\"\n               BlueprintName = \"SecretAgentKitTests\"\n               ReferencedContainer = \"container:Secretive.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      enableGPUValidationMode = \"1\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50617D7E23FCE48D0099B055\"\n            BuildableName = \"Secretive.app\"\n            BlueprintName = \"Secretive\"\n            ReferencedContainer = \"container:Secretive.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Debug\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"50617D7E23FCE48D0099B055\"\n            BuildableName = \"Secretive.app\"\n            BlueprintName = \"Secretive\"\n            ReferencedContainer = \"container:Secretive.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Sources/SecretiveUpdater/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>XPCService</key>\n\t<dict>\n\t\t<key>ServiceType</key>\n\t\t<string>Application</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretiveUpdater/InternetAccessPolicy.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ApplicationDescription</key>\n\t<string>Secretive is an app for storing and managing SSH keys in the Secure Enclave</string>\n\t<key>DeveloperName</key>\n\t<string>Max Goedjen</string>\n\t<key>Website</key>\n\t<string>https://github.com/maxgoedjen/secretive</string>\n\t<key>Connections</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>IsIncoming</key>\n\t\t\t<false/>\n\t\t\t<key>Host</key>\n\t\t\t<string>api.github.com</string>\n\t\t\t<key>NetworkProtocol</key>\n\t\t\t<string>TCP</string>\n\t\t\t<key>Port</key>\n\t\t\t<string>443</string>\n\t\t\t<key>Purpose</key>\n\t\t\t<string>Secretive checks GitHub for new versions and security updates.</string>\n\t\t\t<key>DenyConsequences</key>\n\t\t\t<string>If you deny these connections, you will not be notified about new versions and critical security updates.</string>\n\t\t</dict>\n\t</array>\n\t<key>Services</key>\n\t<array/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretiveUpdater/SecretiveUpdater.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.hardened-process</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.enable-pure-data</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.checked-allocations.no-tagged-receive</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.dyld-ro</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.enhanced-security-version-string</key>\n\t<string>1</string>\n\t<key>com.apple.security.hardened-process.hardened-heap</key>\n\t<true/>\n\t<key>com.apple.security.hardened-process.platform-restrictions-string</key>\n\t<string>2</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/SecretiveUpdater/SecretiveUpdater.swift",
    "content": "import Foundation\nimport OSLog\nimport XPCWrappers\nimport Brief\n\nfinal class SecretiveUpdater: NSObject, XPCProtocol {\n\n    enum Constants {\n        static let updateURL = URL(string: \"https://api.github.com/repos/maxgoedjen/secretive/releases\")!\n    }\n\n    func process(_: Data) async throws -> [Release] {\n        let (data, _) = try await URLSession.shared.data(from: Constants.updateURL)\n        return try JSONDecoder()\n            .decode([GitHubRelease].self, from: data)\n            .map(Release.init)\n    }\n\n}\n"
  },
  {
    "path": "Sources/SecretiveUpdater/main.swift",
    "content": "import Foundation\nimport XPCWrappers\n\nlet delegate = XPCServiceDelegate(exportedObject: SecretiveUpdater())\nlet listener = NSXPCListener.service()\nlistener.delegate = delegate\nlistener.resume()\n"
  },
  {
    "path": "configure_team_id.sh",
    "content": "#!/bin/bash\n\nTEAM_ID_FILE=Sources/Config/OpenSource.xcconfig\n\nfunction print_team_ids() {\n  echo \"\"\n  echo \"FYI, here are the team IDs found in your Xcode preferences:\"\n  echo \"\"\n  \n  XCODEPREFS=\"$HOME/Library/Preferences/com.apple.dt.Xcode.plist\"\n  TEAM_KEYS=(`/usr/libexec/PlistBuddy -c \"Print :IDEProvisioningTeams\" \"$XCODEPREFS\" | perl -lne 'print $1 if /^    (\\S*) =/'`)\n  \n  for KEY in $TEAM_KEYS \n  do\n      i=0\n      while true ; do\n          NAME=$(/usr/libexec/PlistBuddy -c \"Print :IDEProvisioningTeams:$KEY:$i:teamName\" \"$XCODEPREFS\" 2>/dev/null)\n          TEAMID=$(/usr/libexec/PlistBuddy -c \"Print :IDEProvisioningTeams:$KEY:$i:teamID\" \"$XCODEPREFS\" 2>/dev/null)\n          \n          if [ $? -ne 0 ]; then\n              break\n          fi\n          \n          echo \"$TEAMID - $NAME\"\n          \n          i=$(($i + 1))\n      done\n  done\n}\n\nif [ -z \"$1\" ]; then\n  print_team_ids\n  echo \"\"\n  echo \"> What is your Apple Developer Team ID? (looks like 1A23BDCD)\"\n  read TEAM_ID\nelse\n  TEAM_ID=$1\nfi\n\nif [ -z \"$TEAM_ID\" ]; then\n  echo \"You must enter a team id\"\n  print_team_ids\n  exit 1\nfi\n\necho \"Setting team ID to $TEAM_ID\"\n\necho \"// This file was automatically generated, do not edit directly.\" > $TEAM_ID_FILE\necho \"\" >> $TEAM_ID_FILE\necho \"SECRETIVE_BASE_BUNDLE_ID_OSS=${TEAM_ID}.com.example.Secretive\" >> $TEAM_ID_FILE\necho \"SECRETIVE_DEVELOPMENT_TEAM_OSS=${TEAM_ID}\" >> $TEAM_ID_FILE\n\necho \"\"\necho \"Successfully generated configuration at $TEAM_ID_FILE, you may now build the app using the \\\"Secretive\\\" target\"\necho \"You may need to close and re-open the project in Xcode if it's already open\"\necho \"\""
  }
]