2640 files changed+779980−59611
.editorconfig+7−4
@@ -1,4 +1,4 @@
1−# EditorConfig is awesome: http://EditorConfig.org
1+# EditorConfig is awesome: https://EditorConfig.org
22
33# top-most EditorConfig file
44root = true
@@ -7,10 +7,13 @@ root = true
77[*]
88end_of_line = lf
99insert_final_newline = true
10+trim_trailing_whitespace = true
1011
11−# Matches multiple files with brace expansion notation
1212# Set default charset
13−[*.{js,ts,less}]
13+[*.{js,ts,scss,html}]
1414charset = utf-8
1515indent_style = space
16−indent_size = 4
16+indent_size = 2
17+
18+[*.{ts}]
19+quote_type = single
.eslintignorenew file+19
@@ -0,0 +1,19 @@
1+**/build
2+**/dist
3+
4+**/node_modules
5+
6+**/webpack.*.js
7+**/jest.config.js
8+**/gulpfile.js
9+
10+apps/browser/src/content/autofill.js
11+apps/browser/src/scripts/duo.js
12+
13+apps/desktop/desktop_native
14+apps/desktop/src/scripts/duo.js
15+
16+apps/web/config.js
17+apps/web/scripts/*.js
18+apps/web/src/theme.js
19+apps/web/tailwind.config.js
.eslintrc.jsonnew file+55
@@ -0,0 +1,55 @@
1+{
2+ "root": true,
3+ "env": {
4+ "browser": true,
5+ "webextensions": true
6+ },
7+ "plugins": ["@typescript-eslint"],
8+ "extends": [
9+ "eslint:recommended",
10+ "plugin:@typescript-eslint/recommended",
11+ "plugin:import/recommended",
12+ "plugin:import/typescript",
13+ "prettier"
14+ ],
15+ "rules": {
16+ "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled
17+ "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }],
18+ "@typescript-eslint/explicit-member-accessibility": [
19+ "error",
20+ {
21+ "accessibility": "no-public"
22+ }
23+ ],
24+ "@typescript-eslint/no-this-alias": [
25+ "error",
26+ {
27+ "allowedNames": ["self"]
28+ }
29+ ],
30+ "no-console": "error",
31+ "import/no-unresolved": "off", // TODO: Look into turning off once each package is an actual package.
32+ "import/order": [
33+ "error",
34+ {
35+ "alphabetize": {
36+ "order": "asc"
37+ },
38+ "newlines-between": "always",
39+ "pathGroups": [
40+ {
41+ "pattern": "@bitwarden/**",
42+ "group": "external",
43+ "position": "after"
44+ },
45+ {
46+ "pattern": "src/**/*",
47+ "group": "parent",
48+ "position": "before"
49+ }
50+ ],
51+ "pathGroupsExcludedImportTypes": ["builtin"]
52+ }
53+ ]
54+ }
55+}
.git-blame-ignore-revsnew file+24
@@ -0,0 +1,24 @@
1+# Browser: Apply Prettier https://github.com/bitwarden/browser/pull/2238
2+8fe821b9a3f9728bcb02d607ca75add468d380c1
3+# Browser: Monorepository https://github.com/bitwarden/browser/pull/2531
4+7fe51f83daa38df15a105f4a917abd01d94eddd1
5+
6+# Desktop: Apply Prettier https://github.com/bitwarden/desktop/pull/1202
7+521feae535d83166e620c3c28dfc3e7b0314a00e
8+# Browser: Monorepository https://github.com/bitwarden/clients/commit/7712ca6fa505c4b80b168258a7fc6a02c13160fd
9+28bc4113b9bbae4dba2b5af14d460764fce79acf
10+
11+# CLI: Apply Prettier https://github.com/bitwarden/cli/pull/426
12+910b4a24e649f21acbf4da5b2d422b121d514bd5
13+# CLI: Monorepository https://github.com/bitwarden/clients/commit/980429f4bdcb178d8d92d8202cbdacfaa45c917e
14+980429f4bdcb178d8d92d8202cbdacfaa45c917e
15+
16+# Web: Apply Prettier https://github.com/bitwarden/web/pull/1347
17+56477eb39cfd8a73c9920577d24d75fed36e2cf5
18+# Web: Monorepository https://github.com/bitwarden/clients/commit/02fe7159034b04d763a61fcf0200869e3209fa33
19+02fe7159034b04d763a61fcf0200869e3209fa33
20+
21+# Jslib: Apply Prettier https://github.com/bitwarden/jslib/pull/581
22+193434461dbd9c48fe5dcbad95693470aec422ac
23+# Jslib: Monorepository https://github.com/bitwarden/clients/pull/2824/commits/d7492e3cf320410e74ebd0e0675ab994e64bd01a
24+d7492e3cf320410e74ebd0e0675ab994e64bd01a
.gitattributesnew file+1
@@ -0,0 +1 @@
1+* text=auto eol=lf
.github/ISSUE_TEMPLATE/browser.ymlnew file+93
@@ -0,0 +1,93 @@
1+name: Browser Bug Report
2+description: File a bug report
3+labels: [bug, browser]
4+body:
5+ - type: markdown
6+ attributes:
7+ value: |
8+ Thanks for taking the time to fill out this bug report!
9+
10+ Please do not submit feature requests. The [Community Forums](https://community.bitwarden.com) has a section for submitting, voting for, and discussing product feature requests.
11+ - type: textarea
12+ id: reproduce
13+ attributes:
14+ label: Steps To Reproduce
15+ description: How can we reproduce the behavior.
16+ value: |
17+ 1. Go to '...'
18+ 2. Click on '....'
19+ 3. Scroll down to '....'
20+ 4. Click on '...'
21+ validations:
22+ required: true
23+ - type: textarea
24+ id: expected
25+ attributes:
26+ label: Expected Result
27+ description: A clear and concise description of what you expected to happen.
28+ validations:
29+ required: true
30+ - type: textarea
31+ id: actual
32+ attributes:
33+ label: Actual Result
34+ description: A clear and concise description of what is happening.
35+ validations:
36+ required: true
37+ - type: textarea
38+ id: screenshots
39+ attributes:
40+ label: Screenshots or Videos
41+ description: If applicable, add screenshots and/or a short video to help explain your problem.
42+ - type: textarea
43+ id: additional-context
44+ attributes:
45+ label: Additional Context
46+ description: Add any other context about the problem here.
47+ - type: dropdown
48+ id: os
49+ attributes:
50+ label: Operating System
51+ description: What operating system are you seeing the problem on?
52+ multiple: true
53+ options:
54+ - Windows
55+ - macOS
56+ - Linux
57+ - Android
58+ - iOS
59+ validations:
60+ required: true
61+ - type: input
62+ id: os-version
63+ attributes:
64+ label: Operating System Version
65+ description: What version of the operating system(s) are you seeing the problem on?
66+ - type: dropdown
67+ id: browsers
68+ attributes:
69+ label: Web Browser
70+ description: What browser(s) are you seeing the problem on?
71+ multiple: true
72+ options:
73+ - Chrome
74+ - Safari
75+ - Microsoft Edge
76+ - Firefox
77+ - Opera
78+ - Brave
79+ - Vivaldi
80+ validations:
81+ required: true
82+ - type: input
83+ id: browser-version
84+ attributes:
85+ label: Browser Version
86+ description: What version of the browser(s) are you seeing the problem on?
87+ - type: input
88+ id: version
89+ attributes:
90+ label: Build Version
91+ description: What version of our software are you running? (go to "Settings" → "About" in the extension)
92+ validations:
93+ required: true
.github/ISSUE_TEMPLATE/cli.ymlnew file+82
@@ -0,0 +1,82 @@
1+name: CLI Bug Report
2+description: File a bug report
3+labels: [bug, cli]
4+body:
5+ - type: markdown
6+ attributes:
7+ value: |
8+ Thanks for taking the time to fill out this bug report!
9+
10+ Please do not submit feature requests. The [Community Forums](https://community.bitwarden.com) has a section for submitting, voting for, and discussing product feature requests.
11+ - type: textarea
12+ id: reproduce
13+ attributes:
14+ label: Steps To Reproduce
15+ description: How can we reproduce the behavior.
16+ value: |
17+ 1. Go to '...'
18+ 2. Click on '....'
19+ 3. Scroll down to '....'
20+ 4. Click on '...'
21+ validations:
22+ required: true
23+ - type: textarea
24+ id: expected
25+ attributes:
26+ label: Expected Result
27+ description: A clear and concise description of what you expected to happen.
28+ validations:
29+ required: true
30+ - type: textarea
31+ id: actual
32+ attributes:
33+ label: Actual Result
34+ description: A clear and concise description of what is happening.
35+ validations:
36+ required: true
37+ - type: textarea
38+ id: screenshots
39+ attributes:
40+ label: Screenshots or Videos
41+ description: If applicable, add screenshots and/or a short video to help explain your problem.
42+ - type: textarea
43+ id: additional-context
44+ attributes:
45+ label: Additional Context
46+ description: Add any other context about the problem here.
47+ - type: dropdown
48+ id: os
49+ attributes:
50+ label: Operating System
51+ description: What operating system are you seeing the problem on?
52+ multiple: true
53+ options:
54+ - Windows
55+ - macOS
56+ - Linux
57+ validations:
58+ required: true
59+ - type: input
60+ id: os-version
61+ attributes:
62+ label: Operating System Version
63+ description: What version of the operating system(s) are you seeing the problem on?
64+ - type: dropdown
65+ id: shell
66+ attributes:
67+ label: Shell
68+ description: What shell(s) are you seeing the problem on?
69+ multiple: true
70+ options:
71+ - Bash
72+ - Zsh
73+ - PowerShell
74+ validations:
75+ required: true
76+ - type: input
77+ id: version
78+ attributes:
79+ label: Build Version
80+ description: What version of our software are you running? (run `bw --version`)
81+ validations:
82+ required: true
.github/ISSUE_TEMPLATE/config.ymlnew file+20
@@ -0,0 +1,20 @@
1+blank_issues_enabled: false
2+contact_links:
3+ - name: Report failure of prompt to save credentials in browser
4+ url: https://docs.google.com/forms/d/e/1FAIpQLSeG-Dtpn2xnr9N7oF04NyY6ETUM-JF8pagFfAv8mW7bgcMVxA/viewform
5+ about: We are aware of many sites' login forms where the Bitwarden browser extension either on a single platform/browser or multiple will not prompt the user to save a new password or update an existing password. This is something the Bitwarden team is actively working on but need your help as a community and active Bitwarden users!
6+ - name: Report autofill failure in browser
7+ url: https://docs.google.com/forms/d/e/1FAIpQLSfkxh1w6vK8fLYwAbAAEVhvhMAJwfFNDtYtPUVk1y5WTHvJmQ/viewform
8+ about: We are aware of many sites' login forms, payment gateways, identity forms, etc. where the Bitwarden browser extension either on a single platform/browser or multiple will not autofill information. This is something the Bitwarden team is actively working on but need your help as a community and active Bitwarden users!
9+ - name: Feature Requests
10+ url: https://community.bitwarden.com/c/feature-requests/
11+ about: Request new features using the Community Forums. Please search existing feature requests before making a new one.
12+ - name: Bitwarden Community Forums
13+ url: https://community.bitwarden.com
14+ about: Please visit the community forums for general community discussion, support and the development roadmap.
15+ - name: Customer Support
16+ url: https://bitwarden.com/contact/
17+ about: Please contact our customer support for account issues and general customer support.
18+ - name: Security Issues
19+ url: https://hackerone.com/bitwarden
20+ about: We use HackerOne to manage security disclosures.
.github/ISSUE_TEMPLATE/desktop.ymlnew file+85
@@ -0,0 +1,85 @@
1+name: Desktop Bug Report
2+description: File a bug report
3+labels: [bug, desktop]
4+body:
5+ - type: markdown
6+ attributes:
7+ value: |
8+ Thanks for taking the time to fill out this bug report!
9+
10+ Please do not submit feature requests. The [Community Forums](https://community.bitwarden.com) has a section for submitting, voting for, and discussing product feature requests.
11+ - type: textarea
12+ id: reproduce
13+ attributes:
14+ label: Steps To Reproduce
15+ description: How can we reproduce the behavior.
16+ value: |
17+ 1. Go to '...'
18+ 2. Click on '....'
19+ 3. Scroll down to '....'
20+ 4. Click on '...'
21+ validations:
22+ required: true
23+ - type: textarea
24+ id: expected
25+ attributes:
26+ label: Expected Result
27+ description: A clear and concise description of what you expected to happen.
28+ validations:
29+ required: true
30+ - type: textarea
31+ id: actual
32+ attributes:
33+ label: Actual Result
34+ description: A clear and concise description of what is happening.
35+ validations:
36+ required: true
37+ - type: textarea
38+ id: screenshots
39+ attributes:
40+ label: Screenshots or Videos
41+ description: If applicable, add screenshots and/or a short video to help explain your problem.
42+ - type: textarea
43+ id: additional-context
44+ attributes:
45+ label: Additional Context
46+ description: Add any other context about the problem here.
47+ - type: dropdown
48+ id: os
49+ attributes:
50+ label: Operating System
51+ description: What operating system are you seeing the problem on?
52+ multiple: true
53+ options:
54+ - Windows
55+ - macOS
56+ - Linux
57+ validations:
58+ required: true
59+ - type: input
60+ id: os-version
61+ attributes:
62+ label: Operating System Version
63+ description: What version of the operating system(s) are you seeing the problem on?
64+ - type: dropdown
65+ id: install-method
66+ attributes:
67+ label: Installation method
68+ multiple: true
69+ options:
70+ - Direct Download (from bitwarden.com)
71+ - Mac App Store
72+ - Microsoft Store
73+ - Homebrew
74+ - Chocolatey
75+ - Snap
76+ - Other
77+ validations:
78+ required: true
79+ - type: input
80+ id: version
81+ attributes:
82+ label: Build Version
83+ description: What version of our software are you running? (go to "Help" → "About Bitwarden" in the app)
84+ validations:
85+ required: true
.github/ISSUE_TEMPLATE/web.ymlnew file+93
@@ -0,0 +1,93 @@
1+name: Web Bug Report
2+description: File a bug report
3+labels: [bug, web]
4+body:
5+ - type: markdown
6+ attributes:
7+ value: |
8+ Thanks for taking the time to fill out this bug report!
9+
10+ Please do not submit feature requests. The [Community Forums](https://community.bitwarden.com) has a section for submitting, voting for, and discussing product feature requests.
11+ - type: textarea
12+ id: reproduce
13+ attributes:
14+ label: Steps To Reproduce
15+ description: How can we reproduce the behavior.
16+ value: |
17+ 1. Go to '...'
18+ 2. Click on '....'
19+ 3. Scroll down to '....'
20+ 4. Click on '...'
21+ validations:
22+ required: true
23+ - type: textarea
24+ id: expected
25+ attributes:
26+ label: Expected Result
27+ description: A clear and concise description of what you expected to happen.
28+ validations:
29+ required: true
30+ - type: textarea
31+ id: actual
32+ attributes:
33+ label: Actual Result
34+ description: A clear and concise description of what is happening.
35+ validations:
36+ required: true
37+ - type: textarea
38+ id: screenshots
39+ attributes:
40+ label: Screenshots or Videos
41+ description: If applicable, add screenshots and/or a short video to help explain your problem.
42+ - type: textarea
43+ id: additional-context
44+ attributes:
45+ label: Additional Context
46+ description: Add any other context about the problem here.
47+ - type: dropdown
48+ id: os
49+ attributes:
50+ label: Operating System
51+ description: What operating system are you seeing the problem on?
52+ multiple: true
53+ options:
54+ - Windows
55+ - macOS
56+ - Linux
57+ - Android
58+ - iOS
59+ validations:
60+ required: true
61+ - type: input
62+ id: os-version
63+ attributes:
64+ label: Operating System Version
65+ description: What version of the operating system(s) are you seeing the problem on?
66+ - type: dropdown
67+ id: browsers
68+ attributes:
69+ label: Web Browser
70+ description: What browser(s) are you seeing the problem on?
71+ multiple: true
72+ options:
73+ - Chrome
74+ - Safari
75+ - Microsoft Edge
76+ - Firefox
77+ - Opera
78+ - Brave
79+ - Vivaldi
80+ validations:
81+ required: true
82+ - type: input
83+ id: browser-version
84+ attributes:
85+ label: Browser Version
86+ description: What version of the browser(s) are you seeing the problem on?
87+ - type: input
88+ id: version
89+ attributes:
90+ label: Build Version
91+ description: What version of our software are you running? (Bottom of the page)
92+ validations:
93+ required: true
.github/PULL_REQUEST_TEMPLATE.mdnew file+37
@@ -0,0 +1,37 @@
1+## Type of change
2+
3+<!-- (mark with an `X`) -->
4+
5+```
6+- [ ] Bug fix
7+- [ ] New feature development
8+- [ ] Tech debt (refactoring, code cleanup, dependency upgrades, etc)
9+- [ ] Build/deploy pipeline (DevOps)
10+- [ ] Other
11+```
12+
13+## Objective
14+
15+<!--Describe what the purpose of this PR is. For example: what bug you're fixing or what new feature you're adding-->
16+
17+## Code changes
18+
19+<!--Explain the changes you've made to each file or major component. This should help the reviewer understand your changes-->
20+<!--Also refer to any related changes or PRs in other repositories-->
21+
22+- **file.ext:** Description of what was changed and why
23+
24+## Screenshots
25+
26+<!--Required for any UI changes. Delete if not applicable-->
27+
28+## Before you submit
29+
30+<!-- (mark with an `X`) -->
31+
32+```
33+- [ ] I have checked for **linting** errors (`npm run lint`) (required)
34+- [ ] I have added **unit tests** where it makes sense to do so (encouraged but not required)
35+- [ ] This change requires a **documentation update** (notify the documentation team)
36+- [ ] This change has particular **deployment requirements** (notify the DevOps team)
37+```
.github/secrets/appstore-app-cert.p12.gpgnew file
Binary file not shown.
.github/secrets/appstore-installer-cert.p12.gpgnew file
Binary file not shown.
.github/secrets/bitwarden-desktop-key.p12.gpgnew file
Binary file not shown.
.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpgnew file
Binary file not shown.
.github/secrets/devid-app-cert.p12.gpgnew file
Binary file not shown.
.github/secrets/devid-installer-cert.p12.gpgnew file
Binary file not shown.
.github/secrets/macdev-cert.p12.gpgnew file
Binary file not shown.
.github/workflows/automatic-issue-responses.ymlnew file+64
@@ -0,0 +1,64 @@
1+---
2+name: Automatic responses
3+on:
4+ issues:
5+ types:
6+ - labeled
7+jobs:
8+ close-issue:
9+ name: 'Close issue with automatic response'
10+ runs-on: ubuntu-20.04
11+ permissions:
12+ issues: write
13+ steps:
14+ # Feature request
15+ - if: github.event.label.name == 'feature-request'
16+ name: Feature request
17+ uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
18+ with:
19+ comment: |
20+ We use GitHub issues as a place to track bugs and other development related issues. The [Bitwarden Community Forums](https://community.bitwarden.com/) has a [Feature Requests](https://community.bitwarden.com/c/feature-requests) section for submitting, voting for, and discussing requests like this one.
21+
22+ Please [sign up on our forums](https://community.bitwarden.com/signup) and search to see if this request already exists. If so, you can vote for it and contribute to any discussions about it. If not, you can re-create the request there so that it can be properly tracked.
23+
24+ This issue will now be closed. Thanks!
25+ # Intended behavior
26+ - if: github.event.label.name == 'intended-behavior'
27+ name: Intended behaviour
28+ uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
29+ with:
30+ comment: |
31+ Your issue appears to be describing the intended behavior of the software. If you want this to be changed, it would be a feature request.
32+
33+ We use GitHub issues as a place to track bugs and other development related issues. The [Bitwarden Community Forums](https://community.bitwarden.com/) has a [Feature Requests](https://community.bitwarden.com/c/feature-requests) section for submitting, voting for, and discussing requests like this one.
34+
35+ Please [sign up on our forums](https://community.bitwarden.com/signup) and search to see if this request already exists. If so, you can vote for it and contribute to any discussions about it. If not, you can re-create the request there so that it can be properly tracked.
36+
37+ This issue will now be closed. Thanks!
38+ # Customer support request
39+ - if: github.event.label.name == 'customer-support'
40+ name: Customer Support request
41+ uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
42+ with:
43+ comment: |
44+ We use GitHub issues as a place to track bugs and other development related issues. Your issue appears to be a support request, or would otherwise be better handled by our dedicated Customer Success team.
45+
46+ Please contact us using our [Contact page](https://bitwarden.com/contact). You can include a link to this issue in the message content.
47+
48+ Alternatively, you can also search for an answer in our [help documentation](https://bitwarden.com/help/) or get help from other Bitwarden users on our [community forums](https://community.bitwarden.com/c/support/). The issue here will be closed.
49+ # Resolved
50+ - if: github.event.label.name == 'resolved'
51+ name: Resolved
52+ uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
53+ with:
54+ comment: |
55+ We’ve closed this issue, as it appears the original problem has been resolved. If this happens again or continues to be an problem, please respond to this issue with any additional detail to assist with reproduction and root cause analysis.
56+ # Stale
57+ - if: github.event.label.name == 'stale'
58+ name: Stale
59+ uses: peter-evans/close-issue@849549ba7c3a595a064c4b2c56f206ee78f93515 # v2.0.0
60+ with:
61+ comment: |
62+ As we haven’t heard from you about this problem in some time, this issue will now be closed.
63+
64+ If this happens again or continues to be an problem, please respond to this issue with any additional detail to assist with reproduction and root cause analysis.
.github/workflows/brew-bump-cli.ymlnew file+42
@@ -0,0 +1,42 @@
1+---
2+name: Bump CLI Formula
3+
4+on:
5+ push:
6+ tags:
7+ - cli-v**
8+ workflow_dispatch:
9+
10+defaults:
11+ run:
12+ shell: bash
13+
14+jobs:
15+ update-desktop-cask:
16+ name: Update Bitwarden CLI Formula
17+ runs-on: macos-11
18+ steps:
19+ - name: Login to Azure
20+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
21+ with:
22+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
23+
24+ - name: Retrieve secrets
25+ id: retrieve-secrets
26+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
27+ with:
28+ keyvault: "bitwarden-prod-kv"
29+ secrets: "brew-bump-workflow-pat"
30+
31+ - name: Update Homebrew formula
32+ uses: dawidd6/action-homebrew-bump-formula@dd221ff435f42fa8102b5871bb1929af9d76476c
33+ with:
34+ # Required, custom GitHub access token with the 'public_repo' and 'workflow' scopes
35+ token: ${{ steps.retrieve-secrets.outputs.brew-bump-workflow-pat }}
36+ org: bitwarden
37+ tap: Homebrew/homebrew-core
38+ cask: bitwarden-cli
39+ tag: ${{ github.ref }}
40+ revision: ${{ github.sha }}
41+ force: false
42+ dryrun: true
.github/workflows/brew-bump-desktop.ymlnew file+42
@@ -0,0 +1,42 @@
1+---
2+name: Bump Desktop Cask
3+
4+on:
5+ push:
6+ tags:
7+ - desktop-v**
8+ workflow_dispatch:
9+
10+defaults:
11+ run:
12+ shell: bash
13+
14+jobs:
15+ update-desktop-cask:
16+ name: Update Bitwarden Desktop Cask
17+ runs-on: macos-11
18+ steps:
19+ - name: Login to Azure
20+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
21+ with:
22+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
23+
24+ - name: Retrieve secrets
25+ id: retrieve-secrets
26+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
27+ with:
28+ keyvault: "bitwarden-prod-kv"
29+ secrets: "brew-bump-workflow-pat"
30+
31+ - name: Update Homebrew cask
32+ uses: macauley/action-homebrew-bump-cask@445c42390d790569d938f9068d01af39ca030feb
33+ with:
34+ # Required, custom GitHub access token with the 'public_repo' and 'workflow' scopes
35+ token: ${{ steps.retrieve-secrets.outputs.brew-bump-workflow-pat }}
36+ org: bitwarden
37+ tap: Homebrew/homebrew-cask
38+ cask: bitwarden
39+ tag: ${{ github.ref }}
40+ revision: ${{ github.sha }}
41+ force: false
42+ dryrun: true
.github/workflows/build-browser.ymlnew file+449
@@ -0,0 +1,449 @@
1+---
2+name: Build Browser
3+
4+on:
5+ pull_request:
6+ branches-ignore:
7+ - 'l10n_master'
8+ - 'cf-pages'
9+ paths:
10+ - 'apps/browser/**'
11+ - 'libs/**'
12+ - '*'
13+ - '!*.md'
14+ - '!*.txt'
15+ push:
16+ branches:
17+ - 'master'
18+ - 'rc'
19+ - 'hotfix-rc/**'
20+ paths:
21+ - 'apps/browser/**'
22+ - 'libs/**'
23+ - '*'
24+ - '!*.md'
25+ - '!*.txt'
26+ - '.github/workflows/build-browser.yml'
27+ workflow_dispatch:
28+ inputs: {}
29+
30+defaults:
31+ run:
32+ shell: bash
33+
34+jobs:
35+ cloc:
36+ name: CLOC
37+ runs-on: ubuntu-20.04
38+ steps:
39+ - name: Checkout repo
40+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
41+
42+ - name: Set up cloc
43+ run: |
44+ sudo apt update
45+ sudo apt -y install cloc
46+
47+ - name: Print lines of code
48+ run: cloc --include-lang TypeScript,JavaScript,HTML,Sass,CSS --vcs git
49+
50+
51+ setup:
52+ name: Setup
53+ runs-on: ubuntu-20.04
54+ outputs:
55+ repo_url: ${{ steps.gen_vars.outputs.repo_url }}
56+ adj_build_number: ${{ steps.gen_vars.outputs.adj_build_number }}
57+ steps:
58+ - name: Get Package Version
59+ id: gen_vars
60+ run: |
61+ repo_url=https://github.com/$GITHUB_REPOSITORY.git
62+ adj_build_num=${GITHUB_SHA:0:7}
63+
64+ echo "::set-output name=repo_url::$repo_url"
65+ echo "::set-output name=adj_build_number::$adj_build_num"
66+
67+
68+ locales-test:
69+ name: Locales Test
70+ runs-on: ubuntu-20.04
71+ needs:
72+ - setup
73+ defaults:
74+ run:
75+ working-directory: apps/browser
76+ steps:
77+ - name: Checkout repo
78+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
79+
80+ - name: Testing locales - extName length
81+ run: |
82+ found_error=false
83+
84+ echo "Locales Test"
85+ echo "============"
86+ echo "extName string must be 40 characters or less"
87+ echo
88+ for locale in $(ls src/_locales/); do
89+ string_length=$(jq '.extName.message | length' src/_locales/$locale/messages.json)
90+ if [[ $string_length -gt 40 ]]; then
91+ echo "$locale: $string_length"
92+ found_error=true
93+ fi
94+ done
95+
96+ if $found_error; then
97+ echo
98+ echo "Please fix 'extName' for the locales listed above."
99+ exit 1
100+ else
101+ echo "Test passed!"
102+ fi
103+
104+
105+ build:
106+ name: Build
107+ runs-on: windows-2019
108+ needs:
109+ - setup
110+ - locales-test
111+ env:
112+ _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }}
113+ defaults:
114+ run:
115+ working-directory: apps/browser
116+ steps:
117+ - name: Checkout repo
118+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
119+
120+ - name: Set up Node
121+ uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # v3.3.0
122+ with:
123+ cache: 'npm'
124+ cache-dependency-path: '**/package-lock.json'
125+ node-version: '16'
126+
127+ - name: Install node-gyp
128+ run: |
129+ npm install -g node-gyp
130+ node-gyp install $(node -v)
131+
132+ - name: Print environment
133+ run: |
134+ node --version
135+ npm --version
136+
137+ - name: NPM setup
138+ run: npm ci
139+ working-directory: ./
140+
141+ - name: Build & Test
142+ run: |
143+ npm run dist
144+ npm run test
145+
146+ - name: Gulp
147+ run: gulp ci
148+
149+ - name: Build sources for reviewers
150+ shell: cmd
151+ run: |
152+ REM Remove ".git" directory
153+ rmdir /S /Q ".git"
154+
155+ REM Copy root level files to source directory
156+ mkdir browser-source
157+ copy * browser-source
158+
159+ REM Copy apps\browser to Browser source directory
160+ mkdir browser-source\apps\browser
161+ xcopy apps\browser\* browser-source\apps\browser /E
162+
163+ REM Copy libs to Browser source directory
164+ mkdir browser-source\libs
165+ xcopy libs\* browser-source\libs /E
166+
167+ call 7z a browser-source.zip "browser-source\*"
168+ working-directory: ./
169+
170+ - name: Upload Opera artifact
171+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
172+ with:
173+ name: dist-opera-${{ env._BUILD_NUMBER }}.zip
174+ path: apps/browser/dist/dist-opera.zip
175+ if-no-files-found: error
176+
177+ - name: Upload Chrome artifact
178+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
179+ with:
180+ name: dist-chrome-${{ env._BUILD_NUMBER }}.zip
181+ path: apps/browser/dist/dist-chrome.zip
182+ if-no-files-found: error
183+
184+ - name: Upload Firefox artifact
185+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
186+ with:
187+ name: dist-firefox-${{ env._BUILD_NUMBER }}.zip
188+ path: apps/browser/dist/dist-firefox.zip
189+ if-no-files-found: error
190+
191+ - name: Upload Edge artifact
192+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
193+ with:
194+ name: dist-edge-${{ env._BUILD_NUMBER }}.zip
195+ path: apps/browser/dist/dist-edge.zip
196+ if-no-files-found: error
197+
198+ - name: Upload browser source
199+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
200+ with:
201+ name: browser-source-${{ env._BUILD_NUMBER }}.zip
202+ path: browser-source.zip
203+ if-no-files-found: error
204+
205+ - name: Upload coverage artifact
206+ if: false
207+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
208+ with:
209+ name: coverage-${{ env._BUILD_NUMBER }}.zip
210+ path: apps/browser/coverage/coverage-${{ env._BUILD_NUMBER }}.zip
211+ if-no-files-found: error
212+
213+ build-safari:
214+ name: Build Safari
215+ runs-on: macos-11
216+ needs:
217+ - setup
218+ - locales-test
219+ env:
220+ _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }}
221+ steps:
222+ - name: Checkout repo
223+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
224+
225+ - name: Set up Node
226+ uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # v3.3.0
227+ with:
228+ cache: 'npm'
229+ cache-dependency-path: '**/package-lock.json'
230+ node-version: '16'
231+
232+ - name: Print environment
233+ run: |
234+ node --version
235+ npm --version
236+
237+ - name: Decrypt secrets
238+ env:
239+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
240+ run: |
241+ mkdir -p $HOME/secrets
242+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
243+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
244+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
245+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
246+ --output "$HOME/secrets/appstore-app-cert.p12" \
247+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
248+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
249+ --output "$HOME/secrets/appstore-installer-cert.p12" \
250+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
251+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
252+ --output "$HOME/secrets/devid-app-cert.p12" \
253+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
254+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
255+ --output "$HOME/secrets/devid-installer-cert.p12" \
256+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
257+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
258+ --output "$HOME/secrets/macdev-cert.p12" \
259+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
260+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
261+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
262+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
263+
264+ - name: Set up keychain
265+ env:
266+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
267+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
268+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
269+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
270+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
271+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
272+ run: |
273+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
274+ security default-keychain -s build.keychain
275+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
276+ security set-keychain-settings -lut 1200 build.keychain
277+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
278+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
279+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
280+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
281+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
282+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
283+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
284+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
285+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
286+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
287+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
288+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
289+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
290+
291+ - name: NPM setup
292+ run: npm ci
293+ working-directory: ./
294+
295+ - name: Build Safari extension
296+ run: npm run dist:safari
297+ working-directory: apps/browser
298+
299+ - name: Zip Safari build artifact
300+ run: |
301+ cd apps/browser/dist
302+ zip dist-safari.zip ./Safari/**/build/Release/safari.appex -r
303+ pwd
304+ ls -la
305+
306+ - name: Upload Safari artifact
307+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
308+ with:
309+ name: dist-safari-${{ env._BUILD_NUMBER }}.zip
310+ path: apps/browser/dist/dist-safari.zip
311+ if-no-files-found: error
312+
313+ crowdin-push:
314+ name: Crowdin Push
315+ if: github.ref == 'refs/heads/master'
316+ runs-on: ubuntu-20.04
317+ needs:
318+ - build
319+ - build-safari
320+ steps:
321+ - name: Checkout repo
322+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
323+
324+ - name: Login to Azure
325+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
326+ with:
327+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
328+
329+ - name: Retrieve secrets
330+ id: retrieve-secrets
331+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
332+ with:
333+ keyvault: "bitwarden-prod-kv"
334+ secrets: "crowdin-api-token"
335+
336+ - name: Upload Sources
337+ uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9
338+ env:
339+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
340+ CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
341+ CROWDIN_PROJECT_ID: "268134"
342+ with:
343+ config: apps/browser/crowdin.yml
344+ crowdin_branch_name: master
345+ upload_sources: true
346+ upload_translations: false
347+
348+ trigger-desktop-build:
349+ name: Trigger desktop build
350+ if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') || contains(github.ref, 'hotfix-rc') }}
351+ runs-on: ubuntu-20.04
352+ needs:
353+ - build
354+ - build-safari
355+ steps:
356+
357+ - name: Login to Azure
358+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010
359+ with:
360+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
361+
362+ - name: Retrieve secrets
363+ id: retrieve-secrets
364+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
365+ with:
366+ keyvault: "bitwarden-prod-kv"
367+ secrets: "github-pat-bitwarden-devops-bot-repo-scope"
368+
369+ - name: Extract branch name
370+ id: extract_branch
371+ shell: bash
372+ run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
373+
374+ - name: Call GitHub API to trigger desktop build workflow
375+ env:
376+ TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }}
377+ BRANCH_NAME: ${{ steps.extract_branch.outputs.branch }}
378+ run: |
379+
380+ JSON_STRING=$(printf '{"ref":"%s"}' "$BRANCH_NAME")
381+
382+ curl \
383+ -X POST \
384+ -i -u bitwarden-devops-bot:$TOKEN \
385+ -H "Accept: application/vnd.github.v3+json" \
386+ https://api.github.com/repos/bitwarden/clients/actions/workflows/build-desktop.yml/dispatches \
387+ -d $JSON_STRING
388+
389+ check-failures:
390+ name: Check for failures
391+ if: always()
392+ runs-on: ubuntu-20.04
393+ needs:
394+ - cloc
395+ - setup
396+ - locales-test
397+ - build
398+ - build-safari
399+ - crowdin-push
400+ - trigger-desktop-build
401+ steps:
402+ - name: Check if any job failed
403+ if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }}
404+ env:
405+ CLOC_STATUS: ${{ needs.cloc.result }}
406+ SETUP_STATUS: ${{ needs.setup.result }}
407+ LOCALES_TEST_STATUS: ${{ needs.locales-test.result }}
408+ BUILD_STATUS: ${{ needs.build.result }}
409+ SAFARI_BUILD_STATUS: ${{ needs.build-safari.result }}
410+ CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }}
411+ TRIGGER_DESKTOP_BUILD_STATUS: ${{ needs.trigger-desktop-build.result }}
412+ run: |
413+ if [ "$CLOC_STATUS" = "failure" ]; then
414+ exit 1
415+ elif [ "$SETUP_STATUS" = "failure" ]; then
416+ exit 1
417+ elif [ "$LOCALES_TEST_STATUS" = "failure" ]; then
418+ exit 1
419+ elif [ "$BUILD_STATUS" = "failure" ]; then
420+ exit 1
421+ elif [ "$SAFARI_BUILD_STATUS" = "failure" ]; then
422+ exit 1
423+ elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then
424+ exit 1
425+ elif [ "$TRIGGER_DESKTOP_BUILD_STATUS" = "failure" ]; then
426+ exit 1
427+ fi
428+
429+ - name: Login to Azure - Prod Subscription
430+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
431+ if: failure()
432+ with:
433+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
434+
435+ - name: Retrieve secrets
436+ id: retrieve-secrets
437+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
438+ if: failure()
439+ with:
440+ keyvault: "bitwarden-prod-kv"
441+ secrets: "devops-alerts-slack-webhook-url"
442+
443+ - name: Notify Slack on failure
444+ uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 # v1.5.0
445+ if: failure()
446+ env:
447+ SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
448+ with:
449+ status: ${{ job.status }}
.github/workflows/build-cli.ymlnew file+378
@@ -0,0 +1,378 @@
1+---
2+name: Build CLI
3+
4+on:
5+ pull_request:
6+ branches-ignore:
7+ - 'l10n_master'
8+ - 'cf-pages'
9+ paths:
10+ - 'apps/cli/**'
11+ - 'libs/**'
12+ - '*'
13+ - '!*.md'
14+ - '!*.txt'
15+ - '.github/workflows/build-cli.yml'
16+ push:
17+ branches:
18+ - 'master'
19+ - 'rc'
20+ - 'hotfix-rc/**'
21+ paths:
22+ - 'apps/cli/**'
23+ - 'libs/**'
24+ - '*'
25+ - '!*.md'
26+ - '!*.txt'
27+ - '.github/workflows/build-cli.yml'
28+ workflow_dispatch:
29+ inputs: {}
30+
31+defaults:
32+ run:
33+ working-directory: apps/cli
34+
35+jobs:
36+ cloc:
37+ name: CLOC
38+ runs-on: ubuntu-20.04
39+ steps:
40+ - name: Checkout repo
41+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
42+
43+ - name: Set up cloc
44+ run: |
45+ sudo apt update
46+ sudo apt -y install cloc
47+
48+ - name: Print lines of code
49+ run: cloc --include-lang TypeScript,JavaScript --vcs git
50+
51+
52+ setup:
53+ name: Setup
54+ runs-on: ubuntu-20.04
55+ outputs:
56+ package_version: ${{ steps.retrieve-version.outputs.package_version }}
57+ steps:
58+ - name: Checkout repo
59+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
60+
61+ - name: Get Package Version
62+ id: retrieve-version
63+ run: |
64+ PKG_VERSION=$(jq -r .version package.json)
65+ echo "::set-output name=package_version::$PKG_VERSION"
66+
67+
68+ cli:
69+ name: Build CLI
70+ runs-on: windows-2019
71+ needs:
72+ - setup
73+ env:
74+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
75+ _WIN_PKG_FETCH_VERSION: 16.15.0
76+ _WIN_PKG_VERSION: 3.4
77+ steps:
78+ - name: Checkout repo
79+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
80+
81+ - name: Setup Windows builder
82+ run: |
83+ choco install checksum --no-progress
84+ choco install reshack --no-progress
85+ choco install nasm --no-progress
86+
87+ - name: Set up Node
88+ uses: actions/setup-node@17f8bd926464a1afa4c6a11669539e9c1ba77048 # v3.2.0
89+ with:
90+ cache: 'npm'
91+ cache-dependency-path: '**/package-lock.json'
92+ node-version: '16'
93+
94+ - name: Install node-gyp
95+ run: |
96+ npm install -g node-gyp
97+ node-gyp install $(node -v)
98+
99+ - name: Get pkg-fetch
100+ shell: pwsh
101+ run: |
102+ cd $HOME
103+ $fetchedUrl = "https://github.com/vercel/pkg-fetch/releases/download/v$env:_WIN_PKG_VERSION/node-v$env:_WIN_PKG_FETCH_VERSION-win-x64"
104+ New-Item -ItemType directory -Path .\.pkg-cache
105+ New-Item -ItemType directory -Path .\.pkg-cache\v$env:_WIN_PKG_VERSION
106+ Invoke-RestMethod -Uri $fetchedUrl `
107+ -OutFile ".\.pkg-cache\v$env:_WIN_PKG_VERSION\fetched-v$env:_WIN_PKG_FETCH_VERSION-win-x64"
108+
109+ - name: Setup Version Info
110+ shell: pwsh
111+ run: |
112+ $major,$minor,$patch = $env:_PACKAGE_VERSION.split('.')
113+ $versionInfo = @"
114+ 1 VERSIONINFO
115+ FILEVERSION $major,$minor,$patch,0
116+ PRODUCTVERSION $major,$minor,$patch,0
117+ FILEOS 0x40004
118+ FILETYPE 0x1
119+ {
120+ BLOCK "StringFileInfo"
121+ {
122+ BLOCK "040904b0"
123+ {
124+ VALUE "CompanyName", "Bitwarden Inc."
125+ VALUE "ProductName", "Bitwarden"
126+ VALUE "FileDescription", "Bitwarden CLI"
127+ VALUE "FileVersion", "$env:_PACKAGE_VERSION"
128+ VALUE "ProductVersion", "$env:_PACKAGE_VERSION"
129+ VALUE "OriginalFilename", "bw.exe"
130+ VALUE "InternalName", "bw"
131+ VALUE "LegalCopyright", "Copyright Bitwarden Inc."
132+ }
133+ }
134+ BLOCK "VarFileInfo"
135+ {
136+ VALUE "Translation", 0x0409 0x04B0
137+ }
138+ }
139+ "@
140+ $versionInfo | Out-File ./version-info.rc
141+ # https://github.com/vercel/pkg-fetch/issues/188
142+
143+ - name: Resource Hacker
144+ shell: cmd
145+ run: |
146+ set PATH=%PATH%;C:\Program Files (x86)\Resource Hacker
147+ set WIN_PKG=C:\Users\runneradmin\.pkg-cache\v%_WIN_PKG_VERSION%\fetched-v%_WIN_PKG_FETCH_VERSION%-win-x64
148+ set WIN_PKG_BUILT=C:\Users\runneradmin\.pkg-cache\v%_WIN_PKG_VERSION%\built-v%_WIN_PKG_FETCH_VERSION%-win-x64
149+ copy %WIN_PKG% %WIN_PKG_BUILT%
150+ ResourceHacker -open %WIN_PKG_BUILT% -save %WIN_PKG_BUILT% -action delete -mask ICONGROUP,1,
151+ ResourceHacker -open version-info.rc -save version-info.res -action compile
152+ ResourceHacker -open %WIN_PKG_BUILT% -save %WIN_PKG_BUILT% -action addoverwrite -resource version-info.res
153+
154+ - name: Install
155+ run: npm ci
156+ working-directory: ./
157+
158+ - name: Run tests
159+ run: npm run test
160+
161+ - name: Build & Package
162+ run: npm run dist --quiet
163+
164+ - name: Package Chocolatey
165+ shell: pwsh
166+ run: |
167+ Copy-Item -Path stores/chocolatey -Destination dist/chocolatey -Recurse
168+ Copy-Item dist/windows/bw.exe -Destination dist/chocolatey/tools
169+ Copy-Item ${{ github.workspace }}/LICENSE.txt -Destination dist/chocolatey/tools
170+ choco pack dist/chocolatey/bitwarden-cli.nuspec --version ${{ env._PACKAGE_VERSION }} --out dist/chocolatey
171+
172+ - name: Zip
173+ shell: cmd
174+ run: |
175+ 7z a ./dist/bw-windows-%_PACKAGE_VERSION%.zip ./dist/windows/bw.exe
176+ 7z a ./dist/bw-macos-%_PACKAGE_VERSION%.zip ./dist/macos/bw
177+ 7z a ./dist/bw-linux-%_PACKAGE_VERSION%.zip ./dist/linux/bw
178+
179+ - name: Version Test
180+ run: |
181+ dir ./dist/
182+ Expand-Archive -Path "./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" -DestinationPath "./test/windows"
183+ $testVersion = Invoke-Expression '& ./test/windows/bw.exe -v'
184+ echo "version: $env:_PACKAGE_VERSION"
185+ echo "testVersion: $testVersion"
186+ if($testVersion -ne $env:_PACKAGE_VERSION) {
187+ Throw "Version test failed."
188+ }
189+
190+ - name: Create checksums
191+ run: |
192+ checksum -f="./dist/bw-windows-${env:_PACKAGE_VERSION}.zip" `
193+ -t sha256 | Out-File -Encoding ASCII ./dist/bw-windows-sha256-${env:_PACKAGE_VERSION}.txt
194+ checksum -f="./dist/bw-macos-${env:_PACKAGE_VERSION}.zip" `
195+ -t sha256 | Out-File -Encoding ASCII ./dist/bw-macos-sha256-${env:_PACKAGE_VERSION}.txt
196+ checksum -f="./dist/bw-linux-${env:_PACKAGE_VERSION}.zip" `
197+ -t sha256 | Out-File -Encoding ASCII ./dist/bw-linux-sha256-${env:_PACKAGE_VERSION}.txt
198+
199+ - name: Upload windows zip asset
200+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
201+ with:
202+ name: bw-windows-${{ env._PACKAGE_VERSION }}.zip
203+ path: apps/cli/dist/bw-windows-${{ env._PACKAGE_VERSION }}.zip
204+ if-no-files-found: error
205+
206+ - name: Upload windows checksum asset
207+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
208+ with:
209+ name: bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt
210+ path: apps/cli/dist/bw-windows-sha256-${{ env._PACKAGE_VERSION }}.txt
211+ if-no-files-found: error
212+
213+ - name: Upload macos zip asset
214+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
215+ with:
216+ name: bw-macos-${{ env._PACKAGE_VERSION }}.zip
217+ path: apps/cli/dist/bw-macos-${{ env._PACKAGE_VERSION }}.zip
218+ if-no-files-found: error
219+
220+ - name: Upload macos checksum asset
221+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
222+ with:
223+ name: bw-macos-sha256-${{ env._PACKAGE_VERSION }}.txt
224+ path: apps/cli/dist/bw-macos-sha256-${{ env._PACKAGE_VERSION }}.txt
225+ if-no-files-found: error
226+
227+ - name: Upload linux zip asset
228+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
229+ with:
230+ name: bw-linux-${{ env._PACKAGE_VERSION }}.zip
231+ path: apps/cli/dist/bw-linux-${{ env._PACKAGE_VERSION }}.zip
232+ if-no-files-found: error
233+
234+ - name: Upload linux checksum asset
235+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
236+ with:
237+ name: bw-linux-sha256-${{ env._PACKAGE_VERSION }}.txt
238+ path: apps/cli/dist/bw-linux-sha256-${{ env._PACKAGE_VERSION }}.txt
239+ if-no-files-found: error
240+
241+ - name: Upload Chocolatey asset
242+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
243+ with:
244+ name: bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg
245+ path: apps/cli/dist/chocolatey/bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg
246+ if-no-files-found: error
247+
248+ - name: Upload NPM Build Directory asset
249+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
250+ with:
251+ name: bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip
252+ path: apps/cli/build
253+ if-no-files-found: error
254+
255+ snap:
256+ name: Build Snap
257+ runs-on: ubuntu-20.04
258+ needs: [setup, cli]
259+ env:
260+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
261+ steps:
262+ - name: Checkout repo
263+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
264+
265+ - name: Print environment
266+ run: |
267+ whoami
268+ echo "GitHub ref: $GITHUB_REF"
269+ echo "GitHub event: $GITHUB_EVENT"
270+ echo "BW Package Version: $_PACKAGE_VERSION"
271+
272+ - name: Get bw linux cli
273+ uses: actions/download-artifact@fb598a63ae348fa914e94cd0ff38f362e927b741
274+ with:
275+ name: bw-linux-${{ env._PACKAGE_VERSION }}.zip
276+ path: apps/cli/dist/snap
277+
278+ - name: Setup Snap Package
279+ run: |
280+ cp -r stores/snap/* -t dist/snap
281+ sed -i s/__version__/${{ env._PACKAGE_VERSION }}/g dist/snap/snapcraft.yaml
282+ cd dist/snap
283+ ls -alth
284+
285+ - name: Build snap
286+ uses: snapcore/action-build@ea14cdeb353272f75977040488ca191880509a8c # v1.1.0
287+ with:
288+ path: apps/cli/dist/snap
289+
290+ - name: Create checksum
291+ run: |
292+ cd dist/snap
293+ ls -alth
294+ sha256sum bw_${{ env._PACKAGE_VERSION }}_amd64.snap \
295+ | awk '{split($0, a); print a[1]}' > bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt
296+
297+ - name: Install Snap
298+ run: sudo snap install dist/snap/bw*.snap --dangerous
299+
300+ - name: Test Snap
301+ shell: pwsh
302+ run: |
303+ $testVersion = Invoke-Expression '& bw -v'
304+ if($testVersion -ne $env:_PACKAGE_VERSION) {
305+ Throw "Version test failed."
306+ }
307+ env:
308+ BITWARDENCLI_APPDATA_DIR: "/home/runner/snap/bw/x1/.config/Bitwarden CLI"
309+
310+ - name: Cleanup Test & Update Snap for Publish
311+ shell: pwsh
312+ run: sudo snap remove bw
313+
314+ - name: Upload snap asset
315+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
316+ with:
317+ name: bw_${{ env._PACKAGE_VERSION }}_amd64.snap
318+ path: apps/cli/dist/snap/bw_${{ env._PACKAGE_VERSION }}_amd64.snap
319+ if-no-files-found: error
320+
321+ - name: Upload snap checksum asset
322+ uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
323+ with:
324+ name: bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt
325+ path: apps/cli/dist/snap/bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt
326+ if-no-files-found: error
327+
328+
329+ check-failures:
330+ name: Check for failures
331+ if: always()
332+ runs-on: ubuntu-20.04
333+ needs:
334+ - cloc
335+ - setup
336+ - cli
337+ - snap
338+ steps:
339+ - name: Check if any job failed
340+ working-directory: ${{ github.workspace }}
341+ if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }}
342+ env:
343+ CLOC_STATUS: ${{ needs.cloc.result }}
344+ SETUP_STATUS: ${{ needs.setup.result }}
345+ CLI_STATUS: ${{ needs.cli.result }}
346+ SNAP_STATUS: ${{ needs.snap.result }}
347+ run: |
348+ if [ "$CLOC_STATUS" = "failure" ]; then
349+ exit 1
350+ elif [ "$SETUP_STATUS" = "failure" ]; then
351+ exit 1
352+ elif [ "$CLI_STATUS" = "failure" ]; then
353+ exit 1
354+ elif [ "$SNAP_STATUS" = "failure" ]; then
355+ exit 1
356+ fi
357+
358+ - name: Login to Azure - Prod Subscription
359+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
360+ if: failure()
361+ with:
362+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
363+
364+ - name: Retrieve secrets
365+ id: retrieve-secrets
366+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
367+ if: failure()
368+ with:
369+ keyvault: "bitwarden-prod-kv"
370+ secrets: "devops-alerts-slack-webhook-url"
371+
372+ - name: Notify Slack on failure
373+ uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33
374+ if: failure()
375+ env:
376+ SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
377+ with:
378+ status: ${{ job.status }}
.github/workflows/build-desktop.ymlnew file+1227
@@ -0,0 +1,1227 @@
1+---
2+name: Build Desktop
3+
4+on:
5+ pull_request:
6+ branches-ignore:
7+ - 'l10n_master'
8+ - 'cf-pages'
9+ paths:
10+ - 'apps/desktop/**'
11+ - '*'
12+ - '!*.md'
13+ - '!*.txt'
14+ - '.github/workflows/build-desktop.yml'
15+ push:
16+ branches:
17+ - 'master'
18+ - 'rc'
19+ - 'hotfix-rc'
20+ paths:
21+ - 'apps/desktop/**'
22+ - 'libs/**'
23+ - '*'
24+ - '!*.md'
25+ - '!*.txt'
26+ - '.github/workflows/build-desktop.yml'
27+ workflow_dispatch:
28+ inputs: {}
29+
30+defaults:
31+ run:
32+ shell: bash
33+
34+jobs:
35+ cloc:
36+ name: CLOC
37+ runs-on: ubuntu-20.04
38+ steps:
39+ - name: Checkout repo
40+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
41+
42+ - name: Set up cloc
43+ run: |
44+ sudo apt-get update
45+ sudo apt-get -y install cloc
46+
47+ - name: Print lines of code
48+ run: cloc --include-lang TypeScript,JavaScript,HTML,Sass,CSS --vcs git
49+
50+ electron-verify:
51+ name: Verify Electron Version
52+ runs-on: ubuntu-20.04
53+ steps:
54+ - name: Checkout repo
55+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
56+
57+ - name: Verify
58+ run: |
59+ PACKAGE_VERSION=$(jq -r .devDependencies.electron package.json)
60+ ELECTRON_BUILDER_VERSION=$(jq -r .electronVersion ./apps/desktop/electron-builder.json)
61+
62+ if [[ "$PACKAGE_VERSION" == "$ELECTRON_BUILDER_VERSION" ]]; then
63+ echo "Versions matches"
64+ else
65+ echo "Version missmatch, package.json: $PACKAGE_VERSION, electron-builder.json: $ELECTRON_BUILDER_VERSION"
66+ exit 1
67+ fi
68+
69+ setup:
70+ name: Setup
71+ runs-on: ubuntu-20.04
72+ outputs:
73+ package_version: ${{ steps.retrieve-version.outputs.package_version }}
74+ release_channel: ${{ steps.release-channel.outputs.channel }}
75+ build_number: ${{ steps.increment-version.outputs.build_number }}
76+ rc_branch_exists: ${{ steps.branch-check.outputs.rc_branch_exists }}
77+ hotfix_branch_exists: ${{ steps.branch-check.outputs.hotfix_branch_exists }}
78+ defaults:
79+ run:
80+ working-directory: apps/desktop
81+ steps:
82+ - name: Checkout repo
83+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
84+
85+ - name: Get Package Version
86+ id: retrieve-version
87+ run: |
88+ PKG_VERSION=$(jq -r .version src/package.json)
89+ echo "::set-output name=package_version::$PKG_VERSION"
90+
91+ - name: Increment Version
92+ id: increment-version
93+ run: |
94+ BUILD_NUMBER=$(expr 3000 + $GITHUB_RUN_NUMBER)
95+ echo "Setting build number to $BUILD_NUMBER"
96+ echo "::set-output name=build_number::$BUILD_NUMBER"
97+
98+ - name: Get Version Channel
99+ id: release-channel
100+ run: |
101+ case "${{ steps.retrieve-version.outputs.package_version }}" in
102+ *"alpha"*)
103+ echo "::set-output name=channel::alpha"
104+ echo "[!] We do not yet support 'alpha'"
105+ exit 1
106+ ;;
107+ *"beta"*)
108+ echo "::set-output name=channel::beta"
109+ ;;
110+ *)
111+ echo "::set-output name=channel::latest"
112+ ;;
113+ esac
114+
115+ - name: Check if special branches exist
116+ id: branch-check
117+ run: |
118+ if [[ $(git ls-remote --heads origin rc) ]]; then
119+ echo "::set-output name=rc_branch_exists::1"
120+ else
121+ echo "::set-output name=rc_branch_exists::0"
122+ fi
123+
124+ if [[ $(git ls-remote --heads origin hotfix-rc) ]]; then
125+ echo "::set-output name=hotfix_branch_exists::1"
126+ else
127+ echo "::set-output name=hotfix_branch_exists::0"
128+ fi
129+
130+
131+ linux:
132+ name: Linux Build
133+ runs-on: ubuntu-20.04
134+ needs: setup
135+ env:
136+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
137+ defaults:
138+ run:
139+ working-directory: apps/desktop
140+ steps:
141+ - name: Checkout repo
142+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
143+
144+ - name: Set up Node
145+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
146+ with:
147+ cache: 'npm'
148+ cache-dependency-path: '**/package-lock.json'
149+ node-version: '16'
150+
151+ - name: Set Node options
152+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
153+
154+ - name: Install node-gyp
155+ run: |
156+ npm install -g node-gyp
157+ node-gyp install $(node -v)
158+
159+ - name: Set up environment
160+ run: |
161+ sudo apt-get update
162+ sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm
163+
164+ - name: Set up Snap
165+ run: sudo snap install snapcraft --classic
166+
167+ - name: Print environment
168+ run: |
169+ node --version
170+ npm --version
171+ snap --version
172+ snapcraft --version || echo 'snapcraft unavailable'
173+
174+ - name: Install Node dependencies
175+ run: npm ci
176+ working-directory: ./
177+
178+ - name: Build application
179+ run: npm run dist:lin
180+
181+ - name: Upload .deb artifact
182+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
183+ with:
184+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb
185+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb
186+ if-no-files-found: error
187+
188+ - name: Upload .rpm artifact
189+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
190+ with:
191+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm
192+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm
193+ if-no-files-found: error
194+
195+ - name: Upload .freebsd artifact
196+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
197+ with:
198+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd
199+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd
200+ if-no-files-found: error
201+
202+ - name: Upload .snap artifact
203+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
204+ with:
205+ name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap
206+ path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap
207+ if-no-files-found: error
208+
209+ - name: Upload .AppImage artifact
210+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
211+ with:
212+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage
213+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage
214+ if-no-files-found: error
215+
216+ - name: Upload auto-update artifact
217+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
218+ with:
219+ name: ${{ needs.setup.outputs.release_channel }}-linux.yml
220+ path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-linux.yml
221+ if-no-files-found: error
222+
223+
224+ windows:
225+ name: Windows Build
226+ runs-on: windows-2019
227+ needs: setup
228+ defaults:
229+ run:
230+ shell: pwsh
231+ working-directory: apps/desktop
232+ env:
233+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
234+ steps:
235+ - name: Checkout repo
236+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
237+
238+ - name: Set up Node
239+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
240+ with:
241+ cache: 'npm'
242+ cache-dependency-path: '**/package-lock.json'
243+ node-version: '16'
244+
245+ - name: Set Node options
246+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
247+
248+ - name: Install node-gyp
249+ run: |
250+ npm install -g node-gyp
251+ node-gyp install $(node -v)
252+
253+ - name: Install AST
254+ uses: bitwarden/gh-actions/install-ast@f135c42c8596cb535c5bcb7523c0b2eef89709ac
255+
256+ - name: Set up environment
257+ run: choco install checksum --no-progress
258+
259+ - name: Print environment
260+ run: |
261+ node --version
262+ npm --version
263+ choco --version
264+
265+ - name: Login to Azure
266+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
267+ with:
268+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
269+
270+ - name: Retrieve secrets
271+ id: retrieve-secrets
272+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
273+ with:
274+ keyvault: "bitwarden-prod-kv"
275+ secrets: "code-signing-vault-url,
276+ code-signing-client-id,
277+ code-signing-tenant-id,
278+ code-signing-client-secret,
279+ code-signing-cert-name"
280+
281+ - name: Install Node dependencies
282+ run: npm ci
283+ working-directory: ./
284+
285+ - name: Build & Sign (dev)
286+ env:
287+ ELECTRON_BUILDER_SIGN: 1
288+ SIGNING_VAULT_URL: ${{ steps.retrieve-secrets.outputs.code-signing-vault-url }}
289+ SIGNING_CLIENT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-client-id }}
290+ SIGNING_TENANT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-tenant-id }}
291+ SIGNING_CLIENT_SECRET: ${{ steps.retrieve-secrets.outputs.code-signing-client-secret }}
292+ SIGNING_CERT_NAME: ${{ steps.retrieve-secrets.outputs.code-signing-cert-name }}
293+ run: |
294+ npm run build
295+ npm run pack:win
296+
297+ - name: Rename appx files for store
298+ run: |
299+ Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx" `
300+ -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx"
301+ Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx" `
302+ -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx"
303+ Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx" `
304+ -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx"
305+
306+ - name: Package for Chocolatey
307+ run: |
308+ Copy-Item -Path ./stores/chocolatey -Destination ./dist/chocolatey -Recurse
309+ Copy-Item -Path ./dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe `
310+ -Destination ./dist/chocolatey
311+
312+ $checksum = checksum -t sha256 ./dist/chocolatey/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe
313+ $chocoInstall = "./dist/chocolatey/tools/chocolateyinstall.ps1"
314+ (Get-Content $chocoInstall).replace('__version__', "$env:_PACKAGE_VERSION").replace('__checksum__', $checksum) | Set-Content $chocoInstall
315+ choco pack ./dist/chocolatey/bitwarden.nuspec --version "$env:_PACKAGE_VERSION" --out ./dist/chocolatey
316+
317+ - name: Fix NSIS artifact names for auto-updater
318+ run: |
319+ Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z `
320+ -NewName bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z
321+ Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z `
322+ -NewName bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z
323+ Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z `
324+ -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z
325+
326+ - name: Upload portable exe artifact
327+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
328+ with:
329+ name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe
330+ path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe
331+ if-no-files-found: error
332+
333+ - name: Upload installer exe artifact
334+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
335+ with:
336+ name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe
337+ path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe
338+ if-no-files-found: error
339+
340+ - name: Upload appx ia32 artifact
341+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
342+ with:
343+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx
344+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx
345+ if-no-files-found: error
346+
347+ - name: Upload store appx ia32 artifact
348+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
349+ with:
350+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx
351+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx
352+ if-no-files-found: error
353+
354+ - name: Upload NSIS ia32 artifact
355+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
356+ with:
357+ name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z
358+ path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z
359+ if-no-files-found: error
360+
361+ - name: Upload appx x64 artifact
362+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
363+ with:
364+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx
365+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx
366+ if-no-files-found: error
367+
368+ - name: Upload store appx x64 artifact
369+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
370+ with:
371+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx
372+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx
373+ if-no-files-found: error
374+
375+ - name: Upload NSIS x64 artifact
376+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
377+ with:
378+ name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z
379+ path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z
380+ if-no-files-found: error
381+
382+ - name: Upload appx ARM64 artifact
383+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
384+ with:
385+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx
386+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx
387+ if-no-files-found: error
388+
389+ - name: Upload store appx ARM64 artifact
390+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
391+ with:
392+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx
393+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx
394+ if-no-files-found: error
395+
396+ - name: Upload NSIS ARM64 artifact
397+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
398+ with:
399+ name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z
400+ path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z
401+ if-no-files-found: error
402+
403+ - name: Upload nupkg artifact
404+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
405+ with:
406+ name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg
407+ path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg
408+ if-no-files-found: error
409+
410+ - name: Upload auto-update artifact
411+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
412+ with:
413+ name: ${{ needs.setup.outputs.release_channel }}.yml
414+ path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release_channel }}.yml
415+ if-no-files-found: error
416+
417+
418+ macos-build:
419+ name: MacOS Build
420+ runs-on: macos-11
421+ needs: setup
422+ env:
423+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
424+ defaults:
425+ run:
426+ working-directory: apps/desktop
427+ steps:
428+ - name: Checkout repo
429+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
430+
431+ - name: Set up Node
432+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
433+ with:
434+ cache: 'npm'
435+ cache-dependency-path: '**/package-lock.json'
436+ node-version: '16'
437+
438+ - name: Set Node options
439+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
440+
441+ - name: Install node-gyp
442+ run: |
443+ npm install -g node-gyp
444+ node-gyp install $(node -v)
445+
446+ - name: Print environment
447+ run: |
448+ node --version
449+ npm --version
450+ echo "GitHub ref: $GITHUB_REF"
451+ echo "GitHub event: $GITHUB_EVENT"
452+
453+ - name: Cache Build
454+ id: build-cache
455+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
456+ with:
457+ path: apps/desktop/build
458+ key: ${{ runner.os }}-${{ github.run_id }}-build
459+
460+ - name: Cache Safari
461+ id: safari-cache
462+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
463+ with:
464+ path: apps/browser/dist/Safari
465+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
466+
467+ - name: Decrypt secrets
468+ env:
469+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
470+ run: |
471+ mkdir -p $HOME/secrets
472+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
473+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
474+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
475+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
476+ --output "$HOME/secrets/appstore-app-cert.p12" \
477+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
478+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
479+ --output "$HOME/secrets/appstore-installer-cert.p12" \
480+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
481+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
482+ --output "$HOME/secrets/devid-app-cert.p12" \
483+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
484+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
485+ --output "$HOME/secrets/devid-installer-cert.p12" \
486+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
487+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
488+ --output "$HOME/secrets/macdev-cert.p12" \
489+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
490+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
491+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
492+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
493+
494+ - name: Set up keychain
495+ env:
496+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
497+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
498+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
499+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
500+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
501+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
502+ run: |
503+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
504+ security default-keychain -s build.keychain
505+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
506+ security set-keychain-settings -lut 1200 build.keychain
507+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
508+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
509+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
510+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
511+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
512+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
513+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
514+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
515+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
516+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
517+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
518+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
519+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
520+
521+ - name: Set up provisioning profiles
522+ run: |
523+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
524+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
525+
526+ - name: Increment version
527+ shell: pwsh
528+ env:
529+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
530+ run: |
531+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
532+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
533+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
534+
535+ - name: Install Node dependencies
536+ run: npm ci
537+ working-directory: ./
538+
539+ - name: Build application (dev)
540+ run: npm run build
541+
542+
543+ macos-package-github:
544+ name: MacOS Package GitHub Release Assets
545+ runs-on: macos-11
546+ needs:
547+ - setup
548+ - macos-build
549+ env:
550+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
551+ defaults:
552+ run:
553+ working-directory: apps/desktop
554+ steps:
555+ - name: Checkout repo
556+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
557+
558+ - name: Set up Node
559+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
560+ with:
561+ cache: 'npm'
562+ cache-dependency-path: '**/package-lock.json'
563+ node-version: '16'
564+
565+ - name: Set Node options
566+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
567+
568+ - name: Install node-gyp
569+ run: |
570+ npm install -g node-gyp
571+ node-gyp install $(node -v)
572+
573+ - name: Print environment
574+ run: |
575+ node --version
576+ npm --version
577+ echo "GitHub ref: $GITHUB_REF"
578+ echo "GitHub event: $GITHUB_EVENT"
579+
580+ - name: Get Build Cache
581+ id: build-cache
582+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
583+ with:
584+ path: apps/desktop/build
585+ key: ${{ runner.os }}-${{ github.run_id }}-build
586+
587+ - name: Setup Safari Cache
588+ id: safari-cache
589+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
590+ with:
591+ path: apps/browser/dist/Safari
592+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
593+
594+ - name: Decrypt secrets
595+ env:
596+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
597+ run: |
598+ mkdir -p $HOME/secrets
599+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
600+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
601+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
602+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
603+ --output "$HOME/secrets/appstore-app-cert.p12" \
604+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
605+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
606+ --output "$HOME/secrets/appstore-installer-cert.p12" \
607+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
608+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
609+ --output "$HOME/secrets/devid-app-cert.p12" \
610+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
611+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
612+ --output "$HOME/secrets/devid-installer-cert.p12" \
613+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
614+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
615+ --output "$HOME/secrets/macdev-cert.p12" \
616+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
617+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
618+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
619+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
620+
621+ - name: Set up keychain
622+ env:
623+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
624+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
625+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
626+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
627+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
628+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
629+ run: |
630+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
631+ security default-keychain -s build.keychain
632+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
633+ security set-keychain-settings -lut 1200 build.keychain
634+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
635+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
636+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
637+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
638+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
639+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
640+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
641+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
642+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
643+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
644+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
645+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
646+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
647+
648+ - name: Set up provisioning profiles
649+ run: |
650+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
651+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
652+
653+ - name: Increment version
654+ shell: pwsh
655+ env:
656+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
657+ run: |
658+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
659+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
660+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
661+
662+ - name: Install Node dependencies
663+ run: npm ci
664+ working-directory: ./
665+
666+ - name: Build
667+ if: steps.build-cache.outputs.cache-hit != 'true'
668+ run: npm run build
669+
670+ - name: Extract branch name
671+ if: contains(github.ref, 'hotfix-rc')
672+ id: extract_branch
673+ shell: bash
674+ run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
675+
676+ - name: Download artifact from hotfix-rc
677+ if: contains(github.ref, 'hotfix-rc')
678+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
679+ with:
680+ workflow: build-browser.yml
681+ workflow_conclusion: success
682+ branch: ${{ steps.extract_branch.outputs.branch }}
683+ path: ${{ github.workspace }}/browser-build-artifacts
684+
685+ - name: Download artifact from rc
686+ if: github.ref == 'refs/heads/rc'
687+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
688+ with:
689+ workflow: build-browser.yml
690+ workflow_conclusion: success
691+ branch: rc
692+ path: ${{ github.workspace }}/browser-build-artifacts
693+
694+ - name: Download artifact from master
695+ if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }}
696+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
697+ with:
698+ workflow: build-browser.yml
699+ workflow_conclusion: success
700+ branch: master
701+ path: ${{ github.workspace }}/browser-build-artifacts
702+
703+ - name: Unzip Safari artifact
704+ run: |
705+ SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip')
706+ echo $SAFARI_DIR
707+ unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts
708+
709+ - name: Load Safari extension for .dmg
710+ run: |
711+ mkdir PlugIns
712+ cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/dmg/build/Release/safari.appex PlugIns/safari.appex
713+
714+ - name: Build application (dist)
715+ env:
716+ APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
717+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
718+ run: npm run pack:mac
719+
720+ - name: Upload .zip artifact
721+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
722+ with:
723+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip
724+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip
725+ if-no-files-found: error
726+
727+ - name: Upload .dmg artifact
728+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
729+ with:
730+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg
731+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg
732+ if-no-files-found: error
733+
734+ - name: Upload .dmg blockmap artifact
735+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
736+ with:
737+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap
738+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap
739+ if-no-files-found: error
740+
741+ - name: Upload auto-update artifact
742+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
743+ with:
744+ name: ${{ needs.setup.outputs.release_channel }}-mac.yml
745+ path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-mac.yml
746+ if-no-files-found: error
747+
748+
749+ macos-package-mas:
750+ name: MacOS Package Prod Release Asset
751+ runs-on: macos-11
752+ needs:
753+ - setup
754+ - macos-build
755+ env:
756+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
757+ defaults:
758+ run:
759+ working-directory: apps/desktop
760+ steps:
761+ - name: Checkout repo
762+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
763+
764+ - name: Set up Node
765+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
766+ with:
767+ cache: 'npm'
768+ cache-dependency-path: '**/package-lock.json'
769+ node-version: '16'
770+
771+ - name: Set Node options
772+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
773+
774+ - name: Install node-gyp
775+ run: |
776+ npm install -g node-gyp
777+ node-gyp install $(node -v)
778+
779+ - name: Print environment
780+ run: |
781+ node --version
782+ npm --version
783+ echo "GitHub ref: $GITHUB_REF"
784+ echo "GitHub event: $GITHUB_EVENT"
785+
786+ - name: Get Build Cache
787+ id: build-cache
788+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
789+ with:
790+ path: apps/desktop/build
791+ key: ${{ runner.os }}-${{ github.run_id }}-build
792+
793+ - name: Setup Safari Cache
794+ id: safari-cache
795+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
796+ with:
797+ path: apps/browser/dist/Safari
798+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
799+
800+ - name: Decrypt secrets
801+ env:
802+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
803+ run: |
804+ mkdir -p $HOME/secrets
805+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
806+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
807+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
808+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
809+ --output "$HOME/secrets/appstore-app-cert.p12" \
810+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
811+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
812+ --output "$HOME/secrets/appstore-installer-cert.p12" \
813+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
814+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
815+ --output "$HOME/secrets/devid-app-cert.p12" \
816+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
817+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
818+ --output "$HOME/secrets/devid-installer-cert.p12" \
819+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
820+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
821+ --output "$HOME/secrets/macdev-cert.p12" \
822+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
823+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
824+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
825+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
826+
827+ - name: Set up keychain
828+ env:
829+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
830+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
831+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
832+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
833+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
834+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
835+ run: |
836+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
837+ security default-keychain -s build.keychain
838+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
839+ security set-keychain-settings -lut 1200 build.keychain
840+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
841+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
842+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
843+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
844+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
845+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
846+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
847+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
848+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
849+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
850+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
851+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
852+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
853+
854+ - name: Set up provisioning profiles
855+ run: |
856+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
857+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
858+
859+ - name: Increment version
860+ shell: pwsh
861+ env:
862+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
863+ run: |
864+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
865+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
866+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
867+
868+ - name: Install Node dependencies
869+ run: npm ci
870+ working-directory: ./
871+
872+ - name: Build
873+ if: steps.build-cache.outputs.cache-hit != 'true'
874+ run: npm run build
875+
876+ - name: Extract branch name
877+ if: contains(github.ref, 'hotfix-rc')
878+ id: extract_branch
879+ shell: bash
880+ run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
881+
882+ - name: Download artifact from hotfix-rc
883+ if: contains(github.ref, 'hotfix-rc')
884+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
885+ with:
886+ workflow: build-browser.yml
887+ workflow_conclusion: success
888+ branch: ${{ steps.extract_branch.outputs.branch }}
889+ path: ${{ github.workspace }}/browser-build-artifacts
890+
891+ - name: Download artifact from rc
892+ if: github.ref == 'refs/heads/rc'
893+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
894+ with:
895+ workflow: build-browser.yml
896+ workflow_conclusion: success
897+ branch: rc
898+ path: ${{ github.workspace }}/browser-build-artifacts
899+
900+ - name: Download artifact from master
901+ if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }}
902+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
903+ with:
904+ workflow: build-browser.yml
905+ workflow_conclusion: success
906+ branch: master
907+ path: ${{ github.workspace }}/browser-build-artifacts
908+
909+ - name: Unzip Safari artifact
910+ run: |
911+ SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip')
912+ echo $SAFARI_DIR
913+ unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts
914+
915+ - name: Load Safari extension for App Store
916+ run: |
917+ mkdir PlugIns
918+ cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/mas/build/Release/safari.appex PlugIns/safari.appex
919+
920+ - name: Build application for App Store
921+ run: npm run pack:mac:mas
922+ env:
923+ APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
924+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
925+
926+ - name: Upload .pkg artifact
927+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
928+ with:
929+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg
930+ path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg
931+ if-no-files-found: error
932+
933+ - name: Deploy to TestFlight
934+ env:
935+ APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
936+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
937+ if: |
938+ (github.ref == 'refs/heads/master'
939+ && needs.setup.outputs.rc_branch_exists == 0
940+ && needs.setup.outputs.hotfix_branch_exists == 0)
941+ || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0)
942+ || github.ref == 'refs/heads/hotfix-rc'
943+ run: npm run upload:mas
944+
945+
946+ macos-package-dev:
947+ name: MacOS Package Dev Release Asset
948+ if: false # We need to look into how code signing works for dev
949+ runs-on: macos-11
950+ needs:
951+ - setup
952+ - macos-build
953+ env:
954+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
955+ defaults:
956+ run:
957+ working-directory: apps/desktop
958+ steps:
959+ - name: Checkout repo
960+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
961+
962+ - name: Set up Node
963+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
964+ with:
965+ cache: 'npm'
966+ cache-dependency-path: '**/package-lock.json'
967+ node-version: '16'
968+
969+ - name: Set Node options
970+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
971+
972+ - name: Install node-gyp
973+ run: |
974+ npm install -g node-gyp
975+ node-gyp install $(node -v)
976+
977+ - name: Print environment
978+ run: |
979+ node --version
980+ npm --version
981+ echo "GitHub ref: $GITHUB_REF"
982+ echo "GitHub event: $GITHUB_EVENT"
983+
984+ - name: Get Build Cache
985+ id: build-cache
986+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
987+ with:
988+ path: apps/desktop/build
989+ key: ${{ runner.os }}-${{ github.run_id }}-build
990+
991+ - name: Setup Safari Cache
992+ id: safari-cache
993+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
994+ with:
995+ path: apps/browser/dist/Safari
996+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
997+
998+ - name: Decrypt secrets
999+ env:
1000+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
1001+ run: |
1002+ mkdir -p $HOME/secrets
1003+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1004+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
1005+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
1006+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1007+ --output "$HOME/secrets/appstore-app-cert.p12" \
1008+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
1009+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1010+ --output "$HOME/secrets/appstore-installer-cert.p12" \
1011+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
1012+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1013+ --output "$HOME/secrets/devid-app-cert.p12" \
1014+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
1015+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1016+ --output "$HOME/secrets/devid-installer-cert.p12" \
1017+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
1018+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1019+ --output "$HOME/secrets/macdev-cert.p12" \
1020+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
1021+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
1022+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
1023+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
1024+
1025+ - name: Set up keychain
1026+ env:
1027+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
1028+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
1029+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
1030+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
1031+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
1032+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
1033+ run: |
1034+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
1035+ security default-keychain -s build.keychain
1036+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
1037+ security set-keychain-settings -lut 1200 build.keychain
1038+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
1039+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
1040+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
1041+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
1042+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
1043+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
1044+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
1045+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
1046+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
1047+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
1048+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
1049+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
1050+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
1051+
1052+ - name: Set up provisioning profiles
1053+ run: |
1054+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
1055+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
1056+
1057+ - name: Increment version
1058+ shell: pwsh
1059+ env:
1060+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
1061+ run: |
1062+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
1063+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
1064+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
1065+
1066+ - name: Install Node dependencies
1067+ run: npm ci
1068+ working-directory: ./
1069+
1070+ - name: Build
1071+ if: steps.build-cache.outputs.cache-hit != 'true'
1072+ run: npm run build
1073+
1074+ - name: Download artifact from rc
1075+ if: github.ref == 'refs/heads/rc'
1076+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
1077+ with:
1078+ workflow: build-browser.yml
1079+ workflow_conclusion: success
1080+ branch: rc
1081+ path: ${{ github.workspace }}/browser-build-artifacts
1082+
1083+ - name: Download artifact from master
1084+ if: github.ref != 'refs/heads/rc'
1085+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
1086+ with:
1087+ workflow: build-browser.yml
1088+ workflow_conclusion: success
1089+ branch: master
1090+ path: ${{ github.workspace }}/browser-build-artifacts
1091+
1092+ - name: Unzip Safari artifact
1093+ run: |
1094+ SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip')
1095+ echo $SAFARI_DIR
1096+ unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts
1097+
1098+ - name: Load Safari extension for App Store
1099+ run: |
1100+ mkdir PlugIns
1101+ cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/masdev/build/Release/safari.appex PlugIns/safari.appex
1102+
1103+ - name: Build dev application for App Store
1104+ run: npm run pack:mac:masdev
1105+ env:
1106+ APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
1107+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
1108+
1109+ - name: Zip masdev asset
1110+ working-directory: ./dist/mas-dev-universal
1111+ run: zip -r Bitwarden-${{ env.PACKAGE_VERSION }}-masdev-universal.zip Bitwarden.app
1112+
1113+ - name: Upload masdev artifact
1114+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
1115+ with:
1116+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip
1117+ path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip
1118+ if-no-files-found: error
1119+
1120+
1121+ crowdin-push:
1122+ name: Crowdin Push
1123+ if: github.ref == 'refs/heads/master'
1124+ needs:
1125+ - linux
1126+ - windows
1127+ - macos-package-github
1128+ - macos-package-mas
1129+ runs-on: ubuntu-20.04
1130+ steps:
1131+ - name: Checkout repo
1132+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
1133+
1134+ - name: Login to Azure
1135+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
1136+ with:
1137+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
1138+
1139+ - name: Retrieve secrets
1140+ id: retrieve-secrets
1141+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
1142+ with:
1143+ keyvault: "bitwarden-prod-kv"
1144+ secrets: "crowdin-api-token"
1145+
1146+ - name: Upload Sources
1147+ uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9
1148+ env:
1149+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1150+ CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
1151+ CROWDIN_PROJECT_ID: "299360"
1152+ with:
1153+ config: apps/desktop/crowdin.yml
1154+ crowdin_branch_name: master
1155+ upload_sources: true
1156+ upload_translations: false
1157+
1158+
1159+ check-failures:
1160+ name: Check for failures
1161+ if: always()
1162+ runs-on: ubuntu-20.04
1163+ needs:
1164+ - cloc
1165+ - electron-verify
1166+ - setup
1167+ - linux
1168+ - windows
1169+ - macos-build
1170+ - macos-package-github
1171+ - macos-package-mas
1172+ - crowdin-push
1173+ steps:
1174+ - name: Check if any job failed
1175+ if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }}
1176+ env:
1177+ CLOC_STATUS: ${{ needs.cloc.result }}
1178+ ELECTRON_VERIFY_STATUS: ${{ needs.electron-verify.result }}
1179+ SETUP_STATUS: ${{ needs.setup.result }}
1180+ LINUX_STATUS: ${{ needs.linux.result }}
1181+ WINDOWS_STATUS: ${{ needs.windows.result }}
1182+ MACOS_BUILD_STATUS: ${{ needs.macos-build.result }}
1183+ MACOS_PKG_GITHUB_STATUS: ${{ needs.macos-package-github.result }}
1184+ MACOS_PKG_MAS_STATUS: ${{ needs.macos-package-mas.result }}
1185+ CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }}
1186+ run: |
1187+ if [ "$CLOC_STATUS" = "failure" ]; then
1188+ exit 1
1189+ elif [ "$ELECTRON_VERIFY_STATUS" = "failure" ]; then
1190+ exit 1
1191+ elif [ "$SETUP_STATUS" = "failure" ]; then
1192+ exit 1
1193+ elif [ "$LINUX_STATUS" = "failure" ]; then
1194+ exit 1
1195+ elif [ "$WINDOWS_STATUS" = "failure" ]; then
1196+ exit 1
1197+ elif [ "$MACOS_BUILD_STATUS" = "failure" ]; then
1198+ exit 1
1199+ elif [ "$MACOS_PKG_GITHUB_STATUS" = "failure" ]; then
1200+ exit 1
1201+ elif [ "$MACOS_PKG_MAS_STATUS" = "failure" ]; then
1202+ exit 1
1203+ elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then
1204+ exit 1
1205+ fi
1206+
1207+ - name: Login to Azure - Prod Subscription
1208+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
1209+ if: failure()
1210+ with:
1211+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
1212+
1213+ - name: Retrieve secrets
1214+ id: retrieve-secrets
1215+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
1216+ if: failure()
1217+ with:
1218+ keyvault: "bitwarden-prod-kv"
1219+ secrets: "devops-alerts-slack-webhook-url"
1220+
1221+ - name: Notify Slack on failure
1222+ uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33
1223+ if: failure()
1224+ env:
1225+ SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
1226+ with:
1227+ status: ${{ job.status }}
.github/workflows/build-web.ymlnew file+474
@@ -0,0 +1,474 @@
1+---
2+name: Build Web
3+
4+on:
5+ pull_request:
6+ branches-ignore:
7+ - 'l10n_master'
8+ - 'cf-pages'
9+ paths:
10+ - 'apps/web/**'
11+ - 'libs/**'
12+ - '*'
13+ - '!*.md'
14+ - '!*.txt'
15+ - '.github/workflows/build-web.yml'
16+ push:
17+ branches:
18+ - 'master'
19+ - 'rc'
20+ - 'hotfix-rc/**'
21+ paths:
22+ - 'apps/web/**'
23+ - 'libs/**'
24+ - '*'
25+ - '!*.md'
26+ - '!*.txt'
27+ - '.github/workflows/build-web.yml'
28+ workflow_dispatch:
29+ inputs:
30+ custom_tag_extension:
31+ description: "Custom image tag extension"
32+ required: false
33+
34+jobs:
35+ cloc:
36+ name: CLOC
37+ runs-on: ubuntu-20.04
38+ steps:
39+ - name: Checkout repo
40+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
41+
42+ - name: Set up cloc
43+ run: |
44+ sudo apt update
45+ sudo apt -y install cloc
46+
47+ - name: Print lines of code
48+ working-directory: apps/web
49+ run: cloc --include-lang TypeScript,JavaScript,HTML,Sass,CSS --vcs git
50+
51+
52+ setup:
53+ name: Setup
54+ runs-on: ubuntu-20.04
55+ outputs:
56+ version: ${{ steps.version.outputs.value }}
57+ steps:
58+ - name: Checkout repo
59+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
60+
61+ - name: Get GitHub sha as version
62+ id: version
63+ run: echo "::set-output name=value::${GITHUB_SHA:0:7}"
64+
65+
66+ build-oss-selfhost:
67+ name: Build OSS zip
68+ runs-on: ubuntu-20.04
69+ needs:
70+ - setup
71+ env:
72+ _VERSION: ${{ needs.setup.outputs.version }}
73+ steps:
74+ - name: Checkout repo
75+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
76+
77+ - name: Set up Node
78+ uses: actions/setup-node@56337c425554a6be30cdef71bf441f15be286854 # v3.1.1
79+ with:
80+ cache: 'npm'
81+ cache-dependency-path: '**/package-lock.json'
82+ node-version: "16"
83+
84+ - name: Print environment
85+ run: |
86+ whoami
87+ node --version
88+ npm --version
89+ gulp --version
90+ docker --version
91+ echo "GitHub ref: $GITHUB_REF"
92+ echo "GitHub event: $GITHUB_EVENT"
93+
94+ - name: Install dependencies
95+ run: npm ci
96+
97+ - name: Build OSS selfhost
98+ working-directory: apps/web
99+ run: |
100+ npm run dist:oss:selfhost
101+ zip -r web-$_VERSION-selfhosted-open-source.zip build
102+
103+ - name: Upload build artifact
104+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
105+ with:
106+ name: web-${{ env._VERSION }}-selfhosted-open-source.zip
107+ path: apps/web/web-${{ env._VERSION }}-selfhosted-open-source.zip
108+ if-no-files-found: error
109+
110+
111+ build-cloud:
112+ name: Build Cloud zip
113+ runs-on: ubuntu-20.04
114+ needs:
115+ - setup
116+ env:
117+ _VERSION: ${{ needs.setup.outputs.version }}
118+ steps:
119+ - name: Checkout repo
120+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
121+
122+ - name: Set up Node
123+ uses: actions/setup-node@56337c425554a6be30cdef71bf441f15be286854 # v3.1.1
124+ with:
125+ cache: 'npm'
126+ cache-dependency-path: '**/package-lock.json'
127+ node-version: "16"
128+
129+ - name: Print environment
130+ run: |
131+ whoami
132+ node --version
133+ npm --version
134+ gulp --version
135+ docker --version
136+ echo "GitHub ref: $GITHUB_REF"
137+ echo "GitHub event: $GITHUB_EVENT"
138+
139+ - name: Install dependencies
140+ run: npm ci
141+
142+ - name: Build Cloud
143+ working-directory: apps/web
144+ run: |
145+ npm run dist:bit:cloud
146+ zip -r web-$_VERSION-cloud-COMMERCIAL.zip build
147+
148+ - name: Upload build artifact
149+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
150+ with:
151+ name: web-${{ env._VERSION }}-cloud-COMMERCIAL.zip
152+ path: apps/web/web-${{ env._VERSION }}-cloud-COMMERCIAL.zip
153+ if-no-files-found: error
154+
155+
156+ build-commercial-selfhost:
157+ name: Build SelfHost Docker image
158+ runs-on: ubuntu-20.04
159+ needs:
160+ - setup
161+ env:
162+ _VERSION: ${{ needs.setup.outputs.version }}
163+ steps:
164+ - name: Checkout repo
165+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
166+
167+ - name: Set up Node
168+ uses: actions/setup-node@56337c425554a6be30cdef71bf441f15be286854 # v3.1.1
169+ with:
170+ cache: 'npm'
171+ cache-dependency-path: '**/package-lock.json'
172+ node-version: "16"
173+
174+ - name: Print environment
175+ run: |
176+ whoami
177+ node --version
178+ npm --version
179+ gulp --version
180+ docker --version
181+ echo "GitHub ref: $GITHUB_REF"
182+ echo "GitHub event: $GITHUB_EVENT"
183+
184+ - name: Setup DCT
185+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc'
186+ id: setup-dct
187+ uses: bitwarden/gh-actions/setup-docker-trust@a8c384a05a974c05c48374c818b004be221d43ff
188+ with:
189+ azure-creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
190+ azure-keyvault-name: "bitwarden-prod-kv"
191+
192+ - name: Install dependencies
193+ run: npm ci
194+
195+ - name: Build
196+ working-directory: apps/web
197+ run: |
198+ echo -e "# Building Web\n"
199+ echo "Building app"
200+ echo "npm version $(npm --version)"
201+
202+ npm run dist:bit:selfhost
203+ zip -r web-$_VERSION-selfhosted-COMMERCIAL.zip build
204+
205+ - name: Upload build artifact
206+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0
207+ with:
208+ name: web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip
209+ path: apps/web/web-${{ env._VERSION }}-selfhosted-COMMERCIAL.zip
210+ if-no-files-found: error
211+
212+ - name: Build Docker image
213+ working-directory: apps/web
214+ run: |
215+ echo -e "\nBuilding Docker image"
216+ docker --version
217+ docker build -t bitwarden/web .
218+
219+ - name: Tag rc branch
220+ if: github.ref == 'refs/heads/rc'
221+ run: docker tag bitwarden/web bitwarden/web:rc
222+
223+ - name: Tag dev
224+ if: github.ref == 'refs/heads/master'
225+ run: docker tag bitwarden/web bitwarden/web:dev
226+
227+ - name: Tag hotfix branch
228+ if: github.ref == 'refs/heads/hotfix-rc'
229+ run: docker tag bitwarden/web bitwarden/web:hotfix-rc
230+
231+ - name: List Docker images
232+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc'
233+ run: docker images
234+
235+ - name: Push rc image
236+ if: github.ref == 'refs/heads/rc'
237+ run: docker push bitwarden/web:rc
238+ env:
239+ DOCKER_CONTENT_TRUST: 1
240+ DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }}
241+
242+ - name: Push dev image
243+ if: github.ref == 'refs/heads/master'
244+ run: docker push bitwarden/web:dev
245+ env:
246+ DOCKER_CONTENT_TRUST: 1
247+ DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }}
248+
249+ - name: Push hotfix image
250+ if: github.ref == 'refs/heads/hotfix-rc'
251+ run: docker push bitwarden/web:hotfix-rc
252+ env:
253+ DOCKER_CONTENT_TRUST: 1
254+ DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }}
255+
256+ - name: Log out of Docker
257+ if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc'
258+ run: |
259+ docker logout
260+ echo "DOCKER_CONTENT_TRUST=0" >> $GITHUB_ENV
261+
262+ - name: Login to Azure - QA Subscription
263+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
264+ with:
265+ creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }}
266+
267+ - name: Login to Azure ACR
268+ run: az acr login -n bitwardenqa
269+
270+ - name: Tag and Push RC to Azure ACR QA registry
271+ env:
272+ REGISTRY: bitwardenqa.azurecr.io
273+ run: |
274+ IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g") # slash safe branch name
275+ if [[ "$IMAGE_TAG" == "master" ]]; then
276+ IMAGE_TAG=dev
277+ fi
278+ docker tag bitwarden/web \
279+ $REGISTRY/web-sh:$IMAGE_TAG
280+ docker push $REGISTRY/web-sh:$IMAGE_TAG
281+
282+ - name: Log out of Docker
283+ run: docker logout
284+
285+
286+ build-qa:
287+ name: Build Docker images for QA environment
288+ runs-on: ubuntu-20.04
289+ needs:
290+ - setup
291+ steps:
292+ - name: Checkout repo
293+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
294+
295+ - name: Set up Node
296+ uses: actions/setup-node@56337c425554a6be30cdef71bf441f15be286854 # v3.1.1
297+ with:
298+ cache: 'npm'
299+ cache-dependency-path: '**/package-lock.json'
300+ node-version: "16"
301+
302+ - name: Print environment
303+ run: |
304+ whoami
305+ node --version
306+ npm --version
307+ gulp --version
308+ docker --version
309+ echo "GitHub ref: $GITHUB_REF"
310+ echo "GitHub event: $GITHUB_EVENT"
311+
312+ - name: Login to Azure
313+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
314+ with:
315+ creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }}
316+
317+ - name: Log into container registry
318+ run: az acr login -n bitwardenqa
319+
320+ - name: Install dependencies
321+ run: npm ci
322+
323+ - name: Build
324+ working-directory: apps/web
325+ run: |
326+ echo -e "# Building Web\n"
327+ echo "Building app"
328+ echo "npm version $(npm --version)"
329+ VERSION=$( jq -r ".version" package.json)
330+ jq --arg version "$VERSION - ${GITHUB_SHA:0:7}" '.version = $version' package.json > package.json.tmp
331+ mv package.json.tmp package.json
332+
333+ npm run build:bit:qa
334+
335+ echo "{\"commit_hash\": \"$GITHUB_SHA\", \"ref\": \"$GITHUB_REF\"}" | jq . > build/info.json
336+
337+ echo -e "\nBuilding Docker image"
338+ docker --version
339+ docker build -t bitwardenqa.azurecr.io/web .
340+
341+ - name: Get image tag
342+ id: image-tag
343+ run: |
344+ IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g")
345+ TAG_EXTENSION=${{ github.event.inputs.custom_tag_extension }}
346+
347+ if [[ $TAG_EXTENSION ]]; then
348+ IMAGE_TAG=$IMAGE_TAG-$TAG_EXTENSION
349+ fi
350+ echo "::set-output name=value::$IMAGE_TAG"
351+
352+ - name: Tag image
353+ env:
354+ IMAGE_TAG: ${{ steps.image-tag.outputs.value }}
355+ run: docker tag bitwardenqa.azurecr.io/web "bitwardenqa.azurecr.io/web:$IMAGE_TAG"
356+
357+ - name: Tag dev
358+ if: github.ref == 'refs/heads/master'
359+ run: docker tag bitwardenqa.azurecr.io/web bitwardenqa.azurecr.io/web:dev
360+
361+ - name: List Docker images
362+ run: docker images
363+
364+ - name: Push image
365+ env:
366+ IMAGE_TAG: ${{ steps.image-tag.outputs.value }}
367+ run: docker push "bitwardenqa.azurecr.io/web:$IMAGE_TAG"
368+
369+ - name: Push dev images
370+ if: github.ref == 'refs/heads/master'
371+ run: docker push bitwardenqa.azurecr.io/web:dev
372+
373+ - name: Log out of Docker
374+ run: docker logout
375+
376+ crowdin-push:
377+ name: Crowdin Push
378+ if: github.ref == 'refs/heads/master'
379+ needs:
380+ - build-oss-selfhost
381+ - build-cloud
382+ - build-commercial-selfhost
383+ - build-qa
384+ runs-on: ubuntu-20.04
385+ steps:
386+ - name: Checkout repo
387+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 # v2.3.4
388+
389+ - name: Login to Azure
390+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
391+ with:
392+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
393+
394+ - name: Retrieve secrets
395+ id: retrieve-secrets
396+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f # v1.0.0
397+ with:
398+ keyvault: "bitwarden-prod-kv"
399+ secrets: "crowdin-api-token"
400+
401+ - name: Upload Sources
402+ uses: crowdin/github-action@ecd7eb0ef6f3cfa16293c79e9cbc4bc5b5fd9c49 # v1.4.9
403+ env:
404+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
405+ CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
406+ CROWDIN_PROJECT_ID: "308189"
407+ with:
408+ config: apps/web/crowdin.yml
409+ crowdin_branch_name: master
410+ upload_sources: true
411+ upload_translations: false
412+
413+
414+ check-failures:
415+ name: Check for failures
416+ if: always()
417+ runs-on: ubuntu-20.04
418+ needs:
419+ - cloc
420+ - setup
421+ - build-oss-selfhost
422+ - build-cloud
423+ - build-commercial-selfhost
424+ - build-qa
425+ - crowdin-push
426+ steps:
427+ - name: Check if any job failed
428+ if: ${{ (github.ref == 'refs/heads/master') || (github.ref == 'refs/heads/rc') }}
429+ env:
430+ CLOC_STATUS: ${{ needs.cloc.result }}
431+ SETUP_STATUS: ${{ needs.setup.result }}
432+ BUILD_OSS_SELFHOST_STATUS: ${{ needs.build-oss-selfhost.result }}
433+ BUILD_CLOUD_STATUS: ${{ needs.build-cloud.result }}
434+ BUILD_COMMERCIAL_SELFHOST_STATUS: ${{ needs.build-commercial-selfhost.result }}
435+ BUILD_QA_STATUS: ${{ needs.build-qa.result }}
436+ CROWDIN_PUSH_STATUS: ${{ needs.crowdin-push.result }}
437+ run: |
438+ if [ "$CLOC_STATUS" = "failure" ]; then
439+ exit 1
440+ elif [ "$SETUP_STATUS" = "failure" ]; then
441+ exit 1
442+ elif [ "$BUILD_OSS_SELFHOST_STATUS" = "failure" ]; then
443+ exit 1
444+ elif [ "$BUILD_CLOUD_STATUS" = "failure" ]; then
445+ exit 1
446+ elif [ "$BUILD_COMMERCIAL_SELFHOST_STATUS" = "failure" ]; then
447+ exit 1
448+ elif [ "$BUILD_QA_STATUS" = "failure" ]; then
449+ exit 1
450+ elif [ "$CROWDIN_PUSH_STATUS" = "failure" ]; then
451+ exit 1
452+ fi
453+
454+ - name: Login to Azure - Prod Subscription
455+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
456+ if: failure()
457+ with:
458+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
459+
460+ - name: Retrieve secrets
461+ id: retrieve-secrets
462+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f # v1.0.0
463+ if: failure()
464+ with:
465+ keyvault: "bitwarden-prod-kv"
466+ secrets: "devops-alerts-slack-webhook-url"
467+
468+ - name: Notify Slack on failure
469+ uses: act10ns/slack@da3191ebe2e67f49b46880b4633f5591a96d1d33 # v1.5.1
470+ if: failure()
471+ env:
472+ SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }}
473+ with:
474+ status: ${{ job.status }}
.github/workflows/chromatic.ymlnew file+42
@@ -0,0 +1,42 @@
1+---
2+name: Chromatic
3+
4+on:
5+ push:
6+ paths-ignore:
7+ - '.github/workflows/**'
8+
9+jobs:
10+ chromatic:
11+ name: Chromatic
12+ runs-on: ubuntu-20.04
13+
14+ steps:
15+ - name: Set up Node
16+ uses: actions/setup-node@46071b5c7a2e0c34e49c3cb8a0e792e86e18d5ea # v2.1.5
17+ with:
18+ node-version: "16"
19+
20+ - name: Checkout repo
21+ uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
22+ with:
23+ fetch-depth: 0
24+
25+ - name: Cache npm
26+ id: npm-cache
27+ uses: actions/cache@c64c572235d810460d0d6876e9c705ad5002b353 # v2.1.6
28+ with:
29+ path: "~/.npm"
30+ key: ${{ runner.os }}-npm-chromatic-${{ hashFiles('**/package-lock.json') }}
31+
32+ - name: Install Node dependencies
33+ run: npm ci
34+
35+ - name: Publish to Chromatic
36+ uses: chromaui/action@c72f0b48c8887c0ef0abe18ad865a6c1e01e73c6
37+ with:
38+ token: ${{ secrets.GITHUB_TOKEN }}
39+ projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
40+ exitOnceUploaded: true
41+ onlyChanged: true
42+ externals: "[\"components/**/*.scss\", \"components/tailwind.config*.js\"]"
.github/workflows/crowdin-pull.ymlnew file+59
@@ -0,0 +1,59 @@
1+---
2+name: Crowdin Sync
3+
4+on:
5+ workflow_dispatch:
6+ inputs: {}
7+ schedule:
8+ - cron: '0 0 * * 5'
9+
10+jobs:
11+ crowdin-sync:
12+ name: Autosync
13+ runs-on: ubuntu-20.04
14+ strategy:
15+ fail-fast: false
16+ matrix:
17+ include:
18+ - app_name: browser
19+ crowdin_project_id: "268134"
20+ - app_name: desktop
21+ crowdin_project_id: "299360"
22+ - app_name: web
23+ crowdin_project_id: "308189"
24+ steps:
25+ - name: Checkout repo
26+ uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
27+
28+ - name: Login to Azure
29+ uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a
30+ with:
31+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
32+
33+ - name: Retrieve secrets
34+ id: retrieve-secrets
35+ uses: Azure/get-keyvault-secrets@80ccd3fafe5662407cc2e55f202ee34bfff8c403
36+ with:
37+ keyvault: "bitwarden-prod-kv"
38+ secrets: "crowdin-api-token"
39+
40+ - name: Download translations
41+ uses: bitwarden/gh-actions/crowdin@05052c5c575ceb09ceea397fe241879e199ed44b
42+ env:
43+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44+ CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }}
45+ CROWDIN_PROJECT_ID: ${{ matrix.crowdin_project_id }}
46+ with:
47+ config: crowdin.yml
48+ crowdin_branch_name: master
49+ upload_sources: false
50+ upload_translations: false
51+ download_translations: true
52+ github_user_name: "github-actions"
53+ github_user_email: "<>"
54+ commit_message: "Autosync the updated translations"
55+ localization_branch_name: crowdin-auto-sync-${{ matrix.app_name }}
56+ create_pull_request: true
57+ pull_request_title: "Autosync Crowdin Translations for ${{ matrix.app_name }}"
58+ pull_request_body: "Autosync the updated translations"
59+ working_directory: apps/${{ matrix.app_name }}
.github/workflows/enforce-labels.ymlnew file+16
@@ -0,0 +1,16 @@
1+---
2+name: Enforce PR labels
3+
4+on:
5+ pull_request:
6+ types: [labeled, unlabeled, opened, edited, synchronize]
7+jobs:
8+ enforce-label:
9+ name: EnforceLabel
10+ runs-on: ubuntu-20.04
11+ steps:
12+ - name: Enforce Label
13+ uses: yogevbd/enforce-label-action@8d1e1709b1011e6d90400a0e6cf7c0b77aa5efeb # v2.1.0
14+ with:
15+ BANNED_LABELS: "hold"
16+ BANNED_LABELS_DESCRIPTION: "PRs on hold cannot be merged"
.github/workflows/lint.ymlnew file+36
@@ -0,0 +1,36 @@
1+---
2+name: Lint
3+
4+on:
5+ push:
6+ branches-ignore:
7+ - 'l10n_master'
8+ - 'cf-pages'
9+ paths-ignore:
10+ - '.github/workflows/**'
11+ workflow_dispatch:
12+ inputs: {}
13+
14+defaults:
15+ run:
16+ shell: bash
17+
18+jobs:
19+ lint:
20+ name: Lint
21+ runs-on: ubuntu-20.04
22+ steps:
23+ - name: Checkout repo
24+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0
25+
26+ - name: Set up Node
27+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
28+ with:
29+ cache: 'npm'
30+ cache-dependency-path: '**/package-lock.json'
31+ node-version: '16'
32+
33+ - name: Run linter
34+ run: |
35+ npm ci
36+ npm run lint
.github/workflows/release-browser.ymlnew file+143
@@ -0,0 +1,143 @@
1+---
2+name: Release Browser
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ release_type:
8+ description: 'Release Options'
9+ required: true
10+ default: 'Initial Release'
11+ type: choice
12+ options:
13+ - Initial Release
14+ - Redeploy
15+ - Dry Run
16+
17+defaults:
18+ run:
19+ shell: bash
20+
21+jobs:
22+ setup:
23+ name: Setup
24+ runs-on: ubuntu-20.04
25+ outputs:
26+ release-version: ${{ steps.version.outputs.version }}
27+ steps:
28+ - name: Checkout repo
29+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
30+
31+ - name: Branch check
32+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
33+ run: |
34+ if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then
35+ echo "==================================="
36+ echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches"
37+ echo "==================================="
38+ exit 1
39+ fi
40+
41+ - name: Check Release Version
42+ id: version
43+ uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6
44+ with:
45+ release-type: ${{ github.event.inputs.release_type }}
46+ project-type: ts
47+ file: apps/browser/src/manifest.json
48+ monorepo: true
49+ monorepo-project: browser
50+
51+
52+ locales-test:
53+ name: Locales Test
54+ runs-on: ubuntu-20.04
55+ needs: setup
56+ steps:
57+ - name: Checkout repo
58+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
59+
60+ - name: Testing locales - extName length
61+ run: |
62+ found_error=false
63+
64+ echo "Locales Test"
65+ echo "============"
66+ echo "extName string must be 40 characters or less"
67+ echo
68+ for locale in $(ls src/_locales/); do
69+ string_length=$(jq '.extName.message | length' src/_locales/$locale/messages.json)
70+ if [[ $string_length -gt 40 ]]; then
71+ echo "$locale: $string_length"
72+ found_error=true
73+ fi
74+ done
75+
76+ if $found_error; then
77+ echo
78+ echo "Please fix 'extName' for the locales listed above."
79+ exit 1
80+ else
81+ echo "Test passed!"
82+ fi
83+ working-directory: apps/browser
84+
85+
86+ release:
87+ name: Create GitHub Release
88+ runs-on: ubuntu-20.04
89+ needs:
90+ - setup
91+ - locales-test
92+ steps:
93+ - name: Download latest Release build artifacts
94+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
95+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
96+ with:
97+ workflow: build-browser.yml
98+ workflow_conclusion: success
99+ branch: ${{ github.ref_name }}
100+ artifacts: 'browser-source-*.zip,
101+ dist-chrome-*.zip,
102+ dist-opera-*.zip,
103+ dist-firefox-*.zip,
104+ dist-edge-*.zip'
105+
106+ - name: Download latest master build artifacts
107+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
108+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
109+ with:
110+ workflow: build-browser.yml
111+ workflow_conclusion: success
112+ branch: master
113+ artifacts: 'browser-source-*.zip,
114+ dist-chrome-*.zip,
115+ dist-opera-*.zip,
116+ dist-firefox-*.zip,
117+ dist-edge-*.zip'
118+
119+ - name: Rename build artifacts
120+ env:
121+ PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }}
122+ run: |
123+ mv browser-source.zip browser-source-$PACKAGE_VERSION.zip
124+ mv dist-chrome.zip dist-chrome-$PACKAGE_VERSION.zip
125+ mv dist-opera.zip dist-opera-$PACKAGE_VERSION.zip
126+ mv dist-firefox.zip dist-firefox-$PACKAGE_VERSION.zip
127+ mv dist-edge.zip dist-edge-$PACKAGE_VERSION.zip
128+
129+ - name: Create release
130+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
131+ uses: ncipollo/release-action@40bb172bd05f266cf9ba4ff965cb61e9ee5f6d01
132+ with:
133+ artifacts: 'browser-source-${{ needs.setup.outputs.release-version }}.zip,
134+ dist-chrome-${{ needs.setup.outputs.release-version }}.zip,
135+ dist-opera-${{ needs.setup.outputs.release-version }}.zip,
136+ dist-firefox-${{ needs.setup.outputs.release-version }}.zip,
137+ dist-edge-${{ needs.setup.outputs.release-version }}.zip'
138+ commit: ${{ github.sha }}
139+ tag: "browser-v${{ needs.setup.outputs.release-version }}"
140+ name: "Browser v${{ needs.setup.outputs.release-version }}"
141+ body: "<insert release notes here>"
142+ token: ${{ secrets.GITHUB_TOKEN }}
143+ draft: true
.github/workflows/release-cli.ymlnew file+276
@@ -0,0 +1,276 @@
1+---
2+name: Release CLI
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ release_type:
8+ description: 'Release Options'
9+ required: true
10+ default: 'Initial Release'
11+ type: choice
12+ options:
13+ - Initial Release
14+ - Redeploy
15+ - Dry Run
16+ snap_publish:
17+ description: 'Publish to snap store'
18+ required: true
19+ default: true
20+ type: boolean
21+ choco_publish:
22+ description: 'Publish to chocolatey store'
23+ required: true
24+ default: true
25+ type: boolean
26+ npm_publish:
27+ description: 'Publish to npm registry'
28+ required: true
29+ default: true
30+ type: boolean
31+
32+
33+defaults:
34+ run:
35+ working-directory: apps/cli
36+
37+jobs:
38+ setup:
39+ name: Setup
40+ runs-on: ubuntu-20.04
41+ outputs:
42+ release-version: ${{ steps.version.outputs.version }}
43+ steps:
44+ - name: Checkout repo
45+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
46+
47+ - name: Branch check
48+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
49+ run: |
50+ if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then
51+ echo "==================================="
52+ echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches"
53+ echo "==================================="
54+ exit 1
55+ fi
56+
57+ - name: Check Release Version
58+ id: version
59+ uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6
60+ with:
61+ release-type: ${{ github.event.inputs.release_type }}
62+ project-type: ts
63+ file: apps/cli/package.json
64+ monorepo: true
65+ monorepo-project: cli
66+
67+ - name: Download all Release artifacts
68+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
69+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
70+ with:
71+ workflow: build-cli.yml
72+ path: apps/cli
73+ workflow_conclusion: success
74+ branch: ${{ github.ref_name }}
75+
76+ - name: Download all artifacts
77+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
78+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
79+ with:
80+ workflow: build-cli.yml
81+ path: apps/cli
82+ workflow_conclusion: success
83+ branch: master
84+
85+ - name: Create release
86+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
87+ uses: ncipollo/release-action@58ae73b360456532aafd58ee170c045abbeaee37 # v1.10.0
88+ env:
89+ PKG_VERSION: ${{ steps.version.outputs.version }}
90+ with:
91+ artifacts: "apps/cli/bw-windows-${{ env.PKG_VERSION }}.zip,
92+ apps/cli/bw-windows-sha256-${{ env.PKG_VERSION }}.txt,
93+ apps/cli/bw-macos-${{ env.PKG_VERSION }}.zip,
94+ apps/cli/bw-macos-sha256-${{ env.PKG_VERSION }}.txt,
95+ apps/cli/bw-linux-${{ env.PKG_VERSION }}.zip,
96+ apps/cli/bw-linux-sha256-${{ env.PKG_VERSION }}.txt,
97+ apps/cli/bitwarden-cli.${{ env.PKG_VERSION }}.nupkg,
98+ apps/cli/bw_${{ env.PKG_VERSION }}_amd64.snap,
99+ apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt"
100+ commit: ${{ github.sha }}
101+ tag: cli-v${{ env.PKG_VERSION }}
102+ name: CLI v${{ env.PKG_VERSION }}
103+ body: "<insert release notes here>"
104+ token: ${{ secrets.GITHUB_TOKEN }}
105+ draft: true
106+
107+
108+ snap:
109+ name: Deploy Snap
110+ runs-on: ubuntu-20.04
111+ needs: setup
112+ if: inputs.snap_publish
113+ env:
114+ _PKG_VERSION: ${{ needs.setup.outputs.release-version }}
115+ steps:
116+ - name: Checkout repo
117+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
118+
119+ - name: Login to Azure
120+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
121+ with:
122+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
123+
124+ - name: Retrieve secrets
125+ id: retrieve-secrets
126+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
127+ with:
128+ keyvault: "bitwarden-prod-kv"
129+ secrets: "snapcraft-store-token"
130+
131+ - name: Install Snap
132+ uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0
133+ with:
134+ snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }}
135+
136+ - name: Download artifacts
137+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
138+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
139+ with:
140+ workflow: build-cli.yml
141+ path: apps/cli
142+ workflow_conclusion: success
143+ branch: ${{ github.ref_name }}
144+ artifacts: bw_${{ env._PKG_VERSION }}_amd64.snap
145+
146+ - name: Download artifacts
147+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
148+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
149+ with:
150+ workflow: build-cli.yml
151+ path: apps/cli
152+ workflow_conclusion: success
153+ branch: master
154+ artifacts: bw_${{ env._PKG_VERSION }}_amd64.snap
155+
156+ - name: Publish Snap & logout
157+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
158+ run: |
159+ snapcraft push bw_${{ env._PKG_VERSION }}_amd64.snap --release stable
160+ snapcraft logout
161+
162+
163+ choco:
164+ name: Deploy Choco
165+ runs-on: windows-2019
166+ needs: setup
167+ if: inputs.choco_publish
168+ env:
169+ _PKG_VERSION: ${{ needs.setup.outputs.release-version }}
170+ steps:
171+ - name: Checkout repo
172+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
173+
174+ - name: Login to Azure
175+ uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16
176+ with:
177+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
178+
179+ - name: Retrieve secrets
180+ id: retrieve-secrets
181+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
182+ with:
183+ keyvault: "bitwarden-prod-kv"
184+ secrets: "cli-choco-api-key"
185+
186+ - name: Setup Chocolatey
187+ run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/
188+ env:
189+ CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }}
190+
191+ - name: Make dist dir
192+ shell: pwsh
193+ run: New-Item -ItemType directory -Path ./dist
194+
195+ - name: Download artifacts
196+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
197+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
198+ with:
199+ workflow: build-cli.yml
200+ path: apps/cli/dist
201+ workflow_conclusion: success
202+ branch: ${{ github.ref_name }}
203+ artifacts: bitwarden-cli.${{ env._PKG_VERSION }}.nupkg
204+
205+ - name: Download artifacts
206+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
207+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
208+ with:
209+ workflow: build-cli.yml
210+ path: apps/cli/dist
211+ workflow_conclusion: success
212+ branch: master
213+ artifacts: bitwarden-cli.${{ env._PKG_VERSION }}.nupkg
214+
215+ - name: Push to Chocolatey
216+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
217+ shell: pwsh
218+ run: |
219+ cd dist
220+ choco push
221+
222+
223+ npm:
224+ name: Publish NPM
225+ runs-on: ubuntu-20.04
226+ needs: setup
227+ if: inputs.npm_publish
228+ env:
229+ _PKG_VERSION: ${{ needs.setup.outputs.release-version }}
230+ steps:
231+ - name: Checkout repo
232+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
233+
234+ - name: Login to Azure
235+ uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16
236+ with:
237+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
238+
239+ - name: Retrieve secrets
240+ id: retrieve-secrets
241+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
242+ with:
243+ keyvault: "bitwarden-prod-kv"
244+ secrets: "cli-npm-api-key"
245+
246+ - name: Download artifacts
247+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
248+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
249+ with:
250+ workflow: build-cli.yml
251+ path: apps/cli/build
252+ workflow_conclusion: success
253+ branch: ${{ github.ref_name }}
254+ artifacts: bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip
255+
256+ - name: Download artifacts
257+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
258+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
259+ with:
260+ workflow: build-cli.yml
261+ path: apps/cli/build
262+ workflow_conclusion: success
263+ branch: master
264+ artifacts: bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip
265+
266+ - name: Setup NPM
267+ run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc
268+ env:
269+ NPM_TOKEN: ${{ steps.retrieve-secrets.outputs.cli-npm-api-key }}
270+
271+ - name: Install Husky
272+ run: npm install -g husky
273+
274+ - name: Publish NPM
275+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
276+ run: npm publish --access public
.github/workflows/release-desktop-beta.ymlnew file+920
@@ -0,0 +1,920 @@
1+---
2+name: Release Desktop Beta
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ version_number:
8+ description: "New Beta Version"
9+ required: true
10+
11+defaults:
12+ run:
13+ shell: bash
14+
15+jobs:
16+ setup:
17+ name: Setup
18+ runs-on: ubuntu-20.04
19+ outputs:
20+ release-version: ${{ steps.version.outputs.version }}
21+ release-channel: ${{ steps.release-channel.outputs.channel }}
22+ steps:
23+ - name: Checkout repo
24+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
25+
26+ # - name: Branch check
27+ # run: |
28+ # if [[ "$GITHUB_REF" != "refs/heads/master" ]] && [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then
29+ # echo "==================================="
30+ # echo "[!] Can only release from the 'master', 'rc' or 'hotfix-rc/*' branches"
31+ # echo "==================================="
32+ # exit 1
33+ # fi
34+
35+ - name: Bump Desktop Version - Root
36+ env:
37+ VERSION: ${{ github.event.inputs.version_number }}
38+ run: npm version --workspace=@bitwarden/desktop ${VERSION}-beta
39+
40+ - name: Bump Desktop Version - App
41+ env:
42+ VERSION: ${{ github.event.inputs.version_number }}
43+ run: npm version ${VERSION}-beta
44+ working-directory: "apps/desktop/src"
45+
46+ - name: Check Release Version
47+ id: version
48+ uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6
49+ with:
50+ release-type: ${{ github.event.inputs.release_type }}
51+ project-type: ts
52+ file: apps/desktop/src/package.json
53+ monorepo: true
54+ monorepo-project: desktop
55+
56+ - name: Get Version Channel
57+ id: release-channel
58+ run: |
59+ case "${{ steps.version.outputs.version }}" in
60+ *"alpha"*)
61+ echo "::set-output name=channel::alpha"
62+ echo "[!] We do not yet support 'alpha'"
63+ exit 1
64+ ;;
65+ *"beta"*)
66+ echo "::set-output name=channel::beta"
67+ ;;
68+ *)
69+ echo "::set-output name=channel::latest"
70+ ;;
71+ esac
72+
73+ linux:
74+ name: Linux Build
75+ runs-on: ubuntu-20.04
76+ needs: setup
77+ env:
78+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
79+ defaults:
80+ run:
81+ working-directory: apps/desktop
82+ steps:
83+ - name: Checkout repo
84+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
85+
86+ - name: Set up Node
87+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
88+ with:
89+ cache: 'npm'
90+ cache-dependency-path: '**/package-lock.json'
91+ node-version: '16'
92+
93+ - name: Set Node options
94+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
95+
96+ - name: Install node-gyp
97+ run: |
98+ npm install -g node-gyp
99+ node-gyp install $(node -v)
100+
101+ - name: Set up environment
102+ run: |
103+ sudo apt-get update
104+ sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm
105+
106+ - name: Set up Snap
107+ run: sudo snap install snapcraft --classic
108+
109+ - name: Print environment
110+ run: |
111+ node --version
112+ npm --version
113+ snap --version
114+ snapcraft --version || echo 'snapcraft unavailable'
115+
116+ - name: Install Node dependencies
117+ run: npm ci
118+ working-directory: ./
119+
120+ - name: Build application
121+ run: npm run dist:lin
122+
123+ - name: Upload .deb artifact
124+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
125+ with:
126+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb
127+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb
128+ if-no-files-found: error
129+
130+ - name: Upload .rpm artifact
131+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
132+ with:
133+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm
134+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm
135+ if-no-files-found: error
136+
137+ - name: Upload .freebsd artifact
138+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
139+ with:
140+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd
141+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd
142+ if-no-files-found: error
143+
144+ - name: Upload .snap artifact
145+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
146+ with:
147+ name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap
148+ path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap
149+ if-no-files-found: error
150+
151+ - name: Upload .AppImage artifact
152+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
153+ with:
154+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage
155+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage
156+ if-no-files-found: error
157+
158+ - name: Upload auto-update artifact
159+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
160+ with:
161+ name: ${{ needs.setup.outputs.release_channel }}-linux.yml
162+ path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-linux.yml
163+ if-no-files-found: error
164+
165+
166+ windows:
167+ name: Windows Build
168+ runs-on: windows-2019
169+ needs: setup
170+ defaults:
171+ run:
172+ shell: pwsh
173+ working-directory: apps/desktop
174+ env:
175+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
176+ steps:
177+ - name: Checkout repo
178+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
179+
180+ - name: Set up Node
181+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
182+ with:
183+ cache: 'npm'
184+ cache-dependency-path: '**/package-lock.json'
185+ node-version: '16'
186+
187+ - name: Set Node options
188+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
189+
190+ - name: Install node-gyp
191+ run: |
192+ npm install -g node-gyp
193+ node-gyp install $(node -v)
194+
195+ - name: Install AST
196+ uses: bitwarden/gh-actions/install-ast@f135c42c8596cb535c5bcb7523c0b2eef89709ac
197+
198+ - name: Set up environment
199+ run: choco install checksum --no-progress
200+
201+ - name: Print environment
202+ run: |
203+ node --version
204+ npm --version
205+ choco --version
206+
207+ - name: Login to Azure
208+ uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
209+ with:
210+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
211+
212+ - name: Retrieve secrets
213+ id: retrieve-secrets
214+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
215+ with:
216+ keyvault: "bitwarden-prod-kv"
217+ secrets: "code-signing-vault-url,
218+ code-signing-client-id,
219+ code-signing-tenant-id,
220+ code-signing-client-secret,
221+ code-signing-cert-name"
222+
223+ - name: Install Node dependencies
224+ run: npm ci
225+ working-directory: ./
226+
227+ - name: Build & Sign (dev)
228+ env:
229+ ELECTRON_BUILDER_SIGN: 1
230+ SIGNING_VAULT_URL: ${{ steps.retrieve-secrets.outputs.code-signing-vault-url }}
231+ SIGNING_CLIENT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-client-id }}
232+ SIGNING_TENANT_ID: ${{ steps.retrieve-secrets.outputs.code-signing-tenant-id }}
233+ SIGNING_CLIENT_SECRET: ${{ steps.retrieve-secrets.outputs.code-signing-client-secret }}
234+ SIGNING_CERT_NAME: ${{ steps.retrieve-secrets.outputs.code-signing-cert-name }}
235+ run: |
236+ npm run build
237+ npm run pack:win
238+
239+ - name: Rename appx files for store
240+ run: |
241+ Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx" `
242+ -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx"
243+ Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx" `
244+ -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx"
245+ Copy-Item "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx" `
246+ -Destination "./dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx"
247+
248+ - name: Package for Chocolatey
249+ run: |
250+ Copy-Item -Path ./stores/chocolatey -Destination ./dist/chocolatey -Recurse
251+ Copy-Item -Path ./dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe `
252+ -Destination ./dist/chocolatey
253+
254+ $checksum = checksum -t sha256 ./dist/chocolatey/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe
255+ $chocoInstall = "./dist/chocolatey/tools/chocolateyinstall.ps1"
256+ (Get-Content $chocoInstall).replace('__version__', "$env:_PACKAGE_VERSION").replace('__checksum__', $checksum) | Set-Content $chocoInstall
257+ choco pack ./dist/chocolatey/bitwarden.nuspec --version "$env:_PACKAGE_VERSION" --out ./dist/chocolatey
258+
259+ - name: Fix NSIS artifact names for auto-updater
260+ run: |
261+ Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z `
262+ -NewName bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z
263+ Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z `
264+ -NewName bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z
265+ Rename-Item -Path .\dist\nsis-web\Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z `
266+ -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z
267+
268+ - name: Upload portable exe artifact
269+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
270+ with:
271+ name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe
272+ path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe
273+ if-no-files-found: error
274+
275+ - name: Upload installer exe artifact
276+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
277+ with:
278+ name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe
279+ path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe
280+ if-no-files-found: error
281+
282+ - name: Upload appx ia32 artifact
283+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
284+ with:
285+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx
286+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx
287+ if-no-files-found: error
288+
289+ - name: Upload store appx ia32 artifact
290+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
291+ with:
292+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx
293+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx
294+ if-no-files-found: error
295+
296+ - name: Upload NSIS ia32 artifact
297+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
298+ with:
299+ name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z
300+ path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z
301+ if-no-files-found: error
302+
303+ - name: Upload appx x64 artifact
304+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
305+ with:
306+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx
307+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx
308+ if-no-files-found: error
309+
310+ - name: Upload store appx x64 artifact
311+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
312+ with:
313+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx
314+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx
315+ if-no-files-found: error
316+
317+ - name: Upload NSIS x64 artifact
318+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
319+ with:
320+ name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z
321+ path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z
322+ if-no-files-found: error
323+
324+ - name: Upload appx ARM64 artifact
325+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
326+ with:
327+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx
328+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx
329+ if-no-files-found: error
330+
331+ - name: Upload store appx ARM64 artifact
332+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
333+ with:
334+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx
335+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx
336+ if-no-files-found: error
337+
338+ - name: Upload NSIS ARM64 artifact
339+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
340+ with:
341+ name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z
342+ path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z
343+ if-no-files-found: error
344+
345+ - name: Upload nupkg artifact
346+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
347+ with:
348+ name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg
349+ path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg
350+ if-no-files-found: error
351+
352+ - name: Upload auto-update artifact
353+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
354+ with:
355+ name: ${{ needs.setup.outputs.release_channel }}.yml
356+ path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release_channel }}.yml
357+ if-no-files-found: error
358+
359+
360+ macos-build:
361+ name: MacOS Build
362+ runs-on: macos-11
363+ needs: setup
364+ env:
365+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
366+ defaults:
367+ run:
368+ working-directory: apps/desktop
369+ steps:
370+ - name: Checkout repo
371+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
372+
373+ - name: Set up Node
374+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
375+ with:
376+ cache: 'npm'
377+ cache-dependency-path: '**/package-lock.json'
378+ node-version: '16'
379+
380+ - name: Set Node options
381+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
382+
383+ - name: Install node-gyp
384+ run: |
385+ npm install -g node-gyp
386+ node-gyp install $(node -v)
387+
388+ - name: Print environment
389+ run: |
390+ node --version
391+ npm --version
392+ echo "GitHub ref: $GITHUB_REF"
393+ echo "GitHub event: $GITHUB_EVENT"
394+
395+ - name: Cache Build
396+ id: build-cache
397+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
398+ with:
399+ path: apps/desktop/build
400+ key: ${{ runner.os }}-${{ github.run_id }}-build
401+
402+ - name: Cache Safari
403+ id: safari-cache
404+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
405+ with:
406+ path: apps/browser/dist/Safari
407+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
408+
409+ - name: Decrypt secrets
410+ env:
411+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
412+ run: |
413+ mkdir -p $HOME/secrets
414+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
415+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
416+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
417+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
418+ --output "$HOME/secrets/appstore-app-cert.p12" \
419+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
420+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
421+ --output "$HOME/secrets/appstore-installer-cert.p12" \
422+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
423+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
424+ --output "$HOME/secrets/devid-app-cert.p12" \
425+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
426+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
427+ --output "$HOME/secrets/devid-installer-cert.p12" \
428+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
429+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
430+ --output "$HOME/secrets/macdev-cert.p12" \
431+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
432+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
433+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
434+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
435+
436+ - name: Set up keychain
437+ env:
438+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
439+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
440+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
441+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
442+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
443+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
444+ run: |
445+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
446+ security default-keychain -s build.keychain
447+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
448+ security set-keychain-settings -lut 1200 build.keychain
449+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
450+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
451+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
452+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
453+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
454+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
455+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
456+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
457+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
458+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
459+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
460+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
461+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
462+
463+ - name: Set up provisioning profiles
464+ run: |
465+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
466+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
467+
468+ - name: Increment version
469+ shell: pwsh
470+ env:
471+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
472+ run: |
473+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
474+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
475+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
476+
477+ - name: Install Node dependencies
478+ run: npm ci
479+ working-directory: ./
480+
481+ - name: Build application (dev)
482+ run: npm run build
483+
484+
485+ macos-package-github:
486+ name: MacOS Package GitHub Release Assets
487+ runs-on: macos-11
488+ needs:
489+ - setup
490+ - macos-build
491+ env:
492+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
493+ defaults:
494+ run:
495+ working-directory: apps/desktop
496+ steps:
497+ - name: Checkout repo
498+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
499+
500+ - name: Set up Node
501+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
502+ with:
503+ cache: 'npm'
504+ cache-dependency-path: '**/package-lock.json'
505+ node-version: '16'
506+
507+ - name: Set Node options
508+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
509+
510+ - name: Install node-gyp
511+ run: |
512+ npm install -g node-gyp
513+ node-gyp install $(node -v)
514+
515+ - name: Print environment
516+ run: |
517+ node --version
518+ npm --version
519+ echo "GitHub ref: $GITHUB_REF"
520+ echo "GitHub event: $GITHUB_EVENT"
521+
522+ - name: Get Build Cache
523+ id: build-cache
524+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
525+ with:
526+ path: apps/desktop/build
527+ key: ${{ runner.os }}-${{ github.run_id }}-build
528+
529+ - name: Setup Safari Cache
530+ id: safari-cache
531+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
532+ with:
533+ path: apps/browser/dist/Safari
534+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
535+
536+ - name: Decrypt secrets
537+ env:
538+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
539+ run: |
540+ mkdir -p $HOME/secrets
541+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
542+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
543+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
544+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
545+ --output "$HOME/secrets/appstore-app-cert.p12" \
546+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
547+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
548+ --output "$HOME/secrets/appstore-installer-cert.p12" \
549+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
550+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
551+ --output "$HOME/secrets/devid-app-cert.p12" \
552+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
553+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
554+ --output "$HOME/secrets/devid-installer-cert.p12" \
555+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
556+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
557+ --output "$HOME/secrets/macdev-cert.p12" \
558+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
559+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
560+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
561+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
562+
563+ - name: Set up keychain
564+ env:
565+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
566+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
567+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
568+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
569+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
570+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
571+ run: |
572+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
573+ security default-keychain -s build.keychain
574+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
575+ security set-keychain-settings -lut 1200 build.keychain
576+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
577+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
578+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
579+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
580+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
581+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
582+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
583+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
584+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
585+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
586+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
587+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
588+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
589+
590+ - name: Set up provisioning profiles
591+ run: |
592+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
593+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
594+
595+ - name: Increment version
596+ shell: pwsh
597+ env:
598+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
599+ run: |
600+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
601+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
602+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
603+
604+ - name: Install Node dependencies
605+ run: npm ci
606+ working-directory: ./
607+
608+ - name: Build
609+ if: steps.build-cache.outputs.cache-hit != 'true'
610+ run: npm run build
611+
612+ - name: Extract branch name
613+ if: contains(github.ref, 'hotfix-rc')
614+ id: extract_branch
615+ shell: bash
616+ run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
617+
618+ - name: Download artifact from hotfix-rc
619+ if: contains(github.ref, 'hotfix-rc')
620+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
621+ with:
622+ workflow: build-browser.yml
623+ workflow_conclusion: success
624+ branch: ${{ steps.extract_branch.outputs.branch }}
625+ path: ${{ github.workspace }}/browser-build-artifacts
626+
627+ - name: Download artifact from rc
628+ if: github.ref == 'refs/heads/rc'
629+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
630+ with:
631+ workflow: build-browser.yml
632+ workflow_conclusion: success
633+ branch: rc
634+ path: ${{ github.workspace }}/browser-build-artifacts
635+
636+ - name: Download artifact from master
637+ if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }}
638+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
639+ with:
640+ workflow: build-browser.yml
641+ workflow_conclusion: success
642+ branch: master
643+ path: ${{ github.workspace }}/browser-build-artifacts
644+
645+ - name: Unzip Safari artifact
646+ run: |
647+ SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip')
648+ echo $SAFARI_DIR
649+ unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts
650+
651+ - name: Load Safari extension for .dmg
652+ run: |
653+ mkdir PlugIns
654+ cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/dmg/build/Release/safari.appex PlugIns/safari.appex
655+
656+ - name: Build application (dist)
657+ env:
658+ APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
659+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
660+ run: npm run pack:mac
661+
662+ - name: Upload .zip artifact
663+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
664+ with:
665+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip
666+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip
667+ if-no-files-found: error
668+
669+ - name: Upload .dmg artifact
670+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
671+ with:
672+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg
673+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg
674+ if-no-files-found: error
675+
676+ - name: Upload .dmg blockmap artifact
677+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
678+ with:
679+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap
680+ path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap
681+ if-no-files-found: error
682+
683+ - name: Upload auto-update artifact
684+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
685+ with:
686+ name: ${{ needs.setup.outputs.release_channel }}-mac.yml
687+ path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-mac.yml
688+ if-no-files-found: error
689+
690+
691+ macos-package-mas:
692+ name: MacOS Package Prod Release Asset
693+ runs-on: macos-11
694+ needs:
695+ - setup
696+ - macos-build
697+ env:
698+ _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
699+ defaults:
700+ run:
701+ working-directory: apps/desktop
702+ steps:
703+ - name: Checkout repo
704+ uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
705+
706+ - name: Set up Node
707+ uses: actions/setup-node@9ced9a43a244f3ac94f13bfd896db8c8f30da67a # v3.0.0
708+ with:
709+ cache: 'npm'
710+ cache-dependency-path: '**/package-lock.json'
711+ node-version: '16'
712+
713+ - name: Set Node options
714+ run: echo "NODE_OPTIONS=--max_old_space_size=4096" >> $GITHUB_ENV
715+
716+ - name: Install node-gyp
717+ run: |
718+ npm install -g node-gyp
719+ node-gyp install $(node -v)
720+
721+ - name: Print environment
722+ run: |
723+ node --version
724+ npm --version
725+ echo "GitHub ref: $GITHUB_REF"
726+ echo "GitHub event: $GITHUB_EVENT"
727+
728+ - name: Get Build Cache
729+ id: build-cache
730+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
731+ with:
732+ path: apps/desktop/build
733+ key: ${{ runner.os }}-${{ github.run_id }}-build
734+
735+ - name: Setup Safari Cache
736+ id: safari-cache
737+ uses: actions/cache@937d24475381cd9c75ae6db12cb4e79714b926ed
738+ with:
739+ path: apps/browser/dist/Safari
740+ key: ${{ runner.os }}-${{ github.run_id }}-safari-extension
741+
742+ - name: Decrypt secrets
743+ env:
744+ DECRYPT_FILE_PASSWORD: ${{ secrets.DECRYPT_FILE_PASSWORD }}
745+ run: |
746+ mkdir -p $HOME/secrets
747+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
748+ --output "$HOME/secrets/bitwarden-desktop-key.p12" \
749+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden-desktop-key.p12.gpg"
750+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
751+ --output "$HOME/secrets/appstore-app-cert.p12" \
752+ "$GITHUB_WORKSPACE/.github/secrets/appstore-app-cert.p12.gpg"
753+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
754+ --output "$HOME/secrets/appstore-installer-cert.p12" \
755+ "$GITHUB_WORKSPACE/.github/secrets/appstore-installer-cert.p12.gpg"
756+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
757+ --output "$HOME/secrets/devid-app-cert.p12" \
758+ "$GITHUB_WORKSPACE/.github/secrets/devid-app-cert.p12.gpg"
759+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
760+ --output "$HOME/secrets/devid-installer-cert.p12" \
761+ "$GITHUB_WORKSPACE/.github/secrets/devid-installer-cert.p12.gpg"
762+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
763+ --output "$HOME/secrets/macdev-cert.p12" \
764+ "$GITHUB_WORKSPACE/.github/secrets/macdev-cert.p12.gpg"
765+ gpg --quiet --batch --yes --decrypt --passphrase="$DECRYPT_FILE_PASSWORD" \
766+ --output "$HOME/secrets/bitwarden_desktop_appstore.provisionprofile" \
767+ "$GITHUB_WORKSPACE/.github/secrets/bitwarden_desktop_appstore.provisionprofile.gpg"
768+
769+ - name: Set up keychain
770+ env:
771+ KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
772+ DESKTOP_KEY_PASSWORD: ${{ secrets.DESKTOP_KEY_PASSWORD }}
773+ DEVID_CERT_PASSWORD: ${{ secrets.DEVID_CERT_PASSWORD }}
774+ APPSTORE_CERT_PASSWORD: ${{ secrets.APPSTORE_CERT_PASSWORD }}
775+ MACDEV_CERT_PASSWORD: ${{ secrets.MACDEV_CERT_PASSWORD }}
776+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
777+ run: |
778+ security create-keychain -p $KEYCHAIN_PASSWORD build.keychain
779+ security default-keychain -s build.keychain
780+ security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain
781+ security set-keychain-settings -lut 1200 build.keychain
782+ security import "$HOME/secrets/bitwarden-desktop-key.p12" -k build.keychain -P $DESKTOP_KEY_PASSWORD \
783+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
784+ security import "$HOME/secrets/devid-app-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
785+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
786+ security import "$HOME/secrets/devid-installer-cert.p12" -k build.keychain -P $DEVID_CERT_PASSWORD \
787+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
788+ security import "$HOME/secrets/appstore-app-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
789+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
790+ security import "$HOME/secrets/appstore-installer-cert.p12" -k build.keychain -P $APPSTORE_CERT_PASSWORD \
791+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
792+ security import "$HOME/secrets/macdev-cert.p12" -k build.keychain -P $MACDEV_CERT_PASSWORD \
793+ -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild
794+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain
795+
796+ - name: Set up provisioning profiles
797+ run: |
798+ cp $HOME/secrets/bitwarden_desktop_appstore.provisionprofile \
799+ $GITHUB_WORKSPACE/apps/desktop/bitwarden_desktop_appstore.provisionprofile
800+
801+ - name: Increment version
802+ shell: pwsh
803+ env:
804+ BUILD_NUMBER: ${{ needs.setup.outputs.build_number }}
805+ run: |
806+ $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json
807+ $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"
808+ $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json
809+
810+ - name: Install Node dependencies
811+ run: npm ci
812+ working-directory: ./
813+
814+ - name: Build
815+ if: steps.build-cache.outputs.cache-hit != 'true'
816+ run: npm run build
817+
818+ - name: Extract branch name
819+ if: contains(github.ref, 'hotfix-rc')
820+ id: extract_branch
821+ shell: bash
822+ run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
823+
824+ - name: Download artifact from hotfix-rc
825+ if: contains(github.ref, 'hotfix-rc')
826+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
827+ with:
828+ workflow: build-browser.yml
829+ workflow_conclusion: success
830+ branch: ${{ steps.extract_branch.outputs.branch }}
831+ path: ${{ github.workspace }}/browser-build-artifacts
832+
833+ - name: Download artifact from rc
834+ if: github.ref == 'refs/heads/rc'
835+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
836+ with:
837+ workflow: build-browser.yml
838+ workflow_conclusion: success
839+ branch: rc
840+ path: ${{ github.workspace }}/browser-build-artifacts
841+
842+ - name: Download artifact from master
843+ if: ${{ github.ref != 'refs/heads/rc' && !contains(github.ref, 'hotfix-rc') }}
844+ uses: dawidd6/action-download-artifact@b2abf1705491048a2d7074f7d90513044fd25d39 # v2.19.0
845+ with:
846+ workflow: build-browser.yml
847+ workflow_conclusion: success
848+ branch: master
849+ path: ${{ github.workspace }}/browser-build-artifacts
850+
851+ - name: Unzip Safari artifact
852+ run: |
853+ SAFARI_DIR=$(find $GITHUB_WORKSPACE/browser-build-artifacts -name 'dist-safari-*.zip')
854+ echo $SAFARI_DIR
855+ unzip $SAFARI_DIR/dist-safari.zip -d $GITHUB_WORKSPACE/browser-build-artifacts
856+
857+ - name: Load Safari extension for App Store
858+ run: |
859+ mkdir PlugIns
860+ cp -r $GITHUB_WORKSPACE/browser-build-artifacts/Safari/mas/build/Release/safari.appex PlugIns/safari.appex
861+
862+ - name: Build application for App Store
863+ run: npm run pack:mac:mas
864+ env:
865+ APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
866+ APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
867+
868+ - name: Upload .pkg artifact
869+ uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
870+ with:
871+ name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg
872+ path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg
873+ if-no-files-found: error
874+
875+ release:
876+ name: MacOS Package Prod Release Asset
877+ runs-on: ubuntu-20.04
878+ needs:
879+ - setup
880+ - linux
881+ - windows
882+ - macos-build
883+ - macos-package-github
884+ - macos-package-mas
885+ steps:
886+ - name: Login to Azure
887+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010
888+ with:
889+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
890+
891+ - name: Retrieve secrets
892+ id: retrieve-secrets
893+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
894+ with:
895+ keyvault: "bitwarden-prod-kv"
896+ secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name"
897+
898+ - name: Download all artifacts
899+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
900+ with:
901+ path: apps/desktop/artifacts
902+
903+ - name: Rename .pkg to .pkg.archive
904+ env:
905+ PKG_VERSION: ${{ steps.version.outputs.version }}
906+ working-directory: apps/desktop/artifacts
907+ run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive
908+
909+ # - name: Publish artifacts to S3
910+ # env:
911+ # AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }}
912+ # AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }}
913+ # AWS_DEFAULT_REGION: 'us-west-2'
914+ # AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }}
915+ # working-directory: apps/desktop/artifacts
916+ # run: |
917+ # aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \
918+ # --acl "public-read" \
919+ # --recursive \
920+ # --quiet
.github/workflows/release-desktop.ymlnew file+290
@@ -0,0 +1,290 @@
1+---
2+name: Release Desktop
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ release_type:
8+ description: 'Release Options'
9+ required: true
10+ default: 'Initial Release'
11+ type: choice
12+ options:
13+ - Initial Release
14+ - Redeploy
15+ - Dry Run
16+ snap_publish:
17+ description: 'Publish to snap store'
18+ required: true
19+ default: true
20+ type: boolean
21+ choco_publish:
22+ description: 'Publish to chocolatey store'
23+ required: true
24+ default: true
25+ type: boolean
26+
27+defaults:
28+ run:
29+ shell: bash
30+
31+jobs:
32+ setup:
33+ name: Setup
34+ runs-on: ubuntu-20.04
35+ outputs:
36+ release-version: ${{ steps.version.outputs.version }}
37+ release-channel: ${{ steps.release-channel.outputs.channel }}
38+ steps:
39+ - name: Checkout repo
40+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
41+
42+ - name: Branch check
43+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
44+ run: |
45+ if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then
46+ echo "==================================="
47+ echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches"
48+ echo "==================================="
49+ exit 1
50+ fi
51+
52+ - name: Check Release Version
53+ id: version
54+ uses: bitwarden/gh-actions/release-version-check@ea9fab01d76940267b4147cc1c4542431246b9f6
55+ with:
56+ release-type: ${{ github.event.inputs.release_type }}
57+ project-type: ts
58+ file: apps/desktop/src/package.json
59+ monorepo: true
60+ monorepo-project: desktop
61+
62+ - name: Get Version Channel
63+ id: release-channel
64+ run: |
65+ case "${{ steps.version.outputs.version }}" in
66+ *"alpha"*)
67+ echo "::set-output name=channel::alpha"
68+ echo "[!] We do not yet support 'alpha'"
69+ exit 1
70+ ;;
71+ *"beta"*)
72+ echo "::set-output name=channel::beta"
73+ ;;
74+ *)
75+ echo "::set-output name=channel::latest"
76+ ;;
77+ esac
78+
79+ - name: Login to Azure
80+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010
81+ with:
82+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
83+
84+ - name: Retrieve secrets
85+ id: retrieve-secrets
86+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
87+ with:
88+ keyvault: "bitwarden-prod-kv"
89+ secrets: "aws-electron-access-id, aws-electron-access-key, aws-electron-bucket-name"
90+
91+ - name: Download all artifacts
92+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
93+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
94+ with:
95+ workflow: build-desktop.yml
96+ workflow_conclusion: success
97+ branch: ${{ github.ref_name }}
98+ path: apps/desktop/artifacts
99+
100+ - name: Download all artifacts
101+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
102+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
103+ with:
104+ workflow: build-desktop.yml
105+ workflow_conclusion: success
106+ branch: master
107+ path: apps/desktop/artifacts
108+
109+ - name: Rename .pkg to .pkg.archive
110+ env:
111+ PKG_VERSION: ${{ steps.version.outputs.version }}
112+ working-directory: apps/desktop/artifacts
113+ run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive
114+
115+ - name: Publish artifacts to S3
116+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
117+ env:
118+ AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }}
119+ AWS_SECRET_ACCESS_KEY: ${{ steps.retrieve-secrets.outputs.aws-electron-access-key }}
120+ AWS_DEFAULT_REGION: 'us-west-2'
121+ AWS_S3_BUCKET_NAME: ${{ steps.retrieve-secrets.outputs.aws-electron-bucket-name }}
122+ working-directory: apps/desktop/artifacts
123+ run: |
124+ aws s3 cp ./ $AWS_S3_BUCKET_NAME/desktop/ \
125+ --acl "public-read" \
126+ --recursive \
127+ --quiet
128+
129+ - name: Create release
130+ uses: ncipollo/release-action@95215a3cb6e6a1908b3c44e00b4fdb15548b1e09 # v2.8.5
131+ if: ${{ steps.release-channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' }}
132+ env:
133+ PKG_VERSION: ${{ steps.version.outputs.version }}
134+ RELEASE_CHANNEL: ${{ steps.release-channel.outputs.channel }}
135+ with:
136+ artifacts: "apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-amd64.deb,
137+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-x86_64.rpm,
138+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-x64.freebsd,
139+ apps/desktop/artifacts/bitwarden_${{ env.PKG_VERSION }}_amd64.snap,
140+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-x86_64.AppImage,
141+ apps/desktop/artifacts/Bitwarden-Portable-${{ env.PKG_VERSION }}.exe,
142+ apps/desktop/artifacts/Bitwarden-Installer-${{ env.PKG_VERSION }}.exe,
143+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-ia32-store.appx,
144+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-ia32.appx,
145+ apps/desktop/artifacts/bitwarden-${{ env.PKG_VERSION }}-ia32.nsis.7z,
146+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-x64-store.appx,
147+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-x64.appx,
148+ apps/desktop/artifacts/bitwarden-${{ env.PKG_VERSION }}-x64.nsis.7z,
149+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-arm64-store.appx,
150+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-arm64.appx,
151+ apps/desktop/artifacts/bitwarden-${{ env.PKG_VERSION }}-arm64.nsis.7z,
152+ apps/desktop/artifacts/bitwarden.${{ env.PKG_VERSION }}.nupkg,
153+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-universal-mac.zip,
154+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-universal.dmg,
155+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-universal.dmg.blockmap,
156+ apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive,
157+ apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}.yml,
158+ apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-linux.yml,
159+ apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-mac.yml"
160+ commit: ${{ github.sha }}
161+ tag: desktop-v${{ env.PKG_VERSION }}
162+ name: Desktop v${{ env.PKG_VERSION }}
163+ body: "<insert release notes here>"
164+ token: ${{ secrets.GITHUB_TOKEN }}
165+ draft: true
166+
167+
168+ snap:
169+ name: Deploy Snap
170+ runs-on: ubuntu-20.04
171+ needs: setup
172+ if: inputs.snap_publish
173+ env:
174+ _PKG_VERSION: ${{ needs.setup.outputs.release-version }}
175+ steps:
176+ - name: Checkout Repo
177+ uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
178+
179+ - name: Login to Azure
180+ uses: Azure/login@77f1b2e3fb80c0e8645114159d17008b8a2e475a
181+ with:
182+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
183+
184+ - name: Retrieve secrets
185+ id: retrieve-secrets
186+ uses: Azure/get-keyvault-secrets@80ccd3fafe5662407cc2e55f202ee34bfff8c403
187+ with:
188+ keyvault: "bitwarden-prod-kv"
189+ secrets: "snapcraft-store-token"
190+
191+ - name: Install Snap
192+ uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0
193+ with:
194+ snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }}
195+
196+ - name: Setup
197+ run: mkdir dist
198+ working-directory: apps/desktop
199+
200+ - name: Download Snap artifact
201+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
202+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
203+ with:
204+ workflow: build-desktop.yml
205+ workflow_conclusion: success
206+ branch: ${{ github.ref_name }}
207+ artifacts: bitwarden_${{ env._PKG_VERSION }}_amd64.snap
208+ path: apps/desktop/dist
209+
210+ - name: Download Snap artifact
211+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
212+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
213+ with:
214+ workflow: build-desktop.yml
215+ workflow_conclusion: success
216+ branch: master
217+ artifacts: bitwarden_${{ env._PKG_VERSION }}_amd64.snap
218+ path: apps/desktop/dist
219+
220+ - name: Deploy to Snap Store
221+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
222+ run: |
223+ snapcraft upload bitwarden_${{ env._PKG_VERSION }}_amd64.snap --release stable
224+ snapcraft logout
225+ working-directory: apps/desktop/dist
226+
227+ choco:
228+ name: Deploy Choco
229+ runs-on: windows-2019
230+ needs: setup
231+ if: inputs.choco_publish
232+ env:
233+ _PKG_VERSION: ${{ needs.setup.outputs.release-version }}
234+ steps:
235+ - name: Checkout Repo
236+ uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
237+
238+ - name: Print Environment
239+ run: |
240+ dotnet --version
241+ dotnet nuget --version
242+
243+ - name: Login to Azure
244+ uses: Azure/login@24848bc889cfc0a8313c2b3e378ac0d625b9bc16
245+ with:
246+ creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
247+
248+ - name: Retrieve secrets
249+ id: retrieve-secrets
250+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f
251+ with:
252+ keyvault: "bitwarden-prod-kv"
253+ secrets: "cli-choco-api-key"
254+
255+ - name: Setup Chocolatey
256+ shell: pwsh
257+ run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/
258+ env:
259+ CHOCO_API_KEY: ${{ steps.retrieve-secrets.outputs.cli-choco-api-key }}
260+
261+ - name: Make dist dir
262+ shell: pwsh
263+ run: New-Item -ItemType directory -Path ./dist
264+ working-directory: apps/desktop
265+
266+ - name: Download choco artifact
267+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
268+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
269+ with:
270+ workflow: build-desktop.yml
271+ workflow_conclusion: success
272+ branch: ${{ github.ref_name }}
273+ artifacts: bitwarden.${{ env._PKG_VERSION }}.nupkg
274+ path: apps/desktop/dist
275+
276+ - name: Download choco artifact
277+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
278+ uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783
279+ with:
280+ workflow: build-desktop.yml
281+ workflow_conclusion: success
282+ branch: master
283+ artifacts: bitwarden.${{ env._PKG_VERSION }}.nupkg
284+ path: apps/desktop/dist
285+
286+ - name: Push to Chocolatey
287+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
288+ shell: pwsh
289+ run: choco push
290+ working-directory: apps/desktop/dist
.github/workflows/release-qa-web.ymlnew file+120
@@ -0,0 +1,120 @@
1+---
2+name: QA - Web Release
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ image_extension:
8+ description: "Image tag extension"
9+ required: false
10+
11+env:
12+ _QA_CLUSTER_RESOURCE_GROUP: "bw-env-qa"
13+ _QA_CLUSTER_NAME: "bw-aks-qa"
14+ _QA_K8S_NAMESPACE: "bw-qa"
15+ _QA_K8S_APP_NAME: "bw-web"
16+
17+jobs:
18+ deploy:
19+ name: Deploy QA Web
20+ runs-on: ubuntu-20.04
21+ steps:
22+ - name: Checkout Repo
23+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
24+
25+ - name: Setup
26+ run: export PATH=$PATH:~/work/web/web
27+
28+ - name: Login to Azure
29+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
30+ with:
31+ creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }}
32+
33+ - name: Retrieve secrets
34+ id: retrieve-secrets
35+ uses: Azure/get-keyvault-secrets@b5c723b9ac7870c022b8c35befe620b7009b336f # v1
36+ with:
37+ keyvault: "bitwarden-qa-kv"
38+ secrets: "qa-aks-kubectl-credentials"
39+
40+ - name: Login with qa-aks-kubectl-credentials SP
41+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
42+ with:
43+ creds: ${{ env.qa-aks-kubectl-credentials }}
44+
45+ - name: Setup AKS access
46+ run: |
47+ echo "---az install---"
48+ az aks install-cli --install-location ./kubectl --kubelogin-install-location ./kubelogin
49+ echo "---az get-creds---"
50+ az aks get-credentials -n $_QA_CLUSTER_NAME -g $_QA_CLUSTER_RESOURCE_GROUP
51+
52+ - name: Get image tag
53+ id: image_tag
54+ run: |
55+ IMAGE_TAG=$(echo "${GITHUB_REF:11}" | sed "s#/#-#g")
56+ TAG_EXTENSION=${{ github.event.inputs.image_extension }}
57+
58+ if [[ $TAG_EXTENSION ]]; then
59+ IMAGE_TAG=$IMAGE_TAG-$TAG_EXTENSION
60+ fi
61+ echo "::set-output name=value::$IMAGE_TAG"
62+
63+ - name: Deploy Web image
64+ env:
65+ IMAGE_TAG: ${{ steps.image_tag.outputs.value }}
66+ run: |
67+ kubectl set image -n $_QA_K8S_NAMESPACE deployment/web web=bitwardenqa.azurecr.io/web:$IMAGE_TAG --record
68+ kubectl rollout restart -n $_QA_K8S_NAMESPACE deployment/web
69+ kubectl rollout status deployment/web -n $_QA_K8S_NAMESPACE
70+
71+ cfpages-deploy:
72+ name: Deploy Web Vault to QA CloudFlare Pages branch
73+ runs-on: ubuntu-20.04
74+ steps:
75+ - name: Checkout Repo
76+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
77+
78+ - name: Download latest cloud asset
79+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
80+ with:
81+ workflow: build-web.yml
82+ path: apps/web
83+ workflow_conclusion: success
84+ branch: ${{ github.ref_name }}
85+ artifacts: web-*-cloud-COMMERCIAL.zip
86+
87+ # This should result in a build directory in the current working directory
88+ - name: Unzip build asset
89+ working-directory: apps/web
90+ run: unzip web-*-cloud-COMMERCIAL.zip
91+
92+ - name: Checkout Repo
93+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
94+ with:
95+ ref: cf-pages-qa
96+ path: deployment
97+
98+ - name: Setup git config
99+ run: |
100+ git config --global user.name "GitHub Action Bot"
101+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
102+ git config --global url."https://github.com/".insteadOf ssh://git@github.com/
103+ git config --global url."https://".insteadOf ssh://
104+
105+ - name: Deploy CloudFlare Pages
106+ run: |
107+ rm -rf ./*
108+ cp -R ../apps/web/build/* .
109+ working-directory: deployment
110+
111+ - name: Push new ver to cf-pages-qa
112+ run: |
113+ if [ -n "$(git status --porcelain)" ]; then
114+ git add .
115+ git commit -m "Deploy ${{ github.ref_name }} to QA Cloudflare pages"
116+ git push -u origin cf-pages-qa
117+ else
118+ echo "No changes to commit!";
119+ fi
120+ working-directory: deployment
.github/workflows/release-web.ymlnew file+269
@@ -0,0 +1,269 @@
1+---
2+name: Release Web
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ release_type:
8+ description: 'Release Options'
9+ required: true
10+ default: 'Initial Release'
11+ type: choice
12+ options:
13+ - Initial Release
14+ - Redeploy
15+ - Dry Run
16+
17+jobs:
18+ setup:
19+ name: Setup
20+ runs-on: ubuntu-20.04
21+ outputs:
22+ release_version: ${{ steps.version.outputs.version }}
23+ tag_version: ${{ steps.version.outputs.tag }}
24+ steps:
25+ - name: Checkout repo
26+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
27+
28+ - name: Branch check
29+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
30+ run: |
31+ if [[ "$GITHUB_REF" != "refs/heads/rc" ]] && [[ $GITHUB_REF != refs/heads/hotfix-rc/* ]]; then
32+ echo "==================================="
33+ echo "[!] Can only release from the 'rc' or 'hotfix-rc/*' branches"
34+ echo "==================================="
35+ exit 1
36+ fi
37+
38+ - name: Check Release Version
39+ id: version
40+ uses: bitwarden/gh-actions/release-version-check@8f055ef543c7433c967a1b9b04a0f230923233bb
41+ with:
42+ release-type: ${{ github.event.inputs.release_type }}
43+ project-type: ts
44+ file: apps/web/package.json
45+ monorepo: true
46+ monorepo-project: web
47+
48+
49+ self-host:
50+ name: Release self-host docker
51+ runs-on: ubuntu-20.04
52+ needs: setup
53+ env:
54+ _BRANCH_NAME: ${{ github.ref_name }}
55+ _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }}
56+ _RELEASE_OPTION: ${{ github.event.inputs.release_type }}
57+ steps:
58+ - name: Print environment
59+ run: |
60+ whoami
61+ docker --version
62+ echo "GitHub ref: $GITHUB_REF"
63+ echo "GitHub event: $GITHUB_EVENT"
64+ echo "Github Release Option: $_RELEASE_OPTION"
65+
66+ - name: Checkout repo
67+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
68+
69+ ########## DockerHub ##########
70+ - name: Setup DCT
71+ id: setup-dct
72+ uses: bitwarden/gh-actions/setup-docker-trust@a8c384a05a974c05c48374c818b004be221d43ff
73+ with:
74+ azure-creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }}
75+ azure-keyvault-name: "bitwarden-prod-kv"
76+
77+ - name: Pull latest selfhost image
78+ run: |
79+ if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then
80+ docker pull bitwarden/web:latest
81+ else
82+ docker pull bitwarden/web:$_BRANCH_NAME
83+ fi
84+
85+ - name: Docker Tag version and latest image
86+ run: |
87+ if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then
88+ docker tag bitwarden/web:latest bitwarden/web:$_RELEASE_VERSION
89+ else
90+ docker tag bitwarden/web:$_BRANCH_NAME bitwarden/web:$_RELEASE_VERSION
91+ fi
92+
93+ - name: Docker Push version and latest image
94+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
95+ env:
96+ DOCKER_CONTENT_TRUST: 1
97+ DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: ${{ steps.setup-dct.outputs.dct-delegate-repo-passphrase }}
98+ run: |
99+ docker push bitwarden/web:$_RELEASE_VERSION
100+
101+ - name: Log out of Docker and disable Docker Notary
102+ run: |
103+ docker logout
104+ echo "DOCKER_CONTENT_TRUST=0" >> $GITHUB_ENV
105+
106+ ########## ACR ##########
107+ - name: Login to Azure - QA Subscription
108+ uses: Azure/login@ec3c14589bd3e9312b3cc8c41e6860e258df9010 # v1.1
109+ with:
110+ creds: ${{ secrets.AZURE_QA_KV_CREDENTIALS }}
111+
112+ - name: Login to Azure ACR
113+ run: az acr login -n bitwardenqa
114+
115+ - name: Tag version and latest
116+ env:
117+ REGISTRY: bitwardenqa.azurecr.io
118+ run: |
119+ if [[ "${{ github.event.inputs.release_type }}" == "Dry Run" ]]; then
120+ docker tag bitwarden/web:latest $REGISTRY/web:$_RELEASE_VERSION
121+
122+ docker tag bitwarden/web:latest $REGISTRY/web-sh:$_RELEASE_VERSION
123+ else
124+ docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web:$_RELEASE_VERSION
125+
126+ docker tag bitwarden/web:$_BRANCH_NAME $REGISTRY/web-sh:$_RELEASE_VERSION
127+ fi
128+
129+ - name: Push version and latest image
130+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
131+ env:
132+ REGISTRY: bitwardenqa.azurecr.io
133+ run: |
134+ docker push $REGISTRY/web:$_RELEASE_VERSION
135+
136+ docker push $REGISTRY/web-sh:$_RELEASE_VERSION
137+
138+ - name: Log out of Docker
139+ run: docker logout
140+
141+
142+ cfpages-deploy:
143+ name: Deploy Web Vault to CloudFlare Pages branch
144+ runs-on: ubuntu-20.04
145+ needs:
146+ - setup
147+ - self-host
148+ env:
149+ _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }}
150+ _TAG_VERSION: ${{ needs.setup.outputs.tag_version }}
151+ steps:
152+ - name: Checkout Repo
153+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
154+
155+ - name: Download latest cloud asset
156+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
157+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
158+ with:
159+ workflow: build-web.yml
160+ path: apps/web
161+ workflow_conclusion: success
162+ branch: ${{ github.ref_name }}
163+ artifacts: web-*-cloud-COMMERCIAL.zip
164+
165+ - name: Download latest cloud asset
166+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
167+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
168+ with:
169+ workflow: build-web.yml
170+ path: apps/web
171+ workflow_conclusion: success
172+ branch: master
173+ artifacts: web-*-cloud-COMMERCIAL.zip
174+
175+ # This should result in a build directory in the current working directory
176+ - name: Unzip build asset
177+ working-directory: apps/web
178+ run: unzip web-*-cloud-COMMERCIAL.zip
179+
180+ - name: Checkout Repo
181+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2
182+ with:
183+ ref: cf-pages
184+ path: deployment
185+
186+ - name: Setup git config
187+ run: |
188+ git config --global user.name = "GitHub Action Bot"
189+ git config --global user.email = "<>"
190+ git config --global url."https://github.com/".insteadOf ssh://git@github.com/
191+ git config --global url."https://".insteadOf ssh://
192+
193+ - name: Deploy CloudFlare Pages
194+ run: |
195+ rm -rf ./*
196+ cp -R ../apps/web/build/* .
197+ working-directory: deployment
198+
199+ - name: Create cf-pages-deploy branch
200+ run: |
201+ git switch -c cf-pages-deploy-$_TAG_VERSION
202+ git add .
203+ git commit -m "Staging deploy ${{ needs.setup.outputs.release_version }}"
204+
205+ if [[ "${{ github.event.inputs.release_type }}" != "Dry Run" ]]; then
206+ git push -u origin cf-pages-deploy-$_TAG_VERSION
207+ fi
208+ working-directory: deployment
209+
210+ - name: Create CloudFlare Pages Deploy PR
211+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
212+ env:
213+ PR_BRANCH: cf-pages-deploy-${{ env._TAG_VERSION }}
214+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
215+ run: |
216+ gh pr create --title "Deploy $_RELEASE_VERSION to CloudFlare Pages" \
217+ --body "Deploying $_RELEASE_VERSION" \
218+ --base cf-pages \
219+ --head "$PR_BRANCH"
220+
221+
222+ release:
223+ name: Create GitHub Release
224+ runs-on: ubuntu-20.04
225+ needs:
226+ - setup
227+ - self-host
228+ - cfpages-deploy
229+ steps:
230+ - name: Download latest build artifacts
231+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
232+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
233+ with:
234+ workflow: build-web.yml
235+ path: apps/web/artifacts
236+ workflow_conclusion: success
237+ branch: ${{ github.ref_name }}
238+ artifacts: "web-*-selfhosted-COMMERCIAL.zip,
239+ web-*-selfhosted-open-source.zip"
240+
241+ - name: Download latest build artifacts
242+ if: ${{ github.event.inputs.release_type == 'Dry Run' }}
243+ uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8
244+ with:
245+ workflow: build-web.yml
246+ path: apps/web/artifacts
247+ workflow_conclusion: success
248+ branch: master
249+ artifacts: "web-*-selfhosted-COMMERCIAL.zip,
250+ web-*-selfhosted-open-source.zip"
251+
252+ - name: Rename assets
253+ working-directory: apps/web/artifacts
254+ run: |
255+ mv web-*-selfhosted-COMMERCIAL.zip web-${{ needs.setup.outputs.release_version }}-selfhosted-COMMERCIAL.zip
256+ mv web-*-selfhosted-open-source.zip web-${{ needs.setup.outputs.release_version }}-selfhosted-open-source.zip
257+
258+ - name: Create release
259+ if: ${{ github.event.inputs.release_type != 'Dry Run' }}
260+ uses: ncipollo/release-action@58ae73b360456532aafd58ee170c045abbeaee37 # v1.10.0
261+ with:
262+ name: "Version v${{ needs.setup.outputs.release_version }}"
263+ commit: ${{ github.sha }}
264+ tag: web-v${{ needs.setup.outputs.tag_version }}
265+ body: "<insert release notes here>"
266+ artifacts: "apps/web/artifacts/web-${{ needs.setup.outputs.release_version }}-selfhosted-COMMERCIAL.zip,
267+ apps/web/artifacts/web-${{ needs.setup.outputs.release_version }}-selfhosted-open-source.zip"
268+ token: ${{ secrets.GITHUB_TOKEN }}
269+ draft: true
.github/workflows/stale-bot.ymlnew file+30
@@ -0,0 +1,30 @@
1+---
2+name: 'Close stale issues and PRs'
3+on:
4+ workflow_dispatch:
5+ schedule: # Run once a day at 5.23am (arbitrary but should avoid peak loads on the hour)
6+ - cron: '23 5 * * *'
7+
8+jobs:
9+ stale:
10+ name: 'Check for stale issues and PRs'
11+ runs-on: ubuntu-20.04
12+ steps:
13+ - name: 'Run stale action'
14+ uses: actions/stale@3cc123766321e9f15a6676375c154ccffb12a358 # v5.0.0
15+ with:
16+ stale-issue-label: 'needs-reply'
17+ stale-pr-label: 'needs-changes'
18+ days-before-stale: -1 # Do not apply the stale labels automatically, this is a manual process
19+ days-before-issue-close: 14 # Close issue if no further activity after X days
20+ days-before-pr-close: 21 # Close PR if no further activity after X days
21+ close-issue-message: |
22+ We need more information before we can help you with your problem. As we haven’t heard from you recently, this issue will be closed.
23+
24+ If this happens again or continues to be an problem, please respond to this issue with the information we’ve requested and anything else relevant.
25+ close-pr-message: |
26+ We can’t merge your pull request until you make the changes we’ve requested. As we haven’t heard from you recently, this pull request will be closed.
27+
28+ If you’re still working on this, please respond here after you’ve made the changes we’ve requested and our team will re-open it for further review.
29+
30+ Please make sure to resolve any conflicts with the master branch before requesting another review.
.github/workflows/version-bump.ymlnew file+157
@@ -0,0 +1,157 @@
1+---
2+name: Version Bump
3+
4+on:
5+ workflow_dispatch:
6+ inputs:
7+ client:
8+ description: "Client Project"
9+ required: true
10+ type: choice
11+ options:
12+ - Browser
13+ - CLI
14+ - Desktop
15+ - Web
16+ version_number:
17+ description: "New Version"
18+ required: true
19+
20+defaults:
21+ run:
22+ shell: bash
23+
24+jobs:
25+ bump_version:
26+ name: "Bump ${{ github.event.inputs.client }} Version"
27+ runs-on: ubuntu-20.04
28+ steps:
29+ - name: Checkout Branch
30+ uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
31+
32+ - name: Create Version Branch
33+ id: branch
34+ env:
35+ CLIENT_NAME: ${{ github.event.inputs.client }}
36+ VERSION: ${{ github.event.inputs.version_number }}
37+ run: |
38+ CLIENT=$(python -c "print('$CLIENT_NAME'.lower())")
39+ echo "::set-output name=client::$CLIENT"
40+
41+ git switch -c ${CLIENT}_version_bump_${VERSION}
42+
43+ ########################
44+ # VERSION BUMP SECTION #
45+ ########################
46+
47+ ### Browser
48+ - name: Bump Browser Version
49+ if: ${{ github.event.inputs.client == 'Browser' }}
50+ env:
51+ VERSION: ${{ github.event.inputs.version_number }}
52+ run: npm version --workspace=@bitwarden/browser ${VERSION}
53+
54+ - name: Bump Browser Version - Manifest
55+ if: ${{ github.event.inputs.client == 'Browser' }}
56+ uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
57+ with:
58+ version: ${{ github.event.inputs.version_number }}
59+ file_path: "apps/browser/src/manifest.json"
60+
61+ - name: Bump Browser Version - Manifest v3
62+ if: ${{ github.event.inputs.client == 'Browser' }}
63+ uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
64+ with:
65+ version: ${{ github.event.inputs.version_number }}
66+ file_path: "apps/browser/src/manifest.v3.json"
67+
68+ - name: Run Prettier after Browser Version Bump
69+ if: ${{ github.event.inputs.client == 'Browser' }}
70+ run: |
71+ npm install -g prettier
72+ prettier --write apps/browser/src/manifest.json
73+ prettier --write apps/browser/src/manifest.v3.json
74+
75+ ### CLI
76+ - name: Bump CLI Version
77+ if: ${{ github.event.inputs.client == 'CLI' }}
78+ env:
79+ VERSION: ${{ github.event.inputs.version_number }}
80+ run: npm version --workspace=@bitwarden/cli ${VERSION}
81+
82+ ### Desktop
83+ - name: Bump Desktop Version - Root
84+ if: ${{ github.event.inputs.client == 'Desktop' }}
85+ env:
86+ VERSION: ${{ github.event.inputs.version_number }}
87+ run: npm version --workspace=@bitwarden/desktop ${VERSION}
88+
89+ - name: Bump Desktop Version - App
90+ if: ${{ github.event.inputs.client == 'Desktop' }}
91+ env:
92+ VERSION: ${{ github.event.inputs.version_number }}
93+ run: npm version ${VERSION}
94+ working-directory: "apps/desktop/src"
95+
96+ ### Web
97+ - name: Bump Web Version
98+ if: ${{ github.event.inputs.client == 'Web' }}
99+ env:
100+ VERSION: ${{ github.event.inputs.version_number }}
101+ run: npm version --workspace=@bitwarden/web-vault ${VERSION}
102+
103+ ########################
104+
105+ - name: Setup git
106+ run: |
107+ git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
108+ git config --local user.name "github-actions[bot]"
109+
110+ - name: Check if version changed
111+ id: version-changed
112+ run: |
113+ if [ -n "$(git status --porcelain)" ]; then
114+ echo "::set-output name=changes_to_commit::TRUE"
115+ else
116+ echo "::set-output name=changes_to_commit::FALSE"
117+ echo "No changes to commit!";
118+ fi
119+
120+ - name: Commit files
121+ if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
122+ env:
123+ CLIENT: ${{ steps.branch.outputs.client }}
124+ VERSION: ${{ github.event.inputs.version_number }}
125+ run: |
126+ git commit -m "Bumped ${CLIENT} version to ${VERSION}" -a
127+
128+ - name: Push changes
129+ if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
130+ env:
131+ CLIENT: ${{ steps.branch.outputs.client }}
132+ VERSION: ${{ github.event.inputs.version_number }}
133+ run: git push -u origin ${CLIENT}_version_bump_${VERSION}
134+
135+ - name: Create Bump Version PR
136+ if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }}
137+ env:
138+ PR_BRANCH: "${{ steps.branch.outputs.client }}_version_bump_${{ github.event.inputs.version_number }}"
139+ GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
140+ BASE_BRANCH: master
141+ TITLE: "Bump ${{ github.event.inputs.client }} version to ${{ github.event.inputs.version_number }}"
142+ run: |
143+ gh pr create --title "$TITLE" \
144+ --base "$BASE" \
145+ --head "$PR_BRANCH" \
146+ --label "version update" \
147+ --label "automated pr" \
148+ --body "
149+ ## Type of change
150+ - [ ] Bug fix
151+ - [ ] New feature development
152+ - [ ] Tech debt (refactoring, code cleanup, dependency upgrades, etc)
153+ - [ ] Build/deploy pipeline (DevOps)
154+ - [X] Other
155+
156+ ## Objective
157+ Automated ${{ github.event.inputs.client }} version bump to ${{ github.event.inputs.version_number }}"
.github/workflows/workflow-linter.ymlnew file+11
@@ -0,0 +1,11 @@
1+---
2+name: Workflow Linter
3+
4+on:
5+ pull_request:
6+ paths:
7+ - .github/workflows/**
8+
9+jobs:
10+ call-workflow:
11+ uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@master
.gitignore+34−8
@@ -1,14 +1,40 @@
1−.vs
2−.idea
1+# General
32.DS_Store
3+Thumbs.db
4+
5+# IDEs and editors
6+.idea/
7+.project
8+.classpath
9+.c9/
10+*.launch
11+.settings/
12+*.sublime-workspace
13+
14+# Visual Studio Code
15+.vscode/*
16+!.vscode/settings.json
17+!.vscode/tasks.json
18+!.vscode/launch.json
19+!.vscode/extensions.json
20+.history/*
21+
22+# Node
423node_modules
524npm-debug.log
6−css/
7−dist/
8−webfonts/
25+
26+# Build directories
27+dist
28+build
29+
30+# Testing
31+coverage
32+
33+# Misc
934*.crx
1035*.pem
1136*.zip
12−build/
13−build.safariextension/
14−coverage/
37+*.provisionprofile
38+
39+# Storybook
40+documentation.json
.husky/.gitignorenew file+1
.husky/pre-commitnew file+4
@@ -0,0 +1,4 @@
1+#!/bin/sh
2+. "$(dirname "$0")/_/husky.sh"
3+
4+npx lint-staged
.prettierignorenew file+27
@@ -0,0 +1,27 @@
1+# Build directories
2+**/build
3+**/dist
4+**/coverage
5+
6+# External libraries / auto synced locales
7+apps/browser/src/_locales
8+apps/browser/src/scripts/duo.js
9+apps/browser/src/content/autofill.js
10+apps/browser/src/safari
11+
12+apps/desktop/src/locales
13+apps/desktop/dist-safari
14+apps/desktop/desktop_native
15+apps/desktop/src/scripts/duo.js
16+
17+apps/cli/src/locales
18+apps/cli/.github
19+
20+apps/web/.github
21+apps/web/src/404/bootstrap.min.css
22+apps/web/src/locales
23+
24+libs/.github
25+
26+# Github Workflows
27+.github/workflows
.prettierrc.jsonnew file+3
@@ -0,0 +1,3 @@
1+{
2+ "printWidth": 100
3+}
.storybook/main.jsnew file+24
@@ -0,0 +1,24 @@
1+const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin");
2+
3+module.exports = {
4+ stories: [
5+ "../libs/components/src/**/*.stories.mdx",
6+ "../libs/components/src/**/*.stories.@(js|jsx|ts|tsx)",
7+ "../apps/web/src/**/*.stories.mdx",
8+ "../apps/web/src/**/*.stories.@(js|jsx|ts|tsx)",
9+ ],
10+ addons: [
11+ "@storybook/addon-links",
12+ "@storybook/addon-essentials",
13+ "@storybook/addon-a11y",
14+ "storybook-addon-designs",
15+ ],
16+ framework: "@storybook/angular",
17+ core: {
18+ builder: "webpack5",
19+ },
20+ webpackFinal: async (config, { configType }) => {
21+ config.resolve.plugins = [new TsconfigPathsPlugin()];
22+ return config;
23+ },
24+};
.storybook/preview.jsnew file+33
@@ -0,0 +1,33 @@
1+import { setCompodocJson } from "@storybook/addon-docs/angular";
2+import { componentWrapperDecorator, addDecorator } from "@storybook/angular";
3+
4+import docJson from "../documentation.json";
5+setCompodocJson(docJson);
6+
7+export const parameters = {
8+ actions: { argTypesRegex: "^on[A-Z].*" },
9+ controls: {
10+ matchers: {
11+ color: /(background|color)$/i,
12+ date: /Date$/,
13+ },
14+ },
15+ docs: { inlineStories: true },
16+};
17+
18+// ng-template is used to scope any template reference variables and isolate the previews
19+const decorator = componentWrapperDecorator(
20+ (story) => `
21+<ng-template #lightPreview>
22+ <div class="theme_light tw-px-5 tw-py-10 tw-border-2 tw-border-solid tw-border-secondary-300 tw-bg-[#ffffff]">${story}</div>
23+</ng-template>
24+<ng-template #darkPreview>
25+ <div class="theme_dark tw-mt-5 tw-px-5 tw-py-10 tw-bg-[#1f242e]">${story}</div>
26+</ng-template>
27+
28+<ng-container *ngTemplateOutlet="lightPreview"></ng-container>
29+<ng-container *ngTemplateOutlet="darkPreview"></ng-container>
30+`
31+);
32+
33+addDecorator(decorator);
.storybook/tsconfig.jsonnew file+10
@@ -0,0 +1,10 @@
1+{
2+ "extends": "../tsconfig",
3+ "compilerOptions": {
4+ "types": ["node"],
5+ "allowSyntheticDefaultImports": true
6+ },
7+ "exclude": ["../src/test.setup.ts", "../src/**/*.spec.ts", "../projects/**/*.spec.ts"],
8+ "include": ["../src/**/*", "../projects/**/*"],
9+ "files": ["./typings.d.ts"]
10+}
.storybook/typings.d.tsnew file+4
@@ -0,0 +1,4 @@
1+declare module "*.md" {
2+ const content: string;
3+ export default content;
4+}
CONTRIBUTING.md+2−12
@@ -1,13 +1,3 @@
1−Code contributions are welcome! Please commit any pull requests against the `master` branch.
1+# How to Contribute
22
3−# Localization (l10n)
4−
5−[](https://crowdin.com/project/bitwarden-browser)
6−
7−We use a translation tool called [Crowdin](https://crowdin.com) to help manage our localization efforts across many different languages.
8−
9−If you are interested in helping translate the bitwarden browser extension into another language (or make a translation correction), please register an account at Crowdin and join our project here: https://crowdin.com/project/bitwarden-browser
10−
11−If the language that you are interested in translating is not already listed, create a new account on Crowdin, join the project, and contact the project owner (https://crowdin.com/mail/compose/kspearrin).
12−
13−You can read Crowdin's getting started guide for translators here: https://support.crowdin.com/crowdin-intro/
3+Our [Contributing Guidelines](https://contributing.bitwarden.com/contributing/) are located in our [Contributing Documentation](https://contributing.bitwarden.com/). The documentation also includes recommended tooling, code style tips, and lots of other great information to get you started.
LICENSE.txt+17−674
@@ -1,674 +1,17 @@
1− GNU GENERAL PUBLIC LICENSE
2− Version 3, 29 June 2007
3−
4− Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5− Everyone is permitted to copy and distribute verbatim copies
6− of this license document, but changing it is not allowed.
7−
8− Preamble
9−
10− The GNU General Public License is a free, copyleft license for
11−software and other kinds of works.
12−
13− The licenses for most software and other practical works are designed
14−to take away your freedom to share and change the works. By contrast,
15−the GNU General Public License is intended to guarantee your freedom to
16−share and change all versions of a program--to make sure it remains free
17−software for all its users. We, the Free Software Foundation, use the
18−GNU General Public License for most of our software; it applies also to
19−any other work released this way by its authors. You can apply it to
20−your programs, too.
21−
22− When we speak of free software, we are referring to freedom, not
23−price. Our General Public Licenses are designed to make sure that you
24−have the freedom to distribute copies of free software (and charge for
25−them if you wish), that you receive source code or can get it if you
26−want it, that you can change the software or use pieces of it in new
27−free programs, and that you know you can do these things.
28−
29− To protect your rights, we need to prevent others from denying you
30−these rights or asking you to surrender the rights. Therefore, you have
31−certain responsibilities if you distribute copies of the software, or if
32−you modify it: responsibilities to respect the freedom of others.
33−
34− For example, if you distribute copies of such a program, whether
35−gratis or for a fee, you must pass on to the recipients the same
36−freedoms that you received. You must make sure that they, too, receive
37−or can get the source code. And you must show them these terms so they
38−know their rights.
39−
40− Developers that use the GNU GPL protect your rights with two steps:
41−(1) assert copyright on the software, and (2) offer you this License
42−giving you legal permission to copy, distribute and/or modify it.
43−
44− For the developers' and authors' protection, the GPL clearly explains
45−that there is no warranty for this free software. For both users' and
46−authors' sake, the GPL requires that modified versions be marked as
47−changed, so that their problems will not be attributed erroneously to
48−authors of previous versions.
49−
50− Some devices are designed to deny users access to install or run
51−modified versions of the software inside them, although the manufacturer
52−can do so. This is fundamentally incompatible with the aim of
53−protecting users' freedom to change the software. The systematic
54−pattern of such abuse occurs in the area of products for individuals to
55−use, which is precisely where it is most unacceptable. Therefore, we
56−have designed this version of the GPL to prohibit the practice for those
57−products. If such problems arise substantially in other domains, we
58−stand ready to extend this provision to those domains in future versions
59−of the GPL, as needed to protect the freedom of users.
60−
61− Finally, every program is threatened constantly by software patents.
62−States should not allow patents to restrict development and use of
63−software on general-purpose computers, but in those that do, we wish to
64−avoid the special danger that patents applied to a free program could
65−make it effectively proprietary. To prevent this, the GPL assures that
66−patents cannot be used to render the program non-free.
67−
68− The precise terms and conditions for copying, distribution and
69−modification follow.
70−
71− TERMS AND CONDITIONS
72−
73− 0. Definitions.
74−
75− "This License" refers to version 3 of the GNU General Public License.
76−
77− "Copyright" also means copyright-like laws that apply to other kinds of
78−works, such as semiconductor masks.
79−
80− "The Program" refers to any copyrightable work licensed under this
81−License. Each licensee is addressed as "you". "Licensees" and
82−"recipients" may be individuals or organizations.
83−
84− To "modify" a work means to copy from or adapt all or part of the work
85−in a fashion requiring copyright permission, other than the making of an
86−exact copy. The resulting work is called a "modified version" of the
87−earlier work or a work "based on" the earlier work.
88−
89− A "covered work" means either the unmodified Program or a work based
90−on the Program.
91−
92− To "propagate" a work means to do anything with it that, without
93−permission, would make you directly or secondarily liable for
94−infringement under applicable copyright law, except executing it on a
95−computer or modifying a private copy. Propagation includes copying,
96−distribution (with or without modification), making available to the
97−public, and in some countries other activities as well.
98−
99− To "convey" a work means any kind of propagation that enables other
100−parties to make or receive copies. Mere interaction with a user through
101−a computer network, with no transfer of a copy, is not conveying.
102−
103− An interactive user interface displays "Appropriate Legal Notices"
104−to the extent that it includes a convenient and prominently visible
105−feature that (1) displays an appropriate copyright notice, and (2)
106−tells the user that there is no warranty for the work (except to the
107−extent that warranties are provided), that licensees may convey the
108−work under this License, and how to view a copy of this License. If
109−the interface presents a list of user commands or options, such as a
110−menu, a prominent item in the list meets this criterion.
111−
112− 1. Source Code.
113−
114− The "source code" for a work means the preferred form of the work
115−for making modifications to it. "Object code" means any non-source
116−form of a work.
117−
118− A "Standard Interface" means an interface that either is an official
119−standard defined by a recognized standards body, or, in the case of
120−interfaces specified for a particular programming language, one that
121−is widely used among developers working in that language.
122−
123− The "System Libraries" of an executable work include anything, other
124−than the work as a whole, that (a) is included in the normal form of
125−packaging a Major Component, but which is not part of that Major
126−Component, and (b) serves only to enable use of the work with that
127−Major Component, or to implement a Standard Interface for which an
128−implementation is available to the public in source code form. A
129−"Major Component", in this context, means a major essential component
130−(kernel, window system, and so on) of the specific operating system
131−(if any) on which the executable work runs, or a compiler used to
132−produce the work, or an object code interpreter used to run it.
133−
134− The "Corresponding Source" for a work in object code form means all
135−the source code needed to generate, install, and (for an executable
136−work) run the object code and to modify the work, including scripts to
137−control those activities. However, it does not include the work's
138−System Libraries, or general-purpose tools or generally available free
139−programs which are used unmodified in performing those activities but
140−which are not part of the work. For example, Corresponding Source
141−includes interface definition files associated with source files for
142−the work, and the source code for shared libraries and dynamically
143−linked subprograms that the work is specifically designed to require,
144−such as by intimate data communication or control flow between those
145−subprograms and other parts of the work.
146−
147− The Corresponding Source need not include anything that users
148−can regenerate automatically from other parts of the Corresponding
149−Source.
150−
151− The Corresponding Source for a work in source code form is that
152−same work.
153−
154− 2. Basic Permissions.
155−
156− All rights granted under this License are granted for the term of
157−copyright on the Program, and are irrevocable provided the stated
158−conditions are met. This License explicitly affirms your unlimited
159−permission to run the unmodified Program. The output from running a
160−covered work is covered by this License only if the output, given its
161−content, constitutes a covered work. This License acknowledges your
162−rights of fair use or other equivalent, as provided by copyright law.
163−
164− You may make, run and propagate covered works that you do not
165−convey, without conditions so long as your license otherwise remains
166−in force. You may convey covered works to others for the sole purpose
167−of having them make modifications exclusively for you, or provide you
168−with facilities for running those works, provided that you comply with
169−the terms of this License in conveying all material for which you do
170−not control copyright. Those thus making or running the covered works
171−for you must do so exclusively on your behalf, under your direction
172−and control, on terms that prohibit them from making any copies of
173−your copyrighted material outside their relationship with you.
174−
175− Conveying under any other circumstances is permitted solely under
176−the conditions stated below. Sublicensing is not allowed; section 10
177−makes it unnecessary.
178−
179− 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180−
181− No covered work shall be deemed part of an effective technological
182−measure under any applicable law fulfilling obligations under article
183−11 of the WIPO copyright treaty adopted on 20 December 1996, or
184−similar laws prohibiting or restricting circumvention of such
185−measures.
186−
187− When you convey a covered work, you waive any legal power to forbid
188−circumvention of technological measures to the extent such circumvention
189−is effected by exercising rights under this License with respect to
190−the covered work, and you disclaim any intention to limit operation or
191−modification of the work as a means of enforcing, against the work's
192−users, your or third parties' legal rights to forbid circumvention of
193−technological measures.
194−
195− 4. Conveying Verbatim Copies.
196−
197− You may convey verbatim copies of the Program's source code as you
198−receive it, in any medium, provided that you conspicuously and
199−appropriately publish on each copy an appropriate copyright notice;
200−keep intact all notices stating that this License and any
201−non-permissive terms added in accord with section 7 apply to the code;
202−keep intact all notices of the absence of any warranty; and give all
203−recipients a copy of this License along with the Program.
204−
205− You may charge any price or no price for each copy that you convey,
206−and you may offer support or warranty protection for a fee.
207−
208− 5. Conveying Modified Source Versions.
209−
210− You may convey a work based on the Program, or the modifications to
211−produce it from the Program, in the form of source code under the
212−terms of section 4, provided that you also meet all of these conditions:
213−
214− a) The work must carry prominent notices stating that you modified
215− it, and giving a relevant date.
216−
217− b) The work must carry prominent notices stating that it is
218− released under this License and any conditions added under section
219− 7. This requirement modifies the requirement in section 4 to
220− "keep intact all notices".
221−
222− c) You must license the entire work, as a whole, under this
223− License to anyone who comes into possession of a copy. This
224− License will therefore apply, along with any applicable section 7
225− additional terms, to the whole of the work, and all its parts,
226− regardless of how they are packaged. This License gives no
227− permission to license the work in any other way, but it does not
228− invalidate such permission if you have separately received it.
229−
230− d) If the work has interactive user interfaces, each must display
231− Appropriate Legal Notices; however, if the Program has interactive
232− interfaces that do not display Appropriate Legal Notices, your
233− work need not make them do so.
234−
235− A compilation of a covered work with other separate and independent
236−works, which are not by their nature extensions of the covered work,
237−and which are not combined with it such as to form a larger program,
238−in or on a volume of a storage or distribution medium, is called an
239−"aggregate" if the compilation and its resulting copyright are not
240−used to limit the access or legal rights of the compilation's users
241−beyond what the individual works permit. Inclusion of a covered work
242−in an aggregate does not cause this License to apply to the other
243−parts of the aggregate.
244−
245− 6. Conveying Non-Source Forms.
246−
247− You may convey a covered work in object code form under the terms
248−of sections 4 and 5, provided that you also convey the
249−machine-readable Corresponding Source under the terms of this License,
250−in one of these ways:
251−
252− a) Convey the object code in, or embodied in, a physical product
253− (including a physical distribution medium), accompanied by the
254− Corresponding Source fixed on a durable physical medium
255− customarily used for software interchange.
256−
257− b) Convey the object code in, or embodied in, a physical product
258− (including a physical distribution medium), accompanied by a
259− written offer, valid for at least three years and valid for as
260− long as you offer spare parts or customer support for that product
261− model, to give anyone who possesses the object code either (1) a
262− copy of the Corresponding Source for all the software in the
263− product that is covered by this License, on a durable physical
264− medium customarily used for software interchange, for a price no
265− more than your reasonable cost of physically performing this
266− conveying of source, or (2) access to copy the
267− Corresponding Source from a network server at no charge.
268−
269− c) Convey individual copies of the object code with a copy of the
270− written offer to provide the Corresponding Source. This
271− alternative is allowed only occasionally and noncommercially, and
272− only if you received the object code with such an offer, in accord
273− with subsection 6b.
274−
275− d) Convey the object code by offering access from a designated
276− place (gratis or for a charge), and offer equivalent access to the
277− Corresponding Source in the same way through the same place at no
278− further charge. You need not require recipients to copy the
279− Corresponding Source along with the object code. If the place to
280− copy the object code is a network server, the Corresponding Source
281− may be on a different server (operated by you or a third party)
282− that supports equivalent copying facilities, provided you maintain
283− clear directions next to the object code saying where to find the
284− Corresponding Source. Regardless of what server hosts the
285− Corresponding Source, you remain obligated to ensure that it is
286− available for as long as needed to satisfy these requirements.
287−
288− e) Convey the object code using peer-to-peer transmission, provided
289− you inform other peers where the object code and Corresponding
290− Source of the work are being offered to the general public at no
291− charge under subsection 6d.
292−
293− A separable portion of the object code, whose source code is excluded
294−from the Corresponding Source as a System Library, need not be
295−included in conveying the object code work.
296−
297− A "User Product" is either (1) a "consumer product", which means any
298−tangible personal property which is normally used for personal, family,
299−or household purposes, or (2) anything designed or sold for incorporation
300−into a dwelling. In determining whether a product is a consumer product,
301−doubtful cases shall be resolved in favor of coverage. For a particular
302−product received by a particular user, "normally used" refers to a
303−typical or common use of that class of product, regardless of the status
304−of the particular user or of the way in which the particular user
305−actually uses, or expects or is expected to use, the product. A product
306−is a consumer product regardless of whether the product has substantial
307−commercial, industrial or non-consumer uses, unless such uses represent
308−the only significant mode of use of the product.
309−
310− "Installation Information" for a User Product means any methods,
311−procedures, authorization keys, or other information required to install
312−and execute modified versions of a covered work in that User Product from
313−a modified version of its Corresponding Source. The information must
314−suffice to ensure that the continued functioning of the modified object
315−code is in no case prevented or interfered with solely because
316−modification has been made.
317−
318− If you convey an object code work under this section in, or with, or
319−specifically for use in, a User Product, and the conveying occurs as
320−part of a transaction in which the right of possession and use of the
321−User Product is transferred to the recipient in perpetuity or for a
322−fixed term (regardless of how the transaction is characterized), the
323−Corresponding Source conveyed under this section must be accompanied
324−by the Installation Information. But this requirement does not apply
325−if neither you nor any third party retains the ability to install
326−modified object code on the User Product (for example, the work has
327−been installed in ROM).
328−
329− The requirement to provide Installation Information does not include a
330−requirement to continue to provide support service, warranty, or updates
331−for a work that has been modified or installed by the recipient, or for
332−the User Product in which it has been modified or installed. Access to a
333−network may be denied when the modification itself materially and
334−adversely affects the operation of the network or violates the rules and
335−protocols for communication across the network.
336−
337− Corresponding Source conveyed, and Installation Information provided,
338−in accord with this section must be in a format that is publicly
339−documented (and with an implementation available to the public in
340−source code form), and must require no special password or key for
341−unpacking, reading or copying.
342−
343− 7. Additional Terms.
344−
345− "Additional permissions" are terms that supplement the terms of this
346−License by making exceptions from one or more of its conditions.
347−Additional permissions that are applicable to the entire Program shall
348−be treated as though they were included in this License, to the extent
349−that they are valid under applicable law. If additional permissions
350−apply only to part of the Program, that part may be used separately
351−under those permissions, but the entire Program remains governed by
352−this License without regard to the additional permissions.
353−
354− When you convey a copy of a covered work, you may at your option
355−remove any additional permissions from that copy, or from any part of
356−it. (Additional permissions may be written to require their own
357−removal in certain cases when you modify the work.) You may place
358−additional permissions on material, added by you to a covered work,
359−for which you have or can give appropriate copyright permission.
360−
361− Notwithstanding any other provision of this License, for material you
362−add to a covered work, you may (if authorized by the copyright holders of
363−that material) supplement the terms of this License with terms:
364−
365− a) Disclaiming warranty or limiting liability differently from the
366− terms of sections 15 and 16 of this License; or
367−
368− b) Requiring preservation of specified reasonable legal notices or
369− author attributions in that material or in the Appropriate Legal
370− Notices displayed by works containing it; or
371−
372− c) Prohibiting misrepresentation of the origin of that material, or
373− requiring that modified versions of such material be marked in
374− reasonable ways as different from the original version; or
375−
376− d) Limiting the use for publicity purposes of names of licensors or
377− authors of the material; or
378−
379− e) Declining to grant rights under trademark law for use of some
380− trade names, trademarks, or service marks; or
381−
382− f) Requiring indemnification of licensors and authors of that
383− material by anyone who conveys the material (or modified versions of
384− it) with contractual assumptions of liability to the recipient, for
385− any liability that these contractual assumptions directly impose on
386− those licensors and authors.
387−
388− All other non-permissive additional terms are considered "further
389−restrictions" within the meaning of section 10. If the Program as you
390−received it, or any part of it, contains a notice stating that it is
391−governed by this License along with a term that is a further
392−restriction, you may remove that term. If a license document contains
393−a further restriction but permits relicensing or conveying under this
394−License, you may add to a covered work material governed by the terms
395−of that license document, provided that the further restriction does
396−not survive such relicensing or conveying.
397−
398− If you add terms to a covered work in accord with this section, you
399−must place, in the relevant source files, a statement of the
400−additional terms that apply to those files, or a notice indicating
401−where to find the applicable terms.
402−
403− Additional terms, permissive or non-permissive, may be stated in the
404−form of a separately written license, or stated as exceptions;
405−the above requirements apply either way.
406−
407− 8. Termination.
408−
409− You may not propagate or modify a covered work except as expressly
410−provided under this License. Any attempt otherwise to propagate or
411−modify it is void, and will automatically terminate your rights under
412−this License (including any patent licenses granted under the third
413−paragraph of section 11).
414−
415− However, if you cease all violation of this License, then your
416−license from a particular copyright holder is reinstated (a)
417−provisionally, unless and until the copyright holder explicitly and
418−finally terminates your license, and (b) permanently, if the copyright
419−holder fails to notify you of the violation by some reasonable means
420−prior to 60 days after the cessation.
421−
422− Moreover, your license from a particular copyright holder is
423−reinstated permanently if the copyright holder notifies you of the
424−violation by some reasonable means, this is the first time you have
425−received notice of violation of this License (for any work) from that
426−copyright holder, and you cure the violation prior to 30 days after
427−your receipt of the notice.
428−
429− Termination of your rights under this section does not terminate the
430−licenses of parties who have received copies or rights from you under
431−this License. If your rights have been terminated and not permanently
432−reinstated, you do not qualify to receive new licenses for the same
433−material under section 10.
434−
435− 9. Acceptance Not Required for Having Copies.
436−
437− You are not required to accept this License in order to receive or
438−run a copy of the Program. Ancillary propagation of a covered work
439−occurring solely as a consequence of using peer-to-peer transmission
440−to receive a copy likewise does not require acceptance. However,
441−nothing other than this License grants you permission to propagate or
442−modify any covered work. These actions infringe copyright if you do
443−not accept this License. Therefore, by modifying or propagating a
444−covered work, you indicate your acceptance of this License to do so.
445−
446− 10. Automatic Licensing of Downstream Recipients.
447−
448− Each time you convey a covered work, the recipient automatically
449−receives a license from the original licensors, to run, modify and
450−propagate that work, subject to this License. You are not responsible
451−for enforcing compliance by third parties with this License.
452−
453− An "entity transaction" is a transaction transferring control of an
454−organization, or substantially all assets of one, or subdividing an
455−organization, or merging organizations. If propagation of a covered
456−work results from an entity transaction, each party to that
457−transaction who receives a copy of the work also receives whatever
458−licenses to the work the party's predecessor in interest had or could
459−give under the previous paragraph, plus a right to possession of the
460−Corresponding Source of the work from the predecessor in interest, if
461−the predecessor has it or can get it with reasonable efforts.
462−
463− You may not impose any further restrictions on the exercise of the
464−rights granted or affirmed under this License. For example, you may
465−not impose a license fee, royalty, or other charge for exercise of
466−rights granted under this License, and you may not initiate litigation
467−(including a cross-claim or counterclaim in a lawsuit) alleging that
468−any patent claim is infringed by making, using, selling, offering for
469−sale, or importing the Program or any portion of it.
470−
471− 11. Patents.
472−
473− A "contributor" is a copyright holder who authorizes use under this
474−License of the Program or a work on which the Program is based. The
475−work thus licensed is called the contributor's "contributor version".
476−
477− A contributor's "essential patent claims" are all patent claims
478−owned or controlled by the contributor, whether already acquired or
479−hereafter acquired, that would be infringed by some manner, permitted
480−by this License, of making, using, or selling its contributor version,
481−but do not include claims that would be infringed only as a
482−consequence of further modification of the contributor version. For
483−purposes of this definition, "control" includes the right to grant
484−patent sublicenses in a manner consistent with the requirements of
485−this License.
486−
487− Each contributor grants you a non-exclusive, worldwide, royalty-free
488−patent license under the contributor's essential patent claims, to
489−make, use, sell, offer for sale, import and otherwise run, modify and
490−propagate the contents of its contributor version.
491−
492− In the following three paragraphs, a "patent license" is any express
493−agreement or commitment, however denominated, not to enforce a patent
494−(such as an express permission to practice a patent or covenant not to
495−sue for patent infringement). To "grant" such a patent license to a
496−party means to make such an agreement or commitment not to enforce a
497−patent against the party.
498−
499− If you convey a covered work, knowingly relying on a patent license,
500−and the Corresponding Source of the work is not available for anyone
501−to copy, free of charge and under the terms of this License, through a
502−publicly available network server or other readily accessible means,
503−then you must either (1) cause the Corresponding Source to be so
504−available, or (2) arrange to deprive yourself of the benefit of the
505−patent license for this particular work, or (3) arrange, in a manner
506−consistent with the requirements of this License, to extend the patent
507−license to downstream recipients. "Knowingly relying" means you have
508−actual knowledge that, but for the patent license, your conveying the
509−covered work in a country, or your recipient's use of the covered work
510−in a country, would infringe one or more identifiable patents in that
511−country that you have reason to believe are valid.
512−
513− If, pursuant to or in connection with a single transaction or
514−arrangement, you convey, or propagate by procuring conveyance of, a
515−covered work, and grant a patent license to some of the parties
516−receiving the covered work authorizing them to use, propagate, modify
517−or convey a specific copy of the covered work, then the patent license
518−you grant is automatically extended to all recipients of the covered
519−work and works based on it.
520−
521− A patent license is "discriminatory" if it does not include within
522−the scope of its coverage, prohibits the exercise of, or is
523−conditioned on the non-exercise of one or more of the rights that are
524−specifically granted under this License. You may not convey a covered
525−work if you are a party to an arrangement with a third party that is
526−in the business of distributing software, under which you make payment
527−to the third party based on the extent of your activity of conveying
528−the work, and under which the third party grants, to any of the
529−parties who would receive the covered work from you, a discriminatory
530−patent license (a) in connection with copies of the covered work
531−conveyed by you (or copies made from those copies), or (b) primarily
532−for and in connection with specific products or compilations that
533−contain the covered work, unless you entered into that arrangement,
534−or that patent license was granted, prior to 28 March 2007.
535−
536− Nothing in this License shall be construed as excluding or limiting
537−any implied license or other defenses to infringement that may
538−otherwise be available to you under applicable patent law.
539−
540− 12. No Surrender of Others' Freedom.
541−
542− If conditions are imposed on you (whether by court order, agreement or
543−otherwise) that contradict the conditions of this License, they do not
544−excuse you from the conditions of this License. If you cannot convey a
545−covered work so as to satisfy simultaneously your obligations under this
546−License and any other pertinent obligations, then as a consequence you may
547−not convey it at all. For example, if you agree to terms that obligate you
548−to collect a royalty for further conveying from those to whom you convey
549−the Program, the only way you could satisfy both those terms and this
550−License would be to refrain entirely from conveying the Program.
551−
552− 13. Use with the GNU Affero General Public License.
553−
554− Notwithstanding any other provision of this License, you have
555−permission to link or combine any covered work with a work licensed
556−under version 3 of the GNU Affero General Public License into a single
557−combined work, and to convey the resulting work. The terms of this
558−License will continue to apply to the part which is the covered work,
559−but the special requirements of the GNU Affero General Public License,
560−section 13, concerning interaction through a network will apply to the
561−combination as such.
562−
563− 14. Revised Versions of this License.
564−
565− The Free Software Foundation may publish revised and/or new versions of
566−the GNU General Public License from time to time. Such new versions will
567−be similar in spirit to the present version, but may differ in detail to
568−address new problems or concerns.
569−
570− Each version is given a distinguishing version number. If the
571−Program specifies that a certain numbered version of the GNU General
572−Public License "or any later version" applies to it, you have the
573−option of following the terms and conditions either of that numbered
574−version or of any later version published by the Free Software
575−Foundation. If the Program does not specify a version number of the
576−GNU General Public License, you may choose any version ever published
577−by the Free Software Foundation.
578−
579− If the Program specifies that a proxy can decide which future
580−versions of the GNU General Public License can be used, that proxy's
581−public statement of acceptance of a version permanently authorizes you
582−to choose that version for the Program.
583−
584− Later license versions may give you additional or different
585−permissions. However, no additional obligations are imposed on any
586−author or copyright holder as a result of your choosing to follow a
587−later version.
588−
589− 15. Disclaimer of Warranty.
590−
591− THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592−APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593−HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594−OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595−THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596−PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597−IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598−ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599−
600− 16. Limitation of Liability.
601−
602− IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603−WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604−THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605−GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606−USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607−DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608−PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609−EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610−SUCH DAMAGES.
611−
612− 17. Interpretation of Sections 15 and 16.
613−
614− If the disclaimer of warranty and limitation of liability provided
615−above cannot be given local legal effect according to their terms,
616−reviewing courts shall apply local law that most closely approximates
617−an absolute waiver of all civil liability in connection with the
618−Program, unless a warranty or assumption of liability accompanies a
619−copy of the Program in return for a fee.
620−
621− END OF TERMS AND CONDITIONS
622−
623− How to Apply These Terms to Your New Programs
624−
625− If you develop a new program, and you want it to be of the greatest
626−possible use to the public, the best way to achieve this is to make it
627−free software which everyone can redistribute and change under these terms.
628−
629− To do so, attach the following notices to the program. It is safest
630−to attach them to the start of each source file to most effectively
631−state the exclusion of warranty; and each file should have at least
632−the "copyright" line and a pointer to where the full notice is found.
633−
634− {one line to give the program's name and a brief idea of what it does.}
635− Copyright (C) {year} {name of author}
636−
637− This program is free software: you can redistribute it and/or modify
638− it under the terms of the GNU General Public License as published by
639− the Free Software Foundation, either version 3 of the License, or
640− (at your option) any later version.
641−
642− This program is distributed in the hope that it will be useful,
643− but WITHOUT ANY WARRANTY; without even the implied warranty of
644− MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645− GNU General Public License for more details.
646−
647− You should have received a copy of the GNU General Public License
648− along with this program. If not, see <http://www.gnu.org/licenses/>.
649−
650−Also add information on how to contact you by electronic and paper mail.
651−
652− If the program does terminal interaction, make it output a short
653−notice like this when it starts in an interactive mode:
654−
655− {project} Copyright (C) {year} {fullname}
656− This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657− This is free software, and you are welcome to redistribute it
658− under certain conditions; type `show c' for details.
659−
660−The hypothetical commands `show w' and `show c' should show the appropriate
661−parts of the General Public License. Of course, your program's commands
662−might be different; for a GUI interface, you would use an "about box".
663−
664− You should also get your employer (if you work as a programmer) or school,
665−if any, to sign a "copyright disclaimer" for the program, if necessary.
666−For more information on this, and how to apply and follow the GNU GPL, see
667−<http://www.gnu.org/licenses/>.
668−
669− The GNU General Public License does not permit incorporating your program
670−into proprietary programs. If your program is a subroutine library, you
671−may consider it more useful to permit linking proprietary applications with
672−the library. If this is what you want to do, use the GNU Lesser General
673−Public License instead of this License. But first, please read
674−<http://www.gnu.org/philosophy/why-not-lgpl.html>.
1+Source code in this repository is covered by one of two licenses: (i) the
2+GNU General Public License (GPL) v3.0 (ii) the Bitwarden License v1.0. The
3+default license throughout the repository is GPL v3.0 unless the header
4+specifies another license. Bitwarden Licensed code is found only in the
5+/bitwarden_license directory.
6+
7+GPL v3.0:
8+https://github.com/bitwarden/web/blob/master/LICENSE_GPL.txt
9+
10+Bitwarden License v1.0:
11+https://github.com/bitwarden/web/blob/master/LICENSE_BITWARDEN.txt
12+
13+No grant of any rights in the trademarks, service marks, or logos of Bitwarden is
14+made (except as may be necessary to comply with the notice requirements as
15+applicable), and use of any Bitwarden trademarks must comply with Bitwarden
16+Trademark Guidelines
17+<https://github.com/bitwarden/server/blob/master/TRADEMARK_GUIDELINES.md>.
LICENSE_BITWARDEN.txtnew file+182
@@ -0,0 +1,182 @@
1+BITWARDEN LICENSE AGREEMENT
2+Version 1, 4 September 2020
3+
4+PLEASE CAREFULLY READ THIS BITWARDEN LICENSE AGREEMENT ("AGREEMENT"). THIS
5+AGREEMENT CONSTITUTES A LEGALLY BINDING AGREEMENT BETWEEN YOU AND BITWARDEN,
6+INC. ("BITWARDEN") AND GOVERNS YOUR USE OF THE COMMERCIAL MODULES (DEFINED
7+BELOW). BY COPYING OR USING THE COMMERCIAL MODULES, YOU AGREE TO THIS AGREEMENT.
8+IF YOU DO NOT AGREE WITH THIS AGREEMENT, YOU MAY NOT COPY OR USE THE COMMERCIAL
9+MODULES. IF YOU ARE COPYING OR USING THE COMMERCIAL MODULES ON BEHALF OF A LEGAL
10+ENTITY, YOU REPRESENT AND WARRANT THAT YOU HAVE AUTHORITY TO AGREE TO THIS
11+AGREEMENT ON BEHALF OF SUCH ENTITY. IF YOU DO NOT HAVE SUCH AUTHORITY, DO NOT
12+COPY OR USE THE COMMERCIAL MODULES IN ANY MANNER.
13+
14+This Agreement is entered into by and between Bitwarden and you, or the legal
15+entity on behalf of whom you are acting (as applicable, "You" or "Your").
16+
17+1. DEFINITIONS
18+
19+"Bitwarden Software" means the Bitwarden server software, libraries, and
20+Commercial Modules.
21+
22+"Commercial Modules" means the modules designed to work with and enhance the
23+Bitwarden Software to which this Agreement is linked, referenced, or appended.
24+
25+2. LICENSES, RESTRICTIONS AND THIRD PARTY CODE
26+
27+2.1 Commercial Module License. Subject to Your compliance with this Agreement,
28+Bitwarden hereby grants to You a limited, non-exclusive, non-transferable,
29+royalty-free license to use the Commercial Modules for the sole purposes of
30+internal development and internal testing, and only in a non-production
31+environment.
32+
33+2.2 Reservation of Rights. As between Bitwarden and You, Bitwarden owns all
34+right, title and interest in and to the Bitwarden Software, and except as
35+expressly set forth in Sections 2.1, no other license to the Bitwarden Software
36+is granted to You under this Agreement, by implication, estoppel, or otherwise.
37+
38+2.3 Restrictions. You agree not to: (i) except as expressly permitted in
39+Section 2.1, sell, rent, lease, distribute, sublicense, loan or otherwise
40+transfer the Commercial Modules to any third party; (ii) alter or remove any
41+trademarks, service mark, and logo included with the Commercial Modules, or
42+(iii) use the Commercial Modules to create a competing product or service.
43+Bitwarden is not obligated to provide maintenance and support services for the
44+Bitwarden Software licensed under this Agreement.
45+
46+2.4 Third Party Software. The Commercial Modules may contain or be provided
47+with third party open source libraries, components, utilities and other open
48+source software (collectively, "Open Source Software"). Notwithstanding anything
49+to the contrary herein, use of the Open Source Software will be subject to the
50+license terms and conditions applicable to such Open Source Software. To the
51+extent any condition of this Agreement conflicts with any license to the Open
52+Source Software, the Open Source Software license will govern with respect to
53+such Open Source Software only.
54+
55+2.5 This Agreement does not grant any rights in the trademarks, service marks, or
56+logos of any Contributor (except as may be necessary to comply with the notice
57+requirements in Section 2.3), and use of any Bitwarden trademarks must comply with
58+Bitwarden Trademark Guidelines
59+<https://github.com/bitwarden/server/blob/master/TRADEMARK_GUIDELINES.md>.
60+
61+3. TERMINATION
62+
63+3.1 Termination. This Agreement will automatically terminate upon notice from
64+Bitwarden, which notice may be by email or posting in the location where the
65+Commercial Modules are made available.
66+
67+3.2 Effect of Termination. Upon any termination of this Agreement, for any
68+reason, You will promptly cease use of the Commercial Modules and destroy any
69+copies thereof. For the avoidance of doubt, termination of this Agreement will
70+not affect Your right to Bitwarden Software, other than the Commercial Modules,
71+made available pursuant to an Open Source Software license.
72+
73+3.3 Survival. Sections 1, 2.2 -2.4, 3.2, 3.3, 4, and 5 will survive any
74+termination of this Agreement.
75+
76+4. DISCLAIMER AND LIMITATION OF LIABILITY
77+
78+4.1 Disclaimer of Warranties. TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE
79+LAW, THE BITWARDEN SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
80+EXPRESS OR IMPLIED REGARDING OR RELATING TO THE BITWARDEN SOFTWARE, INCLUDING
81+ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
82+TITLE, AND NON-INFRINGEMENT. FURTHER, BITWARDEN DOES NOT WARRANT RESULTS OF USE
83+OR THAT THE BITWARDEN SOFTWARE WILL BE ERROR FREE OR THAT THE USE OF THE
84+BITWARDEN SOFTWARE WILL BE UNINTERRUPTED.
85+
86+4.2 Limitation of Liability. IN NO EVENT WILL BITWARDEN OR ITS LICENSORS BE
87+LIABLE TO YOU OR ANY THIRD PARTY UNDER THIS AGREEMENT FOR (I) ANY AMOUNTS IN
88+EXCESS OF US $25 OR (II) FOR ANY SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OF
89+ANY KIND, INCLUDING FOR ANY LOSS OF PROFITS, LOSS OF USE, BUSINESS INTERRUPTION,
90+LOSS OF DATA, COST OF SUBSTITUTE GOODS OR SERVICES, WHETHER ALLEGED AS A BREACH
91+OF CONTRACT OR TORTIOUS CONDUCT, INCLUDING NEGLIGENCE, EVEN IF BITWARDEN HAS
92+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
93+
94+5. MISCELLANEOUS
95+
96+5.1 Assignment. You may not assign or otherwise transfer this Agreement or any
97+rights or obligations hereunder, in whole or in part, whether by operation of
98+law or otherwise, to any third party without Bitwarden's prior written consent.
99+Any purported transfer, assignment or delegation without such prior written
100+consent will be null and void and of no force or effect. Bitwarden may assign
101+this Agreement to any successor to its business or assets to which this
102+Agreement relates, whether by merger, sale of assets, sale of stock,
103+reorganization or otherwise. Subject to this Section 5.1, this Agreement will be
104+binding upon and inure to the benefit of the parties hereto, and their
105+respective successors and permitted assigns.
106+
107+5.2 Entire Agreement; Modification; Waiver. This Agreement represents the
108+entire agreement between the parties, and supersedes all prior agreements and
109+understandings, written or oral, with respect to the matters covered by this
110+Agreement, and is not intended to confer upon any third party any rights or
111+remedies hereunder. You acknowledge that You have not entered in this Agreement
112+based on any representations other than those contained herein. No modification
113+of or amendment to this Agreement, nor any waiver of any rights under this
114+Agreement, will be effective unless in writing and signed by both parties. The
115+waiver of one breach or default or any delay in exercising any rights will not
116+constitute a waiver of any subsequent breach or default.
117+
118+5.3 Governing Law. This Agreement will in all respects be governed by the laws
119+of the State of California without reference to its principles of conflicts of
120+laws. The parties hereby agree that all disputes arising out of this Agreement
121+will be subject to the exclusive jurisdiction of and venue in the federal and
122+state courts within Los Angeles County, California. You hereby consent to the
123+personal and exclusive jurisdiction and venue of these courts. The parties
124+hereby disclaim and exclude the application hereto of the United Nations
125+Convention on Contracts for the International Sale of Goods.
126+
127+5.4 Severability. If any provision of this Agreement is held invalid or
128+unenforceable under applicable law by a court of competent jurisdiction, it will
129+be replaced with the valid provision that most closely reflects the intent of
130+the parties and the remaining provisions of the Agreement will remain in full
131+force and effect.
132+
133+5.5 Relationship of the Parties. Nothing in this Agreement is to be construed
134+as creating an agency, partnership, or joint venture relationship between the
135+parties hereto. Neither party will have any right or authority to assume or
136+create any obligations or to make any representations or warranties on behalf of
137+any other party, whether express or implied, or to bind the other party in any
138+respect whatsoever.
139+
140+5.6 Notices. All notices permitted or required under this Agreement will be in
141+writing and will be deemed to have been given when delivered in person
142+(including by overnight courier), or three (3) business days after being mailed
143+by first class, registered or certified mail, postage prepaid, to the address of
144+the party specified in this Agreement or such other address as either party may
145+specify in writing.
146+
147+5.7 U.S. Government Restricted Rights. If Commercial Modules is being licensed
148+by the U.S. Government, the Commercial Modules is deemed to be "commercial
149+computer software" and "commercial computer documentation" developed exclusively
150+at private expense, and (a) if acquired by or on behalf of a civilian agency,
151+will be subject solely to the terms of this computer software license as
152+specified in 48 C.F.R. 12.212 of the Federal Acquisition Regulations and its
153+successors; and (b) if acquired by or on behalf of units of the Department of
154+Defense ("DOD") will be subject to the terms of this commercial computer
155+software license as specified in 48 C.F.R. 227.7202-2, DOD FAR Supplement and
156+its successors.
157+
158+5.8 Injunctive Relief. A breach or threatened breach by You of Section 2 may
159+cause irreparable harm for which damages at law may not provide adequate relief,
160+and therefore Bitwarden will be entitled to seek injunctive relief in any
161+applicable jurisdiction without being required to post a bond.
162+
163+5.9 Export Law Assurances. You understand that the Commercial Modules is
164+subject to export control laws and regulations. You may not download or
165+otherwise export or re-export the Commercial Modules or any underlying
166+information or technology except in full compliance with all applicable laws and
167+regulations, in particular, but without limitation, United States export control
168+laws. None of the Commercial Modules or any underlying information or technology
169+may be downloaded or otherwise exported or re- exported: (a) into (or to a
170+national or resident of) any country to which the United States has embargoed
171+goods; or (b) to anyone on the U.S. Treasury Department's list of specially
172+designated nationals or the U.S. Commerce Department's list of prohibited
173+countries or debarred or denied persons or entities. You hereby agree to the
174+foregoing and represents and warrants that You are not located in, under control
175+of, or a national or resident of any such country or on any such list.
176+
177+5.10 Construction. The titles and section headings used in this Agreement are
178+for ease of reference only and will not be used in the interpretation or
179+construction of this Agreement. No rule of construction resolving any ambiguity
180+in favor of the non-drafting party will be applied hereto. The word "including",
181+when used herein, is illustrative rather than exclusive and means "including,
182+without limitation."
LICENSE_GPL.txtnew file+674
@@ -0,0 +1,674 @@
1+ GNU GENERAL PUBLIC LICENSE
2+ Version 3, 29 June 2007
3+
4+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5+ Everyone is permitted to copy and distribute verbatim copies
6+ of this license document, but changing it is not allowed.
7+
8+ Preamble
9+
10+ The GNU General Public License is a free, copyleft license for
11+software and other kinds of works.
12+
13+ The licenses for most software and other practical works are designed
14+to take away your freedom to share and change the works. By contrast,
15+the GNU General Public License is intended to guarantee your freedom to
16+share and change all versions of a program--to make sure it remains free
17+software for all its users. We, the Free Software Foundation, use the
18+GNU General Public License for most of our software; it applies also to
19+any other work released this way by its authors. You can apply it to
20+your programs, too.
21+
22+ When we speak of free software, we are referring to freedom, not
23+price. Our General Public Licenses are designed to make sure that you
24+have the freedom to distribute copies of free software (and charge for
25+them if you wish), that you receive source code or can get it if you
26+want it, that you can change the software or use pieces of it in new
27+free programs, and that you know you can do these things.
28+
29+ To protect your rights, we need to prevent others from denying you
30+these rights or asking you to surrender the rights. Therefore, you have
31+certain responsibilities if you distribute copies of the software, or if
32+you modify it: responsibilities to respect the freedom of others.
33+
34+ For example, if you distribute copies of such a program, whether
35+gratis or for a fee, you must pass on to the recipients the same
36+freedoms that you received. You must make sure that they, too, receive
37+or can get the source code. And you must show them these terms so they
38+know their rights.
39+
40+ Developers that use the GNU GPL protect your rights with two steps:
41+(1) assert copyright on the software, and (2) offer you this License
42+giving you legal permission to copy, distribute and/or modify it.
43+
44+ For the developers' and authors' protection, the GPL clearly explains
45+that there is no warranty for this free software. For both users' and
46+authors' sake, the GPL requires that modified versions be marked as
47+changed, so that their problems will not be attributed erroneously to
48+authors of previous versions.
49+
50+ Some devices are designed to deny users access to install or run
51+modified versions of the software inside them, although the manufacturer
52+can do so. This is fundamentally incompatible with the aim of
53+protecting users' freedom to change the software. The systematic
54+pattern of such abuse occurs in the area of products for individuals to
55+use, which is precisely where it is most unacceptable. Therefore, we
56+have designed this version of the GPL to prohibit the practice for those
57+products. If such problems arise substantially in other domains, we
58+stand ready to extend this provision to those domains in future versions
59+of the GPL, as needed to protect the freedom of users.
60+
61+ Finally, every program is threatened constantly by software patents.
62+States should not allow patents to restrict development and use of
63+software on general-purpose computers, but in those that do, we wish to
64+avoid the special danger that patents applied to a free program could
65+make it effectively proprietary. To prevent this, the GPL assures that
66+patents cannot be used to render the program non-free.
67+
68+ The precise terms and conditions for copying, distribution and
69+modification follow.
70+
71+ TERMS AND CONDITIONS
72+
73+ 0. Definitions.
74+
75+ "This License" refers to version 3 of the GNU General Public License.
76+
77+ "Copyright" also means copyright-like laws that apply to other kinds of
78+works, such as semiconductor masks.
79+
80+ "The Program" refers to any copyrightable work licensed under this
81+License. Each licensee is addressed as "you". "Licensees" and
82+"recipients" may be individuals or organizations.
83+
84+ To "modify" a work means to copy from or adapt all or part of the work
85+in a fashion requiring copyright permission, other than the making of an
86+exact copy. The resulting work is called a "modified version" of the
87+earlier work or a work "based on" the earlier work.
88+
89+ A "covered work" means either the unmodified Program or a work based
90+on the Program.
91+
92+ To "propagate" a work means to do anything with it that, without
93+permission, would make you directly or secondarily liable for
94+infringement under applicable copyright law, except executing it on a
95+computer or modifying a private copy. Propagation includes copying,
96+distribution (with or without modification), making available to the
97+public, and in some countries other activities as well.
98+
99+ To "convey" a work means any kind of propagation that enables other
100+parties to make or receive copies. Mere interaction with a user through
101+a computer network, with no transfer of a copy, is not conveying.
102+
103+ An interactive user interface displays "Appropriate Legal Notices"
104+to the extent that it includes a convenient and prominently visible
105+feature that (1) displays an appropriate copyright notice, and (2)
106+tells the user that there is no warranty for the work (except to the
107+extent that warranties are provided), that licensees may convey the
108+work under this License, and how to view a copy of this License. If
109+the interface presents a list of user commands or options, such as a
110+menu, a prominent item in the list meets this criterion.
111+
112+ 1. Source Code.
113+
114+ The "source code" for a work means the preferred form of the work
115+for making modifications to it. "Object code" means any non-source
116+form of a work.
117+
118+ A "Standard Interface" means an interface that either is an official
119+standard defined by a recognized standards body, or, in the case of
120+interfaces specified for a particular programming language, one that
121+is widely used among developers working in that language.
122+
123+ The "System Libraries" of an executable work include anything, other
124+than the work as a whole, that (a) is included in the normal form of
125+packaging a Major Component, but which is not part of that Major
126+Component, and (b) serves only to enable use of the work with that
127+Major Component, or to implement a Standard Interface for which an
128+implementation is available to the public in source code form. A
129+"Major Component", in this context, means a major essential component
130+(kernel, window system, and so on) of the specific operating system
131+(if any) on which the executable work runs, or a compiler used to
132+produce the work, or an object code interpreter used to run it.
133+
134+ The "Corresponding Source" for a work in object code form means all
135+the source code needed to generate, install, and (for an executable
136+work) run the object code and to modify the work, including scripts to
137+control those activities. However, it does not include the work's
138+System Libraries, or general-purpose tools or generally available free
139+programs which are used unmodified in performing those activities but
140+which are not part of the work. For example, Corresponding Source
141+includes interface definition files associated with source files for
142+the work, and the source code for shared libraries and dynamically
143+linked subprograms that the work is specifically designed to require,
144+such as by intimate data communication or control flow between those
145+subprograms and other parts of the work.
146+
147+ The Corresponding Source need not include anything that users
148+can regenerate automatically from other parts of the Corresponding
149+Source.
150+
151+ The Corresponding Source for a work in source code form is that
152+same work.
153+
154+ 2. Basic Permissions.
155+
156+ All rights granted under this License are granted for the term of
157+copyright on the Program, and are irrevocable provided the stated
158+conditions are met. This License explicitly affirms your unlimited
159+permission to run the unmodified Program. The output from running a
160+covered work is covered by this License only if the output, given its
161+content, constitutes a covered work. This License acknowledges your
162+rights of fair use or other equivalent, as provided by copyright law.
163+
164+ You may make, run and propagate covered works that you do not
165+convey, without conditions so long as your license otherwise remains
166+in force. You may convey covered works to others for the sole purpose
167+of having them make modifications exclusively for you, or provide you
168+with facilities for running those works, provided that you comply with
169+the terms of this License in conveying all material for which you do
170+not control copyright. Those thus making or running the covered works
171+for you must do so exclusively on your behalf, under your direction
172+and control, on terms that prohibit them from making any copies of
173+your copyrighted material outside their relationship with you.
174+
175+ Conveying under any other circumstances is permitted solely under
176+the conditions stated below. Sublicensing is not allowed; section 10
177+makes it unnecessary.
178+
179+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180+
181+ No covered work shall be deemed part of an effective technological
182+measure under any applicable law fulfilling obligations under article
183+11 of the WIPO copyright treaty adopted on 20 December 1996, or
184+similar laws prohibiting or restricting circumvention of such
185+measures.
186+
187+ When you convey a covered work, you waive any legal power to forbid
188+circumvention of technological measures to the extent such circumvention
189+is effected by exercising rights under this License with respect to
190+the covered work, and you disclaim any intention to limit operation or
191+modification of the work as a means of enforcing, against the work's
192+users, your or third parties' legal rights to forbid circumvention of
193+technological measures.
194+
195+ 4. Conveying Verbatim Copies.
196+
197+ You may convey verbatim copies of the Program's source code as you
198+receive it, in any medium, provided that you conspicuously and
199+appropriately publish on each copy an appropriate copyright notice;
200+keep intact all notices stating that this License and any
201+non-permissive terms added in accord with section 7 apply to the code;
202+keep intact all notices of the absence of any warranty; and give all
203+recipients a copy of this License along with the Program.
204+
205+ You may charge any price or no price for each copy that you convey,
206+and you may offer support or warranty protection for a fee.
207+
208+ 5. Conveying Modified Source Versions.
209+
210+ You may convey a work based on the Program, or the modifications to
211+produce it from the Program, in the form of source code under the
212+terms of section 4, provided that you also meet all of these conditions:
213+
214+ a) The work must carry prominent notices stating that you modified
215+ it, and giving a relevant date.
216+
217+ b) The work must carry prominent notices stating that it is
218+ released under this License and any conditions added under section
219+ 7. This requirement modifies the requirement in section 4 to
220+ "keep intact all notices".
221+
222+ c) You must license the entire work, as a whole, under this
223+ License to anyone who comes into possession of a copy. This
224+ License will therefore apply, along with any applicable section 7
225+ additional terms, to the whole of the work, and all its parts,
226+ regardless of how they are packaged. This License gives no
227+ permission to license the work in any other way, but it does not
228+ invalidate such permission if you have separately received it.
229+
230+ d) If the work has interactive user interfaces, each must display
231+ Appropriate Legal Notices; however, if the Program has interactive
232+ interfaces that do not display Appropriate Legal Notices, your
233+ work need not make them do so.
234+
235+ A compilation of a covered work with other separate and independent
236+works, which are not by their nature extensions of the covered work,
237+and which are not combined with it such as to form a larger program,
238+in or on a volume of a storage or distribution medium, is called an
239+"aggregate" if the compilation and its resulting copyright are not
240+used to limit the access or legal rights of the compilation's users
241+beyond what the individual works permit. Inclusion of a covered work
242+in an aggregate does not cause this License to apply to the other
243+parts of the aggregate.
244+
245+ 6. Conveying Non-Source Forms.
246+
247+ You may convey a covered work in object code form under the terms
248+of sections 4 and 5, provided that you also convey the
249+machine-readable Corresponding Source under the terms of this License,
250+in one of these ways:
251+
252+ a) Convey the object code in, or embodied in, a physical product
253+ (including a physical distribution medium), accompanied by the
254+ Corresponding Source fixed on a durable physical medium
255+ customarily used for software interchange.
256+
257+ b) Convey the object code in, or embodied in, a physical product
258+ (including a physical distribution medium), accompanied by a
259+ written offer, valid for at least three years and valid for as
260+ long as you offer spare parts or customer support for that product
261+ model, to give anyone who possesses the object code either (1) a
262+ copy of the Corresponding Source for all the software in the
263+ product that is covered by this License, on a durable physical
264+ medium customarily used for software interchange, for a price no
265+ more than your reasonable cost of physically performing this
266+ conveying of source, or (2) access to copy the
267+ Corresponding Source from a network server at no charge.
268+
269+ c) Convey individual copies of the object code with a copy of the
270+ written offer to provide the Corresponding Source. This
271+ alternative is allowed only occasionally and noncommercially, and
272+ only if you received the object code with such an offer, in accord
273+ with subsection 6b.
274+
275+ d) Convey the object code by offering access from a designated
276+ place (gratis or for a charge), and offer equivalent access to the
277+ Corresponding Source in the same way through the same place at no
278+ further charge. You need not require recipients to copy the
279+ Corresponding Source along with the object code. If the place to
280+ copy the object code is a network server, the Corresponding Source
281+ may be on a different server (operated by you or a third party)
282+ that supports equivalent copying facilities, provided you maintain
283+ clear directions next to the object code saying where to find the
284+ Corresponding Source. Regardless of what server hosts the
285+ Corresponding Source, you remain obligated to ensure that it is
286+ available for as long as needed to satisfy these requirements.
287+
288+ e) Convey the object code using peer-to-peer transmission, provided
289+ you inform other peers where the object code and Corresponding
290+ Source of the work are being offered to the general public at no
291+ charge under subsection 6d.
292+
293+ A separable portion of the object code, whose source code is excluded
294+from the Corresponding Source as a System Library, need not be
295+included in conveying the object code work.
296+
297+ A "User Product" is either (1) a "consumer product", which means any
298+tangible personal property which is normally used for personal, family,
299+or household purposes, or (2) anything designed or sold for incorporation
300+into a dwelling. In determining whether a product is a consumer product,
301+doubtful cases shall be resolved in favor of coverage. For a particular
302+product received by a particular user, "normally used" refers to a
303+typical or common use of that class of product, regardless of the status
304+of the particular user or of the way in which the particular user
305+actually uses, or expects or is expected to use, the product. A product
306+is a consumer product regardless of whether the product has substantial
307+commercial, industrial or non-consumer uses, unless such uses represent
308+the only significant mode of use of the product.
309+
310+ "Installation Information" for a User Product means any methods,
311+procedures, authorization keys, or other information required to install
312+and execute modified versions of a covered work in that User Product from
313+a modified version of its Corresponding Source. The information must
314+suffice to ensure that the continued functioning of the modified object
315+code is in no case prevented or interfered with solely because
316+modification has been made.
317+
318+ If you convey an object code work under this section in, or with, or
319+specifically for use in, a User Product, and the conveying occurs as
320+part of a transaction in which the right of possession and use of the
321+User Product is transferred to the recipient in perpetuity or for a
322+fixed term (regardless of how the transaction is characterized), the
323+Corresponding Source conveyed under this section must be accompanied
324+by the Installation Information. But this requirement does not apply
325+if neither you nor any third party retains the ability to install
326+modified object code on the User Product (for example, the work has
327+been installed in ROM).
328+
329+ The requirement to provide Installation Information does not include a
330+requirement to continue to provide support service, warranty, or updates
331+for a work that has been modified or installed by the recipient, or for
332+the User Product in which it has been modified or installed. Access to a
333+network may be denied when the modification itself materially and
334+adversely affects the operation of the network or violates the rules and
335+protocols for communication across the network.
336+
337+ Corresponding Source conveyed, and Installation Information provided,
338+in accord with this section must be in a format that is publicly
339+documented (and with an implementation available to the public in
340+source code form), and must require no special password or key for
341+unpacking, reading or copying.
342+
343+ 7. Additional Terms.
344+
345+ "Additional permissions" are terms that supplement the terms of this
346+License by making exceptions from one or more of its conditions.
347+Additional permissions that are applicable to the entire Program shall
348+be treated as though they were included in this License, to the extent
349+that they are valid under applicable law. If additional permissions
350+apply only to part of the Program, that part may be used separately
351+under those permissions, but the entire Program remains governed by
352+this License without regard to the additional permissions.
353+
354+ When you convey a copy of a covered work, you may at your option
355+remove any additional permissions from that copy, or from any part of
356+it. (Additional permissions may be written to require their own
357+removal in certain cases when you modify the work.) You may place
358+additional permissions on material, added by you to a covered work,
359+for which you have or can give appropriate copyright permission.
360+
361+ Notwithstanding any other provision of this License, for material you
362+add to a covered work, you may (if authorized by the copyright holders of
363+that material) supplement the terms of this License with terms:
364+
365+ a) Disclaiming warranty or limiting liability differently from the
366+ terms of sections 15 and 16 of this License; or
367+
368+ b) Requiring preservation of specified reasonable legal notices or
369+ author attributions in that material or in the Appropriate Legal
370+ Notices displayed by works containing it; or
371+
372+ c) Prohibiting misrepresentation of the origin of that material, or
373+ requiring that modified versions of such material be marked in
374+ reasonable ways as different from the original version; or
375+
376+ d) Limiting the use for publicity purposes of names of licensors or
377+ authors of the material; or
378+
379+ e) Declining to grant rights under trademark law for use of some
380+ trade names, trademarks, or service marks; or
381+
382+ f) Requiring indemnification of licensors and authors of that
383+ material by anyone who conveys the material (or modified versions of
384+ it) with contractual assumptions of liability to the recipient, for
385+ any liability that these contractual assumptions directly impose on
386+ those licensors and authors.
387+
388+ All other non-permissive additional terms are considered "further
389+restrictions" within the meaning of section 10. If the Program as you
390+received it, or any part of it, contains a notice stating that it is
391+governed by this License along with a term that is a further
392+restriction, you may remove that term. If a license document contains
393+a further restriction but permits relicensing or conveying under this
394+License, you may add to a covered work material governed by the terms
395+of that license document, provided that the further restriction does
396+not survive such relicensing or conveying.
397+
398+ If you add terms to a covered work in accord with this section, you
399+must place, in the relevant source files, a statement of the
400+additional terms that apply to those files, or a notice indicating
401+where to find the applicable terms.
402+
403+ Additional terms, permissive or non-permissive, may be stated in the
404+form of a separately written license, or stated as exceptions;
405+the above requirements apply either way.
406+
407+ 8. Termination.
408+
409+ You may not propagate or modify a covered work except as expressly
410+provided under this License. Any attempt otherwise to propagate or
411+modify it is void, and will automatically terminate your rights under
412+this License (including any patent licenses granted under the third
413+paragraph of section 11).
414+
415+ However, if you cease all violation of this License, then your
416+license from a particular copyright holder is reinstated (a)
417+provisionally, unless and until the copyright holder explicitly and
418+finally terminates your license, and (b) permanently, if the copyright
419+holder fails to notify you of the violation by some reasonable means
420+prior to 60 days after the cessation.
421+
422+ Moreover, your license from a particular copyright holder is
423+reinstated permanently if the copyright holder notifies you of the
424+violation by some reasonable means, this is the first time you have
425+received notice of violation of this License (for any work) from that
426+copyright holder, and you cure the violation prior to 30 days after
427+your receipt of the notice.
428+
429+ Termination of your rights under this section does not terminate the
430+licenses of parties who have received copies or rights from you under
431+this License. If your rights have been terminated and not permanently
432+reinstated, you do not qualify to receive new licenses for the same
433+material under section 10.
434+
435+ 9. Acceptance Not Required for Having Copies.
436+
437+ You are not required to accept this License in order to receive or
438+run a copy of the Program. Ancillary propagation of a covered work
439+occurring solely as a consequence of using peer-to-peer transmission
440+to receive a copy likewise does not require acceptance. However,
441+nothing other than this License grants you permission to propagate or
442+modify any covered work. These actions infringe copyright if you do
443+not accept this License. Therefore, by modifying or propagating a
444+covered work, you indicate your acceptance of this License to do so.
445+
446+ 10. Automatic Licensing of Downstream Recipients.
447+
448+ Each time you convey a covered work, the recipient automatically
449+receives a license from the original licensors, to run, modify and
450+propagate that work, subject to this License. You are not responsible
451+for enforcing compliance by third parties with this License.
452+
453+ An "entity transaction" is a transaction transferring control of an
454+organization, or substantially all assets of one, or subdividing an
455+organization, or merging organizations. If propagation of a covered
456+work results from an entity transaction, each party to that
457+transaction who receives a copy of the work also receives whatever
458+licenses to the work the party's predecessor in interest had or could
459+give under the previous paragraph, plus a right to possession of the
460+Corresponding Source of the work from the predecessor in interest, if
461+the predecessor has it or can get it with reasonable efforts.
462+
463+ You may not impose any further restrictions on the exercise of the
464+rights granted or affirmed under this License. For example, you may
465+not impose a license fee, royalty, or other charge for exercise of
466+rights granted under this License, and you may not initiate litigation
467+(including a cross-claim or counterclaim in a lawsuit) alleging that
468+any patent claim is infringed by making, using, selling, offering for
469+sale, or importing the Program or any portion of it.
470+
471+ 11. Patents.
472+
473+ A "contributor" is a copyright holder who authorizes use under this
474+License of the Program or a work on which the Program is based. The
475+work thus licensed is called the contributor's "contributor version".
476+
477+ A contributor's "essential patent claims" are all patent claims
478+owned or controlled by the contributor, whether already acquired or
479+hereafter acquired, that would be infringed by some manner, permitted
480+by this License, of making, using, or selling its contributor version,
481+but do not include claims that would be infringed only as a
482+consequence of further modification of the contributor version. For
483+purposes of this definition, "control" includes the right to grant
484+patent sublicenses in a manner consistent with the requirements of
485+this License.
486+
487+ Each contributor grants you a non-exclusive, worldwide, royalty-free
488+patent license under the contributor's essential patent claims, to
489+make, use, sell, offer for sale, import and otherwise run, modify and
490+propagate the contents of its contributor version.
491+
492+ In the following three paragraphs, a "patent license" is any express
493+agreement or commitment, however denominated, not to enforce a patent
494+(such as an express permission to practice a patent or covenant not to
495+sue for patent infringement). To "grant" such a patent license to a
496+party means to make such an agreement or commitment not to enforce a
497+patent against the party.
498+
499+ If you convey a covered work, knowingly relying on a patent license,
500+and the Corresponding Source of the work is not available for anyone
501+to copy, free of charge and under the terms of this License, through a
502+publicly available network server or other readily accessible means,
503+then you must either (1) cause the Corresponding Source to be so
504+available, or (2) arrange to deprive yourself of the benefit of the
505+patent license for this particular work, or (3) arrange, in a manner
506+consistent with the requirements of this License, to extend the patent
507+license to downstream recipients. "Knowingly relying" means you have
508+actual knowledge that, but for the patent license, your conveying the
509+covered work in a country, or your recipient's use of the covered work
510+in a country, would infringe one or more identifiable patents in that
511+country that you have reason to believe are valid.
512+
513+ If, pursuant to or in connection with a single transaction or
514+arrangement, you convey, or propagate by procuring conveyance of, a
515+covered work, and grant a patent license to some of the parties
516+receiving the covered work authorizing them to use, propagate, modify
517+or convey a specific copy of the covered work, then the patent license
518+you grant is automatically extended to all recipients of the covered
519+work and works based on it.
520+
521+ A patent license is "discriminatory" if it does not include within
522+the scope of its coverage, prohibits the exercise of, or is
523+conditioned on the non-exercise of one or more of the rights that are
524+specifically granted under this License. You may not convey a covered
525+work if you are a party to an arrangement with a third party that is
526+in the business of distributing software, under which you make payment
527+to the third party based on the extent of your activity of conveying
528+the work, and under which the third party grants, to any of the
529+parties who would receive the covered work from you, a discriminatory
530+patent license (a) in connection with copies of the covered work
531+conveyed by you (or copies made from those copies), or (b) primarily
532+for and in connection with specific products or compilations that
533+contain the covered work, unless you entered into that arrangement,
534+or that patent license was granted, prior to 28 March 2007.
535+
536+ Nothing in this License shall be construed as excluding or limiting
537+any implied license or other defenses to infringement that may
538+otherwise be available to you under applicable patent law.
539+
540+ 12. No Surrender of Others' Freedom.
541+
542+ If conditions are imposed on you (whether by court order, agreement or
543+otherwise) that contradict the conditions of this License, they do not
544+excuse you from the conditions of this License. If you cannot convey a
545+covered work so as to satisfy simultaneously your obligations under this
546+License and any other pertinent obligations, then as a consequence you may
547+not convey it at all. For example, if you agree to terms that obligate you
548+to collect a royalty for further conveying from those to whom you convey
549+the Program, the only way you could satisfy both those terms and this
550+License would be to refrain entirely from conveying the Program.
551+
552+ 13. Use with the GNU Affero General Public License.
553+
554+ Notwithstanding any other provision of this License, you have
555+permission to link or combine any covered work with a work licensed
556+under version 3 of the GNU Affero General Public License into a single
557+combined work, and to convey the resulting work. The terms of this
558+License will continue to apply to the part which is the covered work,
559+but the special requirements of the GNU Affero General Public License,
560+section 13, concerning interaction through a network will apply to the
561+combination as such.
562+
563+ 14. Revised Versions of this License.
564+
565+ The Free Software Foundation may publish revised and/or new versions of
566+the GNU General Public License from time to time. Such new versions will
567+be similar in spirit to the present version, but may differ in detail to
568+address new problems or concerns.
569+
570+ Each version is given a distinguishing version number. If the
571+Program specifies that a certain numbered version of the GNU General
572+Public License "or any later version" applies to it, you have the
573+option of following the terms and conditions either of that numbered
574+version or of any later version published by the Free Software
575+Foundation. If the Program does not specify a version number of the
576+GNU General Public License, you may choose any version ever published
577+by the Free Software Foundation.
578+
579+ If the Program specifies that a proxy can decide which future
580+versions of the GNU General Public License can be used, that proxy's
581+public statement of acceptance of a version permanently authorizes you
582+to choose that version for the Program.
583+
584+ Later license versions may give you additional or different
585+permissions. However, no additional obligations are imposed on any
586+author or copyright holder as a result of your choosing to follow a
587+later version.
588+
589+ 15. Disclaimer of Warranty.
590+
591+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599+
600+ 16. Limitation of Liability.
601+
602+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610+SUCH DAMAGES.
611+
612+ 17. Interpretation of Sections 15 and 16.
613+
614+ If the disclaimer of warranty and limitation of liability provided
615+above cannot be given local legal effect according to their terms,
616+reviewing courts shall apply local law that most closely approximates
617+an absolute waiver of all civil liability in connection with the
618+Program, unless a warranty or assumption of liability accompanies a
619+copy of the Program in return for a fee.
620+
621+ END OF TERMS AND CONDITIONS
622+
623+ How to Apply These Terms to Your New Programs
624+
625+ If you develop a new program, and you want it to be of the greatest
626+possible use to the public, the best way to achieve this is to make it
627+free software which everyone can redistribute and change under these terms.
628+
629+ To do so, attach the following notices to the program. It is safest
630+to attach them to the start of each source file to most effectively
631+state the exclusion of warranty; and each file should have at least
632+the "copyright" line and a pointer to where the full notice is found.
633+
634+ {one line to give the program's name and a brief idea of what it does.}
635+ Copyright (C) {year} {name of author}
636+
637+ This program is free software: you can redistribute it and/or modify
638+ it under the terms of the GNU General Public License as published by
639+ the Free Software Foundation, either version 3 of the License, or
640+ (at your option) any later version.
641+
642+ This program is distributed in the hope that it will be useful,
643+ but WITHOUT ANY WARRANTY; without even the implied warranty of
644+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645+ GNU General Public License for more details.
646+
647+ You should have received a copy of the GNU General Public License
648+ along with this program. If not, see <http://www.gnu.org/licenses/>.
649+
650+Also add information on how to contact you by electronic and paper mail.
651+
652+ If the program does terminal interaction, make it output a short
653+notice like this when it starts in an interactive mode:
654+
655+ {project} Copyright (C) {year} {fullname}
656+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657+ This is free software, and you are welcome to redistribute it
658+ under certain conditions; type `show c' for details.
659+
660+The hypothetical commands `show w' and `show c' should show the appropriate
661+parts of the General Public License. Of course, your program's commands
662+might be different; for a GUI interface, you would use an "about box".
663+
664+ You should also get your employer (if you work as a programmer) or school,
665+if any, to sign a "copyright disclaimer" for the program, if necessary.
666+For more information on this, and how to apply and follow the GNU GPL, see
667+<http://www.gnu.org/licenses/>.
668+
669+ The GNU General Public License does not permit incorporating your program
670+into proprietary programs. If your program is a subroutine library, you
671+may consider it more useful to permit linking proprietary applications with
672+the library. If this is what you want to do, use the GNU Lesser General
673+Public License instead of this License. But first, please read
674+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
README.md+110−34
@@ -1,50 +1,126 @@
1−[](https://ci.appveyor.com/project/bitwarden/browser)
2−[](https://crowdin.com/project/bitwarden-browser)
3−[](https://gitter.im/bitwarden/Lobby)
1+<p align="center">
2+ <img src="https://raw.githubusercontent.com/bitwarden/brand/master/screenshots/apps-combo-logo.png" alt="Bitwarden" />
3+</p>
4+<p align="center">
5+ <a href="https://github.com/bitwarden/clients/actions/workflows/build-browser.yml?query=branch:master" target="_blank">
6+ <img src="https://github.com/bitwarden/clients/actions/workflows/build-browser.yml/badge.svg?branch=master" alt="Github Workflow browser build on master" />
7+ </a>
8+ <a href="https://github.com/bitwarden/clients/actions/workflows/build-desktop.yml?query=branch:master" target="_blank">
9+ <img src="https://github.com/bitwarden/clients/actions/workflows/build-desktop.yml/badge.svg?branch=master" alt="Github Workflow desktop build on master" />
10+ </a>
11+ <a href="https://gitter.im/bitwarden/Lobby" target="_blank">
12+ <img src="https://badges.gitter.im/bitwarden/Lobby.svg" alt="gitter chat" />
13+ </a>
14+</p>
415
5−# bitwarden Browser Extension
16+---
617
7−<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/3C4iKO0.png" width="64" height="64"></a>
8−<a href="https://addons.mozilla.org/firefox/addon/bitwarden-password-manager/" target="_blank"><img src="http://imgur.com/JXP9jir.png" width="64" height="64"></a>
9−<a href="https://www.microsoft.com/store/p/bitwarden-free-password-manager/9p6kxl0svnnl" target="_blank"><img src="https://imgur.com/RlmwPGO.png" width="64" height="64"></a>
10−<a href="https://addons.opera.com/extensions/details/bitwarden-free-password-manager/" target="_blank"><img src="http://imgur.com/nSJ9htU.png" width="64" height="64"></a>
11−<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/j8qsZ5q.png" width="64" height="64"></a>
12−<a href="https://brave.com/" target="_blank"><img src="https://imgur.com/bWzsEN8.png" width="64" height="64"></a>
13−<a href="https://addons.mozilla.org/firefox/addon/bitwarden-password-manager/" target="_blank"><img src="https://imgur.com/uhb8M86.png" width="64" height="64"></a>
18+# Bitwarden Client Applications
1419
15−The bitwarden browser extension is written using the Chrome Web Extension API and AngularJS.
20+This repository houses all Bitwarden client applications except the [Mobile application](https://github.com/bitwarden/mobile).
1621
17−
22+Please refer to the [Clients section](https://contributing.bitwarden.com/clients/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
1823
19−# Build/Run
24+## Related projects:
2025
21−**Requirements**
26+- [bitwarden/server](https://github.com/bitwarden/server): The core infrastructure backend (API, database, Docker, etc).
27+- [bitwarden/mobile](https://github.com/bitwarden/mobile): The mobile app vault (iOS and Android).
28+- [bitwarden/directory-connector](https://github.com/bitwarden/directory-connector): A tool for syncing a directory (AD, LDAP, Azure, G Suite, Okta) to an organization.
2229
23−- [Node.js](https://nodejs.org/en/)
24−- [Gulp](http://gulpjs.com/) (`npm install --global gulp-cli`)
25−- Chrome (preferred), Opera, or Firefox browser
30+# We're Hiring!
2631
27−By default the extension is targeting the production API. If you are running the [Core](https://github.com/bitwarden/core) API locally, you'll need to switch the extension to target your local instance. Open `src/services/api.service.ts` and set `this.baseUrl` and `this.identityBaseUrl` to your local API instance (ex. `http://localhost:5000`).
32+Interested in contributing in a big way? Consider joining our team! We're hiring for many positions. Please take a look at our [Careers page](https://bitwarden.com/careers/) to see what opportunities are currently open as well as what it's like to work at Bitwarden.
2833
29−Then run the following commands:
34+# Contribute
35+
36+Code contributions are welcome! Please commit any pull requests against the `master` branch. Learn more about how to contribute by reading the [Contributing Guidelines](https://contributing.bitwarden.com/contributing/). Check out the [Contributing Documentation](https://contributing.bitwarden.com/) for how to get started with your first contribution.
37+
38+Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the [`SECURITY.md`](SECURITY.md) file.
39+
40+## Migrate PRs from old repositories
41+
42+We recently migrated from individual client repositories. And some PRs were unfortunately left behind in the old repositories. Luckily it's fairly straightforward to sync them up again. Please follow all the instructions below in order to avoid most merge conflicts.
43+
44+### Desktop
3045
31−```bash
32−npm install
33−npm run dev:watch
3446```
47+# Merge master
48+git merge master
3549
36−You can now load the extension into your browser through the browser's extension tools page:
50+# Merge branch mono-repo-prep
51+git merge 28bc4113b9bbae4dba2b5af14d460764fce79acf
3752
38−- Chrome/Opera:
39− 1. Type `chrome://extensions` in your address bar to bring up the extensions page.
40− 2. Enable developer mode (checkbox)
41− 3. Click the "Load unpacked extension" button, navigate to the `build` folder of your local extension instance, and click "Ok".
42−- Firefox
43− 1. Type `about:debugging` in your address bar to bring up the add-ons page.
44− 2. Click the `Load Temporary Add-on` button, navigate to the `build/manifest.json` file, and "Open".
53+# Verify files are placed in apps/desktop
4554
46−# Contribute
55+# Add remote
56+git remote add clients git@github.com:bitwarden/clients.git
4757
48−Code contributions are welcome! Please commit any pull requests against the `master` branch. Learn more about how to contribute by reading the [`CONTRIBUTING.md`](CONTRIBUTING.md) file.
58+# Merge against clients master
59+git fetch clients
60+git merge clients/master
4961
50−Security audits and feedback are welcome. Please open an issue or email us privately if the report is sensitive in nature. You can read our security policy in the [`SECURITY.md`](SECURITY.md) file.
62+# Push to clients or your own fork
63+```
64+
65+### CLI
66+
67+```
68+# Merge master
69+git merge master
70+
71+# Merge branch mono-repo-prep
72+git merge 980429f4bdcb178d8d92d8202cbdacfaa45c917e
73+
74+# Verify files are placed in apps/cli
75+
76+# Add remote
77+git remote add clients git@github.com:bitwarden/clients.git
78+
79+# Merge against clients master
80+git fetch clients
81+git merge clients/master
82+
83+# Push to clients or your own fork
84+```
85+
86+### Web
87+
88+```
89+# Merge master
90+git merge master
91+
92+# Merge branch mono-repo-prep
93+git merge 02fe7159034b04d763a61fcf0200869e3209fa33
94+
95+# Verify files are placed in apps/web
96+
97+# Add remote
98+git remote add clients git@github.com:bitwarden/clients.git
99+
100+# Merge against clients master
101+git fetch clients
102+git merge clients/master
103+
104+# Push to clients or your own fork
105+```
106+
107+### Jslib
108+
109+```
110+# Merge master
111+git merge master
112+
113+# Merge branch mono-repo
114+git merge d7492e3cf320410e74ebd0e0675ab994e64bd01a
115+
116+# Verify files are placed in libs
117+
118+# Add remote
119+git remote add clients git@github.com:bitwarden/clients.git
120+
121+# Merge against clients master
122+git fetch clients
123+git merge clients/master
124+
125+# Push to clients or your own fork
126+```
SECURITY.md+12−36
@@ -1,45 +1,21 @@
1−bitwarden believes that working with security researchers across the globe is crucial to keeping our
2−users safe. If you believe you've found a security issue in our product or service, we encourage you to
3−notify us. We welcome working with you to resolve the issue promptly. Thanks in advance!
1+Bitwarden believes that working with security researchers across the globe is crucial to keeping our users safe. If you believe you've found a security issue in our product or service, we encourage you to please submit a report through our [HackerOne Program](https://hackerone.com/bitwarden/). We welcome working with you to resolve the issue promptly. Thanks in advance!
42
53# Disclosure Policy
64
7−- Let us know as soon as possible upon discovery of a potential security issue, and we'll make every
8− effort to quickly resolve the issue.
9−- Provide us a reasonable amount of time to resolve the issue before any disclosure to the public or a
10− third-party. We may publicly disclose the issue before resolving it, if appropriate.
11−- Make a good faith effort to avoid privacy violations, destruction of data, and interruption or
12− degradation of our service. Only interact with accounts you own or with explicit permission of the
13− account holder.
14−- If you would like to encrypt your report, please use the PGP key with long ID
15− `0xDE6887086F892325FEC04CC0D847525B6931381F` (available in the public keyserver pool).
16−
17−# In-scope
18−
19−- Security issues in any current release of bitwarden. This includes the web vault, browser extension,
20− and mobile apps (iOS and Android). Product downloads are available at https://bitwarden.com. Source
21− code is available at https://github.com/bitwarden.
22−
23−# Exclusions
24−
25−The following bug classes are out-of scope:
26−
27−- Bugs that are already reported on any of bitwarden's issue trackers (https://github.com/bitwarden),
28− or that we already know of. Note that some of our issue tracking is private.
29−- Issues in an upstream software dependency (ex: Xamarin, ASP.NET) which are already reported to the
30− upstream maintainer.
31−- Attacks requiring physical access to a user's device.
32−- Self-XSS
33−- Issues related to software or protocols not under bitwarden's control
34−- Vulnerabilities in outdated versions of bitwarden
35−- Missing security best practices that do not directly lead to a vulnerability
36−- Issues that do not have any impact on the general public
5+- Let us know as soon as possible upon discovery of a potential security issue, and we'll make every effort to quickly resolve the issue.
6+- Provide us a reasonable amount of time to resolve the issue before any disclosure to the public or a third-party. We may publicly disclose the issue before resolving it, if appropriate.
7+- Make a good faith effort to avoid privacy violations, destruction of data, and interruption or degradation of our service. Only interact with accounts you own or with explicit permission of the account holder.
8+- If you would like to encrypt your report, please use the PGP key with long ID `0xDE6887086F892325FEC04CC0D847525B6931381F` (available in the public keyserver pool).
379
3810While researching, we'd like to ask you to refrain from:
3911
4012- Denial of service
4113- Spamming
42−- Social engineering (including phishing) of bitwarden staff or contractors
43−- Any physical attempts against bitwarden property or data centers
14+- Social engineering (including phishing) of Bitwarden staff or contractors
15+- Any physical attempts against Bitwarden property or data centers
16+
17+# We want to help you!
18+
19+If you have something that you feel is close to exploitation, or if you'd like some information regarding the internal API, or generally have any questions regarding the app that would help in your efforts, please email us at https://bitwarden.com/contact and ask for that information. As stated above, Bitwarden wants to help you find issues, and is more than willing to help.
4420
45−Thank you for helping keep bitwarden and our users safe!
21+Thank you for helping keep Bitwarden and our users safe!
angular.jsonnew file+81
@@ -0,0 +1,81 @@
1+{
2+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3+ "version": 1,
4+ "newProjectRoot": "apps",
5+ "projects": {
6+ "components": {
7+ "projectType": "application",
8+ "schematics": {
9+ "@schematics/angular:application": {
10+ "strict": true
11+ }
12+ },
13+ "root": "./libs/components",
14+ "sourceRoot": "libs/components/src",
15+ "prefix": "components",
16+ "architect": {
17+ "build": {
18+ "builder": "@angular-devkit/build-angular:browser",
19+ "options": {
20+ "outputPath": "dist/components",
21+ "index": "libs/components/src/index.html",
22+ "main": "libs/components/src/main.ts",
23+ "polyfills": "libs/components/src/polyfills.ts",
24+ "tsConfig": "libs/components/tsconfig.app.json",
25+ "assets": ["libs/components/src/favicon.ico", "libs/components/src/assets"],
26+ "styles": ["libs/components/src/styles.scss", "libs/components/src/styles.css"],
27+ "stylePreprocessorOptions": {
28+ "includePaths": ["libs/components/src/styles"]
29+ },
30+ "scripts": []
31+ },
32+ "configurations": {
33+ "production": {
34+ "budgets": [
35+ {
36+ "type": "initial",
37+ "maximumWarning": "500kb",
38+ "maximumError": "1mb"
39+ },
40+ {
41+ "type": "anyComponentStyle",
42+ "maximumWarning": "2kb",
43+ "maximumError": "4kb"
44+ }
45+ ],
46+ "outputHashing": "all"
47+ },
48+ "development": {
49+ "buildOptimizer": false,
50+ "optimization": false,
51+ "vendorChunk": true,
52+ "extractLicenses": false,
53+ "sourceMap": true,
54+ "namedChunks": true
55+ }
56+ },
57+ "defaultConfiguration": "production"
58+ },
59+ "serve": {
60+ "builder": "@angular-devkit/build-angular:dev-server",
61+ "configurations": {
62+ "production": {
63+ "browserTarget": "components:build:production"
64+ },
65+ "development": {
66+ "browserTarget": "components:build:development"
67+ }
68+ },
69+ "defaultConfiguration": "development"
70+ },
71+ "extract-i18n": {
72+ "builder": "@angular-devkit/build-angular:extract-i18n",
73+ "options": {
74+ "browserTarget": "components:build"
75+ }
76+ }
77+ }
78+ }
79+ },
80+ "defaultProject": "components"
81+}
apps/browser/.gitignorenew file+7
@@ -0,0 +1,7 @@
1+# Safari
2+dist-safari
3+!src/safari/safari/app/popup/index.html
4+src/safari/safari/app/
5+build.safariextension
6+xcuserdata
7+*.hmap
apps/browser/.vscode/settings.jsonnew file+6
@@ -0,0 +1,6 @@
1+{
2+ "eslint.options": {
3+ "ignorePath": "${workspaceFolder}/../../../.eslintIgnore"
4+ },
5+ "prettier.ignorePath": "${workspaceFolder}/../../../.prettierignore"
6+}
apps/browser/README.mdnew file+22
@@ -0,0 +1,22 @@
1+[](https://github.com/bitwarden/clients/actions/workflows/build-browser.yml?query=branch:master)
2+[](https://crowdin.com/project/bitwarden-browser)
3+[](https://gitter.im/bitwarden/Lobby)
4+
5+# Bitwarden Browser Extension
6+
7+<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/3C4iKO0.png" width="64" height="64"></a>
8+<a href="https://addons.mozilla.org/firefox/addon/bitwarden-password-manager/" target="_blank"><img src="https://imgur.com/ihXsdDO.png" width="64" height="64"></a>
9+<a href="https://microsoftedge.microsoft.com/addons/detail/bitwarden-free-password/jbkfoedolllekgbhcbcoahefnbanhhlh" target="_blank"><img src="https://imgur.com/vMcaXaw.png" width="64" height="64"></a>
10+<a href="https://addons.opera.com/extensions/details/bitwarden-free-password-manager/" target="_blank"><img src="https://imgur.com/nSJ9htU.png" width="64" height="64"></a>
11+<a href="https://bitwarden.com/download/" target="_blank"><img src="https://imgur.com/ENbaWUu.png" width="64" height="64"></a>
12+<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/EuDp4vP.png" width="64" height="64"></a>
13+<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb" target="_blank"><img src="https://imgur.com/z8yjLZ2.png" width="64" height="64"></a>
14+<a href="https://addons.mozilla.org/firefox/addon/bitwarden-password-manager/" target="_blank"><img src="https://imgur.com/MQYBSrD.png" width="64" height="64"></a>
15+
16+The Bitwarden browser extension is written using the Web Extension API and Angular.
17+
18+
19+
20+## Documentation
21+
22+Please refer to the [Browser section](https://contributing.bitwarden.com/clients/browser/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
crowdin.yml → apps/browser/crowdin.ymlrenamed+11
@@ -1,17 +1,28 @@
1+project_id_env: CROWDIN_PROJECT_ID
2+api_token_env: CROWDIN_API_TOKEN
3+preserve_hierarchy: true
14files:
25 - source: /src/_locales/en/messages.json
6+ dest: /src/_locales/en/%original_file_name%
37 translation: /src/_locales/%two_letters_code%/%original_file_name%
8+ update_option: update_as_unapproved
49 languages_mapping:
510 two_letters_code:
611 pt-PT: pt_PT
712 pt-BR: pt_BR
813 zh-CN: zh_CN
914 zh-TW: zh_TW
15+ en-GB: en_GB
16+ en-IN: en_IN
1017 - source: /store/locales/en/copy.resx
18+ dest: /store/locales/en/%original_file_name%
1119 translation: /store/locales/%two_letters_code%/%original_file_name%
20+ update_option: update_as_unapproved
1221 languages_mapping:
1322 two_letters_code:
1423 pt-PT: pt_PT
1524 pt-BR: pt_BR
1625 zh-CN: zh_CN
1726 zh-TW: zh_TW
27+ en-GB: en_GB
28+ en-IN: en_IN
apps/browser/gulpfile.jsnew file+245
@@ -0,0 +1,245 @@
1+const child = require("child_process");
2+const fs = require("fs");
3+
4+const del = require("del");
5+const gulp = require("gulp");
6+const filter = require("gulp-filter");
7+const gulpif = require("gulp-if");
8+const jeditor = require("gulp-json-editor");
9+const replace = require("gulp-replace");
10+const zip = require("gulp-zip");
11+
12+const manifest = require("./src/manifest.json");
13+
14+const paths = {
15+ build: "./build/",
16+ dist: "./dist/",
17+ coverage: "./coverage/",
18+ node_modules: "./node_modules/",
19+ popupDir: "./src/popup/",
20+ cssDir: "./src/popup/css/",
21+ safari: "./src/safari/",
22+};
23+
24+const filters = {
25+ fonts: [
26+ "!build/popup/fonts/*",
27+ "build/popup/fonts/Open_Sans*.woff",
28+ "build/popup/fonts/bwi-font.woff2",
29+ "build/popup/fonts/bwi-font.woff",
30+ "build/popup/fonts/bwi-font.ttf",
31+ ],
32+ safari: ["!build/safari/**/*"],
33+};
34+
35+function buildString() {
36+ var build = "";
37+ if (process.env.BUILD_NUMBER && process.env.BUILD_NUMBER !== "") {
38+ build = `-${process.env.BUILD_NUMBER}`;
39+ }
40+ return build;
41+}
42+
43+function distFileName(browserName, ext) {
44+ return `dist-${browserName}${buildString()}.${ext}`;
45+}
46+
47+function dist(browserName, manifest) {
48+ return gulp
49+ .src(paths.build + "**/*")
50+ .pipe(filter(["**"].concat(filters.fonts).concat(filters.safari)))
51+ .pipe(gulpif("popup/index.html", replace("__BROWSER__", "browser_" + browserName)))
52+ .pipe(gulpif("manifest.json", jeditor(manifest)))
53+ .pipe(zip(distFileName(browserName, "zip")))
54+ .pipe(gulp.dest(paths.dist));
55+}
56+
57+function distFirefox() {
58+ return dist("firefox", (manifest) => {
59+ delete manifest.content_security_policy;
60+ removeShortcuts(manifest);
61+ return manifest;
62+ });
63+}
64+
65+function distOpera() {
66+ return dist("opera", (manifest) => {
67+ delete manifest.applications;
68+ delete manifest.content_security_policy;
69+ removeShortcuts(manifest);
70+ return manifest;
71+ });
72+}
73+
74+function distChrome() {
75+ return dist("chrome", (manifest) => {
76+ delete manifest.applications;
77+ delete manifest.content_security_policy;
78+ delete manifest.sidebar_action;
79+ delete manifest.commands._execute_sidebar_action;
80+ return manifest;
81+ });
82+}
83+
84+function distEdge() {
85+ return dist("edge", (manifest) => {
86+ delete manifest.applications;
87+ delete manifest.content_security_policy;
88+ delete manifest.sidebar_action;
89+ delete manifest.commands._execute_sidebar_action;
90+ return manifest;
91+ });
92+}
93+
94+function removeShortcuts(manifest) {
95+ if (manifest.content_scripts && manifest.content_scripts.length > 1) {
96+ const shortcutsScript = manifest.content_scripts[1];
97+ if (shortcutsScript.js.indexOf("content/shortcuts.js") > -1) {
98+ manifest.content_scripts.splice(1, 1);
99+ }
100+ }
101+}
102+
103+function distSafariMas(cb) {
104+ return distSafariApp(cb, "mas");
105+}
106+
107+function distSafariMasDev(cb) {
108+ return distSafariApp(cb, "masdev");
109+}
110+
111+function distSafariDmg(cb) {
112+ return distSafariApp(cb, "dmg");
113+}
114+
115+function distSafariApp(cb, subBuildPath) {
116+ const buildPath = paths.dist + "Safari/" + subBuildPath + "/";
117+ const builtAppexPath = buildPath + "build/Release/safari.appex";
118+ const builtAppexFrameworkPath = buildPath + "build/Release/safari.appex/Contents/Frameworks/";
119+ const entitlementsPath = paths.safari + "safari/safari.entitlements";
120+ var args = [
121+ "--verbose",
122+ "--force",
123+ "-o",
124+ "runtime",
125+ "--sign",
126+ "Developer ID Application: 8bit Solutions LLC",
127+ "--entitlements",
128+ entitlementsPath,
129+ ];
130+ if (subBuildPath !== "dmg") {
131+ args = [
132+ "--verbose",
133+ "--force",
134+ "--sign",
135+ subBuildPath === "mas"
136+ ? "3rd Party Mac Developer Application: 8bit Solutions LLC"
137+ : "6B287DD81FF922D86FD836128B0F62F358B38726",
138+ "--entitlements",
139+ entitlementsPath,
140+ ];
141+ }
142+
143+ return del([buildPath + "**/*"])
144+ .then(() => safariCopyAssets(paths.safari + "**/*", buildPath))
145+ .then(() => safariCopyBuild(paths.build + "**/*", buildPath + "safari/app"))
146+ .then(() => {
147+ const proc = child.spawn("xcodebuild", [
148+ "-project",
149+ buildPath + "desktop.xcodeproj",
150+ "-alltargets",
151+ "-configuration",
152+ "Release",
153+ ]);
154+ stdOutProc(proc);
155+ return new Promise((resolve) => proc.on("close", resolve));
156+ })
157+ .then(() => {
158+ const libs = fs
159+ .readdirSync(builtAppexFrameworkPath)
160+ .filter((p) => p.endsWith(".dylib"))
161+ .map((p) => builtAppexFrameworkPath + p);
162+ const libPromises = [];
163+ libs.forEach((i) => {
164+ const proc = child.spawn("codesign", args.concat([i]));
165+ stdOutProc(proc);
166+ libPromises.push(new Promise((resolve) => proc.on("close", resolve)));
167+ });
168+ return Promise.all(libPromises);
169+ })
170+ .then(() => {
171+ const proc = child.spawn("codesign", args.concat([builtAppexPath]));
172+ stdOutProc(proc);
173+ return new Promise((resolve) => proc.on("close", resolve));
174+ })
175+ .then(
176+ () => {
177+ return cb;
178+ },
179+ () => {
180+ return cb;
181+ }
182+ );
183+}
184+
185+function safariCopyAssets(source, dest) {
186+ return new Promise((resolve, reject) => {
187+ gulp
188+ .src(source)
189+ .on("error", reject)
190+ .pipe(gulpif("safari/Info.plist", replace("0.0.1", manifest.version)))
191+ .pipe(
192+ gulpif("safari/Info.plist", replace("0.0.2", process.env.BUILD_NUMBER || manifest.version))
193+ )
194+ .pipe(gulpif("desktop.xcodeproj/project.pbxproj", replace("../../../build", "../safari/app")))
195+ .pipe(gulp.dest(dest))
196+ .on("end", resolve);
197+ });
198+}
199+
200+function safariCopyBuild(source, dest) {
201+ return new Promise((resolve, reject) => {
202+ gulp
203+ .src(source)
204+ .on("error", reject)
205+ .pipe(filter(["**"].concat(filters.fonts)))
206+ .pipe(gulpif("popup/index.html", replace("__BROWSER__", "browser_safari")))
207+ .pipe(
208+ gulpif(
209+ "manifest.json",
210+ jeditor((manifest) => {
211+ delete manifest.optional_permissions;
212+ manifest.permissions.push("nativeMessaging");
213+ return manifest;
214+ })
215+ )
216+ )
217+ .pipe(gulp.dest(dest))
218+ .on("end", resolve);
219+ });
220+}
221+
222+function stdOutProc(proc) {
223+ proc.stdout.on("data", (data) => console.log(data.toString()));
224+ proc.stderr.on("data", (data) => console.error(data.toString()));
225+}
226+
227+function ciCoverage(cb) {
228+ return gulp
229+ .src(paths.coverage + "**/*")
230+ .pipe(filter(["**", "!coverage/coverage*.zip"]))
231+ .pipe(zip(`coverage${buildString()}.zip`))
232+ .pipe(gulp.dest(paths.coverage));
233+}
234+
235+exports["dist:firefox"] = distFirefox;
236+exports["dist:chrome"] = distChrome;
237+exports["dist:opera"] = distOpera;
238+exports["dist:edge"] = distEdge;
239+exports["dist:safari"] = gulp.parallel(distSafariMas, distSafariMasDev, distSafariDmg);
240+exports["dist:safari:mas"] = distSafariMas;
241+exports["dist:safari:masdev"] = distSafariMasDev;
242+exports["dist:safari:dmg"] = distSafariDmg;
243+exports.dist = gulp.parallel(distFirefox, distChrome, distOpera, distEdge);
244+exports["ci:coverage"] = ciCoverage;
245+exports.ci = ciCoverage;
apps/browser/jest.config.jsnew file+14
@@ -0,0 +1,14 @@
1+const { pathsToModuleNameMapper } = require("ts-jest");
2+
3+const { compilerOptions } = require("./tsconfig");
4+
5+module.exports = {
6+ collectCoverage: true,
7+ coverageReporters: ["html", "lcov"],
8+ coverageDirectory: "coverage",
9+ setupFilesAfterEnv: ["<rootDir>/test.setup.ts"],
10+ preset: "jest-preset-angular",
11+ moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {
12+ prefix: "<rootDir>/",
13+ }),
14+};
apps/browser/package.jsonnew file+24
@@ -0,0 +1,24 @@
1+{
2+ "name": "@bitwarden/browser",
3+ "version": "0.0.0",
4+ "scripts": {
5+ "build": "webpack",
6+ "build:mv3": "cross-env MANIFEST_VERSION=3 webpack",
7+ "build:watch": "webpack --watch",
8+ "build:watch:mv3": "cross-env MANIFEST_VERSION=3 webpack --watch",
9+ "build:prod": "cross-env NODE_ENV=production webpack",
10+ "build:prod:watch": "cross-env NODE_ENV=production webpack --watch",
11+ "dist": "npm run build:prod && gulp dist",
12+ "dist:chrome": "npm run build:prod && gulp dist:chrome",
13+ "dist:chrome:mv3": "cross-env MANIFEST_VERSION=3 npm run build:prod && gulp dist:chrome",
14+ "dist:firefox": "npm run build:prod && gulp dist:firefox",
15+ "dist:opera": "npm run build:prod && gulp dist:opera",
16+ "dist:safari": "npm run build:prod && gulp dist:safari",
17+ "dist:safari:mas": "npm run build:prod && gulp dist:safari:mas",
18+ "dist:safari:masdev": "npm run build:prod && gulp dist:safari:masdev",
19+ "dist:safari:dmg": "npm run build:prod && gulp dist:safari:dmg",
20+ "test": "jest",
21+ "test:watch": "jest --watch",
22+ "test:watch:all": "jest --watchAll"
23+ }
24+}
apps/browser/src/_locales/ar/messages.jsonnew file+1980
@@ -0,0 +1,1980 @@
1+{
2+ "appName": {
3+ "message": "Bitwarden"
4+ },
5+ "extName": {
6+ "message": "Bitwarden - Free Password Manager",
7+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
8+ },
9+ "extDesc": {
10+ "message": "A secure and free password manager for all of your devices.",
11+ "description": "Extension description"
12+ },
13+ "loginOrCreateNewAccount": {
14+ "message": "Log in or create a new account to access your secure vault."
15+ },
16+ "createAccount": {
17+ "message": "Create Account"
18+ },
19+ "login": {
20+ "message": "Log In"
21+ },
22+ "enterpriseSingleSignOn": {
23+ "message": "Enterprise Single Sign-On"
24+ },
25+ "cancel": {
26+ "message": "Cancel"
27+ },
28+ "close": {
29+ "message": "Close"
30+ },
31+ "submit": {
32+ "message": "Submit"
33+ },
34+ "emailAddress": {
35+ "message": "Email Address"
36+ },
37+ "masterPass": {
38+ "message": "Master Password"
39+ },
40+ "masterPassDesc": {
41+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
42+ },
43+ "masterPassHintDesc": {
44+ "message": "A master password hint can help you remember your password if you forget it."
45+ },
46+ "reTypeMasterPass": {
47+ "message": "Re-type Master Password"
48+ },
49+ "masterPassHint": {
50+ "message": "Master Password Hint (optional)"
51+ },
52+ "tab": {
53+ "message": "Tab"
54+ },
55+ "vault": {
56+ "message": "Vault"
57+ },
58+ "myVault": {
59+ "message": "My Vault"
60+ },
61+ "allVaults": {
62+ "message": "All Vaults"
63+ },
64+ "tools": {
65+ "message": "Tools"
66+ },
67+ "settings": {
68+ "message": "Settings"
69+ },
70+ "currentTab": {
71+ "message": "Current Tab"
72+ },
73+ "copyPassword": {
74+ "message": "Copy Password"
75+ },
76+ "copyNote": {
77+ "message": "Copy Note"
78+ },
79+ "copyUri": {
80+ "message": "Copy URI"
81+ },
82+ "copyUsername": {
83+ "message": "Copy Username"
84+ },
85+ "copyNumber": {
86+ "message": "Copy Number"
87+ },
88+ "copySecurityCode": {
89+ "message": "Copy Security Code"
90+ },
91+ "autoFill": {
92+ "message": "Auto-fill"
93+ },
94+ "generatePasswordCopied": {
95+ "message": "Generate Password (copied)"
96+ },
97+ "copyElementIdentifier": {
98+ "message": "Copy Custom Field Name"
99+ },
100+ "noMatchingLogins": {
101+ "message": "No matching logins."
102+ },
103+ "unlockVaultMenu": {
104+ "message": "Unlock your vault"
105+ },
106+ "loginToVaultMenu": {
107+ "message": "Log in to your vault"
108+ },
109+ "autoFillInfo": {
110+ "message": "There are no logins available to auto-fill for the current browser tab."
111+ },
112+ "addLogin": {
113+ "message": "Add a Login"
114+ },
115+ "addItem": {
116+ "message": "Add Item"
117+ },
118+ "passwordHint": {
119+ "message": "Password Hint"
120+ },
121+ "enterEmailToGetHint": {
122+ "message": "Enter your account email address to receive your master password hint."
123+ },
124+ "getMasterPasswordHint": {
125+ "message": "Get master password hint"
126+ },
127+ "continue": {
128+ "message": "Continue"
129+ },
130+ "sendVerificationCode": {
131+ "message": "Send a verification code to your email"
132+ },
133+ "sendCode": {
134+ "message": "Send Code"
135+ },
136+ "codeSent": {
137+ "message": "Code Sent"
138+ },
139+ "verificationCode": {
140+ "message": "Verification Code"
141+ },
142+ "confirmIdentity": {
143+ "message": "Confirm your identity to continue."
144+ },
145+ "account": {
146+ "message": "Account"
147+ },
148+ "changeMasterPassword": {
149+ "message": "Change master password"
150+ },
151+ "fingerprintPhrase": {
152+ "message": "Fingerprint phrase",
153+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
154+ },
155+ "yourAccountsFingerprint": {
156+ "message": "Your account's fingerprint phrase",
157+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
158+ },
159+ "twoStepLogin": {
160+ "message": "Two-step login"
161+ },
162+ "logOut": {
163+ "message": "Log out"
164+ },
165+ "about": {
166+ "message": "About"
167+ },
168+ "version": {
169+ "message": "Version"
170+ },
171+ "save": {
172+ "message": "Save"
173+ },
174+ "move": {
175+ "message": "Move"
176+ },
177+ "addFolder": {
178+ "message": "Add Folder"
179+ },
180+ "name": {
181+ "message": "Name"
182+ },
183+ "editFolder": {
184+ "message": "Edit Folder"
185+ },
186+ "deleteFolder": {
187+ "message": "Delete Folder"
188+ },
189+ "folders": {
190+ "message": "Folders"
191+ },
192+ "noFolders": {
193+ "message": "There are no folders to list."
194+ },
195+ "helpFeedback": {
196+ "message": "Help & feedback"
197+ },
198+ "sync": {
199+ "message": "Sync"
200+ },
201+ "syncVaultNow": {
202+ "message": "Sync Vault Now"
203+ },
204+ "lastSync": {
205+ "message": "Last Sync:"
206+ },
207+ "passGen": {
208+ "message": "Password Generator"
209+ },
210+ "generator": {
211+ "message": "Generator",
212+ "description": "Short for 'Password Generator'."
213+ },
214+ "passGenInfo": {
215+ "message": "Automatically generate strong, unique passwords for your logins."
216+ },
217+ "bitWebVault": {
218+ "message": "Bitwarden web vault"
219+ },
220+ "importItems": {
221+ "message": "Import items"
222+ },
223+ "select": {
224+ "message": "Select"
225+ },
226+ "generatePassword": {
227+ "message": "Generate Password"
228+ },
229+ "regeneratePassword": {
230+ "message": "Regenerate Password"
231+ },
232+ "options": {
233+ "message": "Options"
234+ },
235+ "length": {
236+ "message": "Length"
237+ },
238+ "uppercase": {
239+ "message": "Uppercase (A-Z)"
240+ },
241+ "lowercase": {
242+ "message": "Lowercase (a-z)"
243+ },
244+ "numbers": {
245+ "message": "Numbers (0-9)"
246+ },
247+ "specialCharacters": {
248+ "message": "Special Characters (!@#$%^&*)"
249+ },
250+ "numWords": {
251+ "message": "Number of Words"
252+ },
253+ "wordSeparator": {
254+ "message": "Word Separator"
255+ },
256+ "capitalize": {
257+ "message": "Capitalize",
258+ "description": "Make the first letter of a work uppercase."
259+ },
260+ "includeNumber": {
261+ "message": "Include Number"
262+ },
263+ "minNumbers": {
264+ "message": "Minimum Numbers"
265+ },
266+ "minSpecial": {
267+ "message": "Minimum Special"
268+ },
269+ "avoidAmbChar": {
270+ "message": "Avoid Ambiguous Characters"
271+ },
272+ "searchVault": {
273+ "message": "Search vault"
274+ },
275+ "edit": {
276+ "message": "Edit"
277+ },
278+ "view": {
279+ "message": "View"
280+ },
281+ "noItemsInList": {
282+ "message": "There are no items to list."
283+ },
284+ "itemInformation": {
285+ "message": "Item Information"
286+ },
287+ "username": {
288+ "message": "Username"
289+ },
290+ "password": {
291+ "message": "Password"
292+ },
293+ "passphrase": {
294+ "message": "Passphrase"
295+ },
296+ "favorite": {
297+ "message": "Favorite"
298+ },
299+ "notes": {
300+ "message": "Notes"
301+ },
302+ "note": {
303+ "message": "Note"
304+ },
305+ "editItem": {
306+ "message": "Edit Item"
307+ },
308+ "folder": {
309+ "message": "Folder"
310+ },
311+ "deleteItem": {
312+ "message": "Delete Item"
313+ },
314+ "viewItem": {
315+ "message": "View Item"
316+ },
317+ "launch": {
318+ "message": "Launch"
319+ },
320+ "website": {
321+ "message": "Website"
322+ },
323+ "toggleVisibility": {
324+ "message": "Toggle Visibility"
325+ },
326+ "manage": {
327+ "message": "Manage"
328+ },
329+ "other": {
330+ "message": "Other"
331+ },
332+ "rateExtension": {
333+ "message": "Rate the extension"
334+ },
335+ "rateExtensionDesc": {
336+ "message": "Please consider helping us out with a good review!"
337+ },
338+ "browserNotSupportClipboard": {
339+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
340+ },
341+ "verifyIdentity": {
342+ "message": "Verify Identity"
343+ },
344+ "yourVaultIsLocked": {
345+ "message": "Your vault is locked. Verify your identity to continue."
346+ },
347+ "unlock": {
348+ "message": "Unlock"
349+ },
350+ "loggedInAsOn": {
351+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
352+ "placeholders": {
353+ "email": {
354+ "content": "$1",
355+ "example": "name@example.com"
356+ },
357+ "hostname": {
358+ "content": "$2",
359+ "example": "bitwarden.com"
360+ }
361+ }
362+ },
363+ "invalidMasterPassword": {
364+ "message": "Invalid master password"
365+ },
366+ "vaultTimeout": {
367+ "message": "Vault timeout"
368+ },
369+ "lockNow": {
370+ "message": "Lock now"
371+ },
372+ "immediately": {
373+ "message": "Immediately"
374+ },
375+ "tenSeconds": {
376+ "message": "10 seconds"
377+ },
378+ "twentySeconds": {
379+ "message": "20 seconds"
380+ },
381+ "thirtySeconds": {
382+ "message": "30 seconds"
383+ },
384+ "oneMinute": {
385+ "message": "1 minute"
386+ },
387+ "twoMinutes": {
388+ "message": "2 minutes"
389+ },
390+ "fiveMinutes": {
391+ "message": "5 minutes"
392+ },
393+ "fifteenMinutes": {
394+ "message": "15 minutes"
395+ },
396+ "thirtyMinutes": {
397+ "message": "30 minutes"
398+ },
399+ "oneHour": {
400+ "message": "1 hour"
401+ },
402+ "fourHours": {
403+ "message": "4 hours"
404+ },
405+ "onLocked": {
406+ "message": "On system lock"
407+ },
408+ "onRestart": {
409+ "message": "On browser restart"
410+ },
411+ "never": {
412+ "message": "Never"
413+ },
414+ "security": {
415+ "message": "Security"
416+ },
417+ "errorOccurred": {
418+ "message": "An error has occurred"
419+ },
420+ "emailRequired": {
421+ "message": "Email address is required."
422+ },
423+ "invalidEmail": {
424+ "message": "Invalid email address."
425+ },
426+ "masterPasswordRequired": {
427+ "message": "Master password is required."
428+ },
429+ "confirmMasterPasswordRequired": {
430+ "message": "Master password retype is required."
431+ },
432+ "masterPasswordMinlength": {
433+ "message": "Master password must be at least 8 characters long."
434+ },
435+ "masterPassDoesntMatch": {
436+ "message": "Master password confirmation does not match."
437+ },
438+ "newAccountCreated": {
439+ "message": "Your new account has been created! You may now log in."
440+ },
441+ "masterPassSent": {
442+ "message": "We've sent you an email with your master password hint."
443+ },
444+ "verificationCodeRequired": {
445+ "message": "Verification code is required."
446+ },
447+ "invalidVerificationCode": {
448+ "message": "Invalid verification code"
449+ },
450+ "valueCopied": {
451+ "message": "$VALUE$ copied",
452+ "description": "Value has been copied to the clipboard.",
453+ "placeholders": {
454+ "value": {
455+ "content": "$1",
456+ "example": "Password"
457+ }
458+ }
459+ },
460+ "autofillError": {
461+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
462+ },
463+ "loggedOut": {
464+ "message": "Logged out"
465+ },
466+ "loginExpired": {
467+ "message": "Your login session has expired."
468+ },
469+ "logOutConfirmation": {
470+ "message": "Are you sure you want to log out?"
471+ },
472+ "yes": {
473+ "message": "Yes"
474+ },
475+ "no": {
476+ "message": "No"
477+ },
478+ "unexpectedError": {
479+ "message": "An unexpected error has occurred."
480+ },
481+ "nameRequired": {
482+ "message": "Name is required."
483+ },
484+ "addedFolder": {
485+ "message": "Added folder"
486+ },
487+ "changeMasterPass": {
488+ "message": "Change Master Password"
489+ },
490+ "changeMasterPasswordConfirmation": {
491+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
492+ },
493+ "twoStepLoginConfirmation": {
494+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
495+ },
496+ "editedFolder": {
497+ "message": "Edited folder"
498+ },
499+ "deleteFolderConfirmation": {
500+ "message": "Are you sure you want to delete this folder?"
501+ },
502+ "deletedFolder": {
503+ "message": "Deleted folder"
504+ },
505+ "gettingStartedTutorial": {
506+ "message": "Getting Started Tutorial"
507+ },
508+ "gettingStartedTutorialVideo": {
509+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
510+ },
511+ "syncingComplete": {
512+ "message": "Syncing complete"
513+ },
514+ "syncingFailed": {
515+ "message": "Syncing failed"
516+ },
517+ "passwordCopied": {
518+ "message": "Password copied"
519+ },
520+ "uri": {
521+ "message": "URI"
522+ },
523+ "uriPosition": {
524+ "message": "URI $POSITION$",
525+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
526+ "placeholders": {
527+ "position": {
528+ "content": "$1",
529+ "example": "2"
530+ }
531+ }
532+ },
533+ "newUri": {
534+ "message": "New URI"
535+ },
536+ "addedItem": {
537+ "message": "Added item"
538+ },
539+ "editedItem": {
540+ "message": "Edited item"
541+ },
542+ "deleteItemConfirmation": {
543+ "message": "Do you really want to send to the trash?"
544+ },
545+ "deletedItem": {
546+ "message": "Sent item to trash"
547+ },
548+ "overwritePassword": {
549+ "message": "Overwrite Password"
550+ },
551+ "overwritePasswordConfirmation": {
552+ "message": "Are you sure you want to overwrite the current password?"
553+ },
554+ "overwriteUsername": {
555+ "message": "Overwrite Username"
556+ },
557+ "overwriteUsernameConfirmation": {
558+ "message": "Are you sure you want to overwrite the current username?"
559+ },
560+ "searchFolder": {
561+ "message": "Search folder"
562+ },
563+ "searchCollection": {
564+ "message": "Search collection"
565+ },
566+ "searchType": {
567+ "message": "Search type"
568+ },
569+ "noneFolder": {
570+ "message": "No Folder",
571+ "description": "This is the folder for uncategorized items"
572+ },
573+ "enableAddLoginNotification": {
574+ "message": "Ask to add login"
575+ },
576+ "addLoginNotificationDesc": {
577+ "message": "Ask to add an item if one isn't found in your vault."
578+ },
579+ "showCardsCurrentTab": {
580+ "message": "Show cards on Tab page"
581+ },
582+ "showCardsCurrentTabDesc": {
583+ "message": "List card items on the Tab page for easy auto-fill."
584+ },
585+ "showIdentitiesCurrentTab": {
586+ "message": "Show identities on Tab page"
587+ },
588+ "showIdentitiesCurrentTabDesc": {
589+ "message": "List identity items on the Tab page for easy auto-fill."
590+ },
591+ "clearClipboard": {
592+ "message": "Clear clipboard",
593+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
594+ },
595+ "clearClipboardDesc": {
596+ "message": "Automatically clear copied values from your clipboard.",
597+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
598+ },
599+ "notificationAddDesc": {
600+ "message": "Should Bitwarden remember this password for you?"
601+ },
602+ "notificationAddSave": {
603+ "message": "Save"
604+ },
605+ "enableChangedPasswordNotification": {
606+ "message": "Ask to update existing login"
607+ },
608+ "changedPasswordNotificationDesc": {
609+ "message": "Ask to update a login's password when a change is detected on a website."
610+ },
611+ "notificationChangeDesc": {
612+ "message": "Do you want to update this password in Bitwarden?"
613+ },
614+ "notificationChangeSave": {
615+ "message": "Update"
616+ },
617+ "enableContextMenuItem": {
618+ "message": "Show context menu options"
619+ },
620+ "contextMenuItemDesc": {
621+ "message": "Use a secondary click to access password generation and matching logins for the website. "
622+ },
623+ "defaultUriMatchDetection": {
624+ "message": "Default URI match detection",
625+ "description": "Default URI match detection for auto-fill."
626+ },
627+ "defaultUriMatchDetectionDesc": {
628+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
629+ },
630+ "theme": {
631+ "message": "Theme"
632+ },
633+ "themeDesc": {
634+ "message": "Change the application's color theme."
635+ },
636+ "dark": {
637+ "message": "Dark",
638+ "description": "Dark color"
639+ },
640+ "light": {
641+ "message": "Light",
642+ "description": "Light color"
643+ },
644+ "solarizedDark": {
645+ "message": "Solarized dark",
646+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
647+ },
648+ "exportVault": {
649+ "message": "Export vault"
650+ },
651+ "fileFormat": {
652+ "message": "File Format"
653+ },
654+ "warning": {
655+ "message": "WARNING",
656+ "description": "WARNING (should stay in capitalized letters if the language permits)"
657+ },
658+ "confirmVaultExport": {
659+ "message": "Confirm Vault Export"
660+ },
661+ "exportWarningDesc": {
662+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
663+ },
664+ "encExportKeyWarningDesc": {
665+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
666+ },
667+ "encExportAccountWarningDesc": {
668+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
669+ },
670+ "exportMasterPassword": {
671+ "message": "Enter your master password to export your vault data."
672+ },
673+ "shared": {
674+ "message": "Shared"
675+ },
676+ "learnOrg": {
677+ "message": "Learn about organizations"
678+ },
679+ "learnOrgConfirmation": {
680+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
681+ },
682+ "moveToOrganization": {
683+ "message": "Move to Organization"
684+ },
685+ "share": {
686+ "message": "Share"
687+ },
688+ "movedItemToOrg": {
689+ "message": "$ITEMNAME$ moved to $ORGNAME$",
690+ "placeholders": {
691+ "itemname": {
692+ "content": "$1",
693+ "example": "Secret Item"
694+ },
695+ "orgname": {
696+ "content": "$2",
697+ "example": "Company Name"
698+ }
699+ }
700+ },
701+ "moveToOrgDesc": {
702+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
703+ },
704+ "learnMore": {
705+ "message": "Learn more"
706+ },
707+ "authenticatorKeyTotp": {
708+ "message": "Authenticator Key (TOTP)"
709+ },
710+ "verificationCodeTotp": {
711+ "message": "Verification Code (TOTP)"
712+ },
713+ "copyVerificationCode": {
714+ "message": "Copy Verification Code"
715+ },
716+ "attachments": {
717+ "message": "Attachments"
718+ },
719+ "deleteAttachment": {
720+ "message": "Delete attachment"
721+ },
722+ "deleteAttachmentConfirmation": {
723+ "message": "Are you sure you want to delete this attachment?"
724+ },
725+ "deletedAttachment": {
726+ "message": "Deleted attachment"
727+ },
728+ "newAttachment": {
729+ "message": "Add New Attachment"
730+ },
731+ "noAttachments": {
732+ "message": "No attachments."
733+ },
734+ "attachmentSaved": {
735+ "message": "The attachment has been saved."
736+ },
737+ "file": {
738+ "message": "File"
739+ },
740+ "selectFile": {
741+ "message": "Select a file."
742+ },
743+ "maxFileSize": {
744+ "message": "Maximum file size is 500 MB."
745+ },
746+ "featureUnavailable": {
747+ "message": "Feature Unavailable"
748+ },
749+ "updateKey": {
750+ "message": "You cannot use this feature until you update your encryption key."
751+ },
752+ "premiumMembership": {
753+ "message": "Premium membership"
754+ },
755+ "premiumManage": {
756+ "message": "Manage Membership"
757+ },
758+ "premiumManageAlert": {
759+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
760+ },
761+ "premiumRefresh": {
762+ "message": "Refresh Membership"
763+ },
764+ "premiumNotCurrentMember": {
765+ "message": "You are not currently a premium member."
766+ },
767+ "premiumSignUpAndGet": {
768+ "message": "Sign up for a premium membership and get:"
769+ },
770+ "ppremiumSignUpStorage": {
771+ "message": "1 GB encrypted storage for file attachments."
772+ },
773+ "ppremiumSignUpTwoStep": {
774+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
775+ },
776+ "ppremiumSignUpReports": {
777+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
778+ },
779+ "ppremiumSignUpTotp": {
780+ "message": "TOTP verification code (2FA) generator for logins in your vault."
781+ },
782+ "ppremiumSignUpSupport": {
783+ "message": "Priority customer support."
784+ },
785+ "ppremiumSignUpFuture": {
786+ "message": "All future premium features. More coming soon!"
787+ },
788+ "premiumPurchase": {
789+ "message": "Purchase Premium"
790+ },
791+ "premiumPurchaseAlert": {
792+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
793+ },
794+ "premiumCurrentMember": {
795+ "message": "You are a premium member!"
796+ },
797+ "premiumCurrentMemberThanks": {
798+ "message": "Thank you for supporting Bitwarden."
799+ },
800+ "premiumPrice": {
801+ "message": "All for just $PRICE$ /year!",
802+ "placeholders": {
803+ "price": {
804+ "content": "$1",
805+ "example": "$10"
806+ }
807+ }
808+ },
809+ "refreshComplete": {
810+ "message": "Refresh complete"
811+ },
812+ "enableAutoTotpCopy": {
813+ "message": "Copy TOTP automatically"
814+ },
815+ "disableAutoTotpCopyDesc": {
816+ "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login."
817+ },
818+ "enableAutoBiometricsPrompt": {
819+ "message": "Ask for biometrics on launch"
820+ },
821+ "premiumRequired": {
822+ "message": "Premium Required"
823+ },
824+ "premiumRequiredDesc": {
825+ "message": "A premium membership is required to use this feature."
826+ },
827+ "enterVerificationCodeApp": {
828+ "message": "Enter the 6 digit verification code from your authenticator app."
829+ },
830+ "enterVerificationCodeEmail": {
831+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
832+ "placeholders": {
833+ "email": {
834+ "content": "$1",
835+ "example": "example@gmail.com"
836+ }
837+ }
838+ },
839+ "verificationCodeEmailSent": {
840+ "message": "Verification email sent to $EMAIL$.",
841+ "placeholders": {
842+ "email": {
843+ "content": "$1",
844+ "example": "example@gmail.com"
845+ }
846+ }
847+ },
848+ "rememberMe": {
849+ "message": "Remember me"
850+ },
851+ "sendVerificationCodeEmailAgain": {
852+ "message": "Send verification code email again"
853+ },
854+ "useAnotherTwoStepMethod": {
855+ "message": "Use another two-step login method"
856+ },
857+ "insertYubiKey": {
858+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
859+ },
860+ "insertU2f": {
861+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
862+ },
863+ "webAuthnNewTab": {
864+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
865+ },
866+ "webAuthnNewTabOpen": {
867+ "message": "Open new tab"
868+ },
869+ "webAuthnAuthenticate": {
870+ "message": "Authenticate WebAuthn"
871+ },
872+ "loginUnavailable": {
873+ "message": "Login Unavailable"
874+ },
875+ "noTwoStepProviders": {
876+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
877+ },
878+ "noTwoStepProviders2": {
879+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
880+ },
881+ "twoStepOptions": {
882+ "message": "Two-step Login Options"
883+ },
884+ "recoveryCodeDesc": {
885+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
886+ },
887+ "recoveryCodeTitle": {
888+ "message": "Recovery Code"
889+ },
890+ "authenticatorAppTitle": {
891+ "message": "Authenticator App"
892+ },
893+ "authenticatorAppDesc": {
894+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
895+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
896+ },
897+ "yubiKeyTitle": {
898+ "message": "YubiKey OTP Security Key"
899+ },
900+ "yubiKeyDesc": {
901+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
902+ },
903+ "duoDesc": {
904+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
905+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
906+ },
907+ "duoOrganizationDesc": {
908+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
909+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
910+ },
911+ "webAuthnTitle": {
912+ "message": "FIDO2 WebAuthn"
913+ },
914+ "webAuthnDesc": {
915+ "message": "Use any WebAuthn enabled security key to access your account."
916+ },
917+ "emailTitle": {
918+ "message": "Email"
919+ },
920+ "emailDesc": {
921+ "message": "Verification codes will be emailed to you."
922+ },
923+ "selfHostedEnvironment": {
924+ "message": "Self-hosted Environment"
925+ },
926+ "selfHostedEnvironmentFooter": {
927+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
928+ },
929+ "customEnvironment": {
930+ "message": "Custom Environment"
931+ },
932+ "customEnvironmentFooter": {
933+ "message": "For advanced users. You can specify the base URL of each service independently."
934+ },
935+ "baseUrl": {
936+ "message": "Server URL"
937+ },
938+ "apiUrl": {
939+ "message": "API Server URL"
940+ },
941+ "webVaultUrl": {
942+ "message": "Web Vault Server URL"
943+ },
944+ "identityUrl": {
945+ "message": "Identity Server URL"
946+ },
947+ "notificationsUrl": {
948+ "message": "Notifications Server URL"
949+ },
950+ "iconsUrl": {
951+ "message": "Icons Server URL"
952+ },
953+ "environmentSaved": {
954+ "message": "The environment URLs have been saved."
955+ },
956+ "enableAutoFillOnPageLoad": {
957+ "message": "Auto-fill on page load"
958+ },
959+ "enableAutoFillOnPageLoadDesc": {
960+ "message": "If a login form is detected, auto-fill when the web page loads."
961+ },
962+ "experimentalFeature": {
963+ "message": "This is currently an experimental feature. Use at your own risk."
964+ },
965+ "defaultAutoFillOnPageLoad": {
966+ "message": "Default autofill setting for login items"
967+ },
968+ "defaultAutoFillOnPageLoadDesc": {
969+ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view."
970+ },
971+ "itemAutoFillOnPageLoad": {
972+ "message": "Auto-fill on page load (if enabled in Options)"
973+ },
974+ "autoFillOnPageLoadUseDefault": {
975+ "message": "Use default setting"
976+ },
977+ "autoFillOnPageLoadYes": {
978+ "message": "Auto-fill on page load"
979+ },
980+ "autoFillOnPageLoadNo": {
981+ "message": "Do not auto-fill on page load"
982+ },
983+ "commandOpenPopup": {
984+ "message": "Open vault popup"
985+ },
986+ "commandOpenSidebar": {
987+ "message": "Open vault in sidebar"
988+ },
989+ "commandAutofillDesc": {
990+ "message": "Auto-fill the last used login for the current website"
991+ },
992+ "commandGeneratePasswordDesc": {
993+ "message": "Generate and copy a new random password to the clipboard"
994+ },
995+ "commandLockVaultDesc": {
996+ "message": "Lock the vault"
997+ },
998+ "privateModeWarning": {
999+ "message": "Private mode support is experimental and some features are limited."
1000+ },
1001+ "customFields": {
1002+ "message": "Custom Fields"
1003+ },
1004+ "copyValue": {
1005+ "message": "Copy Value"
1006+ },
1007+ "value": {
1008+ "message": "Value"
1009+ },
1010+ "newCustomField": {
1011+ "message": "New Custom Field"
1012+ },
1013+ "dragToSort": {
1014+ "message": "Drag to sort"
1015+ },
1016+ "cfTypeText": {
1017+ "message": "Text"
1018+ },
1019+ "cfTypeHidden": {
1020+ "message": "Hidden"
1021+ },
1022+ "cfTypeBoolean": {
1023+ "message": "Boolean"
1024+ },
1025+ "cfTypeLinked": {
1026+ "message": "Linked",
1027+ "description": "This describes a field that is 'linked' (tied) to another field."
1028+ },
1029+ "linkedValue": {
1030+ "message": "Linked value",
1031+ "description": "This describes a value that is 'linked' (tied) to another value."
1032+ },
1033+ "popup2faCloseMessage": {
1034+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
1035+ },
1036+ "popupU2fCloseMessage": {
1037+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
1038+ },
1039+ "enableFavicon": {
1040+ "message": "Show website icons"
1041+ },
1042+ "faviconDesc": {
1043+ "message": "Show a recognizable image next to each login."
1044+ },
1045+ "enableBadgeCounter": {
1046+ "message": "Show badge counter"
1047+ },
1048+ "badgeCounterDesc": {
1049+ "message": "Indicate how many logins you have for the current web page."
1050+ },
1051+ "cardholderName": {
1052+ "message": "Cardholder Name"
1053+ },
1054+ "number": {
1055+ "message": "Number"
1056+ },
1057+ "brand": {
1058+ "message": "Brand"
1059+ },
1060+ "expirationMonth": {
1061+ "message": "Expiration Month"
1062+ },
1063+ "expirationYear": {
1064+ "message": "Expiration Year"
1065+ },
1066+ "expiration": {
1067+ "message": "Expiration"
1068+ },
1069+ "january": {
1070+ "message": "January"
1071+ },
1072+ "february": {
1073+ "message": "February"
1074+ },
1075+ "march": {
1076+ "message": "March"
1077+ },
1078+ "april": {
1079+ "message": "April"
1080+ },
1081+ "may": {
1082+ "message": "May"
1083+ },
1084+ "june": {
1085+ "message": "June"
1086+ },
1087+ "july": {
1088+ "message": "July"
1089+ },
1090+ "august": {
1091+ "message": "August"
1092+ },
1093+ "september": {
1094+ "message": "September"
1095+ },
1096+ "october": {
1097+ "message": "October"
1098+ },
1099+ "november": {
1100+ "message": "November"
1101+ },
1102+ "december": {
1103+ "message": "December"
1104+ },
1105+ "securityCode": {
1106+ "message": "Security Code"
1107+ },
1108+ "ex": {
1109+ "message": "ex."
1110+ },
1111+ "title": {
1112+ "message": "Title"
1113+ },
1114+ "mr": {
1115+ "message": "Mr"
1116+ },
1117+ "mrs": {
1118+ "message": "Mrs"
1119+ },
1120+ "ms": {
1121+ "message": "Ms"
1122+ },
1123+ "dr": {
1124+ "message": "Dr"
1125+ },
1126+ "firstName": {
1127+ "message": "First Name"
1128+ },
1129+ "middleName": {
1130+ "message": "Middle Name"
1131+ },
1132+ "lastName": {
1133+ "message": "Last Name"
1134+ },
1135+ "fullName": {
1136+ "message": "Full Name"
1137+ },
1138+ "identityName": {
1139+ "message": "Identity Name"
1140+ },
1141+ "company": {
1142+ "message": "Company"
1143+ },
1144+ "ssn": {
1145+ "message": "Social Security Number"
1146+ },
1147+ "passportNumber": {
1148+ "message": "Passport Number"
1149+ },
1150+ "licenseNumber": {
1151+ "message": "License Number"
1152+ },
1153+ "email": {
1154+ "message": "Email"
1155+ },
1156+ "phone": {
1157+ "message": "Phone"
1158+ },
1159+ "address": {
1160+ "message": "Address"
1161+ },
1162+ "address1": {
1163+ "message": "Address 1"
1164+ },
1165+ "address2": {
1166+ "message": "Address 2"
1167+ },
1168+ "address3": {
1169+ "message": "Address 3"
1170+ },
1171+ "cityTown": {
1172+ "message": "City / Town"
1173+ },
1174+ "stateProvince": {
1175+ "message": "State / Province"
1176+ },
1177+ "zipPostalCode": {
1178+ "message": "Zip / Postal Code"
1179+ },
1180+ "country": {
1181+ "message": "Country"
1182+ },
1183+ "type": {
1184+ "message": "Type"
1185+ },
1186+ "typeLogin": {
1187+ "message": "Login"
1188+ },
1189+ "typeLogins": {
1190+ "message": "Logins"
1191+ },
1192+ "typeSecureNote": {
1193+ "message": "Secure Note"
1194+ },
1195+ "typeCard": {
1196+ "message": "Card"
1197+ },
1198+ "typeIdentity": {
1199+ "message": "Identity"
1200+ },
1201+ "passwordHistory": {
1202+ "message": "Password History"
1203+ },
1204+ "back": {
1205+ "message": "Back"
1206+ },
1207+ "collections": {
1208+ "message": "Collections"
1209+ },
1210+ "favorites": {
1211+ "message": "Favorites"
1212+ },
1213+ "popOutNewWindow": {
1214+ "message": "Pop out to a new window"
1215+ },
1216+ "refresh": {
1217+ "message": "Refresh"
1218+ },
1219+ "cards": {
1220+ "message": "Cards"
1221+ },
1222+ "identities": {
1223+ "message": "Identities"
1224+ },
1225+ "logins": {
1226+ "message": "Logins"
1227+ },
1228+ "secureNotes": {
1229+ "message": "Secure Notes"
1230+ },
1231+ "clear": {
1232+ "message": "Clear",
1233+ "description": "To clear something out. example: To clear browser history."
1234+ },
1235+ "checkPassword": {
1236+ "message": "Check if password has been exposed."
1237+ },
1238+ "passwordExposed": {
1239+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
1240+ "placeholders": {
1241+ "value": {
1242+ "content": "$1",
1243+ "example": "2"
1244+ }
1245+ }
1246+ },
1247+ "passwordSafe": {
1248+ "message": "This password was not found in any known data breaches. It should be safe to use."
1249+ },
1250+ "baseDomain": {
1251+ "message": "Base domain",
1252+ "description": "Domain name. Ex. website.com"
1253+ },
1254+ "domainName": {
1255+ "message": "Domain name",
1256+ "description": "Domain name. Ex. website.com"
1257+ },
1258+ "host": {
1259+ "message": "Host",
1260+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
1261+ },
1262+ "exact": {
1263+ "message": "Exact"
1264+ },
1265+ "startsWith": {
1266+ "message": "Starts with"
1267+ },
1268+ "regEx": {
1269+ "message": "Regular expression",
1270+ "description": "A programming term, also known as 'RegEx'."
1271+ },
1272+ "matchDetection": {
1273+ "message": "Match Detection",
1274+ "description": "URI match detection for auto-fill."
1275+ },
1276+ "defaultMatchDetection": {
1277+ "message": "Default match detection",
1278+ "description": "Default URI match detection for auto-fill."
1279+ },
1280+ "toggleOptions": {
1281+ "message": "Toggle Options"
1282+ },
1283+ "toggleCurrentUris": {
1284+ "message": "Toggle Current URIs",
1285+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
1286+ },
1287+ "currentUri": {
1288+ "message": "Current URI",
1289+ "description": "The URI of one of the current open tabs in the browser."
1290+ },
1291+ "organization": {
1292+ "message": "Organization",
1293+ "description": "An entity of multiple related people (ex. a team or business organization)."
1294+ },
1295+ "types": {
1296+ "message": "Types"
1297+ },
1298+ "allItems": {
1299+ "message": "All Items"
1300+ },
1301+ "noPasswordsInList": {
1302+ "message": "There are no passwords to list."
1303+ },
1304+ "remove": {
1305+ "message": "Remove"
1306+ },
1307+ "default": {
1308+ "message": "Default"
1309+ },
1310+ "dateUpdated": {
1311+ "message": "Updated",
1312+ "description": "ex. Date this item was updated"
1313+ },
1314+ "datePasswordUpdated": {
1315+ "message": "Password Updated",
1316+ "description": "ex. Date this password was updated"
1317+ },
1318+ "neverLockWarning": {
1319+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
1320+ },
1321+ "noOrganizationsList": {
1322+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
1323+ },
1324+ "noCollectionsInList": {
1325+ "message": "There are no collections to list."
1326+ },
1327+ "ownership": {
1328+ "message": "Ownership"
1329+ },
1330+ "whoOwnsThisItem": {
1331+ "message": "Who owns this item?"
1332+ },
1333+ "strong": {
1334+ "message": "Strong",
1335+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
1336+ },
1337+ "good": {
1338+ "message": "Good",
1339+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
1340+ },
1341+ "weak": {
1342+ "message": "Weak",
1343+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
1344+ },
1345+ "weakMasterPassword": {
1346+ "message": "Weak Master Password"
1347+ },
1348+ "weakMasterPasswordDesc": {
1349+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
1350+ },
1351+ "pin": {
1352+ "message": "PIN",
1353+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
1354+ },
1355+ "unlockWithPin": {
1356+ "message": "Unlock with PIN"
1357+ },
1358+ "setYourPinCode": {
1359+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
1360+ },
1361+ "pinRequired": {
1362+ "message": "PIN code is required."
1363+ },
1364+ "invalidPin": {
1365+ "message": "Invalid PIN code."
1366+ },
1367+ "unlockWithBiometrics": {
1368+ "message": "Unlock with biometrics"
1369+ },
1370+ "awaitDesktop": {
1371+ "message": "Awaiting confirmation from desktop"
1372+ },
1373+ "awaitDesktopDesc": {
1374+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
1375+ },
1376+ "lockWithMasterPassOnRestart": {
1377+ "message": "Lock with master password on browser restart"
1378+ },
1379+ "selectOneCollection": {
1380+ "message": "You must select at least one collection."
1381+ },
1382+ "cloneItem": {
1383+ "message": "Clone Item"
1384+ },
1385+ "clone": {
1386+ "message": "Clone"
1387+ },
1388+ "passwordGeneratorPolicyInEffect": {
1389+ "message": "One or more organization policies are affecting your generator settings."
1390+ },
1391+ "vaultTimeoutAction": {
1392+ "message": "Vault timeout action"
1393+ },
1394+ "lock": {
1395+ "message": "Lock",
1396+ "description": "Verb form: to make secure or inaccesible by"
1397+ },
1398+ "trash": {
1399+ "message": "Trash",
1400+ "description": "Noun: a special folder to hold deleted items"
1401+ },
1402+ "searchTrash": {
1403+ "message": "Search trash"
1404+ },
1405+ "permanentlyDeleteItem": {
1406+ "message": "Permanently Delete Item"
1407+ },
1408+ "permanentlyDeleteItemConfirmation": {
1409+ "message": "Are you sure you want to permanently delete this item?"
1410+ },
1411+ "permanentlyDeletedItem": {
1412+ "message": "Permanently Deleted item"
1413+ },
1414+ "restoreItem": {
1415+ "message": "Restore Item"
1416+ },
1417+ "restoreItemConfirmation": {
1418+ "message": "Are you sure you want to restore this item?"
1419+ },
1420+ "restoredItem": {
1421+ "message": "Restored Item"
1422+ },
1423+ "vaultTimeoutLogOutConfirmation": {
1424+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
1425+ },
1426+ "vaultTimeoutLogOutConfirmationTitle": {
1427+ "message": "Timeout Action Confirmation"
1428+ },
1429+ "autoFillAndSave": {
1430+ "message": "Auto-fill and Save"
1431+ },
1432+ "autoFillSuccessAndSavedUri": {
1433+ "message": "Auto-filled Item and Saved URI"
1434+ },
1435+ "autoFillSuccess": {
1436+ "message": "Auto-filled Item"
1437+ },
1438+ "setMasterPassword": {
1439+ "message": "Set Master Password"
1440+ },
1441+ "masterPasswordPolicyInEffect": {
1442+ "message": "One or more organization policies require your master password to meet the following requirements:"
1443+ },
1444+ "policyInEffectMinComplexity": {
1445+ "message": "Minimum complexity score of $SCORE$",
1446+ "placeholders": {
1447+ "score": {
1448+ "content": "$1",
1449+ "example": "4"
1450+ }
1451+ }
1452+ },
1453+ "policyInEffectMinLength": {
1454+ "message": "Minimum length of $LENGTH$",
1455+ "placeholders": {
1456+ "length": {
1457+ "content": "$1",
1458+ "example": "14"
1459+ }
1460+ }
1461+ },
1462+ "policyInEffectUppercase": {
1463+ "message": "Contain one or more uppercase characters"
1464+ },
1465+ "policyInEffectLowercase": {
1466+ "message": "Contain one or more lowercase characters"
1467+ },
1468+ "policyInEffectNumbers": {
1469+ "message": "Contain one or more numbers"
1470+ },
1471+ "policyInEffectSpecial": {
1472+ "message": "Contain one or more of the following special characters $CHARS$",
1473+ "placeholders": {
1474+ "chars": {
1475+ "content": "$1",
1476+ "example": "!@#$%^&*"
1477+ }
1478+ }
1479+ },
1480+ "masterPasswordPolicyRequirementsNotMet": {
1481+ "message": "Your new master password does not meet the policy requirements."
1482+ },
1483+ "acceptPolicies": {
1484+ "message": "By checking this box you agree to the following:"
1485+ },
1486+ "acceptPoliciesRequired": {
1487+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
1488+ },
1489+ "termsOfService": {
1490+ "message": "Terms of Service"
1491+ },
1492+ "privacyPolicy": {
1493+ "message": "Privacy Policy"
1494+ },
1495+ "hintEqualsPassword": {
1496+ "message": "Your password hint cannot be the same as your password."
1497+ },
1498+ "ok": {
1499+ "message": "Ok"
1500+ },
1501+ "desktopSyncVerificationTitle": {
1502+ "message": "Desktop sync verification"
1503+ },
1504+ "desktopIntegrationVerificationText": {
1505+ "message": "Please verify that the desktop application shows this fingerprint: "
1506+ },
1507+ "desktopIntegrationDisabledTitle": {
1508+ "message": "Browser integration is not enabled"
1509+ },
1510+ "desktopIntegrationDisabledDesc": {
1511+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
1512+ },
1513+ "startDesktopTitle": {
1514+ "message": "Start the Bitwarden Desktop application"
1515+ },
1516+ "startDesktopDesc": {
1517+ "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used."
1518+ },
1519+ "errorEnableBiometricTitle": {
1520+ "message": "Unable to enable biometrics"
1521+ },
1522+ "errorEnableBiometricDesc": {
1523+ "message": "Action was canceled by the desktop application"
1524+ },
1525+ "nativeMessagingInvalidEncryptionDesc": {
1526+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
1527+ },
1528+ "nativeMessagingInvalidEncryptionTitle": {
1529+ "message": "Desktop communication interrupted"
1530+ },
1531+ "nativeMessagingWrongUserDesc": {
1532+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
1533+ },
1534+ "nativeMessagingWrongUserTitle": {
1535+ "message": "Account missmatch"
1536+ },
1537+ "biometricsNotEnabledTitle": {
1538+ "message": "Biometrics not enabled"
1539+ },
1540+ "biometricsNotEnabledDesc": {
1541+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
1542+ },
1543+ "biometricsNotSupportedTitle": {
1544+ "message": "Biometrics not supported"
1545+ },
1546+ "biometricsNotSupportedDesc": {
1547+ "message": "Browser biometrics is not supported on this device."
1548+ },
1549+ "nativeMessaginPermissionErrorTitle": {
1550+ "message": "Permission not provided"
1551+ },
1552+ "nativeMessaginPermissionErrorDesc": {
1553+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
1554+ },
1555+ "nativeMessaginPermissionSidebarTitle": {
1556+ "message": "Permission request error"
1557+ },
1558+ "nativeMessaginPermissionSidebarDesc": {
1559+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
1560+ },
1561+ "personalOwnershipSubmitError": {
1562+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
1563+ },
1564+ "personalOwnershipPolicyInEffect": {
1565+ "message": "An organization policy is affecting your ownership options."
1566+ },
1567+ "excludedDomains": {
1568+ "message": "Excluded domains"
1569+ },
1570+ "excludedDomainsDesc": {
1571+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
1572+ },
1573+ "excludedDomainsInvalidDomain": {
1574+ "message": "$DOMAIN$ is not a valid domain",
1575+ "placeholders": {
1576+ "domain": {
1577+ "content": "$1",
1578+ "example": "googlecom"
1579+ }
1580+ }
1581+ },
1582+ "send": {
1583+ "message": "Send",
1584+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1585+ },
1586+ "searchSends": {
1587+ "message": "Search Sends",
1588+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1589+ },
1590+ "addSend": {
1591+ "message": "Add Send",
1592+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1593+ },
1594+ "sendTypeText": {
1595+ "message": "Text"
1596+ },
1597+ "sendTypeFile": {
1598+ "message": "File"
1599+ },
1600+ "allSends": {
1601+ "message": "All Sends",
1602+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1603+ },
1604+ "maxAccessCountReached": {
1605+ "message": "Max access count reached",
1606+ "description": "This text will be displayed after a Send has been accessed the maximum amount of times."
1607+ },
1608+ "expired": {
1609+ "message": "Expired"
1610+ },
1611+ "pendingDeletion": {
1612+ "message": "Pending deletion"
1613+ },
1614+ "passwordProtected": {
1615+ "message": "Password protected"
1616+ },
1617+ "copySendLink": {
1618+ "message": "Copy Send link",
1619+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1620+ },
1621+ "removePassword": {
1622+ "message": "Remove Password"
1623+ },
1624+ "delete": {
1625+ "message": "Delete"
1626+ },
1627+ "removedPassword": {
1628+ "message": "Removed Password"
1629+ },
1630+ "deletedSend": {
1631+ "message": "Deleted Send",
1632+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1633+ },
1634+ "sendLink": {
1635+ "message": "Send link",
1636+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1637+ },
1638+ "disabled": {
1639+ "message": "Disabled"
1640+ },
1641+ "removePasswordConfirmation": {
1642+ "message": "Are you sure you want to remove the password?"
1643+ },
1644+ "deleteSend": {
1645+ "message": "Delete Send",
1646+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1647+ },
1648+ "deleteSendConfirmation": {
1649+ "message": "Are you sure you want to delete this Send?",
1650+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1651+ },
1652+ "editSend": {
1653+ "message": "Edit Send",
1654+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1655+ },
1656+ "sendTypeHeader": {
1657+ "message": "What type of Send is this?",
1658+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1659+ },
1660+ "sendNameDesc": {
1661+ "message": "A friendly name to describe this Send.",
1662+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1663+ },
1664+ "sendFileDesc": {
1665+ "message": "The file you want to send."
1666+ },
1667+ "deletionDate": {
1668+ "message": "Deletion Date"
1669+ },
1670+ "deletionDateDesc": {
1671+ "message": "The Send will be permanently deleted on the specified date and time.",
1672+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1673+ },
1674+ "expirationDate": {
1675+ "message": "Expiration Date"
1676+ },
1677+ "expirationDateDesc": {
1678+ "message": "If set, access to this Send will expire on the specified date and time.",
1679+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1680+ },
1681+ "oneDay": {
1682+ "message": "1 day"
1683+ },
1684+ "days": {
1685+ "message": "$DAYS$ days",
1686+ "placeholders": {
1687+ "days": {
1688+ "content": "$1",
1689+ "example": "2"
1690+ }
1691+ }
1692+ },
1693+ "custom": {
1694+ "message": "Custom"
1695+ },
1696+ "maximumAccessCount": {
1697+ "message": "Maximum Access Count"
1698+ },
1699+ "maximumAccessCountDesc": {
1700+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
1701+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1702+ },
1703+ "sendPasswordDesc": {
1704+ "message": "Optionally require a password for users to access this Send.",
1705+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1706+ },
1707+ "sendNotesDesc": {
1708+ "message": "Private notes about this Send.",
1709+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1710+ },
1711+ "sendDisableDesc": {
1712+ "message": "Disable this Send so that no one can access it.",
1713+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1714+ },
1715+ "sendShareDesc": {
1716+ "message": "Copy this Send's link to clipboard upon save.",
1717+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1718+ },
1719+ "sendTextDesc": {
1720+ "message": "The text you want to send."
1721+ },
1722+ "sendHideText": {
1723+ "message": "Hide this Send's text by default.",
1724+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1725+ },
1726+ "currentAccessCount": {
1727+ "message": "Current Access Count"
1728+ },
1729+ "createSend": {
1730+ "message": "Create New Send",
1731+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1732+ },
1733+ "newPassword": {
1734+ "message": "New Password"
1735+ },
1736+ "sendDisabled": {
1737+ "message": "Send Disabled",
1738+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1739+ },
1740+ "sendDisabledWarning": {
1741+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
1742+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1743+ },
1744+ "createdSend": {
1745+ "message": "Created Send",
1746+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1747+ },
1748+ "editedSend": {
1749+ "message": "Edited Send",
1750+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1751+ },
1752+ "sendLinuxChromiumFileWarning": {
1753+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
1754+ },
1755+ "sendFirefoxFileWarning": {
1756+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
1757+ },
1758+ "sendSafariFileWarning": {
1759+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
1760+ },
1761+ "sendFileCalloutHeader": {
1762+ "message": "Before you start"
1763+ },
1764+ "sendFirefoxCustomDatePopoutMessage1": {
1765+ "message": "To use a calendar style date picker",
1766+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
1767+ },
1768+ "sendFirefoxCustomDatePopoutMessage2": {
1769+ "message": "click here",
1770+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
1771+ },
1772+ "sendFirefoxCustomDatePopoutMessage3": {
1773+ "message": "to pop out your window.",
1774+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
1775+ },
1776+ "expirationDateIsInvalid": {
1777+ "message": "The expiration date provided is not valid."
1778+ },
1779+ "deletionDateIsInvalid": {
1780+ "message": "The deletion date provided is not valid."
1781+ },
1782+ "expirationDateAndTimeRequired": {
1783+ "message": "An expiration date and time are required."
1784+ },
1785+ "deletionDateAndTimeRequired": {
1786+ "message": "A deletion date and time are required."
1787+ },
1788+ "dateParsingError": {
1789+ "message": "There was an error saving your deletion and expiration dates."
1790+ },
1791+ "hideEmail": {
1792+ "message": "Hide my email address from recipients."
1793+ },
1794+ "sendOptionsPolicyInEffect": {
1795+ "message": "One or more organization policies are affecting your Send options."
1796+ },
1797+ "passwordPrompt": {
1798+ "message": "Master password re-prompt"
1799+ },
1800+ "passwordConfirmation": {
1801+ "message": "Master password confirmation"
1802+ },
1803+ "passwordConfirmationDesc": {
1804+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
1805+ },
1806+ "emailVerificationRequired": {
1807+ "message": "Email Verification Required"
1808+ },
1809+ "emailVerificationRequiredDesc": {
1810+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
1811+ },
1812+ "updatedMasterPassword": {
1813+ "message": "Updated Master Password"
1814+ },
1815+ "updateMasterPassword": {
1816+ "message": "Update Master Password"
1817+ },
1818+ "updateMasterPasswordWarning": {
1819+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
1820+ },
1821+ "resetPasswordPolicyAutoEnroll": {
1822+ "message": "Automatic Enrollment"
1823+ },
1824+ "resetPasswordAutoEnrollInviteWarning": {
1825+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
1826+ },
1827+ "selectFolder": {
1828+ "message": "Select folder..."
1829+ },
1830+ "ssoCompleteRegistration": {
1831+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
1832+ },
1833+ "hours": {
1834+ "message": "Hours"
1835+ },
1836+ "minutes": {
1837+ "message": "Minutes"
1838+ },
1839+ "vaultTimeoutPolicyInEffect": {
1840+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
1841+ "placeholders": {
1842+ "hours": {
1843+ "content": "$1",
1844+ "example": "5"
1845+ },
1846+ "minutes": {
1847+ "content": "$2",
1848+ "example": "5"
1849+ }
1850+ }
1851+ },
1852+ "vaultTimeoutTooLarge": {
1853+ "message": "Your vault timeout exceeds the restrictions set by your organization."
1854+ },
1855+ "vaultExportDisabled": {
1856+ "message": "Vault Export Disabled"
1857+ },
1858+ "personalVaultExportPolicyInEffect": {
1859+ "message": "One or more organization policies prevents you from exporting your personal vault."
1860+ },
1861+ "copyCustomFieldNameInvalidElement": {
1862+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
1863+ },
1864+ "copyCustomFieldNameNotUnique": {
1865+ "message": "No unique identifier found."
1866+ },
1867+ "convertOrganizationEncryptionDesc": {
1868+ "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.",
1869+ "placeholders": {
1870+ "organization": {
1871+ "content": "$1",
1872+ "example": "My Org Name"
1873+ }
1874+ }
1875+ },
1876+ "leaveOrganization": {
1877+ "message": "Leave Organization"
1878+ },
1879+ "removeMasterPassword": {
1880+ "message": "Remove Master Password"
1881+ },
1882+ "removedMasterPassword": {
1883+ "message": "Master password removed."
1884+ },
1885+ "leaveOrganizationConfirmation": {
1886+ "message": "Are you sure you want to leave this organization?"
1887+ },
1888+ "leftOrganization": {
1889+ "message": "You have left the organization."
1890+ },
1891+ "toggleCharacterCount": {
1892+ "message": "Toggle character count"
1893+ },
1894+ "sessionTimeout": {
1895+ "message": "Your session has timed out. Please go back and try logging in again."
1896+ },
1897+ "exportingPersonalVaultTitle": {
1898+ "message": "Exporting Personal Vault"
1899+ },
1900+ "exportingPersonalVaultDescription": {
1901+ "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.",
1902+ "placeholders": {
1903+ "email": {
1904+ "content": "$1",
1905+ "example": "name@example.com"
1906+ }
1907+ }
1908+ },
1909+ "error": {
1910+ "message": "Error"
1911+ },
1912+ "regenerateUsername": {
1913+ "message": "Regenerate Username"
1914+ },
1915+ "generateUsername": {
1916+ "message": "Generate Username"
1917+ },
1918+ "usernameType": {
1919+ "message": "Username Type"
1920+ },
1921+ "plusAddressedEmail": {
1922+ "message": "Plus Addressed Email",
1923+ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
1924+ },
1925+ "plusAddressedEmailDesc": {
1926+ "message": "Use your email provider's sub-addressing capabilities."
1927+ },
1928+ "catchallEmail": {
1929+ "message": "Catch-all Email"
1930+ },
1931+ "catchallEmailDesc": {
1932+ "message": "Use your domain's configured catch-all inbox."
1933+ },
1934+ "random": {
1935+ "message": "Random"
1936+ },
1937+ "randomWord": {
1938+ "message": "Random Word"
1939+ },
1940+ "websiteName": {
1941+ "message": "Website Name"
1942+ },
1943+ "whatWouldYouLikeToGenerate": {
1944+ "message": "What would you like to generate?"
1945+ },
1946+ "passwordType": {
1947+ "message": "Password Type"
1948+ },
1949+ "service": {
1950+ "message": "Service"
1951+ },
1952+ "forwardedEmail": {
1953+ "message": "Forwarded Email Alias"
1954+ },
1955+ "forwardedEmailDesc": {
1956+ "message": "Generate an email alias with an external forwarding service."
1957+ },
1958+ "hostname": {
1959+ "message": "Hostname",
1960+ "description": "Part of a URL."
1961+ },
1962+ "apiAccessToken": {
1963+ "message": "API Access Token"
1964+ },
1965+ "apiKey": {
1966+ "message": "API Key"
1967+ },
1968+ "ssoKeyConnectorError": {
1969+ "message": "Key Connector error: make sure Key Connector is available and working correctly."
1970+ },
1971+ "organizationIsDisabled": {
1972+ "message": "Organization is disabled."
1973+ },
1974+ "disabledOrganizationFilterError": {
1975+ "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
1976+ },
1977+ "cardBrandMir": {
1978+ "message": "Mir"
1979+ }
1980+}
apps/browser/src/_locales/az/messages.jsonnew file+1980
@@ -0,0 +1,1980 @@
1+{
2+ "appName": {
3+ "message": "Bitwarden"
4+ },
5+ "extName": {
6+ "message": "Bitwarden - Ödənişsiz Parol Meneceri",
7+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
8+ },
9+ "extDesc": {
10+ "message": "Bütün cihazlarınız üçün təhlükəsiz və ödənişsiz bir parol meneceri.",
11+ "description": "Extension description"
12+ },
13+ "loginOrCreateNewAccount": {
14+ "message": "Təhlükəsiz anbarınıza müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın."
15+ },
16+ "createAccount": {
17+ "message": "Hesab yarat"
18+ },
19+ "login": {
20+ "message": "Giriş et"
21+ },
22+ "enterpriseSingleSignOn": {
23+ "message": "Müəssisə üçün tək daxil olma"
24+ },
25+ "cancel": {
26+ "message": "İmtina"
27+ },
28+ "close": {
29+ "message": "Bağla"
30+ },
31+ "submit": {
32+ "message": "Göndər"
33+ },
34+ "emailAddress": {
35+ "message": "E-poçt ünvanı"
36+ },
37+ "masterPass": {
38+ "message": "Ana parol"
39+ },
40+ "masterPassDesc": {
41+ "message": "Ana parol, anbarınıza müraciət etmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur."
42+ },
43+ "masterPassHintDesc": {
44+ "message": "Ana parol məsləhəti, unutduğunuz parolunuzu xatırlamağınıza kömək edir."
45+ },
46+ "reTypeMasterPass": {
47+ "message": "Ana parolu yenidən yaz"
48+ },
49+ "masterPassHint": {
50+ "message": "Ana parol məsləhəti (ixtiyari)"
51+ },
52+ "tab": {
53+ "message": "Vərəq"
54+ },
55+ "vault": {
56+ "message": "Anbar"
57+ },
58+ "myVault": {
59+ "message": "Anbarım"
60+ },
61+ "allVaults": {
62+ "message": "Bütün anbarlar"
63+ },
64+ "tools": {
65+ "message": "Alətlər"
66+ },
67+ "settings": {
68+ "message": "Tənzimləmələr"
69+ },
70+ "currentTab": {
71+ "message": "Hazırkı vərəq"
72+ },
73+ "copyPassword": {
74+ "message": "Parolu kopyala"
75+ },
76+ "copyNote": {
77+ "message": "Qeydi kopyala"
78+ },
79+ "copyUri": {
80+ "message": "URI-ni kopyala"
81+ },
82+ "copyUsername": {
83+ "message": "İstifadəçi adını kopyala"
84+ },
85+ "copyNumber": {
86+ "message": "Nömrəni kopyala"
87+ },
88+ "copySecurityCode": {
89+ "message": "Təhlükəsizlik kodunu kopyala"
90+ },
91+ "autoFill": {
92+ "message": "Avto-doldurma"
93+ },
94+ "generatePasswordCopied": {
95+ "message": "Parol yarat (kopyalandı)"
96+ },
97+ "copyElementIdentifier": {
98+ "message": "Özəl sahə adını kopyala"
99+ },
100+ "noMatchingLogins": {
101+ "message": "Uyğun gələn hesab yoxdur."
102+ },
103+ "unlockVaultMenu": {
104+ "message": "Anbarın kilidini açın"
105+ },
106+ "loginToVaultMenu": {
107+ "message": "Anbarınıza giriş edin"
108+ },
109+ "autoFillInfo": {
110+ "message": "Hazırkı səyyah vərəqi üçün avto-doldurulacaq giriş məlumatları yoxdur."
111+ },
112+ "addLogin": {
113+ "message": "Hesab əlavə et"
114+ },
115+ "addItem": {
116+ "message": "Element əlavə et"
117+ },
118+ "passwordHint": {
119+ "message": "Parol məsləhəti"
120+ },
121+ "enterEmailToGetHint": {
122+ "message": "Ana parol məsləhətini alacağınız hesabınızın e-poçt ünvanını daxil edin."
123+ },
124+ "getMasterPasswordHint": {
125+ "message": "Ana parol üçün məsləhət alın"
126+ },
127+ "continue": {
128+ "message": "Davam"
129+ },
130+ "sendVerificationCode": {
131+ "message": "E-poçtunuza bir təsdiqləmə kodu göndərin"
132+ },
133+ "sendCode": {
134+ "message": "Kod göndər"
135+ },
136+ "codeSent": {
137+ "message": "Kod göndərildi"
138+ },
139+ "verificationCode": {
140+ "message": "Təsdiqləmə kodu"
141+ },
142+ "confirmIdentity": {
143+ "message": "Davam etmək üçün kimliyinizi təsdiqləyin."
144+ },
145+ "account": {
146+ "message": "Hesab"
147+ },
148+ "changeMasterPassword": {
149+ "message": "Ana parolu dəyişdir"
150+ },
151+ "fingerprintPhrase": {
152+ "message": "Barmaq izi ifadəsi",
153+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
154+ },
155+ "yourAccountsFingerprint": {
156+ "message": "Hesabınızın barmaq izi ifadəsi",
157+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
158+ },
159+ "twoStepLogin": {
160+ "message": "İki mərhələli giriş"
161+ },
162+ "logOut": {
163+ "message": "Çıxış"
164+ },
165+ "about": {
166+ "message": "Haqqında"
167+ },
168+ "version": {
169+ "message": "Versiya"
170+ },
171+ "save": {
172+ "message": "Saxla"
173+ },
174+ "move": {
175+ "message": "Daşı"
176+ },
177+ "addFolder": {
178+ "message": "Qovluq əlavə et"
179+ },
180+ "name": {
181+ "message": "Ad"
182+ },
183+ "editFolder": {
184+ "message": "Qovluğa düzəliş et"
185+ },
186+ "deleteFolder": {
187+ "message": "Qovluğu sil"
188+ },
189+ "folders": {
190+ "message": "Qovluqlar"
191+ },
192+ "noFolders": {
193+ "message": "Siyahılanacaq heç bir qovluq yoxdur."
194+ },
195+ "helpFeedback": {
196+ "message": "Kömək və əks əlaqə"
197+ },
198+ "sync": {
199+ "message": "Eyniləşdirmə"
200+ },
201+ "syncVaultNow": {
202+ "message": "Anbarı indi eyniləşdir"
203+ },
204+ "lastSync": {
205+ "message": "Son eyniləşdirmə:"
206+ },
207+ "passGen": {
208+ "message": "Parol yaradıcı"
209+ },
210+ "generator": {
211+ "message": "Yaradıcı",
212+ "description": "Short for 'Password Generator'."
213+ },
214+ "passGenInfo": {
215+ "message": "Hesablarınız üçün avtomatik olaraq güclü, unikal parollar yaradın."
216+ },
217+ "bitWebVault": {
218+ "message": "Bitwarden veb anbarı"
219+ },
220+ "importItems": {
221+ "message": "Elementləri idxal et"
222+ },
223+ "select": {
224+ "message": "Seçin"
225+ },
226+ "generatePassword": {
227+ "message": "Parol yarat"
228+ },
229+ "regeneratePassword": {
230+ "message": "Parolu yenidən yarat"
231+ },
232+ "options": {
233+ "message": "Seçimlər"
234+ },
235+ "length": {
236+ "message": "Uzunluq"
237+ },
238+ "uppercase": {
239+ "message": "Böyük hərf (A-Z)"
240+ },
241+ "lowercase": {
242+ "message": "Kiçik hərf (a-z)"
243+ },
244+ "numbers": {
245+ "message": "Rəqəmlər (0-9)"
246+ },
247+ "specialCharacters": {
248+ "message": "Xüsusi simvollar (!@#$%^&*)"
249+ },
250+ "numWords": {
251+ "message": "Söz sayı"
252+ },
253+ "wordSeparator": {
254+ "message": "Söz ayırıcı"
255+ },
256+ "capitalize": {
257+ "message": "İlk hərfi böyük yaz",
258+ "description": "Make the first letter of a work uppercase."
259+ },
260+ "includeNumber": {
261+ "message": "Rəqəm əlavə et"
262+ },
263+ "minNumbers": {
264+ "message": "Minimum rəqəm"
265+ },
266+ "minSpecial": {
267+ "message": "Minimum simvol"
268+ },
269+ "avoidAmbChar": {
270+ "message": "Anlaşılmaz simvollardan çəkinin"
271+ },
272+ "searchVault": {
273+ "message": "Anbarda axtar"
274+ },
275+ "edit": {
276+ "message": "Düzəliş et"
277+ },
278+ "view": {
279+ "message": "Bax"
280+ },
281+ "noItemsInList": {
282+ "message": "Siyahılanacaq heç bir element yoxdur."
283+ },
284+ "itemInformation": {
285+ "message": "Element məlumatları"
286+ },
287+ "username": {
288+ "message": "İstifadəçi adı"
289+ },
290+ "password": {
291+ "message": "Parol"
292+ },
293+ "passphrase": {
294+ "message": "Uzun ifadə"
295+ },
296+ "favorite": {
297+ "message": "Sevimli"
298+ },
299+ "notes": {
300+ "message": "Qeydlər"
301+ },
302+ "note": {
303+ "message": "Qeyd"
304+ },
305+ "editItem": {
306+ "message": "Elementə düzəliş et"
307+ },
308+ "folder": {
309+ "message": "Qovluq"
310+ },
311+ "deleteItem": {
312+ "message": "Elementi sil"
313+ },
314+ "viewItem": {
315+ "message": "Elementə bax"
316+ },
317+ "launch": {
318+ "message": "Başlat"
319+ },
320+ "website": {
321+ "message": "Veb sayt"
322+ },
323+ "toggleVisibility": {
324+ "message": "Görünməni aç/bağla"
325+ },
326+ "manage": {
327+ "message": "İdarə et"
328+ },
329+ "other": {
330+ "message": "Digər"
331+ },
332+ "rateExtension": {
333+ "message": "Genişləndirməni qiymətləndir"
334+ },
335+ "rateExtensionDesc": {
336+ "message": "Gözəl bir rəy ilə bizə dəstək ola bilərsiniz!"
337+ },
338+ "browserNotSupportClipboard": {
339+ "message": "Veb səyyahınız lövhəyə kopyalamağı dəstəkləmir. Əvəzində əllə kopyalayın."
340+ },
341+ "verifyIdentity": {
342+ "message": "Kimliyi təsdiqləyin"
343+ },
344+ "yourVaultIsLocked": {
345+ "message": "Anbarınız kilidlənib. Davam etmək üçün ana parolunuzu təsdiqləyin."
346+ },
347+ "unlock": {
348+ "message": "Kilidi aç"
349+ },
350+ "loggedInAsOn": {
351+ "message": "$HOSTNAME$ üzərində $EMAIL$ kimi giriş edildi.",
352+ "placeholders": {
353+ "email": {
354+ "content": "$1",
355+ "example": "name@example.com"
356+ },
357+ "hostname": {
358+ "content": "$2",
359+ "example": "bitwarden.com"
360+ }
361+ }
362+ },
363+ "invalidMasterPassword": {
364+ "message": "Etibarsız ana parol"
365+ },
366+ "vaultTimeout": {
367+ "message": "Anbara müraciət bitəcək"
368+ },
369+ "lockNow": {
370+ "message": "İndi kilidlə"
371+ },
372+ "immediately": {
373+ "message": "Dərhal"
374+ },
375+ "tenSeconds": {
376+ "message": "10 saniyə"
377+ },
378+ "twentySeconds": {
379+ "message": "20 saniyə"
380+ },
381+ "thirtySeconds": {
382+ "message": "30 saniyə"
383+ },
384+ "oneMinute": {
385+ "message": "1 dəqiqə"
386+ },
387+ "twoMinutes": {
388+ "message": "2 dəqiqə"
389+ },
390+ "fiveMinutes": {
391+ "message": "5 dəqiqə"
392+ },
393+ "fifteenMinutes": {
394+ "message": "15 dəqiqə"
395+ },
396+ "thirtyMinutes": {
397+ "message": "30 dəqiqə"
398+ },
399+ "oneHour": {
400+ "message": "1 saat"
401+ },
402+ "fourHours": {
403+ "message": "4 saat"
404+ },
405+ "onLocked": {
406+ "message": "Sistem kilidlənəndə"
407+ },
408+ "onRestart": {
409+ "message": "Səyyah yenidən başladılanda"
410+ },
411+ "never": {
412+ "message": "Heç vaxt"
413+ },
414+ "security": {
415+ "message": "Təhlükəsizlik"
416+ },
417+ "errorOccurred": {
418+ "message": "Bir xəta baş verdi"
419+ },
420+ "emailRequired": {
421+ "message": "E-poçt ünvanı lazımdır."
422+ },
423+ "invalidEmail": {
424+ "message": "Etibarsız e-poçt ünvanı."
425+ },
426+ "masterPasswordRequired": {
427+ "message": "Ana parol lazımdır."
428+ },
429+ "confirmMasterPasswordRequired": {
430+ "message": "Ana parolun yenidən yazılması lazımdır."
431+ },
432+ "masterPasswordMinlength": {
433+ "message": "Ana parol ən azı 8 simvol uzunluğunda olmalıdır."
434+ },
435+ "masterPassDoesntMatch": {
436+ "message": "Ana parol təsdiqləməsi uyğun gəlmir."
437+ },
438+ "newAccountCreated": {
439+ "message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz."
440+ },
441+ "masterPassSent": {
442+ "message": "Ana parol məsləhətini ehtiva edən bir e-poçt göndərdik."
443+ },
444+ "verificationCodeRequired": {
445+ "message": "Təsdiq kodu lazımdır."
446+ },
447+ "invalidVerificationCode": {
448+ "message": "Etibarsız təsdiqləmə kodu"
449+ },
450+ "valueCopied": {
451+ "message": "$VALUE$ kopyalandı",
452+ "description": "Value has been copied to the clipboard.",
453+ "placeholders": {
454+ "value": {
455+ "content": "$1",
456+ "example": "Password"
457+ }
458+ }
459+ },
460+ "autofillError": {
461+ "message": "Bu səhifədə seçilən element avto-doldurulmur. Əvəzində məlumatları kopyalayıb yapışdırın."
462+ },
463+ "loggedOut": {
464+ "message": "Çıxış edildi"
465+ },
466+ "loginExpired": {
467+ "message": "Seansın müddəti bitdi."
468+ },
469+ "logOutConfirmation": {
470+ "message": "Çıxış etmək istədiyinizə əminsiniz?"
471+ },
472+ "yes": {
473+ "message": "Bəli"
474+ },
475+ "no": {
476+ "message": "Xeyr"
477+ },
478+ "unexpectedError": {
479+ "message": "Gözlənilməz bir səhv baş verdi"
480+ },
481+ "nameRequired": {
482+ "message": "Ad lazımdır."
483+ },
484+ "addedFolder": {
485+ "message": "Qovluq əlavə edildi"
486+ },
487+ "changeMasterPass": {
488+ "message": "Ana parolu dəyişdir"
489+ },
490+ "changeMasterPasswordConfirmation": {
491+ "message": "Ana parolunuzu bitwarden.com veb anbarında dəyişdirə bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?"
492+ },
493+ "twoStepLoginConfirmation": {
494+ "message": "İki mərhələli giriş, təhlükəsizlik açarı, kimlik təsdiqləyici tətbiq, SMS, telefon zəngi və ya e-poçt kimi digər cihazlarla girişinizi təsdiqləməyinizi tələb edərək hesabınızı daha da təhlükəsiz edir. İki mərhələli giriş, bitwarden.com veb anbarında fəallaşdırıla bilər. Veb saytı indi ziyarət etmək istəyirsiniz?"
495+ },
496+ "editedFolder": {
497+ "message": "Qovluğa düzəliş edildi"
498+ },
499+ "deleteFolderConfirmation": {
500+ "message": "Bu qovluğu silmək istədiyinizə əminsiniz?"
501+ },
502+ "deletedFolder": {
503+ "message": "Qovluq silindi"
504+ },
505+ "gettingStartedTutorial": {
506+ "message": "Başlanğıc təlimatı"
507+ },
508+ "gettingStartedTutorialVideo": {
509+ "message": "Səyyah genişləndirməsindən necə daha yaxşı faydalanmağı öyrənmək üçün başlanğıc təlimatına baxa bilərsiniz."
510+ },
511+ "syncingComplete": {
512+ "message": "Eyniləşdirmə tamamlandı"
513+ },
514+ "syncingFailed": {
515+ "message": "Uğursuz eyniləşdirmə"
516+ },
517+ "passwordCopied": {
518+ "message": "Parol kopyalandı"
519+ },
520+ "uri": {
521+ "message": "URI"
522+ },
523+ "uriPosition": {
524+ "message": "URI $POSITION$",
525+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
526+ "placeholders": {
527+ "position": {
528+ "content": "$1",
529+ "example": "2"
530+ }
531+ }
532+ },
533+ "newUri": {
534+ "message": "Yeni URI"
535+ },
536+ "addedItem": {
537+ "message": "Element əlavə edildi"
538+ },
539+ "editedItem": {
540+ "message": "Elementə düzəliş edildi"
541+ },
542+ "deleteItemConfirmation": {
543+ "message": "Həqiqətən tullantı qutusuna göndərmək istəyirsiniz?"
544+ },
545+ "deletedItem": {
546+ "message": "Element tullantı qutusuna göndərildi"
547+ },
548+ "overwritePassword": {
549+ "message": "Parolun üzərinə yaz"
550+ },
551+ "overwritePasswordConfirmation": {
552+ "message": "Hazırkı parolun üzərinə yazmaq istədiyinizə əminsiniz?"
553+ },
554+ "overwriteUsername": {
555+ "message": "İstifadəçi adının üzərinə yaz"
556+ },
557+ "overwriteUsernameConfirmation": {
558+ "message": "Hazırkı istifadəçi adının üzərinə yazmaq istədiyinizə əminsiniz?"
559+ },
560+ "searchFolder": {
561+ "message": "Qovluq axtar"
562+ },
563+ "searchCollection": {
564+ "message": "Kolleksiya axtar"
565+ },
566+ "searchType": {
567+ "message": "Axtarış növü"
568+ },
569+ "noneFolder": {
570+ "message": "Qovluq yoxdur",
571+ "description": "This is the folder for uncategorized items"
572+ },
573+ "enableAddLoginNotification": {
574+ "message": "Giriş əlavə etmək üçün soruş"
575+ },
576+ "addLoginNotificationDesc": {
577+ "message": "\"Hesab əlavə et bildirişi\", ilk dəfə giriş edəndə yeni giriş məlumatlarını anbarda saxlamaq istəyib-istəmədiyinizi avtomatik olaraq soruşur."
578+ },
579+ "showCardsCurrentTab": {
580+ "message": "Kartları vərəq səhifəsində göstər"
581+ },
582+ "showCardsCurrentTabDesc": {
583+ "message": "Asan avto-doldurma üçün Vərəq səhifəsində kart elementlərini siyahılayın."
584+ },
585+ "showIdentitiesCurrentTab": {
586+ "message": "Vərəq səhifəsində kimlikləri göstər"
587+ },
588+ "showIdentitiesCurrentTabDesc": {
589+ "message": "Asan avto-doldurma üçün Vərəq səhifəsində kimlik elementlərini siyahılayın."
590+ },
591+ "clearClipboard": {
592+ "message": "Lövhəni təmizlə",
593+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
594+ },
595+ "clearClipboardDesc": {
596+ "message": "Kopyalanmış dəyərləri lövhədən avtomatik təmizlə.",
597+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
598+ },
599+ "notificationAddDesc": {
600+ "message": "Bitwarden sizin üçün bu parolu xatırlasın?"
601+ },
602+ "notificationAddSave": {
603+ "message": "Bəli, indi saxla"
604+ },
605+ "enableChangedPasswordNotification": {
606+ "message": "Mövcud girişin güncəllənməsini soruş"
607+ },
608+ "changedPasswordNotificationDesc": {
609+ "message": "Bir veb saytda dəyişiklik aşkarlananda giriş parolunun güncəllənməsini soruşun."
610+ },
611+ "notificationChangeDesc": {
612+ "message": "Bu parolu \"Bitwarden\"də yeniləmək istəyirsiniz?"
613+ },
614+ "notificationChangeSave": {
615+ "message": "Bəli, indi yenilə"
616+ },
617+ "enableContextMenuItem": {
618+ "message": "Konteks menyu seçimlərini göstər"
619+ },
620+ "contextMenuItemDesc": {
621+ "message": "Veb sayt üçün parol yaratmaq və uyğunlaşan giriş məlumatlarına müraciət etmək üçün ikinci klikləməni istifadə edin. "
622+ },
623+ "defaultUriMatchDetection": {
624+ "message": "İlkin URI uyğunluq aşkarlaması",
625+ "description": "Default URI match detection for auto-fill."
626+ },
627+ "defaultUriMatchDetectionDesc": {
628+ "message": "Avto-doldurma kimi əməliyyatları icra edərkən giriş etmə prosesi üçün URI uyğunluq aşkarlamasının ilkin yolunu seçin."
629+ },
630+ "theme": {
631+ "message": "Tema"
632+ },
633+ "themeDesc": {
634+ "message": "Tətbiqin rəng temasını dəyişdirin."
635+ },
636+ "dark": {
637+ "message": "Tünd",
638+ "description": "Dark color"
639+ },
640+ "light": {
641+ "message": "Açıq",
642+ "description": "Light color"
643+ },
644+ "solarizedDark": {
645+ "message": "Günəşli tünd",
646+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
647+ },
648+ "exportVault": {
649+ "message": "Anbarı ixrac et"
650+ },
651+ "fileFormat": {
652+ "message": "Fayl formatı"
653+ },
654+ "warning": {
655+ "message": "XƏBƏRDARLIQ",
656+ "description": "WARNING (should stay in capitalized letters if the language permits)"
657+ },
658+ "confirmVaultExport": {
659+ "message": "Anbarın ixracını təsdiqləyin"
660+ },
661+ "exportWarningDesc": {
662+ "message": "Bu ixrac faylındakı anbar verilənləriniz şifrələnməmiş formatdadır. İxrac edilən faylı saxlamamalı və etibarsız yollarla (e-poçt kimi) göndərməməlisiniz. Bu faylı işiniz bitdikdən sonra dərhal silin."
663+ },
664+ "encExportKeyWarningDesc": {
665+ "message": "Bu ixrac faylı, hesabınızın şifrələmə açarını istifadə edərək verilənlərinizi şifrələyir. Hesabınızın şifrələmə açarını döndərsəniz, bu ixrac faylının şifrəsini aça bilməyəcəyiniz üçün yenidən ixrac etməli olacaqsınız."
666+ },
667+ "encExportAccountWarningDesc": {
668+ "message": "Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir ixracı, fərqli bir hesaba idxal edə bilməzsiniz."
669+ },
670+ "exportMasterPassword": {
671+ "message": "Anbar verilənlərinizi ixrac etmək üçün ana parolunuzu daxil edin."
672+ },
673+ "shared": {
674+ "message": "Paylaşılan"
675+ },
676+ "learnOrg": {
677+ "message": "Təşkilatlar barədə daha ətraflı"
678+ },
679+ "learnOrgConfirmation": {
680+ "message": "Bitwarden, bir təşkilat hesabı istifadə edərək anbar elementlərinizi başqaları ilə paylaşmağınıza icazə verər. Daha ətraflı məlumat üçün bitwarden.com saytını ziyarət etmək istəyirsiniz?"
681+ },
682+ "moveToOrganization": {
683+ "message": "Təşkilata daşı"
684+ },
685+ "share": {
686+ "message": "Paylaş"
687+ },
688+ "movedItemToOrg": {
689+ "message": "$ITEMNAME$ $ORGNAME$ şirkətinə daşındı",
690+ "placeholders": {
691+ "itemname": {
692+ "content": "$1",
693+ "example": "Secret Item"
694+ },
695+ "orgname": {
696+ "content": "$2",
697+ "example": "Company Name"
698+ }
699+ }
700+ },
701+ "moveToOrgDesc": {
702+ "message": "Bu elementi daşımaq istədiyiniz təşkilatı seçin. Bir təşkilata daşımaq, elementin sahibliyini də həmin təşkilata daşıyacaq. Daşıdıqdan sonra bu elementə birbaşa sahibliyiniz olmayacaq."
703+ },
704+ "learnMore": {
705+ "message": "Daha ətraflı"
706+ },
707+ "authenticatorKeyTotp": {
708+ "message": "Kimlik təsdiqləyici açarı (TOTP)"
709+ },
710+ "verificationCodeTotp": {
711+ "message": "Təsdiqləmə kodu (TOTP)"
712+ },
713+ "copyVerificationCode": {
714+ "message": "Təsdiqləmə kodunu kopyala"
715+ },
716+ "attachments": {
717+ "message": "Qoşmalar"
718+ },
719+ "deleteAttachment": {
720+ "message": "Qoşmanı sil"
721+ },
722+ "deleteAttachmentConfirmation": {
723+ "message": "Bu qoşmanı silmək istədiyinizə əminsiniz?"
724+ },
725+ "deletedAttachment": {
726+ "message": "Qoşma silindi"
727+ },
728+ "newAttachment": {
729+ "message": "Yeni qoşma əlavə et"
730+ },
731+ "noAttachments": {
732+ "message": "Qoşma yoxdur."
733+ },
734+ "attachmentSaved": {
735+ "message": "Qoşma saxlanıldı."
736+ },
737+ "file": {
738+ "message": "Fayl"
739+ },
740+ "selectFile": {
741+ "message": "Fayl seçin."
742+ },
743+ "maxFileSize": {
744+ "message": "Maksimal fayl həcmi 500 MB-dır"
745+ },
746+ "featureUnavailable": {
747+ "message": "Özəllik əlçatmazdır"
748+ },
749+ "updateKey": {
750+ "message": "Şifrələmə açarınızı yeniləyənə qədər bu özəlliyi istifadə edə bilməzsiniz."
751+ },
752+ "premiumMembership": {
753+ "message": "Premium üzvlük"
754+ },
755+ "premiumManage": {
756+ "message": "Üzvlüyü idarə edin"
757+ },
758+ "premiumManageAlert": {
759+ "message": "Üzvlüyünüzü bitwarden.com veb anbarında idarə edə bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?"
760+ },
761+ "premiumRefresh": {
762+ "message": "Üzvlüyü təzələ"
763+ },
764+ "premiumNotCurrentMember": {
765+ "message": "Hazırda premium bir üzvlüyünüz yoxdur"
766+ },
767+ "premiumSignUpAndGet": {
768+ "message": "Premium üzvlük üçün qeydiyyatdan keçin və bunları əldə edin:"
769+ },
770+ "ppremiumSignUpStorage": {
771+ "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş saxlama sahəsi"
772+ },
773+ "ppremiumSignUpTwoStep": {
774+ "message": "YubiKey, FIDO U2F və Duo kimi iki mərhələli giriş seçimləri"
775+ },
776+ "ppremiumSignUpReports": {
777+ "message": "Anbarınızın təhlükəsiyini təmin etmək üçün parol gigiyenası, hesab sağlamlığı və verilənlərin pozulması hesabatları."
778+ },
779+ "ppremiumSignUpTotp": {
780+ "message": "Anbarınızdakı hesablar üçün TOTP təsdiqləmə kodu (2FA) yaradıcısı."
781+ },
782+ "ppremiumSignUpSupport": {
783+ "message": "Prioritet müştəri dəstəyi."
784+ },
785+ "ppremiumSignUpFuture": {
786+ "message": "Bütün gələcək premium özəlliklər. Daha çoxu tezliklə!"
787+ },
788+ "premiumPurchase": {
789+ "message": "Premium satın al"
790+ },
791+ "premiumPurchaseAlert": {
792+ "message": "Premium üzvlüyü bitwarden.com veb anbarında satın ala bilərsiniz. İndi saytı ziyarət etmək istəyirsiniz?"
793+ },
794+ "premiumCurrentMember": {
795+ "message": "Premium üzvsünüz!"
796+ },
797+ "premiumCurrentMemberThanks": {
798+ "message": "Bitwarden-i dəstəklədiyiniz üçün təşəkkürlər!"
799+ },
800+ "premiumPrice": {
801+ "message": "Hamısı sadəcə ildə $PRICE$!",
802+ "placeholders": {
803+ "price": {
804+ "content": "$1",
805+ "example": "$10"
806+ }
807+ }
808+ },
809+ "refreshComplete": {
810+ "message": "Təzələmə tamamlandı"
811+ },
812+ "enableAutoTotpCopy": {
813+ "message": "TOTP-ni avtomatik kopyala"
814+ },
815+ "disableAutoTotpCopyDesc": {
816+ "message": "Hesabınıza əlavə edilən kimlik təsdiqləyici açarı varsa, giriş məlumatları avto-doldurulanda TOTP təsdiqləmə kodu da avtomatik olaraq lövhəyə kopyalanacaq."
817+ },
818+ "enableAutoBiometricsPrompt": {
819+ "message": "Açılışda biometrik təsdiqləmə soruş"
820+ },
821+ "premiumRequired": {
822+ "message": "Premium üzvlük lazımdır"
823+ },
824+ "premiumRequiredDesc": {
825+ "message": "Bu özəlliyi istifadə etmək üçün premium üzvlük lazımdır."
826+ },
827+ "enterVerificationCodeApp": {
828+ "message": "Kimlik təsdiqləyici tətbiqindən 6 rəqəmli təsdiqləmə kodunu daxil edin."
829+ },
830+ "enterVerificationCodeEmail": {
831+ "message": "$EMAIL$ ünvanına göndərilən e-poçtdakı 6 rəqəmli təsdiqləmə kodunu daxil edin.",
832+ "placeholders": {
833+ "email": {
834+ "content": "$1",
835+ "example": "example@gmail.com"
836+ }
837+ }
838+ },
839+ "verificationCodeEmailSent": {
840+ "message": "Təsdiqləmə poçtu $EMAIL$ ünvanına göndərildi.",
841+ "placeholders": {
842+ "email": {
843+ "content": "$1",
844+ "example": "example@gmail.com"
845+ }
846+ }
847+ },
848+ "rememberMe": {
849+ "message": "Məni xatırla"
850+ },
851+ "sendVerificationCodeEmailAgain": {
852+ "message": "Təsdiqləmə kodu olan e-poçtu yenidən göndər"
853+ },
854+ "useAnotherTwoStepMethod": {
855+ "message": "Başqa bir iki mərhələli giriş metodu istifadə edin"
856+ },
857+ "insertYubiKey": {
858+ "message": "\"YubiKey\"i kompüterinizin USB portuna taxın, daha sonra düyməsinə toxunun."
859+ },
860+ "insertU2f": {
861+ "message": "Təhlükəsizlik açarını kompüterinizin USB portun taxın. Düyməsi varsa toxunun."
862+ },
863+ "webAuthnNewTab": {
864+ "message": "WebAuthn 2FA təsdiqləməsini başladın. Yeni bir vərəq açmaq üçün aşağıdakı düyməyə klikləyin və yeni vərəqdəki təlimatları izləyin."
865+ },
866+ "webAuthnNewTabOpen": {
867+ "message": "Yeni vərəq aç"
868+ },
869+ "webAuthnAuthenticate": {
870+ "message": "WebAuthn təsdiqləmə"
871+ },
872+ "loginUnavailable": {
873+ "message": "Giriş edilə bilmir"
874+ },
875+ "noTwoStepProviders": {
876+ "message": "Bu hesabın iki mərhələli giriş özəlliyi fəaldır, ancaq, konfiqurasiya edilmiş iki mərhələli təchizatçıların heç biri bu səyyah tərəfindən dəstəklənmir."
877+ },
878+ "noTwoStepProviders2": {
879+ "message": "Zəhmət olmasa (Chrome kimi) dəstəklənən bir veb səyyah istifadə edin və/və ya veb səyyahlara (kimlik təsdiqləyici tətbiq kimi) daha yaxşı dəstəklənən təchizatçılar əlavə edin."
880+ },
881+ "twoStepOptions": {
882+ "message": "İki mərhələli giriş seçimləri"
883+ },
884+ "recoveryCodeDesc": {
885+ "message": "İki mərhələli təsdiqləmə təchizatçılarına müraciəti itirmisiniz? Bərpa kodunuzu istifadə edərək hesabınızdakı bütün iki mərhələli təchizatçıları sıradan çıxara bilərsiniz."
886+ },
887+ "recoveryCodeTitle": {
888+ "message": "Bərpa kodu"
889+ },
890+ "authenticatorAppTitle": {
891+ "message": "Kimlik təsdiqləyici tətbiqi"
892+ },
893+ "authenticatorAppDesc": {
894+ "message": "Vaxt əsaslı təsdiqləmə kodları yaratmaq üçün (Authy və ya Google Authenticator kimi) kimlik təsdiqləyici tətbiq istifadə edin.",
895+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
896+ },
897+ "yubiKeyTitle": {
898+ "message": "YubiKey OTP təhlükəsizlik açarı"
899+ },
900+ "yubiKeyDesc": {
901+ "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir."
902+ },
903+ "duoDesc": {
904+ "message": "Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.",
905+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
906+ },
907+ "duoOrganizationDesc": {
908+ "message": "Təşkilatınızını Duo Security ilə təsdiqləmək üçün Duo Mobile tətbiqi, SMS, telefon zəngi və ya U2F təhlükəsizlik açarını istifadə edin.",
909+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
910+ },
911+ "webAuthnTitle": {
912+ "message": "FIDO2 WebAuthn"
913+ },
914+ "webAuthnDesc": {
915+ "message": "Hesabınıza müraciət etmək üçün hər hansısa bir WebAuthn fəallaşdırılan təhlükəsizlik açarı istifadə edin."
916+ },
917+ "emailTitle": {
918+ "message": "E-poçt"
919+ },
920+ "emailDesc": {
921+ "message": "Təsdiqləmə kodları e-poçt ünvanınıza göndəriləcək."
922+ },
923+ "selfHostedEnvironment": {
924+ "message": "Öz-özünə sahiblik edən mühit"
925+ },
926+ "selfHostedEnvironmentFooter": {
927+ "message": "Öz-özünə sahiblik edən Bitwarden quraşdırmasının baza URL-sini müəyyənləşdirin."
928+ },
929+ "customEnvironment": {
930+ "message": "Özəl mühit"
931+ },
932+ "customEnvironmentFooter": {
933+ "message": "Qabaqcıl istifadəçilər üçündür. Hər xidmətin baza URL-sini müstəqil olaraq müəyyənləşdirə bilərsiniz."
934+ },
935+ "baseUrl": {
936+ "message": "Server URL-si"
937+ },
938+ "apiUrl": {
939+ "message": "API server URL-si"
940+ },
941+ "webVaultUrl": {
942+ "message": "Veb anbar server URL-si"
943+ },
944+ "identityUrl": {
945+ "message": "Kimlik server URL-si"
946+ },
947+ "notificationsUrl": {
948+ "message": "Bildiriş server URL-si"
949+ },
950+ "iconsUrl": {
951+ "message": "Nişan server URL-si"
952+ },
953+ "environmentSaved": {
954+ "message": "Mühit URL-ləri saxlanıldı."
955+ },
956+ "enableAutoFillOnPageLoad": {
957+ "message": "Səhifə yüklənəndə avto-doldurmanı fəallaşdır"
958+ },
959+ "enableAutoFillOnPageLoadDesc": {
960+ "message": "Giriş formu aşkarlananda, səhifə yüklənən zaman formu avto-doldurma icra edilsin."
961+ },
962+ "experimentalFeature": {
963+ "message": "Bu, hazırda təcrübi bir özəllikdir. İstifadə zamanı riski sizə aiddir."
964+ },
965+ "defaultAutoFillOnPageLoad": {
966+ "message": "Giriş məlumatları üçün ilkin avto-doldurma tənzimləməsi"
967+ },
968+ "defaultAutoFillOnPageLoadDesc": {
969+ "message": "\"Səhifə yüklənəndə avto-doldur\"u fəal etdikdən sonra, fərdi giriş elementləri üçün özəlliyi fəallaşdıra və ya sıradan çıxarda bilərsiniz. Bu ayrı-ayrı konfiqurasiya edilməmiş giriş elementləri üçün ilkin tənzimləmədir."
970+ },
971+ "itemAutoFillOnPageLoad": {
972+ "message": "Səhifə yüklənəndə avto-doldur (Seçimlərdə fəallaşdırılıbsa)"
973+ },
974+ "autoFillOnPageLoadUseDefault": {
975+ "message": "İlkin tənzimləməni istifadə et"
976+ },
977+ "autoFillOnPageLoadYes": {
978+ "message": "Səhifə yüklənəndə avto-doldur"
979+ },
980+ "autoFillOnPageLoadNo": {
981+ "message": "Səhifə yüklənəndə avto-doldurma"
982+ },
983+ "commandOpenPopup": {
984+ "message": "Anbar açılan pəncərədə aç"
985+ },
986+ "commandOpenSidebar": {
987+ "message": "Anbar yan sətirdə aç"
988+ },
989+ "commandAutofillDesc": {
990+ "message": "Hazırkı veb sayt üçün son istifadə edilən giriş məlumatlarını avto-doldur"
991+ },
992+ "commandGeneratePasswordDesc": {
993+ "message": "Təsadüfi yeni bir parol yarat və lövhəyə kopyala"
994+ },
995+ "commandLockVaultDesc": {
996+ "message": "Anbarı kilidlə"
997+ },
998+ "privateModeWarning": {
999+ "message": "Gizli rejim dəstəyi təcrübidir və bəzi özəlliklər limitlidir."
1000+ },
1001+ "customFields": {
1002+ "message": "Özəl sahələr"
1003+ },
1004+ "copyValue": {
1005+ "message": "Dəyəri kopyala"
1006+ },
1007+ "value": {
1008+ "message": "Dəyər"
1009+ },
1010+ "newCustomField": {
1011+ "message": "Yeni özəl sahə"
1012+ },
1013+ "dragToSort": {
1014+ "message": "Sıralamaq üçün sürüşdürün"
1015+ },
1016+ "cfTypeText": {
1017+ "message": "Mətn"
1018+ },
1019+ "cfTypeHidden": {
1020+ "message": "Gizli"
1021+ },
1022+ "cfTypeBoolean": {
1023+ "message": "Boolean"
1024+ },
1025+ "cfTypeLinked": {
1026+ "message": "Əlaqə yaradıldı",
1027+ "description": "This describes a field that is 'linked' (tied) to another field."
1028+ },
1029+ "linkedValue": {
1030+ "message": "Əlaqəli dəyər",
1031+ "description": "This describes a value that is 'linked' (tied) to another value."
1032+ },
1033+ "popup2faCloseMessage": {
1034+ "message": "Təsdiqləmə kodunu alacağınız e-poçtu yoxlamaq üçün bu pəncərə xaricində bir yerə klikləsəniz bu pəncərə bağlanacaq. Bu pəncərənin bağlanmaması üçün yeni bir pəncərədə açmaq istəyirsiniz?"
1035+ },
1036+ "popupU2fCloseMessage": {
1037+ "message": "Bu səyyah bu açılan pəncərədə U2F tələblərini emal edə bilmir. U2F istifadə edərək giriş etmək üçün bu açılan pəncərəni yeni bir pəncərədə açmaq istəyirsiniz?"
1038+ },
1039+ "enableFavicon": {
1040+ "message": "Veb sayt nişanlarını göstər"
1041+ },
1042+ "faviconDesc": {
1043+ "message": "Hər girişin yanında tanına bilən təsvir göstər."
1044+ },
1045+ "enableBadgeCounter": {
1046+ "message": "Nişan sayğacını göstər"
1047+ },
1048+ "badgeCounterDesc": {
1049+ "message": "Hazırkı veb səhifə üçün neçə giriş olduğunu göstərir."
1050+ },
1051+ "cardholderName": {
1052+ "message": "Kart sahibinin adı"
1053+ },
1054+ "number": {
1055+ "message": "Nömrə"
1056+ },
1057+ "brand": {
1058+ "message": "Brend"
1059+ },
1060+ "expirationMonth": {
1061+ "message": "Son istifadə ayı"
1062+ },
1063+ "expirationYear": {
1064+ "message": "Son istifadə ili"
1065+ },
1066+ "expiration": {
1067+ "message": "Bitmə vaxtı"
1068+ },
1069+ "january": {
1070+ "message": "Yanvar"
1071+ },
1072+ "february": {
1073+ "message": "Fevral"
1074+ },
1075+ "march": {
1076+ "message": "Mart"
1077+ },
1078+ "april": {
1079+ "message": "Aprel"
1080+ },
1081+ "may": {
1082+ "message": "May"
1083+ },
1084+ "june": {
1085+ "message": "İyun"
1086+ },
1087+ "july": {
1088+ "message": "İyul"
1089+ },
1090+ "august": {
1091+ "message": "Avqust"
1092+ },
1093+ "september": {
1094+ "message": "Sentyabr"
1095+ },
1096+ "october": {
1097+ "message": "Oktyabr"
1098+ },
1099+ "november": {
1100+ "message": "Noyabr"
1101+ },
1102+ "december": {
1103+ "message": "Dekabr"
1104+ },
1105+ "securityCode": {
1106+ "message": "Təhlükəsizlik kodu"
1107+ },
1108+ "ex": {
1109+ "message": "məs."
1110+ },
1111+ "title": {
1112+ "message": "Başlıq"
1113+ },
1114+ "mr": {
1115+ "message": "Cənab"
1116+ },
1117+ "mrs": {
1118+ "message": "Xanım"
1119+ },
1120+ "ms": {
1121+ "message": "Hörmətli"
1122+ },
1123+ "dr": {
1124+ "message": "Dr"
1125+ },
1126+ "firstName": {
1127+ "message": "Ad"
1128+ },
1129+ "middleName": {
1130+ "message": "Orta ad"
1131+ },
1132+ "lastName": {
1133+ "message": "Soyad"
1134+ },
1135+ "fullName": {
1136+ "message": "Tam ad"
1137+ },
1138+ "identityName": {
1139+ "message": "Kimlik adı"
1140+ },
1141+ "company": {
1142+ "message": "Şirkət"
1143+ },
1144+ "ssn": {
1145+ "message": "Sosial təhlükəsizlik nömrəsi"
1146+ },
1147+ "passportNumber": {
1148+ "message": "Pasport nömrəsi"
1149+ },
1150+ "licenseNumber": {
1151+ "message": "Lisenziya nömrəsi"
1152+ },
1153+ "email": {
1154+ "message": "E-poçt"
1155+ },
1156+ "phone": {
1157+ "message": "Telefon"
1158+ },
1159+ "address": {
1160+ "message": "Ünvan"
1161+ },
1162+ "address1": {
1163+ "message": "Ünvan 1"
1164+ },
1165+ "address2": {
1166+ "message": "Ünvan 2"
1167+ },
1168+ "address3": {
1169+ "message": "Ünvan 3"
1170+ },
1171+ "cityTown": {
1172+ "message": "Şəhər/Rayon"
1173+ },
1174+ "stateProvince": {
1175+ "message": "Ölkə/Əyalət"
1176+ },
1177+ "zipPostalCode": {
1178+ "message": "Zip/ Poçt kodu"
1179+ },
1180+ "country": {
1181+ "message": "Ölkə"
1182+ },
1183+ "type": {
1184+ "message": "Növ"
1185+ },
1186+ "typeLogin": {
1187+ "message": "Giriş"
1188+ },
1189+ "typeLogins": {
1190+ "message": "Girişlər"
1191+ },
1192+ "typeSecureNote": {
1193+ "message": "Təhlükəsizlik qeydi"
1194+ },
1195+ "typeCard": {
1196+ "message": "Kart"
1197+ },
1198+ "typeIdentity": {
1199+ "message": "Kimlik"
1200+ },
1201+ "passwordHistory": {
1202+ "message": "Parol tarixçəsi"
1203+ },
1204+ "back": {
1205+ "message": "Geri"
1206+ },
1207+ "collections": {
1208+ "message": "Kolleksiyalar"
1209+ },
1210+ "favorites": {
1211+ "message": "Sevimlilər"
1212+ },
1213+ "popOutNewWindow": {
1214+ "message": "Yeni bir pəncərədə aç"
1215+ },
1216+ "refresh": {
1217+ "message": "Təzələ"
1218+ },
1219+ "cards": {
1220+ "message": "Kartlar"
1221+ },
1222+ "identities": {
1223+ "message": "Kimliklər"
1224+ },
1225+ "logins": {
1226+ "message": "Girişlər"
1227+ },
1228+ "secureNotes": {
1229+ "message": "Təhlükəsizlik qeydləri"
1230+ },
1231+ "clear": {
1232+ "message": "Təmizlə",
1233+ "description": "To clear something out. example: To clear browser history."
1234+ },
1235+ "checkPassword": {
1236+ "message": "Parolunuzun oğurlanıb oğurlanmadığını yoxlayın."
1237+ },
1238+ "passwordExposed": {
1239+ "message": "Bu parol, məlumat pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.",
1240+ "placeholders": {
1241+ "value": {
1242+ "content": "$1",
1243+ "example": "2"
1244+ }
1245+ }
1246+ },
1247+ "passwordSafe": {
1248+ "message": "Bu parol, məlumat pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz."
1249+ },
1250+ "baseDomain": {
1251+ "message": "Baza domeni",
1252+ "description": "Domain name. Ex. website.com"
1253+ },
1254+ "domainName": {
1255+ "message": "Domen adı",
1256+ "description": "Domain name. Ex. website.com"
1257+ },
1258+ "host": {
1259+ "message": "Host",
1260+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
1261+ },
1262+ "exact": {
1263+ "message": "Tam"
1264+ },
1265+ "startsWith": {
1266+ "message": "Başlayır"
1267+ },
1268+ "regEx": {
1269+ "message": "Müntəzəm ifadə",
1270+ "description": "A programming term, also known as 'RegEx'."
1271+ },
1272+ "matchDetection": {
1273+ "message": "Uyğunluq aşkarlaması",
1274+ "description": "URI match detection for auto-fill."
1275+ },
1276+ "defaultMatchDetection": {
1277+ "message": "İlkin uyğunluq aşkarlaması",
1278+ "description": "Default URI match detection for auto-fill."
1279+ },
1280+ "toggleOptions": {
1281+ "message": "Seçimləri aç/bağla"
1282+ },
1283+ "toggleCurrentUris": {
1284+ "message": "Hazırkı URI-ləri aç/bağla",
1285+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
1286+ },
1287+ "currentUri": {
1288+ "message": "Hazırkı URI",
1289+ "description": "The URI of one of the current open tabs in the browser."
1290+ },
1291+ "organization": {
1292+ "message": "Təşkilat",
1293+ "description": "An entity of multiple related people (ex. a team or business organization)."
1294+ },
1295+ "types": {
1296+ "message": "Növlər"
1297+ },
1298+ "allItems": {
1299+ "message": "Bütün elementlər"
1300+ },
1301+ "noPasswordsInList": {
1302+ "message": "Siyahılanacaq heç bir parol yoxdur."
1303+ },
1304+ "remove": {
1305+ "message": "Çıxart"
1306+ },
1307+ "default": {
1308+ "message": "İlkin"
1309+ },
1310+ "dateUpdated": {
1311+ "message": "Yeniləndi",
1312+ "description": "ex. Date this item was updated"
1313+ },
1314+ "datePasswordUpdated": {
1315+ "message": "Parol yeniləndi",
1316+ "description": "ex. Date this password was updated"
1317+ },
1318+ "neverLockWarning": {
1319+ "message": "\"Heç vaxt\" seçimini istifadə etmək istədiyinizə əminsiniz? Kilid seçimini \"Heç vaxt\" olaraq tənzimləsəniz, anbarınızın şifrələmə açarı cihazınızda saxlanılacaq. Bu seçimi istifadə etsəniz, cihazınızı daha yaxşı mühafizə etməlisiniz."
1320+ },
1321+ "noOrganizationsList": {
1322+ "message": "Heç bir təşkilata aid deyilsiniz. Təşkilatlar, elementlərinizi digər istifadəçilərlə təhlükəsiz şəkildə paylaşmağınızı təmin edir."
1323+ },
1324+ "noCollectionsInList": {
1325+ "message": "Siyahılanacaq heç bir kolleksiya yoxdur."
1326+ },
1327+ "ownership": {
1328+ "message": "Sahiblik"
1329+ },
1330+ "whoOwnsThisItem": {
1331+ "message": "Bu elementin sahibi kimdir?"
1332+ },
1333+ "strong": {
1334+ "message": "Güclü",
1335+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
1336+ },
1337+ "good": {
1338+ "message": "Yaxşı",
1339+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
1340+ },
1341+ "weak": {
1342+ "message": "Zəif",
1343+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
1344+ },
1345+ "weakMasterPassword": {
1346+ "message": "Zəif ana parol"
1347+ },
1348+ "weakMasterPasswordDesc": {
1349+ "message": "Seçdiyiniz ana parol zəifdir. Bitwarden hesabınızı daha yaxşı qorumaq üçün güclü bir ana parol (və ya uzun ifadə) istifadə etməlisiniz. Bu ana parol istifadə etmək istədiyinizə əminsiniz?"
1350+ },
1351+ "pin": {
1352+ "message": "PIN",
1353+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
1354+ },
1355+ "unlockWithPin": {
1356+ "message": "PIN ilə kilidi açın"
1357+ },
1358+ "setYourPinCode": {
1359+ "message": "Bitwarden-in kilidini açmaq üçün PIN kod tənzimləyin. Hər tətbiqdən tam çıxış edəndə PIN tənzimləmələriniz sıfırlanacaq."
1360+ },
1361+ "pinRequired": {
1362+ "message": "PIN kod lazımdır."
1363+ },
1364+ "invalidPin": {
1365+ "message": "Etibarsız PIN kod."
1366+ },
1367+ "unlockWithBiometrics": {
1368+ "message": "Biometriklərlə kilidi açın"
1369+ },
1370+ "awaitDesktop": {
1371+ "message": "Masaüstündən təsdiq gözlənilir"
1372+ },
1373+ "awaitDesktopDesc": {
1374+ "message": "Səyyah üçün biometrikləri fəallaşdırmaq üçün zəhmət olmasa Bitwarden masaüstü tətbiqində biometrik istifadəsini təsdiqləyin."
1375+ },
1376+ "lockWithMasterPassOnRestart": {
1377+ "message": "Səyyah yenidən başladılanda ana parol ilə kilidlə"
1378+ },
1379+ "selectOneCollection": {
1380+ "message": "Ən azı bir kolleksiya seçməlisiniz."
1381+ },
1382+ "cloneItem": {
1383+ "message": "Elementi klonla"
1384+ },
1385+ "clone": {
1386+ "message": "Klonla"
1387+ },
1388+ "passwordGeneratorPolicyInEffect": {
1389+ "message": "Bir və ya daha çox təşkilat siyasətləri yaradıcı seçimlərinizə təsir edir."
1390+ },
1391+ "vaultTimeoutAction": {
1392+ "message": "Anbara müraciət vaxtının bitmə əməliyyatı"
1393+ },
1394+ "lock": {
1395+ "message": "Kilidlə",
1396+ "description": "Verb form: to make secure or inaccesible by"
1397+ },
1398+ "trash": {
1399+ "message": "Tullantı qutusu",
1400+ "description": "Noun: a special folder to hold deleted items"
1401+ },
1402+ "searchTrash": {
1403+ "message": "Tullantı qutusunda axtar"
1404+ },
1405+ "permanentlyDeleteItem": {
1406+ "message": "Elementi birdəfəlik sil"
1407+ },
1408+ "permanentlyDeleteItemConfirmation": {
1409+ "message": "Bu elementi birdəfəlik silmək istədiyinizə əminsiniz?"
1410+ },
1411+ "permanentlyDeletedItem": {
1412+ "message": "Element birdəfəlik silindi"
1413+ },
1414+ "restoreItem": {
1415+ "message": "Elementi bərpa et"
1416+ },
1417+ "restoreItemConfirmation": {
1418+ "message": "Elementi bərpa etmək istədiyinizə əminsiniz?"
1419+ },
1420+ "restoredItem": {
1421+ "message": "Element bərpa edildi"
1422+ },
1423+ "vaultTimeoutLogOutConfirmation": {
1424+ "message": "Çıxış edəndə, anbarınıza bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik təsdiqləməsi tələb olunacaq. Bu tənzimləməni istifadə etmək istədiyinizə əminsiniz?"
1425+ },
1426+ "vaultTimeoutLogOutConfirmationTitle": {
1427+ "message": "Vaxt bitmə əməliyyat təsdiqi"
1428+ },
1429+ "autoFillAndSave": {
1430+ "message": "Avto-doldur və saxla"
1431+ },
1432+ "autoFillSuccessAndSavedUri": {
1433+ "message": "Element avto-dolduruldu və URI saxlanıldı"
1434+ },
1435+ "autoFillSuccess": {
1436+ "message": "Element avto-dolduruldu"
1437+ },
1438+ "setMasterPassword": {
1439+ "message": "Ana parolu tənzimlə"
1440+ },
1441+ "masterPasswordPolicyInEffect": {
1442+ "message": "Bir və ya daha çox təşkilat siyasəti, aşağıdakı tələbləri qarşılamaq üçün ana parolunuzu tələb edir:"
1443+ },
1444+ "policyInEffectMinComplexity": {
1445+ "message": "Minimum mürəkkəblik xalı: $SCORE$",
1446+ "placeholders": {
1447+ "score": {
1448+ "content": "$1",
1449+ "example": "4"
1450+ }
1451+ }
1452+ },
1453+ "policyInEffectMinLength": {
1454+ "message": "Minimum uzunluq: $LENGTH$",
1455+ "placeholders": {
1456+ "length": {
1457+ "content": "$1",
1458+ "example": "14"
1459+ }
1460+ }
1461+ },
1462+ "policyInEffectUppercase": {
1463+ "message": "Bir və ya daha çox böyük hərf ehtiva etməlidir"
1464+ },
1465+ "policyInEffectLowercase": {
1466+ "message": "Bir və ya daha çox kiçik hərf ehtiva etməlidir"
1467+ },
1468+ "policyInEffectNumbers": {
1469+ "message": "Bir və ya daha çox rəqəm ehtiva etməlidir"
1470+ },
1471+ "policyInEffectSpecial": {
1472+ "message": "Bu özəl simvollardan biri və ya daha çoxunu ehtiva etməlidir: $CHARS$",
1473+ "placeholders": {
1474+ "chars": {
1475+ "content": "$1",
1476+ "example": "!@#$%^&*"
1477+ }
1478+ }
1479+ },
1480+ "masterPasswordPolicyRequirementsNotMet": {
1481+ "message": "Yeni ana parolunuz siyasət tələblərini qarşılamır."
1482+ },
1483+ "acceptPolicies": {
1484+ "message": "Bu qutunu işarələyərək aşağıdakılarla razılaşırsınız:"
1485+ },
1486+ "acceptPoliciesRequired": {
1487+ "message": "Xidmət Şərtləri və Gizlilik Siyasəti qəbul edilməyib."
1488+ },
1489+ "termsOfService": {
1490+ "message": "Xidmət Şərtləri"
1491+ },
1492+ "privacyPolicy": {
1493+ "message": "Gizlilik Siyasəti"
1494+ },
1495+ "hintEqualsPassword": {
1496+ "message": "Parol məsləhəti, parolunuzla eyni ola bilməz."
1497+ },
1498+ "ok": {
1499+ "message": "Oldu"
1500+ },
1501+ "desktopSyncVerificationTitle": {
1502+ "message": "Masaüstü eyniləşdirmə təsdiqləməsi"
1503+ },
1504+ "desktopIntegrationVerificationText": {
1505+ "message": "Zəhmət olmasa masaüstü tətbiqin bu barmaq izini gördüyünü təsdiqləyin:"
1506+ },
1507+ "desktopIntegrationDisabledTitle": {
1508+ "message": "Səyyah inteqrasiyası fəal deyil"
1509+ },
1510+ "desktopIntegrationDisabledDesc": {
1511+ "message": "Səyyah inteqrasiyası Bitwarden masaüstü tətbiqində fəal deyil. Zəhmət olmasa masaüstü tətbiqinin tənzimləmələrində fəallaşdırın."
1512+ },
1513+ "startDesktopTitle": {
1514+ "message": "Bitwarden masaüstü tətbiqini başlat"
1515+ },
1516+ "startDesktopDesc": {
1517+ "message": "Bu funksiyanın istifadə edilə bilməsi üçün Bitwarden masaüstü tətbiqi başladılmalıdır."
1518+ },
1519+ "errorEnableBiometricTitle": {
1520+ "message": "Biometriklər fəallaşdırıla bilmədi"
1521+ },
1522+ "errorEnableBiometricDesc": {
1523+ "message": "Əməliyyat, masaüstü tətbiqi tərəfindən ləğv edildi"
1524+ },
1525+ "nativeMessagingInvalidEncryptionDesc": {
1526+ "message": "Masaüstü tətbiqi, təhlükəsiz rabitə kanalını qüvvədən saldı. Bu əməliyyatı yenidən icra edin"
1527+ },
1528+ "nativeMessagingInvalidEncryptionTitle": {
1529+ "message": "Masaüstü rabitə əlaqəsi kəsildi"
1530+ },
1531+ "nativeMessagingWrongUserDesc": {
1532+ "message": "Masaüstü tətbiqdə fərqli bir hesabla giriş edilib. Hər iki tətbiqin eyni hesabla giriş etdiyinə əmin olun."
1533+ },
1534+ "nativeMessagingWrongUserTitle": {
1535+ "message": "Hesablar uyğunlaşmır"
1536+ },
1537+ "biometricsNotEnabledTitle": {
1538+ "message": "Biometriklə fəal deyil"
1539+ },
1540+ "biometricsNotEnabledDesc": {
1541+ "message": "Səyyah biometrikləri, əvvəlcə tənzimləmələrdə masaüstü biometriklərinin fəallaşdırılmasını tələb edir."
1542+ },
1543+ "biometricsNotSupportedTitle": {
1544+ "message": "Biometriklər dəstəklənmir"
1545+ },
1546+ "biometricsNotSupportedDesc": {
1547+ "message": "Səyyah biometrikləri bu cihazda dəstəklənmir"
1548+ },
1549+ "nativeMessaginPermissionErrorTitle": {
1550+ "message": "İcazə verilmədi"
1551+ },
1552+ "nativeMessaginPermissionErrorDesc": {
1553+ "message": "Bitwarden masaüstü tətbiqi ilə əlaqə qurma icazəsi olmadan, səyyah genişləndirməsində biometrikləri təmin edə bilmərik. Zəhmət olmasa yenidən sınayın."
1554+ },
1555+ "nativeMessaginPermissionSidebarTitle": {
1556+ "message": "İcazə tələb xətası"
1557+ },
1558+ "nativeMessaginPermissionSidebarDesc": {
1559+ "message": "Bu əməliyyatı yan sətirdən edə bilməzsiniz. Zəhmət olmasa açılan pəncərədə yenidən cəhd edin."
1560+ },
1561+ "personalOwnershipSubmitError": {
1562+ "message": "Müəssisə Siyasətinə görə, elementləri şəxsi anbarınızda saxlamağınız məhdudlaşdırılıb. Sahiblik seçimini təşkilat olaraq dəyişdirin və mövcud kolleksiyalar arasından seçim edin."
1563+ },
1564+ "personalOwnershipPolicyInEffect": {
1565+ "message": "Bir təşkilat siyasəti, sahiblik seçimlərinizə təsir edir."
1566+ },
1567+ "excludedDomains": {
1568+ "message": "İstisna edilən domenlər"
1569+ },
1570+ "excludedDomainsDesc": {
1571+ "message": "Bitwarden bu domenlər üçün giriş təfsilatlarını saxlamağı soruşmayacaq. Dəyişikliklərin təsirli olması üçün səhifəni təzələməlisiniz."
1572+ },
1573+ "excludedDomainsInvalidDomain": {
1574+ "message": "$DOMAIN$ etibarlı bir domen deyil",
1575+ "placeholders": {
1576+ "domain": {
1577+ "content": "$1",
1578+ "example": "googlecom"
1579+ }
1580+ }
1581+ },
1582+ "send": {
1583+ "message": "Send",
1584+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1585+ },
1586+ "searchSends": {
1587+ "message": "\"Send\"ləri axtar",
1588+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1589+ },
1590+ "addSend": {
1591+ "message": "\"Send\" əlavə et",
1592+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1593+ },
1594+ "sendTypeText": {
1595+ "message": "Mətn"
1596+ },
1597+ "sendTypeFile": {
1598+ "message": "Fayl"
1599+ },
1600+ "allSends": {
1601+ "message": "Bütün \"Send\"lər",
1602+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1603+ },
1604+ "maxAccessCountReached": {
1605+ "message": "Maksimal müraciət sayına çatıldı",
1606+ "description": "This text will be displayed after a Send has been accessed the maximum amount of times."
1607+ },
1608+ "expired": {
1609+ "message": "Müddəti bitib"
1610+ },
1611+ "pendingDeletion": {
1612+ "message": "Silinməsi gözlənilir"
1613+ },
1614+ "passwordProtected": {
1615+ "message": "Parolla qorunan"
1616+ },
1617+ "copySendLink": {
1618+ "message": "\"Send\" bağlantısını kopyala",
1619+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1620+ },
1621+ "removePassword": {
1622+ "message": "Parolu çıxart"
1623+ },
1624+ "delete": {
1625+ "message": "Sil"
1626+ },
1627+ "removedPassword": {
1628+ "message": "Parol çıxarıldı"
1629+ },
1630+ "deletedSend": {
1631+ "message": "Send silindi",
1632+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1633+ },
1634+ "sendLink": {
1635+ "message": "\"Send\" bağlantısı",
1636+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1637+ },
1638+ "disabled": {
1639+ "message": "Sıradan çıxarıldı"
1640+ },
1641+ "removePasswordConfirmation": {
1642+ "message": "Parolu çıxartmaq istədiyinizə əminsiniz?"
1643+ },
1644+ "deleteSend": {
1645+ "message": "\"Send\"i sil",
1646+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1647+ },
1648+ "deleteSendConfirmation": {
1649+ "message": "Bu \"Send\"i silmək istədiyinizə əminsiniz?",
1650+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1651+ },
1652+ "editSend": {
1653+ "message": "\"Send\"ə düzəliş et",
1654+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1655+ },
1656+ "sendTypeHeader": {
1657+ "message": "\"Send\"in növü nədir?",
1658+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1659+ },
1660+ "sendNameDesc": {
1661+ "message": "Bu \"Send\"i açıqlayan bir ad.",
1662+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1663+ },
1664+ "sendFileDesc": {
1665+ "message": "Göndərmək istədiyiniz fayl."
1666+ },
1667+ "deletionDate": {
1668+ "message": "Silinmə tarixi"
1669+ },
1670+ "deletionDateDesc": {
1671+ "message": "\"Send\" göstərilən tarix və saatda birdəfəlik silinəcək.",
1672+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1673+ },
1674+ "expirationDate": {
1675+ "message": "Bitmə tarixi"
1676+ },
1677+ "expirationDateDesc": {
1678+ "message": "Əgər tənzimlənsə, göstərilən tarix və vaxtda \"Send\"ə müraciət başa çatacaq.",
1679+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1680+ },
1681+ "oneDay": {
1682+ "message": "1 gün"
1683+ },
1684+ "days": {
1685+ "message": "$DAYS$ gün",
1686+ "placeholders": {
1687+ "days": {
1688+ "content": "$1",
1689+ "example": "2"
1690+ }
1691+ }
1692+ },
1693+ "custom": {
1694+ "message": "Özəl"
1695+ },
1696+ "maximumAccessCount": {
1697+ "message": "Maksimal müraciət sayı"
1698+ },
1699+ "maximumAccessCountDesc": {
1700+ "message": "Əgər tənzimlənsə, istifadəçilər maksimal müraciət sayına çatdıqdan sonra bu \"Send\"ə müraciət edə bilməyəcək.",
1701+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1702+ },
1703+ "sendPasswordDesc": {
1704+ "message": "İstəyinizə görə istifadəçilərdən bu \"Send\"ə müraciət edərkən parol tələb edə bilərsiniz.",
1705+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1706+ },
1707+ "sendNotesDesc": {
1708+ "message": "Bu \"Send\" ilə bağlı gizli qeydlər.",
1709+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1710+ },
1711+ "sendDisableDesc": {
1712+ "message": "Heç kimin müraciət edə bilməməsi üçün bu \"Send\"i sıradan çıxart.",
1713+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1714+ },
1715+ "sendShareDesc": {
1716+ "message": "Saxladıqdan sonra \"Send\"in bağlantısını lövhəyə kopyala.",
1717+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1718+ },
1719+ "sendTextDesc": {
1720+ "message": "Göndərmək istədiyiniz mətn"
1721+ },
1722+ "sendHideText": {
1723+ "message": "Bu \"Send\"in mətnini ilkin olaraq gizlət",
1724+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1725+ },
1726+ "currentAccessCount": {
1727+ "message": "Hazırkı müraciət sayı"
1728+ },
1729+ "createSend": {
1730+ "message": "Yeni \"Send\" yarat",
1731+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1732+ },
1733+ "newPassword": {
1734+ "message": "Yeni parol"
1735+ },
1736+ "sendDisabled": {
1737+ "message": "Send sıradan çıxarıldı",
1738+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1739+ },
1740+ "sendDisabledWarning": {
1741+ "message": "Müəssisə siyasətinə görə, yalnız mövcud \"Send\"i silə bilərsiniz.",
1742+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1743+ },
1744+ "createdSend": {
1745+ "message": "Send yaradıldı",
1746+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1747+ },
1748+ "editedSend": {
1749+ "message": "\"Send\"ə düzəliş edildi",
1750+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1751+ },
1752+ "sendLinuxChromiumFileWarning": {
1753+ "message": "Fayl seçmək üçün (mümkünsə) genişləndirməni yan sətirdə açın və ya bu bannerə klikləyərək yeni bir pəncərədə açın."
1754+ },
1755+ "sendFirefoxFileWarning": {
1756+ "message": "Firefox istifadə edərək fayl seçmək üçün genişləndirməni yan sətirdə açın və ya bu bannerə klikləyərək yeni bir pəncərədə açın."
1757+ },
1758+ "sendSafariFileWarning": {
1759+ "message": "Safari istifadə edərək fayl seçmək üçün bu bannerə klikləyərək yeni bir pəncərədə açın."
1760+ },
1761+ "sendFileCalloutHeader": {
1762+ "message": "Başlamazdan əvvəl"
1763+ },
1764+ "sendFirefoxCustomDatePopoutMessage1": {
1765+ "message": "Təqvim stilində tarix seçici istifadə etmək üçün",
1766+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
1767+ },
1768+ "sendFirefoxCustomDatePopoutMessage2": {
1769+ "message": "bura klikləyin",
1770+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
1771+ },
1772+ "sendFirefoxCustomDatePopoutMessage3": {
1773+ "message": "yeni bir pəncərə açın.",
1774+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
1775+ },
1776+ "expirationDateIsInvalid": {
1777+ "message": "Göstərilən son istifadə tarixi etibarsızdır."
1778+ },
1779+ "deletionDateIsInvalid": {
1780+ "message": "Göstərilən silinmə tarixi etibarsızdır."
1781+ },
1782+ "expirationDateAndTimeRequired": {
1783+ "message": "Son istifadə tarixi və vaxtı lazımdır."
1784+ },
1785+ "deletionDateAndTimeRequired": {
1786+ "message": "Silinmə tarixi və vaxtı lazımdır."
1787+ },
1788+ "dateParsingError": {
1789+ "message": "Silinmə və son istifadə tarixlərini saxlayarkən xəta baş verdi."
1790+ },
1791+ "hideEmail": {
1792+ "message": "E-poçt ünvanımı alıcılardan gizlət."
1793+ },
1794+ "sendOptionsPolicyInEffect": {
1795+ "message": "Bir və ya daha çox təşkilat siyasətləri \"Send\" seçimlərinizə təsir edir."
1796+ },
1797+ "passwordPrompt": {
1798+ "message": "Ana parolu təkrar soruş"
1799+ },
1800+ "passwordConfirmation": {
1801+ "message": "Ana parol təsdiqi"
1802+ },
1803+ "passwordConfirmationDesc": {
1804+ "message": "Bu əməliyyat qorumalıdır, davam etmək üçün zəhmət olmasa kimliyinizi təsdiqləmək üçün ana parolunuzu təkrar daxil edin."
1805+ },
1806+ "emailVerificationRequired": {
1807+ "message": "E-poçt təsdiqləməsi tələb olunur"
1808+ },
1809+ "emailVerificationRequiredDesc": {
1810+ "message": "Bu özəlliyi istifadə etmək üçün e-poçtunuzu təsdiqləməlisiniz. E-poçtunuzu veb anbarında təsdiqləyə bilərsiniz."
1811+ },
1812+ "updatedMasterPassword": {
1813+ "message": "Yenilənmiş ana parol"
1814+ },
1815+ "updateMasterPassword": {
1816+ "message": "Ana parolu yenilə"
1817+ },
1818+ "updateMasterPasswordWarning": {
1819+ "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Anbara müraciət üçün indi yeniləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər."
1820+ },
1821+ "resetPasswordPolicyAutoEnroll": {
1822+ "message": "Avtomatik qeydiyyat"
1823+ },
1824+ "resetPasswordAutoEnrollInviteWarning": {
1825+ "message": "Bu təşkilat, sizi \"parol sıfırlama\"da avtomatik olaraq qeydiyyata alan müəssisə siyasətinə sahibdir. Qeydiyyat, təşkilat administratorlarına ana parolunuzu dəyişdirmə icazəsi verəcək."
1826+ },
1827+ "selectFolder": {
1828+ "message": "Qovluq seçin..."
1829+ },
1830+ "ssoCompleteRegistration": {
1831+ "message": "SSO ilə giriş prosesini tamamlamaq üçün zəhmət olmasa anbarınıza müraciət etmək və onu qorumaq üçün bir ana parol tənzimləyin."
1832+ },
1833+ "hours": {
1834+ "message": "Saat"
1835+ },
1836+ "minutes": {
1837+ "message": "Dəqiqə"
1838+ },
1839+ "vaultTimeoutPolicyInEffect": {
1840+ "message": "Təşkilatınızın siyasətləri, anbarınızın vaxt bitişinə təsir edir. Anbar vaxt bitişi üçün icazə verilən maksimum vaxt $HOURS$ saat $MINUTES$ dəqiqədir",
1841+ "placeholders": {
1842+ "hours": {
1843+ "content": "$1",
1844+ "example": "5"
1845+ },
1846+ "minutes": {
1847+ "content": "$2",
1848+ "example": "5"
1849+ }
1850+ }
1851+ },
1852+ "vaultTimeoutTooLarge": {
1853+ "message": "Anbar vaxt bitişi, təşkilatınız tərəfindən tənzimlənən məhdudiyyətləri aşır."
1854+ },
1855+ "vaultExportDisabled": {
1856+ "message": "Anbar ixracı sıradan çıxarıldı"
1857+ },
1858+ "personalVaultExportPolicyInEffect": {
1859+ "message": "Bir və ya daha çox təşkilat siyasəti, fərdi anbarınızı ixrac etməyinizin qarşısını alır."
1860+ },
1861+ "copyCustomFieldNameInvalidElement": {
1862+ "message": "Etibarlı form elementi müəyyənləşdirilə bilmir. Bunun əvəzinə HTML-i nəzərdən keçirməyi sınayın."
1863+ },
1864+ "copyCustomFieldNameNotUnique": {
1865+ "message": "Unikal identifikator tapılmadı."
1866+ },
1867+ "convertOrganizationEncryptionDesc": {
1868+ "message": "$ORGANIZATION$, öz-özünə sahiblik edən açar serveri ilə SSO istifadə edir. Bu təşkilatın üzvlərinin giriş etməsi üçün artıq ana parol tələb edilməyəcək.",
1869+ "placeholders": {
1870+ "organization": {
1871+ "content": "$1",
1872+ "example": "My Org Name"
1873+ }
1874+ }
1875+ },
1876+ "leaveOrganization": {
1877+ "message": "Təşkilatı tərk et"
1878+ },
1879+ "removeMasterPassword": {
1880+ "message": "Ana parolu sil"
1881+ },
1882+ "removedMasterPassword": {
1883+ "message": "Ana parol silindi."
1884+ },
1885+ "leaveOrganizationConfirmation": {
1886+ "message": "Bu təşkilatı tərk etmək istədiyinizə əminsiniz?"
1887+ },
1888+ "leftOrganization": {
1889+ "message": "Təşkilatı tərk etdiniz."
1890+ },
1891+ "toggleCharacterCount": {
1892+ "message": "Simvol sayını dəyişdir"
1893+ },
1894+ "sessionTimeout": {
1895+ "message": "Seansınızın vaxtı bitdi. Zəhmət olmasa geri qayıdıb yenidən giriş etməyə cəhd edin."
1896+ },
1897+ "exportingPersonalVaultTitle": {
1898+ "message": "Şəxsi anbarın ixracı"
1899+ },
1900+ "exportingPersonalVaultDescription": {
1901+ "message": "Yalnız $EMAIL$ ilə əlaqəli şəxsi anbar elementləri ixrac ediləcək. Təşkilat anbar elementləri daxil edilmir.",
1902+ "placeholders": {
1903+ "email": {
1904+ "content": "$1",
1905+ "example": "name@example.com"
1906+ }
1907+ }
1908+ },
1909+ "error": {
1910+ "message": "Xəta"
1911+ },
1912+ "regenerateUsername": {
1913+ "message": "İstifadəçi adını yenidən yarat"
1914+ },
1915+ "generateUsername": {
1916+ "message": "İstifadəçi adı yarat"
1917+ },
1918+ "usernameType": {
1919+ "message": "İstifadəçi adı növü"
1920+ },
1921+ "plusAddressedEmail": {
1922+ "message": "Plyus ünvanlı e-poçt",
1923+ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
1924+ },
1925+ "plusAddressedEmailDesc": {
1926+ "message": "E-poçt təchizatçınızın alt ünvan özəlliklərini istifadə et."
1927+ },
1928+ "catchallEmail": {
1929+ "message": "Catch-all E-poçt"
1930+ },
1931+ "catchallEmailDesc": {
1932+ "message": "Domeninizin konfiqurasiya edilmiş hamısını yaxalama gələn qutusunu istifadə edin."
1933+ },
1934+ "random": {
1935+ "message": "Təsadüfi"
1936+ },
1937+ "randomWord": {
1938+ "message": "Təsadüfi söz"
1939+ },
1940+ "websiteName": {
1941+ "message": "Veb sayt adı"
1942+ },
1943+ "whatWouldYouLikeToGenerate": {
1944+ "message": "Nə yaratmaq istəyirsiniz?"
1945+ },
1946+ "passwordType": {
1947+ "message": "Parol növü"
1948+ },
1949+ "service": {
1950+ "message": "Xidmət"
1951+ },
1952+ "forwardedEmail": {
1953+ "message": "Yönləndirilən e-poçt ləqəbi"
1954+ },
1955+ "forwardedEmailDesc": {
1956+ "message": "Xarici yönləndirmə xidməti ilə e-poçt ləqəbi yaradın."
1957+ },
1958+ "hostname": {
1959+ "message": "Host adı",
1960+ "description": "Part of a URL."
1961+ },
1962+ "apiAccessToken": {
1963+ "message": "API müraciət tokeni"
1964+ },
1965+ "apiKey": {
1966+ "message": "API açar"
1967+ },
1968+ "ssoKeyConnectorError": {
1969+ "message": "Açar bağlayıcı xətası: Açar Bağlayıcının mövcud olduğuna və düzgün işlədiyinə əmin olun."
1970+ },
1971+ "organizationIsDisabled": {
1972+ "message": "Təşkilat sıradan çıxarıldı."
1973+ },
1974+ "disabledOrganizationFilterError": {
1975+ "message": "Sıradan çıxarılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın."
1976+ },
1977+ "cardBrandMir": {
1978+ "message": "Mir"
1979+ }
1980+}
apps/browser/src/_locales/be/messages.jsonnew file+1980
@@ -0,0 +1,1980 @@
1+{
2+ "appName": {
3+ "message": "Bitwarden"
4+ },
5+ "extName": {
6+ "message": "Bitwarden – бясплатны менеджар пароляў",
7+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
8+ },
9+ "extDesc": {
10+ "message": "Бяспечны і бясплатны менеджар пароляў для ўсіх вашых прылад.",
11+ "description": "Extension description"
12+ },
13+ "loginOrCreateNewAccount": {
14+ "message": "Увайдзіце або стварыце новы ўліковы запіс для доступу да бяспечнага сховішча."
15+ },
16+ "createAccount": {
17+ "message": "Стварыць уліковы запіс"
18+ },
19+ "login": {
20+ "message": "Увайсці"
21+ },
22+ "enterpriseSingleSignOn": {
23+ "message": "Адзіны ўваход у карпаратыўную сістэму (SSO)."
24+ },
25+ "cancel": {
26+ "message": "Скасаваць"
27+ },
28+ "close": {
29+ "message": "Закрыць"
30+ },
31+ "submit": {
32+ "message": "Адправіць"
33+ },
34+ "emailAddress": {
35+ "message": "Адрас эл. пошты"
36+ },
37+ "masterPass": {
38+ "message": "Асноўны пароль"
39+ },
40+ "masterPassDesc": {
41+ "message": "Асноўны пароль — ключ да вашага бяспечнага сховішча. Ён вельмі важны, таму не забывайце яго. Аднавіць асноўны пароль немагчыма."
42+ },
43+ "masterPassHintDesc": {
44+ "message": "Падказка да асноўнага пароля можа дапамагчы вам яго ўспомніць."
45+ },
46+ "reTypeMasterPass": {
47+ "message": "Увядзіце асноўны пароль паўторна"
48+ },
49+ "masterPassHint": {
50+ "message": "Падказка да асноўнага пароля (неабавязкова)"
51+ },
52+ "tab": {
53+ "message": "Укладка"
54+ },
55+ "vault": {
56+ "message": "Vault"
57+ },
58+ "myVault": {
59+ "message": "Маё сховішча"
60+ },
61+ "allVaults": {
62+ "message": "All Vaults"
63+ },
64+ "tools": {
65+ "message": "Інструменты"
66+ },
67+ "settings": {
68+ "message": "Налады"
69+ },
70+ "currentTab": {
71+ "message": "Бягучая ўкладка"
72+ },
73+ "copyPassword": {
74+ "message": "Капіяваць пароль"
75+ },
76+ "copyNote": {
77+ "message": "Капіяваць нататку"
78+ },
79+ "copyUri": {
80+ "message": "Капіяваць URI"
81+ },
82+ "copyUsername": {
83+ "message": "Капіяваць імя карыстальніка"
84+ },
85+ "copyNumber": {
86+ "message": "Капіяваць нумар"
87+ },
88+ "copySecurityCode": {
89+ "message": "Капіяваць код бяспекі"
90+ },
91+ "autoFill": {
92+ "message": "Аўтазапаўненне"
93+ },
94+ "generatePasswordCopied": {
95+ "message": "Стварыць пароль (з капіяваннем)"
96+ },
97+ "copyElementIdentifier": {
98+ "message": "Copy Custom Field Name"
99+ },
100+ "noMatchingLogins": {
101+ "message": "Няма падыходных уліковых даных."
102+ },
103+ "unlockVaultMenu": {
104+ "message": "Unlock your vault"
105+ },
106+ "loginToVaultMenu": {
107+ "message": "Log in to your vault"
108+ },
109+ "autoFillInfo": {
110+ "message": "Няма ўліковых даных, даступных для аўтазапаўнення ў бягучую ўкладку браўзера."
111+ },
112+ "addLogin": {
113+ "message": "Дадаць ўліковыя даныя"
114+ },
115+ "addItem": {
116+ "message": "Дадаць элемент"
117+ },
118+ "passwordHint": {
119+ "message": "Падказка да пароля"
120+ },
121+ "enterEmailToGetHint": {
122+ "message": "Увядзіце адрас электроннай пошты ўліковага запісу для атрымання падказкі для асноўнага пароля."
123+ },
124+ "getMasterPasswordHint": {
125+ "message": "Атрымаць падказку для асноўнага пароля"
126+ },
127+ "continue": {
128+ "message": "Працягнуць"
129+ },
130+ "sendVerificationCode": {
131+ "message": "Send a verification code to your email"
132+ },
133+ "sendCode": {
134+ "message": "Send Code"
135+ },
136+ "codeSent": {
137+ "message": "Code Sent"
138+ },
139+ "verificationCode": {
140+ "message": "Код праверкі"
141+ },
142+ "confirmIdentity": {
143+ "message": "Confirm your identity to continue."
144+ },
145+ "account": {
146+ "message": "Уліковы запіс"
147+ },
148+ "changeMasterPassword": {
149+ "message": "Змяніць асноўны пароль"
150+ },
151+ "fingerprintPhrase": {
152+ "message": "Фраза адбітка пальца",
153+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
154+ },
155+ "yourAccountsFingerprint": {
156+ "message": "Фраза адбітка пальца вашага ўліковага запісу",
157+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
158+ },
159+ "twoStepLogin": {
160+ "message": "Двухэтапны ўваход"
161+ },
162+ "logOut": {
163+ "message": "Выйсці"
164+ },
165+ "about": {
166+ "message": "Пра Bitwarden"
167+ },
168+ "version": {
169+ "message": "Версія"
170+ },
171+ "save": {
172+ "message": "Захаваць"
173+ },
174+ "move": {
175+ "message": "Перамясціць"
176+ },
177+ "addFolder": {
178+ "message": "Дадаць папку"
179+ },
180+ "name": {
181+ "message": "Назва"
182+ },
183+ "editFolder": {
184+ "message": "Рэдагаваць папку"
185+ },
186+ "deleteFolder": {
187+ "message": "Выдаліць папку"
188+ },
189+ "folders": {
190+ "message": "Папкі"
191+ },
192+ "noFolders": {
193+ "message": "Няма элементаў для паказу."
194+ },
195+ "helpFeedback": {
196+ "message": "Даведка і зваротная сувязь"
197+ },
198+ "sync": {
199+ "message": "Сінхранізаваць"
200+ },
201+ "syncVaultNow": {
202+ "message": "Сінхранізаваць сховішча зараз"
203+ },
204+ "lastSync": {
205+ "message": "Апошняя сінхранізацыя:"
206+ },
207+ "passGen": {
208+ "message": "Генератар пароляў"
209+ },
210+ "generator": {
211+ "message": "Згенерыраваць",
212+ "description": "Short for 'Password Generator'."
213+ },
214+ "passGenInfo": {
215+ "message": "Аўтаматычна ствараць моцныя, унікальныя паролі для вашых уліковых даных."
216+ },
217+ "bitWebVault": {
218+ "message": "Вэб-сховішча Bitwarden"
219+ },
220+ "importItems": {
221+ "message": "Імпарт элементаў"
222+ },
223+ "select": {
224+ "message": "Выбраць"
225+ },
226+ "generatePassword": {
227+ "message": "Стварыць пароль"
228+ },
229+ "regeneratePassword": {
230+ "message": "Стварыць новы пароль"
231+ },
232+ "options": {
233+ "message": "Параметры"
234+ },
235+ "length": {
236+ "message": "Даўжыня"
237+ },
238+ "uppercase": {
239+ "message": "Uppercase (A-Z)"
240+ },
241+ "lowercase": {
242+ "message": "Lowercase (a-z)"
243+ },
244+ "numbers": {
245+ "message": "Numbers (0-9)"
246+ },
247+ "specialCharacters": {
248+ "message": "Special Characters (!@#$%^&*)"
249+ },
250+ "numWords": {
251+ "message": "Колькасць слоў"
252+ },
253+ "wordSeparator": {
254+ "message": "Раздзяляльнік слоў"
255+ },
256+ "capitalize": {
257+ "message": "З вялікай літары",
258+ "description": "Make the first letter of a work uppercase."
259+ },
260+ "includeNumber": {
261+ "message": "Уключыць лічбу"
262+ },
263+ "minNumbers": {
264+ "message": "Мін. колькасць лічбаў"
265+ },
266+ "minSpecial": {
267+ "message": "Мін. колькасць сімвалаў"
268+ },
269+ "avoidAmbChar": {
270+ "message": "Пазбягаць неадназначных сімвалаў"
271+ },
272+ "searchVault": {
273+ "message": "Пошук у сховішчы"
274+ },
275+ "edit": {
276+ "message": "Рэдагаваць"
277+ },
278+ "view": {
279+ "message": "Выгляд"
280+ },
281+ "noItemsInList": {
282+ "message": "Няма элементаў для паказу."
283+ },
284+ "itemInformation": {
285+ "message": "Звесткі аб элеменце"
286+ },
287+ "username": {
288+ "message": "Імя карыстальніка"
289+ },
290+ "password": {
291+ "message": "Пароль"
292+ },
293+ "passphrase": {
294+ "message": "Парольная фраза"
295+ },
296+ "favorite": {
297+ "message": "Абраны"
298+ },
299+ "notes": {
300+ "message": "Нататкі"
301+ },
302+ "note": {
303+ "message": "Нататкі"
304+ },
305+ "editItem": {
306+ "message": "Рэдагаванне элемента"
307+ },
308+ "folder": {
309+ "message": "Папка"
310+ },
311+ "deleteItem": {
312+ "message": "Выдаліць элемент"
313+ },
314+ "viewItem": {
315+ "message": "Прагляд элемента"
316+ },
317+ "launch": {
318+ "message": "Запусціць"
319+ },
320+ "website": {
321+ "message": "Вэб-сайт"
322+ },
323+ "toggleVisibility": {
324+ "message": "Пераключыць бачнасць"
325+ },
326+ "manage": {
327+ "message": "Кіраваць"
328+ },
329+ "other": {
330+ "message": "Iншае"
331+ },
332+ "rateExtension": {
333+ "message": "Ацаніць пашырэнне"
334+ },
335+ "rateExtensionDesc": {
336+ "message": "Падумайце аб тым, каб дапамагчы нам, напісаўшы добрым водгукам!"
337+ },
338+ "browserNotSupportClipboard": {
339+ "message": "Ваш вэб-браўзер не падтрымлівае капіяванне даных у буфер абмену. Скапіюйце іх уручную."
340+ },
341+ "verifyIdentity": {
342+ "message": "Verify Identity"
343+ },
344+ "yourVaultIsLocked": {
345+ "message": "Ваша сховішча заблакіравана. Каб працягнуць, увядзіце асноўны пароль."
346+ },
347+ "unlock": {
348+ "message": "Разблакіраваць"
349+ },
350+ "loggedInAsOn": {
351+ "message": "Выкананы ўваход на $HOSTNAME$ як $EMAIL$.",
352+ "placeholders": {
353+ "email": {
354+ "content": "$1",
355+ "example": "name@example.com"
356+ },
357+ "hostname": {
358+ "content": "$2",
359+ "example": "bitwarden.com"
360+ }
361+ }
362+ },
363+ "invalidMasterPassword": {
364+ "message": "Памылковы асноўны пароль"
365+ },
366+ "vaultTimeout": {
367+ "message": "Тайм-аўт сховішча"
368+ },
369+ "lockNow": {
370+ "message": "Заблакіраваць зараз"
371+ },
372+ "immediately": {
373+ "message": "Адразу"
374+ },
375+ "tenSeconds": {
376+ "message": "10 секунд"
377+ },
378+ "twentySeconds": {
379+ "message": "20 секунд"
380+ },
381+ "thirtySeconds": {
382+ "message": "30 секунд"
383+ },
384+ "oneMinute": {
385+ "message": "1 хвіліна"
386+ },
387+ "twoMinutes": {
388+ "message": "2 хвіліны"
389+ },
390+ "fiveMinutes": {
391+ "message": "5 хвілін"
392+ },
393+ "fifteenMinutes": {
394+ "message": "15 хвілін"
395+ },
396+ "thirtyMinutes": {
397+ "message": "30 хвілін"
398+ },
399+ "oneHour": {
400+ "message": "1 гадзіна"
401+ },
402+ "fourHours": {
403+ "message": "4 гадзіны"
404+ },
405+ "onLocked": {
406+ "message": "Разам з камп'ютарам"
407+ },
408+ "onRestart": {
409+ "message": "Пры перазапуску браўзера"
410+ },
411+ "never": {
412+ "message": "Ніколі"
413+ },
414+ "security": {
415+ "message": "Бяспека"
416+ },
417+ "errorOccurred": {
418+ "message": "Адбылася памылка"
419+ },
420+ "emailRequired": {
421+ "message": "Патрабуецца адрас электроннай пошты."
422+ },
423+ "invalidEmail": {
424+ "message": "Памылковы адрас электроннай пошты."
425+ },
426+ "masterPasswordRequired": {
427+ "message": "Master password is required."
428+ },
429+ "confirmMasterPasswordRequired": {
430+ "message": "Master password retype is required."
431+ },
432+ "masterPasswordMinlength": {
433+ "message": "Master password must be at least 8 characters long."
434+ },
435+ "masterPassDoesntMatch": {
436+ "message": "Асноўныя паролі не супадаюць."
437+ },
438+ "newAccountCreated": {
439+ "message": "Ваш уліковы запіс створаны! Вы можаце ўвайсці."
440+ },
441+ "masterPassSent": {
442+ "message": "Мы адправілі вам на электронную пошту падказку для асноўнага пароля."
443+ },
444+ "verificationCodeRequired": {
445+ "message": "Патрабуецца код праверкі."
446+ },
447+ "invalidVerificationCode": {
448+ "message": "Invalid verification code"
449+ },
450+ "valueCopied": {
451+ "message": "$VALUE$ скапіяваны(-а)",
452+ "description": "Value has been copied to the clipboard.",
453+ "placeholders": {
454+ "value": {
455+ "content": "$1",
456+ "example": "Password"
457+ }
458+ }
459+ },
460+ "autofillError": {
461+ "message": "Не ўдаецца аўтаматычна запоўніць выбраны элемент на гэтай старонцы. Скапіюйце і ўстаўце інфармацыю ўручную."
462+ },
463+ "loggedOut": {
464+ "message": "Вы выйшлі са сховішча"
465+ },
466+ "loginExpired": {
467+ "message": "Скончыўся тэрмін дзеяння вашага сеансу."
468+ },
469+ "logOutConfirmation": {
470+ "message": "Вы ўпэўнены, што хочаце выйсці?"
471+ },
472+ "yes": {
473+ "message": "Так"
474+ },
475+ "no": {
476+ "message": "Не"
477+ },
478+ "unexpectedError": {
479+ "message": "Адбылася нечаканая памылка."
480+ },
481+ "nameRequired": {
482+ "message": "Патрэбна назва."
483+ },
484+ "addedFolder": {
485+ "message": "Папка дададзена"
486+ },
487+ "changeMasterPass": {
488+ "message": "Змяніць асноўны пароль"
489+ },
490+ "changeMasterPasswordConfirmation": {
491+ "message": "Вы можаце змяніць свой асноўны пароль на bitwarden.com. Перайсці на сайт зараз?"
492+ },
493+ "twoStepLoginConfirmation": {
494+ "message": "Двухэтапны ўваход робіць ваш уліковы запіс больш бяспечным, патрабуючы пацвярджэння ўваходу на іншай прыладзе, напрыклад, ключом бяспекі, праграмай для праверкі бяспекі, SMS, тэлефонным выклікам або электроннай поштай. Двухэтапны ўваход уключаецца на bitwarden.com. Перайсці на сайт зараз?"
495+ },
496+ "editedFolder": {
497+ "message": "Папка адрэдагавана"
498+ },
499+ "deleteFolderConfirmation": {
500+ "message": "Вы ўпэўнены, што хочаце выдаліць гэту папку?"
501+ },
502+ "deletedFolder": {
503+ "message": "Папка выдалена"
504+ },
505+ "gettingStartedTutorial": {
506+ "message": "Дапаможнік па пачатку працы"
507+ },
508+ "gettingStartedTutorialVideo": {
509+ "message": "Праглядзіце невялікі навучальны матэрыял, каб даведацца. як атрымаць максімальную аддачу ад пашырэння браўзера."
510+ },
511+ "syncingComplete": {
512+ "message": "Сінхранізацыя завершана"
513+ },
514+ "syncingFailed": {
515+ "message": "Памылка сінхранізацыі"
516+ },
517+ "passwordCopied": {
518+ "message": "Пароль скапіяваны"
519+ },
520+ "uri": {
521+ "message": "URI"
522+ },
523+ "uriPosition": {
524+ "message": "URI $POSITION$",
525+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
526+ "placeholders": {
527+ "position": {
528+ "content": "$1",
529+ "example": "2"
530+ }
531+ }
532+ },
533+ "newUri": {
534+ "message": "Новы URI"
535+ },
536+ "addedItem": {
537+ "message": "Элемент дададзены"
538+ },
539+ "editedItem": {
540+ "message": "Элемент адрэдагаваны"
541+ },
542+ "deleteItemConfirmation": {
543+ "message": "Вы ўпэўнены, што хочаце выдаліць гэты элемент?"
544+ },
545+ "deletedItem": {
546+ "message": "Выдалены элемент"
547+ },
548+ "overwritePassword": {
549+ "message": "Перазапісаць пароль"
550+ },
551+ "overwritePasswordConfirmation": {
552+ "message": "Вы ўпэўнены, што хочаце перазапісаць бягучы пароль?"
553+ },
554+ "overwriteUsername": {
555+ "message": "Overwrite Username"
556+ },
557+ "overwriteUsernameConfirmation": {
558+ "message": "Are you sure you want to overwrite the current username?"
559+ },
560+ "searchFolder": {
561+ "message": "Пошук у папцы"
562+ },
563+ "searchCollection": {
564+ "message": "Пошук у калекцыі"
565+ },
566+ "searchType": {
567+ "message": "Пошук па тыпу"
568+ },
569+ "noneFolder": {
570+ "message": "Без папкі",
571+ "description": "This is the folder for uncategorized items"
572+ },
573+ "enableAddLoginNotification": {
574+ "message": "Ask to add login"
575+ },
576+ "addLoginNotificationDesc": {
577+ "message": "Апавяшчэнне аб даданні ўліковых даных аўтаматычна прапануе вам захаваць новыя ўліковыя даныя ў сховішчы."
578+ },
579+ "showCardsCurrentTab": {
580+ "message": "Show cards on Tab page"
581+ },
582+ "showCardsCurrentTabDesc": {
583+ "message": "List card items on the Tab page for easy auto-fill."
584+ },
585+ "showIdentitiesCurrentTab": {
586+ "message": "Show identities on Tab page"
587+ },
588+ "showIdentitiesCurrentTabDesc": {
589+ "message": "List identity items on the Tab page for easy auto-fill."
590+ },
591+ "clearClipboard": {
592+ "message": "Ачыстка буфера абмену",
593+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
594+ },
595+ "clearClipboardDesc": {
596+ "message": "Аўтаматычна ачышчаць скапіяваныя значэнні з вашага буфера абмену.",
597+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
598+ },
599+ "notificationAddDesc": {
600+ "message": "Ці павінен Bitwarden запомніць гэты пароль?"
601+ },
602+ "notificationAddSave": {
603+ "message": "Так, захаваць зараз"
604+ },
605+ "enableChangedPasswordNotification": {
606+ "message": "Ask to update existing login"
607+ },
608+ "changedPasswordNotificationDesc": {
609+ "message": "Ask to update a login's password when a change is detected on a website."
610+ },
611+ "notificationChangeDesc": {
612+ "message": "Вы хочаце абнавіць гэты пароль у Bitwarden?"
613+ },
614+ "notificationChangeSave": {
615+ "message": "Так, абнавіць зараз"
616+ },
617+ "enableContextMenuItem": {
618+ "message": "Show context menu options"
619+ },
620+ "contextMenuItemDesc": {
621+ "message": "Use a secondary click to access password generation and matching logins for the website. "
622+ },
623+ "defaultUriMatchDetection": {
624+ "message": "Выяўленне супадзення URI па змаўчанні",
625+ "description": "Default URI match detection for auto-fill."
626+ },
627+ "defaultUriMatchDetectionDesc": {
628+ "message": "Выберыце спосаб па змаўчанні, які выкарыстоўваецца пры вызначэнні адпаведнасці URI для ўліковых даных пры выкананні такіх дзеянняў, як аўтаматычнае запаўненне."
629+ },
630+ "theme": {
631+ "message": "Тэма"
632+ },
633+ "themeDesc": {
634+ "message": "Змена колеравай тэмы праграмы."
635+ },
636+ "dark": {
637+ "message": "Цёмная",
638+ "description": "Dark color"
639+ },
640+ "light": {
641+ "message": "Светлая",
642+ "description": "Light color"
643+ },
644+ "solarizedDark": {
645+ "message": "Цёмная Solarized",
646+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
647+ },
648+ "exportVault": {
649+ "message": "Экспарт сховішча"
650+ },
651+ "fileFormat": {
652+ "message": "Фармат файла"
653+ },
654+ "warning": {
655+ "message": "УВАГА",
656+ "description": "WARNING (should stay in capitalized letters if the language permits)"
657+ },
658+ "confirmVaultExport": {
659+ "message": "Пацвердзіць экспарт сховішча"
660+ },
661+ "exportWarningDesc": {
662+ "message": "Экспартуемы файл утрымлівае даныя вашага сховішча ў незашыфраваным фармаце. Яго не варта захоўваць ці адпраўляць па небяспечным каналам (напрыклад, па электроннай пошце). Выдаліце яго адразу пасля выкарыстання."
663+ },
664+ "encExportKeyWarningDesc": {
665+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
666+ },
667+ "encExportAccountWarningDesc": {
668+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
669+ },
670+ "exportMasterPassword": {
671+ "message": "Увядзіце ваш асноўны пароль для экспарту даных са сховішча."
672+ },
673+ "shared": {
674+ "message": "Абагуленыя"
675+ },
676+ "learnOrg": {
677+ "message": "Learn about organizations"
678+ },
679+ "learnOrgConfirmation": {
680+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
681+ },
682+ "moveToOrganization": {
683+ "message": "Move to Organization"
684+ },
685+ "share": {
686+ "message": "Абагуліць"
687+ },
688+ "movedItemToOrg": {
689+ "message": "$ITEMNAME$ moved to $ORGNAME$",
690+ "placeholders": {
691+ "itemname": {
692+ "content": "$1",
693+ "example": "Secret Item"
694+ },
695+ "orgname": {
696+ "content": "$2",
697+ "example": "Company Name"
698+ }
699+ }
700+ },
701+ "moveToOrgDesc": {
702+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
703+ },
704+ "learnMore": {
705+ "message": "Даведацца больш"
706+ },
707+ "authenticatorKeyTotp": {
708+ "message": "Ключ праверкі сапраўднасці (TOTP)"
709+ },
710+ "verificationCodeTotp": {
711+ "message": "Код праверкі (TOTP)"
712+ },
713+ "copyVerificationCode": {
714+ "message": "Капіяваць код праверкі"
715+ },
716+ "attachments": {
717+ "message": "Далучэнні"
718+ },
719+ "deleteAttachment": {
720+ "message": "Выдаліць далучэнне"
721+ },
722+ "deleteAttachmentConfirmation": {
723+ "message": "Вы ўпэўнены, што хочаце выдаліць гэта далучэнне?"
724+ },
725+ "deletedAttachment": {
726+ "message": "Далучэнне выдалена"
727+ },
728+ "newAttachment": {
729+ "message": "Дадаць новае далучэнне"
730+ },
731+ "noAttachments": {
732+ "message": "Няма далучэнняў."
733+ },
734+ "attachmentSaved": {
735+ "message": "Далучэнне захавана."
736+ },
737+ "file": {
738+ "message": "Файл"
739+ },
740+ "selectFile": {
741+ "message": "Выберыце файл."
742+ },
743+ "maxFileSize": {
744+ "message": "Максімальны памер файла 500 МБ."
745+ },
746+ "featureUnavailable": {
747+ "message": "Функцыя недаступна"
748+ },
749+ "updateKey": {
750+ "message": "Вы не можаце выкарыстоўваць гэту функцыю, пакуль не абнавіце свой ключ шыфравання."
751+ },
752+ "premiumMembership": {
753+ "message": "Прэміяльны статус"
754+ },
755+ "premiumManage": {
756+ "message": "Кіраванне статусам"
757+ },
758+ "premiumManageAlert": {
759+ "message": "Вы можаце кіраваць сваім статусам на bitwarden.com. Перайсці на сайт зараз?"
760+ },
761+ "premiumRefresh": {
762+ "message": "Абнавіць статус"
763+ },
764+ "premiumNotCurrentMember": {
765+ "message": "На дадзены момант у вас не прэміяльны статус."
766+ },
767+ "premiumSignUpAndGet": {
768+ "message": "Падпішыцеся на прэміяльны статус і атрымайце:"
769+ },
770+ "ppremiumSignUpStorage": {
771+ "message": "1 ГБ зашыфраванага сховішча для далучаных файлаў."
772+ },
773+ "ppremiumSignUpTwoStep": {
774+ "message": "Дадатковыя варыянты двухэтапнага ўваходу, такія як YubiKey, FIDO U2F і Duo."
775+ },
776+ "ppremiumSignUpReports": {
777+ "message": "Гігіена пароляў, здароўе ўліковага запісу і справаздачы аб уцечках даных для забеспячэння бяспекі вашага сховішча."
778+ },
779+ "ppremiumSignUpTotp": {
780+ "message": "TOTP-генератар кодаў (2ФА) для ўліковых даных вашага сховішча."
781+ },
782+ "ppremiumSignUpSupport": {
783+ "message": "Прыярытэтная падтрымка."
784+ },
785+ "ppremiumSignUpFuture": {
786+ "message": "Усе будучыя функцыі прэміяльнага статусу. Іх будзе больш!"
787+ },
788+ "premiumPurchase": {
789+ "message": "Купіць прэміяльны статус"
790+ },
791+ "premiumPurchaseAlert": {
792+ "message": "Вы можаце купіць прэміяльны статус на bitwarden.com. Перайсці на сайт зараз?"
793+ },
794+ "premiumCurrentMember": {
795+ "message": "У вас прэміяльны статус!"
796+ },
797+ "premiumCurrentMemberThanks": {
798+ "message": "Дзякуем вам за падтрымку Bitwarden."
799+ },
800+ "premiumPrice": {
801+ "message": "Усяго толькі за $PRICE$ на год!",
802+ "placeholders": {
803+ "price": {
804+ "content": "$1",
805+ "example": "$10"
806+ }
807+ }
808+ },
809+ "refreshComplete": {
810+ "message": "Абнаўленне завершана"
811+ },
812+ "enableAutoTotpCopy": {
813+ "message": "Copy TOTP automatically"
814+ },
815+ "disableAutoTotpCopyDesc": {
816+ "message": "Калі да вашых уліковых даных прымацаваны ключ праверкі сапраўднасці, то код пацвярджэння TOTP будзе скапіяваны пры аўтазапаўненні ўліковых даных."
817+ },
818+ "enableAutoBiometricsPrompt": {
819+ "message": "Ask for biometrics on launch"
820+ },
821+ "premiumRequired": {
822+ "message": "Патрабуецца прэміяльны статус"
823+ },
824+ "premiumRequiredDesc": {
825+ "message": "Для выкарыстання гэтай функцыі патрабуецца прэміяльны статус."
826+ },
827+ "enterVerificationCodeApp": {
828+ "message": "Увядзіце 6 лічбаў кода праверкі з вашай праграмы праверкі сапраўднасці."
829+ },
830+ "enterVerificationCodeEmail": {
831+ "message": "Увядзіце 6 лічбаў кода праверкі, які быў адпраўлены на $EMAIL$.",
832+ "placeholders": {
833+ "email": {
834+ "content": "$1",
835+ "example": "example@gmail.com"
836+ }
837+ }
838+ },
839+ "verificationCodeEmailSent": {
840+ "message": "Адпраўлены ліст для пацвярджэння $EMAIL$.",
841+ "placeholders": {
842+ "email": {
843+ "content": "$1",
844+ "example": "example@gmail.com"
845+ }
846+ }
847+ },
848+ "rememberMe": {
849+ "message": "Запомніць мяне"
850+ },
851+ "sendVerificationCodeEmailAgain": {
852+ "message": "Адправіць код пацвярджэння зноў"
853+ },
854+ "useAnotherTwoStepMethod": {
855+ "message": "Выкарыстоўваць іншы метад двухэтапнага ўваходу"
856+ },
857+ "insertYubiKey": {
858+ "message": "Устаўце ваш YubiKey ў порт USB вашага камп'ютара, затым націсніце на кнопку."
859+ },
860+ "insertU2f": {
861+ "message": "Устаўце ваш ключ бяспекі ў порт USB вашага камп'ютара. Калі на ім ёсць кнопка, націсніце на яе."
862+ },
863+ "webAuthnNewTab": {
864+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
865+ },
866+ "webAuthnNewTabOpen": {
867+ "message": "Open new tab"
868+ },
869+ "webAuthnAuthenticate": {
870+ "message": "Authenticate WebAuthn"
871+ },
872+ "loginUnavailable": {
873+ "message": "Уваход недаступны"
874+ },
875+ "noTwoStepProviders": {
876+ "message": "У гэтага ўліковага запісу ўключаны двухэтапны ўваход, аднак ні адзін з наладжаных варыянтаў не падтрымліваецца гэтым вэб-браўзерам."
877+ },
878+ "noTwoStepProviders2": {
879+ "message": "Выкарыстоўвайце актуальны вэб-браўзер (напрыклад, Chrome) і/або дадайце дадатковыя варыянты праверкі сапраўднасці, якія падтрымліваюцца ў вэб-браўзерах (напрыклад, праграма для праверкі сапраўднасці)."
880+ },
881+ "twoStepOptions": {
882+ "message": "Параметры двухэтапнага ўваходу"
883+ },
884+ "recoveryCodeDesc": {
885+ "message": "Згубілі доступ да ўсіх варыянтаў двухэтапнага ўваходу? Скарыстайцеся кодам аднаўлення, каб адключыць двухэтапны ўваход для вашага ўліковага запісу."
886+ },
887+ "recoveryCodeTitle": {
888+ "message": "Код аднаўлення"
889+ },
890+ "authenticatorAppTitle": {
891+ "message": "Праграма праверкі сапраўднасці"
892+ },
893+ "authenticatorAppDesc": {
894+ "message": "Выкарыстоўвайце праграму для праверкі сапраўднасці (напрыклад, Authy або Google Authenticator) для стварэння кодаў праверкі на аснове часу.",
895+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
896+ },
897+ "yubiKeyTitle": {
898+ "message": "Ключ бяспекі YubiKey OTP"
899+ },
900+ "yubiKeyDesc": {
901+ "message": "Выкарыстоўвайце YubiKey для доступу да вашага ўліковага запісу. Працуе з прыладамі YubiKey серый 4, 5 і NEO."
902+ },
903+ "duoDesc": {
904+ "message": "Пацвярдзіце з дапамогай Duo Security, выкарыстоўваючы праграму Duo Mobile, SMS, тэлефонны выклік або ключ бяспекі.",
905+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
906+ },
907+ "duoOrganizationDesc": {
908+ "message": "Пацвярдзіце з дапамогай Duo Security для вашай арганізацыі, выкарыстоўваючы праграму Duo Mobile, SMS, тэлефонны выклік або ключ бяспекі.",
909+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
910+ },
911+ "webAuthnTitle": {
912+ "message": "FIDO2 WebAuthn"
913+ },
914+ "webAuthnDesc": {
915+ "message": "Use any WebAuthn enabled security key to access your account."
916+ },
917+ "emailTitle": {
918+ "message": "Электронная пошта"
919+ },
920+ "emailDesc": {
921+ "message": "Коды пацвярджэння будуць адпраўлены вам па электроннай пошце."
922+ },
923+ "selfHostedEnvironment": {
924+ "message": "Асяроддзе ўласнага хостынгу"
925+ },
926+ "selfHostedEnvironmentFooter": {
927+ "message": "Увядзіце асноўны URL-адрас на вашым серверы."
928+ },
929+ "customEnvironment": {
930+ "message": "Налады асяроддзя"
931+ },
932+ "customEnvironmentFooter": {
933+ "message": "Для вопытных карыстальнікаў. Можна ўвесці URL-адрасы асобна для кжонай службы."
934+ },
935+ "baseUrl": {
936+ "message": "URL-адрас сервера"
937+ },
938+ "apiUrl": {
939+ "message": "API URL-адраса сервера"
940+ },
941+ "webVaultUrl": {
942+ "message": "URL-адрас сервера вэб-сховішча"
943+ },
944+ "identityUrl": {
945+ "message": "URL-адрас сервера ідэнтыфікацыі"
946+ },
947+ "notificationsUrl": {
948+ "message": "URL-адрас сервера апавяшчэнняў"
949+ },
950+ "iconsUrl": {
951+ "message": "URL-адрас сервера значкоў"
952+ },
953+ "environmentSaved": {
954+ "message": "URL-адрас сервера асяроддзя захаваны."
955+ },
956+ "enableAutoFillOnPageLoad": {
957+ "message": "Уключыць аўтазапаўненне пры загрузцы старонкі"
958+ },
959+ "enableAutoFillOnPageLoadDesc": {
960+ "message": "Пры выяўленні формы ўваходу выконваецца аўтазапаўненне падчас загрузкі вэб-старонкі."
961+ },
962+ "experimentalFeature": {
963+ "message": "Гэта эксперыментальная функцыя. Выкарыстоўвайце на свой страх і рызыку."
964+ },
965+ "defaultAutoFillOnPageLoad": {
966+ "message": "Default autofill setting for login items"
967+ },
968+ "defaultAutoFillOnPageLoadDesc": {
969+ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view."
970+ },
971+ "itemAutoFillOnPageLoad": {
972+ "message": "Auto-fill on page load (if enabled in Options)"
973+ },
974+ "autoFillOnPageLoadUseDefault": {
975+ "message": "Use default setting"
976+ },
977+ "autoFillOnPageLoadYes": {
978+ "message": "Auto-fill on page load"
979+ },
980+ "autoFillOnPageLoadNo": {
981+ "message": "Do not auto-fill on page load"
982+ },
983+ "commandOpenPopup": {
984+ "message": "Адкрыць сховішча ва ўсплывальным акне"
985+ },
986+ "commandOpenSidebar": {
987+ "message": "Адкрыць сховішча ў бакавой панэлі"
988+ },
989+ "commandAutofillDesc": {
990+ "message": "Аўтазапаўненне апошніх скарыстаных уліковых даных для бягучага вэб-сайта."
991+ },
992+ "commandGeneratePasswordDesc": {
993+ "message": "Стварыць і капіяваць новы выпадковы парольу буфер абмену."
994+ },
995+ "commandLockVaultDesc": {
996+ "message": "Заблакіраваць сховішча"
997+ },
998+ "privateModeWarning": {
999+ "message": "Private mode support is experimental and some features are limited."
1000+ },
1001+ "customFields": {
1002+ "message": "Карыстальніцкія палі"
1003+ },
1004+ "copyValue": {
1005+ "message": "Капіяваць значэнне"
1006+ },
1007+ "value": {
1008+ "message": "Значэнне"
1009+ },
1010+ "newCustomField": {
1011+ "message": "Новае карыстальніцкае поле"
1012+ },
1013+ "dragToSort": {
1014+ "message": "Перацягніце для сартавання"
1015+ },
1016+ "cfTypeText": {
1017+ "message": "Тэкст"
1018+ },
1019+ "cfTypeHidden": {
1020+ "message": "Схавана"
1021+ },
1022+ "cfTypeBoolean": {
1023+ "message": "Лагічнае"
1024+ },
1025+ "cfTypeLinked": {
1026+ "message": "Linked",
1027+ "description": "This describes a field that is 'linked' (tied) to another field."
1028+ },
1029+ "linkedValue": {
1030+ "message": "Linked value",
1031+ "description": "This describes a value that is 'linked' (tied) to another value."
1032+ },
1033+ "popup2faCloseMessage": {
1034+ "message": "Націск за межамі гэтага акна для прагляду кода праверкі з электроннай пошты прывядзе да яго закрыцця. Адкрыць bitwarden у новым акне?"
1035+ },
1036+ "popupU2fCloseMessage": {
1037+ "message": "Гэты браўзар не можа апрацоўваць запыты U2F у гэтым усплывальным акне. Вы хочаце адкрыць гэта ўсплывальнае акно ў новым акне, каб мець магчымасць увайсці ў сістэму, выкарыстоўваючы U2F?"
1038+ },
1039+ "enableFavicon": {
1040+ "message": "Show website icons"
1041+ },
1042+ "faviconDesc": {
1043+ "message": "Show a recognizable image next to each login."
1044+ },
1045+ "enableBadgeCounter": {
1046+ "message": "Show badge counter"
1047+ },
1048+ "badgeCounterDesc": {
1049+ "message": "Indicate how many logins you have for the current web page."
1050+ },
1051+ "cardholderName": {
1052+ "message": "Імя ўладальніка карткі"
1053+ },
1054+ "number": {
1055+ "message": "Нумар"
1056+ },
1057+ "brand": {
1058+ "message": "Тып карткі"
1059+ },
1060+ "expirationMonth": {
1061+ "message": "Месяц заканчэння"
1062+ },
1063+ "expirationYear": {
1064+ "message": "Год заканчэння"
1065+ },
1066+ "expiration": {
1067+ "message": "Тэрмін дзеяння"
1068+ },
1069+ "january": {
1070+ "message": "Студзень"
1071+ },
1072+ "february": {
1073+ "message": "Люты"
1074+ },
1075+ "march": {
1076+ "message": "Сакавік"
1077+ },
1078+ "april": {
1079+ "message": "Красавік"
1080+ },
1081+ "may": {
1082+ "message": "Май"
1083+ },
1084+ "june": {
1085+ "message": "Чэрвень"
1086+ },
1087+ "july": {
1088+ "message": "Ліпень"
1089+ },
1090+ "august": {
1091+ "message": "Жнівень"
1092+ },
1093+ "september": {
1094+ "message": "Верасень"
1095+ },
1096+ "october": {
1097+ "message": "Кастрычнік"
1098+ },
1099+ "november": {
1100+ "message": "Лістапад"
1101+ },
1102+ "december": {
1103+ "message": "Снежань"
1104+ },
1105+ "securityCode": {
1106+ "message": "Код бяспекі"
1107+ },
1108+ "ex": {
1109+ "message": "напр."
1110+ },
1111+ "title": {
1112+ "message": "Зварот"
1113+ },
1114+ "mr": {
1115+ "message": "С-р"
1116+ },
1117+ "mrs": {
1118+ "message": "С-ня"
1119+ },
1120+ "ms": {
1121+ "message": "Пані"
1122+ },
1123+ "dr": {
1124+ "message": "Док."
1125+ },
1126+ "firstName": {
1127+ "message": "Імя"
1128+ },
1129+ "middleName": {
1130+ "message": "Імя па бацьку"
1131+ },
1132+ "lastName": {
1133+ "message": "Прозвішча"
1134+ },
1135+ "fullName": {
1136+ "message": "Full Name"
1137+ },
1138+ "identityName": {
1139+ "message": "Імя"
1140+ },
1141+ "company": {
1142+ "message": "Кампанія"
1143+ },
1144+ "ssn": {
1145+ "message": "Нумар сацыяльнага страхавання"
1146+ },
1147+ "passportNumber": {
1148+ "message": "Нумар пашпарта"
1149+ },
1150+ "licenseNumber": {
1151+ "message": "Нумар ліцэнзіі"
1152+ },
1153+ "email": {
1154+ "message": "Электронная пошта"
1155+ },
1156+ "phone": {
1157+ "message": "Тэлефон"
1158+ },
1159+ "address": {
1160+ "message": "Адрас"
1161+ },
1162+ "address1": {
1163+ "message": "Радок адрасу 1"
1164+ },
1165+ "address2": {
1166+ "message": "Радок адрасу 2"
1167+ },
1168+ "address3": {
1169+ "message": "Радок адрасу 3"
1170+ },
1171+ "cityTown": {
1172+ "message": "Горад / Пасёлак"
1173+ },
1174+ "stateProvince": {
1175+ "message": "Рэгіён / Вобласць"
1176+ },
1177+ "zipPostalCode": {
1178+ "message": "Паштовы індэкс"
1179+ },
1180+ "country": {
1181+ "message": "Краіна"
1182+ },
1183+ "type": {
1184+ "message": "Тып"
1185+ },
1186+ "typeLogin": {
1187+ "message": "Уліковыя даныя"
1188+ },
1189+ "typeLogins": {
1190+ "message": "Уліковыя даныя"
1191+ },
1192+ "typeSecureNote": {
1193+ "message": "Бяспечныя нататкі"
1194+ },
1195+ "typeCard": {
1196+ "message": "Картка"
1197+ },
1198+ "typeIdentity": {
1199+ "message": "Пасведчанне"
1200+ },
1201+ "passwordHistory": {
1202+ "message": "Гісторыя пароляў"
1203+ },
1204+ "back": {
1205+ "message": "Назад"
1206+ },
1207+ "collections": {
1208+ "message": "Калекцыі"
1209+ },
1210+ "favorites": {
1211+ "message": "Абраныя"
1212+ },
1213+ "popOutNewWindow": {
1214+ "message": "Перайсці ў новае акно"
1215+ },
1216+ "refresh": {
1217+ "message": "Абнавiць"
1218+ },
1219+ "cards": {
1220+ "message": "Карткі"
1221+ },
1222+ "identities": {
1223+ "message": "Пасведчанні"
1224+ },
1225+ "logins": {
1226+ "message": "Уліковыя даныя"
1227+ },
1228+ "secureNotes": {
1229+ "message": "Бяспечныя нататкі"
1230+ },
1231+ "clear": {
1232+ "message": "Ачысціць",
1233+ "description": "To clear something out. example: To clear browser history."
1234+ },
1235+ "checkPassword": {
1236+ "message": "Праверце, ці не скампраметаваны пароль."
1237+ },
1238+ "passwordExposed": {
1239+ "message": "Гэты пароль быў скампраметаваны $VALUE$ раз(-ы/-оў). Вы павінны змяніць яго.",
1240+ "placeholders": {
1241+ "value": {
1242+ "content": "$1",
1243+ "example": "2"
1244+ }
1245+ }
1246+ },
1247+ "passwordSafe": {
1248+ "message": "Гэты пароль не быў знойдзены ў вядомых базах уцечак. Можна працягваць яго выкарыстоўваць."
1249+ },
1250+ "baseDomain": {
1251+ "message": "Асноўны дамен",
1252+ "description": "Domain name. Ex. website.com"
1253+ },
1254+ "domainName": {
1255+ "message": "Domain name",
1256+ "description": "Domain name. Ex. website.com"
1257+ },
1258+ "host": {
1259+ "message": "Хост",
1260+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
1261+ },
1262+ "exact": {
1263+ "message": "Дакладна"
1264+ },
1265+ "startsWith": {
1266+ "message": "Пачынаецца з"
1267+ },
1268+ "regEx": {
1269+ "message": "Рэгулярны выраз",
1270+ "description": "A programming term, also known as 'RegEx'."
1271+ },
1272+ "matchDetection": {
1273+ "message": "Выяўленне супадзенняў",
1274+ "description": "URI match detection for auto-fill."
1275+ },
1276+ "defaultMatchDetection": {
1277+ "message": "Метад выяўлення па змаўчанні",
1278+ "description": "Default URI match detection for auto-fill."
1279+ },
1280+ "toggleOptions": {
1281+ "message": "Пераключыць параметры"
1282+ },
1283+ "toggleCurrentUris": {
1284+ "message": "Уключыць бягучыя URI укладак",
1285+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
1286+ },
1287+ "currentUri": {
1288+ "message": "Бягучы URI укладкі",
1289+ "description": "The URI of one of the current open tabs in the browser."
1290+ },
1291+ "organization": {
1292+ "message": "Арганізацыя",
1293+ "description": "An entity of multiple related people (ex. a team or business organization)."
1294+ },
1295+ "types": {
1296+ "message": "Тыпы"
1297+ },
1298+ "allItems": {
1299+ "message": "Усе элементы"
1300+ },
1301+ "noPasswordsInList": {
1302+ "message": "Няма пароляў для паказу."
1303+ },
1304+ "remove": {
1305+ "message": "Выдаліць"
1306+ },
1307+ "default": {
1308+ "message": "Па змаўчанні"
1309+ },
1310+ "dateUpdated": {
1311+ "message": "Абноўлена",
1312+ "description": "ex. Date this item was updated"
1313+ },
1314+ "datePasswordUpdated": {
1315+ "message": "Пароль абноўлены",
1316+ "description": "ex. Date this password was updated"
1317+ },
1318+ "neverLockWarning": {
1319+ "message": "Вы ўпэўнены, што хочаце адключыць блакіроўку сховішча? У гэтым выпадку ключ шыфравання вашага сховішча будзе захаваны на вашай прыладзе. Адключаючы блакіроўку, вы павінны пераканацца, што ваша прылада надзейна абаронена."
1320+ },
1321+ "noOrganizationsList": {
1322+ "message": "Вы не з'яўляецеся членам якой-небудзь арганізацыі. Арганізацыі дазваляюць бяспечна абменьвацца элементамі з іншымі карыстальнікамі."
1323+ },
1324+ "noCollectionsInList": {
1325+ "message": "Няма калекцый для паказу."
1326+ },
1327+ "ownership": {
1328+ "message": "Уладальнік"
1329+ },
1330+ "whoOwnsThisItem": {
1331+ "message": "Каму належыць гэты элемент?"
1332+ },
1333+ "strong": {
1334+ "message": "Моцны",
1335+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
1336+ },
1337+ "good": {
1338+ "message": "Добры",
1339+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
1340+ },
1341+ "weak": {
1342+ "message": "Слабы",
1343+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
1344+ },
1345+ "weakMasterPassword": {
1346+ "message": "Слабы асноўны пароль"
1347+ },
1348+ "weakMasterPasswordDesc": {
1349+ "message": "Асноўны пароль, выбраны вамі, з'яўляецца слабым. Для належнай абароны ўліковага запісу Bitwarden, вы павінны выкарыстоўваць моцны асноўны пароль (або парольную фразу). Вы ўпэўнены, што хочаце выкарыстоўваць гэты асноўны пароль?"
1350+ },
1351+ "pin": {
1352+ "message": "PIN-код",
1353+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
1354+ },
1355+ "unlockWithPin": {
1356+ "message": "Разблакіраваць PIN-кодам"
1357+ },
1358+ "setYourPinCode": {
1359+ "message": "Задайце PIN-код для разблакіроўкі Bitwarden. Налады PIN-кода будуць скінуты, калі вы калі-небудзь цалкам выйдзеце з праграмы."
1360+ },
1361+ "pinRequired": {
1362+ "message": "Патрабуецца PIN-код."
1363+ },
1364+ "invalidPin": {
1365+ "message": "Памылковы PIN-код."
1366+ },
1367+ "unlockWithBiometrics": {
1368+ "message": "Unlock with biometrics"
1369+ },
1370+ "awaitDesktop": {
1371+ "message": "Awaiting confirmation from desktop"
1372+ },
1373+ "awaitDesktopDesc": {
1374+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
1375+ },
1376+ "lockWithMasterPassOnRestart": {
1377+ "message": "Блакіраваць асноўным паролем пры перазапуску браўзера"
1378+ },
1379+ "selectOneCollection": {
1380+ "message": "Вы павінны выбраць прынамсі адну калекцыю."
1381+ },
1382+ "cloneItem": {
1383+ "message": "Кланіраваць элемент"
1384+ },
1385+ "clone": {
1386+ "message": "Кланіраваць"
1387+ },
1388+ "passwordGeneratorPolicyInEffect": {
1389+ "message": "На налады генератара ўплываюць адна або некалькі палітык арганізацый."
1390+ },
1391+ "vaultTimeoutAction": {
1392+ "message": "Дзеянне пры тайм-аўце"
1393+ },
1394+ "lock": {
1395+ "message": "Заблакіраваць",
1396+ "description": "Verb form: to make secure or inaccesible by"
1397+ },
1398+ "trash": {
1399+ "message": "Сметніца",
1400+ "description": "Noun: a special folder to hold deleted items"
1401+ },
1402+ "searchTrash": {
1403+ "message": "Пошук у сметніцы"
1404+ },
1405+ "permanentlyDeleteItem": {
1406+ "message": "Выдаліць назаўсёды"
1407+ },
1408+ "permanentlyDeleteItemConfirmation": {
1409+ "message": "Вы ўпэўнены, што хочаце назаўсёды выдаліць гэты элемент?"
1410+ },
1411+ "permanentlyDeletedItem": {
1412+ "message": "Выдаленны назаўсёды элемент"
1413+ },
1414+ "restoreItem": {
1415+ "message": "Аднавіць элемент"
1416+ },
1417+ "restoreItemConfirmation": {
1418+ "message": "Вы сапраўды жадаеце аднавіць гэты элемент?"
1419+ },
1420+ "restoredItem": {
1421+ "message": "Элемент адноўлены"
1422+ },
1423+ "vaultTimeoutLogOutConfirmation": {
1424+ "message": "Выхад з сістэмы выдаліць доступ да сховішча і спатрабуе праверку сапраўднасці анлайн па заканчэнні перыяду чакання. Вы сапраўды жадаеце ўключыць гэтую наладу?"
1425+ },
1426+ "vaultTimeoutLogOutConfirmationTitle": {
1427+ "message": "Пацвярджэнне дзеяння для тайм-аута"
1428+ },
1429+ "autoFillAndSave": {
1430+ "message": "Запоўніць і захаваць"
1431+ },
1432+ "autoFillSuccessAndSavedUri": {
1433+ "message": "Аўтазапоўнены элемент і захаваны URI"
1434+ },
1435+ "autoFillSuccess": {
1436+ "message": "Аўтазапоўнены элемент"
1437+ },
1438+ "setMasterPassword": {
1439+ "message": "Задаць асноўны пароль"
1440+ },
1441+ "masterPasswordPolicyInEffect": {
1442+ "message": "Згодна з адной або некалькімі палітыкамі арганізацыі неабходна, каб ваш асноўны пароль адказваў наступным патрабаванням:"
1443+ },
1444+ "policyInEffectMinComplexity": {
1445+ "message": "Мінімальны ўзровень складанасці $SCORE$",
1446+ "placeholders": {
1447+ "score": {
1448+ "content": "$1",
1449+ "example": "4"
1450+ }
1451+ }
1452+ },
1453+ "policyInEffectMinLength": {
1454+ "message": "Мінімальная даўжыня $LENGTH$",
1455+ "placeholders": {
1456+ "length": {
1457+ "content": "$1",
1458+ "example": "14"
1459+ }
1460+ }
1461+ },
1462+ "policyInEffectUppercase": {
1463+ "message": "Уключыць адну ці больш прапісных літар"
1464+ },
1465+ "policyInEffectLowercase": {
1466+ "message": "Уключыць адну ці больш малых літар"
1467+ },
1468+ "policyInEffectNumbers": {
1469+ "message": "Уключыць адну ці больш лічбаў"
1470+ },
1471+ "policyInEffectSpecial": {
1472+ "message": "Уключаць хаця б адзін з наступных спецыяльных сімвалаў $CHARS$",
1473+ "placeholders": {
1474+ "chars": {
1475+ "content": "$1",
1476+ "example": "!@#$%^&*"
1477+ }
1478+ }
1479+ },
1480+ "masterPasswordPolicyRequirementsNotMet": {
1481+ "message": "Ваш новы асноўны пароль не адпавядае патрабаванням палітыкі арганізацыі."
1482+ },
1483+ "acceptPolicies": {
1484+ "message": "Ставіўшы гэты сцяжок вы пагаджаецеся з наступным:"
1485+ },
1486+ "acceptPoliciesRequired": {
1487+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
1488+ },
1489+ "termsOfService": {
1490+ "message": "Умовы выкарыстання"
1491+ },
1492+ "privacyPolicy": {
1493+ "message": "Палітыка прыватнасці"
1494+ },
1495+ "hintEqualsPassword": {
1496+ "message": "Your password hint cannot be the same as your password."
1497+ },
1498+ "ok": {
1499+ "message": "ОК"
1500+ },
1501+ "desktopSyncVerificationTitle": {
1502+ "message": "Desktop sync verification"
1503+ },
1504+ "desktopIntegrationVerificationText": {
1505+ "message": "Please verify that the desktop application shows this fingerprint: "
1506+ },
1507+ "desktopIntegrationDisabledTitle": {
1508+ "message": "Browser integration is not enabled"
1509+ },
1510+ "desktopIntegrationDisabledDesc": {
1511+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
1512+ },
1513+ "startDesktopTitle": {
1514+ "message": "Start the Bitwarden Desktop application"
1515+ },
1516+ "startDesktopDesc": {
1517+ "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used."
1518+ },
1519+ "errorEnableBiometricTitle": {
1520+ "message": "Unable to enable biometrics"
1521+ },
1522+ "errorEnableBiometricDesc": {
1523+ "message": "Action was canceled by the desktop application"
1524+ },
1525+ "nativeMessagingInvalidEncryptionDesc": {
1526+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
1527+ },
1528+ "nativeMessagingInvalidEncryptionTitle": {
1529+ "message": "Desktop communication interrupted"
1530+ },
1531+ "nativeMessagingWrongUserDesc": {
1532+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
1533+ },
1534+ "nativeMessagingWrongUserTitle": {
1535+ "message": "Account missmatch"
1536+ },
1537+ "biometricsNotEnabledTitle": {
1538+ "message": "Biometrics not enabled"
1539+ },
1540+ "biometricsNotEnabledDesc": {
1541+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
1542+ },
1543+ "biometricsNotSupportedTitle": {
1544+ "message": "Biometrics not supported"
1545+ },
1546+ "biometricsNotSupportedDesc": {
1547+ "message": "Browser biometrics is not supported on this device."
1548+ },
1549+ "nativeMessaginPermissionErrorTitle": {
1550+ "message": "Permission not provided"
1551+ },
1552+ "nativeMessaginPermissionErrorDesc": {
1553+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
1554+ },
1555+ "nativeMessaginPermissionSidebarTitle": {
1556+ "message": "Permission request error"
1557+ },
1558+ "nativeMessaginPermissionSidebarDesc": {
1559+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
1560+ },
1561+ "personalOwnershipSubmitError": {
1562+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
1563+ },
1564+ "personalOwnershipPolicyInEffect": {
1565+ "message": "An organization policy is affecting your ownership options."
1566+ },
1567+ "excludedDomains": {
1568+ "message": "Excluded domains"
1569+ },
1570+ "excludedDomainsDesc": {
1571+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
1572+ },
1573+ "excludedDomainsInvalidDomain": {
1574+ "message": "$DOMAIN$ is not a valid domain",
1575+ "placeholders": {
1576+ "domain": {
1577+ "content": "$1",
1578+ "example": "googlecom"
1579+ }
1580+ }
1581+ },
1582+ "send": {
1583+ "message": "Send",
1584+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1585+ },
1586+ "searchSends": {
1587+ "message": "Search Sends",
1588+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1589+ },
1590+ "addSend": {
1591+ "message": "Add Send",
1592+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1593+ },
1594+ "sendTypeText": {
1595+ "message": "Text"
1596+ },
1597+ "sendTypeFile": {
1598+ "message": "File"
1599+ },
1600+ "allSends": {
1601+ "message": "All Sends",
1602+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1603+ },
1604+ "maxAccessCountReached": {
1605+ "message": "Max access count reached",
1606+ "description": "This text will be displayed after a Send has been accessed the maximum amount of times."
1607+ },
1608+ "expired": {
1609+ "message": "Expired"
1610+ },
1611+ "pendingDeletion": {
1612+ "message": "Pending deletion"
1613+ },
1614+ "passwordProtected": {
1615+ "message": "Password protected"
1616+ },
1617+ "copySendLink": {
1618+ "message": "Copy Send link",
1619+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1620+ },
1621+ "removePassword": {
1622+ "message": "Remove Password"
1623+ },
1624+ "delete": {
1625+ "message": "Delete"
1626+ },
1627+ "removedPassword": {
1628+ "message": "Removed Password"
1629+ },
1630+ "deletedSend": {
1631+ "message": "Deleted Send",
1632+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1633+ },
1634+ "sendLink": {
1635+ "message": "Send link",
1636+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1637+ },
1638+ "disabled": {
1639+ "message": "Disabled"
1640+ },
1641+ "removePasswordConfirmation": {
1642+ "message": "Are you sure you want to remove the password?"
1643+ },
1644+ "deleteSend": {
1645+ "message": "Delete Send",
1646+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1647+ },
1648+ "deleteSendConfirmation": {
1649+ "message": "Are you sure you want to delete this Send?",
1650+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1651+ },
1652+ "editSend": {
1653+ "message": "Edit Send",
1654+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1655+ },
1656+ "sendTypeHeader": {
1657+ "message": "What type of Send is this?",
1658+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1659+ },
1660+ "sendNameDesc": {
1661+ "message": "A friendly name to describe this Send.",
1662+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1663+ },
1664+ "sendFileDesc": {
1665+ "message": "The file you want to send."
1666+ },
1667+ "deletionDate": {
1668+ "message": "Deletion Date"
1669+ },
1670+ "deletionDateDesc": {
1671+ "message": "The Send will be permanently deleted on the specified date and time.",
1672+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1673+ },
1674+ "expirationDate": {
1675+ "message": "Expiration Date"
1676+ },
1677+ "expirationDateDesc": {
1678+ "message": "If set, access to this Send will expire on the specified date and time.",
1679+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1680+ },
1681+ "oneDay": {
1682+ "message": "1 day"
1683+ },
1684+ "days": {
1685+ "message": "$DAYS$ days",
1686+ "placeholders": {
1687+ "days": {
1688+ "content": "$1",
1689+ "example": "2"
1690+ }
1691+ }
1692+ },
1693+ "custom": {
1694+ "message": "Custom"
1695+ },
1696+ "maximumAccessCount": {
1697+ "message": "Maximum Access Count"
1698+ },
1699+ "maximumAccessCountDesc": {
1700+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
1701+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1702+ },
1703+ "sendPasswordDesc": {
1704+ "message": "Optionally require a password for users to access this Send.",
1705+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1706+ },
1707+ "sendNotesDesc": {
1708+ "message": "Private notes about this Send.",
1709+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1710+ },
1711+ "sendDisableDesc": {
1712+ "message": "Disable this Send so that no one can access it.",
1713+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1714+ },
1715+ "sendShareDesc": {
1716+ "message": "Copy this Send's link to clipboard upon save.",
1717+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1718+ },
1719+ "sendTextDesc": {
1720+ "message": "The text you want to send."
1721+ },
1722+ "sendHideText": {
1723+ "message": "Hide this Send's text by default.",
1724+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1725+ },
1726+ "currentAccessCount": {
1727+ "message": "Current Access Count"
1728+ },
1729+ "createSend": {
1730+ "message": "Create New Send",
1731+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1732+ },
1733+ "newPassword": {
1734+ "message": "New Password"
1735+ },
1736+ "sendDisabled": {
1737+ "message": "Send Disabled",
1738+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1739+ },
1740+ "sendDisabledWarning": {
1741+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
1742+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1743+ },
1744+ "createdSend": {
1745+ "message": "Created Send",
1746+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1747+ },
1748+ "editedSend": {
1749+ "message": "Edited Send",
1750+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1751+ },
1752+ "sendLinuxChromiumFileWarning": {
1753+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
1754+ },
1755+ "sendFirefoxFileWarning": {
1756+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
1757+ },
1758+ "sendSafariFileWarning": {
1759+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
1760+ },
1761+ "sendFileCalloutHeader": {
1762+ "message": "Before you start"
1763+ },
1764+ "sendFirefoxCustomDatePopoutMessage1": {
1765+ "message": "To use a calendar style date picker",
1766+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
1767+ },
1768+ "sendFirefoxCustomDatePopoutMessage2": {
1769+ "message": "click here",
1770+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
1771+ },
1772+ "sendFirefoxCustomDatePopoutMessage3": {
1773+ "message": "to pop out your window.",
1774+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
1775+ },
1776+ "expirationDateIsInvalid": {
1777+ "message": "The expiration date provided is not valid."
1778+ },
1779+ "deletionDateIsInvalid": {
1780+ "message": "The deletion date provided is not valid."
1781+ },
1782+ "expirationDateAndTimeRequired": {
1783+ "message": "An expiration date and time are required."
1784+ },
1785+ "deletionDateAndTimeRequired": {
1786+ "message": "A deletion date and time are required."
1787+ },
1788+ "dateParsingError": {
1789+ "message": "There was an error saving your deletion and expiration dates."
1790+ },
1791+ "hideEmail": {
1792+ "message": "Hide my email address from recipients."
1793+ },
1794+ "sendOptionsPolicyInEffect": {
1795+ "message": "One or more organization policies are affecting your Send options."
1796+ },
1797+ "passwordPrompt": {
1798+ "message": "Master password re-prompt"
1799+ },
1800+ "passwordConfirmation": {
1801+ "message": "Master password confirmation"
1802+ },
1803+ "passwordConfirmationDesc": {
1804+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
1805+ },
1806+ "emailVerificationRequired": {
1807+ "message": "Email Verification Required"
1808+ },
1809+ "emailVerificationRequiredDesc": {
1810+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
1811+ },
1812+ "updatedMasterPassword": {
1813+ "message": "Updated Master Password"
1814+ },
1815+ "updateMasterPassword": {
1816+ "message": "Update Master Password"
1817+ },
1818+ "updateMasterPasswordWarning": {
1819+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
1820+ },
1821+ "resetPasswordPolicyAutoEnroll": {
1822+ "message": "Automatic Enrollment"
1823+ },
1824+ "resetPasswordAutoEnrollInviteWarning": {
1825+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
1826+ },
1827+ "selectFolder": {
1828+ "message": "Select folder..."
1829+ },
1830+ "ssoCompleteRegistration": {
1831+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
1832+ },
1833+ "hours": {
1834+ "message": "Hours"
1835+ },
1836+ "minutes": {
1837+ "message": "Minutes"
1838+ },
1839+ "vaultTimeoutPolicyInEffect": {
1840+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
1841+ "placeholders": {
1842+ "hours": {
1843+ "content": "$1",
1844+ "example": "5"
1845+ },
1846+ "minutes": {
1847+ "content": "$2",
1848+ "example": "5"
1849+ }
1850+ }
1851+ },
1852+ "vaultTimeoutTooLarge": {
1853+ "message": "Your vault timeout exceeds the restrictions set by your organization."
1854+ },
1855+ "vaultExportDisabled": {
1856+ "message": "Vault Export Disabled"
1857+ },
1858+ "personalVaultExportPolicyInEffect": {
1859+ "message": "One or more organization policies prevents you from exporting your personal vault."
1860+ },
1861+ "copyCustomFieldNameInvalidElement": {
1862+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
1863+ },
1864+ "copyCustomFieldNameNotUnique": {
1865+ "message": "No unique identifier found."
1866+ },
1867+ "convertOrganizationEncryptionDesc": {
1868+ "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.",
1869+ "placeholders": {
1870+ "organization": {
1871+ "content": "$1",
1872+ "example": "My Org Name"
1873+ }
1874+ }
1875+ },
1876+ "leaveOrganization": {
1877+ "message": "Leave Organization"
1878+ },
1879+ "removeMasterPassword": {
1880+ "message": "Remove Master Password"
1881+ },
1882+ "removedMasterPassword": {
1883+ "message": "Master password removed."
1884+ },
1885+ "leaveOrganizationConfirmation": {
1886+ "message": "Are you sure you want to leave this organization?"
1887+ },
1888+ "leftOrganization": {
1889+ "message": "You have left the organization."
1890+ },
1891+ "toggleCharacterCount": {
1892+ "message": "Toggle character count"
1893+ },
1894+ "sessionTimeout": {
1895+ "message": "Your session has timed out. Please go back and try logging in again."
1896+ },
1897+ "exportingPersonalVaultTitle": {
1898+ "message": "Exporting Personal Vault"
1899+ },
1900+ "exportingPersonalVaultDescription": {
1901+ "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.",
1902+ "placeholders": {
1903+ "email": {
1904+ "content": "$1",
1905+ "example": "name@example.com"
1906+ }
1907+ }
1908+ },
1909+ "error": {
1910+ "message": "Error"
1911+ },
1912+ "regenerateUsername": {
1913+ "message": "Regenerate Username"
1914+ },
1915+ "generateUsername": {
1916+ "message": "Generate Username"
1917+ },
1918+ "usernameType": {
1919+ "message": "Username Type"
1920+ },
1921+ "plusAddressedEmail": {
1922+ "message": "Plus Addressed Email",
1923+ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
1924+ },
1925+ "plusAddressedEmailDesc": {
1926+ "message": "Use your email provider's sub-addressing capabilities."
1927+ },
1928+ "catchallEmail": {
1929+ "message": "Catch-all Email"
1930+ },
1931+ "catchallEmailDesc": {
1932+ "message": "Use your domain's configured catch-all inbox."
1933+ },
1934+ "random": {
1935+ "message": "Random"
1936+ },
1937+ "randomWord": {
1938+ "message": "Random Word"
1939+ },
1940+ "websiteName": {
1941+ "message": "Website Name"
1942+ },
1943+ "whatWouldYouLikeToGenerate": {
1944+ "message": "What would you like to generate?"
1945+ },
1946+ "passwordType": {
1947+ "message": "Password Type"
1948+ },
1949+ "service": {
1950+ "message": "Service"
1951+ },
1952+ "forwardedEmail": {
1953+ "message": "Forwarded Email Alias"
1954+ },
1955+ "forwardedEmailDesc": {
1956+ "message": "Generate an email alias with an external forwarding service."
1957+ },
1958+ "hostname": {
1959+ "message": "Hostname",
1960+ "description": "Part of a URL."
1961+ },
1962+ "apiAccessToken": {
1963+ "message": "API Access Token"
1964+ },
1965+ "apiKey": {
1966+ "message": "API Key"
1967+ },
1968+ "ssoKeyConnectorError": {
1969+ "message": "Key Connector error: make sure Key Connector is available and working correctly."
1970+ },
1971+ "organizationIsDisabled": {
1972+ "message": "Organization is disabled."
1973+ },
1974+ "disabledOrganizationFilterError": {
1975+ "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
1976+ },
1977+ "cardBrandMir": {
1978+ "message": "Mir"
1979+ }
1980+}
apps/browser/src/_locales/bg/messages.jsonnew file+1980
@@ -0,0 +1,1980 @@
1+{
2+ "appName": {
3+ "message": "Битуорден (Bitwarden)"
4+ },
5+ "extName": {
6+ "message": "Bitwarden",
7+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
8+ },
9+ "extDesc": {
10+ "message": "Безопасно и безплатно управление за всичките ви устройства.",
11+ "description": "Extension description"
12+ },
13+ "loginOrCreateNewAccount": {
14+ "message": "Впишете се или създайте нов абонамент, за да достъпите защитен трезор."
15+ },
16+ "createAccount": {
17+ "message": "Създаване на абонамент"
18+ },
19+ "login": {
20+ "message": "Вписване"
21+ },
22+ "enterpriseSingleSignOn": {
23+ "message": "Еднократна идентификация (SSO)"
24+ },
25+ "cancel": {
26+ "message": "Отказ"
27+ },
28+ "close": {
29+ "message": "Затваряне"
30+ },
31+ "submit": {
32+ "message": "Подаване"
33+ },
34+ "emailAddress": {
35+ "message": "Е-поща"
36+ },
37+ "masterPass": {
38+ "message": "Главна парола"
39+ },
40+ "masterPassDesc": {
41+ "message": "Главната парола се използва за достъп до трезора ви. Запомнете я добре, защото възстановяването ѝ е абсолютно невъзможно."
42+ },
43+ "masterPassHintDesc": {
44+ "message": "Ако сте забравили главната парола, то подсказването може да ви помогне да си я припомните."
45+ },
46+ "reTypeMasterPass": {
47+ "message": "Въведете пак главната парола"
48+ },
49+ "masterPassHint": {
50+ "message": "Подсказване за главната парола (по избор)"
51+ },
52+ "tab": {
53+ "message": "Раздел"
54+ },
55+ "vault": {
56+ "message": "Трезор"
57+ },
58+ "myVault": {
59+ "message": "Моят трезор"
60+ },
61+ "allVaults": {
62+ "message": "Всички трезори"
63+ },
64+ "tools": {
65+ "message": "Средства"
66+ },
67+ "settings": {
68+ "message": "Настройки"
69+ },
70+ "currentTab": {
71+ "message": "Текущ раздел"
72+ },
73+ "copyPassword": {
74+ "message": "Копиране на паролата"
75+ },
76+ "copyNote": {
77+ "message": "Копиране на бележката"
78+ },
79+ "copyUri": {
80+ "message": "Копиране на адреса"
81+ },
82+ "copyUsername": {
83+ "message": "Копиране на потребителското име"
84+ },
85+ "copyNumber": {
86+ "message": "Копиране на но̀мера"
87+ },
88+ "copySecurityCode": {
89+ "message": "Копиране на кода да сигурност"
90+ },
91+ "autoFill": {
92+ "message": "Автоматично дописване"
93+ },
94+ "generatePasswordCopied": {
95+ "message": "Генериране на парола (копирана)"
96+ },
97+ "copyElementIdentifier": {
98+ "message": "Копиране на името на допълнителното поле"
99+ },
100+ "noMatchingLogins": {
101+ "message": "Няма съвпадащи записи."
102+ },
103+ "unlockVaultMenu": {
104+ "message": "Отключете трезора си"
105+ },
106+ "loginToVaultMenu": {
107+ "message": "Влезте в трезора си"
108+ },
109+ "autoFillInfo": {
110+ "message": "В текущия раздел няма записи, които да бъдат попълнени."
111+ },
112+ "addLogin": {
113+ "message": "Добавяне на запис"
114+ },
115+ "addItem": {
116+ "message": "Добавяне на елемент"
117+ },
118+ "passwordHint": {
119+ "message": "Подсказка за паролата"
120+ },
121+ "enterEmailToGetHint": {
122+ "message": "Въведете адреса на имейла си, за да получите подсказка за главната си парола."
123+ },
124+ "getMasterPasswordHint": {
125+ "message": "Подсказка за главната парола"
126+ },
127+ "continue": {
128+ "message": "Продължаване"
129+ },
130+ "sendVerificationCode": {
131+ "message": "Изпращане на код за потвърждаване до Вашата ел. поща"
132+ },
133+ "sendCode": {
134+ "message": "Изпращане на кода"
135+ },
136+ "codeSent": {
137+ "message": "Кодът е изпратен"
138+ },
139+ "verificationCode": {
140+ "message": "Код за потвърждаване"
141+ },
142+ "confirmIdentity": {
143+ "message": "Потвърдете самоличността си, за да продължите."
144+ },
145+ "account": {
146+ "message": "Регистрация"
147+ },
148+ "changeMasterPassword": {
149+ "message": "Промяна на главната парола"
150+ },
151+ "fingerprintPhrase": {
152+ "message": "Уникална фраза",
153+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
154+ },
155+ "yourAccountsFingerprint": {
156+ "message": "Уникална фраза, идентифицираща абонамента ви",
157+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
158+ },
159+ "twoStepLogin": {
160+ "message": "Двустепенно удостоверяване"
161+ },
162+ "logOut": {
163+ "message": "Отписване"
164+ },
165+ "about": {
166+ "message": "Относно"
167+ },
168+ "version": {
169+ "message": "Версия"
170+ },
171+ "save": {
172+ "message": "Запазване"
173+ },
174+ "move": {
175+ "message": "Преместване"
176+ },
177+ "addFolder": {
178+ "message": "Добавяне на папка"
179+ },
180+ "name": {
181+ "message": "Име"
182+ },
183+ "editFolder": {
184+ "message": "Редактиране на папка"
185+ },
186+ "deleteFolder": {
187+ "message": "Изтриване на папка"
188+ },
189+ "folders": {
190+ "message": "Папки"
191+ },
192+ "noFolders": {
193+ "message": "Няма папки за показване."
194+ },
195+ "helpFeedback": {
196+ "message": "Помощ и обратна връзка"
197+ },
198+ "sync": {
199+ "message": "Синхронизиране"
200+ },
201+ "syncVaultNow": {
202+ "message": "Синхронизиране сега"
203+ },
204+ "lastSync": {
205+ "message": "Последно синхронизиране:"
206+ },
207+ "passGen": {
208+ "message": "Генератор на пароли"
209+ },
210+ "generator": {
211+ "message": "Генератор",
212+ "description": "Short for 'Password Generator'."
213+ },
214+ "passGenInfo": {
215+ "message": "Автоматично създаване на силни и неповторими пароли."
216+ },
217+ "bitWebVault": {
218+ "message": "Уебтрезорът на Bitwarden"
219+ },
220+ "importItems": {
221+ "message": "Внасяне на елементи"
222+ },
223+ "select": {
224+ "message": "Избор"
225+ },
226+ "generatePassword": {
227+ "message": "Генериране на парола"
228+ },
229+ "regeneratePassword": {
230+ "message": "Регенериране на паролата"
231+ },
232+ "options": {
233+ "message": "Опции"
234+ },
235+ "length": {
236+ "message": "Дължина"
237+ },
238+ "uppercase": {
239+ "message": "Главни букви (A-Z)"
240+ },
241+ "lowercase": {
242+ "message": "Малки букви (a-z)"
243+ },
244+ "numbers": {
245+ "message": "Числа (0-9)"
246+ },
247+ "specialCharacters": {
248+ "message": "Специални знаци (!@#$%^&*)"
249+ },
250+ "numWords": {
251+ "message": "Брой думи"
252+ },
253+ "wordSeparator": {
254+ "message": "Разделител за думи"
255+ },
256+ "capitalize": {
257+ "message": "Главни букви",
258+ "description": "Make the first letter of a work uppercase."
259+ },
260+ "includeNumber": {
261+ "message": "И цифри"
262+ },
263+ "minNumbers": {
264+ "message": "Минимален брой цифри"
265+ },
266+ "minSpecial": {
267+ "message": "Минимален брой специални знаци"
268+ },
269+ "avoidAmbChar": {
270+ "message": "Без нееднозначни знаци"
271+ },
272+ "searchVault": {
273+ "message": "Търсене в трезора"
274+ },
275+ "edit": {
276+ "message": "Редактиране"
277+ },
278+ "view": {
279+ "message": "Преглед"
280+ },
281+ "noItemsInList": {
282+ "message": "Няма елементи за показване."
283+ },
284+ "itemInformation": {
285+ "message": "Сведения за елемента"
286+ },
287+ "username": {
288+ "message": "Потребителско име"
289+ },
290+ "password": {
291+ "message": "Парола"
292+ },
293+ "passphrase": {
294+ "message": "Парола за преминаване"
295+ },
296+ "favorite": {
297+ "message": "Любими"
298+ },
299+ "notes": {
300+ "message": "Бележки"
301+ },
302+ "note": {
303+ "message": "Бележка"
304+ },
305+ "editItem": {
306+ "message": "Редактиране на елемента"
307+ },
308+ "folder": {
309+ "message": "Папка"
310+ },
311+ "deleteItem": {
312+ "message": "Изтриване на елемента"
313+ },
314+ "viewItem": {
315+ "message": "Преглед на елемента"
316+ },
317+ "launch": {
318+ "message": "Пускане"
319+ },
320+ "website": {
321+ "message": "Сайт"
322+ },
323+ "toggleVisibility": {
324+ "message": "Превключване на видимостта"
325+ },
326+ "manage": {
327+ "message": "Управление"
328+ },
329+ "other": {
330+ "message": "Други"
331+ },
332+ "rateExtension": {
333+ "message": "Оценяване на разширението"
334+ },
335+ "rateExtensionDesc": {
336+ "message": "Молим да ни помогнете, като оставите положителен отзив!"
337+ },
338+ "browserNotSupportClipboard": {
339+ "message": "Браузърът не поддържа копиране в буфера, затова копирайте на ръка."
340+ },
341+ "verifyIdentity": {
342+ "message": "Потвърждаване на самоличността"
343+ },
344+ "yourVaultIsLocked": {
345+ "message": "Трезорът е заключен — въведете главната си парола, за да продължите."
346+ },
347+ "unlock": {
348+ "message": "Отключване"
349+ },
350+ "loggedInAsOn": {
351+ "message": "Влезли сте като $EMAIL$ в $HOSTNAME$.",
352+ "placeholders": {
353+ "email": {
354+ "content": "$1",
355+ "example": "name@example.com"
356+ },
357+ "hostname": {
358+ "content": "$2",
359+ "example": "bitwarden.com"
360+ }
361+ }
362+ },
363+ "invalidMasterPassword": {
364+ "message": "Грешна главна парола"
365+ },
366+ "vaultTimeout": {
367+ "message": "Време за достъп"
368+ },
369+ "lockNow": {
370+ "message": "Заключване сега"
371+ },
372+ "immediately": {
373+ "message": "Незабавно"
374+ },
375+ "tenSeconds": {
376+ "message": "10 секунди"
377+ },
378+ "twentySeconds": {
379+ "message": "20 секунди"
380+ },
381+ "thirtySeconds": {
382+ "message": "30 секунди"
383+ },
384+ "oneMinute": {
385+ "message": "1 минута"
386+ },
387+ "twoMinutes": {
388+ "message": "2 минути"
389+ },
390+ "fiveMinutes": {
391+ "message": "5 минути"
392+ },
393+ "fifteenMinutes": {
394+ "message": "15 минути"
395+ },
396+ "thirtyMinutes": {
397+ "message": "30 минути"
398+ },
399+ "oneHour": {
400+ "message": "1 час"
401+ },
402+ "fourHours": {
403+ "message": "4 часа"
404+ },
405+ "onLocked": {
406+ "message": "При заключване на системата"
407+ },
408+ "onRestart": {
409+ "message": "При повторно пускане на четеца"
410+ },
411+ "never": {
412+ "message": "Никога"
413+ },
414+ "security": {
415+ "message": "Сигурност"
416+ },
417+ "errorOccurred": {
418+ "message": "Възникна грешка"
419+ },
420+ "emailRequired": {
421+ "message": "Електронната поща е задължителна."
422+ },
423+ "invalidEmail": {
424+ "message": "Недействителна електронна поща."
425+ },
426+ "masterPasswordRequired": {
427+ "message": "Главната парола е задължителна."
428+ },
429+ "confirmMasterPasswordRequired": {
430+ "message": "Повторното въвеждане на главната парола е задължително."
431+ },
432+ "masterPasswordMinlength": {
433+ "message": "Главната парола трябва да е дълга поне 8 знака."
434+ },
435+ "masterPassDoesntMatch": {
436+ "message": "Главната парола и потвърждението ѝ не съвпадат."
437+ },
438+ "newAccountCreated": {
439+ "message": "Абонаментът ви бе създаден. Вече можете да се впишете."
440+ },
441+ "masterPassSent": {
442+ "message": "Изпратихме ви писмо с подсказка за главната ви парола."
443+ },
444+ "verificationCodeRequired": {
445+ "message": "Кодът за потвърждение е задължителен."
446+ },
447+ "invalidVerificationCode": {
448+ "message": "Грешен код за потвърждаване"
449+ },
450+ "valueCopied": {
451+ "message": "$VALUE$ — копирано",
452+ "description": "Value has been copied to the clipboard.",
453+ "placeholders": {
454+ "value": {
455+ "content": "$1",
456+ "example": "Password"
457+ }
458+ }
459+ },
460+ "autofillError": {
461+ "message": "Неуспешно автоматично попълване. Вместо това копирайте и поставете данните."
462+ },
463+ "loggedOut": {
464+ "message": "Бяхте отписани"
465+ },
466+ "loginExpired": {
467+ "message": "Сесията ви изтече."
468+ },
469+ "logOutConfirmation": {
470+ "message": "Сигурни ли сте, че искате да се отпишете?"
471+ },
472+ "yes": {
473+ "message": "Да"
474+ },
475+ "no": {
476+ "message": "Не"
477+ },
478+ "unexpectedError": {
479+ "message": "Възникна неочаквана грешка."
480+ },
481+ "nameRequired": {
482+ "message": "Изисква се име."
483+ },
484+ "addedFolder": {
485+ "message": "Добавена папка"
486+ },
487+ "changeMasterPass": {
488+ "message": "Промяна на главната парола"
489+ },
490+ "changeMasterPasswordConfirmation": {
491+ "message": "Главната парола на трезор може да се промени чрез сайта bitwarden.com. Искате ли да го посетите?"
492+ },
493+ "twoStepLoginConfirmation": {
494+ "message": "Двустепенното вписване защитава регистрацията ви, като ви кара да потвърдите влизането си чрез устройство-ключ, приложение за удостоверение, мобилно съобщение, телефонно обаждане или електронна поща. Двустепенното вписване може да се включи чрез сайта bitwarden.com. Искате ли да го посетите?"
495+ },
496+ "editedFolder": {
497+ "message": "Редактирана папка"
498+ },
499+ "deleteFolderConfirmation": {
500+ "message": "Сигурни ли сте, че искате да изтриете тази папка?"
501+ },
502+ "deletedFolder": {
503+ "message": "Изтрита папка"
504+ },
505+ "gettingStartedTutorial": {
506+ "message": "Въведение"
507+ },
508+ "gettingStartedTutorialVideo": {
509+ "message": "Изгледайте въведението, за да извлечете максимална полза от разширението Bitwarden."
510+ },
511+ "syncingComplete": {
512+ "message": "Синхронизацията завърши"
513+ },
514+ "syncingFailed": {
515+ "message": "Неуспешно синхронизиране"
516+ },
517+ "passwordCopied": {
518+ "message": "Копирана парола"
519+ },
520+ "uri": {
521+ "message": "Адрес"
522+ },
523+ "uriPosition": {
524+ "message": "Адрес $POSITION$",
525+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
526+ "placeholders": {
527+ "position": {
528+ "content": "$1",
529+ "example": "2"
530+ }
531+ }
532+ },
533+ "newUri": {
534+ "message": "Нов адрес"
535+ },
536+ "addedItem": {
537+ "message": "Елементът е добавен"
538+ },
539+ "editedItem": {
540+ "message": "Елементът е редактиран"
541+ },
542+ "deleteItemConfirmation": {
543+ "message": "Наистина ли искате да изтриете елемента?"
544+ },
545+ "deletedItem": {
546+ "message": "Елементът е изтрит"
547+ },
548+ "overwritePassword": {
549+ "message": "Презаписване на паролата"
550+ },
551+ "overwritePasswordConfirmation": {
552+ "message": "Наистина ли искате да презапишете текущата парола?"
553+ },
554+ "overwriteUsername": {
555+ "message": "Замяна на потребителското име"
556+ },
557+ "overwriteUsernameConfirmation": {
558+ "message": "Наостина ли искате да замените текущото потребителско име?"
559+ },
560+ "searchFolder": {
561+ "message": "Търсене в папката"
562+ },
563+ "searchCollection": {
564+ "message": "Търсене в колекцията"
565+ },
566+ "searchType": {
567+ "message": "Търсене по вид"
568+ },
569+ "noneFolder": {
570+ "message": "Няма папка",
571+ "description": "This is the folder for uncategorized items"
572+ },
573+ "enableAddLoginNotification": {
574+ "message": "Питане за добавяне на запис"
575+ },
576+ "addLoginNotificationDesc": {
577+ "message": "Известията за запазване на регистрации автоматично ви подканят да запазите новите регистрации в трезора при първото ви вписване в тях."
578+ },
579+ "showCardsCurrentTab": {
580+ "message": "Показване на карти в страницата с разделите"
581+ },
582+ "showCardsCurrentTabDesc": {
583+ "message": "Показване на картите в страницата с разделите, за лесно автоматично попълване."
584+ },
585+ "showIdentitiesCurrentTab": {
586+ "message": "Показване на самоличности в страницата с разделите"
587+ },
588+ "showIdentitiesCurrentTabDesc": {
589+ "message": "Показване на самоличностите в страницата с разделите, за лесно автоматично попълване."
590+ },
591+ "clearClipboard": {
592+ "message": "Изчистване на буфера",
593+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
594+ },
595+ "clearClipboardDesc": {
596+ "message": "Автоматично изчистване на буфера след поставяне на стойността.",
597+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
598+ },
599+ "notificationAddDesc": {
600+ "message": "Искате ли тази парола да бъде запазена?"
601+ },
602+ "notificationAddSave": {
603+ "message": "Да, нека се запише сега"
604+ },
605+ "enableChangedPasswordNotification": {
606+ "message": "Питане за обновяване на съществуващ запис"
607+ },
608+ "changedPasswordNotificationDesc": {
609+ "message": "Питане за обновяване на паролата към даден запис, когато бъде засечена промяна в съответния уеб сайт."
610+ },
611+ "notificationChangeDesc": {
612+ "message": "Да се обнови ли паролата в Bitwarden?"
613+ },
614+ "notificationChangeSave": {
615+ "message": "Да, нека се обнови сега"
616+ },
617+ "enableContextMenuItem": {
618+ "message": "Показване на опции в контекстното меню"
619+ },
620+ "contextMenuItemDesc": {
621+ "message": "Щракване с десния бутон на мишката дава достъп до генератора на пароли и съответстващите за уеб сайта записи. "
622+ },
623+ "defaultUriMatchDetection": {
624+ "message": "Стандартно засичане на адреси",
625+ "description": "Default URI match detection for auto-fill."
626+ },
627+ "defaultUriMatchDetectionDesc": {
628+ "message": "Какъв да е начинът, по който да се засича съответствие на адреса за автоматичното попълване на данните."
629+ },
630+ "theme": {
631+ "message": "Облик"
632+ },
633+ "themeDesc": {
634+ "message": "Промяна на цветовия облик на програмата."
635+ },
636+ "dark": {
637+ "message": "Тъмен",
638+ "description": "Dark color"
639+ },
640+ "light": {
641+ "message": "Светъл",
642+ "description": "Light color"
643+ },
644+ "solarizedDark": {
645+ "message": "Преекспонирано тъмен",
646+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
647+ },
648+ "exportVault": {
649+ "message": "Изнасяне на трезора"
650+ },
651+ "fileFormat": {
652+ "message": "Формат на файла"
653+ },
654+ "warning": {
655+ "message": "ВНИМАНИЕ",
656+ "description": "WARNING (should stay in capitalized letters if the language permits)"
657+ },
658+ "confirmVaultExport": {
659+ "message": "Потвърждаване на изнасянето на трезора"
660+ },
661+ "exportWarningDesc": {
662+ "message": "Данните от трезора ви ще се изнесат в незащитен формат. Не го пращайте по незащитени канали като е-поща. Изтрийте файла незабавно след като свършите работата си с него."
663+ },
664+ "encExportKeyWarningDesc": {
665+ "message": "При изнасяне данните се шифрират с ключа ви. Ако го смените, ще трябва наново да ги изнесете, защото няма да може да дешифрирате настоящия файл."
666+ },
667+ "encExportAccountWarningDesc": {
668+ "message": "Ключовете за шифриране са уникални за всеки потребител, затова не може да внесете шифрирани данни от един потребител в регистрацията на друг."
669+ },
670+ "exportMasterPassword": {
671+ "message": "Въведете главната парола, за да изнесете данните."
672+ },
673+ "shared": {
674+ "message": "Споделено"
675+ },
676+ "learnOrg": {
677+ "message": "Разберете повече за организациите"
678+ },
679+ "learnOrgConfirmation": {
680+ "message": "Битуорден позволява да споделяте части от трезора си чрез използването на организация. Искате ли да научите повече от сайта bitwarden.com?"
681+ },
682+ "moveToOrganization": {
683+ "message": "Преместване в организация"
684+ },
685+ "share": {
686+ "message": "Споделяне"
687+ },
688+ "movedItemToOrg": {
689+ "message": "$ITEMNAME$ се премести в $ORGNAME$",
690+ "placeholders": {
691+ "itemname": {
692+ "content": "$1",
693+ "example": "Secret Item"
694+ },
695+ "orgname": {
696+ "content": "$2",
697+ "example": "Company Name"
698+ }
699+ }
700+ },
701+ "moveToOrgDesc": {
702+ "message": "Изберете организацията, в която искате да преместите записа. Преместването прехвърля собствеността му към новата организация. След това няма вече директно да го притежавате."
703+ },
704+ "learnMore": {
705+ "message": "Научете повече"
706+ },
707+ "authenticatorKeyTotp": {
708+ "message": "Удостоверителен ключ (TOTP)"
709+ },
710+ "verificationCodeTotp": {
711+ "message": "Код за потвърждаване (TOTP)"
712+ },
713+ "copyVerificationCode": {
714+ "message": "Копиране на кода за потвърждаване"
715+ },
716+ "attachments": {
717+ "message": "Прикачвания"
718+ },
719+ "deleteAttachment": {
720+ "message": "Изтриване на прикачения файл"
721+ },
722+ "deleteAttachmentConfirmation": {
723+ "message": "Сигурни ли сте, че искате да изтриете прикачения файл?"
724+ },
725+ "deletedAttachment": {
726+ "message": "Прикаченият файл е изтрит"
727+ },
728+ "newAttachment": {
729+ "message": "Прикачване на файл"
730+ },
731+ "noAttachments": {
732+ "message": "Няма прикачени файлове."
733+ },
734+ "attachmentSaved": {
735+ "message": "Прикаченият файл е запазен."
736+ },
737+ "file": {
738+ "message": "Файл"
739+ },
740+ "selectFile": {
741+ "message": "Изберете файл."
742+ },
743+ "maxFileSize": {
744+ "message": "Големината на файла е най-много 500 MB."
745+ },
746+ "featureUnavailable": {
747+ "message": "Функцията е недостъпна"
748+ },
749+ "updateKey": {
750+ "message": "Трябва да обновите шифриращия си ключ, за да използвате тази възможност."
751+ },
752+ "premiumMembership": {
753+ "message": "Платен абонамент"
754+ },
755+ "premiumManage": {
756+ "message": "Управление на абонамента"
757+ },
758+ "premiumManageAlert": {
759+ "message": "Можете да управлявате абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?"
760+ },
761+ "premiumRefresh": {
762+ "message": "Опресняване на абонамента"
763+ },
764+ "premiumNotCurrentMember": {
765+ "message": "В момента ползвате безплатен абонамент."
766+ },
767+ "premiumSignUpAndGet": {
768+ "message": "Платеният абонамент дава следните предимства:"
769+ },
770+ "ppremiumSignUpStorage": {
771+ "message": "1 GB пространство за файлове, които се шифрират."
772+ },
773+ "ppremiumSignUpTwoStep": {
774+ "message": "Двустепенно удостоверяване чрез YubiKey, FIDO U2F и Duo."
775+ },
776+ "ppremiumSignUpReports": {
777+ "message": "Проверки в списъците с публикувани пароли, проверка на регистрациите и доклади за пробивите в сигурността, което спомага трезорът ви да е допълнително защитен."
778+ },
779+ "ppremiumSignUpTotp": {
780+ "message": "Генериране на временни, еднократни кодове за двустепенно удостоверяване за регистрациите в трезора."
781+ },
782+ "ppremiumSignUpSupport": {
783+ "message": "Приоритетна поддръжка."
784+ },
785+ "ppremiumSignUpFuture": {
786+ "message": "Всички бъдещи функции на платения абонамент! Предстои въвеждането на още!"
787+ },
788+ "premiumPurchase": {
789+ "message": "Покупка на платен абонамент"
790+ },
791+ "premiumPurchaseAlert": {
792+ "message": "Може да платите абонамента си през сайта bitwarden.com. Искате ли да го посетите сега?"
793+ },
794+ "premiumCurrentMember": {
795+ "message": "Честито, ползвате платен абонамент!"
796+ },
797+ "premiumCurrentMemberThanks": {
798+ "message": "Благодарим ви за подкрепата на Bitwarden."
799+ },
800+ "premiumPrice": {
801+ "message": "И това само за $PRICE$ на година!",
802+ "placeholders": {
803+ "price": {
804+ "content": "$1",
805+ "example": "$10"
806+ }
807+ }
808+ },
809+ "refreshComplete": {
810+ "message": "Абонаментът е опреснен"
811+ },
812+ "enableAutoTotpCopy": {
813+ "message": "Автоматично копиране на TOTP"
814+ },
815+ "disableAutoTotpCopyDesc": {
816+ "message": "Ако регистрацията използва и удостоверителен ключ, временният, еднократен код се копира в буфера при всяко автоматично попълване на формуляра."
817+ },
818+ "enableAutoBiometricsPrompt": {
819+ "message": "Питане за биометрични данни при пускане"
820+ },
821+ "premiumRequired": {
822+ "message": "Изисква се платен абонамент"
823+ },
824+ "premiumRequiredDesc": {
825+ "message": "За да се възползвате от тази възможност, трябва да ползвате платен абонамент."
826+ },
827+ "enterVerificationCodeApp": {
828+ "message": "Въведете шестцифрения код за потвърждение от приложението за удостоверяване."
829+ },
830+ "enterVerificationCodeEmail": {
831+ "message": "Въведете шестцифрения код за потвърждение, който е бил изпратен на $EMAIL$.",
832+ "placeholders": {
833+ "email": {
834+ "content": "$1",
835+ "example": "example@gmail.com"
836+ }
837+ }
838+ },
839+ "verificationCodeEmailSent": {
840+ "message": "Писмото за потвърждение е изпратено на $EMAIL$.",
841+ "placeholders": {
842+ "email": {
843+ "content": "$1",
844+ "example": "example@gmail.com"
845+ }
846+ }
847+ },
848+ "rememberMe": {
849+ "message": "Запомняне"
850+ },
851+ "sendVerificationCodeEmailAgain": {
852+ "message": "Повторно изпращане на писмото за потвърждение"
853+ },
854+ "useAnotherTwoStepMethod": {
855+ "message": "Използвайте друг начин на двустепенно удостоверяване"
856+ },
857+ "insertYubiKey": {
858+ "message": "Поставете устройството на YubiKey в USB порт на компютъра и натиснете бутона на устройството."
859+ },
860+ "insertU2f": {
861+ "message": "Поставете устройството за удостоверяване в USB порт на компютъра. Ако на устройството има бутон, натиснете го."
862+ },
863+ "webAuthnNewTab": {
864+ "message": "Продължаване на двустепенното удостоверяване чрез WebAuthn в новия раздел."
865+ },
866+ "webAuthnNewTabOpen": {
867+ "message": "Отваряне на нов раздел"
868+ },
869+ "webAuthnAuthenticate": {
870+ "message": "Идентификация WebAuthn"
871+ },
872+ "loginUnavailable": {
873+ "message": "Записът липсва"
874+ },
875+ "noTwoStepProviders": {
876+ "message": "Регистрацията е защитена с двустепенно удостоверяване, но никой от настроените доставчици на удостоверяване не се поддържа от този браузър."
877+ },
878+ "noTwoStepProviders2": {
879+ "message": "Пробвайте с поддържан уеб браузър (като Chrome или Firefox) и други доставчици на удостоверяване, които се поддържат от браузърите (като специални програми за удостоверяване)."
880+ },
881+ "twoStepOptions": {
882+ "message": "Настройки на двустепенното удостоверяване"
883+ },
884+ "recoveryCodeDesc": {
885+ "message": "Ако сте загубили достъп до двустепенното удостоверяване, може да използвате код за възстановяване, за да изключите двустепенното удостоверяване в абонамента си."
886+ },
887+ "recoveryCodeTitle": {
888+ "message": "Код за възстановяване"
889+ },
890+ "authenticatorAppTitle": {
891+ "message": "Приложение за удостоверяване"
892+ },
893+ "authenticatorAppDesc": {
894+ "message": "Използвайте приложение за удостоверяване (като Authy или Google Authenticator) за генерирането на временни кодове за потвърждение.",
895+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
896+ },
897+ "yubiKeyTitle": {
898+ "message": "Устройство YubiKey OTP"
899+ },
900+ "yubiKeyDesc": {
901+ "message": "Използвайте устройство на YubiKey, за да влезете в абонамента си. Поддържат се моделите YubiKey 4, 4 Nano, 4C и NEO."
902+ },
903+ "duoDesc": {
904+ "message": "Удостоверяване чрез Duo Security, с ползване на приложението Duo Mobile, SMS, телефонен разговор или устройство U2F.",
905+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
906+ },
907+ "duoOrganizationDesc": {
908+ "message": "Удостоверяване чрез Duo Security за организацията ви, с ползване на приложението Duo Mobile, SMS, телефонен разговор или устройство U2F.",
909+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
910+ },
911+ "webAuthnTitle": {
912+ "message": "FIDO2 WebAuthn"
913+ },
914+ "webAuthnDesc": {
915+ "message": "Използвайте всяко устройство, поддържащо WebAuthn, за да влезете в абонамента си."
916+ },
917+ "emailTitle": {
918+ "message": "Електронна поща"
919+ },
920+ "emailDesc": {
921+ "message": "Кодовете за потвърждение ще ви бъдат пратени по е-поща."
922+ },
923+ "selfHostedEnvironment": {
924+ "message": "Собствена среда"
925+ },
926+ "selfHostedEnvironmentFooter": {
927+ "message": "Укажете базовия адрес за собствената ви инсталирана среда на Bitwarden."
928+ },
929+ "customEnvironment": {
930+ "message": "Специална среда"
931+ },
932+ "customEnvironmentFooter": {
933+ "message": "За специални случаи. Може да укажете основните адреси на всяка ползвана услуга поотделно."
934+ },
935+ "baseUrl": {
936+ "message": "Адрес на сървъра"
937+ },
938+ "apiUrl": {
939+ "message": "Адрес на ППИ-сървъра"
940+ },
941+ "webVaultUrl": {
942+ "message": "Адрес на сървъра с трезора в уеб"
943+ },
944+ "identityUrl": {
945+ "message": "Адрес на сървъра със самоличности"
946+ },
947+ "notificationsUrl": {
948+ "message": "Адрес на сървъра за уведомления"
949+ },
950+ "iconsUrl": {
951+ "message": "Адрес на сървъра с иконки"
952+ },
953+ "environmentSaved": {
954+ "message": "Средата с адресите е запазена."
955+ },
956+ "enableAutoFillOnPageLoad": {
957+ "message": "Включване на автоматичното попълване"
958+ },
959+ "enableAutoFillOnPageLoadDesc": {
960+ "message": "При засичане на формуляр за вписване при зареждането на уеб страницата автоматично да се попълват данните на съответстващата регистрация."
961+ },
962+ "experimentalFeature": {
963+ "message": "Това все още е в експериментална фаза, ползвате го на собствена глава."
964+ },
965+ "defaultAutoFillOnPageLoad": {
966+ "message": "Стандартна настройка за автоматичното попълване"
967+ },
968+ "defaultAutoFillOnPageLoadDesc": {
969+ "message": "Ако включите автоматичното попълване при зареждане на страница, след това можете да включвате или изключвате тази функционалност за всеки отделен запис. Това ще бъде стандартният начин на работа за записите, за които не е настроено допълнително."
970+ },
971+ "itemAutoFillOnPageLoad": {
972+ "message": "Автоматично попълване при зареждане на страницата (ако е включено в настройките)"
973+ },
974+ "autoFillOnPageLoadUseDefault": {
975+ "message": "Използване на стандартната настройка"
976+ },
977+ "autoFillOnPageLoadYes": {
978+ "message": "Автоматично попълване при зареждане на страницата"
979+ },
980+ "autoFillOnPageLoadNo": {
981+ "message": "Без автоматично попълване при зареждане на страницата"
982+ },
983+ "commandOpenPopup": {
984+ "message": "Отваряне на трезора в изскачащ прозорец"
985+ },
986+ "commandOpenSidebar": {
987+ "message": "Отваряне на трезора в страничната лента"
988+ },
989+ "commandAutofillDesc": {
990+ "message": "Автоматично попълване на последно използвания запис в текущия сайт."
991+ },
992+ "commandGeneratePasswordDesc": {
993+ "message": "Създаване и копиране на нова случайна парола в буфера."
994+ },
995+ "commandLockVaultDesc": {
996+ "message": "Заключване на трезора"
997+ },
998+ "privateModeWarning": {
999+ "message": "Поддръжката на частния режим е експериментална и някои функционалности са ограничени."
1000+ },
1001+ "customFields": {
1002+ "message": "Допълнителни полета"
1003+ },
1004+ "copyValue": {
1005+ "message": "Копиране на стойността"
1006+ },
1007+ "value": {
1008+ "message": "Стойност"
1009+ },
1010+ "newCustomField": {
1011+ "message": "Ново допълнително поле"
1012+ },
1013+ "dragToSort": {
1014+ "message": "Подредба чрез влачене"
1015+ },
1016+ "cfTypeText": {
1017+ "message": "Текст"
1018+ },
1019+ "cfTypeHidden": {
1020+ "message": "Скрито"
1021+ },
1022+ "cfTypeBoolean": {
1023+ "message": "Булево"
1024+ },
1025+ "cfTypeLinked": {
1026+ "message": "Свързано",
1027+ "description": "This describes a field that is 'linked' (tied) to another field."
1028+ },
1029+ "linkedValue": {
1030+ "message": "Свързана стойност",
1031+ "description": "This describes a value that is 'linked' (tied) to another value."
1032+ },
1033+ "popup2faCloseMessage": {
1034+ "message": "Ако натиснете бутон на мишката извън изскочилия прозорец за кода за потвърждение, същият този прозорец ще се затвори. Искате ли проверката да се извърши в нормален прозорец, който не се затваря толкова лесно?"
1035+ },
1036+ "popupU2fCloseMessage": {
1037+ "message": "Този браузър не поддържа заявки чрез U2F в такъв изскачащ прозорец. Искате ли да се отвори нов прозорец, за да може да се впишете чрез U2F?"
1038+ },
1039+ "enableFavicon": {
1040+ "message": "Показване на иконките на уеб сайтовете"
1041+ },
1042+ "faviconDesc": {
1043+ "message": "Показване на разпознаваемо изображение до всеки запис."
1044+ },
1045+ "enableBadgeCounter": {
1046+ "message": "Показване на брояч в значка"
1047+ },
1048+ "badgeCounterDesc": {
1049+ "message": "Показване на броя записи, които имате за текущата уеб страница."
1050+ },
1051+ "cardholderName": {
1052+ "message": "Име на притежателя на картата"
1053+ },
1054+ "number": {
1055+ "message": "Номер"
1056+ },
1057+ "brand": {
1058+ "message": "Вид"
1059+ },
1060+ "expirationMonth": {
1061+ "message": "Месец на изтичане"
1062+ },
1063+ "expirationYear": {
1064+ "message": "Година на изтичане"
1065+ },
1066+ "expiration": {
1067+ "message": "Изтичане"
1068+ },
1069+ "january": {
1070+ "message": "януари"
1071+ },
1072+ "february": {
1073+ "message": "февруари"
1074+ },
1075+ "march": {
1076+ "message": "март"
1077+ },
1078+ "april": {
1079+ "message": "април"
1080+ },
1081+ "may": {
1082+ "message": "май"
1083+ },
1084+ "june": {
1085+ "message": "юни"
1086+ },
1087+ "july": {
1088+ "message": "юли"
1089+ },
1090+ "august": {
1091+ "message": "август"
1092+ },
1093+ "september": {
1094+ "message": "септември"
1095+ },
1096+ "october": {
1097+ "message": "октомври"
1098+ },
1099+ "november": {
1100+ "message": "ноември"
1101+ },
1102+ "december": {
1103+ "message": "декември"
1104+ },
1105+ "securityCode": {
1106+ "message": "Код за сигурност"
1107+ },
1108+ "ex": {
1109+ "message": "напр."
1110+ },
1111+ "title": {
1112+ "message": "Заглавие"
1113+ },
1114+ "mr": {
1115+ "message": "Г-н"
1116+ },
1117+ "mrs": {
1118+ "message": "Г-жа"
1119+ },
1120+ "ms": {
1121+ "message": "Г-ца"
1122+ },
1123+ "dr": {
1124+ "message": "Д-р"
1125+ },
1126+ "firstName": {
1127+ "message": "Собствено име"
1128+ },
1129+ "middleName": {
1130+ "message": "Презиме"
1131+ },
1132+ "lastName": {
1133+ "message": "Фамилно име"
1134+ },
1135+ "fullName": {
1136+ "message": "Пълно име"
1137+ },
1138+ "identityName": {
1139+ "message": "Име на самоличността"
1140+ },
1141+ "company": {
1142+ "message": "Фирма"
1143+ },
1144+ "ssn": {
1145+ "message": "№ на осигуровката"
1146+ },
1147+ "passportNumber": {
1148+ "message": "№ на паспорта"
1149+ },
1150+ "licenseNumber": {
1151+ "message": "№ на лиценза"
1152+ },
1153+ "email": {
1154+ "message": "Електронна поща"
1155+ },
1156+ "phone": {
1157+ "message": "Телефон"
1158+ },
1159+ "address": {
1160+ "message": "Адрес"
1161+ },
1162+ "address1": {
1163+ "message": "Адрес 1"
1164+ },
1165+ "address2": {
1166+ "message": "Адрес 2"
1167+ },
1168+ "address3": {
1169+ "message": "Адрес 3"
1170+ },
1171+ "cityTown": {
1172+ "message": "Населено място"
1173+ },
1174+ "stateProvince": {
1175+ "message": "Област / щат / провинция"
1176+ },
1177+ "zipPostalCode": {
1178+ "message": "Пощенски код"
1179+ },
1180+ "country": {
1181+ "message": "Държава"
1182+ },
1183+ "type": {
1184+ "message": "Вид"
1185+ },
1186+ "typeLogin": {
1187+ "message": "Запис"
1188+ },
1189+ "typeLogins": {
1190+ "message": "Записи"
1191+ },
1192+ "typeSecureNote": {
1193+ "message": "Защитена бележка"
1194+ },
1195+ "typeCard": {
1196+ "message": "Карта"
1197+ },
1198+ "typeIdentity": {
1199+ "message": "Самоличност"
1200+ },
1201+ "passwordHistory": {
1202+ "message": "Хронология на паролата"
1203+ },
1204+ "back": {
1205+ "message": "Назад"
1206+ },
1207+ "collections": {
1208+ "message": "Колекции"
1209+ },
1210+ "favorites": {
1211+ "message": "Любими"
1212+ },
1213+ "popOutNewWindow": {
1214+ "message": "Отваряне в нов прозорец"
1215+ },
1216+ "refresh": {
1217+ "message": "Опресняване"
1218+ },
1219+ "cards": {
1220+ "message": "Карти"
1221+ },
1222+ "identities": {
1223+ "message": "Самоличности"
1224+ },
1225+ "logins": {
1226+ "message": "Записи"
1227+ },
1228+ "secureNotes": {
1229+ "message": "Защитени бележки"
1230+ },
1231+ "clear": {
1232+ "message": "Изчистване",
1233+ "description": "To clear something out. example: To clear browser history."
1234+ },
1235+ "checkPassword": {
1236+ "message": "Проверка дали паролата е разкрита."
1237+ },
1238+ "passwordExposed": {
1239+ "message": "Паролата е била разкрита поне $VALUE$ път/и в пробиви. Непременно я сменете.",
1240+ "placeholders": {
1241+ "value": {
1242+ "content": "$1",
1243+ "example": "2"
1244+ }
1245+ }
1246+ },
1247+ "passwordSafe": {
1248+ "message": "Паролата не е била разкрита в известните пробиви. Засега ползването ѝ изглежда безопасно."
1249+ },
1250+ "baseDomain": {
1251+ "message": "Основен домейн",
1252+ "description": "Domain name. Ex. website.com"
1253+ },
1254+ "domainName": {
1255+ "message": "Име на домейн",
1256+ "description": "Domain name. Ex. website.com"
1257+ },
1258+ "host": {
1259+ "message": "Сървър",
1260+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
1261+ },
1262+ "exact": {
1263+ "message": "Точно"
1264+ },
1265+ "startsWith": {
1266+ "message": "Започва с"
1267+ },
1268+ "regEx": {
1269+ "message": "Регулярен израз",
1270+ "description": "A programming term, also known as 'RegEx'."
1271+ },
1272+ "matchDetection": {
1273+ "message": "Откриване на съвпадения",
1274+ "description": "URI match detection for auto-fill."
1275+ },
1276+ "defaultMatchDetection": {
1277+ "message": "Стандартно откриване на съвпадения",
1278+ "description": "Default URI match detection for auto-fill."
1279+ },
1280+ "toggleOptions": {
1281+ "message": "Настройки на превключване"
1282+ },
1283+ "toggleCurrentUris": {
1284+ "message": "Превключване на текущите адреси",
1285+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
1286+ },
1287+ "currentUri": {
1288+ "message": "Текущ адрес",
1289+ "description": "The URI of one of the current open tabs in the browser."
1290+ },
1291+ "organization": {
1292+ "message": "Организация",
1293+ "description": "An entity of multiple related people (ex. a team or business organization)."
1294+ },
1295+ "types": {
1296+ "message": "Видове"
1297+ },
1298+ "allItems": {
1299+ "message": "Всички елементи"
1300+ },
1301+ "noPasswordsInList": {
1302+ "message": "Няма пароли за показване."
1303+ },
1304+ "remove": {
1305+ "message": "Премахване"
1306+ },
1307+ "default": {
1308+ "message": "Стандартно"
1309+ },
1310+ "dateUpdated": {
1311+ "message": "Обновено",
1312+ "description": "ex. Date this item was updated"
1313+ },
1314+ "datePasswordUpdated": {
1315+ "message": "Обновена парола",
1316+ "description": "ex. Date this password was updated"
1317+ },
1318+ "neverLockWarning": {
1319+ "message": "Уверени ли сте, че искате да зададете стойност „Никога“? Това води до съхранение на шифриращия ключ за трезора във устройството ви. Ако използвате тази възможност, е много важно да имате надлежна защита на устройството си."
1320+ },
1321+ "noOrganizationsList": {
1322+ "message": "Не сте член на никоя организация. Организациите позволяват да споделяте записи с други потребители по защитен начин."
1323+ },
1324+ "noCollectionsInList": {
1325+ "message": "Няма колекции за показване."
1326+ },
1327+ "ownership": {
1328+ "message": "Собственост"
1329+ },
1330+ "whoOwnsThisItem": {
1331+ "message": "Кой притежава този запис?"
1332+ },
1333+ "strong": {
1334+ "message": "Силна",
1335+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
1336+ },
1337+ "good": {
1338+ "message": "Добра",
1339+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
1340+ },
1341+ "weak": {
1342+ "message": "Слаба",
1343+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
1344+ },
1345+ "weakMasterPassword": {
1346+ "message": "Слаба главна парола"
1347+ },
1348+ "weakMasterPasswordDesc": {
1349+ "message": "Зададената главна парола е твърде слаба. Главната парола трябва да е силна. Добре е да ползвате цяла фраза за парола, за да защитите данните в трезора в Bitwarden. Уверени ли сте, че искате да ползвате слаба парола?"
1350+ },
1351+ "pin": {
1352+ "message": "ПИН",
1353+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
1354+ },
1355+ "unlockWithPin": {
1356+ "message": "Отключване с ПИН"
1357+ },
1358+ "setYourPinCode": {
1359+ "message": "Задайте ПИН за отключване на Bitwarden. Настройките за ПИН се изчистват при всяко пълно излизане от програмата."
1360+ },
1361+ "pinRequired": {
1362+ "message": "Необходим е ПИН."
1363+ },
1364+ "invalidPin": {
1365+ "message": "Неправилен ПИН."
1366+ },
1367+ "unlockWithBiometrics": {
1368+ "message": "Отключване с биометрични данни"
1369+ },
1370+ "awaitDesktop": {
1371+ "message": "Чака се потвърждение от самостоятелното приложение"
1372+ },
1373+ "awaitDesktopDesc": {
1374+ "message": "За да включите потвърждаване с биометрични данни в браузъра, потвърдете ползването им в самостоятелното приложение."
1375+ },
1376+ "lockWithMasterPassOnRestart": {
1377+ "message": "Заключване с главната парола при повторно пускане на браузъра"
1378+ },
1379+ "selectOneCollection": {
1380+ "message": "Изберете поне една колекция."
1381+ },
1382+ "cloneItem": {
1383+ "message": "Дублирате на елемент"
1384+ },
1385+ "clone": {
1386+ "message": "Клониране"
1387+ },
1388+ "passwordGeneratorPolicyInEffect": {
1389+ "message": "Поне една политика на организация влияе на настройките на генерирането на паролите."
1390+ },
1391+ "vaultTimeoutAction": {
1392+ "message": "Действие при изтичане на времето"
1393+ },
1394+ "lock": {
1395+ "message": "Заключване",
1396+ "description": "Verb form: to make secure or inaccesible by"
1397+ },
1398+ "trash": {
1399+ "message": "Кошче",
1400+ "description": "Noun: a special folder to hold deleted items"
1401+ },
1402+ "searchTrash": {
1403+ "message": "Търсене в кошчето"
1404+ },
1405+ "permanentlyDeleteItem": {
1406+ "message": "Окончателно изтриване на запис"
1407+ },
1408+ "permanentlyDeleteItemConfirmation": {
1409+ "message": "Сигурни ли сте, че искате да изтриете записа окончателно?"
1410+ },
1411+ "permanentlyDeletedItem": {
1412+ "message": "Записът е изтрит окончателно"
1413+ },
1414+ "restoreItem": {
1415+ "message": "Възстановяване на запис"
1416+ },
1417+ "restoreItemConfirmation": {
1418+ "message": "Сигурни ли сте, че искате да възстановите записа?"
1419+ },
1420+ "restoredItem": {
1421+ "message": "Записът е възстановен"
1422+ },
1423+ "vaultTimeoutLogOutConfirmation": {
1424+ "message": "Излизането от трезора изцяло спира достъпа до него след изтичане на времето. Ще ви се наложи отново да се идентифицирате, за да го достъпите. Сигурни ли сте, че искате това действие?"
1425+ },
1426+ "vaultTimeoutLogOutConfirmationTitle": {
1427+ "message": "Потвърждаване на действието"
1428+ },
1429+ "autoFillAndSave": {
1430+ "message": "Дописване и обновяване"
1431+ },
1432+ "autoFillSuccessAndSavedUri": {
1433+ "message": "Автоматично дописан запис и адрес"
1434+ },
1435+ "autoFillSuccess": {
1436+ "message": "Автоматично дописан запис"
1437+ },
1438+ "setMasterPassword": {
1439+ "message": "Задаване на главна парола"
1440+ },
1441+ "masterPasswordPolicyInEffect": {
1442+ "message": "Поне една политика на организация има следните изисквания към главната ви парола:"
1443+ },
1444+ "policyInEffectMinComplexity": {
1445+ "message": "Минимална сложност от $SCORE$",
1446+ "placeholders": {
1447+ "score": {
1448+ "content": "$1",
1449+ "example": "4"
1450+ }
1451+ }
1452+ },
1453+ "policyInEffectMinLength": {
1454+ "message": "Минимална дължина: $LENGTH$",
1455+ "placeholders": {
1456+ "length": {
1457+ "content": "$1",
1458+ "example": "14"
1459+ }
1460+ }
1461+ },
1462+ "policyInEffectUppercase": {
1463+ "message": "Поне една главна буква"
1464+ },
1465+ "policyInEffectLowercase": {
1466+ "message": "Поне една малка буква"
1467+ },
1468+ "policyInEffectNumbers": {
1469+ "message": "Поне една цифра"
1470+ },
1471+ "policyInEffectSpecial": {
1472+ "message": "Поне един от следните специални знаци: $CHARS$",
1473+ "placeholders": {
1474+ "chars": {
1475+ "content": "$1",
1476+ "example": "!@#$%^&*"
1477+ }
1478+ }
1479+ },
1480+ "masterPasswordPolicyRequirementsNotMet": {
1481+ "message": "Паролата ви не отговаря на политиките."
1482+ },
1483+ "acceptPolicies": {
1484+ "message": "Чрез тази отметка вие се съгласявате със следното:"
1485+ },
1486+ "acceptPoliciesRequired": {
1487+ "message": "Условията за използване и политиката за поверителност не бяха приети."
1488+ },
1489+ "termsOfService": {
1490+ "message": "Общи условия"
1491+ },
1492+ "privacyPolicy": {
1493+ "message": "Политика за поверителност"
1494+ },
1495+ "hintEqualsPassword": {
1496+ "message": "Подсказването за паролата не може да съвпада с нея."
1497+ },
1498+ "ok": {
1499+ "message": "Добре"
1500+ },
1501+ "desktopSyncVerificationTitle": {
1502+ "message": "Потвърждаване на синхронизацията на самостоятелното приложение"
1503+ },
1504+ "desktopIntegrationVerificationText": {
1505+ "message": "Уверете се, че самостоятелното приложение показва следния идентификатор:"
1506+ },
1507+ "desktopIntegrationDisabledTitle": {
1508+ "message": "Интеграцията с браузър е изключена"
1509+ },
1510+ "desktopIntegrationDisabledDesc": {
1511+ "message": "Интеграцията с браузъри не е включена в самостоятелното приложение на Битуорден. Включете я в неговите настройки."
1512+ },
1513+ "startDesktopTitle": {
1514+ "message": "Стартиране на самостоятелното приложение на Битуорден"
1515+ },
1516+ "startDesktopDesc": {
1517+ "message": "Трябва да стартирате самостоятелното приложение на Битуорден, преди да ползвате тази функционалност."
1518+ },
1519+ "errorEnableBiometricTitle": {
1520+ "message": "Потвърждаването с биометрични данни не може да се включи"
1521+ },
1522+ "errorEnableBiometricDesc": {
1523+ "message": "Действието е отменено от самостоятелното приложение"
1524+ },
1525+ "nativeMessagingInvalidEncryptionDesc": {
1526+ "message": "Самостоятелното приложение прекъсна надеждния канал за връзка. Пробвайте отново"
1527+ },
1528+ "nativeMessagingInvalidEncryptionTitle": {
1529+ "message": "Връзката със самостоятелното приложение е нарушена"
1530+ },
1531+ "nativeMessagingWrongUserDesc": {
1532+ "message": "В момента самостоятелното приложение е с регистрация на различен потребител. За да работят заедно, двете приложения трябва да ползват една и съща регистрация."
1533+ },
1534+ "nativeMessagingWrongUserTitle": {
1535+ "message": "Регистрациите са различни"
1536+ },
1537+ "biometricsNotEnabledTitle": {
1538+ "message": "Потвърждаването с биометрични данни не е включено"
1539+ },
1540+ "biometricsNotEnabledDesc": {
1541+ "message": "Потвърждаването с биометрични данни в браузъра изисква включването включването им в настройките за самостоятелното приложение."
1542+ },
1543+ "biometricsNotSupportedTitle": {
1544+ "message": "Потвърждаването с биометрични данни не се поддържа"
1545+ },
1546+ "biometricsNotSupportedDesc": {
1547+ "message": "Устройството не поддържа потвърждаване с биометрични данни."
1548+ },
1549+ "nativeMessaginPermissionErrorTitle": {
1550+ "message": "Правото не е дадено"
1551+ },
1552+ "nativeMessaginPermissionErrorDesc": {
1553+ "message": "Разширението за браузъра не може да осигури потвърждаване с биометрични данни, когато липсва право за връзка със самостоятелното приложение. Пробвайте отново."
1554+ },
1555+ "nativeMessaginPermissionSidebarTitle": {
1556+ "message": "Необходимо е разрешение"
1557+ },
1558+ "nativeMessaginPermissionSidebarDesc": {
1559+ "message": "Това действие не може да бъде извършено в страничната лента, опитайте отново в изскачащ прозорец."
1560+ },
1561+ "personalOwnershipSubmitError": {
1562+ "message": "Заради някоя политика за голяма организация не може да запазвате елементи в собствения си трезор. Променете собствеността да е на организация и изберете от наличните колекции."
1563+ },
1564+ "personalOwnershipPolicyInEffect": {
1565+ "message": "Политика от някоя организация влияе на вариантите за собственост."
1566+ },
1567+ "excludedDomains": {
1568+ "message": "Изключени домейни"
1569+ },
1570+ "excludedDomainsDesc": {
1571+ "message": "Битуорден няма да пита дали да запазва данните за вход в тези сайтове. За да влезе правилото в сила, презаредете страницата."
1572+ },
1573+ "excludedDomainsInvalidDomain": {
1574+ "message": "$DOMAIN$ не е валиден домейн",
1575+ "placeholders": {
1576+ "domain": {
1577+ "content": "$1",
1578+ "example": "googlecom"
1579+ }
1580+ }
1581+ },
1582+ "send": {
1583+ "message": "Изпращане",
1584+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1585+ },
1586+ "searchSends": {
1587+ "message": "Търсене в изпратените",
1588+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1589+ },
1590+ "addSend": {
1591+ "message": "Добавяне на изпращане",
1592+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1593+ },
1594+ "sendTypeText": {
1595+ "message": "Текст"
1596+ },
1597+ "sendTypeFile": {
1598+ "message": "Файл"
1599+ },
1600+ "allSends": {
1601+ "message": "Всички изпращания",
1602+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1603+ },
1604+ "maxAccessCountReached": {
1605+ "message": "Достигнат е максималният брой достъпвания",
1606+ "description": "This text will be displayed after a Send has been accessed the maximum amount of times."
1607+ },
1608+ "expired": {
1609+ "message": "Изтекъл"
1610+ },
1611+ "pendingDeletion": {
1612+ "message": "Предстои изтриване"
1613+ },
1614+ "passwordProtected": {
1615+ "message": "Защита с парола"
1616+ },
1617+ "copySendLink": {
1618+ "message": "Копиране на връзката към изпратеното",
1619+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1620+ },
1621+ "removePassword": {
1622+ "message": "Премахване на парола"
1623+ },
1624+ "delete": {
1625+ "message": "Изтриване"
1626+ },
1627+ "removedPassword": {
1628+ "message": "Паролата е премахната"
1629+ },
1630+ "deletedSend": {
1631+ "message": "Изтрито изпращане",
1632+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1633+ },
1634+ "sendLink": {
1635+ "message": "Изпращане на връзката",
1636+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1637+ },
1638+ "disabled": {
1639+ "message": "Изключено"
1640+ },
1641+ "removePasswordConfirmation": {
1642+ "message": "Сигурни ли сте, че искате да премахнете паролата?"
1643+ },
1644+ "deleteSend": {
1645+ "message": "Изтриване на изпращане",
1646+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1647+ },
1648+ "deleteSendConfirmation": {
1649+ "message": "Сигурни ли сте, че искате да изтриете това изпращане?",
1650+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1651+ },
1652+ "editSend": {
1653+ "message": "Редактиране на изпращане",
1654+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1655+ },
1656+ "sendTypeHeader": {
1657+ "message": "Вид на изпратеното",
1658+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1659+ },
1660+ "sendNameDesc": {
1661+ "message": "Описателно име за това изпращане.",
1662+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1663+ },
1664+ "sendFileDesc": {
1665+ "message": "Файл за изпращане."
1666+ },
1667+ "deletionDate": {
1668+ "message": "Дата на изтриване"
1669+ },
1670+ "deletionDateDesc": {
1671+ "message": "Изпращането ще бъде окончателно изтрито на зададената дата и време.",
1672+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1673+ },
1674+ "expirationDate": {
1675+ "message": "Срок на валидност"
1676+ },
1677+ "expirationDateDesc": {
1678+ "message": "При задаване — това изпращане ще се изключи на зададената дата и време.",
1679+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1680+ },
1681+ "oneDay": {
1682+ "message": "1 ден"
1683+ },
1684+ "days": {
1685+ "message": "$DAYS$ ден/дни",
1686+ "placeholders": {
1687+ "days": {
1688+ "content": "$1",
1689+ "example": "2"
1690+ }
1691+ }
1692+ },
1693+ "custom": {
1694+ "message": "По избор"
1695+ },
1696+ "maximumAccessCount": {
1697+ "message": "Максимален брой достъпвания."
1698+ },
1699+ "maximumAccessCountDesc": {
1700+ "message": "При задаване — това изпращане ще се изключи след определен брой достъпвания.",
1701+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1702+ },
1703+ "sendPasswordDesc": {
1704+ "message": "Изискване на парола за достъп до това изпращане.",
1705+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1706+ },
1707+ "sendNotesDesc": {
1708+ "message": "Скрити бележки за това изпращане.",
1709+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1710+ },
1711+ "sendDisableDesc": {
1712+ "message": "Пълно спиране на това изпращане — никой няма да има достъп.",
1713+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1714+ },
1715+ "sendShareDesc": {
1716+ "message": "Копиране на връзката към това изпращане при запазването му.",
1717+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1718+ },
1719+ "sendTextDesc": {
1720+ "message": "Текст за изпращане."
1721+ },
1722+ "sendHideText": {
1723+ "message": "Стандартно текстът на това изпращане да се крие.",
1724+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1725+ },
1726+ "currentAccessCount": {
1727+ "message": "Текущ брой на достъпванията"
1728+ },
1729+ "createSend": {
1730+ "message": "Създаване на изпращане",
1731+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1732+ },
1733+ "newPassword": {
1734+ "message": "Нова парола"
1735+ },
1736+ "sendDisabled": {
1737+ "message": "Изпращането е изключено",
1738+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1739+ },
1740+ "sendDisabledWarning": {
1741+ "message": "Поради политика на организация, може само да изтривате съществуващи изпращания.",
1742+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1743+ },
1744+ "createdSend": {
1745+ "message": "Създадено изпращане",
1746+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1747+ },
1748+ "editedSend": {
1749+ "message": "Редактирано изпращане",
1750+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1751+ },
1752+ "sendLinuxChromiumFileWarning": {
1753+ "message": "За да изберете файл, отворете разширението в страничната лента (ако е възможно) или в нов прозорец, като натиснете това съобщение."
1754+ },
1755+ "sendFirefoxFileWarning": {
1756+ "message": "За да изберете файл във Firefox, отворете разширението в страничната лента или в нов прозорец, като натиснете това съобщение."
1757+ },
1758+ "sendSafariFileWarning": {
1759+ "message": "За да изберете файл в Safari, отворете разширението в нов прозорец, като натиснете това съобщение."
1760+ },
1761+ "sendFileCalloutHeader": {
1762+ "message": "Преди да почнете"
1763+ },
1764+ "sendFirefoxCustomDatePopoutMessage1": {
1765+ "message": "За избор на дата от каландар",
1766+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
1767+ },
1768+ "sendFirefoxCustomDatePopoutMessage2": {
1769+ "message": "натиснете тук",
1770+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
1771+ },
1772+ "sendFirefoxCustomDatePopoutMessage3": {
1773+ "message": "за изскачащ прозорец.",
1774+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
1775+ },
1776+ "expirationDateIsInvalid": {
1777+ "message": "Неправилна дата на валидност."
1778+ },
1779+ "deletionDateIsInvalid": {
1780+ "message": "Неправилна дата на изтриване."
1781+ },
1782+ "expirationDateAndTimeRequired": {
1783+ "message": "Необходими са дата и време на валидност."
1784+ },
1785+ "deletionDateAndTimeRequired": {
1786+ "message": "Необходима е дата на изтриване."
1787+ },
1788+ "dateParsingError": {
1789+ "message": "Грешка при запазване на датата на валидност и изтриване."
1790+ },
1791+ "hideEmail": {
1792+ "message": "Скриване на е-пощата ми от получателите."
1793+ },
1794+ "sendOptionsPolicyInEffect": {
1795+ "message": "Поне една политика на организация влияе на настройките за изпращане."
1796+ },
1797+ "passwordPrompt": {
1798+ "message": "Повторно запитване за главната парола"
1799+ },
1800+ "passwordConfirmation": {
1801+ "message": "Потвърждение на главната парола"
1802+ },
1803+ "passwordConfirmationDesc": {
1804+ "message": "Това действие е защитено. За да продължите, въведете отново главната си парола, за да потвърдите самоличността си."
1805+ },
1806+ "emailVerificationRequired": {
1807+ "message": "Изисква се потвърждение на е-пощата"
1808+ },
1809+ "emailVerificationRequiredDesc": {
1810+ "message": "Трябва да потвърдите е-пощата си, за да използвате тази функционалност. Можете да го направите в уеб-трезора."
1811+ },
1812+ "updatedMasterPassword": {
1813+ "message": "Главната парола е променена"
1814+ },
1815+ "updateMasterPassword": {
1816+ "message": "Промяна на главната парола"
1817+ },
1818+ "updateMasterPasswordWarning": {
1819+ "message": "Вашата главна парола наскоро е била сменена от администратор в организацията Ви. За да получите достъп до трезора, трябва първо да я промените. Това означава, че ще бъдете отписан(а) от текущата си сесия и ще трябва да се впишете отново. Активните сесии на други устройства може да продължат да бъдат активни още един час."
1820+ },
1821+ "resetPasswordPolicyAutoEnroll": {
1822+ "message": "Автоматично включване"
1823+ },
1824+ "resetPasswordAutoEnrollInviteWarning": {
1825+ "message": "Тази организация включва автоматично новите си потребители в смяната на пароли. Това означава, че администраторите на организацията ще могат да променят главната Ви парола."
1826+ },
1827+ "selectFolder": {
1828+ "message": "Избиране на папка..."
1829+ },
1830+ "ssoCompleteRegistration": {
1831+ "message": "За да завършите настройките за еднократна идентификация, трябва да зададете главна парола за трезора."
1832+ },
1833+ "hours": {
1834+ "message": "Часа"
1835+ },
1836+ "minutes": {
1837+ "message": "Минути"
1838+ },
1839+ "vaultTimeoutPolicyInEffect": {
1840+ "message": "Настройките на организацията Ви влияят върху времето за достъп до трезора Ви. Максималното разрешено време за достъп е $HOURS$ час(а) и $MINUTES$ минути",
1841+ "placeholders": {
1842+ "hours": {
1843+ "content": "$1",
1844+ "example": "5"
1845+ },
1846+ "minutes": {
1847+ "content": "$2",
1848+ "example": "5"
1849+ }
1850+ }
1851+ },
1852+ "vaultTimeoutTooLarge": {
1853+ "message": "Времето за достъп до трезора Ви превишава ограничението, определено от организацията Ви."
1854+ },
1855+ "vaultExportDisabled": {
1856+ "message": "Изнасянето на трезора е изключено"
1857+ },
1858+ "personalVaultExportPolicyInEffect": {
1859+ "message": "Една или повече от настройките на организацията Ви не позволяват да изнасяте личния си трезор."
1860+ },
1861+ "copyCustomFieldNameInvalidElement": {
1862+ "message": "Не може да бъде открит подходящ елемент от формуляр. Опитайте да инспектирате кода на HTML."
1863+ },
1864+ "copyCustomFieldNameNotUnique": {
1865+ "message": "Няма намерен уникален идентификатор."
1866+ },
1867+ "convertOrganizationEncryptionDesc": {
1868+ "message": "$ORGANIZATION$ използва еднократно удостоверяване със собствен сървър за ключове. Членовете на тази организация вече нямат нужда от главна парола за вписване.",
1869+ "placeholders": {
1870+ "organization": {
1871+ "content": "$1",
1872+ "example": "My Org Name"
1873+ }
1874+ }
1875+ },
1876+ "leaveOrganization": {
1877+ "message": "Напускане на организацията"
1878+ },
1879+ "removeMasterPassword": {
1880+ "message": "Премахване на главната парола"
1881+ },
1882+ "removedMasterPassword": {
1883+ "message": "Главната парола е премахната."
1884+ },
1885+ "leaveOrganizationConfirmation": {
1886+ "message": "Наистина ли искате да напуснете тази организация?"
1887+ },
1888+ "leftOrganization": {
1889+ "message": "Напуснахте организацията."
1890+ },
1891+ "toggleCharacterCount": {
1892+ "message": "Превключване на броя знаци"
1893+ },
1894+ "sessionTimeout": {
1895+ "message": "Сесията Ви изтече. Моля, върнете се назад и се опитайте да влезете отново."
1896+ },
1897+ "exportingPersonalVaultTitle": {
1898+ "message": "Изнасяне на личния трезор"
1899+ },
1900+ "exportingPersonalVaultDescription": {
1901+ "message": "Ще бъдат изнесени само записите от личния трезор свързан с $EMAIL$. Записите в трезора на организацията няма да бъдат включени.",
1902+ "placeholders": {
1903+ "email": {
1904+ "content": "$1",
1905+ "example": "name@example.com"
1906+ }
1907+ }
1908+ },
1909+ "error": {
1910+ "message": "Грешка"
1911+ },
1912+ "regenerateUsername": {
1913+ "message": "Повторно генериране на потр. име"
1914+ },
1915+ "generateUsername": {
1916+ "message": "Генериране на потр. име"
1917+ },
1918+ "usernameType": {
1919+ "message": "Тип потребителско име"
1920+ },
1921+ "plusAddressedEmail": {
1922+ "message": "Plus Addressed Email",
1923+ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
1924+ },
1925+ "plusAddressedEmailDesc": {
1926+ "message": "Използвайте възможностите за под-адресиране на е-поща на своя доставчик."
1927+ },
1928+ "catchallEmail": {
1929+ "message": "Catch-all Email"
1930+ },
1931+ "catchallEmailDesc": {
1932+ "message": "Use your domain's configured catch-all inbox."
1933+ },
1934+ "random": {
1935+ "message": "Произволно"
1936+ },
1937+ "randomWord": {
1938+ "message": "Произволна дума"
1939+ },
1940+ "websiteName": {
1941+ "message": "Име на уеб сайт"
1942+ },
1943+ "whatWouldYouLikeToGenerate": {
1944+ "message": "Какво бихте искали да генерирате?"
1945+ },
1946+ "passwordType": {
1947+ "message": "Тип парола"
1948+ },
1949+ "service": {
1950+ "message": "Услуга"
1951+ },
1952+ "forwardedEmail": {
1953+ "message": "Forwarded Email Alias"
1954+ },
1955+ "forwardedEmailDesc": {
1956+ "message": "Generate an email alias with an external forwarding service."
1957+ },
1958+ "hostname": {
1959+ "message": "Име на сървъра",
1960+ "description": "Part of a URL."
1961+ },
1962+ "apiAccessToken": {
1963+ "message": "Идентификатор за достъп до API"
1964+ },
1965+ "apiKey": {
1966+ "message": "Ключ за API"
1967+ },
1968+ "ssoKeyConnectorError": {
1969+ "message": "Грешка с конектора за ключове: уверете се, че конекторът за ключове е наличен и работи правилно."
1970+ },
1971+ "organizationIsDisabled": {
1972+ "message": "Организацията е изключена."
1973+ },
1974+ "disabledOrganizationFilterError": {
1975+ "message": "Записите в изключени организации не са достъпни. Свържете се със собственика на организацията си за помощ."
1976+ },
1977+ "cardBrandMir": {
1978+ "message": "Мир"
1979+ }
1980+}
apps/browser/src/_locales/bn/messages.jsonnew file+1980
@@ -0,0 +1,1980 @@
1+{
2+ "appName": {
3+ "message": "Bitwarden"
4+ },
5+ "extName": {
6+ "message": "Bitwarden",
7+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
8+ },
9+ "extDesc": {
10+ "message": "আপনার সমস্ত ডিভাইসের জন্য একটি সুরক্ষিত এবং বিনামূল্যের পাসওয়ার্ড ব্যবস্থাপক।",
11+ "description": "Extension description"
12+ },
13+ "loginOrCreateNewAccount": {
14+ "message": "আপনার সুরক্ষিত ভল্টে প্রবেশ করতে লগ ইন করুন অথবা একটি নতুন অ্যাকাউন্ট তৈরি করুন।"
15+ },
16+ "createAccount": {
17+ "message": "অ্যাকাউন্ট তৈরি করুন"
18+ },
19+ "login": {
20+ "message": "প্রবেশ করুন"
21+ },
22+ "enterpriseSingleSignOn": {
23+ "message": "এন্টারপ্রাইজ একক সাইন-অন"
24+ },
25+ "cancel": {
26+ "message": "বাতিল"
27+ },
28+ "close": {
29+ "message": "বন্ধ করুন"
30+ },
31+ "submit": {
32+ "message": "জমা দিন"
33+ },
34+ "emailAddress": {
35+ "message": "ইমেইল ঠিকানা"
36+ },
37+ "masterPass": {
38+ "message": "মূল পাসওয়ার্ড"
39+ },
40+ "masterPassDesc": {
41+ "message": "মূল পাসওয়ার্ড হল সেই পাসওয়ার্ডটি যা আপনি নিজের ভল্ট ব্যাবহার করতে ব্যবহার করেন। এটি খুব গুরুত্বপূর্ণ যে আপনি নিজের মূল পাসওয়ার্ডটি ভুলে যাবেন না। আপনি যদি ভুলে গিয়ে থাকেন তবে পাসওয়ার্ডটি পুনরুদ্ধার করার কোনও উপায় নেই।"
42+ },
43+ "masterPassHintDesc": {
44+ "message": "যদি আপনি আপনার পাসওয়ার্ড ভুলে যান তাহলে একটি মূল পাসওয়ার্ডের ইঙ্গিতটি আপনাকে মনে করাতে সাহায্য করতে পারে।"
45+ },
46+ "reTypeMasterPass": {
47+ "message": "পুনরায় মূল পাসওয়ার্ডটি লিখুন"
48+ },
49+ "masterPassHint": {
50+ "message": "মূল পাসওয়ার্ড ইঙ্গিত (ঐচ্ছিক)"
51+ },
52+ "tab": {
53+ "message": "ট্যাব"
54+ },
55+ "vault": {
56+ "message": "Vault"
57+ },
58+ "myVault": {
59+ "message": "আমার ভল্ট"
60+ },
61+ "allVaults": {
62+ "message": "All Vaults"
63+ },
64+ "tools": {
65+ "message": "সরঞ্জামসমূহ"
66+ },
67+ "settings": {
68+ "message": "সেটিংস"
69+ },
70+ "currentTab": {
71+ "message": "বর্তমান ট্যাব"
72+ },
73+ "copyPassword": {
74+ "message": "পাসওয়ার্ড অনুলিপিত করুন"
75+ },
76+ "copyNote": {
77+ "message": "নোট অনুলিপিত করুন"
78+ },
79+ "copyUri": {
80+ "message": "URI অনুলিপিত করুন"
81+ },
82+ "copyUsername": {
83+ "message": "ব্যবহারকারীর নাম অনুলিপিত করুন"
84+ },
85+ "copyNumber": {
86+ "message": "নম্বর অনুলিপিত করুন"
87+ },
88+ "copySecurityCode": {
89+ "message": "সুরক্ষা কোড অনুলিপিত করুন"
90+ },
91+ "autoFill": {
92+ "message": "স্বতঃপূরণ"
93+ },
94+ "generatePasswordCopied": {
95+ "message": "পাসওয়ার্ড তৈরি করুন (অনুলিপিকৃত)"
96+ },
97+ "copyElementIdentifier": {
98+ "message": "Copy Custom Field Name"
99+ },
100+ "noMatchingLogins": {
101+ "message": "কোনও মিলত লগইন নেই।"
102+ },
103+ "unlockVaultMenu": {
104+ "message": "Unlock your vault"
105+ },
106+ "loginToVaultMenu": {
107+ "message": "Log in to your vault"
108+ },
109+ "autoFillInfo": {
110+ "message": "বর্তমান ব্রাউজার ট্যাবের জন্য স্বয়ংক্রিয় পূরণের কোনও লগইন উপলব্ধ নেই।"
111+ },
112+ "addLogin": {
113+ "message": "একটি লগইন জুড়ুন "
114+ },
115+ "addItem": {
116+ "message": "বস্তু জুড়ুন"
117+ },
118+ "passwordHint": {
119+ "message": "পাসওয়ার্ড ইঙ্গিত"
120+ },
121+ "enterEmailToGetHint": {
122+ "message": "আপনার মূল পাসওয়ার্ডের ইঙ্গিতটি পেতে আপনার অ্যাকাউন্টের ইমেল ঠিকানা প্রবেশ করুন।"
123+ },
124+ "getMasterPasswordHint": {
125+ "message": "মূল পাসওয়ার্ডের ইঙ্গিত পান"
126+ },
127+ "continue": {
128+ "message": "অবিরত"
129+ },
130+ "sendVerificationCode": {
131+ "message": "Send a verification code to your email"
132+ },
133+ "sendCode": {
134+ "message": "Send Code"
135+ },
136+ "codeSent": {
137+ "message": "Code Sent"
138+ },
139+ "verificationCode": {
140+ "message": "যাচাইকরণ কোড"
141+ },
142+ "confirmIdentity": {
143+ "message": "Confirm your identity to continue."
144+ },
145+ "account": {
146+ "message": "অ্যাকাউন্ট"
147+ },
148+ "changeMasterPassword": {
149+ "message": "মূল পাসওয়ার্ড পরিবর্তন"
150+ },
151+ "fingerprintPhrase": {
152+ "message": "ফিঙ্গারপ্রিন্ট ফ্রেজ",
153+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
154+ },
155+ "yourAccountsFingerprint": {
156+ "message": "আপনার অ্যাকাউন্টের ফিঙ্গারপ্রিন্ট ফ্রেজ",
157+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
158+ },
159+ "twoStepLogin": {
160+ "message": "দ্বি-পদক্ষেপের লগইন"
161+ },
162+ "logOut": {
163+ "message": "লগ আউট"
164+ },
165+ "about": {
166+ "message": "সম্বন্ধে"
167+ },
168+ "version": {
169+ "message": "সংস্করণ"
170+ },
171+ "save": {
172+ "message": "সংরক্ষণ"
173+ },
174+ "move": {
175+ "message": "Move"
176+ },
177+ "addFolder": {
178+ "message": "ফোল্ডার জুড়ুন"
179+ },
180+ "name": {
181+ "message": "নাম"
182+ },
183+ "editFolder": {
184+ "message": "ফোল্ডার সম্পাদনা"
185+ },
186+ "deleteFolder": {
187+ "message": "ফোল্ডার মুছুন"
188+ },
189+ "folders": {
190+ "message": "ফোল্ডারসমূহ"
191+ },
192+ "noFolders": {
193+ "message": "তালিকার জন্য কোনও ফোল্ডার নেই।"
194+ },
195+ "helpFeedback": {
196+ "message": "সহায়তা এবং প্রতিক্রিয়া"
197+ },
198+ "sync": {
199+ "message": "সিঙ্ক"
200+ },
201+ "syncVaultNow": {
202+ "message": "এখনই ভল্ট সিঙ্ক করুন"
203+ },
204+ "lastSync": {
205+ "message": "শেষ সিঙ্ক:"
206+ },
207+ "passGen": {
208+ "message": "পাসওয়ার্ড উৎপাদক"
209+ },
210+ "generator": {
211+ "message": "উৎপাদক",
212+ "description": "Short for 'Password Generator'."
213+ },
214+ "passGenInfo": {
215+ "message": "আপনার লগইনগুলির জন্য স্বয়ংক্রিয়ভাবে শক্তিশালী, অদ্বিতীয় পাসওয়ার্ড তৈরি করুন।"
216+ },
217+ "bitWebVault": {
218+ "message": "Bitwarden ওয়েব ভল্ট"
219+ },
220+ "importItems": {
221+ "message": "বস্তু আমদানি"
222+ },
223+ "select": {
224+ "message": "নির্বাচন করুন"
225+ },
226+ "generatePassword": {
227+ "message": "পাসওয়ার্ড তৈরি করুন"
228+ },
229+ "regeneratePassword": {
230+ "message": "পাসওয়ার্ড পুনঃতৈরি করুন"
231+ },
232+ "options": {
233+ "message": "বিকল্পসমূহ"
234+ },
235+ "length": {
236+ "message": "দৈর্ঘ্য"
237+ },
238+ "uppercase": {
239+ "message": "Uppercase (A-Z)"
240+ },
241+ "lowercase": {
242+ "message": "Lowercase (a-z)"
243+ },
244+ "numbers": {
245+ "message": "Numbers (0-9)"
246+ },
247+ "specialCharacters": {
248+ "message": "Special Characters (!@#$%^&*)"
249+ },
250+ "numWords": {
251+ "message": "শব্দের সংখ্যা"
252+ },
253+ "wordSeparator": {
254+ "message": "শব্দ বিভাজক"
255+ },
256+ "capitalize": {
257+ "message": "বড় হাতের করুন",
258+ "description": "Make the first letter of a work uppercase."
259+ },
260+ "includeNumber": {
261+ "message": "নম্বর অন্তর্ভুক্ত করুন"
262+ },
263+ "minNumbers": {
264+ "message": "সর্বনিম্ন সংখ্যা"
265+ },
266+ "minSpecial": {
267+ "message": "ন্যূনতম বিশেষ"
268+ },
269+ "avoidAmbChar": {
270+ "message": "অস্পষ্ট বর্ণগুলি এড়িয়ে চলুন"
271+ },
272+ "searchVault": {
273+ "message": "ভল্ট খুঁজুন"
274+ },
275+ "edit": {
276+ "message": "সম্পাদনা"
277+ },
278+ "view": {
279+ "message": "দেখুন"
280+ },
281+ "noItemsInList": {
282+ "message": "তালিকার জন্য কোনও বস্তু নেই।"
283+ },
284+ "itemInformation": {
285+ "message": "বস্তু তথ্য"
286+ },
287+ "username": {
288+ "message": "ব্যবহারকারীর নাম"
289+ },
290+ "password": {
291+ "message": "পাসওয়ার্ড"
292+ },
293+ "passphrase": {
294+ "message": "পাসফ্রেজ"
295+ },
296+ "favorite": {
297+ "message": "প্রিয়"
298+ },
299+ "notes": {
300+ "message": "নোট"
301+ },
302+ "note": {
303+ "message": "নোট"
304+ },
305+ "editItem": {
306+ "message": "বস্তু সম্পাদনা"
307+ },
308+ "folder": {
309+ "message": "ফোল্ডার"
310+ },
311+ "deleteItem": {
312+ "message": "বস্তু মুছুন"
313+ },
314+ "viewItem": {
315+ "message": "বস্তু দেখুন"
316+ },
317+ "launch": {
318+ "message": "শুরু"
319+ },
320+ "website": {
321+ "message": "ওয়েবসাইট"
322+ },
323+ "toggleVisibility": {
324+ "message": "দৃশ্যমানতা টগল করুন"
325+ },
326+ "manage": {
327+ "message": "পরিচালনা"
328+ },
329+ "other": {
330+ "message": "অন্যান্য"
331+ },
332+ "rateExtension": {
333+ "message": "এক্সটেনশনটি মূল্যায়ন করুন"
334+ },
335+ "rateExtensionDesc": {
336+ "message": "দয়া করে একটি ভাল পর্যালোচনার মাধ্যমে সাহায্য করতে আমাদের বিবেচনা করুন!"
337+ },
338+ "browserNotSupportClipboard": {
339+ "message": "আপনার ওয়েব ব্রাউজার সহজে ক্লিপবোর্ড অনুলিপি সমর্থন করে না। পরিবর্তে এটি নিজেই অনুলিপি করুন।"
340+ },
341+ "verifyIdentity": {
342+ "message": "Verify Identity"
343+ },
344+ "yourVaultIsLocked": {
345+ "message": "আপনার ভল্ট লক করা আছে। চালিয়ে যেতে আপনার মূল পাসওয়ার্ডটি যাচাই করান।"
346+ },
347+ "unlock": {
348+ "message": "আনলক"
349+ },
350+ "loggedInAsOn": {
351+ "message": "$HOSTNAME$ এ $EMAIL$ হিসাবে লগ ইনকৃত",
352+ "placeholders": {
353+ "email": {
354+ "content": "$1",
355+ "example": "name@example.com"
356+ },
357+ "hostname": {
358+ "content": "$2",
359+ "example": "bitwarden.com"
360+ }
361+ }
362+ },
363+ "invalidMasterPassword": {
364+ "message": "অবৈধ মূল পাসওয়ার্ড"
365+ },
366+ "vaultTimeout": {
367+ "message": "ভল্টের সময়সীমা"
368+ },
369+ "lockNow": {
370+ "message": "এখনই লক করুন"
371+ },
372+ "immediately": {
373+ "message": "সঙ্গে সঙ্গে"
374+ },
375+ "tenSeconds": {
376+ "message": "১০ সেকেন্ড"
377+ },
378+ "twentySeconds": {
379+ "message": "২০ সেকেন্ড"
380+ },
381+ "thirtySeconds": {
382+ "message": "৩০ সেকেন্ড"
383+ },
384+ "oneMinute": {
385+ "message": "১ মিনিট"
386+ },
387+ "twoMinutes": {
388+ "message": "২ মিনিট"
389+ },
390+ "fiveMinutes": {
391+ "message": "৫ মিনিট"
392+ },
393+ "fifteenMinutes": {
394+ "message": "১৫ মিনিট"
395+ },
396+ "thirtyMinutes": {
397+ "message": "৩০ মিনিট"
398+ },
399+ "oneHour": {
400+ "message": "১ ঘণ্টা"
401+ },
402+ "fourHours": {
403+ "message": "৪ ঘন্টা"
404+ },
405+ "onLocked": {
406+ "message": "সিস্টেম লকে"
407+ },
408+ "onRestart": {
409+ "message": "ব্রাউজার পুনঃসূচনাই"
410+ },
411+ "never": {
412+ "message": "কখনই না"
413+ },
414+ "security": {
415+ "message": "নিরাপত্তা"
416+ },
417+ "errorOccurred": {
418+ "message": "একটি ত্রুটি উৎপন্ন হয়েছে"
419+ },
420+ "emailRequired": {
421+ "message": "ইমেইল ঠিকানা প্রয়োজন।"
422+ },
423+ "invalidEmail": {
424+ "message": "অকার্যকর ইমেইল ঠিকানা।"
425+ },
426+ "masterPasswordRequired": {
427+ "message": "Master password is required."
428+ },
429+ "confirmMasterPasswordRequired": {
430+ "message": "Master password retype is required."
431+ },
432+ "masterPasswordMinlength": {
433+ "message": "Master password must be at least 8 characters long."
434+ },
435+ "masterPassDoesntMatch": {
436+ "message": "মূল পাসওয়ার্ড নিশ্চিতকরণ মেলেনি।"
437+ },
438+ "newAccountCreated": {
439+ "message": "আপনার নতুন অ্যাকাউন্ট তৈরি করা হয়েছে! আপনি এখন প্রবেশ করতে পারেন।"
440+ },
441+ "masterPassSent": {
442+ "message": "আমরা আপনাকে আপনার মূল পাসওয়ার্ডের ইঙ্গিত সহ একটি ইমেল প্রেরণ করেছি।"
443+ },
444+ "verificationCodeRequired": {
445+ "message": "যাচাইকরণ কোড প্রয়োজন।"
446+ },
447+ "invalidVerificationCode": {
448+ "message": "Invalid verification code"
449+ },
450+ "valueCopied": {
451+ "message": "$VALUE$ অনুলিপিত",
452+ "description": "Value has been copied to the clipboard.",
453+ "placeholders": {
454+ "value": {
455+ "content": "$1",
456+ "example": "Password"
457+ }
458+ }
459+ },
460+ "autofillError": {
461+ "message": "এই পৃষ্ঠায় নির্বাচিত বস্তুটি স্বতঃপূর্ণে অক্ষম। পরিবর্তে তথ্যটি অনুলিপিত করুন এবং আটকান।"
462+ },
463+ "loggedOut": {
464+ "message": "প্রস্থানকৃত"
465+ },
466+ "loginExpired": {
467+ "message": "আপনার লগইন মাত্রকালটির মেয়াদ শেষ হয়ে গেছে।"
468+ },
469+ "logOutConfirmation": {
470+ "message": "আপনি লগ আউট করতে চান?"
471+ },
472+ "yes": {
473+ "message": "হ্যাঁ"
474+ },
475+ "no": {
476+ "message": "না"
477+ },
478+ "unexpectedError": {
479+ "message": "একটি অপ্রত্যাশিত ত্রুটি ঘটেছে।"
480+ },
481+ "nameRequired": {
482+ "message": "নাম প্রয়োজন।"
483+ },
484+ "addedFolder": {
485+ "message": "ফোল্ডার জোড়া হয়েছে"
486+ },
487+ "changeMasterPass": {
488+ "message": "মূল পাসওয়ার্ড পরিবর্তন"
489+ },
490+ "changeMasterPasswordConfirmation": {
491+ "message": "আপনি bitwarden.com ওয়েব ভল্ট থেকে মূল পাসওয়ার্ডটি পরিবর্তন করতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
492+ },
493+ "twoStepLoginConfirmation": {
494+ "message": "দ্বি-পদক্ষেপ লগইন অন্য ডিভাইসে আপনার লগইনটি যাচাই করার জন্য সিকিউরিটি কী, প্রমাণীকরণকারী অ্যাপ্লিকেশন, এসএমএস, ফোন কল বা ই-মেইল ব্যাবহারের মাধ্যমে আপনার অ্যাকাউন্টকে আরও সুরক্ষিত করে। bitwarden.com ওয়েব ভল্টে দ্বি-পদক্ষেপের লগইন সক্ষম করা যাবে। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
495+ },
496+ "editedFolder": {
497+ "message": "ফোল্ডার সম্পাদিত"
498+ },
499+ "deleteFolderConfirmation": {
500+ "message": "আপনি কি নিশ্চিত যে এই ফোল্ডারটি মুছতে চান?"
501+ },
502+ "deletedFolder": {
503+ "message": "ফোল্ডার মোছা হয়েছে"
504+ },
505+ "gettingStartedTutorial": {
506+ "message": "শুরু করার গৃহশিক্ষা"
507+ },
508+ "gettingStartedTutorialVideo": {
509+ "message": "ব্রাউজার এক্সটেনশান থেকে কীভাবে সর্বাধিক লাভবান হতে পারবেন তা জানতে আমাদের শুরু করার গৃহশিক্ষাটি দেখুন"
510+ },
511+ "syncingComplete": {
512+ "message": "সিঙ্কিং সম্পন্ন"
513+ },
514+ "syncingFailed": {
515+ "message": "সিঙ্কিঙ্গে ব্যর্থ"
516+ },
517+ "passwordCopied": {
518+ "message": "পাসওয়ার্ড অনুলিপিত"
519+ },
520+ "uri": {
521+ "message": "URI"
522+ },
523+ "uriPosition": {
524+ "message": "URI $POSITION$",
525+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
526+ "placeholders": {
527+ "position": {
528+ "content": "$1",
529+ "example": "2"
530+ }
531+ }
532+ },
533+ "newUri": {
534+ "message": "নতুন URI"
535+ },
536+ "addedItem": {
537+ "message": "বস্তু যোগ করা হয়েছে"
538+ },
539+ "editedItem": {
540+ "message": "সম্পাদিত বস্তু"
541+ },
542+ "deleteItemConfirmation": {
543+ "message": "আপনি কি সত্যিই আবর্জনাতে পাঠাতে চান?"
544+ },
545+ "deletedItem": {
546+ "message": "বস্তুতটি আবর্জনাতে পাঠানো হয়েছে"
547+ },
548+ "overwritePassword": {
549+ "message": "ওভাররাইট পাসওয়ার্ড"
550+ },
551+ "overwritePasswordConfirmation": {
552+ "message": "আপনি কি নিশ্চিত যে আপনি বর্তমান পাসওয়ার্ডটি ওভাররাইট করতে চান?"
553+ },
554+ "overwriteUsername": {
555+ "message": "Overwrite Username"
556+ },
557+ "overwriteUsernameConfirmation": {
558+ "message": "Are you sure you want to overwrite the current username?"
559+ },
560+ "searchFolder": {
561+ "message": "ফোল্ডার অনুসন্ধান"
562+ },
563+ "searchCollection": {
564+ "message": "সংগ্রহ অনুসন্ধান"
565+ },
566+ "searchType": {
567+ "message": "অনুসন্ধানের ধরন"
568+ },
569+ "noneFolder": {
570+ "message": "কোন ফোল্ডার নেই",
571+ "description": "This is the folder for uncategorized items"
572+ },
573+ "enableAddLoginNotification": {
574+ "message": "Ask to add login"
575+ },
576+ "addLoginNotificationDesc": {
577+ "message": "\"লগইন যোগ করুন বিজ্ঞপ্তি\" স্বয়ংক্রিয়ভাবে আপনই যখনই প্রথমবারের জন্য লগ ইন করেন তখন আপনার ভল্টে নতুন লগইনগুলি সংরক্ষণ করতে অনুরোধ জানায়।"
578+ },
579+ "showCardsCurrentTab": {
580+ "message": "Show cards on Tab page"
581+ },
582+ "showCardsCurrentTabDesc": {
583+ "message": "List card items on the Tab page for easy auto-fill."
584+ },
585+ "showIdentitiesCurrentTab": {
586+ "message": "Show identities on Tab page"
587+ },
588+ "showIdentitiesCurrentTabDesc": {
589+ "message": "List identity items on the Tab page for easy auto-fill."
590+ },
591+ "clearClipboard": {
592+ "message": "ক্লিপবোর্ড পরিষ্কার",
593+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
594+ },
595+ "clearClipboardDesc": {
596+ "message": "আপনার ক্লিপবোর্ড থেকে অনুলিপিত মানগুলি স্বয়ংক্রিয়ভাবে সাফ করে।",
597+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
598+ },
599+ "notificationAddDesc": {
600+ "message": "Bitwarden আপনার জন্য এই পাসওয়ার্ডটি মনে রাখবে?"
601+ },
602+ "notificationAddSave": {
603+ "message": "হ্যাঁ, এখনই সংরক্ষণ করুন"
604+ },
605+ "enableChangedPasswordNotification": {
606+ "message": "Ask to update existing login"
607+ },
608+ "changedPasswordNotificationDesc": {
609+ "message": "Ask to update a login's password when a change is detected on a website."
610+ },
611+ "notificationChangeDesc": {
612+ "message": "আপনি কি এই পাসওয়ার্ডটি Bitwarden এ হালনাগাদ করতে চান?"
613+ },
614+ "notificationChangeSave": {
615+ "message": "হ্যাঁ, এখনই হালনাগাদ করুন"
616+ },
617+ "enableContextMenuItem": {
618+ "message": "Show context menu options"
619+ },
620+ "contextMenuItemDesc": {
621+ "message": "Use a secondary click to access password generation and matching logins for the website. "
622+ },
623+ "defaultUriMatchDetection": {
624+ "message": "পূর্ব-নির্ধারিত URI মিল সনাক্তকরণ",
625+ "description": "Default URI match detection for auto-fill."
626+ },
627+ "defaultUriMatchDetectionDesc": {
628+ "message": "স্বতঃপূরণের মতো ক্রিয়া সম্পাদন করার সময় লগইনগুলির জন্য URI মিল সনাক্তকরণ যে পূর্ব-নির্ধারিত পদ্ধতিতে পরিচালনা করা হবে তা চয়ন করুন।"
629+ },
630+ "theme": {
631+ "message": "থিম"
632+ },
633+ "themeDesc": {
634+ "message": "অ্যাপ্লিকেশনটির রং থিম পরিবর্তন।"
635+ },
636+ "dark": {
637+ "message": "অন্ধকার",
638+ "description": "Dark color"
639+ },
640+ "light": {
641+ "message": "উজ্জ্বল",
642+ "description": "Light color"
643+ },
644+ "solarizedDark": {
645+ "message": "Solarized dark",
646+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
647+ },
648+ "exportVault": {
649+ "message": "ভল্ট রফতানি"
650+ },
651+ "fileFormat": {
652+ "message": "ফাইলের ধরণ"
653+ },
654+ "warning": {
655+ "message": "সতর্কতা",
656+ "description": "WARNING (should stay in capitalized letters if the language permits)"
657+ },
658+ "confirmVaultExport": {
659+ "message": "ভল্ট রফতানির নিশ্চয়তা দিন"
660+ },
661+ "exportWarningDesc": {
662+ "message": "এই রফতানীতে একটি বিনা-এনক্রিপ্টেড করা বিন্যাসে আপনার ভল্ট তথ্য রয়েছে। আপনার রফতানিকৃত হওয়া ফাইল নিরাপত্তাহীন চ্যানেলগুলির মাধ্যমে (যেমন ইমেল) সংরক্ষণ বা প্রেরণ করা উচিত নয়। আপনি এটি ব্যবহার করে কাজ শেষ করার পর সাথে সাথে মুছে ফেলুন।"
663+ },
664+ "encExportKeyWarningDesc": {
665+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
666+ },
667+ "encExportAccountWarningDesc": {
668+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
669+ },
670+ "exportMasterPassword": {
671+ "message": "আপনার ভল্ট তথ্য রফতানি করতে আপনার মূল পাসওয়ার্ডটি দিন।"
672+ },
673+ "shared": {
674+ "message": "ভাগকৃত"
675+ },
676+ "learnOrg": {
677+ "message": "Learn about organizations"
678+ },
679+ "learnOrgConfirmation": {
680+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
681+ },
682+ "moveToOrganization": {
683+ "message": "Move to Organization"
684+ },
685+ "share": {
686+ "message": "ভাগ করুন"
687+ },
688+ "movedItemToOrg": {
689+ "message": "$ITEMNAME$ moved to $ORGNAME$",
690+ "placeholders": {
691+ "itemname": {
692+ "content": "$1",
693+ "example": "Secret Item"
694+ },
695+ "orgname": {
696+ "content": "$2",
697+ "example": "Company Name"
698+ }
699+ }
700+ },
701+ "moveToOrgDesc": {
702+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
703+ },
704+ "learnMore": {
705+ "message": "আরও জানুন"
706+ },
707+ "authenticatorKeyTotp": {
708+ "message": "প্রমাণীকরণকারী কী (TOTP)"
709+ },
710+ "verificationCodeTotp": {
711+ "message": "যাচাইকরণ কোড (TOTP)"
712+ },
713+ "copyVerificationCode": {
714+ "message": "যাচাইকরণ কোড অনুলিপিত করুন"
715+ },
716+ "attachments": {
717+ "message": "সংযুক্তি"
718+ },
719+ "deleteAttachment": {
720+ "message": "সংযুক্তি মুছুন"
721+ },
722+ "deleteAttachmentConfirmation": {
723+ "message": "আপনি কি এই সংযুক্তিটি মোছার বিষয়ে নিশ্চিত?"
724+ },
725+ "deletedAttachment": {
726+ "message": "সংযুক্তি মোছা হয়েছে"
727+ },
728+ "newAttachment": {
729+ "message": "নতুন সংযুক্তি যুক্ত করুন"
730+ },
731+ "noAttachments": {
732+ "message": "সংযুক্তি নেই।"
733+ },
734+ "attachmentSaved": {
735+ "message": "সংযুক্তিটি সংরক্ষণ করা হয়েছে।"
736+ },
737+ "file": {
738+ "message": "ফাইল"
739+ },
740+ "selectFile": {
741+ "message": "একটি ফাইল নির্বাচন করুন।"
742+ },
743+ "maxFileSize": {
744+ "message": "সর্বোচ্চ ফাইলের আকার ১০০ এমবি।"
745+ },
746+ "featureUnavailable": {
747+ "message": "বৈশিষ্ট্য অনুপলব্ধ"
748+ },
749+ "updateKey": {
750+ "message": "আপনি আপনার এনক্রিপশন কী হালনাগাদ না করা পর্যন্ত এই বৈশিষ্ট্যটি ব্যবহার করতে পারবেন না।"
751+ },
752+ "premiumMembership": {
753+ "message": "প্রিমিয়াম সদস্য"
754+ },
755+ "premiumManage": {
756+ "message": "সদস্যতা পরিচালনা"
757+ },
758+ "premiumManageAlert": {
759+ "message": "আপনি bitwarden.com ওয়েব ভল্টে আপনার সদস্যপদ পরিচালনা করতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
760+ },
761+ "premiumRefresh": {
762+ "message": "সদস্যতা সতেজ করুন"
763+ },
764+ "premiumNotCurrentMember": {
765+ "message": "আপনি বর্তমানে প্রিমিয়াম সদস্য নন।"
766+ },
767+ "premiumSignUpAndGet": {
768+ "message": "প্রিমিয়াম সদস্যতার জন্য সাইন আপ করুন এবং পান:"
769+ },
770+ "ppremiumSignUpStorage": {
771+ "message": "ফাইল সংযুক্তির জন্য ১ জিবি এনক্রিপ্টেড স্থান।"
772+ },
773+ "ppremiumSignUpTwoStep": {
774+ "message": "YubiKey, FIDO U2F, ও Duo এর মতো অতিরিক্ত দ্বি-পদক্ষেপ লগইন বিকল্পগুলি।"
775+ },
776+ "ppremiumSignUpReports": {
777+ "message": "আপনার ভল্টটি সুরক্ষিত রাখতে পাসওয়ার্ড স্বাস্থ্যকরন, অ্যাকাউন্ট স্বাস্থ্য এবং ডেটা লঙ্ঘনের প্রতিবেদন।"
778+ },
779+ "ppremiumSignUpTotp": {
780+ "message": "আপনার ভল্টে লগইনগুলির জন্য TOTP যাচাইকরণ কোড (2FA) উৎপাদক।"
781+ },
782+ "ppremiumSignUpSupport": {
783+ "message": "অগ্রাধিকার গ্রাহক সমর্থন।"
784+ },
785+ "ppremiumSignUpFuture": {
786+ "message": "ভবিষ্যতের সমস্ত প্রিমিয়াম বৈশিষ্ট্য। আরও শীঘ্রই আসছে!"
787+ },
788+ "premiumPurchase": {
789+ "message": "প্রিমিয়াম কিনুন"
790+ },
791+ "premiumPurchaseAlert": {
792+ "message": "আপনি bitwarden.com ওয়েব ভল্টে প্রিমিয়াম সদস্যতা কিনতে পারেন। আপনি কি এখনই ওয়েবসাইটটি দেখতে চান?"
793+ },
794+ "premiumCurrentMember": {
795+ "message": "আপনি প্রিমিয়াম সদস্য!"
796+ },
797+ "premiumCurrentMemberThanks": {
798+ "message": "Bitwarden কে সমর্থন করার জন্য আপনাকে ধন্যবাদ।"
799+ },
800+ "premiumPrice": {
801+ "message": "সমস্ত মাত্র $PRICE$ / বছরের জন্য!",
802+ "placeholders": {
803+ "price": {
804+ "content": "$1",
805+ "example": "$10"
806+ }
807+ }
808+ },
809+ "refreshComplete": {
810+ "message": "পুনঃসতেজ সম্পূর্ণ"
811+ },
812+ "enableAutoTotpCopy": {
813+ "message": "Copy TOTP automatically"
814+ },
815+ "disableAutoTotpCopyDesc": {
816+ "message": "যদি আপনার লগইনের সাথে একটি প্রমাণীকরণ কী থাকে, আপনি যখনই লগইনটি স্বতঃপূরণ করেন তবে TOTP যাচাইকরণ কোডটি স্বয়ংক্রিয়ভাবে আপনার ক্লিপবোর্ডে অনুলিপিত করা হয়।"
817+ },
818+ "enableAutoBiometricsPrompt": {
819+ "message": "Ask for biometrics on launch"
820+ },
821+ "premiumRequired": {
822+ "message": "প্রিমিয়াম আবশ্যক"
823+ },
824+ "premiumRequiredDesc": {
825+ "message": "এই বৈশিষ্ট্যটি ব্যবহার করতে একটি প্রিমিয়াম সদস্যতার প্রয়োজন।"
826+ },
827+ "enterVerificationCodeApp": {
828+ "message": "আপনার প্রমাণীকরণকারী অ্যাপ থেকে ৬ সংখ্যার যাচাইকরণ কোডটি প্রবেশ করুন।"
829+ },
830+ "enterVerificationCodeEmail": {
831+ "message": "$EMAIL$ এ ইমেইল করা ৬ সংখ্যার যাচাই কোডটি প্রবেশ করুন।",
832+ "placeholders": {
833+ "email": {
834+ "content": "$1",
835+ "example": "example@gmail.com"
836+ }
837+ }
838+ },
839+ "verificationCodeEmailSent": {
840+ "message": "$EMAIL$ এ যাচাইকরণ ইমেইল প্রেরণ করা হয়েছে।",
841+ "placeholders": {
842+ "email": {
843+ "content": "$1",
844+ "example": "example@gmail.com"
845+ }
846+ }
847+ },
848+ "rememberMe": {
849+ "message": "আমাকে মনে রাখবেন"
850+ },
851+ "sendVerificationCodeEmailAgain": {
852+ "message": "আবার যাচাইকরণ কোড ইমেইলে প্রেরণ করুন"
853+ },
854+ "useAnotherTwoStepMethod": {
855+ "message": "অন্য দ্বি-পদক্ষেপ প্রবেশ পদ্ধতি ব্যবহার করুন"
856+ },
857+ "insertYubiKey": {
858+ "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার YubiKey ঢোকান, তারপরে তার বোতামটি স্পর্শ করুন।"
859+ },
860+ "insertU2f": {
861+ "message": "আপনার কম্পিউটারের ইউএসবি পোর্টে আপনার সুরক্ষা কী ঢোকান। এটিতে যদি একটি বোতাম থাকে তবে তা স্পর্শ করুন।"
862+ },
863+ "webAuthnNewTab": {
864+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
865+ },
866+ "webAuthnNewTabOpen": {
867+ "message": "Open new tab"
868+ },
869+ "webAuthnAuthenticate": {
870+ "message": "Authenticate WebAuthn"
871+ },
872+ "loginUnavailable": {
873+ "message": "লগইন অনুপলব্ধ"
874+ },
875+ "noTwoStepProviders": {
876+ "message": "এই অ্যাকাউন্টে দ্বি-পদক্ষেপ লগইন সক্ষম রয়েছে, তবে কনফিগারকৃত দ্বি-পদক্ষেপ সরবরাহকারীদের কোনওটিই এই ওয়েব ব্রাউজার দ্বারা সমর্থিত নয়।"
877+ },
878+ "noTwoStepProviders2": {
879+ "message": "দয়া করে একটি সমর্থিত ওয়েব ব্রাউজার ব্যবহার করুন (যেমন ক্রোম) এবং/অথবা অতিরিক্ত সরবরাহকারী যুক্ত করুন যা ওয়েব ব্রাউজারগুলিতে আরও ভাল সমর্থিত (যেমন একটি প্রমাণীকরণকারী অ্যাপ)।"
880+ },
881+ "twoStepOptions": {
882+ "message": "দ্বি-পদক্ষেপ লগইন বিকল্প"
883+ },
884+ "recoveryCodeDesc": {
885+ "message": "আপনার সমস্ত দ্বি-গুণক সরবরাহকারীদের অ্যাক্সেস হারিয়েছেন? আপনার অ্যাকাউন্ট থেকে সমস্ত দ্বি-গুণক সরবরাহকারীদের অক্ষম করতে আপনার পুনরুদ্ধার কোডটি ব্যবহার করুন।"
886+ },
887+ "recoveryCodeTitle": {
888+ "message": "পুনরুদ্ধার কোড"
889+ },
890+ "authenticatorAppTitle": {
891+ "message": "প্রমাণীকরণকারী অ্যাপ"
892+ },
893+ "authenticatorAppDesc": {
894+ "message": "সময় ভিত্তিক যাচাইকরণ কোড উৎপন্ন করতে একটি প্রমাণীকরণকারী অ্যাপ্লিকেশন (যেমন Authy বা Google Authenticator) ব্যবহার করুন।",
895+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
896+ },
897+ "yubiKeyTitle": {
898+ "message": "YubiKey OTP সুরক্ষা কী"
899+ },
900+ "yubiKeyDesc": {
901+ "message": "আপনার অ্যাকাউন্ট ব্যাবহার করতে একটি YubiKey ব্যবহার করুন। YubiKey 4, 4 Nano, 4C, এবং NEO ডিভাইসগুলির সাথে কাজ করে।"
902+ },
903+ "duoDesc": {
904+ "message": "Duo Mobile app, এসএমএস, ফোন কল, বা U2F সুরক্ষা কী ব্যবহার করে Duo Security এর মাধ্যমে যাচাই করুন।",
905+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
906+ },
907+ "duoOrganizationDesc": {
908+ "message": "Duo Mobile app, এসএমএস, ফোন কল, বা U2F সুরক্ষা কী ব্যবহার করে আপনার সংস্থার জন্য Duo Security এর মাধ্যমে যাচাই করুন।",
909+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
910+ },
911+ "webAuthnTitle": {
912+ "message": "FIDO2 WebAuthn"
913+ },
914+ "webAuthnDesc": {
915+ "message": "Use any WebAuthn enabled security key to access your account."
916+ },
917+ "emailTitle": {
918+ "message": "ই-মেইল"
919+ },
920+ "emailDesc": {
921+ "message": "যাচাই কোডগুলি আপনাকে ই-মেইল করা হবে।"
922+ },
923+ "selfHostedEnvironment": {
924+ "message": "স্ব-হোস্টকৃত পরিবেশ"
925+ },
926+ "selfHostedEnvironmentFooter": {
927+ "message": "আপনার অন-প্রাঙ্গনে হোস্টকৃত Bitwarden ইনস্টলেশনটির বেস URL উল্লেখ করুন।"
928+ },
929+ "customEnvironment": {
930+ "message": "পছন্দসই পরিবেশ"
931+ },
932+ "customEnvironmentFooter": {
933+ "message": "উন্নত ব্যবহারকারীদের জন্য। আপনি স্বতন্ত্রভাবে প্রতিটি পরিষেবার মূল URL নির্দিষ্ট করতে পারেন।"
934+ },
935+ "baseUrl": {
936+ "message": "সার্ভার URL"
937+ },
938+ "apiUrl": {
939+ "message": "এপিআই সার্ভার URL"
940+ },
941+ "webVaultUrl": {
942+ "message": "ওয়েব ভল্ট সার্ভার URL"
943+ },
944+ "identityUrl": {
945+ "message": "পরিচয় সার্ভার URL"
946+ },
947+ "notificationsUrl": {
948+ "message": "বিজ্ঞপ্তি সার্ভার URL"
949+ },
950+ "iconsUrl": {
951+ "message": "আইকন সার্ভার URL"
952+ },
953+ "environmentSaved": {
954+ "message": "পরিবেশের URL গুলি সংরক্ষণ করা হয়েছে।"
955+ },
956+ "enableAutoFillOnPageLoad": {
957+ "message": "পৃষ্ঠা লোডে স্বতঃপূরণ সক্ষম করুন"
958+ },
959+ "enableAutoFillOnPageLoadDesc": {
960+ "message": "যদি কোনও লগইন ফর্ম সনাক্ত হয়, ওয়েব পৃষ্ঠাটি লোড হওয়ার পরে স্বয়ংক্রিয়ভাবে স্বতঃপূরণ করুন।"
961+ },
962+ "experimentalFeature": {
963+ "message": "এটি বর্তমানে একটি পরীক্ষামূলক বৈশিষ্ট্য। আপনার নিজ ঝুঁকিতে ব্যবহার করুন।"
964+ },
965+ "defaultAutoFillOnPageLoad": {
966+ "message": "Default autofill setting for login items"
967+ },
968+ "defaultAutoFillOnPageLoadDesc": {
969+ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view."
970+ },
971+ "itemAutoFillOnPageLoad": {
972+ "message": "Auto-fill on page load (if enabled in Options)"
973+ },
974+ "autoFillOnPageLoadUseDefault": {
975+ "message": "Use default setting"
976+ },
977+ "autoFillOnPageLoadYes": {
978+ "message": "Auto-fill on page load"
979+ },
980+ "autoFillOnPageLoadNo": {
981+ "message": "Do not auto-fill on page load"
982+ },
983+ "commandOpenPopup": {
984+ "message": "ভল্ট পপআপ খুলুন"
985+ },
986+ "commandOpenSidebar": {
987+ "message": "সাইডবারে ভল্ট খুলুন"
988+ },
989+ "commandAutofillDesc": {
990+ "message": "বর্তমান ওয়েবসাইটটির জন্য সর্বশেষ ব্যবহৃত লগইনটি স্বতঃপূরণ করুন"
991+ },
992+ "commandGeneratePasswordDesc": {
993+ "message": "ক্লিপবোর্ডে একটি নতুন এলোমেলো পাসওয়ার্ড তৈরি এবং অনুলিপিত করুন"
994+ },
995+ "commandLockVaultDesc": {
996+ "message": "ভল্ট লক করুন"
997+ },
998+ "privateModeWarning": {
999+ "message": "Private mode support is experimental and some features are limited."
1000+ },
1001+ "customFields": {
1002+ "message": "পছন্দসই ক্ষেত্র"
1003+ },
1004+ "copyValue": {
1005+ "message": "মান অনুলিপিত করুন"
1006+ },
1007+ "value": {
1008+ "message": "মান"
1009+ },
1010+ "newCustomField": {
1011+ "message": "নতুন পছন্দসই ক্ষেত্র"
1012+ },
1013+ "dragToSort": {
1014+ "message": "বাছাই করতে টানুন"
1015+ },
1016+ "cfTypeText": {
1017+ "message": "পাঠ্য"
1018+ },
1019+ "cfTypeHidden": {
1020+ "message": "লুকায়িত"
1021+ },
1022+ "cfTypeBoolean": {
1023+ "message": "বুলিয়ান"
1024+ },
1025+ "cfTypeLinked": {
1026+ "message": "Linked",
1027+ "description": "This describes a field that is 'linked' (tied) to another field."
1028+ },
1029+ "linkedValue": {
1030+ "message": "Linked value",
1031+ "description": "This describes a value that is 'linked' (tied) to another value."
1032+ },
1033+ "popup2faCloseMessage": {
1034+ "message": "আপনার যাচাইকরণ কোডটির জন্য আপনার ইমেলটি পরীক্ষা করতে পপআপ উইন্ডোটির বাইরে ক্লিক করলে এই পপআপটি বন্ধ হয়ে যাবে। আপনি কি এই পপআপটি একটি নতুন উইন্ডোতে খুলতে চান যাতে এটি বন্ধ না হয়?"
1035+ },
1036+ "popupU2fCloseMessage": {
1037+ "message": "ব্রাউজারটি এই পপআপ উইন্ডোতে U2F অনুরোধগুলি প্রক্রিয়া করতে পারে না। আপনি কি এই পপআপটি একটি নতুন উইন্ডোতে খুলতে চান যাতে আপনি U2F ব্যবহার করে লগ ইন করতে পারেন?"
1038+ },
1039+ "enableFavicon": {
1040+ "message": "Show website icons"
1041+ },
1042+ "faviconDesc": {
1043+ "message": "Show a recognizable image next to each login."
1044+ },
1045+ "enableBadgeCounter": {
1046+ "message": "Show badge counter"
1047+ },
1048+ "badgeCounterDesc": {
1049+ "message": "Indicate how many logins you have for the current web page."
1050+ },
1051+ "cardholderName": {
1052+ "message": "কার্ডধারীর নাম"
1053+ },
1054+ "number": {
1055+ "message": "নম্বর"
1056+ },
1057+ "brand": {
1058+ "message": "ব্র্যান্ড"
1059+ },
1060+ "expirationMonth": {
1061+ "message": "মেয়াদোত্তীর্ণ মাস"
1062+ },
1063+ "expirationYear": {
1064+ "message": "মেয়াদোত্তীর্ণ বছর"
1065+ },
1066+ "expiration": {
1067+ "message": "মেয়াদোত্তীর্ণতা"
1068+ },
1069+ "january": {
1070+ "message": "জানুয়ারী"
1071+ },
1072+ "february": {
1073+ "message": "ফেব্রুয়ারী"
1074+ },
1075+ "march": {
1076+ "message": "মার্চ"
1077+ },
1078+ "april": {
1079+ "message": "এপ্রিল"
1080+ },
1081+ "may": {
1082+ "message": "মে"
1083+ },
1084+ "june": {
1085+ "message": "জুন"
1086+ },
1087+ "july": {
1088+ "message": "জুলাই"
1089+ },
1090+ "august": {
1091+ "message": "আগস্ট"
1092+ },
1093+ "september": {
1094+ "message": "সেপ্টেম্বর"
1095+ },
1096+ "october": {
1097+ "message": "অক্টোবর"
1098+ },
1099+ "november": {
1100+ "message": "নভেম্বর"
1101+ },
1102+ "december": {
1103+ "message": "ডিসেম্বর"
1104+ },
1105+ "securityCode": {
1106+ "message": "নিরাপত্তা কোড"
1107+ },
1108+ "ex": {
1109+ "message": "উদাহরণ"
1110+ },
1111+ "title": {
1112+ "message": "শিরোনাম"
1113+ },
1114+ "mr": {
1115+ "message": "জনাব"
1116+ },
1117+ "mrs": {
1118+ "message": "জনাবা"
1119+ },
1120+ "ms": {
1121+ "message": "জনাবা"
1122+ },
1123+ "dr": {
1124+ "message": "ডাঃ"
1125+ },
1126+ "firstName": {
1127+ "message": "নামের প্রথমাংশ"
1128+ },
1129+ "middleName": {
1130+ "message": "নামের মধ্যাংশ"
1131+ },
1132+ "lastName": {
1133+ "message": "নামের শেষাংশ"
1134+ },
1135+ "fullName": {
1136+ "message": "Full Name"
1137+ },
1138+ "identityName": {
1139+ "message": "পরিচয়ের নাম"
1140+ },
1141+ "company": {
1142+ "message": "প্রতিষ্ঠান"
1143+ },
1144+ "ssn": {
1145+ "message": "সামাজিক সুরক্ষা নম্বর"
1146+ },
1147+ "passportNumber": {
1148+ "message": "পাসপোর্ট নম্বর"
1149+ },
1150+ "licenseNumber": {
1151+ "message": "লাইসেন্স নম্বর"
1152+ },
1153+ "email": {
1154+ "message": "ই-মেইল"
1155+ },
1156+ "phone": {
1157+ "message": "ফোন"
1158+ },
1159+ "address": {
1160+ "message": "ঠিকানা"
1161+ },
1162+ "address1": {
1163+ "message": "ঠিকানা ১"
1164+ },
1165+ "address2": {
1166+ "message": "ঠিকানা ২"
1167+ },
1168+ "address3": {
1169+ "message": "ঠিকানা ৩"
1170+ },
1171+ "cityTown": {
1172+ "message": "শহর"
1173+ },
1174+ "stateProvince": {
1175+ "message": "রাজ্য / প্রদেশ"
1176+ },
1177+ "zipPostalCode": {
1178+ "message": "জিপ / ডাক কোড"
1179+ },
1180+ "country": {
1181+ "message": "দেশ"
1182+ },
1183+ "type": {
1184+ "message": "ধরন"
1185+ },
1186+ "typeLogin": {
1187+ "message": "লগইন"
1188+ },
1189+ "typeLogins": {
1190+ "message": "লগিনগুলি"
1191+ },
1192+ "typeSecureNote": {
1193+ "message": "সুরক্ষিত নোট"
1194+ },
1195+ "typeCard": {
1196+ "message": "কার্ড"
1197+ },
1198+ "typeIdentity": {
1199+ "message": "পরিচয়"
1200+ },
1201+ "passwordHistory": {
1202+ "message": "পাসওয়ার্ড ইতিহাস"
1203+ },
1204+ "back": {
1205+ "message": "পেছন"
1206+ },
1207+ "collections": {
1208+ "message": "সংগ্রহ"
1209+ },
1210+ "favorites": {
1211+ "message": "প্রিয়গুলো"
1212+ },
1213+ "popOutNewWindow": {
1214+ "message": "একটি নতুন উইন্ডোতে পপ আউট"
1215+ },
1216+ "refresh": {
1217+ "message": "পুনঃসতেজ"
1218+ },
1219+ "cards": {
1220+ "message": "কার্ডগুলো"
1221+ },
1222+ "identities": {
1223+ "message": "পরিচয়"
1224+ },
1225+ "logins": {
1226+ "message": "লগিনগুলি"
1227+ },
1228+ "secureNotes": {
1229+ "message": "সুরক্ষিত নোট"
1230+ },
1231+ "clear": {
1232+ "message": "পরিষ্কার",
1233+ "description": "To clear something out. example: To clear browser history."
1234+ },
1235+ "checkPassword": {
1236+ "message": "পাসওয়ার্ড উন্মুক্ত হয়েছে কিনা তা পরীক্ষা করুন।"
1237+ },
1238+ "passwordExposed": {
1239+ "message": "ডেটা লঙ্ঘনে এই পাসওয়ার্ডটি $VALUE$ সময় (গুলি) উন্মুক্ত করা হয়েছে। আপনার এটি পরিবর্তন করা উচিত।",
1240+ "placeholders": {
1241+ "value": {
1242+ "content": "$1",
1243+ "example": "2"
1244+ }
1245+ }
1246+ },
1247+ "passwordSafe": {
1248+ "message": "এই পাসওয়ার্ডটি কোনও পরিচিত তথ্য লঙ্ঘনে পাওয়া যায় নি। এটি ব্যবহার করা নিরাপদ হওয়া উচিত।"
1249+ },
1250+ "baseDomain": {
1251+ "message": "ভিত্তি ডোমেইন",
1252+ "description": "Domain name. Ex. website.com"
1253+ },
1254+ "domainName": {
1255+ "message": "Domain name",
1256+ "description": "Domain name. Ex. website.com"
1257+ },
1258+ "host": {
1259+ "message": "নিয়ন্ত্রণকর্তা",
1260+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
1261+ },
1262+ "exact": {
1263+ "message": "হুবহু"
1264+ },
1265+ "startsWith": {
1266+ "message": "শুরু করুন"
1267+ },
1268+ "regEx": {
1269+ "message": "নিয়মিত অভিব্যাক্তি",
1270+ "description": "A programming term, also known as 'RegEx'."
1271+ },
1272+ "matchDetection": {
1273+ "message": "মিল সনাক্তকরণ",
1274+ "description": "URI match detection for auto-fill."
1275+ },
1276+ "defaultMatchDetection": {
1277+ "message": "পূর্ব-নির্ধারিত মিল সনাক্তকরণ",
1278+ "description": "Default URI match detection for auto-fill."
1279+ },
1280+ "toggleOptions": {
1281+ "message": "বিকল্পগুলি টগল করুন"
1282+ },
1283+ "toggleCurrentUris": {
1284+ "message": "বর্তমান URIs টগল করুন",
1285+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
1286+ },
1287+ "currentUri": {
1288+ "message": "বর্তমান URI",
1289+ "description": "The URI of one of the current open tabs in the browser."
1290+ },
1291+ "organization": {
1292+ "message": "সংগঠন",
1293+ "description": "An entity of multiple related people (ex. a team or business organization)."
1294+ },
1295+ "types": {
1296+ "message": "প্রকার"
1297+ },
1298+ "allItems": {
1299+ "message": "সকল বস্তু"
1300+ },
1301+ "noPasswordsInList": {
1302+ "message": "তালিকার জন্য কোনও পাসওয়ার্ড নেই।"
1303+ },
1304+ "remove": {
1305+ "message": "সরান"
1306+ },
1307+ "default": {
1308+ "message": "পূর্ব-নির্ধারিত"
1309+ },
1310+ "dateUpdated": {
1311+ "message": "হালনাগাদকৃত",
1312+ "description": "ex. Date this item was updated"
1313+ },
1314+ "datePasswordUpdated": {
1315+ "message": "পাসওয়ার্ড হালনাগাদকৃত",
1316+ "description": "ex. Date this password was updated"
1317+ },
1318+ "neverLockWarning": {
1319+ "message": "আপনি কি নিশ্চিত যে \"কখনই না\" বিকল্পটি ব্যবহার করবেন? আপনার লক বিকল্পগুলি \"কখনই না\" এ সেট করার ফলে আপনার ডিভাইসে ভল্টের এনক্রিপশন কী সঞ্চয় করা হবে। আপনি যদি এই বিকল্পটি ব্যবহার করেন তবে আপনার ডিভাইসটি সঠিকভাবে সুরক্ষিত রাখা নিশ্চিত করা উচিত।"
1320+ },
1321+ "noOrganizationsList": {
1322+ "message": "আপনি কোনও সংস্থার অন্তর্ভুক্ত নন। সংগঠনগুলি আপনাকে নিরাপদে অন্য ব্যবহারকারীর সাথে বস্তুসমূহ ভাগ করে নেওয়ার অনুমতি দেয়।"
1323+ },
1324+ "noCollectionsInList": {
1325+ "message": "তালিকার জন্য কোনও সংগ্রহ নেই।"
1326+ },
1327+ "ownership": {
1328+ "message": "মালিকানা"
1329+ },
1330+ "whoOwnsThisItem": {
1331+ "message": "এই বস্তুটির মালিক কে?"
1332+ },
1333+ "strong": {
1334+ "message": "শক্তিশালী",
1335+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
1336+ },
1337+ "good": {
1338+ "message": "ভাল",
1339+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
1340+ },
1341+ "weak": {
1342+ "message": "দুর্বল",
1343+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
1344+ },
1345+ "weakMasterPassword": {
1346+ "message": "দুর্বল মূল পাসওয়ার্ড"
1347+ },
1348+ "weakMasterPasswordDesc": {
1349+ "message": "আপনার চয়নকৃত মূল পাসওয়ার্ডটি দুর্বল। আপনার Bitwarden অ্যাকাউন্টটি সঠিকভাবে সুরক্ষিত করার জন্য আপনার একটি শক্তিশালী মূল পাসওয়ার্ড (বা একটি পাসফ্রেজ) ব্যবহার করা উচিত। আপনি কি নিশ্চিত যে এই মূল পাসওয়ার্ডটি ব্যবহার করতে চান?"
1350+ },
1351+ "pin": {
1352+ "message": "পিন",
1353+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
1354+ },
1355+ "unlockWithPin": {
1356+ "message": "পিন দিয়ে আনলক"
1357+ },
1358+ "setYourPinCode": {
1359+ "message": "Bitwarden আনলক করার জন্য আপনার পিন কোডটি সেট করুন। আপনি যদি অ্যাপ্লিকেশনটি থেকে পুরোপুরি লগ আউট করেন তবে আপনার পিন সেটিংস রিসেট করা হবে।"
1360+ },
1361+ "pinRequired": {
1362+ "message": "পিন কোড প্রয়োজন।"
1363+ },
1364+ "invalidPin": {
1365+ "message": "অবৈধ পিন কোড।"
1366+ },
1367+ "unlockWithBiometrics": {
1368+ "message": "বায়োমেট্রিক্স দিয়ে আনলক করুন"
1369+ },
1370+ "awaitDesktop": {
1371+ "message": "ডেস্কটপ থেকে নিশ্চিতকরণের অপেক্ষায়"
1372+ },
1373+ "awaitDesktopDesc": {
1374+ "message": "ব্রাউজারের জন্য বায়োমেট্রিক্স সক্ষম করতে দয়া করে Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটিতে বায়োমেট্রিক্স ব্যবহার সক্ষম করুন।"
1375+ },
1376+ "lockWithMasterPassOnRestart": {
1377+ "message": "ব্রাউজার পুনরারম্ভতে মূল পাসওয়ার্ড দিয়ে লক করুন"
1378+ },
1379+ "selectOneCollection": {
1380+ "message": "কমপক্ষে একটি সংগ্রহ নির্বাচন করুন।"
1381+ },
1382+ "cloneItem": {
1383+ "message": "বস্তুটি নকল করুন"
1384+ },
1385+ "clone": {
1386+ "message": "নকল"
1387+ },
1388+ "passwordGeneratorPolicyInEffect": {
1389+ "message": "এক বা একাধিক সংস্থার নীতিগুলি আপনার উৎপাদকের সেটিংসকে প্রভাবিত করছে।"
1390+ },
1391+ "vaultTimeoutAction": {
1392+ "message": "ভল্টের সময়সীমা কর্ম"
1393+ },
1394+ "lock": {
1395+ "message": "লক",
1396+ "description": "Verb form: to make secure or inaccesible by"
1397+ },
1398+ "trash": {
1399+ "message": "আবর্জনা",
1400+ "description": "Noun: a special folder to hold deleted items"
1401+ },
1402+ "searchTrash": {
1403+ "message": "আবর্জনাতে খুঁজুন"
1404+ },
1405+ "permanentlyDeleteItem": {
1406+ "message": "স্থায়ীভাবে বস্তু মুছুন"
1407+ },
1408+ "permanentlyDeleteItemConfirmation": {
1409+ "message": "আপনি কি নিশ্চিত এই বস্তুটি স্থায়ীভাবে মুছতে চান?"
1410+ },
1411+ "permanentlyDeletedItem": {
1412+ "message": "বস্তুটি স্থায়ীভাবে মুছে ফেলা হয়েছে"
1413+ },
1414+ "restoreItem": {
1415+ "message": "বস্তু পুনরুদ্ধার"
1416+ },
1417+ "restoreItemConfirmation": {
1418+ "message": "আপনি কি নিশ্চিত যে আপনি এই বস্তুটি পুনরুদ্ধার করতে চান?"
1419+ },
1420+ "restoredItem": {
1421+ "message": "বস্তু পুনরুদ্ধারকৃত"
1422+ },
1423+ "vaultTimeoutLogOutConfirmation": {
1424+ "message": "লগ আউট করা আপনার ভল্টের সমস্ত অ্যাক্সেস সরিয়ে ফেলবে এবং সময়সীমার পরে অনলাইন প্রমাণীকরণের প্রয়োজন। আপনি কি নিশ্চিত যে এই সেটিংটি ব্যবহার করবেন?"
1425+ },
1426+ "vaultTimeoutLogOutConfirmationTitle": {
1427+ "message": "সময়সীমা কর্ম নিশ্চিতকরণ"
1428+ },
1429+ "autoFillAndSave": {
1430+ "message": "স্বতঃপূরণ ও সংরক্ষণ"
1431+ },
1432+ "autoFillSuccessAndSavedUri": {
1433+ "message": "স্বতঃপূরণকৃত বস্তু ও সংরক্ষিত URI"
1434+ },
1435+ "autoFillSuccess": {
1436+ "message": "স্বতঃপূরণকৃত বস্তু"
1437+ },
1438+ "setMasterPassword": {
1439+ "message": "মূল পাসওয়ার্ড ধার্য করুন"
1440+ },
1441+ "masterPasswordPolicyInEffect": {
1442+ "message": "এক বা একাধিক সংস্থার নীতিগুলির কারণে নিম্নলিখিত প্রয়োজনসমূহ মূল পাসওয়ার্ডের পূরণ করা প্রয়োজন:"
1443+ },
1444+ "policyInEffectMinComplexity": {
1445+ "message": "$SCORE$ এর সর্বনিম্ন জটিলতার স্কোর",
1446+ "placeholders": {
1447+ "score": {
1448+ "content": "$1",
1449+ "example": "4"
1450+ }
1451+ }
1452+ },
1453+ "policyInEffectMinLength": {
1454+ "message": "$LENGTH$ এর সর্বনিম্ন দৈর্ঘ্য",
1455+ "placeholders": {
1456+ "length": {
1457+ "content": "$1",
1458+ "example": "14"
1459+ }
1460+ }
1461+ },
1462+ "policyInEffectUppercase": {
1463+ "message": "এক বা একাধিক বড় হাতের অক্ষর রয়েছে"
1464+ },
1465+ "policyInEffectLowercase": {
1466+ "message": "এক বা একাধিক ছোট হাতের অক্ষর রয়েছে"
1467+ },
1468+ "policyInEffectNumbers": {
1469+ "message": "এক বা একাধিক সংখ্যা রয়েছে"
1470+ },
1471+ "policyInEffectSpecial": {
1472+ "message": "নিম্নলিখিত বিশেষ অক্ষরগুলির একটি বা একাধিক রয়েছে $CHARS$",
1473+ "placeholders": {
1474+ "chars": {
1475+ "content": "$1",
1476+ "example": "!@#$%^&*"
1477+ }
1478+ }
1479+ },
1480+ "masterPasswordPolicyRequirementsNotMet": {
1481+ "message": "আপনার নতুন মূল পাসওয়ার্ড নীতির প্রয়োজনীয়তা পূরণ করে না।"
1482+ },
1483+ "acceptPolicies": {
1484+ "message": "এই বাক্সটি টিক করে আপনি নিম্নলিখিতগুলিতে সম্মত হন:"
1485+ },
1486+ "acceptPoliciesRequired": {
1487+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
1488+ },
1489+ "termsOfService": {
1490+ "message": "সেবা পাবার শর্ত"
1491+ },
1492+ "privacyPolicy": {
1493+ "message": "গোপনীয়তা নীতি"
1494+ },
1495+ "hintEqualsPassword": {
1496+ "message": "আপনার পাসওয়ার্ডের ইঙ্গিতটি আপনার পাসওয়ার্ড হতে পারবে না।"
1497+ },
1498+ "ok": {
1499+ "message": "ঠিক আছে"
1500+ },
1501+ "desktopSyncVerificationTitle": {
1502+ "message": "ডেস্কটপ সিঙ্ক যাচাইকরণ"
1503+ },
1504+ "desktopIntegrationVerificationText": {
1505+ "message": "ডেস্কটপ অ্যাপ্লিকেশন এই আঙুলের ছাপ প্রদর্শন করে কিনা তা যাচাই করুন:"
1506+ },
1507+ "desktopIntegrationDisabledTitle": {
1508+ "message": "ব্রাউজার একীকরণ সক্ষম নেই"
1509+ },
1510+ "desktopIntegrationDisabledDesc": {
1511+ "message": "Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটিতে ব্রাউজার ইন্টিগ্রেশন সক্ষম নেই। ডেস্কটপ অ্যাপ্লিকেশন মধ্যে সেটিংস এ দয়া করে এটি সক্ষম করুন।"
1512+ },
1513+ "startDesktopTitle": {
1514+ "message": "Bitwarden ডেস্কটপ অ্যাপ্লিকেশন শুরু করুন"
1515+ },
1516+ "startDesktopDesc": {
1517+ "message": "এই ক্রিয়াকলাপ ব্যবহার করার পূর্বে Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটি শুরু করা দরকার।"
1518+ },
1519+ "errorEnableBiometricTitle": {
1520+ "message": "বায়োমেট্রিক্স সক্ষম করতে অক্ষম"
1521+ },
1522+ "errorEnableBiometricDesc": {
1523+ "message": "ডেস্কটপ অ্যাপ্লিকেশন দ্বারা কর্মটি বাতিলকৃত"
1524+ },
1525+ "nativeMessagingInvalidEncryptionDesc": {
1526+ "message": "ডেস্কটপ অ্যাপ্লিকেশনটি সুরক্ষিত যোগাযোগ চ্যানেলকে অবৈধ করেছে। দয়া করে এই ক্রিয়াটি আবার চেষ্টা করুন"
1527+ },
1528+ "nativeMessagingInvalidEncryptionTitle": {
1529+ "message": "ডেস্কটপ যোগাযোগ ব্যাহত"
1530+ },
1531+ "nativeMessagingWrongUserDesc": {
1532+ "message": "ডেস্কটপ অ্যাপ্লিকেশনটি একটি ভিন্ন অ্যাকাউন্টে লগইনকৃত। উভয় অ্যাপ্লিকেশন একই অ্যাকাউন্টে লগ ইন করা রয়েছে কিনা তা নিশ্চিত করুন।"
1533+ },
1534+ "nativeMessagingWrongUserTitle": {
1535+ "message": "অ্যাকাউন্ট মেলেনি"
1536+ },
1537+ "biometricsNotEnabledTitle": {
1538+ "message": "বায়োমেট্রিকস সক্ষম নেই"
1539+ },
1540+ "biometricsNotEnabledDesc": {
1541+ "message": "ব্রাউজার বায়োমেট্রিক্সের জন্য প্রথমে সেটিংসে ডেস্কটপ বায়োমেট্রিক সক্ষম করা প্রয়োজন।"
1542+ },
1543+ "biometricsNotSupportedTitle": {
1544+ "message": "বায়োমেট্রিক্স অসমর্থিত"
1545+ },
1546+ "biometricsNotSupportedDesc": {
1547+ "message": "ব্রাউজার বায়োমেট্রিক্স এই ডিভাইসে সমর্থিত নয়।"
1548+ },
1549+ "nativeMessaginPermissionErrorTitle": {
1550+ "message": "অনুমতি দেওয়া হয়নি"
1551+ },
1552+ "nativeMessaginPermissionErrorDesc": {
1553+ "message": "Bitwarden ডেস্কটপ অ্যাপ্লিকেশনটির সাথে যোগাযোগের অনুমতি ছাড়াই আমরা ব্রাউজার এক্সটেনশনে বায়োমেট্রিক সরবরাহ করতে পারি না। অনুগ্রহপূর্বক আবার চেষ্টা করুন।"
1554+ },
1555+ "nativeMessaginPermissionSidebarTitle": {
1556+ "message": "Permission request error"
1557+ },
1558+ "nativeMessaginPermissionSidebarDesc": {
1559+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
1560+ },
1561+ "personalOwnershipSubmitError": {
1562+ "message": "একটি এন্টারপ্রাইজ নীতির কারণে, আপনি আপনার ব্যক্তিগত ভল্টে বস্তুসমূহ সংরক্ষণ করা থেকে সীমাবদ্ধ। একটি প্রতিষ্ঠানের মালিকানা বিকল্পটি পরিবর্তন করুন এবং উপলভ্য সংগ্রহগুলি থেকে চয়ন করুন।"
1563+ },
1564+ "personalOwnershipPolicyInEffect": {
1565+ "message": "একটি প্রতিষ্ঠানের নীতি আপনার মালিকানা বিকল্পগুলিকে প্রভাবিত করছে।"
1566+ },
1567+ "excludedDomains": {
1568+ "message": "Excluded domains"
1569+ },
1570+ "excludedDomainsDesc": {
1571+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
1572+ },
1573+ "excludedDomainsInvalidDomain": {
1574+ "message": "$DOMAIN$ is not a valid domain",
1575+ "placeholders": {
1576+ "domain": {
1577+ "content": "$1",
1578+ "example": "googlecom"
1579+ }
1580+ }
1581+ },
1582+ "send": {
1583+ "message": "Send",
1584+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1585+ },
1586+ "searchSends": {
1587+ "message": "Search Sends",
1588+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1589+ },
1590+ "addSend": {
1591+ "message": "Add Send",
1592+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1593+ },
1594+ "sendTypeText": {
1595+ "message": "Text"
1596+ },
1597+ "sendTypeFile": {
1598+ "message": "ফাইল"
1599+ },
1600+ "allSends": {
1601+ "message": "All Sends",
1602+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1603+ },
1604+ "maxAccessCountReached": {
1605+ "message": "Max access count reached",
1606+ "description": "This text will be displayed after a Send has been accessed the maximum amount of times."
1607+ },
1608+ "expired": {
1609+ "message": "অবসায়িত"
1610+ },
1611+ "pendingDeletion": {
1612+ "message": "মুছে ফেলার জন্য অপেক্ষমান"
1613+ },
1614+ "passwordProtected": {
1615+ "message": "পাসওয়ার্ড সুরক্ষিত"
1616+ },
1617+ "copySendLink": {
1618+ "message": "Send লিঙ্ক কপি করুন",
1619+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1620+ },
1621+ "removePassword": {
1622+ "message": "পাসওয়ার্ড অপসারণ করুন"
1623+ },
1624+ "delete": {
1625+ "message": "Delete"
1626+ },
1627+ "removedPassword": {
1628+ "message": "পাসওয়ার্ড অপসারিত হয়েছে"
1629+ },
1630+ "deletedSend": {
1631+ "message": "Deleted Send",
1632+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1633+ },
1634+ "sendLink": {
1635+ "message": "Send link",
1636+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1637+ },
1638+ "disabled": {
1639+ "message": "Disabled"
1640+ },
1641+ "removePasswordConfirmation": {
1642+ "message": "আপনি কি নিশ্চিত যে আপনি এই পাসওয়ার্ডটি অপসারণ করতে চান?"
1643+ },
1644+ "deleteSend": {
1645+ "message": "Delete Send",
1646+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1647+ },
1648+ "deleteSendConfirmation": {
1649+ "message": "Are you sure you want to delete this Send?",
1650+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1651+ },
1652+ "editSend": {
1653+ "message": "Edit Send",
1654+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1655+ },
1656+ "sendTypeHeader": {
1657+ "message": "What type of Send is this?",
1658+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1659+ },
1660+ "sendNameDesc": {
1661+ "message": "A friendly name to describe this Send.",
1662+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1663+ },
1664+ "sendFileDesc": {
1665+ "message": "The file you want to send."
1666+ },
1667+ "deletionDate": {
1668+ "message": "Deletion Date"
1669+ },
1670+ "deletionDateDesc": {
1671+ "message": "The Send will be permanently deleted on the specified date and time.",
1672+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1673+ },
1674+ "expirationDate": {
1675+ "message": "Expiration Date"
1676+ },
1677+ "expirationDateDesc": {
1678+ "message": "If set, access to this Send will expire on the specified date and time.",
1679+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1680+ },
1681+ "oneDay": {
1682+ "message": "1 day"
1683+ },
1684+ "days": {
1685+ "message": "$DAYS$ days",
1686+ "placeholders": {
1687+ "days": {
1688+ "content": "$1",
1689+ "example": "2"
1690+ }
1691+ }
1692+ },
1693+ "custom": {
1694+ "message": "Custom"
1695+ },
1696+ "maximumAccessCount": {
1697+ "message": "Maximum Access Count"
1698+ },
1699+ "maximumAccessCountDesc": {
1700+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
1701+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1702+ },
1703+ "sendPasswordDesc": {
1704+ "message": "Optionally require a password for users to access this Send.",
1705+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1706+ },
1707+ "sendNotesDesc": {
1708+ "message": "Private notes about this Send.",
1709+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1710+ },
1711+ "sendDisableDesc": {
1712+ "message": "Disable this Send so that no one can access it.",
1713+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1714+ },
1715+ "sendShareDesc": {
1716+ "message": "Copy this Send's link to clipboard upon save.",
1717+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1718+ },
1719+ "sendTextDesc": {
1720+ "message": "The text you want to send."
1721+ },
1722+ "sendHideText": {
1723+ "message": "Hide this Send's text by default.",
1724+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1725+ },
1726+ "currentAccessCount": {
1727+ "message": "Current Access Count"
1728+ },
1729+ "createSend": {
1730+ "message": "Create New Send",
1731+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1732+ },
1733+ "newPassword": {
1734+ "message": "New Password"
1735+ },
1736+ "sendDisabled": {
1737+ "message": "Send Disabled",
1738+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1739+ },
1740+ "sendDisabledWarning": {
1741+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
1742+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1743+ },
1744+ "createdSend": {
1745+ "message": "Created Send",
1746+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1747+ },
1748+ "editedSend": {
1749+ "message": "Edited Send",
1750+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1751+ },
1752+ "sendLinuxChromiumFileWarning": {
1753+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
1754+ },
1755+ "sendFirefoxFileWarning": {
1756+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
1757+ },
1758+ "sendSafariFileWarning": {
1759+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
1760+ },
1761+ "sendFileCalloutHeader": {
1762+ "message": "Before you start"
1763+ },
1764+ "sendFirefoxCustomDatePopoutMessage1": {
1765+ "message": "To use a calendar style date picker",
1766+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
1767+ },
1768+ "sendFirefoxCustomDatePopoutMessage2": {
1769+ "message": "click here",
1770+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
1771+ },
1772+ "sendFirefoxCustomDatePopoutMessage3": {
1773+ "message": "to pop out your window.",
1774+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
1775+ },
1776+ "expirationDateIsInvalid": {
1777+ "message": "The expiration date provided is not valid."
1778+ },
1779+ "deletionDateIsInvalid": {
1780+ "message": "The deletion date provided is not valid."
1781+ },
1782+ "expirationDateAndTimeRequired": {
1783+ "message": "An expiration date and time are required."
1784+ },
1785+ "deletionDateAndTimeRequired": {
1786+ "message": "A deletion date and time are required."
1787+ },
1788+ "dateParsingError": {
1789+ "message": "There was an error saving your deletion and expiration dates."
1790+ },
1791+ "hideEmail": {
1792+ "message": "Hide my email address from recipients."
1793+ },
1794+ "sendOptionsPolicyInEffect": {
1795+ "message": "One or more organization policies are affecting your Send options."
1796+ },
1797+ "passwordPrompt": {
1798+ "message": "Master password re-prompt"
1799+ },
1800+ "passwordConfirmation": {
1801+ "message": "Master password confirmation"
1802+ },
1803+ "passwordConfirmationDesc": {
1804+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
1805+ },
1806+ "emailVerificationRequired": {
1807+ "message": "ইমেইল সত্যায়ন প্রয়োজন"
1808+ },
1809+ "emailVerificationRequiredDesc": {
1810+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
1811+ },
1812+ "updatedMasterPassword": {
1813+ "message": "প্রধান পাসওয়ার্ড আপডেট করা হয়েছে"
1814+ },
1815+ "updateMasterPassword": {
1816+ "message": "প্রধান পাসওয়ার্ড আপডেট করুন"
1817+ },
1818+ "updateMasterPasswordWarning": {
1819+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
1820+ },
1821+ "resetPasswordPolicyAutoEnroll": {
1822+ "message": "Automatic Enrollment"
1823+ },
1824+ "resetPasswordAutoEnrollInviteWarning": {
1825+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
1826+ },
1827+ "selectFolder": {
1828+ "message": "Select folder..."
1829+ },
1830+ "ssoCompleteRegistration": {
1831+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
1832+ },
1833+ "hours": {
1834+ "message": "Hours"
1835+ },
1836+ "minutes": {
1837+ "message": "Minutes"
1838+ },
1839+ "vaultTimeoutPolicyInEffect": {
1840+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
1841+ "placeholders": {
1842+ "hours": {
1843+ "content": "$1",
1844+ "example": "5"
1845+ },
1846+ "minutes": {
1847+ "content": "$2",
1848+ "example": "5"
1849+ }
1850+ }
1851+ },
1852+ "vaultTimeoutTooLarge": {
1853+ "message": "Your vault timeout exceeds the restrictions set by your organization."
1854+ },
1855+ "vaultExportDisabled": {
1856+ "message": "Vault Export Disabled"
1857+ },
1858+ "personalVaultExportPolicyInEffect": {
1859+ "message": "One or more organization policies prevents you from exporting your personal vault."
1860+ },
1861+ "copyCustomFieldNameInvalidElement": {
1862+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
1863+ },
1864+ "copyCustomFieldNameNotUnique": {
1865+ "message": "No unique identifier found."
1866+ },
1867+ "convertOrganizationEncryptionDesc": {
1868+ "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.",
1869+ "placeholders": {
1870+ "organization": {
1871+ "content": "$1",
1872+ "example": "My Org Name"
1873+ }
1874+ }
1875+ },
1876+ "leaveOrganization": {
1877+ "message": "Leave Organization"
1878+ },
1879+ "removeMasterPassword": {
1880+ "message": "প্রধান পাসওয়ার্ডটি অপসারণ করুন"
1881+ },
1882+ "removedMasterPassword": {
1883+ "message": "প্রধান পাসওয়ার্ড অপসারিত হয়েছে।"
1884+ },
1885+ "leaveOrganizationConfirmation": {
1886+ "message": "Are you sure you want to leave this organization?"
1887+ },
1888+ "leftOrganization": {
1889+ "message": "You have left the organization."
1890+ },
1891+ "toggleCharacterCount": {
1892+ "message": "Toggle character count"
1893+ },
1894+ "sessionTimeout": {
1895+ "message": "Your session has timed out. Please go back and try logging in again."
1896+ },
1897+ "exportingPersonalVaultTitle": {
1898+ "message": "Exporting Personal Vault"
1899+ },
1900+ "exportingPersonalVaultDescription": {
1901+ "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.",
1902+ "placeholders": {
1903+ "email": {
1904+ "content": "$1",
1905+ "example": "name@example.com"
1906+ }
1907+ }
1908+ },
1909+ "error": {
1910+ "message": "Error"
1911+ },
1912+ "regenerateUsername": {
1913+ "message": "Regenerate Username"
1914+ },
1915+ "generateUsername": {
1916+ "message": "Generate Username"
1917+ },
1918+ "usernameType": {
1919+ "message": "Username Type"
1920+ },
1921+ "plusAddressedEmail": {
1922+ "message": "Plus Addressed Email",
1923+ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
1924+ },
1925+ "plusAddressedEmailDesc": {
1926+ "message": "Use your email provider's sub-addressing capabilities."
1927+ },
1928+ "catchallEmail": {
1929+ "message": "Catch-all Email"
1930+ },
1931+ "catchallEmailDesc": {
1932+ "message": "Use your domain's configured catch-all inbox."
1933+ },
1934+ "random": {
1935+ "message": "Random"
1936+ },
1937+ "randomWord": {
1938+ "message": "Random Word"
1939+ },
1940+ "websiteName": {
1941+ "message": "Website Name"
1942+ },
1943+ "whatWouldYouLikeToGenerate": {
1944+ "message": "What would you like to generate?"
1945+ },
1946+ "passwordType": {
1947+ "message": "Password Type"
1948+ },
1949+ "service": {
1950+ "message": "Service"
1951+ },
1952+ "forwardedEmail": {
1953+ "message": "Forwarded Email Alias"
1954+ },
1955+ "forwardedEmailDesc": {
1956+ "message": "Generate an email alias with an external forwarding service."
1957+ },
1958+ "hostname": {
1959+ "message": "Hostname",
1960+ "description": "Part of a URL."
1961+ },
1962+ "apiAccessToken": {
1963+ "message": "API Access Token"
1964+ },
1965+ "apiKey": {
1966+ "message": "API Key"
1967+ },
1968+ "ssoKeyConnectorError": {
1969+ "message": "Key Connector error: make sure Key Connector is available and working correctly."
1970+ },
1971+ "organizationIsDisabled": {
1972+ "message": "Organization is disabled."
1973+ },
1974+ "disabledOrganizationFilterError": {
1975+ "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
1976+ },
1977+ "cardBrandMir": {
1978+ "message": "Mir"
1979+ }
1980+}
apps/browser/src/_locales/bs/messages.jsonnew file+1980
@@ -0,0 +1,1980 @@
1+{
2+ "appName": {
3+ "message": "Bitwarden"
4+ },
5+ "extName": {
6+ "message": "Bitwarden - Free Password Manager",
7+ "description": "Extension name, MUST be less than 40 characters (Safari restriction)"
8+ },
9+ "extDesc": {
10+ "message": "A secure and free password manager for all of your devices.",
11+ "description": "Extension description"
12+ },
13+ "loginOrCreateNewAccount": {
14+ "message": "Prijavite se ili napravite novi račun da biste pristupili svom sigurnom trezoru."
15+ },
16+ "createAccount": {
17+ "message": "Napravi račun"
18+ },
19+ "login": {
20+ "message": "Prijavite se"
21+ },
22+ "enterpriseSingleSignOn": {
23+ "message": "Enterprise Single Sign-On"
24+ },
25+ "cancel": {
26+ "message": "Otkaži"
27+ },
28+ "close": {
29+ "message": "Zatvori"
30+ },
31+ "submit": {
32+ "message": "Potvrdi"
33+ },
34+ "emailAddress": {
35+ "message": "E-Mail adresa"
36+ },
37+ "masterPass": {
38+ "message": "Master Password"
39+ },
40+ "masterPassDesc": {
41+ "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it."
42+ },
43+ "masterPassHintDesc": {
44+ "message": "A master password hint can help you remember your password if you forget it."
45+ },
46+ "reTypeMasterPass": {
47+ "message": "Re-type Master Password"
48+ },
49+ "masterPassHint": {
50+ "message": "Master Password Hint (optional)"
51+ },
52+ "tab": {
53+ "message": "Tab"
54+ },
55+ "vault": {
56+ "message": "Vault"
57+ },
58+ "myVault": {
59+ "message": "My Vault"
60+ },
61+ "allVaults": {
62+ "message": "All Vaults"
63+ },
64+ "tools": {
65+ "message": "Tools"
66+ },
67+ "settings": {
68+ "message": "Settings"
69+ },
70+ "currentTab": {
71+ "message": "Current Tab"
72+ },
73+ "copyPassword": {
74+ "message": "Copy Password"
75+ },
76+ "copyNote": {
77+ "message": "Copy Note"
78+ },
79+ "copyUri": {
80+ "message": "Copy URI"
81+ },
82+ "copyUsername": {
83+ "message": "Copy Username"
84+ },
85+ "copyNumber": {
86+ "message": "Copy Number"
87+ },
88+ "copySecurityCode": {
89+ "message": "Copy Security Code"
90+ },
91+ "autoFill": {
92+ "message": "Auto-fill"
93+ },
94+ "generatePasswordCopied": {
95+ "message": "Generate Password (copied)"
96+ },
97+ "copyElementIdentifier": {
98+ "message": "Copy Custom Field Name"
99+ },
100+ "noMatchingLogins": {
101+ "message": "No matching logins."
102+ },
103+ "unlockVaultMenu": {
104+ "message": "Unlock your vault"
105+ },
106+ "loginToVaultMenu": {
107+ "message": "Log in to your vault"
108+ },
109+ "autoFillInfo": {
110+ "message": "There are no logins available to auto-fill for the current browser tab."
111+ },
112+ "addLogin": {
113+ "message": "Add a Login"
114+ },
115+ "addItem": {
116+ "message": "Add Item"
117+ },
118+ "passwordHint": {
119+ "message": "Password Hint"
120+ },
121+ "enterEmailToGetHint": {
122+ "message": "Enter your account email address to receive your master password hint."
123+ },
124+ "getMasterPasswordHint": {
125+ "message": "Get master password hint"
126+ },
127+ "continue": {
128+ "message": "Continue"
129+ },
130+ "sendVerificationCode": {
131+ "message": "Send a verification code to your email"
132+ },
133+ "sendCode": {
134+ "message": "Send Code"
135+ },
136+ "codeSent": {
137+ "message": "Code Sent"
138+ },
139+ "verificationCode": {
140+ "message": "Verification Code"
141+ },
142+ "confirmIdentity": {
143+ "message": "Confirm your identity to continue."
144+ },
145+ "account": {
146+ "message": "Account"
147+ },
148+ "changeMasterPassword": {
149+ "message": "Change master password"
150+ },
151+ "fingerprintPhrase": {
152+ "message": "Fingerprint phrase",
153+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
154+ },
155+ "yourAccountsFingerprint": {
156+ "message": "Your account's fingerprint phrase",
157+ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
158+ },
159+ "twoStepLogin": {
160+ "message": "Two-step login"
161+ },
162+ "logOut": {
163+ "message": "Log out"
164+ },
165+ "about": {
166+ "message": "About"
167+ },
168+ "version": {
169+ "message": "Version"
170+ },
171+ "save": {
172+ "message": "Save"
173+ },
174+ "move": {
175+ "message": "Move"
176+ },
177+ "addFolder": {
178+ "message": "Add Folder"
179+ },
180+ "name": {
181+ "message": "Name"
182+ },
183+ "editFolder": {
184+ "message": "Edit Folder"
185+ },
186+ "deleteFolder": {
187+ "message": "Delete Folder"
188+ },
189+ "folders": {
190+ "message": "Folders"
191+ },
192+ "noFolders": {
193+ "message": "There are no folders to list."
194+ },
195+ "helpFeedback": {
196+ "message": "Help & feedback"
197+ },
198+ "sync": {
199+ "message": "Sync"
200+ },
201+ "syncVaultNow": {
202+ "message": "Sync Vault Now"
203+ },
204+ "lastSync": {
205+ "message": "Last Sync:"
206+ },
207+ "passGen": {
208+ "message": "Password Generator"
209+ },
210+ "generator": {
211+ "message": "Generator",
212+ "description": "Short for 'Password Generator'."
213+ },
214+ "passGenInfo": {
215+ "message": "Automatically generate strong, unique passwords for your logins."
216+ },
217+ "bitWebVault": {
218+ "message": "Bitwarden web vault"
219+ },
220+ "importItems": {
221+ "message": "Import items"
222+ },
223+ "select": {
224+ "message": "Select"
225+ },
226+ "generatePassword": {
227+ "message": "Generate Password"
228+ },
229+ "regeneratePassword": {
230+ "message": "Regenerate Password"
231+ },
232+ "options": {
233+ "message": "Options"
234+ },
235+ "length": {
236+ "message": "Length"
237+ },
238+ "uppercase": {
239+ "message": "Uppercase (A-Z)"
240+ },
241+ "lowercase": {
242+ "message": "Lowercase (a-z)"
243+ },
244+ "numbers": {
245+ "message": "Numbers (0-9)"
246+ },
247+ "specialCharacters": {
248+ "message": "Special Characters (!@#$%^&*)"
249+ },
250+ "numWords": {
251+ "message": "Number of Words"
252+ },
253+ "wordSeparator": {
254+ "message": "Word Separator"
255+ },
256+ "capitalize": {
257+ "message": "Capitalize",
258+ "description": "Make the first letter of a work uppercase."
259+ },
260+ "includeNumber": {
261+ "message": "Include Number"
262+ },
263+ "minNumbers": {
264+ "message": "Minimum Numbers"
265+ },
266+ "minSpecial": {
267+ "message": "Minimum Special"
268+ },
269+ "avoidAmbChar": {
270+ "message": "Avoid Ambiguous Characters"
271+ },
272+ "searchVault": {
273+ "message": "Search vault"
274+ },
275+ "edit": {
276+ "message": "Edit"
277+ },
278+ "view": {
279+ "message": "View"
280+ },
281+ "noItemsInList": {
282+ "message": "There are no items to list."
283+ },
284+ "itemInformation": {
285+ "message": "Item Information"
286+ },
287+ "username": {
288+ "message": "Username"
289+ },
290+ "password": {
291+ "message": "Password"
292+ },
293+ "passphrase": {
294+ "message": "Passphrase"
295+ },
296+ "favorite": {
297+ "message": "Favorite"
298+ },
299+ "notes": {
300+ "message": "Notes"
301+ },
302+ "note": {
303+ "message": "Note"
304+ },
305+ "editItem": {
306+ "message": "Edit Item"
307+ },
308+ "folder": {
309+ "message": "Folder"
310+ },
311+ "deleteItem": {
312+ "message": "Delete Item"
313+ },
314+ "viewItem": {
315+ "message": "View Item"
316+ },
317+ "launch": {
318+ "message": "Launch"
319+ },
320+ "website": {
321+ "message": "Website"
322+ },
323+ "toggleVisibility": {
324+ "message": "Toggle Visibility"
325+ },
326+ "manage": {
327+ "message": "Manage"
328+ },
329+ "other": {
330+ "message": "Other"
331+ },
332+ "rateExtension": {
333+ "message": "Rate the extension"
334+ },
335+ "rateExtensionDesc": {
336+ "message": "Please consider helping us out with a good review!"
337+ },
338+ "browserNotSupportClipboard": {
339+ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead."
340+ },
341+ "verifyIdentity": {
342+ "message": "Verify Identity"
343+ },
344+ "yourVaultIsLocked": {
345+ "message": "Your vault is locked. Verify your identity to continue."
346+ },
347+ "unlock": {
348+ "message": "Unlock"
349+ },
350+ "loggedInAsOn": {
351+ "message": "Logged in as $EMAIL$ on $HOSTNAME$.",
352+ "placeholders": {
353+ "email": {
354+ "content": "$1",
355+ "example": "name@example.com"
356+ },
357+ "hostname": {
358+ "content": "$2",
359+ "example": "bitwarden.com"
360+ }
361+ }
362+ },
363+ "invalidMasterPassword": {
364+ "message": "Invalid master password"
365+ },
366+ "vaultTimeout": {
367+ "message": "Vault timeout"
368+ },
369+ "lockNow": {
370+ "message": "Lock now"
371+ },
372+ "immediately": {
373+ "message": "Immediately"
374+ },
375+ "tenSeconds": {
376+ "message": "10 seconds"
377+ },
378+ "twentySeconds": {
379+ "message": "20 seconds"
380+ },
381+ "thirtySeconds": {
382+ "message": "30 seconds"
383+ },
384+ "oneMinute": {
385+ "message": "1 minute"
386+ },
387+ "twoMinutes": {
388+ "message": "2 minutes"
389+ },
390+ "fiveMinutes": {
391+ "message": "5 minutes"
392+ },
393+ "fifteenMinutes": {
394+ "message": "15 minutes"
395+ },
396+ "thirtyMinutes": {
397+ "message": "30 minutes"
398+ },
399+ "oneHour": {
400+ "message": "1 hour"
401+ },
402+ "fourHours": {
403+ "message": "4 hours"
404+ },
405+ "onLocked": {
406+ "message": "On system lock"
407+ },
408+ "onRestart": {
409+ "message": "On browser restart"
410+ },
411+ "never": {
412+ "message": "Never"
413+ },
414+ "security": {
415+ "message": "Security"
416+ },
417+ "errorOccurred": {
418+ "message": "An error has occurred"
419+ },
420+ "emailRequired": {
421+ "message": "Email address is required."
422+ },
423+ "invalidEmail": {
424+ "message": "Invalid email address."
425+ },
426+ "masterPasswordRequired": {
427+ "message": "Master password is required."
428+ },
429+ "confirmMasterPasswordRequired": {
430+ "message": "Master password retype is required."
431+ },
432+ "masterPasswordMinlength": {
433+ "message": "Master password must be at least 8 characters long."
434+ },
435+ "masterPassDoesntMatch": {
436+ "message": "Master password confirmation does not match."
437+ },
438+ "newAccountCreated": {
439+ "message": "Your new account has been created! You may now log in."
440+ },
441+ "masterPassSent": {
442+ "message": "We've sent you an email with your master password hint."
443+ },
444+ "verificationCodeRequired": {
445+ "message": "Verification code is required."
446+ },
447+ "invalidVerificationCode": {
448+ "message": "Invalid verification code"
449+ },
450+ "valueCopied": {
451+ "message": "$VALUE$ copied",
452+ "description": "Value has been copied to the clipboard.",
453+ "placeholders": {
454+ "value": {
455+ "content": "$1",
456+ "example": "Password"
457+ }
458+ }
459+ },
460+ "autofillError": {
461+ "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead."
462+ },
463+ "loggedOut": {
464+ "message": "Logged out"
465+ },
466+ "loginExpired": {
467+ "message": "Your login session has expired."
468+ },
469+ "logOutConfirmation": {
470+ "message": "Are you sure you want to log out?"
471+ },
472+ "yes": {
473+ "message": "Yes"
474+ },
475+ "no": {
476+ "message": "No"
477+ },
478+ "unexpectedError": {
479+ "message": "An unexpected error has occurred."
480+ },
481+ "nameRequired": {
482+ "message": "Name is required."
483+ },
484+ "addedFolder": {
485+ "message": "Added folder"
486+ },
487+ "changeMasterPass": {
488+ "message": "Change Master Password"
489+ },
490+ "changeMasterPasswordConfirmation": {
491+ "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
492+ },
493+ "twoStepLoginConfirmation": {
494+ "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?"
495+ },
496+ "editedFolder": {
497+ "message": "Edited folder"
498+ },
499+ "deleteFolderConfirmation": {
500+ "message": "Are you sure you want to delete this folder?"
501+ },
502+ "deletedFolder": {
503+ "message": "Deleted folder"
504+ },
505+ "gettingStartedTutorial": {
506+ "message": "Getting Started Tutorial"
507+ },
508+ "gettingStartedTutorialVideo": {
509+ "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension."
510+ },
511+ "syncingComplete": {
512+ "message": "Syncing complete"
513+ },
514+ "syncingFailed": {
515+ "message": "Syncing failed"
516+ },
517+ "passwordCopied": {
518+ "message": "Password copied"
519+ },
520+ "uri": {
521+ "message": "URI"
522+ },
523+ "uriPosition": {
524+ "message": "URI $POSITION$",
525+ "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.",
526+ "placeholders": {
527+ "position": {
528+ "content": "$1",
529+ "example": "2"
530+ }
531+ }
532+ },
533+ "newUri": {
534+ "message": "New URI"
535+ },
536+ "addedItem": {
537+ "message": "Added item"
538+ },
539+ "editedItem": {
540+ "message": "Edited item"
541+ },
542+ "deleteItemConfirmation": {
543+ "message": "Do you really want to send to the trash?"
544+ },
545+ "deletedItem": {
546+ "message": "Sent item to trash"
547+ },
548+ "overwritePassword": {
549+ "message": "Overwrite Password"
550+ },
551+ "overwritePasswordConfirmation": {
552+ "message": "Are you sure you want to overwrite the current password?"
553+ },
554+ "overwriteUsername": {
555+ "message": "Overwrite Username"
556+ },
557+ "overwriteUsernameConfirmation": {
558+ "message": "Are you sure you want to overwrite the current username?"
559+ },
560+ "searchFolder": {
561+ "message": "Search folder"
562+ },
563+ "searchCollection": {
564+ "message": "Search collection"
565+ },
566+ "searchType": {
567+ "message": "Search type"
568+ },
569+ "noneFolder": {
570+ "message": "No Folder",
571+ "description": "This is the folder for uncategorized items"
572+ },
573+ "enableAddLoginNotification": {
574+ "message": "Ask to add login"
575+ },
576+ "addLoginNotificationDesc": {
577+ "message": "Ask to add an item if one isn't found in your vault."
578+ },
579+ "showCardsCurrentTab": {
580+ "message": "Show cards on Tab page"
581+ },
582+ "showCardsCurrentTabDesc": {
583+ "message": "List card items on the Tab page for easy auto-fill."
584+ },
585+ "showIdentitiesCurrentTab": {
586+ "message": "Show identities on Tab page"
587+ },
588+ "showIdentitiesCurrentTabDesc": {
589+ "message": "List identity items on the Tab page for easy auto-fill."
590+ },
591+ "clearClipboard": {
592+ "message": "Clear clipboard",
593+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
594+ },
595+ "clearClipboardDesc": {
596+ "message": "Automatically clear copied values from your clipboard.",
597+ "description": "Clipboard is the operating system thing where you copy/paste data to on your device."
598+ },
599+ "notificationAddDesc": {
600+ "message": "Should Bitwarden remember this password for you?"
601+ },
602+ "notificationAddSave": {
603+ "message": "Save"
604+ },
605+ "enableChangedPasswordNotification": {
606+ "message": "Ask to update existing login"
607+ },
608+ "changedPasswordNotificationDesc": {
609+ "message": "Ask to update a login's password when a change is detected on a website."
610+ },
611+ "notificationChangeDesc": {
612+ "message": "Do you want to update this password in Bitwarden?"
613+ },
614+ "notificationChangeSave": {
615+ "message": "Update"
616+ },
617+ "enableContextMenuItem": {
618+ "message": "Show context menu options"
619+ },
620+ "contextMenuItemDesc": {
621+ "message": "Use a secondary click to access password generation and matching logins for the website. "
622+ },
623+ "defaultUriMatchDetection": {
624+ "message": "Default URI match detection",
625+ "description": "Default URI match detection for auto-fill."
626+ },
627+ "defaultUriMatchDetectionDesc": {
628+ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill."
629+ },
630+ "theme": {
631+ "message": "Theme"
632+ },
633+ "themeDesc": {
634+ "message": "Change the application's color theme."
635+ },
636+ "dark": {
637+ "message": "Dark",
638+ "description": "Dark color"
639+ },
640+ "light": {
641+ "message": "Light",
642+ "description": "Light color"
643+ },
644+ "solarizedDark": {
645+ "message": "Solarized dark",
646+ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated."
647+ },
648+ "exportVault": {
649+ "message": "Export vault"
650+ },
651+ "fileFormat": {
652+ "message": "File Format"
653+ },
654+ "warning": {
655+ "message": "WARNING",
656+ "description": "WARNING (should stay in capitalized letters if the language permits)"
657+ },
658+ "confirmVaultExport": {
659+ "message": "Confirm Vault Export"
660+ },
661+ "exportWarningDesc": {
662+ "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it."
663+ },
664+ "encExportKeyWarningDesc": {
665+ "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file."
666+ },
667+ "encExportAccountWarningDesc": {
668+ "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account."
669+ },
670+ "exportMasterPassword": {
671+ "message": "Enter your master password to export your vault data."
672+ },
673+ "shared": {
674+ "message": "Shared"
675+ },
676+ "learnOrg": {
677+ "message": "Learn about organizations"
678+ },
679+ "learnOrgConfirmation": {
680+ "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?"
681+ },
682+ "moveToOrganization": {
683+ "message": "Move to Organization"
684+ },
685+ "share": {
686+ "message": "Share"
687+ },
688+ "movedItemToOrg": {
689+ "message": "$ITEMNAME$ moved to $ORGNAME$",
690+ "placeholders": {
691+ "itemname": {
692+ "content": "$1",
693+ "example": "Secret Item"
694+ },
695+ "orgname": {
696+ "content": "$2",
697+ "example": "Company Name"
698+ }
699+ }
700+ },
701+ "moveToOrgDesc": {
702+ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved."
703+ },
704+ "learnMore": {
705+ "message": "Learn more"
706+ },
707+ "authenticatorKeyTotp": {
708+ "message": "Authenticator Key (TOTP)"
709+ },
710+ "verificationCodeTotp": {
711+ "message": "Verification Code (TOTP)"
712+ },
713+ "copyVerificationCode": {
714+ "message": "Copy Verification Code"
715+ },
716+ "attachments": {
717+ "message": "Attachments"
718+ },
719+ "deleteAttachment": {
720+ "message": "Delete attachment"
721+ },
722+ "deleteAttachmentConfirmation": {
723+ "message": "Are you sure you want to delete this attachment?"
724+ },
725+ "deletedAttachment": {
726+ "message": "Deleted attachment"
727+ },
728+ "newAttachment": {
729+ "message": "Add New Attachment"
730+ },
731+ "noAttachments": {
732+ "message": "No attachments."
733+ },
734+ "attachmentSaved": {
735+ "message": "The attachment has been saved."
736+ },
737+ "file": {
738+ "message": "File"
739+ },
740+ "selectFile": {
741+ "message": "Select a file."
742+ },
743+ "maxFileSize": {
744+ "message": "Maximum file size is 500 MB."
745+ },
746+ "featureUnavailable": {
747+ "message": "Feature Unavailable"
748+ },
749+ "updateKey": {
750+ "message": "You cannot use this feature until you update your encryption key."
751+ },
752+ "premiumMembership": {
753+ "message": "Premium membership"
754+ },
755+ "premiumManage": {
756+ "message": "Manage Membership"
757+ },
758+ "premiumManageAlert": {
759+ "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?"
760+ },
761+ "premiumRefresh": {
762+ "message": "Refresh Membership"
763+ },
764+ "premiumNotCurrentMember": {
765+ "message": "You are not currently a premium member."
766+ },
767+ "premiumSignUpAndGet": {
768+ "message": "Sign up for a premium membership and get:"
769+ },
770+ "ppremiumSignUpStorage": {
771+ "message": "1 GB encrypted storage for file attachments."
772+ },
773+ "ppremiumSignUpTwoStep": {
774+ "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo."
775+ },
776+ "ppremiumSignUpReports": {
777+ "message": "Password hygiene, account health, and data breach reports to keep your vault safe."
778+ },
779+ "ppremiumSignUpTotp": {
780+ "message": "TOTP verification code (2FA) generator for logins in your vault."
781+ },
782+ "ppremiumSignUpSupport": {
783+ "message": "Priority customer support."
784+ },
785+ "ppremiumSignUpFuture": {
786+ "message": "All future premium features. More coming soon!"
787+ },
788+ "premiumPurchase": {
789+ "message": "Purchase Premium"
790+ },
791+ "premiumPurchaseAlert": {
792+ "message": "You can purchase premium membership on the bitwarden.com web vault. Do you want to visit the website now?"
793+ },
794+ "premiumCurrentMember": {
795+ "message": "You are a premium member!"
796+ },
797+ "premiumCurrentMemberThanks": {
798+ "message": "Thank you for supporting Bitwarden."
799+ },
800+ "premiumPrice": {
801+ "message": "All for just $PRICE$ /year!",
802+ "placeholders": {
803+ "price": {
804+ "content": "$1",
805+ "example": "$10"
806+ }
807+ }
808+ },
809+ "refreshComplete": {
810+ "message": "Refresh complete"
811+ },
812+ "enableAutoTotpCopy": {
813+ "message": "Copy TOTP automatically"
814+ },
815+ "disableAutoTotpCopyDesc": {
816+ "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login."
817+ },
818+ "enableAutoBiometricsPrompt": {
819+ "message": "Ask for biometrics on launch"
820+ },
821+ "premiumRequired": {
822+ "message": "Premium Required"
823+ },
824+ "premiumRequiredDesc": {
825+ "message": "A premium membership is required to use this feature."
826+ },
827+ "enterVerificationCodeApp": {
828+ "message": "Enter the 6 digit verification code from your authenticator app."
829+ },
830+ "enterVerificationCodeEmail": {
831+ "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.",
832+ "placeholders": {
833+ "email": {
834+ "content": "$1",
835+ "example": "example@gmail.com"
836+ }
837+ }
838+ },
839+ "verificationCodeEmailSent": {
840+ "message": "Verification email sent to $EMAIL$.",
841+ "placeholders": {
842+ "email": {
843+ "content": "$1",
844+ "example": "example@gmail.com"
845+ }
846+ }
847+ },
848+ "rememberMe": {
849+ "message": "Remember me"
850+ },
851+ "sendVerificationCodeEmailAgain": {
852+ "message": "Send verification code email again"
853+ },
854+ "useAnotherTwoStepMethod": {
855+ "message": "Use another two-step login method"
856+ },
857+ "insertYubiKey": {
858+ "message": "Insert your YubiKey into your computer's USB port, then touch its button."
859+ },
860+ "insertU2f": {
861+ "message": "Insert your security key into your computer's USB port. If it has a button, touch it."
862+ },
863+ "webAuthnNewTab": {
864+ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab."
865+ },
866+ "webAuthnNewTabOpen": {
867+ "message": "Open new tab"
868+ },
869+ "webAuthnAuthenticate": {
870+ "message": "Authenticate WebAuthn"
871+ },
872+ "loginUnavailable": {
873+ "message": "Login Unavailable"
874+ },
875+ "noTwoStepProviders": {
876+ "message": "This account has two-step login enabled, however, none of the configured two-step providers are supported by this web browser."
877+ },
878+ "noTwoStepProviders2": {
879+ "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)."
880+ },
881+ "twoStepOptions": {
882+ "message": "Two-step Login Options"
883+ },
884+ "recoveryCodeDesc": {
885+ "message": "Lost access to all of your two-factor providers? Use your recovery code to disable all two-factor providers from your account."
886+ },
887+ "recoveryCodeTitle": {
888+ "message": "Recovery Code"
889+ },
890+ "authenticatorAppTitle": {
891+ "message": "Authenticator App"
892+ },
893+ "authenticatorAppDesc": {
894+ "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",
895+ "description": "'Authy' and 'Google Authenticator' are product names and should not be translated."
896+ },
897+ "yubiKeyTitle": {
898+ "message": "YubiKey OTP Security Key"
899+ },
900+ "yubiKeyDesc": {
901+ "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices."
902+ },
903+ "duoDesc": {
904+ "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",
905+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
906+ },
907+ "duoOrganizationDesc": {
908+ "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.",
909+ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated."
910+ },
911+ "webAuthnTitle": {
912+ "message": "FIDO2 WebAuthn"
913+ },
914+ "webAuthnDesc": {
915+ "message": "Use any WebAuthn enabled security key to access your account."
916+ },
917+ "emailTitle": {
918+ "message": "Email"
919+ },
920+ "emailDesc": {
921+ "message": "Verification codes will be emailed to you."
922+ },
923+ "selfHostedEnvironment": {
924+ "message": "Self-hosted Environment"
925+ },
926+ "selfHostedEnvironmentFooter": {
927+ "message": "Specify the base URL of your on-premises hosted Bitwarden installation."
928+ },
929+ "customEnvironment": {
930+ "message": "Custom Environment"
931+ },
932+ "customEnvironmentFooter": {
933+ "message": "For advanced users. You can specify the base URL of each service independently."
934+ },
935+ "baseUrl": {
936+ "message": "Server URL"
937+ },
938+ "apiUrl": {
939+ "message": "API Server URL"
940+ },
941+ "webVaultUrl": {
942+ "message": "Web Vault Server URL"
943+ },
944+ "identityUrl": {
945+ "message": "Identity Server URL"
946+ },
947+ "notificationsUrl": {
948+ "message": "Notifications Server URL"
949+ },
950+ "iconsUrl": {
951+ "message": "Icons Server URL"
952+ },
953+ "environmentSaved": {
954+ "message": "The environment URLs have been saved."
955+ },
956+ "enableAutoFillOnPageLoad": {
957+ "message": "Auto-fill on page load"
958+ },
959+ "enableAutoFillOnPageLoadDesc": {
960+ "message": "If a login form is detected, auto-fill when the web page loads."
961+ },
962+ "experimentalFeature": {
963+ "message": "This is currently an experimental feature. Use at your own risk."
964+ },
965+ "defaultAutoFillOnPageLoad": {
966+ "message": "Default autofill setting for login items"
967+ },
968+ "defaultAutoFillOnPageLoadDesc": {
969+ "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view."
970+ },
971+ "itemAutoFillOnPageLoad": {
972+ "message": "Auto-fill on page load (if enabled in Options)"
973+ },
974+ "autoFillOnPageLoadUseDefault": {
975+ "message": "Use default setting"
976+ },
977+ "autoFillOnPageLoadYes": {
978+ "message": "Auto-fill on page load"
979+ },
980+ "autoFillOnPageLoadNo": {
981+ "message": "Do not auto-fill on page load"
982+ },
983+ "commandOpenPopup": {
984+ "message": "Open vault popup"
985+ },
986+ "commandOpenSidebar": {
987+ "message": "Open vault in sidebar"
988+ },
989+ "commandAutofillDesc": {
990+ "message": "Auto-fill the last used login for the current website"
991+ },
992+ "commandGeneratePasswordDesc": {
993+ "message": "Generate and copy a new random password to the clipboard"
994+ },
995+ "commandLockVaultDesc": {
996+ "message": "Lock the vault"
997+ },
998+ "privateModeWarning": {
999+ "message": "Private mode support is experimental and some features are limited."
1000+ },
1001+ "customFields": {
1002+ "message": "Custom Fields"
1003+ },
1004+ "copyValue": {
1005+ "message": "Copy Value"
1006+ },
1007+ "value": {
1008+ "message": "Value"
1009+ },
1010+ "newCustomField": {
1011+ "message": "New Custom Field"
1012+ },
1013+ "dragToSort": {
1014+ "message": "Drag to sort"
1015+ },
1016+ "cfTypeText": {
1017+ "message": "Text"
1018+ },
1019+ "cfTypeHidden": {
1020+ "message": "Hidden"
1021+ },
1022+ "cfTypeBoolean": {
1023+ "message": "Boolean"
1024+ },
1025+ "cfTypeLinked": {
1026+ "message": "Linked",
1027+ "description": "This describes a field that is 'linked' (tied) to another field."
1028+ },
1029+ "linkedValue": {
1030+ "message": "Linked value",
1031+ "description": "This describes a value that is 'linked' (tied) to another value."
1032+ },
1033+ "popup2faCloseMessage": {
1034+ "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?"
1035+ },
1036+ "popupU2fCloseMessage": {
1037+ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?"
1038+ },
1039+ "enableFavicon": {
1040+ "message": "Show website icons"
1041+ },
1042+ "faviconDesc": {
1043+ "message": "Show a recognizable image next to each login."
1044+ },
1045+ "enableBadgeCounter": {
1046+ "message": "Show badge counter"
1047+ },
1048+ "badgeCounterDesc": {
1049+ "message": "Indicate how many logins you have for the current web page."
1050+ },
1051+ "cardholderName": {
1052+ "message": "Cardholder Name"
1053+ },
1054+ "number": {
1055+ "message": "Number"
1056+ },
1057+ "brand": {
1058+ "message": "Brand"
1059+ },
1060+ "expirationMonth": {
1061+ "message": "Expiration Month"
1062+ },
1063+ "expirationYear": {
1064+ "message": "Expiration Year"
1065+ },
1066+ "expiration": {
1067+ "message": "Expiration"
1068+ },
1069+ "january": {
1070+ "message": "January"
1071+ },
1072+ "february": {
1073+ "message": "February"
1074+ },
1075+ "march": {
1076+ "message": "March"
1077+ },
1078+ "april": {
1079+ "message": "April"
1080+ },
1081+ "may": {
1082+ "message": "May"
1083+ },
1084+ "june": {
1085+ "message": "June"
1086+ },
1087+ "july": {
1088+ "message": "July"
1089+ },
1090+ "august": {
1091+ "message": "August"
1092+ },
1093+ "september": {
1094+ "message": "September"
1095+ },
1096+ "october": {
1097+ "message": "October"
1098+ },
1099+ "november": {
1100+ "message": "November"
1101+ },
1102+ "december": {
1103+ "message": "December"
1104+ },
1105+ "securityCode": {
1106+ "message": "Security Code"
1107+ },
1108+ "ex": {
1109+ "message": "ex."
1110+ },
1111+ "title": {
1112+ "message": "Title"
1113+ },
1114+ "mr": {
1115+ "message": "Mr"
1116+ },
1117+ "mrs": {
1118+ "message": "Mrs"
1119+ },
1120+ "ms": {
1121+ "message": "Ms"
1122+ },
1123+ "dr": {
1124+ "message": "Dr"
1125+ },
1126+ "firstName": {
1127+ "message": "First Name"
1128+ },
1129+ "middleName": {
1130+ "message": "Middle Name"
1131+ },
1132+ "lastName": {
1133+ "message": "Last Name"
1134+ },
1135+ "fullName": {
1136+ "message": "Full Name"
1137+ },
1138+ "identityName": {
1139+ "message": "Identity Name"
1140+ },
1141+ "company": {
1142+ "message": "Company"
1143+ },
1144+ "ssn": {
1145+ "message": "Social Security Number"
1146+ },
1147+ "passportNumber": {
1148+ "message": "Passport Number"
1149+ },
1150+ "licenseNumber": {
1151+ "message": "License Number"
1152+ },
1153+ "email": {
1154+ "message": "Email"
1155+ },
1156+ "phone": {
1157+ "message": "Phone"
1158+ },
1159+ "address": {
1160+ "message": "Address"
1161+ },
1162+ "address1": {
1163+ "message": "Address 1"
1164+ },
1165+ "address2": {
1166+ "message": "Address 2"
1167+ },
1168+ "address3": {
1169+ "message": "Address 3"
1170+ },
1171+ "cityTown": {
1172+ "message": "City / Town"
1173+ },
1174+ "stateProvince": {
1175+ "message": "State / Province"
1176+ },
1177+ "zipPostalCode": {
1178+ "message": "Zip / Postal Code"
1179+ },
1180+ "country": {
1181+ "message": "Country"
1182+ },
1183+ "type": {
1184+ "message": "Type"
1185+ },
1186+ "typeLogin": {
1187+ "message": "Login"
1188+ },
1189+ "typeLogins": {
1190+ "message": "Logins"
1191+ },
1192+ "typeSecureNote": {
1193+ "message": "Secure Note"
1194+ },
1195+ "typeCard": {
1196+ "message": "Card"
1197+ },
1198+ "typeIdentity": {
1199+ "message": "Identity"
1200+ },
1201+ "passwordHistory": {
1202+ "message": "Password History"
1203+ },
1204+ "back": {
1205+ "message": "Back"
1206+ },
1207+ "collections": {
1208+ "message": "Collections"
1209+ },
1210+ "favorites": {
1211+ "message": "Favorites"
1212+ },
1213+ "popOutNewWindow": {
1214+ "message": "Pop out to a new window"
1215+ },
1216+ "refresh": {
1217+ "message": "Refresh"
1218+ },
1219+ "cards": {
1220+ "message": "Cards"
1221+ },
1222+ "identities": {
1223+ "message": "Identities"
1224+ },
1225+ "logins": {
1226+ "message": "Logins"
1227+ },
1228+ "secureNotes": {
1229+ "message": "Secure Notes"
1230+ },
1231+ "clear": {
1232+ "message": "Clear",
1233+ "description": "To clear something out. example: To clear browser history."
1234+ },
1235+ "checkPassword": {
1236+ "message": "Check if password has been exposed."
1237+ },
1238+ "passwordExposed": {
1239+ "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.",
1240+ "placeholders": {
1241+ "value": {
1242+ "content": "$1",
1243+ "example": "2"
1244+ }
1245+ }
1246+ },
1247+ "passwordSafe": {
1248+ "message": "This password was not found in any known data breaches. It should be safe to use."
1249+ },
1250+ "baseDomain": {
1251+ "message": "Base domain",
1252+ "description": "Domain name. Ex. website.com"
1253+ },
1254+ "domainName": {
1255+ "message": "Domain name",
1256+ "description": "Domain name. Ex. website.com"
1257+ },
1258+ "host": {
1259+ "message": "Host",
1260+ "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'."
1261+ },
1262+ "exact": {
1263+ "message": "Exact"
1264+ },
1265+ "startsWith": {
1266+ "message": "Starts with"
1267+ },
1268+ "regEx": {
1269+ "message": "Regular expression",
1270+ "description": "A programming term, also known as 'RegEx'."
1271+ },
1272+ "matchDetection": {
1273+ "message": "Match Detection",
1274+ "description": "URI match detection for auto-fill."
1275+ },
1276+ "defaultMatchDetection": {
1277+ "message": "Default match detection",
1278+ "description": "Default URI match detection for auto-fill."
1279+ },
1280+ "toggleOptions": {
1281+ "message": "Toggle Options"
1282+ },
1283+ "toggleCurrentUris": {
1284+ "message": "Toggle Current URIs",
1285+ "description": "Toggle the display of the URIs of the currently open tabs in the browser."
1286+ },
1287+ "currentUri": {
1288+ "message": "Current URI",
1289+ "description": "The URI of one of the current open tabs in the browser."
1290+ },
1291+ "organization": {
1292+ "message": "Organization",
1293+ "description": "An entity of multiple related people (ex. a team or business organization)."
1294+ },
1295+ "types": {
1296+ "message": "Types"
1297+ },
1298+ "allItems": {
1299+ "message": "All Items"
1300+ },
1301+ "noPasswordsInList": {
1302+ "message": "There are no passwords to list."
1303+ },
1304+ "remove": {
1305+ "message": "Remove"
1306+ },
1307+ "default": {
1308+ "message": "Default"
1309+ },
1310+ "dateUpdated": {
1311+ "message": "Updated",
1312+ "description": "ex. Date this item was updated"
1313+ },
1314+ "datePasswordUpdated": {
1315+ "message": "Password Updated",
1316+ "description": "ex. Date this password was updated"
1317+ },
1318+ "neverLockWarning": {
1319+ "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected."
1320+ },
1321+ "noOrganizationsList": {
1322+ "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users."
1323+ },
1324+ "noCollectionsInList": {
1325+ "message": "There are no collections to list."
1326+ },
1327+ "ownership": {
1328+ "message": "Ownership"
1329+ },
1330+ "whoOwnsThisItem": {
1331+ "message": "Who owns this item?"
1332+ },
1333+ "strong": {
1334+ "message": "Strong",
1335+ "description": "ex. A strong password. Scale: Weak -> Good -> Strong"
1336+ },
1337+ "good": {
1338+ "message": "Good",
1339+ "description": "ex. A good password. Scale: Weak -> Good -> Strong"
1340+ },
1341+ "weak": {
1342+ "message": "Weak",
1343+ "description": "ex. A weak password. Scale: Weak -> Good -> Strong"
1344+ },
1345+ "weakMasterPassword": {
1346+ "message": "Weak Master Password"
1347+ },
1348+ "weakMasterPasswordDesc": {
1349+ "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?"
1350+ },
1351+ "pin": {
1352+ "message": "PIN",
1353+ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
1354+ },
1355+ "unlockWithPin": {
1356+ "message": "Unlock with PIN"
1357+ },
1358+ "setYourPinCode": {
1359+ "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application."
1360+ },
1361+ "pinRequired": {
1362+ "message": "PIN code is required."
1363+ },
1364+ "invalidPin": {
1365+ "message": "Invalid PIN code."
1366+ },
1367+ "unlockWithBiometrics": {
1368+ "message": "Unlock with biometrics"
1369+ },
1370+ "awaitDesktop": {
1371+ "message": "Awaiting confirmation from desktop"
1372+ },
1373+ "awaitDesktopDesc": {
1374+ "message": "Please confirm using biometrics in the Bitwarden Desktop application to enable biometrics for browser."
1375+ },
1376+ "lockWithMasterPassOnRestart": {
1377+ "message": "Lock with master password on browser restart"
1378+ },
1379+ "selectOneCollection": {
1380+ "message": "You must select at least one collection."
1381+ },
1382+ "cloneItem": {
1383+ "message": "Clone Item"
1384+ },
1385+ "clone": {
1386+ "message": "Clone"
1387+ },
1388+ "passwordGeneratorPolicyInEffect": {
1389+ "message": "One or more organization policies are affecting your generator settings."
1390+ },
1391+ "vaultTimeoutAction": {
1392+ "message": "Vault timeout action"
1393+ },
1394+ "lock": {
1395+ "message": "Lock",
1396+ "description": "Verb form: to make secure or inaccesible by"
1397+ },
1398+ "trash": {
1399+ "message": "Trash",
1400+ "description": "Noun: a special folder to hold deleted items"
1401+ },
1402+ "searchTrash": {
1403+ "message": "Search trash"
1404+ },
1405+ "permanentlyDeleteItem": {
1406+ "message": "Permanently Delete Item"
1407+ },
1408+ "permanentlyDeleteItemConfirmation": {
1409+ "message": "Are you sure you want to permanently delete this item?"
1410+ },
1411+ "permanentlyDeletedItem": {
1412+ "message": "Permanently Deleted item"
1413+ },
1414+ "restoreItem": {
1415+ "message": "Restore Item"
1416+ },
1417+ "restoreItemConfirmation": {
1418+ "message": "Are you sure you want to restore this item?"
1419+ },
1420+ "restoredItem": {
1421+ "message": "Restored Item"
1422+ },
1423+ "vaultTimeoutLogOutConfirmation": {
1424+ "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?"
1425+ },
1426+ "vaultTimeoutLogOutConfirmationTitle": {
1427+ "message": "Timeout Action Confirmation"
1428+ },
1429+ "autoFillAndSave": {
1430+ "message": "Auto-fill and Save"
1431+ },
1432+ "autoFillSuccessAndSavedUri": {
1433+ "message": "Auto-filled Item and Saved URI"
1434+ },
1435+ "autoFillSuccess": {
1436+ "message": "Auto-filled Item"
1437+ },
1438+ "setMasterPassword": {
1439+ "message": "Set Master Password"
1440+ },
1441+ "masterPasswordPolicyInEffect": {
1442+ "message": "One or more organization policies require your master password to meet the following requirements:"
1443+ },
1444+ "policyInEffectMinComplexity": {
1445+ "message": "Minimum complexity score of $SCORE$",
1446+ "placeholders": {
1447+ "score": {
1448+ "content": "$1",
1449+ "example": "4"
1450+ }
1451+ }
1452+ },
1453+ "policyInEffectMinLength": {
1454+ "message": "Minimum length of $LENGTH$",
1455+ "placeholders": {
1456+ "length": {
1457+ "content": "$1",
1458+ "example": "14"
1459+ }
1460+ }
1461+ },
1462+ "policyInEffectUppercase": {
1463+ "message": "Contain one or more uppercase characters"
1464+ },
1465+ "policyInEffectLowercase": {
1466+ "message": "Contain one or more lowercase characters"
1467+ },
1468+ "policyInEffectNumbers": {
1469+ "message": "Contain one or more numbers"
1470+ },
1471+ "policyInEffectSpecial": {
1472+ "message": "Contain one or more of the following special characters $CHARS$",
1473+ "placeholders": {
1474+ "chars": {
1475+ "content": "$1",
1476+ "example": "!@#$%^&*"
1477+ }
1478+ }
1479+ },
1480+ "masterPasswordPolicyRequirementsNotMet": {
1481+ "message": "Your new master password does not meet the policy requirements."
1482+ },
1483+ "acceptPolicies": {
1484+ "message": "By checking this box you agree to the following:"
1485+ },
1486+ "acceptPoliciesRequired": {
1487+ "message": "Terms of Service and Privacy Policy have not been acknowledged."
1488+ },
1489+ "termsOfService": {
1490+ "message": "Terms of Service"
1491+ },
1492+ "privacyPolicy": {
1493+ "message": "Privacy Policy"
1494+ },
1495+ "hintEqualsPassword": {
1496+ "message": "Your password hint cannot be the same as your password."
1497+ },
1498+ "ok": {
1499+ "message": "Ok"
1500+ },
1501+ "desktopSyncVerificationTitle": {
1502+ "message": "Desktop sync verification"
1503+ },
1504+ "desktopIntegrationVerificationText": {
1505+ "message": "Please verify that the desktop application shows this fingerprint: "
1506+ },
1507+ "desktopIntegrationDisabledTitle": {
1508+ "message": "Browser integration is not enabled"
1509+ },
1510+ "desktopIntegrationDisabledDesc": {
1511+ "message": "Browser integration is not enabled in the Bitwarden Desktop application. Please enable it in the settings within the desktop application."
1512+ },
1513+ "startDesktopTitle": {
1514+ "message": "Start the Bitwarden Desktop application"
1515+ },
1516+ "startDesktopDesc": {
1517+ "message": "The Bitwarden Desktop application needs to be started before unlock with biometrics can be used."
1518+ },
1519+ "errorEnableBiometricTitle": {
1520+ "message": "Unable to enable biometrics"
1521+ },
1522+ "errorEnableBiometricDesc": {
1523+ "message": "Action was canceled by the desktop application"
1524+ },
1525+ "nativeMessagingInvalidEncryptionDesc": {
1526+ "message": "Desktop application invalidated the secure communication channel. Please retry this operation"
1527+ },
1528+ "nativeMessagingInvalidEncryptionTitle": {
1529+ "message": "Desktop communication interrupted"
1530+ },
1531+ "nativeMessagingWrongUserDesc": {
1532+ "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account."
1533+ },
1534+ "nativeMessagingWrongUserTitle": {
1535+ "message": "Account missmatch"
1536+ },
1537+ "biometricsNotEnabledTitle": {
1538+ "message": "Biometrics not enabled"
1539+ },
1540+ "biometricsNotEnabledDesc": {
1541+ "message": "Browser biometrics requires desktop biometric to be enabled in the settings first."
1542+ },
1543+ "biometricsNotSupportedTitle": {
1544+ "message": "Biometrics not supported"
1545+ },
1546+ "biometricsNotSupportedDesc": {
1547+ "message": "Browser biometrics is not supported on this device."
1548+ },
1549+ "nativeMessaginPermissionErrorTitle": {
1550+ "message": "Permission not provided"
1551+ },
1552+ "nativeMessaginPermissionErrorDesc": {
1553+ "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again."
1554+ },
1555+ "nativeMessaginPermissionSidebarTitle": {
1556+ "message": "Permission request error"
1557+ },
1558+ "nativeMessaginPermissionSidebarDesc": {
1559+ "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout."
1560+ },
1561+ "personalOwnershipSubmitError": {
1562+ "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections."
1563+ },
1564+ "personalOwnershipPolicyInEffect": {
1565+ "message": "An organization policy is affecting your ownership options."
1566+ },
1567+ "excludedDomains": {
1568+ "message": "Excluded domains"
1569+ },
1570+ "excludedDomainsDesc": {
1571+ "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect."
1572+ },
1573+ "excludedDomainsInvalidDomain": {
1574+ "message": "$DOMAIN$ is not a valid domain",
1575+ "placeholders": {
1576+ "domain": {
1577+ "content": "$1",
1578+ "example": "googlecom"
1579+ }
1580+ }
1581+ },
1582+ "send": {
1583+ "message": "Send",
1584+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1585+ },
1586+ "searchSends": {
1587+ "message": "Search Sends",
1588+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1589+ },
1590+ "addSend": {
1591+ "message": "Add Send",
1592+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1593+ },
1594+ "sendTypeText": {
1595+ "message": "Text"
1596+ },
1597+ "sendTypeFile": {
1598+ "message": "File"
1599+ },
1600+ "allSends": {
1601+ "message": "All Sends",
1602+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1603+ },
1604+ "maxAccessCountReached": {
1605+ "message": "Max access count reached",
1606+ "description": "This text will be displayed after a Send has been accessed the maximum amount of times."
1607+ },
1608+ "expired": {
1609+ "message": "Expired"
1610+ },
1611+ "pendingDeletion": {
1612+ "message": "Pending deletion"
1613+ },
1614+ "passwordProtected": {
1615+ "message": "Password protected"
1616+ },
1617+ "copySendLink": {
1618+ "message": "Copy Send link",
1619+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1620+ },
1621+ "removePassword": {
1622+ "message": "Remove Password"
1623+ },
1624+ "delete": {
1625+ "message": "Delete"
1626+ },
1627+ "removedPassword": {
1628+ "message": "Removed Password"
1629+ },
1630+ "deletedSend": {
1631+ "message": "Deleted Send",
1632+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1633+ },
1634+ "sendLink": {
1635+ "message": "Send link",
1636+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1637+ },
1638+ "disabled": {
1639+ "message": "Disabled"
1640+ },
1641+ "removePasswordConfirmation": {
1642+ "message": "Are you sure you want to remove the password?"
1643+ },
1644+ "deleteSend": {
1645+ "message": "Delete Send",
1646+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1647+ },
1648+ "deleteSendConfirmation": {
1649+ "message": "Are you sure you want to delete this Send?",
1650+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1651+ },
1652+ "editSend": {
1653+ "message": "Edit Send",
1654+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1655+ },
1656+ "sendTypeHeader": {
1657+ "message": "What type of Send is this?",
1658+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1659+ },
1660+ "sendNameDesc": {
1661+ "message": "A friendly name to describe this Send.",
1662+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1663+ },
1664+ "sendFileDesc": {
1665+ "message": "The file you want to send."
1666+ },
1667+ "deletionDate": {
1668+ "message": "Deletion Date"
1669+ },
1670+ "deletionDateDesc": {
1671+ "message": "The Send will be permanently deleted on the specified date and time.",
1672+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1673+ },
1674+ "expirationDate": {
1675+ "message": "Expiration Date"
1676+ },
1677+ "expirationDateDesc": {
1678+ "message": "If set, access to this Send will expire on the specified date and time.",
1679+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1680+ },
1681+ "oneDay": {
1682+ "message": "1 day"
1683+ },
1684+ "days": {
1685+ "message": "$DAYS$ days",
1686+ "placeholders": {
1687+ "days": {
1688+ "content": "$1",
1689+ "example": "2"
1690+ }
1691+ }
1692+ },
1693+ "custom": {
1694+ "message": "Custom"
1695+ },
1696+ "maximumAccessCount": {
1697+ "message": "Maximum Access Count"
1698+ },
1699+ "maximumAccessCountDesc": {
1700+ "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.",
1701+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1702+ },
1703+ "sendPasswordDesc": {
1704+ "message": "Optionally require a password for users to access this Send.",
1705+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1706+ },
1707+ "sendNotesDesc": {
1708+ "message": "Private notes about this Send.",
1709+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1710+ },
1711+ "sendDisableDesc": {
1712+ "message": "Disable this Send so that no one can access it.",
1713+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1714+ },
1715+ "sendShareDesc": {
1716+ "message": "Copy this Send's link to clipboard upon save.",
1717+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1718+ },
1719+ "sendTextDesc": {
1720+ "message": "The text you want to send."
1721+ },
1722+ "sendHideText": {
1723+ "message": "Hide this Send's text by default.",
1724+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1725+ },
1726+ "currentAccessCount": {
1727+ "message": "Current Access Count"
1728+ },
1729+ "createSend": {
1730+ "message": "Create New Send",
1731+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1732+ },
1733+ "newPassword": {
1734+ "message": "New Password"
1735+ },
1736+ "sendDisabled": {
1737+ "message": "Send Disabled",
1738+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1739+ },
1740+ "sendDisabledWarning": {
1741+ "message": "Due to an enterprise policy, you are only able to delete an existing Send.",
1742+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1743+ },
1744+ "createdSend": {
1745+ "message": "Created Send",
1746+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1747+ },
1748+ "editedSend": {
1749+ "message": "Edited Send",
1750+ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated."
1751+ },
1752+ "sendLinuxChromiumFileWarning": {
1753+ "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner."
1754+ },
1755+ "sendFirefoxFileWarning": {
1756+ "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner."
1757+ },
1758+ "sendSafariFileWarning": {
1759+ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner."
1760+ },
1761+ "sendFileCalloutHeader": {
1762+ "message": "Before you start"
1763+ },
1764+ "sendFirefoxCustomDatePopoutMessage1": {
1765+ "message": "To use a calendar style date picker",
1766+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'"
1767+ },
1768+ "sendFirefoxCustomDatePopoutMessage2": {
1769+ "message": "click here",
1770+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'"
1771+ },
1772+ "sendFirefoxCustomDatePopoutMessage3": {
1773+ "message": "to pop out your window.",
1774+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'"
1775+ },
1776+ "expirationDateIsInvalid": {
1777+ "message": "The expiration date provided is not valid."
1778+ },
1779+ "deletionDateIsInvalid": {
1780+ "message": "The deletion date provided is not valid."
1781+ },
1782+ "expirationDateAndTimeRequired": {
1783+ "message": "An expiration date and time are required."
1784+ },
1785+ "deletionDateAndTimeRequired": {
1786+ "message": "A deletion date and time are required."
1787+ },
1788+ "dateParsingError": {
1789+ "message": "There was an error saving your deletion and expiration dates."
1790+ },
1791+ "hideEmail": {
1792+ "message": "Hide my email address from recipients."
1793+ },
1794+ "sendOptionsPolicyInEffect": {
1795+ "message": "One or more organization policies are affecting your Send options."
1796+ },
1797+ "passwordPrompt": {
1798+ "message": "Master password re-prompt"
1799+ },
1800+ "passwordConfirmation": {
1801+ "message": "Master password confirmation"
1802+ },
1803+ "passwordConfirmationDesc": {
1804+ "message": "This action is protected. To continue, please re-enter your master password to verify your identity."
1805+ },
1806+ "emailVerificationRequired": {
1807+ "message": "Email Verification Required"
1808+ },
1809+ "emailVerificationRequiredDesc": {
1810+ "message": "You must verify your email to use this feature. You can verify your email in the web vault."
1811+ },
1812+ "updatedMasterPassword": {
1813+ "message": "Updated Master Password"
1814+ },
1815+ "updateMasterPassword": {
1816+ "message": "Update Master Password"
1817+ },
1818+ "updateMasterPasswordWarning": {
1819+ "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour."
1820+ },
1821+ "resetPasswordPolicyAutoEnroll": {
1822+ "message": "Automatic Enrollment"
1823+ },
1824+ "resetPasswordAutoEnrollInviteWarning": {
1825+ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password."
1826+ },
1827+ "selectFolder": {
1828+ "message": "Select folder..."
1829+ },
1830+ "ssoCompleteRegistration": {
1831+ "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault."
1832+ },
1833+ "hours": {
1834+ "message": "Hours"
1835+ },
1836+ "minutes": {
1837+ "message": "Minutes"
1838+ },
1839+ "vaultTimeoutPolicyInEffect": {
1840+ "message": "Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is $HOURS$ hour(s) and $MINUTES$ minute(s)",
1841+ "placeholders": {
1842+ "hours": {
1843+ "content": "$1",
1844+ "example": "5"
1845+ },
1846+ "minutes": {
1847+ "content": "$2",
1848+ "example": "5"
1849+ }
1850+ }
1851+ },
1852+ "vaultTimeoutTooLarge": {
1853+ "message": "Your vault timeout exceeds the restrictions set by your organization."
1854+ },
1855+ "vaultExportDisabled": {
1856+ "message": "Vault Export Disabled"
1857+ },
1858+ "personalVaultExportPolicyInEffect": {
1859+ "message": "One or more organization policies prevents you from exporting your personal vault."
1860+ },
1861+ "copyCustomFieldNameInvalidElement": {
1862+ "message": "Unable to identify a valid form element. Try inspecting the HTML instead."
1863+ },
1864+ "copyCustomFieldNameNotUnique": {
1865+ "message": "No unique identifier found."
1866+ },
1867+ "convertOrganizationEncryptionDesc": {
1868+ "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.",
1869+ "placeholders": {
1870+ "organization": {
1871+ "content": "$1",
1872+ "example": "My Org Name"
1873+ }
1874+ }
1875+ },
1876+ "leaveOrganization": {
1877+ "message": "Leave Organization"
1878+ },
1879+ "removeMasterPassword": {
1880+ "message": "Remove Master Password"
1881+ },
1882+ "removedMasterPassword": {
1883+ "message": "Master password removed."
1884+ },
1885+ "leaveOrganizationConfirmation": {
1886+ "message": "Are you sure you want to leave this organization?"
1887+ },
1888+ "leftOrganization": {
1889+ "message": "You have left the organization."
1890+ },
1891+ "toggleCharacterCount": {
1892+ "message": "Toggle character count"
1893+ },
1894+ "sessionTimeout": {
1895+ "message": "Your session has timed out. Please go back and try logging in again."
1896+ },
1897+ "exportingPersonalVaultTitle": {
1898+ "message": "Exporting Personal Vault"
1899+ },
1900+ "exportingPersonalVaultDescription": {
1901+ "message": "Only the personal vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.",
1902+ "placeholders": {
1903+ "email": {
1904+ "content": "$1",
1905+ "example": "name@example.com"
1906+ }
1907+ }
1908+ },
1909+ "error": {
1910+ "message": "Error"
1911+ },
1912+ "regenerateUsername": {
1913+ "message": "Regenerate Username"
1914+ },
1915+ "generateUsername": {
1916+ "message": "Generate Username"
1917+ },
1918+ "usernameType": {
1919+ "message": "Username Type"
1920+ },
1921+ "plusAddressedEmail": {
1922+ "message": "Plus Addressed Email",
1923+ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com"
1924+ },
1925+ "plusAddressedEmailDesc": {
1926+ "message": "Use your email provider's sub-addressing capabilities."
1927+ },
1928+ "catchallEmail": {
1929+ "message": "Catch-all Email"
1930+ },
1931+ "catchallEmailDesc": {
1932+ "message": "Use your domain's configured catch-all inbox."
1933+ },
1934+ "random": {
1935+ "message": "Random"
1936+ },
1937+ "randomWord": {
1938+ "message": "Random Word"
1939+ },
1940+ "websiteName": {
1941+ "message": "Website Name"
1942+ },
1943+ "whatWouldYouLikeToGenerate": {
1944+ "message": "What would you like to generate?"
1945+ },
1946+ "passwordType": {
1947+ "message": "Password Type"
1948+ },
1949+ "service": {
1950+ "message": "Service"
1951+ },
1952+ "forwardedEmail": {
1953+ "message": "Forwarded Email Alias"
1954+ },
1955+ "forwardedEmailDesc": {
1956+ "message": "Generate an email alias with an external forwarding service."
1957+ },
1958+ "hostname": {
1959+ "message": "Hostname",
1960+ "description": "Part of a URL."
1961+ },
1962+ "apiAccessToken": {
1963+ "message": "API Access Token"
1964+ },
1965+ "apiKey": {
1966+ "message": "API Key"
1967+ },
1968+ "ssoKeyConnectorError": {
1969+ "message": "Key Connector error: make sure Key Connector is available and working correctly."
1970+ },
1971+ "organizationIsDisabled": {
1972+ "message": "Organization is disabled."
1973+ },
1974+ "disabledOrganizationFilterError": {
1975+ "message": "Items in disabled Organizations cannot be accessed. Contact your Organization owner for assistance."
1976+ },
1977+ "cardBrandMir": {
1978+ "message": "Mir"
1979+ }
1980+}
apps/browser/src/_locales/ca/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/cs/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/da/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/de/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/el/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/en/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/en_GB/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/en_IN/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/es/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/et/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/eu/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/fa/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/fi/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/fil/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/fr/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/he/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/hi/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/hr/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/hu/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/id/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/it/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/ja/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/ka/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/km/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/kn/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/ko/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/lt/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/lv/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/ml/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/nb/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/nl/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/nn/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/pl/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/pt_BR/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/pt_PT/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/ro/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/ru/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/si/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/sk/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/sl/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/sr/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/sv/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/th/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/tr/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/uk/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/vi/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/zh_CN/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/_locales/zh_TW/messages.jsonnew file+1980
This diff is too big to show here.
apps/browser/src/background.htmlnew file+6
This diff is too big to show here.
apps/browser/src/background.tsnew file+6
This diff is too big to show here.
apps/browser/src/background/commands.background.tsnew file+115
This diff is too big to show here.
apps/browser/src/background/contextMenus.background.tsnew file+142
This diff is too big to show here.
apps/browser/src/background/idle.background.tsnew file+72
This diff is too big to show here.
apps/browser/src/background/main.background.tsnew file+1056
This diff is too big to show here.
apps/browser/src/background/models/addChangePasswordQueueMessage.tsnew file+6
This diff is too big to show here.
apps/browser/src/background/models/addLoginQueueMessage.tsnew file+7
This diff is too big to show here.
apps/browser/src/background/models/addLoginRuntimeMessage.tsnew file+5
This diff is too big to show here.
apps/browser/src/background/models/changePasswordRuntimeMessage.tsnew file+5
This diff is too big to show here.
apps/browser/src/background/models/iconDetails.tsnew file+8
This diff is too big to show here.
apps/browser/src/background/models/lockedVaultPendingNotificationsItem.tsnew file+7
This diff is too big to show here.
apps/browser/src/background/models/notificationQueueMessage.tsnew file+9
This diff is too big to show here.
apps/browser/src/background/models/notificationQueueMessageType.tsnew file+4
This diff is too big to show here.
apps/browser/src/background/nativeMessaging.background.tsnew file+379
This diff is too big to show here.
apps/browser/src/background/notification.background.tsnew file+451
This diff is too big to show here.
apps/browser/src/background/runtime.background.tsnew file+236
This diff is too big to show here.
apps/browser/src/background/tabs.background.tsnew file+63
This diff is too big to show here.
apps/browser/src/background/webRequest.background.tsnew file+96
This diff is too big to show here.
apps/browser/src/browser/browserApi.tsnew file+199
This diff is too big to show here.
apps/browser/src/browser/safariApp.tsnew file+26
This diff is too big to show here.
apps/browser/src/content/autofill.cssnew file+36
This diff is too big to show here.
apps/browser/src/content/autofill.jsnew file+1042
This diff is too big to show here.
apps/browser/src/content/autofiller.tsnew file+52
This diff is too big to show here.
apps/browser/src/content/contextMenuHandler.tsnew file+66
This diff is too big to show here.
apps/browser/src/content/message_handler.tsnew file+38
This diff is too big to show here.
apps/browser/src/content/notificationBar.tsnew file+603
This diff is too big to show here.
apps/browser/src/content/shortcuts.tsnew file+52
This diff is too big to show here.
apps/browser/src/globals.d.tsnew file+4
This diff is too big to show here.
apps/browser/src/images/close.pngnew file
Binary file not shown.
apps/browser/src/images/icon128.pngnew file
Binary file not shown.
apps/browser/src/images/icon128_gray.pngnew file
Binary file not shown.
apps/browser/src/images/icon16.pngnew file
Binary file not shown.
apps/browser/src/images/icon16_gray.pngnew file
Binary file not shown.
apps/browser/src/images/icon18_safari.pngnew file
Binary file not shown.
apps/browser/src/images/icon18_safari@2x.pngnew file
Binary file not shown.
apps/browser/src/images/icon18_safari_locked.pngnew file
Binary file not shown.
apps/browser/src/images/icon18_safari_locked@2x.pngnew file
Binary file not shown.
apps/browser/src/images/icon19.pngnew file
Binary file not shown.
apps/browser/src/images/icon19_gray.pngnew file
Binary file not shown.
apps/browser/src/images/icon19_locked.pngnew file
Binary file not shown.
apps/browser/src/images/icon32.pngnew file
Binary file not shown.
apps/browser/src/images/icon32_gray.pngnew file
Binary file not shown.
apps/browser/src/images/icon38.pngnew file
Binary file not shown.
apps/browser/src/images/icon38_gray.pngnew file
Binary file not shown.
apps/browser/src/images/icon38_locked.pngnew file
Binary file not shown.
apps/browser/src/images/icon48.pngnew file
Binary file not shown.
apps/browser/src/images/icon48_gray.pngnew file
Binary file not shown.
apps/browser/src/images/icon96.pngnew file
Binary file not shown.
apps/browser/src/images/icon96_gray.pngnew file
Binary file not shown.
src/manifest.json → apps/browser/src/manifest.jsonrenamed+40−43
This diff is too big to show here.
apps/browser/src/manifest.v3.jsonnew file+127
This diff is too big to show here.
apps/browser/src/models/account.tsnew file+32
This diff is too big to show here.
apps/browser/src/models/autofillField.tsnew file+25
This diff is too big to show here.
apps/browser/src/models/autofillForm.tsnew file+7
This diff is too big to show here.
apps/browser/src/models/autofillPageDetails.tsnew file+13
This diff is too big to show here.
apps/browser/src/models/autofillScript.tsnew file+12
This diff is too big to show here.
apps/browser/src/models/biometricErrors.tsnew file+17
This diff is too big to show here.
apps/browser/src/models/browserComponentState.tsnew file+4
This diff is too big to show here.
apps/browser/src/models/browserGroupingsComponentState.tsnew file+18
This diff is too big to show here.
apps/browser/src/models/browserSendComponentState.tsnew file+9
This diff is too big to show here.
apps/browser/src/notification/bar.htmlnew file+39
This diff is too big to show here.
apps/browser/src/notification/bar.jsnew file+161
This diff is too big to show here.
apps/browser/src/notification/bar.scssnew file+94
This diff is too big to show here.
apps/browser/src/popup/accounts/environment.component.htmlnew file+104
This diff is too big to show here.
apps/browser/src/popup/accounts/environment.component.tsnew file+28
This diff is too big to show here.
apps/browser/src/popup/accounts/hint.component.htmlnew file+38
This diff is too big to show here.
apps/browser/src/popup/accounts/hint.component.tsnew file+24
This diff is too big to show here.
apps/browser/src/popup/accounts/home.component.htmlnew file+16
This diff is too big to show here.
apps/browser/src/popup/accounts/home.component.tsnew file+63
This diff is too big to show here.
apps/browser/src/popup/accounts/lock.component.htmlnew file+85
This diff is too big to show here.
apps/browser/src/popup/accounts/lock.component.tsnew file+105
This diff is too big to show here.
apps/browser/src/popup/accounts/login.component.htmlnew file+72
This diff is too big to show here.
apps/browser/src/popup/accounts/login.component.tsnew file+56
This diff is too big to show here.
apps/browser/src/popup/accounts/register.component.htmlnew file+141
This diff is too big to show here.
apps/browser/src/popup/accounts/register.component.tsnew file+51
This diff is too big to show here.
apps/browser/src/popup/accounts/remove-password.component.htmlnew file+49
This diff is too big to show here.
apps/browser/src/popup/accounts/remove-password.component.tsnew file+9
This diff is too big to show here.
apps/browser/src/popup/accounts/set-password.component.htmlnew file+148
This diff is too big to show here.
apps/browser/src/popup/accounts/set-password.component.tsnew file+77
This diff is too big to show here.
apps/browser/src/popup/accounts/sso.component.htmlnew file
No changes to the content.
apps/browser/src/popup/accounts/sso.component.tsnew file+71
This diff is too big to show here.
apps/browser/src/popup/accounts/two-factor-options.component.htmlnew file+29
This diff is too big to show here.
apps/browser/src/popup/accounts/two-factor-options.component.tsnew file+28
This diff is too big to show here.
apps/browser/src/popup/accounts/two-factor.component.htmlnew file+144
This diff is too big to show here.
apps/browser/src/popup/accounts/two-factor.component.tsnew file+140
This diff is too big to show here.
apps/browser/src/popup/accounts/update-temp-password.component.htmlnew file+130
This diff is too big to show here.
apps/browser/src/popup/accounts/update-temp-password.component.tsnew file+81
This diff is too big to show here.
apps/browser/src/popup/app-routing.animations.tsnew file+205
This diff is too big to show here.
apps/browser/src/popup/app-routing.module.tsnew file+341
This diff is too big to show here.
apps/browser/src/popup/app.component.tsnew file+282
This diff is too big to show here.
apps/browser/src/popup/app.module.tsnew file+246
This diff is too big to show here.
apps/browser/src/popup/components/action-buttons.component.htmlnew file+102
This diff is too big to show here.
apps/browser/src/popup/components/action-buttons.component.tsnew file+86
This diff is too big to show here.
apps/browser/src/popup/components/cipher-row.component.htmlnew file+47
This diff is too big to show here.
apps/browser/src/popup/components/cipher-row.component.tsnew file+29
This diff is too big to show here.
apps/browser/src/popup/components/password-reprompt.component.htmlnew file+55
This diff is too big to show here.
apps/browser/src/popup/components/password-reprompt.component.tsnew file+8
This diff is too big to show here.
apps/browser/src/popup/components/pop-out.component.htmlnew file+5
This diff is too big to show here.
apps/browser/src/popup/components/pop-out.component.tsnew file+33
This diff is too big to show here.
apps/browser/src/popup/components/private-mode-warning.component.htmlnew file+6
This diff is too big to show here.
apps/browser/src/popup/components/private-mode-warning.component.tsnew file+17
This diff is too big to show here.
apps/browser/src/popup/components/send-list.component.htmlnew file+98
This diff is too big to show here.
apps/browser/src/popup/components/send-list.component.tsnew file+36
This diff is too big to show here.
apps/browser/src/popup/components/set-pin.component.htmlnew file+65
This diff is too big to show here.
apps/browser/src/popup/components/set-pin.component.tsnew file+8
This diff is too big to show here.
apps/browser/src/popup/components/user-verification.component.htmlnew file+46
This diff is too big to show here.
apps/browser/src/popup/components/user-verification.component.tsnew file+23
This diff is too big to show here.
apps/browser/src/popup/generator/generator.component.htmlnew file+507
This diff is too big to show here.
apps/browser/src/popup/generator/generator.component.tsnew file+71
This diff is too big to show here.
apps/browser/src/popup/generator/password-generator-history.component.htmlnew file+48
This diff is too big to show here.
apps/browser/src/popup/generator/password-generator-history.component.tsnew file+26
This diff is too big to show here.
apps/browser/src/popup/images/bwi-globe.pngnew file
Binary file not shown.
src/popup/images/loading.svg → apps/browser/src/popup/images/loading.svgrenamed
The content is the same.
apps/browser/src/popup/images/logo-dark@2x.pngnew file
Binary file not shown.
apps/browser/src/popup/images/logo-white@2x.pngnew file
Binary file not shown.
apps/browser/src/popup/images/search-desktop-dark.svgnew file+34
This diff is too big to show here.
apps/browser/src/popup/images/search-desktop-light.svgnew file+34
This diff is too big to show here.
apps/browser/src/popup/images/search-desktop-solarized.svgnew file+34
This diff is too big to show here.
src/popup/images/u2fkey.jpg → apps/browser/src/popup/images/u2fkey.jpgrenamed
Binary file not shown.
src/popup/images/yubikey.jpg → apps/browser/src/popup/images/yubikey.jpgrenamed
Binary file not shown.
apps/browser/src/popup/index.htmlnew file+14
This diff is too big to show here.
apps/browser/src/popup/main.tsnew file+16
This diff is too big to show here.
apps/browser/src/popup/polyfills.tsnew file+4
This diff is too big to show here.
apps/browser/src/popup/scss/base.scssnew file+535
This diff is too big to show here.
apps/browser/src/popup/scss/box.scssnew file+694
This diff is too big to show here.
apps/browser/src/popup/scss/buttons.scssnew file+101
This diff is too big to show here.
apps/browser/src/popup/scss/environment.scssnew file+39
This diff is too big to show here.
apps/browser/src/popup/scss/grid.scssnew file+11
This diff is too big to show here.
apps/browser/src/popup/scss/misc.scssnew file+425
This diff is too big to show here.
apps/browser/src/popup/scss/modal.scssnew file+356
This diff is too big to show here.
apps/browser/src/popup/scss/pages.scssnew file+117
This diff is too big to show here.
apps/browser/src/popup/scss/plugins.scssnew file+218
This diff is too big to show here.
apps/browser/src/popup/scss/popup.scssnew file+14
This diff is too big to show here.
apps/browser/src/popup/scss/variables.scssnew file+287
This diff is too big to show here.
apps/browser/src/popup/send/efflux-dates.component.htmlnew file+209
This diff is too big to show here.
apps/browser/src/popup/send/efflux-dates.component.tsnew file+25
This diff is too big to show here.
apps/browser/src/popup/send/send-add-edit.component.htmlnew file+319
This diff is too big to show here.
apps/browser/src/popup/send/send-add-edit.component.tsnew file+145
This diff is too big to show here.
apps/browser/src/popup/send/send-groupings.component.htmlnew file+122
This diff is too big to show here.
apps/browser/src/popup/send/send-groupings.component.tsnew file+192
This diff is too big to show here.
apps/browser/src/popup/send/send-type.component.htmlnew file+69
This diff is too big to show here.
apps/browser/src/popup/send/send-type.component.tsnew file+164
This diff is too big to show here.
apps/browser/src/popup/services/debounceNavigationService.tsnew file+49
This diff is too big to show here.
apps/browser/src/popup/services/init.service.tsnew file+55
This diff is too big to show here.
apps/browser/src/popup/services/lock-guard.service.tsnew file+8
This diff is too big to show here.
apps/browser/src/popup/services/password-reprompt.service.tsnew file+10
This diff is too big to show here.
apps/browser/src/popup/services/popup-search.service.tsnew file+27
This diff is too big to show here.
apps/browser/src/popup/services/popup-utils.service.tsnew file+83
This diff is too big to show here.
apps/browser/src/popup/services/services.module.tsnew file+309
This diff is too big to show here.
apps/browser/src/popup/services/unauth-guard.service.tsnew file+8
This diff is too big to show here.
apps/browser/src/popup/settings/excluded-domains.component.htmlnew file+88
This diff is too big to show here.
apps/browser/src/popup/settings/excluded-domains.component.tsnew file+115
This diff is too big to show here.
apps/browser/src/popup/settings/export.component.htmlnew file+40
This diff is too big to show here.
apps/browser/src/popup/settings/export.component.tsnew file+53
This diff is too big to show here.
apps/browser/src/popup/settings/folder-add-edit.component.htmlnew file+53
This diff is too big to show here.
apps/browser/src/popup/settings/folder-add-edit.component.tsnew file+54
This diff is too big to show here.
apps/browser/src/popup/settings/folders.component.htmlnew file+39
This diff is too big to show here.
apps/browser/src/popup/settings/folders.component.tsnew file+34
This diff is too big to show here.
apps/browser/src/popup/settings/options.component.htmlnew file+258
This diff is too big to show here.
apps/browser/src/popup/settings/options.component.tsnew file+160
This diff is too big to show here.
apps/browser/src/popup/settings/premium.component.htmlnew file+73
This diff is too big to show here.
apps/browser/src/popup/settings/premium.component.tsnew file+35
This diff is too big to show here.
apps/browser/src/popup/settings/settings.component.htmlnew file+230
This diff is too big to show here.
apps/browser/src/popup/settings/settings.component.tsnew file+429
This diff is too big to show here.
apps/browser/src/popup/settings/sync.component.htmlnew file+28
This diff is too big to show here.
apps/browser/src/popup/settings/sync.component.tsnew file+44
This diff is too big to show here.
apps/browser/src/popup/settings/vault-timeout-input.component.htmlnew file+48
This diff is too big to show here.
apps/browser/src/popup/settings/vault-timeout-input.component.tsnew file+22
This diff is too big to show here.
apps/browser/src/popup/tabs.component.htmlnew file+52
This diff is too big to show here.
apps/browser/src/popup/tabs.component.tsnew file+17
This diff is too big to show here.
apps/browser/src/popup/vault/add-edit-custom-fields.component.htmlnew file+121
This diff is too big to show here.
apps/browser/src/popup/vault/add-edit-custom-fields.component.tsnew file+15
This diff is too big to show here.
apps/browser/src/popup/vault/add-edit.component.htmlnew file+660
This diff is too big to show here.
apps/browser/src/popup/vault/add-edit.component.tsnew file+236
This diff is too big to show here.
apps/browser/src/popup/vault/attachments.component.htmlnew file+73
This diff is too big to show here.
apps/browser/src/popup/vault/attachments.component.tsnew file+64
This diff is too big to show here.
apps/browser/src/popup/vault/ciphers.component.htmlnew file+124
This diff is too big to show here.
apps/browser/src/popup/vault/ciphers.component.tsnew file+296
This diff is too big to show here.
apps/browser/src/popup/vault/collections.component.htmlnew file+43
This diff is too big to show here.
apps/browser/src/popup/vault/collections.component.tsnew file+43
This diff is too big to show here.
apps/browser/src/popup/vault/current-tab.component.htmlnew file+95
This diff is too big to show here.
apps/browser/src/popup/vault/current-tab.component.tsnew file+261
This diff is too big to show here.
apps/browser/src/popup/vault/password-history.component.htmlnew file+39
This diff is too big to show here.
apps/browser/src/popup/vault/password-history.component.tsnew file+40
This diff is too big to show here.
apps/browser/src/popup/vault/share.component.htmlnew file+71
This diff is too big to show here.
apps/browser/src/popup/vault/share.component.tsnew file+62
This diff is too big to show here.
apps/browser/src/popup/vault/vault-filter.component.htmlnew file+231
This diff is too big to show here.
apps/browser/src/popup/vault/vault-filter.component.tsnew file+428
This diff is too big to show here.
apps/browser/src/popup/vault/vault-select.component.htmlnew file+71
This diff is too big to show here.
apps/browser/src/popup/vault/vault-select.component.tsnew file+201
This diff is too big to show here.
apps/browser/src/popup/vault/view-custom-fields.component.htmlnew file+91
This diff is too big to show here.
apps/browser/src/popup/vault/view-custom-fields.component.tsnew file+14
This diff is too big to show here.
apps/browser/src/popup/vault/view.component.htmlnew file+528
This diff is too big to show here.
apps/browser/src/popup/vault/view.component.tsnew file+296
This diff is too big to show here.
apps/browser/src/safari/desktop.xcodeproj/project.pbxprojnew file+558
This diff is too big to show here.
apps/browser/src/safari/desktop.xcodeproj/project.xcworkspace/contents.xcworkspacedatanew file+7
This diff is too big to show here.
apps/browser/src/safari/desktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plistnew file+8
This diff is too big to show here.
apps/browser/src/safari/desktop.xcodeproj/xcshareddata/xcschemes/desktop.xcschemenew file+78
This diff is too big to show here.
apps/browser/src/safari/desktop/AppDelegate.swiftnew file+18
This diff is too big to show here.
apps/browser/src/safari/desktop/Assets.xcassets/AccentColor.colorset/Contents.jsonnew file+11
This diff is too big to show here.
apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset/Contents.jsonnew file+62
This diff is too big to show here.
apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset/icon128.pngnew file
Binary file not shown.
apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset/icon16.pngnew file
Binary file not shown.
apps/browser/src/safari/desktop/Assets.xcassets/AppIcon.appiconset/icon32.pngnew file
Binary file not shown.
apps/browser/src/safari/desktop/Assets.xcassets/Contents.jsonnew file+6
This diff is too big to show here.
apps/browser/src/safari/desktop/Base.lproj/Main.storyboardnew file+167
This diff is too big to show here.
apps/browser/src/safari/desktop/Info.plistnew file+34
This diff is too big to show here.
apps/browser/src/safari/desktop/ViewController.swiftnew file+44
This diff is too big to show here.
apps/browser/src/safari/desktop/desktop.entitlementsnew file+10
This diff is too big to show here.
apps/browser/src/safari/safari/Info.plistnew file+41
This diff is too big to show here.
apps/browser/src/safari/safari/SafariWebExtensionHandler.swiftnew file+200
This diff is too big to show here.
apps/browser/src/safari/safari/safari.entitlementsnew file+14
This diff is too big to show here.
src/scripts/duo.js → apps/browser/src/scripts/duo.jsrenamed
The content is the same.
apps/browser/src/services/abstractChromeStorageApi.service.tsnew file+51
This diff is too big to show here.
apps/browser/src/services/abstractions/abstractKeyGeneration.service.tsnew file+5
This diff is too big to show here.
apps/browser/src/services/abstractions/autofill.service.tsnew file+7
This diff is too big to show here.
apps/browser/src/services/abstractions/state.service.tsnew file+32
This diff is too big to show here.
apps/browser/src/services/autofill.service.tsnew file+1321
This diff is too big to show here.
apps/browser/src/services/autofillConstants.tsnew file+739
This diff is too big to show here.
apps/browser/src/services/browserCrypto.service.tsnew file+13
This diff is too big to show here.
apps/browser/src/services/browserFileDownloadService.tsnew file+44
This diff is too big to show here.
apps/browser/src/services/browserLocalStorage.service.tsnew file+5
This diff is too big to show here.
apps/browser/src/services/browserMemoryStorage.service.tsnew file+5
This diff is too big to show here.
apps/browser/src/services/browserMessaging.service.tsnew file+8
This diff is too big to show here.
apps/browser/src/services/browserMessagingPrivateModeBackground.service.tsnew file+8
This diff is too big to show here.
apps/browser/src/services/browserMessagingPrivateModePopup.service.tsnew file+8
This diff is too big to show here.
apps/browser/src/services/browserPlatformUtils.service.spec.tsnew file+88
This diff is too big to show here.
apps/browser/src/services/browserPlatformUtils.service.tsnew file+352
This diff is too big to show here.
apps/browser/src/services/i18n.service.tsnew file+94
This diff is too big to show here.
apps/browser/src/services/keyGeneration.service.tsnew file+20
This diff is too big to show here.
apps/browser/src/services/localBackedSessionStorage.service.spec.tsnew file+308
This diff is too big to show here.
apps/browser/src/services/localBackedSessionStorage.service.tsnew file+107
This diff is too big to show here.
apps/browser/src/services/state.service.spec.tsnew file+109
This diff is too big to show here.
apps/browser/src/services/state.service.tsnew file+119
This diff is too big to show here.
apps/browser/src/services/vaultFilter.service.tsnew file+73
This diff is too big to show here.
apps/browser/src/services/vaultTimeout.service.tsnew file+30
This diff is too big to show here.
apps/browser/store/icons/chrome-icon128.pngnew file
Binary file not shown.
apps/browser/store/icons/icon64.pngnew file
Binary file not shown.
apps/browser/store/icons/windows-icon300.pngnew file
Binary file not shown.
store/locales/hi/copy.resx → apps/browser/store/locales/ar/copy.resxrenamed+175−156
This diff is too big to show here.
apps/browser/store/locales/az/copy.resxnew file+174
This diff is too big to show here.
apps/browser/store/locales/be/copy.resxnew file+158
This diff is too big to show here.
apps/browser/store/locales/bg/copy.resxnew file+154
This diff is too big to show here.
apps/browser/store/locales/bn/copy.resxnew file+154
This diff is too big to show here.
store/locales/th/copy.resx → apps/browser/store/locales/bs/copy.resxrenamed+175−156
This diff is too big to show here.
apps/browser/store/locales/ca/copy.resxnew file+174
This diff is too big to show here.
store/locales/cs/copy.resx → apps/browser/store/locales/cs/copy.resxrenamed+156−156
This diff is too big to show here.
store/locales/da/copy.resx → apps/browser/store/locales/da/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/de/copy.resx → apps/browser/store/locales/de/copy.resxrenamed+175−156
This diff is too big to show here.
apps/browser/store/locales/el/copy.resxnew file+158
This diff is too big to show here.
store/locales/en/assets/chrome-tile-large.png → apps/browser/store/locales/en/assets/chrome-tile-large.pngrenamed
Binary file not shown.
store/locales/en/assets/chrome-tile-marquee.png → apps/browser/store/locales/en/assets/chrome-tile-marquee.pngrenamed
Binary file not shown.
store/locales/en/assets/chrome-tile-small.png → apps/browser/store/locales/en/assets/chrome-tile-small.pngrenamed
Binary file not shown.
store/locales/hr/copy.resx → apps/browser/store/locales/en/copy.resxrenamed+175−156
This diff is too big to show here.
apps/browser/store/locales/en/screenshots/Chrome/Chrome01.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/Chrome02.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/Chrome03.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/Chrome04.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/Chrome05.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/promo_01.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/promo_02.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Chrome/promo_03.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Firefox/Firefox01.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Firefox/Firefox02.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Firefox/Firefox03.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Firefox/Firefox04.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Firefox/Firefox05.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge01.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge02.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge03.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge04.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/MicrosoftEdge/Edge05.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Opera/Opera01.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Opera/Opera02.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Opera/Opera03.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Opera/Opera04.pngnew file
Binary file not shown.
apps/browser/store/locales/en/screenshots/Opera/Opera05.pngnew file
Binary file not shown.
apps/browser/store/locales/en_GB/copy.resxnew file+175
This diff is too big to show here.
apps/browser/store/locales/en_IN/copy.resxnew file+175
This diff is too big to show here.
store/locales/es/copy.resx → apps/browser/store/locales/es/copy.resxrenamed+175−154
This diff is too big to show here.
store/locales/et/copy.resx → apps/browser/store/locales/et/copy.resxrenamed+158−156
This diff is too big to show here.
apps/browser/store/locales/eu/copy.resxnew file+175
This diff is too big to show here.
apps/browser/store/locales/fa/copy.resxnew file+161
This diff is too big to show here.
apps/browser/store/locales/fi/copy.resxnew file+174
This diff is too big to show here.
apps/browser/store/locales/fil/copy.resxnew file+175
This diff is too big to show here.
store/locales/fr/copy.resx → apps/browser/store/locales/fr/copy.resxrenamed+174−156
This diff is too big to show here.
apps/browser/store/locales/he/copy.resxnew file+158
This diff is too big to show here.
store/locales/en/copy.resx → apps/browser/store/locales/hi/copy.resxrenamed+27−27
This diff is too big to show here.
apps/browser/store/locales/hr/copy.resxnew file+174
This diff is too big to show here.
apps/browser/store/locales/hu/copy.resxnew file+170
This diff is too big to show here.
store/locales/id/copy.resx → apps/browser/store/locales/id/copy.resxrenamed+158−156
This diff is too big to show here.
store/locales/it/copy.resx → apps/browser/store/locales/it/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/ja/copy.resx → apps/browser/store/locales/ja/copy.resxrenamed+158−156
This diff is too big to show here.
apps/browser/store/locales/ka/copy.resxnew file+175
This diff is too big to show here.
apps/browser/store/locales/km/copy.resxnew file+175
This diff is too big to show here.
apps/browser/store/locales/kn/copy.resxnew file+174
This diff is too big to show here.
apps/browser/store/locales/ko/copy.resxnew file+175
This diff is too big to show here.
store/locales/hu/copy.resx → apps/browser/store/locales/lt/copy.resxrenamed+158−156
This diff is too big to show here.
store/locales/fi/copy.resx → apps/browser/store/locales/lv/copy.resxrenamed+159−156
This diff is too big to show here.
apps/browser/store/locales/ml/copy.resxnew file+162
This diff is too big to show here.
store/locales/nb/copy.resx → apps/browser/store/locales/nb/copy.resxrenamed+158−156
This diff is too big to show here.
store/locales/nl/copy.resx → apps/browser/store/locales/nl/copy.resxrenamed+174−156
This diff is too big to show here.
apps/browser/store/locales/nn/copy.resxnew file+175
This diff is too big to show here.
store/locales/pl/copy.resx → apps/browser/store/locales/pl/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/pt_BR/copy.resx → apps/browser/store/locales/pt_BR/copy.resxrenamed+158−156
This diff is too big to show here.
store/locales/pt_PT/copy.resx → apps/browser/store/locales/pt_PT/copy.resxrenamed+158−156
This diff is too big to show here.
store/locales/ro/copy.resx → apps/browser/store/locales/ro/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/ru/copy.resx → apps/browser/store/locales/ru/copy.resxrenamed+174−156
This diff is too big to show here.
apps/browser/store/locales/si/copy.resxnew file+175
This diff is too big to show here.
store/locales/sk/copy.resx → apps/browser/store/locales/sk/copy.resxrenamed+175−156
This diff is too big to show here.
apps/browser/store/locales/sl/copy.resxnew file+175
This diff is too big to show here.
apps/browser/store/locales/sr/copy.resxnew file+158
This diff is too big to show here.
store/locales/sv/copy.resx → apps/browser/store/locales/sv/copy.resxrenamed+175−156
This diff is too big to show here.
apps/browser/store/locales/th/copy.resxnew file+175
This diff is too big to show here.
store/locales/tr/copy.resx → apps/browser/store/locales/tr/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/uk/copy.resx → apps/browser/store/locales/uk/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/vi/copy.resx → apps/browser/store/locales/vi/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/zh_CN/copy.resx → apps/browser/store/locales/zh_CN/copy.resxrenamed+174−156
This diff is too big to show here.
store/locales/zh_TW/copy.resx → apps/browser/store/locales/zh_TW/copy.resxrenamed+174−156
This diff is too big to show here.
store/windows/AppxManifest.xml → apps/browser/store/windows/AppxManifest.xmlrenamed+4−4
This diff is too big to show here.
apps/browser/store/windows/Assets/icon_150.pngnew file
Binary file not shown.
apps/browser/store/windows/Assets/icon_44.pngnew file
Binary file not shown.
apps/browser/store/windows/Assets/icon_50.pngnew file
Binary file not shown.
apps/browser/test.setup.tsnew file+26
This diff is too big to show here.
apps/browser/tsconfig.jsonnew file+21
This diff is too big to show here.
apps/browser/tsconfig.spec.jsonnew file+3
This diff is too big to show here.
apps/browser/webpack.config.jsnew file+204
This diff is too big to show here.
apps/cli/.eslintrc.jsonnew file+5
This diff is too big to show here.
apps/cli/.gitignorenew file+1
This diff is too big to show here.
apps/cli/.npmignorenew file+3
This diff is too big to show here.
apps/cli/.vscode/launch.jsonnew file+25
This diff is too big to show here.
apps/cli/.vscode/settings.jsonnew file+14
This diff is too big to show here.
apps/cli/README.mdnew file+68
This diff is too big to show here.
apps/cli/config/config.jsnew file+31
This diff is too big to show here.
apps/cli/config/development.jsonnew file+5
This diff is too big to show here.
apps/cli/config/production.jsonnew file+5
This diff is too big to show here.
apps/cli/examples/git-credential-bw.shnew file+56
This diff is too big to show here.
apps/cli/jest.config.jsnew file+15
This diff is too big to show here.
apps/cli/package-lock.jsonnew file+3538
This diff is too big to show here.
apps/cli/package.jsonnew file+73
This diff is too big to show here.
apps/cli/scripts/brew-update.ps1new file+23
This diff is too big to show here.
apps/cli/scripts/choco-pack.ps1new file+34
This diff is too big to show here.
apps/cli/scripts/choco-update.ps1new file+26
This diff is too big to show here.
apps/cli/scripts/snap-build.ps1new file+32
This diff is too big to show here.
apps/cli/scripts/snap-update.ps1new file+12
This diff is too big to show here.
apps/cli/spec/bw.spec.tsnew file+3
This diff is too big to show here.
apps/cli/spec/test.setup.tsnew file
No changes to the content.
apps/cli/spec/utils.spec.tsnew file+27
This diff is too big to show here.
apps/cli/src/bw.tsnew file+395
This diff is too big to show here.
apps/cli/src/commands/completion.command.tsnew file+119
This diff is too big to show here.
apps/cli/src/commands/config.command.tsnew file+53
This diff is too big to show here.
apps/cli/src/commands/confirm.command.tsnew file+62
This diff is too big to show here.
apps/cli/src/commands/convertToKeyConnector.command.tsnew file+84
This diff is too big to show here.
apps/cli/src/commands/create.command.tsnew file+208
This diff is too big to show here.
apps/cli/src/commands/delete.command.tsnew file+133
This diff is too big to show here.
apps/cli/src/commands/download.command.tsnew file+43
This diff is too big to show here.
apps/cli/src/commands/edit.command.tsnew file+188
This diff is too big to show here.
apps/cli/src/commands/encode.command.tsnew file+16
This diff is too big to show here.
apps/cli/src/commands/export.command.tsnew file+97
This diff is too big to show here.
apps/cli/src/commands/generate.command.tsnew file+80
This diff is too big to show here.
apps/cli/src/commands/get.command.tsnew file+540
This diff is too big to show here.
apps/cli/src/commands/import.command.tsnew file+127
This diff is too big to show here.
apps/cli/src/commands/list.command.tsnew file+252
This diff is too big to show here.
apps/cli/src/commands/lock.command.tsnew file+14
This diff is too big to show here.
apps/cli/src/commands/login.command.tsnew file+99
This diff is too big to show here.
apps/cli/src/commands/restore.command.tsnew file+36
This diff is too big to show here.
apps/cli/src/commands/send/create.command.tsnew file+149
This diff is too big to show here.
apps/cli/src/commands/send/delete.command.tsnew file+21
This diff is too big to show here.
apps/cli/src/commands/send/edit.command.tsnew file+90
This diff is too big to show here.
apps/cli/src/commands/send/get.command.tsnew file+83
This diff is too big to show here.
apps/cli/src/commands/send/list.command.tsnew file+36
This diff is too big to show here.
apps/cli/src/commands/send/receive.command.tsnew file+170
This diff is too big to show here.
apps/cli/src/commands/send/removePassword.command.tsnew file+21
This diff is too big to show here.
apps/cli/src/commands/serve.command.tsnew file+397
This diff is too big to show here.
apps/cli/src/commands/share.command.tsnew file+59
This diff is too big to show here.
apps/cli/src/commands/status.command.tsnew file+54
This diff is too big to show here.
apps/cli/src/commands/sync.command.tsnew file+41
This diff is too big to show here.
apps/cli/src/commands/unlock.command.tsnew file+132
This diff is too big to show here.
apps/cli/src/flags.tsnew file+5
This diff is too big to show here.
apps/cli/src/locales/en/messages.jsonnew file+47
This diff is too big to show here.
apps/cli/src/models/request/organizationCollectionRequest.tsnew file+16
This diff is too big to show here.
apps/cli/src/models/response/attachmentResponse.tsnew file+17
This diff is too big to show here.
apps/cli/src/models/response/cipherResponse.tsnew file+33
This diff is too big to show here.
apps/cli/src/models/response/collectionResponse.tsnew file+13
This diff is too big to show here.
apps/cli/src/models/response/folderResponse.tsnew file+13
This diff is too big to show here.
apps/cli/src/models/response/loginResponse.tsnew file+11
This diff is too big to show here.
apps/cli/src/models/response/organizationCollectionResponse.tsnew file+15
This diff is too big to show here.
apps/cli/src/models/response/organizationResponse.tsnew file+22
This diff is too big to show here.
apps/cli/src/models/response/organizationUserResponse.tsnew file+17
This diff is too big to show here.
apps/cli/src/models/response/passwordHistoryResponse.tsnew file+11
This diff is too big to show here.
apps/cli/src/models/response/sendAccessResponse.tsnew file+40
This diff is too big to show here.
apps/cli/src/models/response/sendFileResponse.tsnew file+36
This diff is too big to show here.
apps/cli/src/models/response/sendResponse.tsnew file+123
This diff is too big to show here.
apps/cli/src/models/response/sendTextResponse.tsnew file+30
This diff is too big to show here.
apps/cli/src/models/response/templateResponse.tsnew file+11
This diff is too big to show here.
apps/cli/src/models/selectionReadOnly.tsnew file+15
This diff is too big to show here.
apps/cli/src/program.tsnew file+546
This diff is too big to show here.
apps/cli/src/send.program.tsnew file+334
This diff is too big to show here.
apps/cli/src/services/i18n.service.tsnew file+20
This diff is too big to show here.
apps/cli/src/services/lowdbStorage.service.tsnew file+40
This diff is too big to show here.
apps/cli/src/services/nodeEnvSecureStorage.service.tsnew file+103
This diff is too big to show here.
apps/cli/src/utils.tsnew file+270
This diff is too big to show here.
apps/cli/src/vault.program.tsnew file+489
This diff is too big to show here.
apps/cli/stores/chocolatey/bitwarden-cli.nuspecnew file+41
This diff is too big to show here.
apps/cli/stores/chocolatey/tools/VERIFICATION.txtnew file+6
This diff is too big to show here.
apps/cli/stores/snap/snapcraft.yamlnew file+17
This diff is too big to show here.
apps/cli/tsconfig.jsonnew file+20
This diff is too big to show here.
apps/cli/tsconfig.spec.jsonnew file+3
This diff is too big to show here.
apps/cli/webpack.config.jsnew file+85
This diff is too big to show here.
apps/desktop/.eslintrc.jsonnew file+6
This diff is too big to show here.
apps/desktop/.gitignorenew file+4
This diff is too big to show here.
apps/desktop/.vscode/launch.jsonnew file+16
This diff is too big to show here.
apps/desktop/.vscode/settings.jsonnew file+6
This diff is too big to show here.
apps/desktop/README.mdnew file+15
This diff is too big to show here.
apps/desktop/SECURITY.mdnew file+21
This diff is too big to show here.
apps/desktop/crowdin.ymlnew file+16
This diff is too big to show here.
apps/desktop/desktop_native/.gitignorenew file+6
This diff is too big to show here.
apps/desktop/desktop_native/Cargo.locknew file+946
This diff is too big to show here.
apps/desktop/desktop_native/Cargo.tomlnew file+43
This diff is too big to show here.
apps/desktop/desktop_native/build.jsnew file+22
This diff is too big to show here.
apps/desktop/desktop_native/build.rsnew file+5
This diff is too big to show here.
apps/desktop/desktop_native/index.d.tsnew file+15
This diff is too big to show here.
apps/desktop/desktop_native/index.jsnew file+241
This diff is too big to show here.
apps/desktop/desktop_native/package-lock.jsonnew file+41
This diff is too big to show here.
apps/desktop/desktop_native/package.jsonnew file+32
This diff is too big to show here.
apps/desktop/desktop_native/src/lib.rsnew file+39
This diff is too big to show here.
apps/desktop/desktop_native/src/password/macos.rsnew file+59
This diff is too big to show here.
apps/desktop/desktop_native/src/password/mod.rsnew file+5
This diff is too big to show here.
apps/desktop/desktop_native/src/password/unix.rsnew file+91
This diff is too big to show here.
apps/desktop/desktop_native/src/password/windows.rsnew file+180
This diff is too big to show here.
apps/desktop/electron-builder.jsonnew file+167
This diff is too big to show here.
apps/desktop/installer.nshnew file+9
This diff is too big to show here.
apps/desktop/package.jsonnew file+53
This diff is too big to show here.
apps/desktop/resources/appx/BadgeLogo.pngnew file
Binary file not shown.
apps/desktop/resources/appx/SplashScreen.pngnew file
Binary file not shown.
apps/desktop/resources/appx/Square150x150Logo.pngnew file
Binary file not shown.
apps/desktop/resources/appx/Square44x44Logo.pngnew file
Binary file not shown.
apps/desktop/resources/appx/StoreLogo.pngnew file
Binary file not shown.
apps/desktop/resources/appx/Wide310x150Logo.pngnew file
Binary file not shown.
apps/desktop/resources/background.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.icnsnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_128x128.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_128x128@2x.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_16x16.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_16x16@2x.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_256x256.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_256x256@2x.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_32x32.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_32x32@2x.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_512x512.pngnew file
Binary file not shown.
apps/desktop/resources/dmg.iconset/icon_512x512@2x.pngnew file
Binary file not shown.
apps/desktop/resources/entitlements.mac.plistnew file+12
This diff is too big to show here.
apps/desktop/resources/entitlements.mas.inherit.plistnew file+14
This diff is too big to show here.
apps/desktop/resources/entitlements.mas.loginhelper.plistnew file+8
This diff is too big to show here.
apps/desktop/resources/entitlements.mas.plistnew file+30
This diff is too big to show here.
apps/desktop/resources/icon.icnsnew file
Binary file not shown.
apps/desktop/resources/icon.iconew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_128x128.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_128x128@2x.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_16x16.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_16x16@2x.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_256x256.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_256x256@2x.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_32x32.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_32x32@2x.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_512x512.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_512x512@2x.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_64x64.pngnew file
Binary file not shown.
apps/desktop/resources/icon.iconset/icon_64x64@2x.pngnew file
Binary file not shown.
apps/desktop/resources/icon.pngnew file
Binary file not shown.
apps/desktop/resources/icons/1024x1024.pngnew file
Binary file not shown.
apps/desktop/resources/icons/128x128.pngnew file
Binary file not shown.
apps/desktop/resources/icons/16x16.pngnew file
Binary file not shown.
apps/desktop/resources/icons/256x256.pngnew file
Binary file not shown.
apps/desktop/resources/icons/32x32.pngnew file
Binary file not shown.
apps/desktop/resources/icons/512x512.pngnew file
Binary file not shown.
apps/desktop/resources/icons/64x64.pngnew file
Binary file not shown.
apps/desktop/resources/installerSidebar.bmpnew file
Binary file not shown.
apps/desktop/resources/native-messaging.batnew file+7
This diff is too big to show here.
apps/desktop/scripts/after-sign.jsnew file+62
This diff is too big to show here.
apps/desktop/scripts/cask-update.ps1new file+17
This diff is too big to show here.
apps/desktop/scripts/choco-update.ps1new file+34
This diff is too big to show here.
apps/desktop/scripts/dev/.gitignorenew file+1
This diff is too big to show here.
apps/desktop/scripts/dev/docker-compose.ymlnew file+19
This diff is too big to show here.
apps/desktop/scripts/safari-build.ps1new file+72
This diff is too big to show here.
apps/desktop/scripts/snap-update.ps1new file+28
This diff is too big to show here.
apps/desktop/sign.jsnew file+22
This diff is too big to show here.
apps/desktop/src/app/accounts/accessibility-cookie.component.htmlnew file+33
This diff is too big to show here.
apps/desktop/src/app/accounts/accessibility-cookie.component.tsnew file+97
This diff is too big to show here.
apps/desktop/src/app/accounts/environment.component.htmlnew file+93
This diff is too big to show here.
apps/desktop/src/app/accounts/environment.component.tsnew file+20
This diff is too big to show here.
apps/desktop/src/app/accounts/hint.component.htmlnew file+31
This diff is too big to show here.
apps/desktop/src/app/accounts/hint.component.tsnew file+24
This diff is too big to show here.
apps/desktop/src/app/accounts/lock.component.htmlnew file+75
This diff is too big to show here.
apps/desktop/src/app/accounts/lock.component.tsnew file+107
This diff is too big to show here.
apps/desktop/src/app/accounts/login.component.htmlnew file+108
This diff is too big to show here.
apps/desktop/src/app/accounts/login.component.tsnew file+128
This diff is too big to show here.
apps/desktop/src/app/accounts/premium.component.htmlnew file+89
This diff is too big to show here.
apps/desktop/src/app/accounts/premium.component.tsnew file+24
This diff is too big to show here.
apps/desktop/src/app/accounts/register.component.htmlnew file+144
This diff is too big to show here.
apps/desktop/src/app/accounts/register.component.tsnew file+79
This diff is too big to show here.
apps/desktop/src/app/accounts/remove-password.component.htmlnew file+26
This diff is too big to show here.
apps/desktop/src/app/accounts/remove-password.component.tsnew file+9
This diff is too big to show here.
apps/desktop/src/app/accounts/set-password.component.htmlnew file+157
This diff is too big to show here.
apps/desktop/src/app/accounts/set-password.component.tsnew file+104
This diff is too big to show here.
apps/desktop/src/app/accounts/settings.component.htmlnew file+353
This diff is too big to show here.
apps/desktop/src/app/accounts/settings.component.tsnew file+440
This diff is too big to show here.
apps/desktop/src/app/accounts/sso.component.htmlnew file+9
This diff is too big to show here.
apps/desktop/src/app/accounts/sso.component.tsnew file+54
This diff is too big to show here.
apps/desktop/src/app/accounts/two-factor-options.component.htmlnew file+33
This diff is too big to show here.
apps/desktop/src/app/accounts/two-factor-options.component.tsnew file+22
This diff is too big to show here.
apps/desktop/src/app/accounts/two-factor.component.htmlnew file+148
This diff is too big to show here.
apps/desktop/src/app/accounts/two-factor.component.tsnew file+94
This diff is too big to show here.
apps/desktop/src/app/accounts/update-temp-password.component.htmlnew file+122
This diff is too big to show here.
apps/desktop/src/app/accounts/update-temp-password.component.tsnew file+80
This diff is too big to show here.
apps/desktop/src/app/accounts/vault-timeout-input.component.htmlnew file+45
This diff is too big to show here.
apps/desktop/src/app/accounts/vault-timeout-input.component.tsnew file+22
This diff is too big to show here.
apps/desktop/src/app/app-routing.module.tsnew file+71
This diff is too big to show here.
apps/desktop/src/app/app.component.tsnew file+630
This diff is too big to show here.
apps/desktop/src/app/app.module.tsnew file+203
This diff is too big to show here.
apps/desktop/src/app/components/password-reprompt.component.htmlnew file+54
This diff is too big to show here.
apps/desktop/src/app/components/password-reprompt.component.tsnew file+8
This diff is too big to show here.
apps/desktop/src/app/components/set-pin.component.htmlnew file+65
This diff is too big to show here.
apps/desktop/src/app/components/set-pin.component.tsnew file+8
This diff is too big to show here.
apps/desktop/src/app/components/user-verification.component.htmlnew file+46
This diff is too big to show here.
apps/desktop/src/app/components/user-verification.component.tsnew file+23
This diff is too big to show here.
apps/desktop/src/app/guards/login.guard.tsnew file+28
This diff is too big to show here.
apps/desktop/src/app/layout/account-switcher.component.htmlnew file+100
This diff is too big to show here.
apps/desktop/src/app/layout/account-switcher.component.tsnew file+135
This diff is too big to show here.
apps/desktop/src/app/layout/header.component.htmlnew file+4
This diff is too big to show here.
apps/desktop/src/app/layout/header.component.tsnew file+7
This diff is too big to show here.
apps/desktop/src/app/layout/nav.component.htmlnew file+13
This diff is too big to show here.
apps/desktop/src/app/layout/nav.component.tsnew file+24
This diff is too big to show here.
apps/desktop/src/app/layout/search/search-bar.service.tsnew file+38
This diff is too big to show here.
apps/desktop/src/app/layout/search/search.component.htmlnew file+11
This diff is too big to show here.
apps/desktop/src/app/layout/search/search.component.tsnew file+36
This diff is too big to show here.
apps/desktop/src/app/main.tsnew file+19
This diff is too big to show here.
apps/desktop/src/app/modules/shared.module.tsnew file+43
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/collection-filter.component.htmlnew file+76
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/collection-filter.component.tsnew file+9
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/folder-filter.component.htmlnew file+84
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/folder-filter.component.tsnew file+9
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/organization-filter.component.htmlnew file+108
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/organization-filter.component.tsnew file+42
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/status-filter.component.htmlnew file+46
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/status-filter.component.tsnew file+9
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/type-filter.component.htmlnew file+76
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/components/type-filter.component.tsnew file+9
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/vault-filter.component.htmlnew file+50
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/vault-filter.component.tsnew file+9
This diff is too big to show here.
apps/desktop/src/app/modules/vault-filter/vault-filter.module.tsnew file+27
This diff is too big to show here.
apps/desktop/src/app/send/add-edit.component.htmlnew file+292
This diff is too big to show here.
apps/desktop/src/app/send/add-edit.component.tsnew file+62
This diff is too big to show here.
apps/desktop/src/app/send/efflux-dates.component.htmlnew file+55
This diff is too big to show here.
apps/desktop/src/app/send/efflux-dates.component.tsnew file+38
This diff is too big to show here.
apps/desktop/src/app/send/send.component.htmlnew file+156
This diff is too big to show here.
apps/desktop/src/app/send/send.component.tsnew file+144
This diff is too big to show here.
apps/desktop/src/app/services/desktop-theming.service.tsnew file+18
This diff is too big to show here.
apps/desktop/src/app/services/desktopFileDownloadService.tsnew file+18
This diff is too big to show here.
apps/desktop/src/app/services/init.service.tsnew file+72
This diff is too big to show here.
apps/desktop/src/app/services/services.module.tsnew file+152
This diff is too big to show here.
apps/desktop/src/app/vault/add-edit-custom-fields.component.htmlnew file+118
This diff is too big to show here.
apps/desktop/src/app/vault/add-edit-custom-fields.component.tsnew file+15
This diff is too big to show here.
apps/desktop/src/app/vault/add-edit.component.htmlnew file+611
This diff is too big to show here.
apps/desktop/src/app/vault/add-edit.component.tsnew file+124
This diff is too big to show here.
apps/desktop/src/app/vault/attachments.component.htmlnew file+78
This diff is too big to show here.
apps/desktop/src/app/vault/attachments.component.tsnew file+40
This diff is too big to show here.
apps/desktop/src/app/vault/ciphers.component.htmlnew file+67
This diff is too big to show here.
apps/desktop/src/app/vault/ciphers.component.tsnew file+26
This diff is too big to show here.
apps/desktop/src/app/vault/collections.component.htmlnew file+51
This diff is too big to show here.
apps/desktop/src/app/vault/collections.component.tsnew file+24
This diff is too big to show here.
apps/desktop/src/app/vault/export.component.htmlnew file+45
This diff is too big to show here.
apps/desktop/src/app/vault/export.component.tsnew file+80
This diff is too big to show here.
apps/desktop/src/app/vault/folder-add-edit.component.htmlnew file+68
This diff is too big to show here.
apps/desktop/src/app/vault/folder-add-edit.component.tsnew file+24
This diff is too big to show here.
apps/desktop/src/app/vault/generator.component.htmlnew file+560
This diff is too big to show here.
apps/desktop/src/app/vault/generator.component.tsnew file+41
This diff is too big to show here.
apps/desktop/src/app/vault/password-generator-history.component.htmlnew file+52
This diff is too big to show here.
apps/desktop/src/app/vault/password-generator-history.component.tsnew file+20
This diff is too big to show here.
apps/desktop/src/app/vault/password-history.component.htmlnew file+40
This diff is too big to show here.
apps/desktop/src/app/vault/password-history.component.tsnew file+20
This diff is too big to show here.
apps/desktop/src/app/vault/share.component.htmlnew file+78
This diff is too big to show here.
apps/desktop/src/app/vault/share.component.tsnew file+33
This diff is too big to show here.
apps/desktop/src/app/vault/vault.component.htmlnew file+71
This diff is too big to show here.
apps/desktop/src/app/vault/vault.component.tsnew file+753
This diff is too big to show here.
apps/desktop/src/app/vault/view-custom-fields.component.htmlnew file+72
This diff is too big to show here.
apps/desktop/src/app/vault/view-custom-fields.component.tsnew file+14
This diff is too big to show here.
apps/desktop/src/app/vault/view.component.htmlnew file+412
This diff is too big to show here.
apps/desktop/src/app/vault/view.component.tsnew file+118
This diff is too big to show here.
apps/desktop/src/entry.tsnew file+35
This diff is too big to show here.
apps/desktop/src/global.d.tsnew file+1
This diff is too big to show here.
apps/desktop/src/images/bwi-globe.pngnew file
Binary file not shown.
apps/desktop/src/images/close-button-white.svgnew file+1
This diff is too big to show here.
apps/desktop/src/images/icon-highlight.pngnew file
Binary file not shown.
apps/desktop/src/images/icon-highlight@2x.pngnew file
Binary file not shown.
apps/desktop/src/images/icon-template.pngnew file
Binary file not shown.
apps/desktop/src/images/icon-template@2x.pngnew file
Binary file not shown.
apps/desktop/src/images/icon.iconew file
Binary file not shown.
apps/desktop/src/images/icon.pngnew file
Binary file not shown.
apps/desktop/src/images/loading.svgnew file+6
This diff is too big to show here.
apps/desktop/src/images/logo-dark@2x.pngnew file
Binary file not shown.
apps/desktop/src/images/logo-white@2x.pngnew file
Binary file not shown.
apps/desktop/src/images/search-desktop-dark.svgnew file+34
This diff is too big to show here.
apps/desktop/src/images/search-desktop-light.svgnew file+34
This diff is too big to show here.
apps/desktop/src/images/two-factor/0.pngnew file
Binary file not shown.
apps/desktop/src/images/two-factor/1.pngnew file
Binary file not shown.
apps/desktop/src/images/two-factor/2.pngnew file
Binary file not shown.
apps/desktop/src/images/two-factor/3.pngnew file
Binary file not shown.
apps/desktop/src/images/two-factor/4.pngnew file
Binary file not shown.
apps/desktop/src/images/two-factor/6.pngnew file
Binary file not shown.
apps/desktop/src/images/u2fkey.jpgnew file
Binary file not shown.
apps/desktop/src/images/yubikey.jpgnew file
Binary file not shown.
apps/desktop/src/index.htmlnew file+19
This diff is too big to show here.
apps/desktop/src/locales/af/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/ar/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/az/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/be/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/bg/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/bn/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/bs/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/ca/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/cs/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/da/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/de/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/el/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/en/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/en_GB/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/en_IN/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/eo/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/es/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/et/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/eu/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/fa/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/fi/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/fil/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/fr/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/he/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/hi/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/hr/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/hu/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/id/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/it/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/ja/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/ka/messages.jsonnew file+1979
This diff is too big to show here.
apps/desktop/src/locales/km/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/kn/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/ko/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/lv/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/me/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/ml/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/nb/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/nl/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/nn/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/pl/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/pt_BR/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/pt_PT/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/ro/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/ru/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/si/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/sk/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/sl/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/sr/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/sv/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/th/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/tr/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/uk/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/vi/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/zh_CN/messages.json+1979
This diff is too big to show here.
apps/desktop/src/locales/zh_TW/messages.json+1979
This diff is too big to show here.
apps/desktop/src/main.ts+222
This diff is too big to show here.
apps/desktop/src/main/biometric/biometric.darwin.main.ts+36
This diff is too big to show here.
apps/desktop/src/main/biometric/biometric.main.ts+6
This diff is too big to show here.
apps/desktop/src/main/biometric/biometric.windows.main.ts+146
This diff is too big to show here.
apps/desktop/src/main/desktopCredentialStorageListener.ts+51
This diff is too big to show here.
apps/desktop/src/main/menu/menu.about.ts+87
This diff is too big to show here.
apps/desktop/src/main/menu/menu.account.ts+115
This diff is too big to show here.
apps/desktop/src/main/menu/menu.bitwarden.ts+113
This diff is too big to show here.
apps/desktop/src/main/menu/menu.edit.ts+131
This diff is too big to show here.
apps/desktop/src/main/menu/menu.file.ts+141
This diff is too big to show here.
apps/desktop/src/main/menu/menu.first.ts+152
This diff is too big to show here.
apps/desktop/src/main/menu/menu.help.ts+234
This diff is too big to show here.
apps/desktop/src/main/menu/menu.main.ts+52
This diff is too big to show here.
apps/desktop/src/main/menu/menu.updater.ts+12
This diff is too big to show here.
apps/desktop/src/main/menu/menu.view.ts+135
This diff is too big to show here.
apps/desktop/src/main/menu/menu.window.ts+105
This diff is too big to show here.
apps/desktop/src/main/menu/menubar.ts+100
This diff is too big to show here.
apps/desktop/src/main/messaging.main.ts+159
This diff is too big to show here.
apps/desktop/src/main/nativeMessaging.main.ts+319
This diff is too big to show here.
apps/desktop/src/main/powerMonitor.main.ts+47
This diff is too big to show here.
apps/desktop/src/models/account.ts+20
This diff is too big to show here.
apps/desktop/src/package-lock.json+1297
This diff is too big to show here.
apps/desktop/src/package.json+19
This diff is too big to show here.
apps/desktop/src/proxy/ipc.ts+53
This diff is too big to show here.
apps/desktop/src/proxy/native-messaging-proxy.ts+23
This diff is too big to show here.
apps/desktop/src/proxy/nativemessage.ts+95
This diff is too big to show here.
apps/desktop/src/scripts/duo.js+418
This diff is too big to show here.
apps/desktop/src/scss/base.scss+138
This diff is too big to show here.
apps/desktop/src/scss/box.scss+489
This diff is too big to show here.
apps/desktop/src/scss/buttons.scss+182
This diff is too big to show here.
apps/desktop/src/scss/environment.scss+55
This diff is too big to show here.
apps/desktop/src/scss/grid.scss+10
This diff is too big to show here.
apps/desktop/src/scss/header.scss+210
This diff is too big to show here.
apps/desktop/src/scss/left-nav.scss+196
This diff is too big to show here.
apps/desktop/src/scss/list.scss+154
This diff is too big to show here.
apps/desktop/src/scss/loading.scss+10
This diff is too big to show here.
apps/desktop/src/scss/misc.scss+492
This diff is too big to show here.
apps/desktop/src/scss/modal.scss+356
This diff is too big to show here.
apps/desktop/src/scss/pages.scss+247
This diff is too big to show here.
apps/desktop/src/scss/plugins.scss+203
This diff is too big to show here.
apps/desktop/src/scss/styles.scss+19
This diff is too big to show here.
apps/desktop/src/scss/variables.scss+229
This diff is too big to show here.
apps/desktop/src/scss/vault.scss+164
This diff is too big to show here.
apps/desktop/src/services/i18n.service.ts+76
This diff is too big to show here.
apps/desktop/src/services/nativeMessaging.service.ts+187
This diff is too big to show here.
apps/desktop/src/services/passwordReprompt.service.ts+10
This diff is too big to show here.
apps/desktop/src/services/state.service.ts+16
This diff is too big to show here.
apps/desktop/stores/apple/screenshots/macos01.png
This diff is too big to show here.
apps/desktop/stores/apple/screenshots/macos02.png
This diff is too big to show here.
apps/desktop/stores/apple/screenshots/macos03.png
This diff is too big to show here.
apps/desktop/stores/apple/screenshots/macos04.png
This diff is too big to show here.
apps/desktop/stores/apple/screenshots/macos05.png
This diff is too big to show here.
apps/desktop/stores/apple/screenshots/macos06.png
This diff is too big to show here.
apps/desktop/stores/chocolatey/bitwarden.nuspec+37
This diff is too big to show here.
apps/desktop/stores/chocolatey/tools/chocolateyinstall.ps1+17
This diff is too big to show here.
apps/desktop/stores/microsoft/microsoft01.png
This diff is too big to show here.
apps/desktop/stores/microsoft/microsoft02.png
This diff is too big to show here.
apps/desktop/stores/microsoft/microsoft03.png
This diff is too big to show here.
apps/desktop/stores/microsoft/microsoft04.png
This diff is too big to show here.
apps/desktop/stores/microsoft/microsoft05.png
This diff is too big to show here.
apps/desktop/tsconfig.json+23
This diff is too big to show here.
apps/desktop/tsconfig.renderer.json+4
This diff is too big to show here.
apps/desktop/webpack.main.js+82
This diff is too big to show here.
apps/desktop/webpack.renderer.js+136
This diff is too big to show here.
apps/web/.dockerignore+3
This diff is too big to show here.
apps/web/.eslintrc.json+5
This diff is too big to show here.
apps/web/.gitignore+3
This diff is too big to show here.
apps/web/.vscode/settings.json+6
This diff is too big to show here.
apps/web/Dockerfile+20
This diff is too big to show here.
apps/web/README.md+24
This diff is too big to show here.
apps/web/config.js+36
This diff is too big to show here.
apps/web/config/base.json+14
This diff is too big to show here.
apps/web/config/cloud.json+22
This diff is too big to show here.
apps/web/config/development.json+16
This diff is too big to show here.
apps/web/config/qa.json+16
This diff is too big to show here.
apps/web/config/selfhosted.json+13
This diff is too big to show here.
apps/web/crowdin.yml+18
This diff is too big to show here.
apps/web/dev-server.shared.pem+45
This diff is too big to show here.
apps/web/entrypoint.sh+38
This diff is too big to show here.
apps/web/package.json+23
This diff is too big to show here.
apps/web/postcss.config.js+4
This diff is too big to show here.
apps/web/scripts/optimize.js+21
This diff is too big to show here.
apps/web/src/.nojekyll
This diff is too big to show here.
apps/web/src/404.html+52
This diff is too big to show here.
apps/web/src/404/bootstrap.min.css+7
This diff is too big to show here.
apps/web/src/404/styles.css+151
This diff is too big to show here.
apps/web/src/abstractions/state.service.ts+9
This diff is too big to show here.
apps/web/src/app-id.json+15
This diff is too big to show here.
apps/web/src/app/accounts/accept-emergency.component.html+45
This diff is too big to show here.
apps/web/src/app/accounts/accept-emergency.component.ts+55
This diff is too big to show here.
apps/web/src/app/accounts/accept-organization.component.html+46
This diff is too big to show here.
apps/web/src/app/accounts/accept-organization.component.ts+118
This diff is too big to show here.
apps/web/src/app/accounts/hint.component.html+44
This diff is too big to show here.
apps/web/src/app/accounts/hint.component.ts+24
This diff is too big to show here.
apps/web/src/app/accounts/lock.component.html+66
This diff is too big to show here.
apps/web/src/app/accounts/lock.component.ts+64
This diff is too big to show here.
apps/web/src/app/accounts/login.component.html+102
This diff is too big to show here.
apps/web/src/app/accounts/login.component.ts+179
This diff is too big to show here.
apps/web/src/app/accounts/recover-delete.component.html+44
This diff is too big to show here.
apps/web/src/app/accounts/recover-delete.component.ts+42
This diff is too big to show here.
apps/web/src/app/accounts/recover-two-factor.component.html+76
This diff is too big to show here.
apps/web/src/app/accounts/recover-two-factor.component.ts+51
This diff is too big to show here.
apps/web/src/app/accounts/register.component.html+209
This diff is too big to show here.
apps/web/src/app/accounts/register.component.ts+136
This diff is too big to show here.
apps/web/src/app/accounts/remove-password.component.html+55
This diff is too big to show here.
apps/web/src/app/accounts/remove-password.component.ts+9
This diff is too big to show here.
apps/web/src/app/accounts/set-password.component.html+117
This diff is too big to show here.
apps/web/src/app/accounts/set-password.component.ts+47
This diff is too big to show here.
apps/web/src/app/accounts/sso.component.html+52
This diff is too big to show here.
apps/web/src/app/accounts/sso.component.ts+72
This diff is too big to show here.
apps/web/src/app/accounts/two-factor-options.component.html+68
This diff is too big to show here.
apps/web/src/app/accounts/two-factor-options.component.ts+22
This diff is too big to show here.
apps/web/src/app/accounts/two-factor.component.html+155
This diff is too big to show here.
apps/web/src/app/accounts/two-factor.component.ts+90
This diff is too big to show here.
apps/web/src/app/accounts/update-password.component.html+90
This diff is too big to show here.
apps/web/src/app/accounts/update-password.component.ts+48
This diff is too big to show here.
apps/web/src/app/accounts/update-temp-password.component.html+105
This diff is too big to show here.
apps/web/src/app/accounts/update-temp-password.component.ts+45
This diff is too big to show here.
apps/web/src/app/accounts/verify-email-token.component.html+13
This diff is too big to show here.
apps/web/src/app/accounts/verify-email-token.component.ts+48
This diff is too big to show here.
apps/web/src/app/accounts/verify-recover-delete.component.html+34
This diff is too big to show here.
apps/web/src/app/accounts/verify-recover-delete.component.ts+58
This diff is too big to show here.
apps/web/src/app/app.component.html+1
This diff is too big to show here.
apps/web/src/app/app.component.ts+323
This diff is too big to show here.
apps/web/src/app/app.module.ts+29
This diff is too big to show here.
apps/web/src/app/common/base.accept.component.ts+63
This diff is too big to show here.
apps/web/src/app/common/base.events.component.ts+184
This diff is too big to show here.
apps/web/src/app/common/base.people.component.ts+413
This diff is too big to show here.
apps/web/src/app/components/nested-checkbox.component.html+30
This diff is too big to show here.
apps/web/src/app/components/nested-checkbox.component.ts+32
This diff is too big to show here.
apps/web/src/app/components/organization-switcher.component.html+68
This diff is too big to show here.
apps/web/src/app/components/organization-switcher.component.ts+34
This diff is too big to show here.
apps/web/src/app/components/password-reprompt.component.html+53
This diff is too big to show here.
apps/web/src/app/components/password-reprompt.component.ts+8
This diff is too big to show here.
apps/web/src/app/components/password-strength.component.html+14
This diff is too big to show here.
apps/web/src/app/components/password-strength.component.ts+40
This diff is too big to show here.
apps/web/src/app/components/premium-badge.component.ts+19
This diff is too big to show here.
apps/web/src/app/components/premium-badge.stories.ts+61
This diff is too big to show here.
apps/web/src/app/guards/home.guard.ts+22
This diff is too big to show here.
apps/web/src/app/layouts/footer.component.html+9
This diff is too big to show here.
apps/web/src/app/layouts/footer.component.ts+19
This diff is too big to show here.
apps/web/src/app/layouts/frontend-layout.component.html+5
This diff is too big to show here.
apps/web/src/app/layouts/frontend-layout.component.ts+24
This diff is too big to show here.
apps/web/src/app/layouts/navbar.component.html+94
This diff is too big to show here.
apps/web/src/app/layouts/navbar.component.ts+84
This diff is too big to show here.
apps/web/src/app/layouts/user-layout.component.html+3
This diff is too big to show here.
apps/web/src/app/layouts/user-layout.component.ts+11
This diff is too big to show here.
apps/web/src/app/main.ts+17
This diff is too big to show here.
apps/web/src/app/modules/loose-components.module.ts+484
This diff is too big to show here.
apps/web/src/app/modules/organizations/create/organization-create.module.ts+12
This diff is too big to show here.
apps/web/src/app/modules/organizations/create/organization-information.component.html+38
This diff is too big to show here.
apps/web/src/app/modules/organizations/create/organization-information.component.ts+15
This diff is too big to show here.
apps/web/src/app/modules/organizations/manage/entity-users.component.html+180
This diff is too big to show here.
apps/web/src/app/modules/organizations/manage/entity-users.component.ts+156
This diff is too big to show here.
apps/web/src/app/modules/organizations/manage/organization-manage.module.ts+13
This diff is too big to show here.
apps/web/src/app/modules/organizations/users/enroll-master-password-reset.component.html+52
This diff is too big to show here.
apps/web/src/app/modules/organizations/users/enroll-master-password-reset.component.ts+82
This diff is too big to show here.
apps/web/src/app/modules/organizations/users/organization-user.module.ts+14
This diff is too big to show here.
apps/web/src/app/modules/pipes/get-organization-name.pipe.ts+14
This diff is too big to show here.
apps/web/src/app/modules/pipes/pipes.module.ts+10
This diff is too big to show here.
apps/web/src/app/modules/register-form/register-form.component.html+124
This diff is too big to show here.
apps/web/src/app/modules/register-form/register-form.component.ts+87
This diff is too big to show here.
apps/web/src/app/modules/register-form/register-form.module.ts+12
This diff is too big to show here.
apps/web/src/app/modules/shared.module.ts+168
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/billing.component.html+48
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/billing.component.ts+68
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/confirmation-details.component.html+17
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/confirmation-details.component.ts+10
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/enterprise-content.component.html+11
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/enterprise-content.component.ts+7
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/families-content.component.html+13
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/families-content.component.ts+7
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/teams-content.component.html+10
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/teams-content.component.ts+7
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/trial-initiation.component.html+94
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/trial-initiation.component.ts+145
This diff is too big to show here.
apps/web/src/app/modules/trial-initiation/trial-initiation.module.ts+39
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/collection-filter.component.html+74
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/collection-filter.component.ts+9
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/folder-filter.component.html+82
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/folder-filter.component.ts+9
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/link-sso.component.html+4
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/link-sso.component.ts+59
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/organization-filter.component.html+161
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/organization-filter.component.ts+34
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/organization-options.component.html+47
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/organization-options.component.ts+145
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/status-filter.component.html+33
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/status-filter.component.ts+9
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/type-filter.component.html+60
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/components/type-filter.component.ts+9
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/organization-vault-filter.component.ts+28
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/vault-filter.component.html+79
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/vault-filter.component.ts+33
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/vault-filter.module.ts+32
This diff is too big to show here.
apps/web/src/app/modules/vault-filter/vault-filter.service.ts+85
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/individual-vault/individual-vault-routing.module.ts+16
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/individual-vault/individual-vault.component.html+121
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/individual-vault/individual-vault.component.ts+393
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/individual-vault/individual-vault.module.ts+13
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-badge/organization-badge.module.ts+12
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-badge/organization-name-badge.component.html+9
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-badge/organization-name-badge.component.ts+59
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-vault/organization-vault-routing.module.ts+16
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-vault/organization-vault.component.html+67
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-vault/organization-vault.component.ts+330
This diff is too big to show here.
apps/web/src/app/modules/vault/modules/organization-vault/organization-vault.module.ts+13
This diff is too big to show here.
apps/web/src/app/modules/vault/vault.module.ts+19
This diff is too big to show here.
apps/web/src/app/modules/vault/vault.service.ts+29
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-step-content.component.html+45
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-step-content.component.ts+20
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-step.component.html+8
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-step.component.ts+12
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.html+22
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-stepper.component.ts+29
This diff is too big to show here.
apps/web/src/app/modules/vertical-stepper/vertical-stepper.module.ts+14
This diff is too big to show here.
apps/web/src/app/organizations/guards/permissions.guard.ts+60
This diff is too big to show here.
apps/web/src/app/organizations/layouts/organization-layout.component.html+39
This diff is too big to show here.
apps/web/src/app/organizations/layouts/organization-layout.component.ts+98
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-confirm.component.html+132
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-confirm.component.ts+106
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.html+102
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-deactivate.component.ts+66
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-remove.component.html+102
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-remove.component.ts+50
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-status.component.html+59
This diff is too big to show here.
apps/web/src/app/organizations/manage/bulk/bulk-status.component.ts+26
This diff is too big to show here.
apps/web/src/app/organizations/manage/collection-add-edit.component.html+162
This diff is too big to show here.
apps/web/src/app/organizations/manage/collection-add-edit.component.ts+180
This diff is too big to show here.
apps/web/src/app/organizations/manage/collections.component.html+96
This diff is too big to show here.
apps/web/src/app/organizations/manage/collections.component.ts+247
This diff is too big to show here.
apps/web/src/app/organizations/manage/entity-events.component.html+118
This diff is too big to show here.
apps/web/src/app/organizations/manage/entity-events.component.ts+154
This diff is too big to show here.
apps/web/src/app/organizations/manage/events.component.html+107
This diff is too big to show here.
apps/web/src/app/organizations/manage/events.component.ts+127
This diff is too big to show here.
apps/web/src/app/organizations/manage/group-add-edit.component.html+186
This diff is too big to show here.
apps/web/src/app/organizations/manage/group-add-edit.component.ts+152
This diff is too big to show here.
apps/web/src/app/organizations/manage/groups.component.html+77
This diff is too big to show here.
apps/web/src/app/organizations/manage/groups.component.ts+182
This diff is too big to show here.
apps/web/src/app/organizations/manage/manage.component.html+70
This diff is too big to show here.
apps/web/src/app/organizations/manage/manage.component.ts+38
This diff is too big to show here.
apps/web/src/app/organizations/manage/people.component.html+293
This diff is too big to show here.
apps/web/src/app/organizations/manage/people.component.ts+465
This diff is too big to show here.
apps/web/src/app/organizations/manage/policies.component.html+25
This diff is too big to show here.
apps/web/src/app/organizations/manage/policies.component.ts+100
This diff is too big to show here.
apps/web/src/app/organizations/manage/policy-edit.component.html+49
This diff is too big to show here.
apps/web/src/app/organizations/manage/policy-edit.component.ts+100
This diff is too big to show here.
apps/web/src/app/organizations/manage/reset-password.component.html+97
This diff is too big to show here.
apps/web/src/app/organizations/manage/reset-password.component.ts+217
This diff is too big to show here.
apps/web/src/app/organizations/manage/user-add-edit.component.html+438
This diff is too big to show here.
apps/web/src/app/organizations/manage/user-add-edit.component.ts+304
This diff is too big to show here.
apps/web/src/app/organizations/manage/user-confirm.component.html+52
This diff is too big to show here.
apps/web/src/app/organizations/manage/user-confirm.component.ts+56
This diff is too big to show here.
apps/web/src/app/organizations/manage/user-groups.component.html+60
This diff is too big to show here.
apps/web/src/app/organizations/manage/user-groups.component.ts+90
This diff is too big to show here.
apps/web/src/app/organizations/organization-routing.module.ts+209
This diff is too big to show here.
apps/web/src/app/organizations/policies/base-policy.component.ts+56
This diff is too big to show here.
apps/web/src/app/organizations/policies/disable-send.component.html+16
This diff is too big to show here.
apps/web/src/app/organizations/policies/disable-send.component.ts+18
This diff is too big to show here.
apps/web/src/app/organizations/policies/master-password.component.html+83
This diff is too big to show here.
apps/web/src/app/organizations/policies/master-password.component.ts+56
This diff is too big to show here.
apps/web/src/app/organizations/policies/password-generator.component.html+144
This diff is too big to show here.
apps/web/src/app/organizations/policies/password-generator.component.ts+46
This diff is too big to show here.
apps/web/src/app/organizations/policies/personal-ownership.component.html+16
This diff is too big to show here.
apps/web/src/app/organizations/policies/personal-ownership.component.ts+18
This diff is too big to show here.
apps/web/src/app/organizations/policies/require-sso.component.html+19
This diff is too big to show here.
apps/web/src/app/organizations/policies/require-sso.component.ts+38
This diff is too big to show here.
apps/web/src/app/organizations/policies/reset-password.component.html+40
This diff is too big to show here.
apps/web/src/app/organizations/policies/reset-password.component.ts+42
This diff is too big to show here.
apps/web/src/app/organizations/policies/send-options.component.html+30
This diff is too big to show here.
apps/web/src/app/organizations/policies/send-options.component.ts+27
This diff is too big to show here.
apps/web/src/app/organizations/policies/single-org.component.html+16
This diff is too big to show here.
apps/web/src/app/organizations/policies/single-org.component.ts+42
This diff is too big to show here.
apps/web/src/app/organizations/policies/two-factor-authentication.component.html+16
This diff is too big to show here.
apps/web/src/app/organizations/policies/two-factor-authentication.component.ts+18
This diff is too big to show here.
apps/web/src/app/organizations/services/navigation-permissions.service.ts+50
This diff is too big to show here.
apps/web/src/app/organizations/settings/account.component.html+132
This diff is too big to show here.
apps/web/src/app/organizations/settings/account.component.ts+158
This diff is too big to show here.
apps/web/src/app/organizations/settings/adjust-subscription.component.html+65
This diff is too big to show here.
apps/web/src/app/organizations/settings/adjust-subscription.component.ts+74
This diff is too big to show here.
apps/web/src/app/organizations/settings/billing-sync-api-key.component.html+117
This diff is too big to show here.
apps/web/src/app/organizations/settings/billing-sync-api-key.component.ts+108
This diff is too big to show here.
apps/web/src/app/organizations/settings/change-plan.component.html+18
This diff is too big to show here.
apps/web/src/app/organizations/settings/change-plan.component.ts+33
This diff is too big to show here.
apps/web/src/app/organizations/settings/delete-organization.component.html+61
This diff is too big to show here.
apps/web/src/app/organizations/settings/delete-organization.component.ts+131
This diff is too big to show here.
apps/web/src/app/organizations/settings/download-license.component.html+39
This diff is too big to show here.
apps/web/src/app/organizations/settings/download-license.component.ts+50
This diff is too big to show here.
apps/web/src/app/organizations/settings/image-subscription-hidden.component.svg+20
This diff is too big to show here.
apps/web/src/app/organizations/settings/image-subscription-hidden.component.ts+8
This diff is too big to show here.
apps/web/src/app/organizations/settings/organization-billing.component.html+212
This diff is too big to show here.
apps/web/src/app/organizations/settings/organization-billing.component.ts+154
This diff is too big to show here.
apps/web/src/app/organizations/settings/organization-subscription.component.html+313
This diff is too big to show here.
apps/web/src/app/organizations/settings/organization-subscription.component.ts+380
This diff is too big to show here.
apps/web/src/app/organizations/settings/settings.component.html+36
This diff is too big to show here.
apps/web/src/app/organizations/settings/settings.component.ts+28
This diff is too big to show here.
apps/web/src/app/organizations/settings/two-factor-setup.component.ts+75
This diff is too big to show here.
apps/web/src/app/organizations/sponsorships/accept-family-sponsorship.component.html+13
This diff is too big to show here.
apps/web/src/app/organizations/sponsorships/accept-family-sponsorship.component.ts+27
This diff is too big to show here.
apps/web/src/app/organizations/sponsorships/families-for-enterprise-setup.component.html+51
This diff is too big to show here.
apps/web/src/app/organizations/sponsorships/families-for-enterprise-setup.component.ts+147
This diff is too big to show here.
apps/web/src/app/organizations/tools/exposed-passwords-report.component.ts+58
This diff is too big to show here.
apps/web/src/app/organizations/tools/import-export/org-export.component.ts+72
This diff is too big to show here.
apps/web/src/app/organizations/tools/import-export/org-import-export-routing.module.ts+35
This diff is too big to show here.
apps/web/src/app/organizations/tools/import-export/org-import-export.module.ts+48
This diff is too big to show here.
apps/web/src/app/organizations/tools/import-export/org-import.component.ts+57
This diff is too big to show here.
apps/web/src/app/organizations/tools/inactive-two-factor-report.component.ts+50
This diff is too big to show here.
apps/web/src/app/organizations/tools/reused-passwords-report.component.ts+49
This diff is too big to show here.
apps/web/src/app/organizations/tools/tools.component.html+79
This diff is too big to show here.
apps/web/src/app/organizations/tools/tools.component.ts+36
This diff is too big to show here.
apps/web/src/app/organizations/tools/unsecured-websites-report.component.ts+41
This diff is too big to show here.
apps/web/src/app/organizations/tools/weak-passwords-report.component.ts+58
This diff is too big to show here.
apps/web/src/app/organizations/vault/add-edit.component.ts+131
This diff is too big to show here.
apps/web/src/app/organizations/vault/attachments.component.ts+80
This diff is too big to show here.
apps/web/src/app/organizations/vault/ciphers.component.ts+105
This diff is too big to show here.
apps/web/src/app/organizations/vault/collections.component.ts+65
This diff is too big to show here.
apps/web/src/app/oss-routing.module.ts+265
This diff is too big to show here.
apps/web/src/app/oss.module.ts+35
This diff is too big to show here.
apps/web/src/app/polyfills.ts+15
This diff is too big to show here.
apps/web/src/app/providers/providers.component.html+33
This diff is too big to show here.
apps/web/src/app/providers/providers.component.ts+30
This diff is too big to show here.
apps/web/src/app/reports/breach-report.component.html+63
This diff is too big to show here.
apps/web/src/app/reports/breach-report.component.ts+35
This diff is too big to show here.
apps/web/src/app/reports/cipher-report.component.ts+103
This diff is too big to show here.
apps/web/src/app/reports/exposed-passwords-report.component.html+62
This diff is too big to show here.
apps/web/src/app/reports/exposed-passwords-report.component.ts+75
This diff is too big to show here.
apps/web/src/app/reports/inactive-two-factor-report.component.html+78
This diff is too big to show here.
apps/web/src/app/reports/inactive-two-factor-report.component.ts+110
This diff is too big to show here.
apps/web/src/app/reports/report-card.component.html+25
This diff is too big to show here.
apps/web/src/app/reports/report-card.component.ts+166
This diff is too big to show here.
apps/web/src/app/reports/report-list.component.html+11
This diff is too big to show here.
apps/web/src/app/reports/report-list.component.ts+18
This diff is too big to show here.
apps/web/src/app/reports/reports-routing.module.ts+60
This diff is too big to show here.
apps/web/src/app/reports/reports.component.html+12
This diff is too big to show here.
apps/web/src/app/reports/reports.component.ts+25
This diff is too big to show here.
apps/web/src/app/reports/reused-passwords-report.component.html+77
This diff is too big to show here.
apps/web/src/app/reports/reused-passwords-report.component.ts+71
This diff is too big to show here.
apps/web/src/app/reports/unsecured-websites-report.component.html+67
This diff is too big to show here.
apps/web/src/app/reports/unsecured-websites-report.component.ts+48
This diff is too big to show here.
apps/web/src/app/reports/weak-passwords-report.component.html+77
This diff is too big to show here.
apps/web/src/app/reports/weak-passwords-report.component.ts+125
This diff is too big to show here.
apps/web/src/app/send/access.component.html+152
This diff is too big to show here.
apps/web/src/app/send/access.component.ts+185
This diff is too big to show here.
apps/web/src/app/send/add-edit.component.html+308
This diff is too big to show here.
apps/web/src/app/send/add-edit.component.ts+50
This diff is too big to show here.
apps/web/src/app/send/efflux-dates.component.html+191
This diff is too big to show here.
apps/web/src/app/send/efflux-dates.component.ts+22
This diff is too big to show here.
apps/web/src/app/send/send.component.html+201
This diff is too big to show here.
apps/web/src/app/send/send.component.ts+101
This diff is too big to show here.
apps/web/src/app/services/event.service.ts+573
This diff is too big to show here.
apps/web/src/app/services/init.service.ts+58
This diff is too big to show here.
apps/web/src/app/services/modal.service.ts+58
This diff is too big to show here.
apps/web/src/app/services/policy-list.service.ts+13
This diff is too big to show here.
apps/web/src/app/services/router.service.ts+56
This diff is too big to show here.
apps/web/src/app/services/services.module.ts+126
This diff is too big to show here.
apps/web/src/app/services/webFileDownload.service.ts+26
This diff is too big to show here.
apps/web/src/app/settings/account.component.html+32
This diff is too big to show here.
apps/web/src/app/settings/account.component.ts+48
This diff is too big to show here.
apps/web/src/app/settings/add-credit.component.html+80
This diff is too big to show here.
apps/web/src/app/settings/add-credit.component.ts+149
This diff is too big to show here.
apps/web/src/app/settings/adjust-payment.component.html+19
This diff is too big to show here.
apps/web/src/app/settings/adjust-payment.component.ts+83
This diff is too big to show here.
apps/web/src/app/settings/adjust-storage.component.html+43
This diff is too big to show here.
apps/web/src/app/settings/adjust-storage.component.ts+100
This diff is too big to show here.
apps/web/src/app/settings/api-key.component.html+72
This diff is too big to show here.
apps/web/src/app/settings/api-key.component.ts+46
This diff is too big to show here.
apps/web/src/app/settings/billing-sync-key.component.html+69
This diff is too big to show here.
apps/web/src/app/settings/billing-sync-key.component.ts+60
This diff is too big to show here.
apps/web/src/app/settings/change-email.component.html+65
This diff is too big to show here.
apps/web/src/app/settings/change-email.component.ts+102
This diff is too big to show here.
apps/web/src/app/settings/change-kdf.component.html+77
This diff is too big to show here.
apps/web/src/app/settings/change-kdf.component.ts+79
This diff is too big to show here.
apps/web/src/app/settings/change-password.component.html+104
This diff is too big to show here.
apps/web/src/app/settings/change-password.component.ts+284
This diff is too big to show here.
apps/web/src/app/settings/create-organization.component.html+11
This diff is too big to show here.
apps/web/src/app/settings/create-organization.component.ts+34
This diff is too big to show here.
apps/web/src/app/settings/deauthorize-sessions.component.html+38
This diff is too big to show here.
apps/web/src/app/settings/deauthorize-sessions.component.ts+44
This diff is too big to show here.
apps/web/src/app/settings/delete-account.component.html+38
This diff is too big to show here.
apps/web/src/app/settings/delete-account.component.ts+44
This diff is too big to show here.
apps/web/src/app/settings/domain-rules.component.html+108
This diff is too big to show here.
apps/web/src/app/settings/domain-rules.component.ts+87
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-add-edit.component.html+136
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-add-edit.component.ts+103
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-attachments.component.ts+52
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-confirm.component.html+52
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-confirm.component.ts+62
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-takeover.component.html+79
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-takeover.component.ts+111
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-view.component.html+72
This diff is too big to show here.
apps/web/src/app/settings/emergency-access-view.component.ts+102
This diff is too big to show here.
apps/web/src/app/settings/emergency-access.component.html+256
This diff is too big to show here.
apps/web/src/app/settings/emergency-access.component.ts+313
This diff is too big to show here.
apps/web/src/app/settings/emergency-add-edit.component.ts+73
This diff is too big to show here.
apps/web/src/app/settings/organization-plans.component.html+328
This diff is too big to show here.
apps/web/src/app/settings/organization-plans.component.ts+475
This diff is too big to show here.
apps/web/src/app/settings/payment-method.component.html+69
This diff is too big to show here.
apps/web/src/app/settings/payment-method.component.ts+107
This diff is too big to show here.
apps/web/src/app/settings/payment.component.html+163
This diff is too big to show here.
apps/web/src/app/settings/payment.component.ts+296
This diff is too big to show here.
apps/web/src/app/settings/preferences.component.html+145
This diff is too big to show here.
apps/web/src/app/settings/preferences.component.ts+136
This diff is too big to show here.
apps/web/src/app/settings/premium.component.html+124
This diff is too big to show here.
apps/web/src/app/settings/premium.component.ts+142
This diff is too big to show here.
apps/web/src/app/settings/profile.component.html+64
This diff is too big to show here.
apps/web/src/app/settings/profile.component.ts+55
This diff is too big to show here.
apps/web/src/app/settings/purge-vault.component.html+38
This diff is too big to show here.
apps/web/src/app/settings/purge-vault.component.ts+46
This diff is too big to show here.
apps/web/src/app/settings/security-keys.component.html+18
This diff is too big to show here.
apps/web/src/app/settings/security-keys.component.ts+61
This diff is too big to show here.
apps/web/src/app/settings/security-routing.module.ts+39
This diff is too big to show here.
apps/web/src/app/settings/security.component.html+22
This diff is too big to show here.
apps/web/src/app/settings/security.component.ts+17
This diff is too big to show here.
apps/web/src/app/settings/settings.component.html+45
This diff is too big to show here.
apps/web/src/app/settings/settings.component.ts+64
This diff is too big to show here.
apps/web/src/app/settings/sponsored-families.component.html+102
This diff is too big to show here.
apps/web/src/app/settings/sponsored-families.component.ts+123
This diff is too big to show here.
apps/web/src/app/settings/sponsoring-org-row.component.html+48
This diff is too big to show here.
apps/web/src/app/settings/sponsoring-org-row.component.ts+135
This diff is too big to show here.
apps/web/src/app/settings/subscription-routing.module.ts+45
This diff is too big to show here.
apps/web/src/app/settings/subscription.component.html+20
This diff is too big to show here.
apps/web/src/app/settings/subscription.component.ts+27
This diff is too big to show here.
apps/web/src/app/settings/tax-info.component.html+356
This diff is too big to show here.
apps/web/src/app/settings/tax-info.component.ts+171
This diff is too big to show here.
apps/web/src/app/settings/two-factor-authenticator.component.html+116
This diff is too big to show here.
apps/web/src/app/settings/two-factor-authenticator.component.ts+95
This diff is too big to show here.
apps/web/src/app/settings/two-factor-base.component.ts+90
This diff is too big to show here.
apps/web/src/app/settings/two-factor-duo.component.html+105
This diff is too big to show here.
apps/web/src/app/settings/two-factor-duo.component.ts+74
This diff is too big to show here.
apps/web/src/app/settings/two-factor-email.component.html+108
This diff is too big to show here.
apps/web/src/app/settings/two-factor-email.component.ts+84
This diff is too big to show here.
apps/web/src/app/settings/two-factor-recovery.component.html+46
This diff is too big to show here.
apps/web/src/app/settings/two-factor-recovery.component.ts+55
This diff is too big to show here.
apps/web/src/app/settings/two-factor-setup.component.html+92
This diff is too big to show here.
apps/web/src/app/settings/two-factor-setup.component.ts+240
This diff is too big to show here.
apps/web/src/app/settings/two-factor-verify.component.html+16
This diff is too big to show here.
apps/web/src/app/settings/two-factor-verify.component.ts+87
This diff is too big to show here.
apps/web/src/app/settings/two-factor-webauthn.component.html+160
This diff is too big to show here.
apps/web/src/app/settings/two-factor-webauthn.component.ts+171
This diff is too big to show here.
apps/web/src/app/settings/two-factor-yubikey.component.html+125
This diff is too big to show here.
apps/web/src/app/settings/two-factor-yubikey.component.ts+89
This diff is too big to show here.
apps/web/src/app/settings/update-key.component.html+55
This diff is too big to show here.
apps/web/src/app/settings/update-key.component.ts+105
This diff is too big to show here.
apps/web/src/app/settings/update-license.component.html+20
This diff is too big to show here.
apps/web/src/app/settings/update-license.component.ts+64
This diff is too big to show here.
apps/web/src/app/settings/user-billing-history.component.html+98
This diff is too big to show here.
apps/web/src/app/settings/user-billing-history.component.ts+53
This diff is too big to show here.
apps/web/src/app/settings/user-subscription.component.html+197
This diff is too big to show here.
apps/web/src/app/settings/user-subscription.component.ts+217
This diff is too big to show here.
apps/web/src/app/settings/vault-timeout-input.component.html+49
This diff is too big to show here.
apps/web/src/app/settings/vault-timeout-input.component.ts+22
This diff is too big to show here.
apps/web/src/app/settings/verify-email.component.html+21
This diff is too big to show here.
apps/web/src/app/settings/verify-email.component.ts+39
This diff is too big to show here.
apps/web/src/app/tools/generator.component.html+400
This diff is too big to show here.
apps/web/src/app/tools/generator.component.ts+67
This diff is too big to show here.
apps/web/src/app/tools/import-export/export.component.html+42
This diff is too big to show here.
apps/web/src/app/tools/import-export/export.component.ts+53
This diff is too big to show here.
apps/web/src/app/tools/import-export/import-export-routing.module.ts+23
This diff is too big to show here.
apps/web/src/app/tools/import-export/import-export.module.ts+48
This diff is too big to show here.
apps/web/src/app/tools/import-export/import.component.html+323
This diff is too big to show here.
apps/web/src/app/tools/import-export/import.component.ts+228
This diff is too big to show here.
apps/web/src/app/tools/password-generator-history.component.html+58
This diff is too big to show here.
apps/web/src/app/tools/password-generator-history.component.ts+20
This diff is too big to show here.
apps/web/src/app/tools/tools.component.html+23
This diff is too big to show here.
apps/web/src/app/tools/tools.component.ts+25
This diff is too big to show here.
apps/web/src/app/vault/add-edit-custom-fields.component.html+167
This diff is too big to show here.
apps/web/src/app/vault/add-edit-custom-fields.component.ts+18
This diff is too big to show here.
apps/web/src/app/vault/add-edit.component.html+853
This diff is too big to show here.
apps/web/src/app/vault/add-edit.component.ts+213
This diff is too big to show here.
apps/web/src/app/vault/attachments.component.html+116
This diff is too big to show here.
apps/web/src/app/vault/attachments.component.ts+53
This diff is too big to show here.
apps/web/src/app/vault/bulk-actions.component.html+55
This diff is too big to show here.
apps/web/src/app/vault/bulk-actions.component.ts+167
This diff is too big to show here.
apps/web/src/app/vault/bulk-delete.component.html+39
This diff is too big to show here.
apps/web/src/app/vault/bulk-delete.component.ts+62
This diff is too big to show here.
apps/web/src/app/vault/bulk-move.component.html+37
This diff is too big to show here.
apps/web/src/app/vault/bulk-move.component.ts+40
This diff is too big to show here.
apps/web/src/app/vault/bulk-restore.component.html+36
This diff is too big to show here.
apps/web/src/app/vault/bulk-restore.component.ts+29
This diff is too big to show here.
apps/web/src/app/vault/bulk-share.component.html+85
This diff is too big to show here.
apps/web/src/app/vault/bulk-share.component.ts+116
This diff is too big to show here.
apps/web/src/app/vault/ciphers.component.html+151
This diff is too big to show here.
apps/web/src/app/vault/ciphers.component.ts+306
This diff is too big to show here.
apps/web/src/app/vault/collections.component.html+63
This diff is too big to show here.
apps/web/src/app/vault/collections.component.ts+37
This diff is too big to show here.
apps/web/src/app/vault/folder-add-edit.component.html+68
This diff is too big to show here.
apps/web/src/app/vault/folder-add-edit.component.ts+24
This diff is too big to show here.
apps/web/src/app/vault/share.component.html+92
This diff is too big to show here.
apps/web/src/app/vault/share.component.ts+47
This diff is too big to show here.
apps/web/src/app/wildcard-routing.module.ts+10
This diff is too big to show here.
apps/web/src/browserconfig.xml+9
This diff is too big to show here.
apps/web/src/connectors/captcha-mobile.html+23
This diff is too big to show here.
apps/web/src/connectors/captcha-mobile.scss+1
This diff is too big to show here.
apps/web/src/connectors/captcha.html+17
This diff is too big to show here.
apps/web/src/connectors/captcha.scss+8
This diff is too big to show here.
apps/web/src/connectors/captcha.ts+144
This diff is too big to show here.
apps/web/src/connectors/common-webauthn.ts+71
This diff is too big to show here.
apps/web/src/connectors/common.ts+30
This diff is too big to show here.
apps/web/src/connectors/duo.html+13
This diff is too big to show here.
apps/web/src/connectors/duo.scss+18
This diff is too big to show here.
apps/web/src/connectors/duo.ts+47
This diff is too big to show here.
apps/web/src/connectors/sso.html+33
This diff is too big to show here.
apps/web/src/connectors/sso.scss+1
This diff is too big to show here.
apps/web/src/connectors/sso.ts+47
This diff is too big to show here.
apps/web/src/connectors/webauthn-fallback.html+39
This diff is too big to show here.
apps/web/src/connectors/webauthn-fallback.ts+164
This diff is too big to show here.
apps/web/src/connectors/webauthn-mobile.html+30
This diff is too big to show here.
apps/web/src/connectors/webauthn.html+18
This diff is too big to show here.
apps/web/src/connectors/webauthn.scss+5
This diff is too big to show here.
apps/web/src/connectors/webauthn.ts+200
This diff is too big to show here.
apps/web/src/favicon.ico
This diff is too big to show here.
apps/web/src/global.d.ts+2
This diff is too big to show here.
apps/web/src/images/404.png
This diff is too big to show here.
apps/web/src/images/bwi-globe.png
This diff is too big to show here.
apps/web/src/images/cards.png
This diff is too big to show here.
apps/web/src/images/icons/android-chrome-192x192.png
This diff is too big to show here.
apps/web/src/images/icons/android-chrome-512x512.png
This diff is too big to show here.
apps/web/src/images/icons/apple-touch-icon.png
This diff is too big to show here.
apps/web/src/images/icons/favicon-16x16.png
This diff is too big to show here.
apps/web/src/images/icons/favicon-32x32.png
This diff is too big to show here.
apps/web/src/images/icons/mstile-150x150.png
This diff is too big to show here.
apps/web/src/images/icons/safari-pinned-tab.svg+34
This diff is too big to show here.
apps/web/src/images/loading-white.svg+6
This diff is too big to show here.
apps/web/src/images/loading.svg+6
This diff is too big to show here.
apps/web/src/images/logo-dark@2x.png
This diff is too big to show here.
apps/web/src/images/logo-white@2x.png
This diff is too big to show here.
apps/web/src/images/register-layout/cnet-logo.svg+3
This diff is too big to show here.
apps/web/src/images/register-layout/forbes-logo.svg+4
This diff is too big to show here.
apps/web/src/images/register-layout/logo-horizontal-white.png
This diff is too big to show here.
apps/web/src/images/register-layout/logo-horizontal-white.svg+1
This diff is too big to show here.
apps/web/src/images/register-layout/usnews-360-badge.svg+1
This diff is too big to show here.
apps/web/src/images/register-layout/wired-logo.png
This diff is too big to show here.
apps/web/src/images/totp-countdown.png
This diff is too big to show here.
apps/web/src/images/two-factor/0.png
This diff is too big to show here.
apps/web/src/images/two-factor/1-w.png
This diff is too big to show here.
apps/web/src/images/two-factor/1.png
This diff is too big to show here.
apps/web/src/images/two-factor/2.png
This diff is too big to show here.
apps/web/src/images/two-factor/3.png
This diff is too big to show here.
apps/web/src/images/two-factor/4.png
This diff is too big to show here.
apps/web/src/images/two-factor/6.png
This diff is too big to show here.
apps/web/src/images/two-factor/7-w.png
This diff is too big to show here.
apps/web/src/images/two-factor/7.png
This diff is too big to show here.
apps/web/src/images/two-factor/rc-w.png
This diff is too big to show here.
apps/web/src/images/two-factor/rc.png
This diff is too big to show here.
apps/web/src/images/u2fkey-mobile.avif
This diff is too big to show here.
apps/web/src/images/u2fkey-mobile.jpg
This diff is too big to show here.
apps/web/src/images/u2fkey-mobile.webp
This diff is too big to show here.
apps/web/src/images/u2fkey.avif
This diff is too big to show here.
apps/web/src/images/u2fkey.jpg
This diff is too big to show here.
apps/web/src/images/u2fkey.webp
This diff is too big to show here.
apps/web/src/images/yubikey.avif
This diff is too big to show here.
apps/web/src/images/yubikey.jpg
This diff is too big to show here.
apps/web/src/images/yubikey.webp
This diff is too big to show here.
apps/web/src/index.html+32
This diff is too big to show here.
apps/web/src/locales/af/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ar/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/az/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/be/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/bg/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/bn/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/bs/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ca/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/cs/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/da/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/de/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/el/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/en/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/en_GB/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/en_IN/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/eo/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/es/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/et/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/eu/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/fi/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/fil/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/fr/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/he/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/hi/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/hr/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/hu/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/id/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/it/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ja/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ka/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/km/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/kn/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ko/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/lv/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ml/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/nb/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/nl/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/nn/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/pl/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/pt_BR/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/pt_PT/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ro/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/ru/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/si/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/sk/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/sl/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/sr/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/sr_CS/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/sr_CY/messages.json+5073
This diff is too big to show here.
apps/web/src/locales/sv/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/tr/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/uk/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/vi/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/zh_CN/messages.json+5310
This diff is too big to show here.
apps/web/src/locales/zh_TW/messages.json+5310
This diff is too big to show here.
apps/web/src/manifest.json+17
This diff is too big to show here.
apps/web/src/models/account.ts+20
This diff is too big to show here.
apps/web/src/models/globalState.ts+7
This diff is too big to show here.
apps/web/src/scss/base.scss+307
This diff is too big to show here.
apps/web/src/scss/buttons.scss+204
This diff is too big to show here.
apps/web/src/scss/callouts.scss+83
This diff is too big to show here.
apps/web/src/scss/cards.scss+98
This diff is too big to show here.
apps/web/src/scss/export.module.scss+8
This diff is too big to show here.
apps/web/src/scss/export.module.scss.d.ts+9
This diff is too big to show here.
apps/web/src/scss/forms.scss+256
This diff is too big to show here.
apps/web/src/scss/modals.scss+162
This diff is too big to show here.
apps/web/src/scss/navigation.scss+104
This diff is too big to show here.
apps/web/src/scss/pages.scss+230
This diff is too big to show here.
apps/web/src/scss/plugins.scss+227
This diff is too big to show here.
apps/web/src/scss/styles.scss+59
This diff is too big to show here.
apps/web/src/scss/tables.scss+137
This diff is too big to show here.
apps/web/src/scss/tailwind.css+5
This diff is too big to show here.
apps/web/src/scss/toasts.scss+117
This diff is too big to show here.
apps/web/src/scss/variables.scss+357
This diff is too big to show here.
apps/web/src/scss/vault-filters.scss+196
This diff is too big to show here.
apps/web/src/services/broadcasterMessaging.service.ts+14
This diff is too big to show here.
apps/web/src/services/htmlStorage.service.ts+70
This diff is too big to show here.
apps/web/src/services/i18n.service.ts+72
This diff is too big to show here.
apps/web/src/services/passwordReprompt.service.ts+10
This diff is too big to show here.
apps/web/src/services/state.service.ts+102
This diff is too big to show here.
apps/web/src/services/stateMigration.service.ts+13
This diff is too big to show here.
apps/web/src/services/webPlatformUtils.service.ts+254
This diff is too big to show here.
apps/web/src/theme.js+24
This diff is too big to show here.
apps/web/src/utils/flags.ts+20
This diff is too big to show here.
apps/web/src/version.json+1
This diff is too big to show here.
apps/web/tailwind.config.js+10
This diff is too big to show here.
apps/web/tsconfig.json+29
This diff is too big to show here.
apps/web/webpack.config.js+344
This diff is too big to show here.
bitwarden-browser.sln−38
This diff is too big to show here.
bitwarden_license/README.md+3
This diff is too big to show here.
bitwarden_license/bit-web/.vscode/settings.json+6
This diff is too big to show here.
bitwarden_license/bit-web/src/app/app-routing.module.ts+21
This diff is too big to show here.
bitwarden_license/bit-web/src/app/app.component.ts+21
This diff is too big to show here.
bitwarden_license/bit-web/src/app/app.module.ts+46
This diff is too big to show here.
bitwarden_license/bit-web/src/app/main.ts+17
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/base-cva.component.ts+68
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/input-checkbox.component.html+16
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/input-checkbox.component.ts+10
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/input-text-readonly.component.html+26
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/input-text-readonly.component.ts+25
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/input-text.component.html+33
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/input-text.component.ts+48
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/select.component.html+19
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/components/select.component.ts+14
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/manage/scim.component.html+87
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/manage/scim.component.ts+161
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/manage/sso.component.html+448
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/manage/sso.component.ts+318
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/organizations-routing.module.ts+55
This diff is too big to show here.
bitwarden_license/bit-web/src/app/organizations/organizations.module.ts+34
This diff is too big to show here.
bitwarden_license/bit-web/src/app/policies/disable-personal-vault-export.component.html+12
This diff is too big to show here.
bitwarden_license/bit-web/src/app/policies/disable-personal-vault-export.component.ts+21
This diff is too big to show here.
bitwarden_license/bit-web/src/app/policies/maximum-vault-timeout.component.html+47
This diff is too big to show here.
bitwarden_license/bit-web/src/app/policies/maximum-vault-timeout.component.ts+70
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/clients/add-organization.component.html+46
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/clients/add-organization.component.ts+84
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/clients/clients.component.html+90
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/clients/clients.component.ts+179
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/clients/create-organization.component.html+5
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/clients/create-organization.component.ts+23
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/guards/provider-type.guard.ts+26
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/guards/provider.guard.ts+31
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/accept-provider.component.html+46
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/accept-provider.component.ts+55
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/bulk/bulk-confirm.component.ts+34
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/bulk/bulk-remove.component.ts+22
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/events.component.html+107
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/events.component.ts+88
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/manage.component.html+30
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/manage.component.ts+23
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/people.component.html+231
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/people.component.ts+294
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/user-add-edit.component.html+124
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/manage/user-add-edit.component.ts+118
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/providers-layout.component.html+44
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/providers-layout.component.ts+49
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/providers-routing.module.ts+121
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/providers.module.ts+58
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/services/webProvider.service.ts+35
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/settings/account.component.html+52
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/settings/account.component.ts+63
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/settings/settings.component.html+17
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/settings/settings.component.ts+18
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/setup/setup-provider.component.html+35
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/setup/setup-provider.component.ts+23
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/setup/setup.component.html+39
This diff is too big to show here.
bitwarden_license/bit-web/src/app/providers/setup/setup.component.ts+97
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/layout/layout.component.html+8
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/layout/layout.component.ts+11
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/layout/navigation.component.html+13
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/layout/navigation.component.ts+7
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/secrets/secrets-routing.module.ts+17
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/secrets/secrets.component.html+1
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/secrets/secrets.component.ts+7
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/secrets/secrets.module.ts+12
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/sm-routing.module.ts+36
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/sm.guard.ts+13
This diff is too big to show here.
bitwarden_license/bit-web/src/app/sm/sm.module.ts+19
This diff is too big to show here.
bitwarden_license/bit-web/tsconfig.json+3
This diff is too big to show here.
bitwarden_license/bit-web/webpack.config.js+12
This diff is too big to show here.
clients.code-workspace+60
This diff is too big to show here.
gulpfile.js−222
This diff is too big to show here.
jest.config.js+21
This diff is too big to show here.
karma.conf.js−65
This diff is too big to show here.
libs/.vscode/settings.json+6
This diff is too big to show here.
libs/angular/jest.config.js+17
This diff is too big to show here.
libs/angular/package.json+20
This diff is too big to show here.
libs/angular/spec/test.setup.ts+28
This diff is too big to show here.
libs/angular/src/components/add-edit-custom-fields.component.ts+116
This diff is too big to show here.
libs/angular/src/components/add-edit.component.ts+579
This diff is too big to show here.
libs/angular/src/components/attachments.component.ts+294
This diff is too big to show here.
libs/angular/src/components/avatar.component.ts+140
This diff is too big to show here.
libs/angular/src/components/callout.component.html+35
This diff is too big to show here.
libs/angular/src/components/callout.component.ts+78
This diff is too big to show here.
libs/angular/src/components/captchaProtected.component.ts+53
This diff is too big to show here.
libs/angular/src/components/change-password.component.ts+195
This diff is too big to show here.
libs/angular/src/components/ciphers.component.ts+92
This diff is too big to show here.
libs/angular/src/components/collections.component.ts+92
This diff is too big to show here.
libs/angular/src/components/environment.component.ts+63
This diff is too big to show here.
libs/angular/src/components/export-scope-callout.component.html+5
This diff is too big to show here.
libs/angular/src/components/export-scope-callout.component.ts+43
This diff is too big to show here.
libs/angular/src/components/export.component.ts+161
This diff is too big to show here.
libs/angular/src/components/folder-add-edit.component.ts+98
This diff is too big to show here.
libs/angular/src/components/generator.component.ts+240
This diff is too big to show here.
libs/angular/src/components/hint.component.ts+55
This diff is too big to show here.
libs/angular/src/components/icon.component.html+11
This diff is too big to show here.
libs/angular/src/components/icon.component.ts+114
This diff is too big to show here.
libs/angular/src/components/lock.component.ts+277
This diff is too big to show here.
libs/angular/src/components/login.component.ts+192
This diff is too big to show here.
libs/angular/src/components/modal/dynamic-modal.component.ts+79
This diff is too big to show here.
libs/angular/src/components/modal/modal-injector.ts+10
This diff is too big to show here.
libs/angular/src/components/modal/modal.ref.ts+50
This diff is too big to show here.
libs/angular/src/components/password-generator-history.component.ts+37
This diff is too big to show here.
libs/angular/src/components/password-history.component.ts+39
This diff is too big to show here.
libs/angular/src/components/password-reprompt.component.ts+41
This diff is too big to show here.
libs/angular/src/components/premium.component.ts+61
This diff is too big to show here.
libs/angular/src/components/register.component.ts+307
This diff is too big to show here.
libs/angular/src/components/remove-password.component.ts+82
This diff is too big to show here.
libs/angular/src/components/send/add-edit.component.ts+293
This diff is too big to show here.
libs/angular/src/components/send/efflux-dates.component.ts+356
This diff is too big to show here.
libs/angular/src/components/send/send.component.ts+210
This diff is too big to show here.
libs/angular/src/components/set-password.component.ts+181
This diff is too big to show here.
libs/angular/src/components/set-pin.component.ts+54
This diff is too big to show here.
libs/angular/src/components/settings/vault-timeout-input.component.ts+156
This diff is too big to show here.
libs/angular/src/components/share.component.ts+116
This diff is too big to show here.
libs/angular/src/components/sso.component.ts+260
This diff is too big to show here.
libs/angular/src/components/toastr.component.ts+95
This diff is too big to show here.
libs/angular/src/components/two-factor-options.component.ts+36
This diff is too big to show here.
libs/angular/src/components/two-factor.component.ts+284
This diff is too big to show here.
libs/angular/src/components/update-password.component.ts+126
This diff is too big to show here.
libs/angular/src/components/update-temp-password.component.ts+132
This diff is too big to show here.
libs/angular/src/components/user-verification.component.html+46
This diff is too big to show here.
libs/angular/src/components/user-verification.component.ts+96
This diff is too big to show here.
libs/angular/src/components/view-custom-fields.component.ts+39
This diff is too big to show here.
libs/angular/src/components/view.component.ts+459
This diff is too big to show here.
libs/angular/src/directives/a11y-invalid.directive.ts+26
This diff is too big to show here.
libs/angular/src/directives/a11y-title.directive.ts+23
This diff is too big to show here.
libs/angular/src/directives/api-action.directive.ts+49
This diff is too big to show here.
libs/angular/src/directives/autofocus.directive.ts+27
This diff is too big to show here.
libs/angular/src/directives/blur-click.directive.ts+12
This diff is too big to show here.
libs/angular/src/directives/box-row.directive.ts+59
This diff is too big to show here.
libs/angular/src/directives/cipherListVirtualScroll.directive.ts+76
This diff is too big to show here.
libs/angular/src/directives/fallback-src.directive.ts+14
This diff is too big to show here.
libs/angular/src/directives/input-strip-spaces.directive.ts+12
This diff is too big to show here.
libs/angular/src/directives/input-verbatim.directive.ts+32
This diff is too big to show here.
libs/angular/src/directives/not-premium.directive.ts+27
This diff is too big to show here.
libs/angular/src/directives/premium.directive.ts+27
This diff is too big to show here.
libs/angular/src/directives/select-copy.directive.ts+37
This diff is too big to show here.
libs/angular/src/directives/stop-click.directive.ts+10
This diff is too big to show here.
libs/angular/src/directives/stop-prop.directive.ts+10
This diff is too big to show here.
libs/angular/src/directives/true-false-value.directive.ts+49
This diff is too big to show here.
libs/angular/src/guards/auth.guard.ts+42
This diff is too big to show here.
libs/angular/src/guards/lock.guard.ts+25
This diff is too big to show here.
libs/angular/src/guards/unauth.guard.ts+25
This diff is too big to show here.
libs/angular/src/images/cards/amex-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/amex-light.png
This diff is too big to show here.
libs/angular/src/images/cards/diners_club-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/diners_club-light.png
This diff is too big to show here.
libs/angular/src/images/cards/discover-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/discover-light.png
This diff is too big to show here.
libs/angular/src/images/cards/jcb-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/jcb-light.png
This diff is too big to show here.
libs/angular/src/images/cards/maestro-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/maestro-light.png
This diff is too big to show here.
libs/angular/src/images/cards/mastercard-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/mastercard-light.png
This diff is too big to show here.
libs/angular/src/images/cards/mir-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/mir-light.png
This diff is too big to show here.
libs/angular/src/images/cards/ru_pay-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/ru_pay-light.png
This diff is too big to show here.
libs/angular/src/images/cards/union_pay-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/union_pay-light.png
This diff is too big to show here.
libs/angular/src/images/cards/visa-dark.png
This diff is too big to show here.
libs/angular/src/images/cards/visa-light.png
This diff is too big to show here.
libs/angular/src/interfaces/selectOptions.ts+5
This diff is too big to show here.
libs/angular/src/jslib.module.ts+103
This diff is too big to show here.
libs/angular/src/modules/vault-filter/components/collection-filter.component.ts+52
This diff is too big to show here.
libs/angular/src/modules/vault-filter/components/folder-filter.component.ts+58
This diff is too big to show here.
libs/angular/src/modules/vault-filter/components/organization-filter.component.ts+78
This diff is too big to show here.
libs/angular/src/modules/vault-filter/components/status-filter.component.ts+22
This diff is too big to show here.
libs/angular/src/modules/vault-filter/components/type-filter.component.ts+40
This diff is too big to show here.
libs/angular/src/modules/vault-filter/models/cipher-status.model.ts+1
This diff is too big to show here.
libs/angular/src/modules/vault-filter/models/display-mode.ts+6
This diff is too big to show here.
libs/angular/src/modules/vault-filter/models/dynamic-tree-node.model.ts+16
This diff is too big to show here.
libs/angular/src/modules/vault-filter/models/top-level-tree-node.model.ts+7
This diff is too big to show here.
libs/angular/src/modules/vault-filter/models/vault-filter.model.spec.ts+237
This diff is too big to show here.
libs/angular/src/modules/vault-filter/models/vault-filter.model.ts+74
This diff is too big to show here.
libs/angular/src/modules/vault-filter/vault-filter.component.ts+128
This diff is too big to show here.
libs/angular/src/modules/vault-filter/vault-filter.service.ts+111
This diff is too big to show here.
libs/angular/src/pipes/color-password-count.pipe.ts+19
This diff is too big to show here.
libs/angular/src/pipes/color-password.pipe.ts+61
This diff is too big to show here.
libs/angular/src/pipes/credit-card-number.pipe.ts+70
This diff is too big to show here.
libs/angular/src/pipes/ellipsis.pipe.ts+17
This diff is too big to show here.
libs/angular/src/pipes/i18n.pipe.ts+14
This diff is too big to show here.
libs/angular/src/pipes/search-ciphers.pipe.ts+41
This diff is too big to show here.
libs/angular/src/pipes/search.pipe.ts+48
This diff is too big to show here.
libs/angular/src/pipes/user-name.pipe.ts+19
This diff is too big to show here.
libs/angular/src/scss/bwicons/fonts/bwi-font.svg+178
This diff is too big to show here.
libs/angular/src/scss/bwicons/fonts/bwi-font.ttf
This diff is too big to show here.
libs/angular/src/scss/bwicons/fonts/bwi-font.woff
This diff is too big to show here.
libs/angular/src/scss/bwicons/fonts/bwi-font.woff2
This diff is too big to show here.
libs/angular/src/scss/bwicons/styles/style.scss+255
This diff is too big to show here.
libs/angular/src/scss/icons.scss+48
This diff is too big to show here.
libs/angular/src/scss/webfonts.css+89
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-italic-300.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-italic-400.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-italic-600.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-italic-700.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-italic-800.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-normal-300.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-normal-400.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-normal-600.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-normal-700.woff
This diff is too big to show here.
libs/angular/src/scss/webfonts/Open_Sans-normal-800.woff
This diff is too big to show here.
libs/angular/src/services/broadcaster.service.ts+6
This diff is too big to show here.
libs/angular/src/services/jslib-services.module.ts+469
This diff is too big to show here.
libs/angular/src/services/modal.service.ts+180
This diff is too big to show here.
libs/angular/src/services/passwordReprompt.service.ts+45
This diff is too big to show here.
libs/angular/src/services/theming/theme.ts+6
This diff is too big to show here.
libs/angular/src/services/theming/themeBuilder.ts+19
This diff is too big to show here.
libs/angular/src/services/theming/theming.service.abstraction.ts+12
This diff is too big to show here.
libs/angular/src/services/theming/theming.service.ts+72
This diff is too big to show here.
libs/angular/src/services/validation.service.ts+38
This diff is too big to show here.
libs/angular/src/validators/dirty.validator.ts+9
This diff is too big to show here.
libs/angular/src/validators/inputsFieldMatch.validator.ts+57
This diff is too big to show here.
libs/angular/src/validators/notAllowedValueAsync.validator.ts+21
This diff is too big to show here.
libs/angular/tsconfig.json+5
This diff is too big to show here.
libs/angular/tsconfig.spec.json+3
This diff is too big to show here.
libs/common/jest.config.js+18
This diff is too big to show here.
libs/common/package.json+20
This diff is too big to show here.
libs/common/spec/domain/attachment.spec.ts+83
This diff is too big to show here.
libs/common/spec/domain/card.spec.ts+73
This diff is too big to show here.
libs/common/spec/domain/cipher.spec.ts+590
This diff is too big to show here.
libs/common/spec/domain/collection.spec.ts+66
This diff is too big to show here.
libs/common/spec/domain/encString.spec.ts+195
This diff is too big to show here.
libs/common/spec/domain/field.spec.ts+64
This diff is too big to show here.
libs/common/spec/domain/folder.spec.ts+41
This diff is too big to show here.
libs/common/spec/domain/identity.spec.ts+134
This diff is too big to show here.
libs/common/spec/domain/login.spec.ts+101
This diff is too big to show here.
libs/common/spec/domain/loginUri.spec.ts+57
This diff is too big to show here.
libs/common/spec/domain/password.spec.ts+51
This diff is too big to show here.
libs/common/spec/domain/secureNote.spec.ts+46
This diff is too big to show here.
libs/common/spec/domain/send.spec.ts+140
This diff is too big to show here.
libs/common/spec/domain/sendAccess.spec.ts+84
This diff is too big to show here.
libs/common/spec/domain/sendFile.spec.ts+57
This diff is too big to show here.
libs/common/spec/domain/sendText.spec.ts+47
This diff is too big to show here.
libs/common/spec/domain/symmetricCryptoKey.spec.ts+69
This diff is too big to show here.
libs/common/spec/importers/bitwardenJsonImporter.spec.ts+31
This diff is too big to show here.
libs/common/spec/importers/bitwardenPasswordProtectedImporter.spec.ts+113
This diff is too big to show here.
libs/common/spec/importers/dashlaneCsvImporter.spec.ts+367
This diff is too big to show here.
libs/common/spec/importers/firefoxCsvImporter.spec.ts+74
This diff is too big to show here.
libs/common/spec/importers/fsecureFskImporter.spec.ts+77
This diff is too big to show here.
libs/common/spec/importers/keepass2XmlImporter.spec.ts+189
This diff is too big to show here.
libs/common/spec/importers/keeperJsonImporter.spec.ts+108
This diff is too big to show here.
libs/common/spec/importers/lastpassCsvImporter.spec.ts+202
This diff is too big to show here.
libs/common/spec/importers/mykiCsvImporter.spec.ts+633
This diff is too big to show here.
libs/common/spec/importers/nordpassCsvImporter.spec.ts+181
This diff is too big to show here.
libs/common/spec/importers/onepassword1PifImporter.spec.ts+527
This diff is too big to show here.
libs/common/spec/importers/onepassword1PuxImporter.spec.ts+689
This diff is too big to show here.
libs/common/spec/importers/onepasswordMacCsvImporter.spec.ts+74
This diff is too big to show here.
libs/common/spec/importers/onepasswordWinCsvImporter.spec.ts+87
This diff is too big to show here.
libs/common/spec/importers/safariCsvImporter.spec.ts+74
This diff is too big to show here.
libs/common/spec/importers/testData/bitwardenJson/empty.json.ts+1
This diff is too big to show here.
libs/common/spec/importers/testData/bitwardenJson/passwordProtected.json.ts+9
This diff is too big to show here.
libs/common/spec/importers/testData/dashlaneCsv/credentials.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/dashlaneCsv/id.csv.ts+6
This diff is too big to show here.
libs/common/spec/importers/testData/dashlaneCsv/multiplePersonalInfo.csv.ts+7
This diff is too big to show here.
libs/common/spec/importers/testData/dashlaneCsv/payments.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/dashlaneCsv/personalInfo.csv.ts+6
This diff is too big to show here.
libs/common/spec/importers/testData/dashlaneCsv/securenotes.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/firefoxCsv/firefoxAccountsData.csv.ts+4
This diff is too big to show here.
libs/common/spec/importers/testData/firefoxCsv/simplePasswordData.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/keeperJson/testData.ts+90
This diff is too big to show here.
libs/common/spec/importers/testData/mykiCsv/UserAccount.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/mykiCsv/UserCreditCard.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/mykiCsv/UserIdCard.csv.ts+16
This diff is too big to show here.
libs/common/spec/importers/testData/mykiCsv/UserIdentity.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/mykiCsv/UserNote.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/mykiCsv/UserTwofa.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/nordpassCsv/nordpass.card.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/nordpassCsv/nordpass.identity.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/nordpassCsv/nordpass.login.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/nordpassCsv/nordpass.secureNote.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/APICredentials.ts+169
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/BankAccount.ts+224
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/CreditCard.ts+343
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Database.ts+201
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/DriversLicense.ts+233
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/EmailAccount.ts+341
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Emailfield.ts+91
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/EmailfieldOnIdentity.ts+87
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/EmailfieldOnIdentity_Prefilled.ts+103
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/IdentityData.ts+476
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/LoginData.ts+135
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/MedicalRecord.ts+198
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Membership.ts+186
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Onepux_example.ts+93
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/OutdoorLicense.ts+169
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Passport.ts+234
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Password.ts+58
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/RewardsProgram.ts+209
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/SSN.ts+89
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/SanitizedExport.ts+4519
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/SecureNote.ts+52
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/Server.ts+229
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/SoftwareLicense.ts+289
This diff is too big to show here.
libs/common/spec/importers/testData/onePassword1Pux/WirelessRouter.ts+182
This diff is too big to show here.
libs/common/spec/importers/testData/onePasswordCsv/creditCard.mac.csv.ts+4
This diff is too big to show here.
libs/common/spec/importers/testData/onePasswordCsv/creditCard.windows.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/onePasswordCsv/identity.mac.csv.ts+7
This diff is too big to show here.
libs/common/spec/importers/testData/onePasswordCsv/identity.windows.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/onePasswordCsv/multipleItems.mac.csv.ts+15
This diff is too big to show here.
libs/common/spec/importers/testData/onePasswordCsv/multipleItems.windows.csv.ts+5
This diff is too big to show here.
libs/common/spec/importers/testData/safariCsv/oldSimplePasswordData.csv.ts+2
This diff is too big to show here.
libs/common/spec/importers/testData/safariCsv/simplePasswordData.csv.ts+3
This diff is too big to show here.
libs/common/spec/importers/testData/safeInCloud/testData.xml.ts+63
This diff is too big to show here.
libs/common/spec/misc/logInStrategies/apiLogIn.strategy.spec.ts+114
This diff is too big to show here.
libs/common/spec/misc/logInStrategies/logIn.strategy.spec.ts+288
This diff is too big to show here.
libs/common/spec/misc/logInStrategies/passwordLogIn.strategy.spec.ts+110
This diff is too big to show here.
libs/common/spec/misc/logInStrategies/ssoLogIn.strategy.spec.ts+127
This diff is too big to show here.
libs/common/spec/misc/sequentialize.spec.ts+127
This diff is too big to show here.
libs/common/spec/misc/throttle.spec.ts+110
This diff is too big to show here.
libs/common/spec/misc/utils.spec.ts+73
This diff is too big to show here.
libs/common/spec/services/cipher.service.spec.ts+69
This diff is too big to show here.
libs/common/spec/services/consoleLog.service.spec.ts+102
This diff is too big to show here.
libs/common/spec/services/export.service.spec.ts+210
This diff is too big to show here.
libs/common/spec/services/folder.service.spec.ts+195
This diff is too big to show here.
libs/common/spec/services/import.service.spec.ts+72
This diff is too big to show here.
libs/common/spec/services/state.service.spec.ts+82
This diff is too big to show here.
libs/common/spec/services/stateMigration.service.spec.ts+130
This diff is too big to show here.
libs/common/spec/test.setup.ts+5
This diff is too big to show here.
libs/common/spec/utils.ts+37
This diff is too big to show here.
libs/common/spec/web/services/webCryptoFunction.service.spec.ts+558
This diff is too big to show here.
libs/common/src/abstractions/abstractEncrypt.service.ts+7
This diff is too big to show here.
libs/common/src/abstractions/api.service.ts+737
This diff is too big to show here.
libs/common/src/abstractions/appId.service.ts+4
This diff is too big to show here.
libs/common/src/abstractions/audit.service.ts+6
This diff is too big to show here.
libs/common/src/abstractions/auth.service.ts+27
This diff is too big to show here.
libs/common/src/abstractions/broadcaster.service.ts+5
This diff is too big to show here.
libs/common/src/abstractions/cipher.service.ts+79
This diff is too big to show here.
libs/common/src/abstractions/collection.service.ts+19
This diff is too big to show here.
libs/common/src/abstractions/crypto.service.ts+86
This diff is too big to show here.
libs/common/src/abstractions/cryptoFunction.service.ts+62
This diff is too big to show here.
libs/common/src/abstractions/environment.service.ts+36
This diff is too big to show here.
libs/common/src/abstractions/event.service.ts+7
This diff is too big to show here.
libs/common/src/abstractions/export.service.ts+11
This diff is too big to show here.
libs/common/src/abstractions/fileDownload/fileDownload.service.ts+5
This diff is too big to show here.
libs/common/src/abstractions/fileDownload/fileDownloadBuilder.ts+50
This diff is too big to show here.
libs/common/src/abstractions/fileDownload/fileDownloadRequest.ts+6
This diff is too big to show here.
libs/common/src/abstractions/fileUpload.service.ts+18
This diff is too big to show here.
libs/common/src/abstractions/folder/folder-api.service.abstraction.ts+8
This diff is too big to show here.
libs/common/src/abstractions/folder/folder.service.abstraction.ts+26
This diff is too big to show here.
libs/common/src/abstractions/formValidationErrors.service.ts+13
This diff is too big to show here.
libs/common/src/abstractions/i18n.service.ts+11
This diff is too big to show here.
libs/common/src/abstractions/import.service.ts+19
This diff is too big to show here.
libs/common/src/abstractions/keyConnector.service.ts+19
This diff is too big to show here.
libs/common/src/abstractions/log.service.ts+11
This diff is too big to show here.
libs/common/src/abstractions/messaging.service.ts+3
This diff is too big to show here.
libs/common/src/abstractions/notifications.service.ts+6
This diff is too big to show here.
libs/common/src/abstractions/organization.service.ts+11
This diff is too big to show here.
libs/common/src/abstractions/passwordGeneration.service.ts+20
This diff is too big to show here.
libs/common/src/abstractions/passwordReprompt.service.ts+5
This diff is too big to show here.
libs/common/src/abstractions/platformUtils.service.ts+45
This diff is too big to show here.
libs/common/src/abstractions/policy.service.ts+32
This diff is too big to show here.
libs/common/src/abstractions/provider.service.ts+8
This diff is too big to show here.
libs/common/src/abstractions/search.service.ts+16
This diff is too big to show here.
libs/common/src/abstractions/send.service.ts+25
This diff is too big to show here.
libs/common/src/abstractions/settings.service.ts+6
This diff is too big to show here.
libs/common/src/abstractions/state.service.ts+317
This diff is too big to show here.
libs/common/src/abstractions/stateMigration.service.ts+4
This diff is too big to show here.
libs/common/src/abstractions/storage.service.ts+8
This diff is too big to show here.
libs/common/src/abstractions/sync.service.ts+19
This diff is too big to show here.
libs/common/src/abstractions/system.service.ts+6
This diff is too big to show here.
libs/common/src/abstractions/token.service.ts+31
This diff is too big to show here.
libs/common/src/abstractions/totp.service.ts+4
This diff is too big to show here.
libs/common/src/abstractions/twoFactor.service.ts+23
This diff is too big to show here.
libs/common/src/abstractions/userVerification.service.ts+12
This diff is too big to show here.
libs/common/src/abstractions/usernameGeneration.service.ts+9
This diff is too big to show here.
libs/common/src/abstractions/vaultTimeout.service.ts+10
This diff is too big to show here.
libs/common/src/enums/authenticationStatus.ts+5
This diff is too big to show here.
libs/common/src/enums/authenticationType.ts+5
This diff is too big to show here.
libs/common/src/enums/cipherRepromptType.ts+4
This diff is too big to show here.
libs/common/src/enums/cipherType.ts+6
This diff is too big to show here.
libs/common/src/enums/clientType.ts+8
This diff is too big to show here.
libs/common/src/enums/deviceType.ts+23
This diff is too big to show here.
libs/common/src/enums/emergencyAccessStatusType.ts+7
This diff is too big to show here.
libs/common/src/enums/emergencyAccessType.ts+4
This diff is too big to show here.
libs/common/src/enums/encryptionType.ts+9
This diff is too big to show here.
libs/common/src/enums/eventType.ts+75
This diff is too big to show here.
libs/common/src/enums/fieldType.ts+6
This diff is too big to show here.
libs/common/src/enums/fileUploadType.ts+4
This diff is too big to show here.
libs/common/src/enums/hashPurpose.ts+4
This diff is too big to show here.
libs/common/src/enums/htmlStorageLocation.ts+5
This diff is too big to show here.
libs/common/src/enums/importOptions.ts+74
This diff is too big to show here.
libs/common/src/enums/kdfType.ts+7
This diff is too big to show here.
libs/common/src/enums/keySuffixOptions.ts+4
This diff is too big to show here.
libs/common/src/enums/linkedIdType.ts+40
This diff is too big to show here.
libs/common/src/enums/logLevelType.ts+6
This diff is too big to show here.
libs/common/src/enums/notificationType.ts+20
This diff is too big to show here.
libs/common/src/enums/organizationApiKeyType.ts+5
This diff is too big to show here.
libs/common/src/enums/organizationConnectionType.ts+4
This diff is too big to show here.
libs/common/src/enums/organizationUserStatusType.ts+6
This diff is too big to show here.
libs/common/src/enums/organizationUserType.ts+7
This diff is too big to show here.
libs/common/src/enums/paymentMethodType.ts+11
This diff is too big to show here.
libs/common/src/enums/permissions.ts+29
This diff is too big to show here.
libs/common/src/enums/planSponsorshipType.ts+3
This diff is too big to show here.
libs/common/src/enums/planType.ts+14
This diff is too big to show here.
libs/common/src/enums/policyType.ts+13
This diff is too big to show here.
libs/common/src/enums/productType.ts+6
This diff is too big to show here.
libs/common/src/enums/providerUserStatusType.ts+6
This diff is too big to show here.
libs/common/src/enums/providerUserType.ts+4
This diff is too big to show here.
libs/common/src/enums/scimProviderType.ts+9
This diff is too big to show here.
libs/common/src/enums/secureNoteType.ts+3
This diff is too big to show here.
libs/common/src/enums/sendType.ts+4
This diff is too big to show here.
libs/common/src/enums/ssoEnums.ts+33
This diff is too big to show here.
libs/common/src/enums/stateVersion.ts+8
This diff is too big to show here.
libs/common/src/enums/storageLocation.ts+5
This diff is too big to show here.
libs/common/src/enums/themeType.ts+7
This diff is too big to show here.
libs/common/src/enums/transactionType.ts+7
This diff is too big to show here.
libs/common/src/enums/twoFactorProviderType.ts+10
This diff is too big to show here.
libs/common/src/enums/uriMatchType.ts+8
This diff is too big to show here.
libs/common/src/enums/verificationType.ts+4
This diff is too big to show here.
libs/common/src/factories/accountFactory.ts+13
This diff is too big to show here.
libs/common/src/factories/globalStateFactory.ts+13
This diff is too big to show here.
libs/common/src/factories/stateFactory.ts+29
This diff is too big to show here.
libs/common/src/globals.d.ts+2
This diff is too big to show here.
libs/common/src/importers/ascendoCsvImporter.ts+59
This diff is too big to show here.
libs/common/src/importers/avastCsvImporter.ts+28
This diff is too big to show here.
libs/common/src/importers/avastJsonImporter.ts+68
This diff is too big to show here.
libs/common/src/importers/aviraCsvImporter.ts+41
This diff is too big to show here.
libs/common/src/importers/baseImporter.ts+472
This diff is too big to show here.
libs/common/src/importers/bitwardenCsvImporter.ts+120
This diff is too big to show here.
libs/common/src/importers/bitwardenJsonImporter.ts+179
This diff is too big to show here.
libs/common/src/importers/bitwardenPasswordProtectedImporter.ts+81
This diff is too big to show here.
libs/common/src/importers/blackBerryCsvImporter.ts+36
This diff is too big to show here.
libs/common/src/importers/blurCsvImporter.ts+41
This diff is too big to show here.
libs/common/src/importers/buttercupCsvImporter.ts+50
This diff is too big to show here.
libs/common/src/importers/chromeCsvImporter.ts+28
This diff is too big to show here.
libs/common/src/importers/clipperzHtmlImporter.ts+88
This diff is too big to show here.
libs/common/src/importers/codebookCsvImporter.ts+47
This diff is too big to show here.
libs/common/src/importers/dashlaneImporters/dashlaneCsvImporter.ts+271
This diff is too big to show here.
libs/common/src/importers/dashlaneImporters/dashlaneJsonImporter.ts+171
This diff is too big to show here.
libs/common/src/importers/dashlaneImporters/types/dashlaneCsvTypes.ts+68
This diff is too big to show here.
libs/common/src/importers/encryptrCsvImporter.ts+60
This diff is too big to show here.
libs/common/src/importers/enpassCsvImporter.ts+133
This diff is too big to show here.
libs/common/src/importers/enpassJsonImporter.ts+191
This diff is too big to show here.
libs/common/src/importers/firefoxCsvImporter.ts+33
This diff is too big to show here.
libs/common/src/importers/fsecureFskImporter.ts+59
This diff is too big to show here.
libs/common/src/importers/gnomeJsonImporter.ts+71
This diff is too big to show here.
libs/common/src/importers/importError.ts+5
This diff is too big to show here.
libs/common/src/importers/importer.ts+6
This diff is too big to show here.
libs/common/src/importers/kasperskyTxtImporter.ts+124
This diff is too big to show here.
libs/common/src/importers/keepass2XmlImporter.ts+101
This diff is too big to show here.
libs/common/src/importers/keepassxCsvImporter.ts+44
This diff is too big to show here.
libs/common/src/importers/keeperImporters/keeperCsvImporter.ts+45
This diff is too big to show here.
libs/common/src/importers/keeperImporters/keeperJsonImporter.ts+69
This diff is too big to show here.
libs/common/src/importers/keeperImporters/types/keeperJsonTypes.ts+41
This diff is too big to show here.
libs/common/src/importers/lastpassCsvImporter.ts+285
This diff is too big to show here.
libs/common/src/importers/logMeOnceCsvImporter.ts+31
This diff is too big to show here.
libs/common/src/importers/meldiumCsvImporter.ts+29
This diff is too big to show here.
libs/common/src/importers/msecureCsvImporter.ts+61
This diff is too big to show here.
libs/common/src/importers/mykiCsvImporter.ts+157
This diff is too big to show here.
libs/common/src/importers/nordpassCsvImporter.ts+127
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/cipherImportContext.ts+8
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/onepassword1PifImporter.ts+276
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/onepassword1PuxImporter.ts+637
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/onepasswordCsvImporter.ts+383
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/onepasswordMacCsvImporter.ts+31
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/onepasswordWinCsvImporter.ts+63
This diff is too big to show here.
libs/common/src/importers/onepasswordImporters/types/onepassword1PuxImporterTypes.ts+160
This diff is too big to show here.
libs/common/src/importers/padlockCsvImporter.ts+85
This diff is too big to show here.
libs/common/src/importers/passkeepCsvImporter.ts+39
This diff is too big to show here.
libs/common/src/importers/passmanJsonImporter.ts+61
This diff is too big to show here.
libs/common/src/importers/passpackCsvImporter.ts+103
This diff is too big to show here.
libs/common/src/importers/passwordAgentCsvImporter.ts+52
This diff is too big to show here.
libs/common/src/importers/passwordBossJsonImporter.ts+130
This diff is too big to show here.
libs/common/src/importers/passwordDragonXmlImporter.ts+63
This diff is too big to show here.
libs/common/src/importers/passwordSafeXmlImporter.ts+69
This diff is too big to show here.
libs/common/src/importers/passwordWalletTxtImporter.ts+47
This diff is too big to show here.
libs/common/src/importers/rememBearCsvImporter.ts+75
This diff is too big to show here.
libs/common/src/importers/roboformCsvImporter.ts+69
This diff is too big to show here.
libs/common/src/importers/safariCsvImporter.ts+30
This diff is too big to show here.
libs/common/src/importers/safeInCloudXmlImporter.ts+132
This diff is too big to show here.
libs/common/src/importers/saferpassCsvImport.ts+29
This diff is too big to show here.
libs/common/src/importers/secureSafeCsvImporter.ts+29
This diff is too big to show here.
libs/common/src/importers/splashIdCsvImporter.ts+57
This diff is too big to show here.
libs/common/src/importers/stickyPasswordXmlImporter.ts+83
This diff is too big to show here.
libs/common/src/importers/truekeyCsvImporter.ts+87
This diff is too big to show here.
libs/common/src/importers/upmCsvImporter.ts+32
This diff is too big to show here.
libs/common/src/importers/yotiCsvImporter.ts+28
This diff is too big to show here.
libs/common/src/importers/zohoVaultCsvImporter.ts+81
This diff is too big to show here.
libs/common/src/misc/captcha_iframe.ts+38
This diff is too big to show here.
libs/common/src/misc/iframe_component.ts+94
This diff is too big to show here.
libs/common/src/misc/linkedFieldOption.decorator.ts+27
This diff is too big to show here.
libs/common/src/misc/logInStrategies/apiLogin.strategy.ts+70
This diff is too big to show here.
libs/common/src/misc/logInStrategies/logIn.strategy.ts+170
This diff is too big to show here.
libs/common/src/misc/logInStrategies/passwordLogin.strategy.ts+95
This diff is too big to show here.
libs/common/src/misc/logInStrategies/ssoLogin.strategy.ts+70
This diff is too big to show here.
libs/common/src/misc/nodeUtils.ts+34
This diff is too big to show here.
libs/common/src/misc/sequentialize.ts+57
This diff is too big to show here.
libs/common/src/misc/serviceUtils.ts+72
This diff is too big to show here.
libs/common/src/misc/throttle.ts+69
This diff is too big to show here.
libs/common/src/misc/tldjs.noop.ts+7
This diff is too big to show here.
libs/common/src/misc/utils.ts+406
This diff is too big to show here.
libs/common/src/misc/webauthn_iframe.ts+106
This diff is too big to show here.
libs/common/src/misc/wordlist.ts+7779
This diff is too big to show here.
libs/common/src/models/api/billingSyncConfigApi.ts+13
This diff is too big to show here.
libs/common/src/models/api/cardApi.ts+23
This diff is too big to show here.
libs/common/src/models/api/fieldApi.ts+21
This diff is too big to show here.
libs/common/src/models/api/identityApi.ts+47
This diff is too big to show here.
libs/common/src/models/api/loginApi.ts+29
This diff is too big to show here.
libs/common/src/models/api/loginUriApi.ts+17
This diff is too big to show here.
libs/common/src/models/api/permissionsApi.ts+57
This diff is too big to show here.
libs/common/src/models/api/scimConfigApi.ts+17
This diff is too big to show here.
libs/common/src/models/api/secureNoteApi.ts+14
This diff is too big to show here.
libs/common/src/models/api/sendFileApi.ts+19
This diff is too big to show here.
libs/common/src/models/api/sendTextApi.ts+15
This diff is too big to show here.
libs/common/src/models/api/ssoConfigApi.ts+136
This diff is too big to show here.
libs/common/src/models/data/attachmentData.ts+22
This diff is too big to show here.
libs/common/src/models/data/cardData.ts+23
This diff is too big to show here.
libs/common/src/models/data/cipherData.ts+83
This diff is too big to show here.
libs/common/src/models/data/collectionData.ts+17
This diff is too big to show here.
libs/common/src/models/data/encryptedOrganizationKeyData.ts+14
This diff is too big to show here.
libs/common/src/models/data/eventData.ts+7
This diff is too big to show here.
libs/common/src/models/data/fieldData.ts+20
This diff is too big to show here.
libs/common/src/models/data/folderData.ts+13
This diff is too big to show here.
libs/common/src/models/data/identityData.ts+47
This diff is too big to show here.
libs/common/src/models/data/loginData.ts+28
This diff is too big to show here.
libs/common/src/models/data/loginUriData.ts+15
This diff is too big to show here.
libs/common/src/models/data/organizationData.ts+86
This diff is too big to show here.
libs/common/src/models/data/passwordHistoryData.ts+15
This diff is too big to show here.
libs/common/src/models/data/policyData.ts+18
This diff is too big to show here.
libs/common/src/models/data/providerData.ts+23
This diff is too big to show here.
libs/common/src/models/data/secureNoteData.ts+14
This diff is too big to show here.
libs/common/src/models/data/sendData.ts+56
This diff is too big to show here.
libs/common/src/models/data/sendFileData.ts+19
This diff is too big to show here.
libs/common/src/models/data/sendTextData.ts+15
This diff is too big to show here.
libs/common/src/models/domain/account.ts+185
This diff is too big to show here.
libs/common/src/models/domain/attachment.ts+87
This diff is too big to show here.
libs/common/src/models/domain/authResult.ts+17
This diff is too big to show here.
libs/common/src/models/domain/card.ts+65
This diff is too big to show here.
libs/common/src/models/domain/cipher.ts+236
This diff is too big to show here.
libs/common/src/models/domain/collection.ts+45
This diff is too big to show here.
libs/common/src/models/domain/decryptParameters.ts+8
This diff is too big to show here.
libs/common/src/models/domain/domainBase.ts+82
This diff is too big to show here.
libs/common/src/models/domain/encArrayBuffer.ts+3
This diff is too big to show here.
libs/common/src/models/domain/encString.ts+122
This diff is too big to show here.
libs/common/src/models/domain/encryptedObject.ts+8
This diff is too big to show here.
libs/common/src/models/domain/encryptedOrganizationKey.ts+56
This diff is too big to show here.
libs/common/src/models/domain/environmentUrls.ts+10
This diff is too big to show here.
libs/common/src/models/domain/field.ts+62
This diff is too big to show here.
libs/common/src/models/domain/folder.ts+40
This diff is too big to show here.
libs/common/src/models/domain/generatedPasswordHistory.ts+9
This diff is too big to show here.
libs/common/src/models/domain/globalState.ts+40
This diff is too big to show here.
libs/common/src/models/domain/identity.ts+113
This diff is too big to show here.
libs/common/src/models/domain/importResult.ts+14
This diff is too big to show here.
libs/common/src/models/domain/logInCredentials.ts+31
This diff is too big to show here.
libs/common/src/models/domain/login.ts+88
This diff is too big to show here.
libs/common/src/models/domain/loginUri.ts+54
This diff is too big to show here.
libs/common/src/models/domain/masterPasswordPolicyOptions.ts+10
This diff is too big to show here.
libs/common/src/models/domain/organization.ts+229
This diff is too big to show here.
libs/common/src/models/domain/password.ts+43
This diff is too big to show here.
libs/common/src/models/domain/passwordGeneratorPolicyOptions.ts+31
This diff is too big to show here.
libs/common/src/models/domain/policy.ts+25
This diff is too big to show here.
libs/common/src/models/domain/provider.ts+50
This diff is too big to show here.
libs/common/src/models/domain/resetPasswordPolicyOptions.ts+5
This diff is too big to show here.
libs/common/src/models/domain/secureNote.ts+29
This diff is too big to show here.
libs/common/src/models/domain/send.ts+112
This diff is too big to show here.
libs/common/src/models/domain/sendAccess.ts+77
This diff is too big to show here.
libs/common/src/models/domain/sendFile.ts+44
This diff is too big to show here.
libs/common/src/models/domain/sendText.ts+39
This diff is too big to show here.
libs/common/src/models/domain/sortedCiphersCache.ts+87
This diff is too big to show here.
libs/common/src/models/domain/state.ts+17
This diff is too big to show here.
libs/common/src/models/domain/storageOptions.ts+10
This diff is too big to show here.
libs/common/src/models/domain/symmetricCryptoKey.ts+75
This diff is too big to show here.
libs/common/src/models/domain/treeNode.ts+16
This diff is too big to show here.
libs/common/src/models/domain/windowState.ts+10
This diff is too big to show here.
libs/common/src/models/export/cardExport.ts+65
This diff is too big to show here.
libs/common/src/models/export/cipherExport.ts+156
This diff is too big to show here.
libs/common/src/models/export/cipherWithIdsExport.ts+16
This diff is too big to show here.
libs/common/src/models/export/collectionExport.ts+46
This diff is too big to show here.
libs/common/src/models/export/collectionWithIdExport.ts+14
This diff is too big to show here.
libs/common/src/models/export/eventExport.ts+28
This diff is too big to show here.
libs/common/src/models/export/fieldExport.ts+52
This diff is too big to show here.
libs/common/src/models/export/folderExport.ts+32
This diff is too big to show here.
libs/common/src/models/export/folderWithIdExport.ts+14
This diff is too big to show here.
libs/common/src/models/export/identityExport.ts+137
This diff is too big to show here.
libs/common/src/models/export/loginExport.ts+65
This diff is too big to show here.
libs/common/src/models/export/loginUriExport.ts+41
This diff is too big to show here.
libs/common/src/models/export/secureNoteExport.ts+31
This diff is too big to show here.
libs/common/src/models/request/account/setKeyConnectorKeyRequest.ts+24
This diff is too big to show here.
libs/common/src/models/request/account/verifyOTPRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/attachmentRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/billingSyncConfigRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/bitPayInvoiceRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/captchaProtectedRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/cipherBulkDeleteRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/cipherBulkMoveRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/cipherBulkRestoreRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/cipherBulkShareRequest.ts+18
This diff is too big to show here.
libs/common/src/models/request/cipherCollectionsRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/cipherCreateRequest.ts+13
This diff is too big to show here.
libs/common/src/models/request/cipherRequest.ts+164
This diff is too big to show here.
libs/common/src/models/request/cipherShareRequest.ts+13
This diff is too big to show here.
libs/common/src/models/request/cipherWithIdRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/collectionRequest.ts+17
This diff is too big to show here.
libs/common/src/models/request/deleteRecoverRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/deviceRequest.ts+16
This diff is too big to show here.
libs/common/src/models/request/deviceTokenRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/deviceVerificationRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/emailRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/emailTokenRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/emergencyAccessAcceptRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/emergencyAccessConfirmRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/emergencyAccessInviteRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/emergencyAccessPasswordRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/emergencyAccessUpdateRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/eventRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/folderRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/folderWithIdRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/groupRequest.ts+8
This diff is too big to show here.
libs/common/src/models/request/iapCheckRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/identityToken/apiTokenRequest.ts+25
This diff is too big to show here.
libs/common/src/models/request/identityToken/passwordTokenRequest.ts+37
This diff is too big to show here.
libs/common/src/models/request/identityToken/ssoTokenRequest.ts+27
This diff is too big to show here.
libs/common/src/models/request/identityToken/tokenRequest.ts+43
This diff is too big to show here.
libs/common/src/models/request/identityToken/tokenRequestTwoFactor.ts+9
This diff is too big to show here.
libs/common/src/models/request/importCiphersRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/importDirectoryRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/importDirectoryRequestGroup.ts+5
This diff is too big to show here.
libs/common/src/models/request/importDirectoryRequestUser.ts+5
This diff is too big to show here.
libs/common/src/models/request/importOrganizationCiphersRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/kdfRequest.ts+8
This diff is too big to show here.
libs/common/src/models/request/keyConnectorUserKeyRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/keysRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/kvpRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/organization/organizationSponsorshipCreateRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/organization/organizationSponsorshipRedeemRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/organization/organizationSsoRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/organizationApiKeyRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/organizationConnectionRequest.ts+16
This diff is too big to show here.
libs/common/src/models/request/organizationCreateRequest.ts+27
This diff is too big to show here.
libs/common/src/models/request/organizationImportGroupRequest.ts+18
This diff is too big to show here.
libs/common/src/models/request/organizationImportMemberRequest.ts+13
This diff is too big to show here.
libs/common/src/models/request/organizationImportRequest.ts+31
This diff is too big to show here.
libs/common/src/models/request/organizationKeysRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/organizationSubscriptionUpdateRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/organizationTaxInfoUpdateRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/organizationUpdateRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/organizationUpgradeRequest.ts+14
This diff is too big to show here.
libs/common/src/models/request/organizationUserAcceptRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/organizationUserBulkConfirmRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/organizationUserBulkRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/organizationUserConfirmRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/organizationUserInviteRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/organizationUserResetPasswordEnrollmentRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/organizationUserResetPasswordRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/organizationUserUpdateGroupsRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/organizationUserUpdateRequest.ts+11
This diff is too big to show here.
libs/common/src/models/request/passwordHintRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/passwordHistoryRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/passwordRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/paymentRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/policyRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/preloginRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/provider/providerAddOrganizationRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/provider/providerOrganizationCreateRequest.ts+8
This diff is too big to show here.
libs/common/src/models/request/provider/providerSetupRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/provider/providerUpdateRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/provider/providerUserAcceptRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/provider/providerUserBulkConfirmRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/provider/providerUserBulkRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/provider/providerUserConfirmRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/provider/providerUserInviteRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/provider/providerUserUpdateRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/referenceEventRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/registerRequest.ts+26
This diff is too big to show here.
libs/common/src/models/request/scimConfigRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/seatRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/secretVerificationRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/selectionReadOnlyRequest.ts+11
This diff is too big to show here.
libs/common/src/models/request/sendAccessRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/sendRequest.ts+48
This diff is too big to show here.
libs/common/src/models/request/sendWithIdRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/setPasswordRequest.ts+31
This diff is too big to show here.
libs/common/src/models/request/storageRequest.ts+3
This diff is too big to show here.
libs/common/src/models/request/taxInfoUpdateRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/twoFactorEmailRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/twoFactorProviderRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/twoFactorRecoveryRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/updateDomainsRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/updateKeyRequest.ts+12
This diff is too big to show here.
libs/common/src/models/request/updateProfileRequest.ts+10
This diff is too big to show here.
libs/common/src/models/request/updateTempPasswordRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/updateTwoFactorAuthenticatorRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/updateTwoFactorDuoRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/updateTwoFactorEmailRequest.ts+6
This diff is too big to show here.
libs/common/src/models/request/updateTwoFactorWebAuthnDeleteRequest.ts+5
This diff is too big to show here.
libs/common/src/models/request/updateTwoFactorWebAuthnRequest.ts+7
This diff is too big to show here.
libs/common/src/models/request/updateTwoFactorYubioOtpRequest.ts+10
This diff is too big to show here.
libs/common/src/models/request/verifyBankRequest.ts+4
This diff is too big to show here.
libs/common/src/models/request/verifyDeleteRecoverRequest.ts+9
This diff is too big to show here.
libs/common/src/models/request/verifyEmailRequest.ts+9
This diff is too big to show here.
libs/common/src/models/response/apiKeyResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/attachmentResponse.ts+20
This diff is too big to show here.
libs/common/src/models/response/attachmentUploadDataResponse.ts+23
This diff is too big to show here.
libs/common/src/models/response/baseResponse.ts+43
This diff is too big to show here.
libs/common/src/models/response/billingHistoryResponse.ts+23
This diff is too big to show here.
libs/common/src/models/response/billingPaymentResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/billingResponse.ts+83
This diff is too big to show here.
libs/common/src/models/response/breachAccountResponse.ts+32
This diff is too big to show here.
libs/common/src/models/response/cipherResponse.ts+92
This diff is too big to show here.
libs/common/src/models/response/collectionResponse.ts+38
This diff is too big to show here.
libs/common/src/models/response/deviceResponse.ts+20
This diff is too big to show here.
libs/common/src/models/response/deviceVerificationResponse.ts+16
This diff is too big to show here.
libs/common/src/models/response/domainsResponse.ts+20
This diff is too big to show here.
libs/common/src/models/response/emergencyAccessResponse.ts+82
This diff is too big to show here.
libs/common/src/models/response/errorResponse.ts+72
This diff is too big to show here.
libs/common/src/models/response/eventResponse.ts+43
This diff is too big to show here.
libs/common/src/models/response/folderResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/globalDomainResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/groupResponse.ts+31
This diff is too big to show here.
libs/common/src/models/response/identityCaptchaResponse.ts+10
This diff is too big to show here.
libs/common/src/models/response/identityTokenResponse.ts+38
This diff is too big to show here.
libs/common/src/models/response/identityTwoFactorResponse.ts+24
This diff is too big to show here.
libs/common/src/models/response/keyConnectorUserKeyResponse.ts+10
This diff is too big to show here.
libs/common/src/models/response/keysResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/listResponse.ts+13
This diff is too big to show here.
libs/common/src/models/response/notificationResponse.ts+98
This diff is too big to show here.
libs/common/src/models/response/organization/organizationSsoResponse.ts+35
This diff is too big to show here.
libs/common/src/models/response/organizationApiKeyInformationResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/organizationAutoEnrollStatusResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/organizationConnectionResponse.ts+28
This diff is too big to show here.
libs/common/src/models/response/organizationKeysResponse.ts+7
This diff is too big to show here.
libs/common/src/models/response/organizationResponse.ts+60
This diff is too big to show here.
libs/common/src/models/response/organizationSponsorshipSyncStatusResponse.ts+13
This diff is too big to show here.
libs/common/src/models/response/organizationSubscriptionResponse.ts+27
This diff is too big to show here.
libs/common/src/models/response/organizationUserBulkPublicKeyResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/organizationUserBulkResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/organizationUserResponse.ts+70
This diff is too big to show here.
libs/common/src/models/response/passwordHistoryResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/paymentResponse.ts+18
This diff is too big to show here.
libs/common/src/models/response/planResponse.ts+95
This diff is too big to show here.
libs/common/src/models/response/policyResponse.ts+20
This diff is too big to show here.
libs/common/src/models/response/preloginResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/profileOrganizationResponse.ts+99
This diff is too big to show here.
libs/common/src/models/response/profileProviderOrganizationResponse.ts+8
This diff is too big to show here.
libs/common/src/models/response/profileProviderResponse.ts+30
This diff is too big to show here.
libs/common/src/models/response/profileResponse.ts+57
This diff is too big to show here.
libs/common/src/models/response/provider/providerOrganizationResponse.ts+31
This diff is too big to show here.
libs/common/src/models/response/provider/providerResponse.ts+16
This diff is too big to show here.
libs/common/src/models/response/provider/providerUserBulkPublicKeyResponse.ts+3
This diff is too big to show here.
libs/common/src/models/response/provider/providerUserBulkResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/provider/providerUserResponse.ts+32
This diff is too big to show here.
libs/common/src/models/response/selectionReadOnlyResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/sendAccessResponse.ts+35
This diff is too big to show here.
libs/common/src/models/response/sendFileDownloadDataResponse.ts+11
This diff is too big to show here.
libs/common/src/models/response/sendFileUploadDataResponse.ts+17
This diff is too big to show here.
libs/common/src/models/response/sendResponse.ts+52
This diff is too big to show here.
libs/common/src/models/response/ssoPreValidateResponse.ts+10
This diff is too big to show here.
libs/common/src/models/response/subscriptionResponse.ts+85
This diff is too big to show here.
libs/common/src/models/response/syncResponse.ts+57
This diff is too big to show here.
libs/common/src/models/response/taxInfoResponse.ts+24
This diff is too big to show here.
libs/common/src/models/response/taxRateResponse.ts+18
This diff is too big to show here.
libs/common/src/models/response/twoFactorAuthenticatorResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/twoFactorDuoResponse.ts+16
This diff is too big to show here.
libs/common/src/models/response/twoFactorEmailResponse.ts+12
This diff is too big to show here.
libs/common/src/models/response/twoFactorProviderResponse.ts+14
This diff is too big to show here.
libs/common/src/models/response/twoFactorRescoverResponse.ts+10
This diff is too big to show here.
libs/common/src/models/response/twoFactorWebAuthnResponse.ts+60
This diff is too big to show here.
libs/common/src/models/response/twoFactorYubiKeyResponse.ts+22
This diff is too big to show here.
libs/common/src/models/response/userKeyResponse.ts+12
This diff is too big to show here.
libs/common/src/models/view/attachmentView.ts+35
This diff is too big to show here.
libs/common/src/models/view/cardView.ts+82
This diff is too big to show here.
libs/common/src/models/view/cipherView.ts+134
This diff is too big to show here.
libs/common/src/models/view/collectionView.ts+28
This diff is too big to show here.
libs/common/src/models/view/eventView.ts+29
This diff is too big to show here.
libs/common/src/models/view/fieldView.ts+28
This diff is too big to show here.
libs/common/src/models/view/folderView.ts+19
This diff is too big to show here.
libs/common/src/models/view/identityView.ts+142
This diff is too big to show here.
libs/common/src/models/view/itemView.ts+8
This diff is too big to show here.
libs/common/src/models/view/loginUriView.ts+127
This diff is too big to show here.
libs/common/src/models/view/loginView.ts+63
This diff is too big to show here.
libs/common/src/models/view/passwordHistoryView.ts+16
This diff is too big to show here.
libs/common/src/models/view/secureNoteView.ts+21
This diff is too big to show here.
libs/common/src/models/view/sendAccessView.ts+27
This diff is too big to show here.
libs/common/src/models/view/sendFileView.ts+31
This diff is too big to show here.
libs/common/src/models/view/sendTextView.ts+20
This diff is too big to show here.
libs/common/src/models/view/sendView.ts+68
This diff is too big to show here.
libs/common/src/models/view/ssoConfigView.ts+104
This diff is too big to show here.
libs/common/src/models/view/view.ts+1
This diff is too big to show here.
libs/common/src/services/api.service.ts+2681
This diff is too big to show here.
libs/common/src/services/appId.service.ts+31
This diff is too big to show here.
libs/common/src/services/audit.service.ts+44
This diff is too big to show here.
libs/common/src/services/auth.service.ts+225
This diff is too big to show here.
libs/common/src/services/azureFileUpload.service.ts+214
This diff is too big to show here.
libs/common/src/services/bitwardenFileUpload.service.ts+34
This diff is too big to show here.
libs/common/src/services/broadcaster.service.ts+28
This diff is too big to show here.
libs/common/src/services/cipher.service.ts+1273
This diff is too big to show here.
libs/common/src/services/collection.service.ts+158
This diff is too big to show here.
libs/common/src/services/consoleLog.service.ts+72
This diff is too big to show here.
libs/common/src/services/container.service.ts+15
This diff is too big to show here.
libs/common/src/services/crypto.service.ts+934
This diff is too big to show here.
libs/common/src/services/encrypt.service.ts+94
This diff is too big to show here.
libs/common/src/services/environment.service.ts+206
This diff is too big to show here.
libs/common/src/services/event.service.ts+99
This diff is too big to show here.
libs/common/src/services/export.service.ts+445
This diff is too big to show here.
libs/common/src/services/fileUpload.service.ts+108
This diff is too big to show here.
libs/common/src/services/folder/folder-api.service.ts+50
This diff is too big to show here.
libs/common/src/services/folder/folder.service.ts+163
This diff is too big to show here.
libs/common/src/services/formValidationErrors.service.ts+31
This diff is too big to show here.
libs/common/src/services/i18n.service.ts+182
This diff is too big to show here.
libs/common/src/services/import.service.ts+382
This diff is too big to show here.
libs/common/src/services/keyConnector.service.ts+142
This diff is too big to show here.
libs/common/src/services/memoryStorage.service.ts+30
This diff is too big to show here.
libs/common/src/services/noopMessaging.service.ts+7
This diff is too big to show here.
libs/common/src/services/notifications.service.ts+229
This diff is too big to show here.
libs/common/src/services/organization.service.ts+56
This diff is too big to show here.
libs/common/src/services/passwordGeneration.service.ts+572
This diff is too big to show here.
libs/common/src/services/policy.service.ts+247
This diff is too big to show here.
libs/common/src/services/provider.service.ts+34
This diff is too big to show here.
libs/common/src/services/search.service.ts+319
This diff is too big to show here.
libs/common/src/services/send.service.ts+295
This diff is too big to show here.
libs/common/src/services/settings.service.ts+56
This diff is too big to show here.
libs/common/src/services/state.service.ts+2943
This diff is too big to show here.
libs/common/src/services/stateMigration.service.ts+547
This diff is too big to show here.
libs/common/src/services/sync.service.ts+400
This diff is too big to show here.
libs/common/src/services/system.service.ts+90
This diff is too big to show here.
libs/common/src/services/token.service.ts+186
This diff is too big to show here.
libs/common/src/services/totp.service.ts+168
This diff is too big to show here.
libs/common/src/services/twoFactor.service.ts+186
This diff is too big to show here.
libs/common/src/services/userVerification.service.ts+88
This diff is too big to show here.
libs/common/src/services/usernameGeneration.service.ts+277
This diff is too big to show here.
libs/common/src/services/vaultTimeout.service.ts+206
This diff is too big to show here.
libs/common/src/services/webCryptoFunction.service.ts+356
This diff is too big to show here.
libs/common/src/types/verification.ts+6
This diff is too big to show here.
libs/common/tsconfig.json+5
This diff is too big to show here.
libs/common/tsconfig.spec.json+3
This diff is too big to show here.
libs/components/.browserslistrc+16
This diff is too big to show here.
libs/components/.gitignore+7
This diff is too big to show here.
libs/components/jest.config.js+17
This diff is too big to show here.
libs/components/package.json+17
This diff is too big to show here.
libs/components/spec/test.setup.ts+1
This diff is too big to show here.
libs/components/src/app/app.component.ts+9
This diff is too big to show here.
libs/components/src/app/app.module.ts+13
This diff is too big to show here.
libs/components/src/badge/badge.directive.ts+57
This diff is too big to show here.
libs/components/src/badge/badge.module.ts+11
This diff is too big to show here.
libs/components/src/badge/badge.stories.ts+56
This diff is too big to show here.
libs/components/src/badge/index.ts+2
This diff is too big to show here.
libs/components/src/banner/banner.component.html+14
This diff is too big to show here.
libs/components/src/banner/banner.component.spec.ts+35
This diff is too big to show here.
libs/components/src/banner/banner.component.ts+39
This diff is too big to show here.
libs/components/src/banner/banner.module.ts+11
This diff is too big to show here.
libs/components/src/banner/banner.stories.ts+38
This diff is too big to show here.
libs/components/src/banner/index.ts+2
This diff is too big to show here.
libs/components/src/button/button.directive.spec.ts+75
This diff is too big to show here.
libs/components/src/button/button.directive.ts+72
This diff is too big to show here.
libs/components/src/button/button.module.ts+11
This diff is too big to show here.
libs/components/src/button/button.stories.ts+54
This diff is too big to show here.
libs/components/src/button/index.ts+2
This diff is too big to show here.
libs/components/src/callout/callout.component.html+14
This diff is too big to show here.
libs/components/src/callout/callout.component.spec.ts+64
This diff is too big to show here.
libs/components/src/callout/callout.component.ts+63
This diff is too big to show here.
libs/components/src/callout/callout.module.ts+11
This diff is too big to show here.
libs/components/src/callout/callout.stories.ts+65
This diff is too big to show here.
libs/components/src/callout/index.ts+2
This diff is too big to show here.
libs/components/src/favicon.ico
This diff is too big to show here.
libs/components/src/form-field/error-summary.component.ts+39
This diff is too big to show here.
libs/components/src/form-field/error-summary.stories.ts+78
This diff is too big to show here.
libs/components/src/form-field/error.component.ts+40
This diff is too big to show here.
libs/components/src/form-field/form-field.component.html+17
This diff is too big to show here.
libs/components/src/form-field/form-field.component.ts+42
This diff is too big to show here.
libs/components/src/form-field/form-field.module.ts+54
This diff is too big to show here.
libs/components/src/form-field/form-field.stories.ts+231
This diff is too big to show here.
libs/components/src/form-field/hint.component.ts+14
This diff is too big to show here.
libs/components/src/form-field/index.ts+2
This diff is too big to show here.
libs/components/src/form-field/label.directive.ts+6
This diff is too big to show here.
libs/components/src/form-field/prefix.directive.ts+24
This diff is too big to show here.
libs/components/src/form-field/suffix.directive.ts+12
This diff is too big to show here.
libs/components/src/index.html+13
This diff is too big to show here.
libs/components/src/index.ts+11
This diff is too big to show here.
libs/components/src/input/input.directive.ts+67
This diff is too big to show here.
libs/components/src/input/input.module.ts+11
This diff is too big to show here.
libs/components/src/main.ts+7
This diff is too big to show here.
libs/components/src/menu/index.ts+5
This diff is too big to show here.
libs/components/src/menu/menu-divider.component.html+4
This diff is too big to show here.
libs/components/src/menu/menu-divider.component.ts+7
This diff is too big to show here.
libs/components/src/menu/menu-item.directive.ts+36
This diff is too big to show here.
libs/components/src/menu/menu-trigger-for.directive.ts+119
This diff is too big to show here.
libs/components/src/menu/menu.component.html+9
This diff is too big to show here.
libs/components/src/menu/menu.component.spec.ts+75
This diff is too big to show here.
libs/components/src/menu/menu.component.ts+30
This diff is too big to show here.
libs/components/src/menu/menu.module.ts+15
This diff is too big to show here.
libs/components/src/menu/menu.stories.ts+69
This diff is too big to show here.
libs/components/src/modal/index.ts+3
This diff is too big to show here.
libs/components/src/modal/modal-simple.component.html+19
This diff is too big to show here.
libs/components/src/modal/modal-simple.component.ts+16
This diff is too big to show here.
libs/components/src/modal/modal-simple.stories.ts+85
This diff is too big to show here.
libs/components/src/modal/modal.component.html+25
This diff is too big to show here.
libs/components/src/modal/modal.component.ts+23
This diff is too big to show here.
libs/components/src/modal/modal.module.ts+12
This diff is too big to show here.
libs/components/src/modal/modal.stories.ts+80
This diff is too big to show here.
libs/components/src/polyfills.ts+52
This diff is too big to show here.
libs/components/src/stories/Introduction.stories.mdx+128
This diff is too big to show here.
libs/components/src/stories/colors.stories.mdx+86
This diff is too big to show here.
libs/components/src/stories/icons.stories.mdx+188
This diff is too big to show here.
libs/components/src/styles.css+11
This diff is too big to show here.
libs/components/src/styles.scss+47
This diff is too big to show here.
libs/components/src/submit-button/index.ts+1
This diff is too big to show here.
libs/components/src/submit-button/submit-button.component.html+10
This diff is too big to show here.
libs/components/src/submit-button/submit-button.component.ts+13
This diff is too big to show here.
libs/components/src/submit-button/submit-button.module.ts+13
This diff is too big to show here.
libs/components/src/submit-button/submit-button.stories.ts+44
This diff is too big to show here.
libs/components/src/tabs/index.ts+3
This diff is too big to show here.
libs/components/src/tabs/tab-group.component.html+6
This diff is too big to show here.
libs/components/src/tabs/tab-group.component.ts+7
This diff is too big to show here.
libs/components/src/tabs/tab-item.component.html+26
This diff is too big to show here.
libs/components/src/tabs/tab-item.component.ts+54
This diff is too big to show here.
libs/components/src/tabs/tabs.module.ts+13
This diff is too big to show here.
libs/components/src/tabs/tabs.stories.ts+84
This diff is too big to show here.
libs/components/src/test.setup.ts+28
This diff is too big to show here.
libs/components/src/toggle-group/index.ts+2
This diff is too big to show here.
libs/components/src/toggle-group/toggle-group.component.html+1
This diff is too big to show here.
libs/components/src/toggle-group/toggle-group.component.spec.ts+69
This diff is too big to show here.
libs/components/src/toggle-group/toggle-group.component.ts+24
This diff is too big to show here.
libs/components/src/toggle-group/toggle-group.module.ts+14
This diff is too big to show here.
libs/components/src/toggle-group/toggle-group.stories.ts+54
This diff is too big to show here.
libs/components/src/toggle-group/toggle.component.html+11
This diff is too big to show here.
libs/components/src/toggle-group/toggle.component.spec.ts+71
This diff is too big to show here.
libs/components/src/toggle-group/toggle.component.ts+80
This diff is too big to show here.
libs/components/src/tw-theme.css+71
This diff is too big to show here.
libs/components/src/utils/i18n-mock.service.ts+21
This diff is too big to show here.
libs/components/src/variables.scss+357
This diff is too big to show here.
libs/components/tailwind.config.base.js+73
This diff is too big to show here.
libs/components/tailwind.config.js+11
This diff is too big to show here.
libs/components/tsconfig.app.json+10
This diff is too big to show here.
libs/components/tsconfig.json+32
This diff is too big to show here.
libs/components/tsconfig.spec.json+3
This diff is too big to show here.
libs/electron/jest.config.js+16
This diff is too big to show here.
libs/electron/package.json+23
This diff is too big to show here.
libs/electron/spec/services/electronLog.service.spec.ts+9
This diff is too big to show here.
libs/electron/spec/test.setup.ts
This diff is too big to show here.
libs/electron/spec/utils.spec.ts+27
This diff is too big to show here.
libs/electron/src/baseMenu.ts+225
This diff is too big to show here.
libs/electron/src/globals.d.ts
This diff is too big to show here.
libs/electron/src/services/electronCrypto.service.ts+73
This diff is too big to show here.
libs/electron/src/services/electronLog.service.ts+45
This diff is too big to show here.
libs/electron/src/services/electronMainMessaging.service.ts+69
This diff is too big to show here.
libs/electron/src/services/electronPlatformUtils.service.ts+184
This diff is too big to show here.
libs/electron/src/services/electronRendererMessaging.service.ts+26
This diff is too big to show here.
libs/electron/src/services/electronRendererSecureStorage.service.ts+43
This diff is too big to show here.
libs/electron/src/services/electronRendererStorage.service.ts+34
This diff is too big to show here.
libs/electron/src/services/electronStorage.service.ts+60
This diff is too big to show here.
libs/electron/src/tray.main.ts+186
This diff is too big to show here.
libs/electron/src/updater.main.ts+156
This diff is too big to show here.
libs/electron/src/utils.ts+80
This diff is too big to show here.
libs/electron/src/window.main.ts+293
This diff is too big to show here.
libs/electron/tsconfig.json+5
This diff is too big to show here.
libs/electron/tsconfig.spec.json+3
This diff is too big to show here.
libs/node/jest.config.js+15
This diff is too big to show here.
libs/node/package.json+23
This diff is too big to show here.
libs/node/spec/cli/consoleLog.service.spec.ts+45
This diff is too big to show here.
libs/node/spec/services/nodeCryptoFunction.service.spec.ts+518
This diff is too big to show here.
libs/node/spec/test.setup.ts
This diff is too big to show here.
libs/node/src/cli/baseProgram.ts+113
This diff is too big to show here.
libs/node/src/cli/commands/login.command.ts+624
This diff is too big to show here.
libs/node/src/cli/commands/logout.command.ts+22
This diff is too big to show here.
libs/node/src/cli/commands/update.command.ts+104
This diff is too big to show here.
libs/node/src/cli/models/response.ts+50
This diff is too big to show here.
libs/node/src/cli/models/response/baseResponse.ts+3
This diff is too big to show here.
libs/node/src/cli/models/response/fileResponse.ts+13
This diff is too big to show here.
libs/node/src/cli/models/response/listResponse.ts+11
This diff is too big to show here.
libs/node/src/cli/models/response/messageResponse.ts+15
This diff is too big to show here.
libs/node/src/cli/models/response/stringResponse.ts+11
This diff is too big to show here.
libs/node/src/cli/services/cliPlatformUtils.service.ts+149
This diff is too big to show here.
libs/node/src/cli/services/consoleLog.service.ts+22
This diff is too big to show here.
libs/node/src/globals.d.ts
This diff is too big to show here.
libs/node/src/services/lowdbStorage.service.ts+148
This diff is too big to show here.
libs/node/src/services/nodeApi.service.ts+43
This diff is too big to show here.
libs/node/src/services/nodeCryptoFunction.service.ts+301
This diff is too big to show here.
libs/node/tsconfig.json+5
This diff is too big to show here.
libs/node/tsconfig.spec.json+3
This diff is too big to show here.
libs/shared/tsconfig.json+15
This diff is too big to show here.
libs/shared/tsconfig.libs.json+11
This diff is too big to show here.
package-lock.json+78233−11000
This diff is too big to show here.
package.json+198−74
This diff is too big to show here.
src/2fa/2fa.ts−50
This diff is too big to show here.
src/2fa/index.html−31
This diff is too big to show here.
src/_locales/cs/messages.json−984
This diff is too big to show here.
src/_locales/da/messages.json−984
This diff is too big to show here.
src/_locales/de/messages.json−984
This diff is too big to show here.
src/_locales/en/messages.json−984
This diff is too big to show here.
src/_locales/es/messages.json−984
This diff is too big to show here.
src/_locales/et/messages.json−984
This diff is too big to show here.
src/_locales/fi/messages.json−984
This diff is too big to show here.
src/_locales/fr/messages.json−984
This diff is too big to show here.
src/_locales/hi/messages.json−984
This diff is too big to show here.
src/_locales/hr/messages.json−984
This diff is too big to show here.
src/_locales/hu/messages.json−984
This diff is too big to show here.
src/_locales/id/messages.json−984
This diff is too big to show here.
src/_locales/it/messages.json−984
This diff is too big to show here.
src/_locales/ja/messages.json−984
This diff is too big to show here.
src/_locales/nb/messages.json−984
This diff is too big to show here.
src/_locales/nl/messages.json−984
This diff is too big to show here.
src/_locales/pl/messages.json−984
This diff is too big to show here.
src/_locales/pt_BR/messages.json−984
This diff is too big to show here.
src/_locales/pt_PT/messages.json−984
This diff is too big to show here.
src/_locales/ro/messages.json−984
This diff is too big to show here.
src/_locales/ru/messages.json−984
This diff is too big to show here.
src/_locales/sk/messages.json−984
This diff is too big to show here.
src/_locales/sv/messages.json−984
This diff is too big to show here.
src/_locales/th/messages.json−984
This diff is too big to show here.
src/_locales/tr/messages.json−984
This diff is too big to show here.
src/_locales/uk/messages.json−984
This diff is too big to show here.
src/_locales/vi/messages.json−984
This diff is too big to show here.
src/_locales/zh_CN/messages.json−984
This diff is too big to show here.
src/_locales/zh_TW/messages.json−984
This diff is too big to show here.
src/background.html−6
This diff is too big to show here.
src/background.ts−6
This diff is too big to show here.
src/background/commands.background.ts−108
This diff is too big to show here.
src/background/contextMenus.background.ts−102
This diff is too big to show here.
src/background/idle.background.ts−34
This diff is too big to show here.
src/background/main.background.ts−621
This diff is too big to show here.
src/background/runtime.background.ts−367
This diff is too big to show here.
src/background/tabs.background.ts−54
This diff is too big to show here.
src/background/webRequest.background.ts−80
This diff is too big to show here.
src/background/windows.background.ts−23
This diff is too big to show here.
src/browser/browserApi.ts−256
This diff is too big to show here.
src/content/autofill.css−32
This diff is too big to show here.
src/content/autofill.js−1037
This diff is too big to show here.
src/content/autofiller.js−44
This diff is too big to show here.
src/content/notificationBar.js−458
This diff is too big to show here.
src/content/shortcuts.js−55
This diff is too big to show here.
src/downloader/downloader.ts−30
This diff is too big to show here.
src/downloader/index.html−10
This diff is too big to show here.
src/edge/backgroundScriptsAPIBridge.js−846
This diff is too big to show here.
src/edge/contentScriptsAPIBridge.js−323
This diff is too big to show here.
src/globals.d.ts−6
This diff is too big to show here.
src/images/fa-globe.png
This diff is too big to show here.
src/images/icon128.png
This diff is too big to show here.
src/images/icon128_gray.png
This diff is too big to show here.
src/images/icon16.png
This diff is too big to show here.
src/images/icon16_gray.png
This diff is too big to show here.
src/images/icon18_safari.png
This diff is too big to show here.
src/images/icon18_safari@2x.png
This diff is too big to show here.
src/images/icon18_safari_locked.png
This diff is too big to show here.
src/images/icon18_safari_locked@2x.png
This diff is too big to show here.
src/images/icon19.png
This diff is too big to show here.
src/images/icon19_gray.png
This diff is too big to show here.
src/images/icon19_locked.png
This diff is too big to show here.
src/images/icon32.png
This diff is too big to show here.
src/images/icon32_gray.png
This diff is too big to show here.
src/images/icon38.png
This diff is too big to show here.
src/images/icon38_gray.png
This diff is too big to show here.
src/images/icon38_locked.png
This diff is too big to show here.
src/images/icon48.png
This diff is too big to show here.
src/images/icon48_gray.png
This diff is too big to show here.
src/images/icon96.png
This diff is too big to show here.
src/images/icon96_gray.png
This diff is too big to show here.
src/models/autofillField.ts−22
This diff is too big to show here.
src/models/autofillForm.ts−7
This diff is too big to show here.
src/models/autofillPageDetails.ts−13
This diff is too big to show here.
src/models/autofillScript.ts−12
This diff is too big to show here.
src/notification/bar.html−40
This diff is too big to show here.
src/notification/bar.js−127
This diff is too big to show here.
src/notification/bar.less−91
This diff is too big to show here.
src/popup/app/accounts/accountsHintController.js−43
This diff is too big to show here.
src/popup/app/accounts/accountsLoginController.js−58
This diff is too big to show here.
src/popup/app/accounts/accountsLoginTwoFactorController.js−216
This diff is too big to show here.
src/popup/app/accounts/accountsModule.js−2
This diff is too big to show here.
src/popup/app/accounts/accountsRegisterController.js−64
This diff is too big to show here.
src/popup/app/accounts/accountsTwoFactorMethodsController.js−56
This diff is too big to show here.
src/popup/app/accounts/views/accountsHint.html−28
This diff is too big to show here.
src/popup/app/accounts/views/accountsLogin.html−34
This diff is too big to show here.
src/popup/app/accounts/views/accountsLoginTwoFactor.html−166
This diff is too big to show here.
src/popup/app/accounts/views/accountsRegister.html−53
This diff is too big to show here.
src/popup/app/accounts/views/accountsTwoFactorMethods.html−25
This diff is too big to show here.
src/popup/app/app.d.ts−1
This diff is too big to show here.
src/popup/app/app.js−221
This diff is too big to show here.
src/popup/app/components/action-buttons.component.html−48
This diff is too big to show here.
src/popup/app/components/action-buttons.component.ts−57
This diff is too big to show here.
src/popup/app/components/cipher-items.component.html−11
This diff is too big to show here.
src/popup/app/components/cipher-items.component.ts−33
This diff is too big to show here.
src/popup/app/components/components.module.ts−13
This diff is too big to show here.
src/popup/app/components/icon.component.html−4
This diff is too big to show here.
src/popup/app/components/icon.component.ts−90
This diff is too big to show here.
src/popup/app/components/pop-out.component.html−3
This diff is too big to show here.
src/popup/app/components/pop-out.component.ts−68
This diff is too big to show here.
src/popup/app/config.js−282
This diff is too big to show here.
src/popup/app/current/current.component.html−63
This diff is too big to show here.
src/popup/app/current/current.component.ts−185
This diff is too big to show here.
src/popup/app/current/current.module.ts−9
This diff is too big to show here.
src/popup/app/directives/bit-form.directive.ts−30
This diff is too big to show here.
src/popup/app/directives/directives.module.ts−16
This diff is too big to show here.
src/popup/app/directives/fallback-src.directive.ts−7
This diff is too big to show here.
src/popup/app/directives/stop-click.directive.ts−8
This diff is too big to show here.
src/popup/app/directives/stop-prop.directive.ts−7
This diff is too big to show here.
src/popup/app/global/base.controller.ts−7
This diff is too big to show here.
src/popup/app/global/empty.html−1
This diff is too big to show here.
src/popup/app/global/global.module.ts−15
This diff is too big to show here.
src/popup/app/global/home.html−17
This diff is too big to show here.
src/popup/app/global/main.controller.ts−61
This diff is too big to show here.
src/popup/app/global/private-mode.controller.ts−13
This diff is too big to show here.
src/popup/app/global/private-mode.html−6
This diff is too big to show here.
src/popup/app/global/splash.html−5
This diff is too big to show here.
src/popup/app/global/tabs.controller.ts−8
This diff is too big to show here.
src/popup/app/global/tabs.html−17
This diff is too big to show here.
src/popup/app/lock/lock.component.html−25
This diff is too big to show here.
src/popup/app/lock/lock.component.ts−69
This diff is too big to show here.
src/popup/app/lock/lock.module.ts−9
This diff is too big to show here.
src/popup/app/services/background.service.ts−53
This diff is too big to show here.
src/popup/app/services/popupUtils.service.ts−120
This diff is too big to show here.
src/popup/app/services/services.module.ts−47
This diff is too big to show here.
src/popup/app/services/state.service.ts−37
This diff is too big to show here.
src/popup/app/services/validation.service.ts−36
This diff is too big to show here.
src/popup/app/settings/about.component.html−23
This diff is too big to show here.
src/popup/app/settings/about.component.ts−23
This diff is too big to show here.
src/popup/app/settings/credits.component.html−34
This diff is too big to show here.
src/popup/app/settings/credits.component.ts−24
This diff is too big to show here.
src/popup/app/settings/environment.component.html−56
This diff is too big to show here.
src/popup/app/settings/environment.component.ts−60
This diff is too big to show here.
src/popup/app/settings/folders/add-folder.component.html−24
This diff is too big to show here.
src/popup/app/settings/folders/add-folder.component.ts−49
This diff is too big to show here.
src/popup/app/settings/folders/edit-folder.component.html−31
This diff is too big to show here.
src/popup/app/settings/folders/edit-folder.component.ts−84
This diff is too big to show here.
src/popup/app/settings/folders/folders.component.html−31
This diff is too big to show here.
src/popup/app/settings/folders/folders.component.ts−44
This diff is too big to show here.
src/popup/app/settings/help.component.html−54
This diff is too big to show here.
src/popup/app/settings/help.component.ts−39
This diff is too big to show here.
src/popup/app/settings/options.component.html−82
This diff is too big to show here.
src/popup/app/settings/options.component.ts−107
This diff is too big to show here.
src/popup/app/settings/premium.component.html−54
This diff is too big to show here.
src/popup/app/settings/premium.component.ts−68
This diff is too big to show here.
src/popup/app/settings/settings.component.html−101
This diff is too big to show here.
src/popup/app/settings/settings.component.ts−172
This diff is too big to show here.
src/popup/app/settings/settings.module.ts−29
This diff is too big to show here.
src/popup/app/settings/sync.component.html−19
This diff is too big to show here.
src/popup/app/settings/sync.component.ts−49
This diff is too big to show here.
src/popup/app/tools/export.component.html−29
This diff is too big to show here.
src/popup/app/tools/export.component.ts−165
This diff is too big to show here.
src/popup/app/tools/password-generator-history.component.html−33
This diff is too big to show here.
src/popup/app/tools/password-generator-history.component.ts−64
This diff is too big to show here.
src/popup/app/tools/password-generator.component.html−90
This diff is too big to show here.
src/popup/app/tools/password-generator.component.ts−147
This diff is too big to show here.
src/popup/app/tools/tools.component.html−47
This diff is too big to show here.
src/popup/app/tools/tools.component.ts−64
This diff is too big to show here.
src/popup/app/tools/tools.module.ts−15
This diff is too big to show here.
src/popup/app/vault/vaultAddCipherController.js−130
This diff is too big to show here.
src/popup/app/vault/vaultAttachmentsController.js−127
This diff is too big to show here.
src/popup/app/vault/vaultController.js−247
This diff is too big to show here.
src/popup/app/vault/vaultEditCipherController.js−170
This diff is too big to show here.
src/popup/app/vault/vaultModule.js−2
This diff is too big to show here.
src/popup/app/vault/vaultViewCipherController.js−228
This diff is too big to show here.
src/popup/app/vault/vaultViewGroupingController.js−243
This diff is too big to show here.
src/popup/app/vault/views/vault.html−129
This diff is too big to show here.
src/popup/app/vault/views/vaultAddCipher.html−272
This diff is too big to show here.
src/popup/app/vault/views/vaultAttachments.html−47
This diff is too big to show here.
src/popup/app/vault/views/vaultEditCipher.html−276
This diff is too big to show here.
src/popup/app/vault/views/vaultViewCipher.html−242
This diff is too big to show here.
src/popup/app/vault/views/vaultViewGrouping.html−50
This diff is too big to show here.
src/popup/images/logo.png
This diff is too big to show here.
src/popup/images/logo@2x.png
This diff is too big to show here.
src/popup/images/logo@3x.png
This diff is too big to show here.
src/popup/index.html−11
This diff is too big to show here.
src/popup/less/animations.less−132
This diff is too big to show here.
src/popup/less/components.less−656
This diff is too big to show here.
src/popup/less/libs.less−4
This diff is too big to show here.
src/popup/less/mixins.less−19
This diff is too big to show here.
src/popup/less/pages.less−166
This diff is too big to show here.
src/popup/less/plugins.less−138
This diff is too big to show here.
src/popup/less/popup.less−65
This diff is too big to show here.
src/popup/less/variables.less−18
This diff is too big to show here.
src/safari/Icon-128.png
This diff is too big to show here.
src/safari/Icon-32.png
This diff is too big to show here.
src/safari/Icon-48.png
This diff is too big to show here.
src/safari/Icon-64.png
This diff is too big to show here.
src/safari/Icon-96.png
This diff is too big to show here.
src/safari/Info.plist−96
This diff is too big to show here.
src/scripts/u2f.ts−73
This diff is too big to show here.
src/services/abstractions/autofill.service.ts−7
This diff is too big to show here.
src/services/autofill.service.ts−880
This diff is too big to show here.
src/services/browserMessaging.service.ts−32
This diff is too big to show here.
src/services/browserPlatformUtils.service.spec.ts−105
This diff is too big to show here.
src/services/browserPlatformUtils.service.ts−189
This diff is too big to show here.
src/services/browserStorage.service.ts−70
This diff is too big to show here.
src/services/i18n.service.ts−69
This diff is too big to show here.
src/services/i18n2.service.ts−29
This diff is too big to show here.
src/services/utils.service.spec.ts−32
This diff is too big to show here.
store/icons/chrome-icon128.png
This diff is too big to show here.
store/icons/icon64.png
This diff is too big to show here.
store/icons/safari-icon256.png
This diff is too big to show here.
store/icons/windows-icon300.png
This diff is too big to show here.
store/locales/en/screenshots/chrome-autofill.png
This diff is too big to show here.
store/locales/en/screenshots/chrome-menu.png
This diff is too big to show here.
store/locales/en/screenshots/chrome-password.png
This diff is too big to show here.
store/locales/en/screenshots/chrome-vault.png
This diff is too big to show here.
store/locales/en/screenshots/edge-autofill.png
This diff is too big to show here.
store/locales/en/screenshots/edge-edit.png
This diff is too big to show here.
store/locales/en/screenshots/edge-menu.png
This diff is too big to show here.
store/locales/en/screenshots/edge-password.png
This diff is too big to show here.
store/locales/en/screenshots/edge-vault.png
This diff is too big to show here.
store/locales/en/screenshots/firefox-autofill.png
This diff is too big to show here.
store/locales/en/screenshots/firefox-edit.png
This diff is too big to show here.
store/locales/en/screenshots/firefox-menu.png
This diff is too big to show here.
store/locales/en/screenshots/firefox-password.png
This diff is too big to show here.
store/locales/en/screenshots/firefox-vault.png
This diff is too big to show here.
store/locales/en/screenshots/opera-autofill.png
This diff is too big to show here.
store/locales/en/screenshots/opera-menu.png
This diff is too big to show here.
store/locales/en/screenshots/opera-vault.png
This diff is too big to show here.
store/locales/en/screenshots/safari-vault.png
This diff is too big to show here.
store/locales/en/screenshots/sync.png
This diff is too big to show here.
store/windows/Assets/icon_150.png
This diff is too big to show here.
store/windows/Assets/icon_44.png
This diff is too big to show here.
store/windows/Assets/icon_50.png
This diff is too big to show here.
tsconfig.json+22−17
This diff is too big to show here.
tslint.json−53
This diff is too big to show here.
webfonts.list−1
This diff is too big to show here.
webpack.common.js−129
This diff is too big to show here.
webpack.dev.js−24
This diff is too big to show here.
webpack.prod.js−41
This diff is too big to show here.