From b218e62ffcfedf5936bc275dfda61613b3702d1a Mon Sep 17 00:00:00 2001 From: Nick Farrell Date: Sat, 17 Dec 2022 18:22:37 +1100 Subject: [PATCH] Actually apply the pre-commit fixers to the codebase. This can be redone manually with `pre-commit run --all` While the pre-commit hook could be merged to run locally, it is much cleaner to align all the files to best-practice syntax in a single commit. It is also required for server-side validation. --- .github/workflows/build.yaml | 25 +- .github/workflows/docs.yaml | 17 +- .github/workflows/release.yaml | 30 +- .github/workflows/test.yaml | 34 +- .gitpod.yml | 2 +- .goreleaser.yml | 47 +- .pre-commit-config.yaml | 6 +- CODE_OF_CONDUCT.md | 3 +- LICENSE.GPLv2 | 1 - README.md | 14 +- auth/auth_sqlite.go | 11 +- auth/auth_sqlite_test.go | 5 +- client/client.go | 5 +- client/client_test.go | 5 +- client/config.go | 3 +- client/config_test.go | 5 +- client/options.go | 3 +- cmd/access.go | 5 +- cmd/access_test.go | 3 +- cmd/app.go | 3 +- cmd/app_test.go | 5 +- cmd/config_loader.go | 3 +- cmd/config_loader_test.go | 3 +- cmd/publish.go | 15 +- cmd/publish_test.go | 7 +- cmd/serve.go | 2 +- cmd/subscribe.go | 19 +- cmd/user.go | 24 +- cmd/user_test.go | 5 +- docker-compose.yml | 3 +- docs/config.md | 227 +- docs/deprecations.md | 5 +- docs/develop.md | 52 +- docs/examples.md | 26 +- docs/faq.md | 24 +- docs/index.md | 10 +- docs/install.md | 64 +- docs/integrations.md | 18 +- docs/known-issues.md | 8 +- docs/privacy.md | 2 +- docs/publish.md | 278 +- docs/releases.md | 60 +- docs/static/css/extra.css | 131 +- docs/static/js/extra.js | 136 +- docs/subscribe/api.md | 60 +- docs/subscribe/cli.md | 38 +- docs/subscribe/phone.md | 36 +- docs/subscribe/web.md | 4 +- .../web-example-eventsource/example-sse.html | 88 +- main.go | 5 +- mkdocs.yml | 48 +- scripts/emoji.json | 39341 +++++++--------- scripts/postrm.sh | 1 - server/actions.go | 3 +- server/actions_test.go | 3 +- server/config_test.go | 3 +- server/file_cache.go | 3 +- server/file_cache_test.go | 5 +- server/mailer_emoji.json | 1818 +- server/message_cache.go | 22 +- server/message_cache_test.go | 6 +- server/server_firebase.go | 5 +- server/server_matrix.go | 5 +- server/server_test.go | 2 +- server/smtp_sender.go | 5 +- server/smtp_sender_test.go | 3 +- server/smtp_server.go | 5 +- server/smtp_server_test.go | 5 +- server/topic.go | 3 +- server/util.go | 5 +- server/util_test.go | 3 +- test/server.go | 3 +- tools/fbsend/main.go | 7 +- util/batching_queue_test.go | 5 +- util/content_type_writer_test.go | 3 +- util/embedfs_test.go | 3 +- util/gzip_handler_test.go | 3 +- util/limit.go | 3 +- util/limit_test.go | 3 +- util/peek_test.go | 3 +- util/time.go | 3 +- util/time_test.go | 3 +- web/public/config.js | 4 +- web/public/home.html | 376 +- web/public/index.html | 86 +- web/public/static/css/fonts.css | 48 +- web/public/static/css/home.css | 285 +- web/public/static/js/home.js | 86 +- web/public/static/langs/bg.json | 378 +- web/public/static/langs/cs.json | 378 +- web/public/static/langs/de.json | 378 +- web/public/static/langs/es.json | 378 +- web/public/static/langs/fr.json | 378 +- web/public/static/langs/hu.json | 378 +- web/public/static/langs/id.json | 378 +- web/public/static/langs/it.json | 378 +- web/public/static/langs/ja.json | 378 +- web/public/static/langs/ko.json | 378 +- web/public/static/langs/nb_NO.json | 248 +- web/public/static/langs/nl.json | 378 +- web/public/static/langs/pl.json | 378 +- web/public/static/langs/pt_BR.json | 380 +- web/public/static/langs/ru.json | 312 +- web/public/static/langs/sv.json | 98 +- web/public/static/langs/tr.json | 378 +- web/public/static/langs/uk.json | 378 +- web/public/static/langs/zh_Hans.json | 378 +- web/public/static/langs/zh_Hant.json | 166 +- web/src/app/Api.js | 237 +- web/src/app/Connection.js | 214 +- web/src/app/ConnectionManager.js | 210 +- web/src/app/Notifier.js | 157 +- web/src/app/Poller.js | 86 +- web/src/app/Prefs.js | 42 +- web/src/app/Pruner.js | 49 +- web/src/app/SubscriptionManager.js | 241 +- web/src/app/UserManager.js | 24 +- web/src/app/db.js | 12 +- web/src/app/emojis.js | 14499 +++++- web/src/app/utils.js | 347 +- web/src/components/ActionBar.js | 484 +- web/src/components/App.js | 247 +- web/src/components/AttachmentIcon.js | 72 +- web/src/components/DialogFooter.js | 48 +- web/src/components/EmojiPicker.js | 314 +- web/src/components/ErrorBoundary.js | 245 +- web/src/components/Messaging.js | 219 +- web/src/components/Navigation.js | 486 +- web/src/components/Notifications.js | 1076 +- web/src/components/Preferences.js | 958 +- web/src/components/PublishDialog.js | 1522 +- web/src/components/SubscribeDialog.js | 471 +- .../components/SubscriptionSettingsDialog.js | 111 +- web/src/components/hooks.js | 115 +- web/src/components/i18n.js | 34 +- web/src/components/routes.js | 20 +- web/src/components/styles.js | 14 +- web/src/components/theme.js | 22 +- web/src/img/file-app.svg | 2 +- web/src/img/file-audio.svg | 2 +- web/src/img/file-document.svg | 2 +- web/src/img/file-image.svg | 2 +- web/src/img/file-video.svg | 2 +- web/src/img/ntfy-outline.svg | 2 +- web/src/img/ntfy.svg | 2 +- web/src/img/priority-1.svg | 2 +- web/src/img/priority-2.svg | 2 +- web/src/img/priority-3.svg | 2 +- web/src/img/priority-4.svg | 2 +- web/src/img/priority-5.svg | 2 +- web/src/index.js | 8 +- 151 files changed, 42251 insertions(+), 31034 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c1e2a247..dda61279 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -4,21 +4,17 @@ jobs: build: runs-on: ubuntu-latest steps: - - - name: Install Go + - name: Install Go uses: actions/setup-go@v2 with: - go-version: '1.18.x' - - - name: Install node + go-version: "1.18.x" + - name: Install node uses: actions/setup-node@v2 with: - node-version: '17' - - - name: Checkout code + node-version: "17" + - name: Checkout code uses: actions/checkout@v2 - - - name: Cache Go and npm modules + - name: Cache Go and npm modules uses: actions/cache@v3 with: path: | @@ -28,12 +24,9 @@ jobs: web/node_modules key: ${{ runner.os }}-ntfy-${{ hashFiles('**/go.sum', '**/package.lock') }} restore-keys: ${{ runner.os }}-ntfy- - - - name: Install dependencies + - name: Install dependencies run: make build-deps-ubuntu - - - name: Build all the things + - name: Build all the things run: make build - - - name: Print build results and checksums + - name: Print build results and checksums run: make cli-build-results diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 2ba9b9c6..513f291e 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -7,11 +7,9 @@ jobs: publish-docs: runs-on: ubuntu-latest steps: - - - name: Checkout ntfy code + - name: Checkout ntfy code uses: actions/checkout@v3 - - - name: Checkout docs pages code + - name: Checkout docs pages code uses: actions/checkout@v3 with: repository: binwiederhier/ntfy-docs.github.io @@ -19,18 +17,15 @@ jobs: token: ${{secrets.NTFY_DOCS_PUSH_TOKEN}} # Expires after 1 year, re-generate via # User -> Settings -> Developer options -> Personal Access Tokens -> Fine Grained Token - - - name: Build docs + - name: Build docs run: make docs - - - name: Copy generated docs + - name: Copy generated docs run: rsync -av --exclude CNAME --delete server/docs/ build/ntfy-docs.github.io/docs/ - - - name: Publish docs + - name: Publish docs run: | cd build/ntfy-docs.github.io git config user.name "GitHub Actions Bot" - git config user.email "<>" + git config user.email "<>" git add docs/ git commit -m "Updated docs" git push origin main diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6ce2297b..53ea40a6 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -2,26 +2,22 @@ name: release on: push: tags: - - 'v[0-9]+.[0-9]+.[0-9]+' + - "v[0-9]+.[0-9]+.[0-9]+" jobs: release: runs-on: ubuntu-latest steps: - - - name: Install Go + - name: Install Go uses: actions/setup-go@v2 with: - go-version: '1.18.x' - - - name: Install node + go-version: "1.18.x" + - name: Install node uses: actions/setup-node@v2 with: - node-version: '17' - - - name: Checkout code + node-version: "17" + - name: Checkout code uses: actions/checkout@v2 - - - name: Cache Go and npm modules + - name: Cache Go and npm modules uses: actions/cache@v3 with: path: | @@ -31,20 +27,16 @@ jobs: web/node_modules key: ${{ runner.os }}-ntfy-${{ hashFiles('**/go.sum', '**/package.lock') }} restore-keys: ${{ runner.os }}-ntfy- - - - name: Docker login + - name: Docker login uses: docker/login-action@v2 with: username: ${{ github.repository_owner }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - - - name: Install dependencies + - name: Install dependencies run: make build-deps-ubuntu - - - name: Build and publish + - name: Build and publish run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Print build results and checksums + - name: Print build results and checksums run: make cli-build-results diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 852654ac..958a64a0 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -4,21 +4,17 @@ jobs: test: runs-on: ubuntu-latest steps: - - - name: Install Go + - name: Install Go uses: actions/setup-go@v2 with: - go-version: '1.18.x' - - - name: Install node + go-version: "1.18.x" + - name: Install node uses: actions/setup-node@v2 with: - node-version: '17' - - - name: Checkout code + node-version: "17" + - name: Checkout code uses: actions/checkout@v2 - - - name: Cache Go and npm modules + - name: Cache Go and npm modules uses: actions/cache@v3 with: path: | @@ -28,21 +24,15 @@ jobs: web/node_modules key: ${{ runner.os }}-ntfy-${{ hashFiles('**/go.sum', '**/package.lock') }} restore-keys: ${{ runner.os }}-ntfy- - - - name: Install dependencies + - name: Install dependencies run: make build-deps-ubuntu - - - name: Build docs (required for tests) + - name: Build docs (required for tests) run: make docs - - - name: Build web app (required for tests) + - name: Build web app (required for tests) run: make web - - - name: Run tests, formatting, vetting and linting + - name: Run tests, formatting, vetting and linting run: make check - - - name: Run coverage + - name: Run coverage run: make coverage - - - name: Upload coverage to codecov.io + - name: Upload coverage to codecov.io run: make coverage-upload diff --git a/.gitpod.yml b/.gitpod.yml index 6cccd8f2..2c818b36 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -25,4 +25,4 @@ ports: - name: binary port: 2586 - name: web - port: 3000 \ No newline at end of file + port: 3000 diff --git a/.goreleaser.yml b/.goreleaser.yml index 39642ba4..ba09bcb9 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -3,12 +3,11 @@ before: - go mod download - go mod tidy builds: - - - id: ntfy_linux_amd64 + - id: ntfy_linux_amd64 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - tags: [sqlite_omit_load_extension,osusergo,netgo] + tags: [sqlite_omit_load_extension, osusergo, netgo] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [linux] @@ -16,46 +15,42 @@ builds: hooks: post: - upx "{{ .Path }}" # apt install upx - - - id: ntfy_linux_armv6 + - id: ntfy_linux_armv6 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=arm-linux-gnueabi-gcc # apt install gcc-arm-linux-gnueabi - tags: [sqlite_omit_load_extension,osusergo,netgo] + tags: [sqlite_omit_load_extension, osusergo, netgo] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [linux] goarch: [arm] goarm: [6] # No "upx" for ARM, see https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546 - - - id: ntfy_linux_armv7 + - id: ntfy_linux_armv7 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=arm-linux-gnueabi-gcc # apt install gcc-arm-linux-gnueabi - tags: [sqlite_omit_load_extension,osusergo,netgo] + tags: [sqlite_omit_load_extension, osusergo, netgo] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [linux] goarch: [arm] goarm: [7] # No "upx" for ARM, see https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546 - - - id: ntfy_linux_arm64 + - id: ntfy_linux_arm64 binary: ntfy env: - CGO_ENABLED=1 # required for go-sqlite3 - CC=aarch64-linux-gnu-gcc # apt install gcc-aarch64-linux-gnu - tags: [sqlite_omit_load_extension,osusergo,netgo] + tags: [sqlite_omit_load_extension, osusergo, netgo] ldflags: - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}" goos: [linux] goarch: [arm64] # No "upx" for ARM, see https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546 - - - id: ntfy_windows_amd64 + - id: ntfy_windows_amd64 binary: ntfy env: - CGO_ENABLED=0 # explicitly disable, since we don't need go-sqlite3 @@ -65,8 +60,7 @@ builds: goos: [windows] goarch: [amd64] # No "upx" for Windows to hopefully avoid Virus warnings - - - id: ntfy_darwin_all + - id: ntfy_darwin_all binary: ntfy env: - CGO_ENABLED=0 # explicitly disable, since we don't need go-sqlite3 @@ -76,8 +70,7 @@ builds: goos: [darwin] goarch: [amd64, arm64] # will be combined to "universal binary" (see below) nfpms: - - - package_name: ntfy + - package_name: ntfy homepage: https://heckel.io/ntfy maintainer: Philipp C. Heckel description: Simple pub-sub notification service @@ -111,8 +104,7 @@ nfpms: preremove: "scripts/prerm.sh" postremove: "scripts/postrm.sh" archives: - - - id: ntfy_linux + - id: ntfy_linux builds: - ntfy_linux_amd64 - ntfy_linux_armv6 @@ -128,8 +120,7 @@ archives: - client/ntfy-client.service replacements: amd64: x86_64 - - - id: ntfy_windows + - id: ntfy_windows builds: - ntfy_windows_amd64 format: zip @@ -140,8 +131,7 @@ archives: - client/client.yml replacements: amd64: x86_64 - - - id: ntfy_darwin + - id: ntfy_darwin builds: - ntfy_darwin_all wrap_in_directory: true @@ -152,20 +142,19 @@ archives: replacements: darwin: macOS universal_binaries: - - - id: ntfy_darwin_all + - id: ntfy_darwin_all replace: true name_template: ntfy checksum: - name_template: 'checksums.txt' + name_template: "checksums.txt" snapshot: name_template: "{{ .Tag }}-next" changelog: sort: asc filters: exclude: - - '^docs:' - - '^test:' + - "^docs:" + - "^test:" dockers: - image_templates: - &amd64_image "binwiederhier/ntfy:{{ .Tag }}-amd64" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ba457c1..624a0268 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,8 +1,9 @@ repos: - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v2.7.1" + rev: "v3.0.0-alpha.4" hooks: - id: prettier + exclude_types: [markdown] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: @@ -12,14 +13,13 @@ repos: stages: ["commit"] - repo: https://github.com/Bahjat/pre-commit-golang - rev: v1.0.2 + rev: v1.0.3 hooks: - id: go-fmt-import - id: go-vet - id: go-lint - id: go-unit-tests stages: ["push"] - - id: gofumpt # requires github.com/mvdan/gofumpt - id: golangci-lint # requires github.com/golangci/golangci-lint args: [--config=.github/linters/.golangci.yml] # optional - id: go-ruleguard # requires https://github.com/quasilyte/go-ruleguard diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 863c0996..af359c94 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement via Discord/Matrix (binwiederhier), -or email (ntfy@heckel.io). All complaints will be reviewed and investigated promptly +or email (ntfy@heckel.io). All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the @@ -130,4 +130,3 @@ For answers to common questions about this code of conduct, see the FAQ at [Mozilla CoC]: https://github.com/mozilla/diversity [FAQ]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations - diff --git a/LICENSE.GPLv2 b/LICENSE.GPLv2 index 4bf894c5..411414a6 100644 --- a/LICENSE.GPLv2 +++ b/LICENSE.GPLv2 @@ -337,4 +337,3 @@ proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. - diff --git a/README.md b/README.md index f2f0d249..7426dd5f 100644 --- a/README.md +++ b/README.md @@ -47,13 +47,13 @@ works best for you: * [Email](https://heckel.io/about) - reach me directly (_I usually prefer the other methods_) ## Announcements / beta testers -For announcements of new releases and cutting-edge beta versions, please subscribe to the [ntfy.sh/announcements](https://ntfy.sh/announcements) +For announcements of new releases and cutting-edge beta versions, please subscribe to the [ntfy.sh/announcements](https://ntfy.sh/announcements) topic. If you'd like to test the iOS app, join [TestFlight](https://testflight.apple.com/join/P1fFnAm9). For Android betas, join Discord/Matrix (I'll eventually make a testing channel in Google Play). ## Contributing I welcome any and all contributions. Just create a PR or an issue. For larger features/ideas, please reach out -on Discord/Matrix first to see if I'd accept them. To contribute code, check out the [build instructions](https://ntfy.sh/docs/develop/) +on Discord/Matrix first to see if I'd accept them. To contribute code, check out the [build instructions](https://ntfy.sh/docs/develop/) for the server and the Android app. Or, if you'd like to help translate 🇩🇪 🇺🇸 🇧🇬, you can start immediately in [Hosted Weblate](https://hosted.weblate.org/projects/ntfy/). @@ -62,8 +62,8 @@ for the server and the Android app. Or, if you'd like to help translate 🇩🇪 ## Sponsors -I have just very recently started accepting donations via [GitHub Sponsors](https://github.com/sponsors/binwiederhier). -I would be humbled if you helped me carry the server and developer account costs. Even small donations are very much +I have just very recently started accepting donations via [GitHub Sponsors](https://github.com/sponsors/binwiederhier). +I would be humbled if you helped me carry the server and developer account costs. Even small donations are very much appreciated. A big fat **Thank You** to the folks already sponsoring ntfy: @@ -114,10 +114,10 @@ We as members, contributors, and leaders pledge to make participation in our com **We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.** -_Please be sure to read the complete [Code of Conduct](CODE_OF_CONDUCT.md)._ +_Please be sure to read the complete [Code of Conduct](CODE_OF_CONDUCT.md)._ ## License -Made with ❤️ by [Philipp C. Heckel](https://heckel.io). +Made with ❤️ by [Philipp C. Heckel](https://heckel.io). The project is dual licensed under the [Apache License 2.0](LICENSE) and the [GPLv2 License](LICENSE.GPLv2). Third party libraries and resources: @@ -135,7 +135,7 @@ Third party libraries and resources: * [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) (MIT) is used to provide the persistent message cache * [Firebase Admin SDK](https://github.com/firebase/firebase-admin-go) (Apache 2.0) is used to send FCM messages * [github/gemoji](https://github.com/github/gemoji) (MIT) is used for emoji support (specifically the [emoji.json](https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json) file) -* [Lightbox with vanilla JS](https://yossiabramov.com/blog/vanilla-js-lightbox) as a lightbox on the landing page +* [Lightbox with vanilla JS](https://yossiabramov.com/blog/vanilla-js-lightbox) as a lightbox on the landing page * [HTTP middleware for gzip compression](https://gist.github.com/CJEnright/bc2d8b8dc0c1389a9feeddb110f822d7) (MIT) is used for serving static files * [Regex for auto-linking](https://github.com/bryanwoods/autolink-js) (MIT) is used to highlight links (the library is not used) * [Statically linking go-sqlite3](https://www.arp242.net/static-go.html) diff --git a/auth/auth_sqlite.go b/auth/auth_sqlite.go index f2bad460..615d1dbb 100644 --- a/auth/auth_sqlite.go +++ b/auth/auth_sqlite.go @@ -4,9 +4,10 @@ import ( "database/sql" "errors" "fmt" + "strings" + _ "github.com/mattn/go-sqlite3" // SQLite driver "golang.org/x/crypto/bcrypt" - "strings" ) const ( @@ -24,7 +25,7 @@ const ( role TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS access ( - user TEXT NOT NULL, + user TEXT NOT NULL, topic TEXT NOT NULL, read INT NOT NULL, write INT NOT NULL, @@ -38,8 +39,8 @@ const ( ` selectUserQuery = `SELECT pass, role FROM user WHERE user = ?` selectTopicPermsQuery = ` - SELECT read, write - FROM access + SELECT read, write + FROM access WHERE user IN ('*', ?) AND ? LIKE topic ORDER BY user DESC ` @@ -54,7 +55,7 @@ const ( deleteUserQuery = `DELETE FROM user WHERE user = ?` upsertUserAccessQuery = ` - INSERT INTO access (user, topic, read, write) + INSERT INTO access (user, topic, read, write) VALUES (?, ?, ?, ?) ON CONFLICT (user, topic) DO UPDATE SET read=excluded.read, write=excluded.write ` diff --git a/auth/auth_sqlite_test.go b/auth/auth_sqlite_test.go index 4c1e817c..6e03e122 100644 --- a/auth/auth_sqlite_test.go +++ b/auth/auth_sqlite_test.go @@ -1,12 +1,13 @@ package auth_test import ( - "github.com/stretchr/testify/require" - "heckel.io/ntfy/auth" "path/filepath" "strings" "testing" "time" + + "github.com/stretchr/testify/require" + "heckel.io/ntfy/auth" ) const minBcryptTimingMillis = int64(50) // Ideally should be >100ms, but this should also run on a Raspberry Pi without massive resources diff --git a/client/client.go b/client/client.go index b744fa11..a4b519cf 100644 --- a/client/client.go +++ b/client/client.go @@ -7,13 +7,14 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" "io" "net/http" "strings" "sync" "time" + + "heckel.io/ntfy/log" + "heckel.io/ntfy/util" ) // Event type constants diff --git a/client/client_test.go b/client/client_test.go index 4ce00670..2236013e 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -2,11 +2,12 @@ package client_test import ( "fmt" + "testing" + "time" + "github.com/stretchr/testify/require" "heckel.io/ntfy/client" "heckel.io/ntfy/test" - "testing" - "time" ) func TestClient_Publish_Subscribe(t *testing.T) { diff --git a/client/config.go b/client/config.go index b2efc1d0..9e66f9a2 100644 --- a/client/config.go +++ b/client/config.go @@ -1,8 +1,9 @@ package client import ( - "gopkg.in/yaml.v2" "os" + + "gopkg.in/yaml.v2" ) const ( diff --git a/client/config_test.go b/client/config_test.go index 0a71c3bb..2ec012b4 100644 --- a/client/config_test.go +++ b/client/config_test.go @@ -1,11 +1,12 @@ package client_test import ( - "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" "os" "path/filepath" "testing" + + "github.com/stretchr/testify/require" + "heckel.io/ntfy/client" ) func TestConfig_Load(t *testing.T) { diff --git a/client/options.go b/client/options.go index fdcbe1d2..10e86259 100644 --- a/client/options.go +++ b/client/options.go @@ -2,10 +2,11 @@ package client import ( "fmt" - "heckel.io/ntfy/util" "net/http" "strings" "time" + + "heckel.io/ntfy/util" ) // RequestOption is a generic request option that can be added to Client calls diff --git a/cmd/access.go b/cmd/access.go index 9bd65f84..433b1533 100644 --- a/cmd/access.go +++ b/cmd/access.go @@ -5,6 +5,7 @@ package cmd import ( "errors" "fmt" + "github.com/urfave/cli/v2" "heckel.io/ntfy/auth" "heckel.io/ntfy/util" @@ -50,7 +51,7 @@ Arguments: to define access rules for anonymous/unauthenticated clients TOPIC name of a topic with optional wildcards, e.g. "mytopic*" PERMISSION one of the following: - - read-write (alias: rw) + - read-write (alias: rw) - read-only (aliases: read, ro) - write-only (aliases: write, wo) - deny (alias: none) @@ -60,7 +61,7 @@ Examples: ntfy access phil # Shows access for user phil ntfy access phil mytopic rw # Allow read-write access to mytopic for user phil ntfy access everyone mytopic rw # Allow anonymous read-write access to mytopic - ntfy access everyone "up*" write # Allow anonymous write-only access to topics "up..." + ntfy access everyone "up*" write # Allow anonymous write-only access to topics "up..." ntfy access --reset # Reset entire access control list ntfy access --reset phil # Reset all access for user phil ntfy access --reset phil mytopic # Reset access for user phil and topic mytopic diff --git a/cmd/access_test.go b/cmd/access_test.go index 67159d43..6907d61f 100644 --- a/cmd/access_test.go +++ b/cmd/access_test.go @@ -2,11 +2,12 @@ package cmd import ( "fmt" + "testing" + "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/server" "heckel.io/ntfy/test" - "testing" ) func TestCLI_Access_Show(t *testing.T) { diff --git a/cmd/app.go b/cmd/app.go index 975fd2fa..499b919c 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -2,10 +2,11 @@ package cmd import ( + "os" + "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "heckel.io/ntfy/log" - "os" ) const ( diff --git a/cmd/app_test.go b/cmd/app_test.go index 9873dd09..f6168513 100644 --- a/cmd/app_test.go +++ b/cmd/app_test.go @@ -3,11 +3,12 @@ package cmd import ( "bytes" "encoding/json" - "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" "os" "strings" "testing" + + "github.com/urfave/cli/v2" + "heckel.io/ntfy/client" ) // This only contains helpers so far diff --git a/cmd/config_loader.go b/cmd/config_loader.go index 9f0a5769..93a1349e 100644 --- a/cmd/config_loader.go +++ b/cmd/config_loader.go @@ -2,11 +2,12 @@ package cmd import ( "fmt" + "os" + "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "gopkg.in/yaml.v2" "heckel.io/ntfy/util" - "os" ) // initConfigFileInputSourceFunc is like altsrc.InitInputSourceWithContext and altsrc.NewYamlSourceFromFlagFunc, but checks diff --git a/cmd/config_loader_test.go b/cmd/config_loader_test.go index 7a7f2bf1..45235300 100644 --- a/cmd/config_loader_test.go +++ b/cmd/config_loader_test.go @@ -1,10 +1,11 @@ package cmd import ( - "github.com/stretchr/testify/require" "os" "path/filepath" "testing" + + "github.com/stretchr/testify/require" ) func TestNewYamlSourceFromFile(t *testing.T) { diff --git a/cmd/publish.go b/cmd/publish.go index 7a561973..bee274c1 100644 --- a/cmd/publish.go +++ b/cmd/publish.go @@ -3,16 +3,17 @@ package cmd import ( "errors" "fmt" - "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" "io" "os" "os/exec" "path/filepath" "strings" "time" + + "github.com/urfave/cli/v2" + "heckel.io/ntfy/client" + "heckel.io/ntfy/log" + "heckel.io/ntfy/util" ) func init() { @@ -72,11 +73,11 @@ Examples: ntfy pub --wait-pid 1234 mytopic # Wait for process 1234 to exit before publishing ntfy pub --wait-cmd mytopic rsync -av ./ /tmp/a # Run command and publish after it completes NTFY_USER=phil:mypass ntfy pub secret Psst # Use env variables to set username/password - NTFY_TOPIC=mytopic ntfy pub "some message" # Use NTFY_TOPIC variable as topic + NTFY_TOPIC=mytopic ntfy pub "some message" # Use NTFY_TOPIC variable as topic cat flower.jpg | ntfy pub --file=- flowers 'Nice!' # Same as above, send image.jpg as attachment ntfy trigger mywebhook # Sending without message, useful for webhooks - -Please also check out the docs on publishing messages. Especially for the --tags and --delay options, + +Please also check out the docs on publishing messages. Especially for the --tags and --delay options, it has incredibly useful information: https://ntfy.sh/docs/publish/. ` + clientCommandDescriptionSuffix, diff --git a/cmd/publish_test.go b/cmd/publish_test.go index f818cdc3..ed3658ec 100644 --- a/cmd/publish_test.go +++ b/cmd/publish_test.go @@ -2,14 +2,15 @@ package cmd import ( "fmt" - "github.com/stretchr/testify/require" - "heckel.io/ntfy/test" - "heckel.io/ntfy/util" "os" "os/exec" "strconv" "testing" "time" + + "github.com/stretchr/testify/require" + "heckel.io/ntfy/test" + "heckel.io/ntfy/util" ) func TestCLI_Publish_Subscribe_Poll_Real_Server(t *testing.T) { diff --git a/cmd/serve.go b/cmd/serve.go index ecc4d4a1..dc562ef4 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -86,7 +86,7 @@ var cmdServe = &cli.Command{ Before: initConfigFileInputSourceFunc("config", flagsServe, initLogFunc), Description: `Run the ntfy server and listen for incoming requests -The command will load the configuration from /etc/ntfy/server.yml. Config options can +The command will load the configuration from /etc/ntfy/server.yml. Config options can be overridden using the command line options. Examples: diff --git a/cmd/subscribe.go b/cmd/subscribe.go index 7bfb6123..428ebb1d 100644 --- a/cmd/subscribe.go +++ b/cmd/subscribe.go @@ -3,16 +3,17 @@ package cmd import ( "errors" "fmt" - "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" "os" "os/exec" "os/user" "path/filepath" "sort" "strings" + + "github.com/urfave/cli/v2" + "heckel.io/ntfy/client" + "heckel.io/ntfy/log" + "heckel.io/ntfy/util" ) func init() { @@ -44,20 +45,20 @@ var cmdSubscribe = &cli.Command{ Category: categoryClient, Flags: flagsSubscribe, Before: initLogFunc, - Description: `Subscribe to a topic from a ntfy server, and either print or execute a command for + Description: `Subscribe to a topic from a ntfy server, and either print or execute a command for every arriving message. There are 3 modes in which the command can be run: ntfy subscribe TOPIC This prints the JSON representation of every incoming message. It is useful when you have a command that wants to stream-read incoming JSON messages. Unless --poll is passed, - this command stays open forever. + this command stays open forever. Examples: ntfy subscribe mytopic # Prints JSON for incoming messages for ntfy.sh/mytopic ntfy sub home.lan/backups # Subscribe to topic on different server ntfy sub --poll home.lan/backups # Just query for latest messages and exit ntfy sub -u phil:mypass secret # Subscribe with username/password - + ntfy subscribe TOPIC COMMAND This executes COMMAND for every incoming messages. The message fields are passed to the command as environment variables: @@ -78,10 +79,10 @@ ntfy subscribe TOPIC COMMAND ntfy sub topic1 myscript.sh # Execute script for incoming messages ntfy subscribe --from-config - Service mode (used in ntfy-client.service). This reads the config file and sets up + Service mode (used in ntfy-client.service). This reads the config file and sets up subscriptions for every topic in the "subscribe:" block (see config file). - Examples: + Examples: ntfy sub --from-config # Read topics from config file ntfy sub --config=myclient.yml --from-config # Read topics from alternate config file diff --git a/cmd/user.go b/cmd/user.go index 052c0800..7c11d6d5 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -50,11 +50,11 @@ granted otherwise by the auth-default-access setting). An admin user has read an topics. Examples: - ntfy user add phil # Add regular user phil + ntfy user add phil # Add regular user phil ntfy user add --role=admin phil # Add admin user phil NTFY_PASSWORD=... ntfy user add phil # Add user, using env variable to set password (for scripts) -You may set the NTFY_PASSWORD environment variable to pass the password. This is useful if +You may set the NTFY_PASSWORD environment variable to pass the password. This is useful if you are creating users via scripts. `, }, @@ -79,13 +79,13 @@ Example: Description: `Change the password for the given user. The new password will be read from STDIN, and it'll be confirmed by typing -it twice. +it twice. Example: ntfy user change-pass phil NTFY_PASSWORD=.. ntfy user change-pass phil -You may set the NTFY_PASSWORD environment variable to pass the new password. This is +You may set the NTFY_PASSWORD environment variable to pass the new password. This is useful if you are updating users via scripts. `, @@ -104,12 +104,12 @@ to an admin user, or the other way around: - admin: an admin has read/write access to all topics - user: a regular user only has access to what was explicitly granted via 'ntfy access' -When changing the role of a user to "admin", all access control entries for that +When changing the role of a user to "admin", all access control entries for that user are removed, since they are no longer necessary. Example: - ntfy user change-role phil admin # Make user phil an admin - ntfy user change-role phil user # Remove admin role from user phil + ntfy user change-role phil admin # Make user phil an admin + ntfy user change-role phil user # Remove admin role from user phil `, }, { @@ -120,7 +120,7 @@ Example: Description: `Shows a list of all configured users, including the everyone ('*') user. This is a server-only command. It directly reads from the user.db as defined in the server config -file server.yml. The command only works if 'auth-file' is properly defined. +file server.yml. The command only works if 'auth-file' is properly defined. This command is an alias to calling 'ntfy access' (display access control list). `, @@ -132,18 +132,18 @@ This is a server-only command. It directly manages the user.db as defined in the file server.yml. The command only works if 'auth-file' is properly defined. Please also refer to the related command 'ntfy access'. -The command allows you to add/remove/change users in the ntfy user database, as well as change +The command allows you to add/remove/change users in the ntfy user database, as well as change passwords or roles. Examples: - ntfy user list # Shows list of users (alias: 'ntfy access') - ntfy user add phil # Add regular user phil + ntfy user list # Shows list of users (alias: 'ntfy access') + ntfy user add phil # Add regular user phil NTFY_PASSWORD=... ntfy user add phil # As above, using env variable to set password (for scripts) ntfy user add --role=admin phil # Add admin user phil ntfy user del phil # Delete user phil ntfy user change-pass phil # Change password for user phil NTFY_PASSWORD=.. ntfy user change-pass phil # As above, using env variable to set password (for scripts) - ntfy user change-role phil admin # Make user phil an admin + ntfy user change-role phil admin # Make user phil an admin For the 'ntfy user add' and 'ntfy user change-pass' commands, you may set the NTFY_PASSWORD environment variable to pass the new password. This is useful if you are creating/updating users via scripts. diff --git a/cmd/user_test.go b/cmd/user_test.go index 666cb422..7517db31 100644 --- a/cmd/user_test.go +++ b/cmd/user_test.go @@ -1,12 +1,13 @@ package cmd import ( + "path/filepath" + "testing" + "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" "heckel.io/ntfy/server" "heckel.io/ntfy/test" - "path/filepath" - "testing" ) func TestCLI_User_Add(t *testing.T) { diff --git a/docker-compose.yml b/docker-compose.yml index d39492e8..8e4e8267 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: command: - serve environment: - - TZ=UTC # optional: Change to your desired timezone + - TZ=UTC # optional: Change to your desired timezone user: UID:GID # optional: Set custom user/group or uid/gid volumes: - /var/cache/ntfy:/var/cache/ntfy @@ -14,4 +14,3 @@ services: ports: - 80:80 restart: unless-stopped - diff --git a/docs/config.md b/docs/config.md index f91054a0..beae3e66 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1,10 +1,10 @@ # Configuring the ntfy server -The ntfy server can be configured in three ways: using a config file (typically at `/etc/ntfy/server.yml`, -see [server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml)), via command line arguments +The ntfy server can be configured in three ways: using a config file (typically at `/etc/ntfy/server.yml`, +see [server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml)), via command line arguments or using environment variables. ## Quick start -By default, simply running `ntfy serve` will start the server at port 80. No configuration needed. Batteries included 😀. +By default, simply running `ntfy serve` will start the server at port 80. No configuration needed. Batteries included 😀. If everything works as it should, you'll see something like this: ``` $ ntfy serve @@ -12,7 +12,7 @@ $ ntfy serve ``` You can immediately start [publishing messages](publish.md), or subscribe via the [Android app](subscribe/phone.md), -[the web UI](subscribe/web.md), or simply via [curl or your favorite HTTP client](subscribe/api.md). To configure +[the web UI](subscribe/web.md), or simply via [curl or your favorite HTTP client](subscribe/api.md). To configure the server further, check out the [config options table](#config-options) or simply type `ntfy serve --help` to get a list of [command line options](#command-line-options). @@ -46,7 +46,7 @@ Here are a few working sample configs: === "server.yml (ntfy.sh config)" ``` yaml - # All the things: Behind a proxy, Firebase, cache, attachments, + # All the things: Behind a proxy, Firebase, cache, attachments, # SMTP publishing & receiving base-url: "https://ntfy.sh" @@ -68,14 +68,14 @@ Here are a few working sample configs: ## Message cache If desired, ntfy can temporarily keep notifications in an in-memory or an on-disk cache. Caching messages for a short period of time is important to allow [phones](subscribe/phone.md) and other devices with brittle Internet connections to be able to retrieve -notifications that they may have missed. +notifications that they may have missed. By default, ntfy keeps messages **in-memory for 12 hours**, which means that **cached messages do not survive an application restart**. You can override this behavior using the following config settings: * `cache-file`: if set, ntfy will store messages in a SQLite based cache (default is empty, which means in-memory cache). **This is required if you'd like messages to be retained across restarts**. -* `cache-duration`: defines the duration for which messages are stored in the cache (default is `12h`). +* `cache-duration`: defines the duration for which messages are stored in the cache (default is `12h`). You can also entirely disable the cache by setting `cache-duration` to `0`. When the cache is disabled, messages are only passed on to the connected subscribers, but never stored on disk or even kept in memory longer than is needed to forward @@ -86,11 +86,11 @@ Subscribers can retrieve cached messaging using the [`poll=1` parameter](subscri ## Attachments If desired, you may allow users to upload and [attach files to notifications](publish.md#attachments). To enable -this feature, you have to simply configure an attachment cache directory and a base URL (`attachment-cache-dir`, `base-url`). +this feature, you have to simply configure an attachment cache directory and a base URL (`attachment-cache-dir`, `base-url`). Once these options are set and the directory is writable by the server user, you can upload attachments via PUT. By default, attachments are stored in the disk-cache **for only 3 hours**. The main reason for this is to avoid legal issues -and such when hosting user controlled content. Typically, this is more than enough time for the user (or the auto download +and such when hosting user controlled content. Typically, this is more than enough time for the user (or the auto download feature) to download the file. The following config options are relevant to attachments: * `base-url` is the root URL for the ntfy server; this is needed for the generated attachment URLs @@ -99,7 +99,7 @@ feature) to download the file. The following config options are relevant to atta * `attachment-file-size-limit` is the per-file attachment size limit (e.g. 300k, 2M, 100M, default: 15M) * `attachment-expiry-duration` is the duration after which uploaded attachments will be deleted (e.g. 3h, 20h, default: 3h) -Here's an example config using mostly the defaults (except for the cache directory, which is empty by default): +Here's an example config using mostly the defaults (except for the cache directory, which is empty by default): === "/etc/ntfy/server.yml (minimal)" ``` yaml @@ -123,27 +123,27 @@ and `visitor-attachment-daily-bandwidth-limit`. Setting these conservatively is ## Access control By default, the ntfy server is open for everyone, meaning **everyone can read and write to any topic** (this is how -ntfy.sh is configured). To restrict access to your own server, you can optionally configure authentication and authorization. +ntfy.sh is configured). To restrict access to your own server, you can optionally configure authentication and authorization. -ntfy's auth is implemented with a simple [SQLite](https://www.sqlite.org/)-based backend. It implements two roles -(`user` and `admin`) and per-topic `read` and `write` permissions using an [access control list (ACL)](https://en.wikipedia.org/wiki/Access-control_list). -Access control entries can be applied to users as well as the special everyone user (`*`), which represents anonymous API access. +ntfy's auth is implemented with a simple [SQLite](https://www.sqlite.org/)-based backend. It implements two roles +(`user` and `admin`) and per-topic `read` and `write` permissions using an [access control list (ACL)](https://en.wikipedia.org/wiki/Access-control_list). +Access control entries can be applied to users as well as the special everyone user (`*`), which represents anonymous API access. To set up auth, simply **configure the following two options**: -* `auth-file` is the user/access database; it is created automatically if it doesn't already exist; suggested +* `auth-file` is the user/access database; it is created automatically if it doesn't already exist; suggested location `/var/lib/ntfy/user.db` (easiest if deb/rpm package is used) * `auth-default-access` defines the default/fallback access if no access control entry is found; it can be set to `read-write` (default), `read-only`, `write-only` or `deny-all`. Once configured, you can use the `ntfy user` command to [add or modify users](#users-and-roles), and the `ntfy access` command -lets you [modify the access control list](#access-control-list-acl) for specific users and topic patterns. Both of these -commands **directly edit the auth database** (as defined in `auth-file`), so they only work on the server, and only if the user +lets you [modify the access control list](#access-control-list-acl) for specific users and topic patterns. Both of these +commands **directly edit the auth database** (as defined in `auth-file`), so they only work on the server, and only if the user accessing them has the right permissions. ### Users and roles The `ntfy user` command allows you to add/remove/change users in the ntfy user database, as well as change -passwords or roles (`user` or `admin`). In practice, you'll often just create one admin +passwords or roles (`user` or `admin`). In practice, you'll often just create one admin user with `ntfy user add --role=admin ...` and be done with all this (see [example below](#example-private-instance)). **Roles:** @@ -156,7 +156,7 @@ user with `ntfy user add --role=admin ...` and be done with all this (see [examp ``` ntfy user list # Shows list of users (alias: 'ntfy access') -ntfy user add phil # Add regular user phil +ntfy user add phil # Add regular user phil ntfy user add --role=admin phil # Add admin user phil ntfy user del phil # Delete user phil ntfy user change-pass phil # Change password for user phil @@ -165,7 +165,7 @@ ntfy user change-role phil admin # Make user phil an admin ### Access control list (ACL) The access control list (ACL) **manages access to topics for non-admin users, and for anonymous access (`everyone`/`*`)**. -Each entry represents the access permissions for a user to a specific topic or topic pattern. +Each entry represents the access permissions for a user to a specific topic or topic pattern. The ACL can be displayed or modified with the `ntfy access` command: @@ -175,20 +175,20 @@ ntfy access USERNAME # Shows access control entries for USERNA ntfy access USERNAME TOPIC PERMISSION # Allow/deny access for USERNAME to TOPIC ``` -A `USERNAME` is an existing user, as created with `ntfy user add` (see [users and roles](#users-and-roles)), or the +A `USERNAME` is an existing user, as created with `ntfy user add` (see [users and roles](#users-and-roles)), or the anonymous user `everyone` or `*`, which represents clients that access the API without username/password. A `TOPIC` is either a specific topic name (e.g. `mytopic`, or `phil_alerts`), or a wildcard pattern that matches any -number of topics (e.g. `alerts_*` or `ben-*`). Only the wildcard character `*` is supported. It stands for zero to any +number of topics (e.g. `alerts_*` or `ben-*`). Only the wildcard character `*` is supported. It stands for zero to any number of characters. A `PERMISSION` is any of the following supported permissions: -* `read-write` (alias: `rw`): Allows [publishing messages](publish.md) to the given topic, as well as +* `read-write` (alias: `rw`): Allows [publishing messages](publish.md) to the given topic, as well as [subscribing](subscribe/api.md) and reading messages * `read-only` (aliases: `read`, `ro`): Allows only subscribing and reading messages, but not publishing to the topic * `write-only` (aliases: `write`, `wo`): Allows only publishing to the topic, but not subscribing to it -* `deny` (alias: `none`): Allows neither publishing nor subscribing to a topic +* `deny` (alias: `none`): Allows neither publishing nor subscribing to a topic **Example commands** (type `ntfy access --help` for more details): ``` @@ -237,10 +237,10 @@ After that, simply create an `admin` user: $ ntfy user add --role=admin phil password: mypass confirm: mypass -user phil added with role admin +user phil added with role admin ``` -Once you've done that, you can publish and subscribe using [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) +Once you've done that, you can publish and subscribe using [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) with the given username/password. Be sure to use HTTPS to avoid eavesdropping and exposing your password. Here's a simple example: === "Command line (curl)" @@ -301,7 +301,7 @@ with the given username/password. Be sure to use HTTPS to avoid eavesdropping an file_get_contents('https://ntfy.example.com/mysecrets', false, stream_context_create([ 'http' => [ 'method' => 'POST', // PUT also works - 'header' => + 'header' => 'Content-Type: text/plain\r\n' . 'Authorization: Basic cGhpbDpteXBhc3M=', 'content' => 'Look ma, with auth' @@ -310,12 +310,12 @@ with the given username/password. Be sure to use HTTPS to avoid eavesdropping an ``` ### Example: UnifiedPush -[UnifiedPush](https://unifiedpush.org) requires that the [application server](https://unifiedpush.org/spec/definitions/#application-server) (e.g. Synapse, Fediverse Server, …) -has anonymous write access to the [topic](https://unifiedpush.org/spec/definitions/#endpoint) used for push messages. -The topic names used by UnifiedPush all start with the `up*` prefix. Please refer to the +[UnifiedPush](https://unifiedpush.org) requires that the [application server](https://unifiedpush.org/spec/definitions/#application-server) (e.g. Synapse, Fediverse Server, …) +has anonymous write access to the [topic](https://unifiedpush.org/spec/definitions/#endpoint) used for push messages. +The topic names used by UnifiedPush all start with the `up*` prefix. Please refer to the **[UnifiedPush documentation](https://unifiedpush.org/users/distributors/ntfy/#limit-access-to-some-users)** for more details. -To enable support for UnifiedPush for private servers (i.e. `auth-default-access: "deny-all"`), you should either +To enable support for UnifiedPush for private servers (i.e. `auth-default-access: "deny-all"`), you should either allow anonymous write access for the entire prefix or explicitly per topic: === "Prefix" @@ -329,11 +329,11 @@ allow anonymous write access for the entire prefix or explicitly per topic: ``` ## E-mail notifications -To allow forwarding messages via e-mail, you can configure an **SMTP server for outgoing messages**. Once configured, -you can set the `X-Email` header to [send messages via e-mail](publish.md#e-mail-notifications) (e.g. +To allow forwarding messages via e-mail, you can configure an **SMTP server for outgoing messages**. Once configured, +you can set the `X-Email` header to [send messages via e-mail](publish.md#e-mail-notifications) (e.g. `curl -d "hi there" -H "X-Email: phil@example.com" ntfy.sh/mytopic`). -As of today, only SMTP servers with PLAIN auth and STARTLS are supported. To enable e-mail sending, you must set the +As of today, only SMTP servers with PLAIN auth and STARTLS are supported. To enable e-mail sending, you must set the following settings: * `base-url` is the root URL for the ntfy server; this is needed for e-mail footer @@ -341,7 +341,7 @@ following settings: * `smtp-sender-user` and `smtp-sender-pass` are the username and password of the SMTP user * `smtp-sender-from` is the e-mail address of the sender -Here's an example config using [Amazon SES](https://aws.amazon.com/ses/) for outgoing mail (this is how it is +Here's an example config using [Amazon SES](https://aws.amazon.com/ses/) for outgoing mail (this is how it is configured for `ntfy.sh`): === "/etc/ntfy/server.yml" @@ -353,13 +353,13 @@ configured for `ntfy.sh`): smtp-sender-from: "ntfy@ntfy.sh" ``` -Please also refer to the [rate limiting](#rate-limiting) settings below, specifically `visitor-email-limit-burst` +Please also refer to the [rate limiting](#rate-limiting) settings below, specifically `visitor-email-limit-burst` and `visitor-email-limit-burst`. Setting these conservatively is necessary to avoid abuse. ## E-mail publishing -To allow publishing messages via e-mail, ntfy can run a lightweight **SMTP server for incoming messages**. Once configured, -users can [send emails to a topic e-mail address](publish.md#e-mail-publishing) (e.g. `mytopic@ntfy.sh` or -`myprefix-mytopic@ntfy.sh`) to publish messages to a topic. This is useful for e-mail based integrations such as for +To allow publishing messages via e-mail, ntfy can run a lightweight **SMTP server for incoming messages**. Once configured, +users can [send emails to a topic e-mail address](publish.md#e-mail-publishing) (e.g. `mytopic@ntfy.sh` or +`myprefix-mytopic@ntfy.sh`) to publish messages to a topic. This is useful for e-mail based integrations such as for statuspage.io (though these days most services also support webhooks and HTTP calls). To configure the SMTP server, you must at least set `smtp-server-listen` and `smtp-server-domain`: @@ -379,8 +379,8 @@ Here's an example config (this is how it is configured for `ntfy.sh`): smtp-server-addr-prefix: "ntfy-" ``` -In addition to configuring the ntfy server, you have to create two DNS records (an [MX record](https://en.wikipedia.org/wiki/MX_record) -and a corresponding A record), so incoming mail will find its way to your server. Here's an example of how `ntfy.sh` is +In addition to configuring the ntfy server, you have to create two DNS records (an [MX record](https://en.wikipedia.org/wiki/MX_record) +and a corresponding A record), so incoming mail will find its way to your server. Here's an example of how `ntfy.sh` is configured (in [Amazon Route 53](https://aws.amazon.com/route53/)):
@@ -388,7 +388,7 @@ configured (in [Amazon Route 53](https://aws.amazon.com/route53/)):
DNS records for incoming mail
-You can check if everything is working correctly by sending an email as raw SMTP via `nc`. Create a text file, e.g. +You can check if everything is working correctly by sending an email as raw SMTP via `nc`. Create a text file, e.g. `email.txt` ``` @@ -403,7 +403,7 @@ Hello from 🇩🇪 . ``` -And then send the mail via `nc` like this. If you see any lines starting with `451`, those are errors from the +And then send the mail via `nc` like this. If you see any lines starting with `451`, those are errors from the ntfy server. Read them carefully. ``` @@ -418,9 +418,9 @@ $ cat email.txt | nc -N ntfy.sh 25 As for the DNS setup, be sure to verify that `dig MX` and `dig A` are returning results similar to this: ``` -$ dig MX ntfy.sh +short +$ dig MX ntfy.sh +short 10 mx1.ntfy.sh. -$ dig A mx1.ntfy.sh +short +$ dig A mx1.ntfy.sh +short 3.139.215.220 ``` @@ -429,12 +429,12 @@ $ dig A mx1.ntfy.sh +short If you are running ntfy behind a proxy, you must set the `behind-proxy` flag. Otherwise, all visitors are [rate limited](#rate-limiting) as if they are one. -It may be desirable to run ntfy behind a proxy (e.g. nginx, HAproxy or Apache), so you can provide TLS certificates -using Let's Encrypt using certbot, or simply because you'd like to share the ports (80/443) with other services. -Whatever your reasons may be, there are a few things to consider. +It may be desirable to run ntfy behind a proxy (e.g. nginx, HAproxy or Apache), so you can provide TLS certificates +using Let's Encrypt using certbot, or simply because you'd like to share the ports (80/443) with other services. +Whatever your reasons may be, there are a few things to consider. -If you are running ntfy behind a proxy, you should set the `behind-proxy` flag. This will instruct the -[rate limiting](#rate-limiting) logic to use the `X-Forwarded-For` header as the primary identifier for a visitor, +If you are running ntfy behind a proxy, you should set the `behind-proxy` flag. This will instruct the +[rate limiting](#rate-limiting) logic to use the `X-Forwarded-For` header as the primary identifier for a visitor, as opposed to the remote IP address. If the `behind-proxy` flag is not set, all visitors will be counted as one, because from the perspective of the ntfy server, they all share the proxy's IP address. @@ -445,17 +445,17 @@ be counted as one, because from the perspective of the ntfy server, they all sha ``` ### TLS/SSL -ntfy supports HTTPS/TLS by setting the `listen-https` [config option](#config-options). However, if you +ntfy supports HTTPS/TLS by setting the `listen-https` [config option](#config-options). However, if you are behind a proxy, it is recommended that TLS/SSL termination is done by the proxy itself (see below). -I highly recommend using [certbot](https://certbot.eff.org/). I use it with the [dns-route53 plugin](https://certbot-dns-route53.readthedocs.io/en/stable/), +I highly recommend using [certbot](https://certbot.eff.org/). I use it with the [dns-route53 plugin](https://certbot-dns-route53.readthedocs.io/en/stable/), which lets you use [AWS Route 53](https://aws.amazon.com/route53/) as the challenge. That's much easier than using the HTTP challenge. I've found [this guide](https://nandovieira.com/using-lets-encrypt-in-development-with-nginx-and-aws-route53) to be incredibly helpful. ### nginx/Apache2/caddy For your convenience, here's a working config that'll help configure things behind a proxy. Be sure to **enable WebSockets** -by forwarding the `Connection` and `Upgrade` headers accordingly. +by forwarding the `Connection` and `Upgrade` headers accordingly. In this example, ntfy runs on `:2586` and we proxy traffic to it. We also redirect HTTP to HTTPS for GET requests against a topic or the root domain: @@ -474,7 +474,7 @@ or the root domain: server_name ntfy.sh; location / { - # Redirect HTTP to HTTPS, but only for GET topic addresses, since we want + # Redirect HTTP to HTTPS, but only for GET topic addresses, since we want # it to work with curl without the annoying https:// prefix set $redirect_https ""; if ($request_method = GET) { @@ -489,16 +489,16 @@ or the root domain: proxy_pass http://127.0.0.1:2586; proxy_http_version 1.1; - + proxy_buffering off; proxy_request_buffering off; proxy_redirect off; - + proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - + proxy_connect_timeout 3m; proxy_send_timeout 3m; proxy_read_timeout 3m; @@ -506,19 +506,19 @@ or the root domain: client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml } } - + server { listen 443 ssl; server_name ntfy.sh; - + ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; - + ssl_certificate /etc/letsencrypt/live/ntfy.sh/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ntfy.sh/privkey.pem; - + location / { proxy_pass http://127.0.0.1:2586; proxy_http_version 1.1; @@ -526,16 +526,16 @@ or the root domain: proxy_buffering off; proxy_request_buffering off; proxy_redirect off; - + proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - + proxy_connect_timeout 3m; proxy_send_timeout 3m; proxy_read_timeout 3m; - + client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml } } @@ -547,7 +547,7 @@ or the root domain: # # This config requires the use of the -L flag in curl to redirect to HTTPS, and it keeps nginx output buffering # enabled. While recommended, I have had issues with that in the past. - + server { listen 80; server_name ntfy.sh; @@ -570,19 +570,19 @@ or the root domain: client_max_body_size 20m; # Must be >= attachment-file-size-limit in /etc/ntfy/server.yml } } - + server { listen 443 ssl; server_name ntfy.sh; - + ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; - + ssl_certificate /etc/letsencrypt/live/ntfy.sh/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ntfy.sh/privkey.pem; - + location / { proxy_pass http://127.0.0.1:2586; proxy_http_version 1.1; @@ -625,16 +625,16 @@ or the root domain: RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] RewriteRule ^/?(.*) "ws://127.0.0.1:2586/$1" [P,L] - - # Redirect HTTP to HTTPS, but only for GET topic addresses, since we want - # it to work with curl without the annoying https:// prefix + + # Redirect HTTP to HTTPS, but only for GET topic addresses, since we want + # it to work with curl without the annoying https:// prefix RewriteCond %{REQUEST_METHOD} GET RewriteRule ^/([-_A-Za-z0-9]{0,64})$ https://%{SERVER_NAME}/$1 [R,L] - + ServerName ntfy.sh - + SSLEngine on SSLCertificateFile /etc/letsencrypt/live/ntfy.sh/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/ntfy.sh/privkey.pem @@ -647,7 +647,7 @@ or the root domain: SetEnv proxy-nokeepalive 1 SetEnv proxy-sendchunked 1 - # Higher than the max message size of 4096 bytes + # Higher than the max message size of 4096 bytes LimitRequestBody 102400 # Enable mod_rewrite (requires "a2enmod rewrite") @@ -656,7 +656,7 @@ or the root domain: # WebSockets support (requires "a2enmod rewrite proxy_wstunnel") RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] - RewriteRule ^/?(.*) "ws://127.0.0.1:2586/$1" [P,L] + RewriteRule ^/?(.*) "ws://127.0.0.1:2586/$1" [P,L] ``` @@ -707,10 +707,10 @@ firebase-key-file: "/etc/ntfy/ntfy-sh-firebase-adminsdk-ahnce-9f4d6f14b5.json" ``` ## iOS instant notifications -Unlike Android, iOS heavily restricts background processing, which sadly makes it impossible to implement instant -push notifications without a central server. +Unlike Android, iOS heavily restricts background processing, which sadly makes it impossible to implement instant +push notifications without a central server. -To still support instant notifications on iOS through your self-hosted ntfy server, you have to forward so called `poll_request` +To still support instant notifications on iOS through your self-hosted ntfy server, you have to forward so called `poll_request` messages to the main ntfy.sh server (or any upstream server that's APNS/Firebase connected, if you build your own iOS app), which will then forward it to Firebase/APNS. @@ -726,12 +726,12 @@ the message ID of the original message, instructing the iOS app to poll this ser If `upstream-base-url` is not set, notifications will still eventually get to your device, but delivery can take hours, depending on the state of the phone. If you are using your phone, it shouldn't take more than 20-30 minutes though. -In case you're curious, here's an example of the entire flow: +In case you're curious, here's an example of the entire flow: - In the iOS app, you subscribe to `https://ntfy.example.com/mytopic` - The app subscribes to the Firebase topic `6de73be8dfb7d69e...` (the SHA256 of the topic URL) -- When you publish a message to `https://ntfy.example.com/mytopic`, your ntfy server will publish a - poll request to `https://ntfy.sh/6de73be8dfb7d69e...`. The request from your server to the upstream server +- When you publish a message to `https://ntfy.example.com/mytopic`, your ntfy server will publish a + poll request to `https://ntfy.sh/6de73be8dfb7d69e...`. The request from your server to the upstream server contains only the message ID (in the `X-Poll-ID` header), and the SHA256 checksum of the topic URL (as upstream topic). - The ntfy.sh server publishes the poll request message to Firebase, which forwards it to APNS, which forwards it to your iOS device - Your iOS device receives the poll request, and fetches the actual message from your server, and then displays it @@ -743,21 +743,21 @@ curl -X POST -H "X-Poll-ID: s4PdJozxM8na" https://ntfy.sh/6de73be8dfb7d69e32fb2c {"id":"4HsClFEuCIcs","time":1654087955,"event":"poll_request","topic":"6de73be8dfb7d69e32fb2c00c23fe7adbd8b5504406e3068c273aa24cef4055b","message":"New message","poll_id":"s4PdJozxM8na"} ``` -Note that the self-hosted server literally sends the message `New message` for every message, even if your message -may be `Some other message`. This is so that if iOS cannot talk to the self-hosted server (in time, or at all), +Note that the self-hosted server literally sends the message `New message` for every message, even if your message +may be `Some other message`. This is so that if iOS cannot talk to the self-hosted server (in time, or at all), it'll show `New message` as a popup. ## Rate limiting !!! info - Be aware that if you are running ntfy behind a proxy, you must set the `behind-proxy` flag. + Be aware that if you are running ntfy behind a proxy, you must set the `behind-proxy` flag. Otherwise, all visitors are rate limited as if they are one. By default, ntfy runs without authentication, so it is vitally important that we protect the server from abuse or overload. There are various limits and rate limits in place that you can use to configure the server: * **Global limit**: A global limit applies across all visitors (IPs, clients, users) -* **Visitor limit**: A visitor limit only applies to a certain visitor. A **visitor** is identified by its IP address - (or the `X-Forwarded-For` header if `behind-proxy` is set). All config options that start with the word `visitor` apply +* **Visitor limit**: A visitor limit only applies to a certain visitor. A **visitor** is identified by its IP address + (or the `X-Forwarded-For` header if `behind-proxy` is set). All config options that start with the word `visitor` apply only on a per-visitor basis. During normal usage, you shouldn't encounter these limits at all, and even if you burst a few requests or emails @@ -773,39 +773,39 @@ Let's do the easy limits first: In addition to the limits above, there is a requests/second limit per visitor for all sensitive GET/PUT/POST requests. This limit uses a [token bucket](https://en.wikipedia.org/wiki/Token_bucket) (using Go's [rate package](https://pkg.go.dev/golang.org/x/time/rate)): -Each visitor has a bucket of 60 requests they can fire against the server (defined by `visitor-request-limit-burst`). +Each visitor has a bucket of 60 requests they can fire against the server (defined by `visitor-request-limit-burst`). After the 60, new requests will encounter a `429 Too Many Requests` response. The visitor request bucket is refilled at a rate of one request every 5s (defined by `visitor-request-limit-replenish`) * `visitor-request-limit-burst` is the initial bucket of requests each visitor has. This defaults to 60. * `visitor-request-limit-replenish` is the rate at which the bucket is refilled (one request per x). Defaults to 5s. -* `visitor-request-limit-exempt-hosts` is a comma-separated list of hostnames and IPs to be exempt from request rate +* `visitor-request-limit-exempt-hosts` is a comma-separated list of hostnames and IPs to be exempt from request rate limiting; hostnames are resolved at the time the server is started. Defaults to an empty list. - + ### Attachment limits -Aside from the global file size and total attachment cache limits (see [above](#attachments)), there are two relevant +Aside from the global file size and total attachment cache limits (see [above](#attachments)), there are two relevant per-visitor limits: * `visitor-attachment-total-size-limit` is the total storage limit used for attachments per visitor. It defaults to 100M. - The per-visitor storage is automatically decreased as attachments expire. External attachments (attached via `X-Attach`, - see [publishing docs](publish.md#attachments)) do not count here. -* `visitor-attachment-daily-bandwidth-limit` is the total daily attachment download/upload bandwidth limit per visitor, + The per-visitor storage is automatically decreased as attachments expire. External attachments (attached via `X-Attach`, + see [publishing docs](publish.md#attachments)) do not count here. +* `visitor-attachment-daily-bandwidth-limit` is the total daily attachment download/upload bandwidth limit per visitor, including PUT and GET requests. This is to protect your precious bandwidth from abuse, since egress costs money in most cloud providers. This defaults to 500M. ### E-mail limits -Similarly to the request limit, there is also an e-mail limit (only relevant if [e-mail notifications](#e-mail-notifications) +Similarly to the request limit, there is also an e-mail limit (only relevant if [e-mail notifications](#e-mail-notifications) are enabled): * `visitor-email-limit-burst` is the initial bucket of emails each visitor has. This defaults to 16. * `visitor-email-limit-replenish` is the rate at which the bucket is refilled (one email per x). Defaults to 1h. ### Firebase limits -If [Firebase is configured](#firebase-fcm), all messages are also published to a Firebase topic (unless `Firebase: no` +If [Firebase is configured](#firebase-fcm), all messages are also published to a Firebase topic (unless `Firebase: no` is set). Firebase enforces [its own limits](https://firebase.google.com/docs/cloud-messaging/concept-options#topics_throttling) -on how many messages can be published. Unfortunately these limits are a little vague and can change depending on the time -of day. In practice, I have only ever observed `429 Quota exceeded` responses from Firebase if **too many messages are published to -the same topic**. +on how many messages can be published. Unfortunately these limits are a little vague and can change depending on the time +of day. In practice, I have only ever observed `429 Quota exceeded` responses from Firebase if **too many messages are published to +the same topic**. In ntfy, if Firebase responds with a 429 after publishing to a topic, the visitor (= IP address) who published the message is **banned from publishing to Firebase for 10 minutes** (not configurable). Because publishing to Firebase happens asynchronously, @@ -828,7 +828,7 @@ Depending on *how you run it*, here are a few limits that are relevant: ### Message cache By default, the [message cache](#message-cache) (defined by `cache-file`) uses the SQLite default settings, which means it syncs to disk on every write. For personal servers, this is perfectly adequate. For larger installations, such as ntfy.sh, -the [write-ahead log (WAL)](https://sqlite.org/wal.html) should be enabled, and the sync mode should be adjusted. +the [write-ahead log (WAL)](https://sqlite.org/wal.html) should be enabled, and the sync mode should be adjusted. See [this article](https://phiresky.github.io/blog/2020/sqlite-performance-tuning/) for details. In addition to that, for very high load servers (such as ntfy.sh), it may be beneficial to write messages to the cache @@ -900,7 +900,7 @@ If you put stuff on the Internet, bad actors will try to break them or break in. and nginx's [ngx_http_limit_req_module module](http://nginx.org/en/docs/http/ngx_http_limit_req_module.html) can be used to ban client IPs if they misbehave. This is on top of the [rate limiting](#rate-limiting) inside the ntfy server. -Here's an example for how ntfy.sh is configured, following the instructions from two tutorials ([here](https://easyengine.io/tutorials/nginx/fail2ban/) +Here's an example for how ntfy.sh is configured, following the instructions from two tutorials ([here](https://easyengine.io/tutorials/nginx/fail2ban/) and [here](https://easyengine.io/tutorials/nginx/block-wp-login-php-bruteforce-attack/)): === "/etc/nginx/nginx.conf" @@ -933,7 +933,7 @@ and [here](https://easyengine.io/tutorials/nginx/block-wp-login-php-bruteforce-a location / { limit_req zone=one burst=1000 nodelay; } - } + } ``` === "/etc/fail2ban/filter.d/nginx-req-limit.conf" @@ -957,15 +957,15 @@ and [here](https://easyengine.io/tutorials/nginx/block-wp-login-php-bruteforce-a ## Debugging/tracing If something's not working right, you can debug/trace through what the ntfy server is doing by setting the `log-level` -to `DEBUG` or `TRACE`. The `DEBUG` setting will output information about each published message, but not the message -contents. The `TRACE` setting will also print the message contents. +to `DEBUG` or `TRACE`. The `DEBUG` setting will output information about each published message, but not the message +contents. The `TRACE` setting will also print the message contents. !!! warning - Both options are very verbose and should only be enabled in production for short periods of time. Otherwise, + Both options are very verbose and should only be enabled in production for short periods of time. Otherwise, you're going to run out of disk space pretty quickly. You can also hot-reload the `log-level` by sending the `SIGHUP` signal to the process after editing the `server.yml` file. -You can do so by calling `systemctl reload ntfy` (if ntfy is running inside systemd), or by calling `kill -HUP $(pidof ntfy)`. +You can do so by calling `systemctl reload ntfy` (if ntfy is running inside systemd), or by calling `kill -HUP $(pidof ntfy)`. If successful, you'll see something like this: ``` @@ -981,8 +981,8 @@ CLI option (e.g. `--listen-http :80`. Here's a list of all available options. Al variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). !!! info - All config options can also be defined in the `server.yml` file using underscores instead of dashes, e.g. - `cache_duration` and `cache-duration` are both supported. This is to support stricter YAML parsers that do + All config options can also be defined in the `server.yml` file using underscores instead of dashes, e.g. + `cache_duration` and `cache-duration` are both supported. This is to support stricter YAML parsers that do not support dashes. | Config option | Env variable | Format | Default | Description | @@ -1028,7 +1028,7 @@ variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). | `visitor-subscription-limit` | `NTFY_VISITOR_SUBSCRIPTION_LIMIT` | *number* | 30 | Rate limiting: Number of subscriptions per visitor (IP address) | | `web-root` | `NTFY_WEB_ROOT` | `app`, `home` or `disable` | `app` | Sets web root to landing page (home), web app (app) or disables the web app entirely (disable) | -The format for a *duration* is: `(smh)`, e.g. 30s, 20m or 1h. +The format for a *duration* is: `(smh)`, e.g. 30s, 20m or 1h. The format for a *size* is: `(GMK)`, e.g. 1G, 200M or 4000k. ## Command line options @@ -1045,10 +1045,10 @@ CATEGORY: DESCRIPTION: Run the ntfy server and listen for incoming requests - - The command will load the configuration from /etc/ntfy/server.yml. Config options can + + The command will load the configuration from /etc/ntfy/server.yml. Config options can be overridden using the command line options. - + Examples: ntfy serve # Starts server in the foreground (on port 80) ntfy serve --listen-http :8080 # Starts server with alternate port @@ -1065,7 +1065,7 @@ OPTIONS: --cache-duration since, --cache_duration since, -b since buffer messages for this time to allow since requests (default: 12h0m0s) [$NTFY_CACHE_DURATION] --cache-file value, --cache_file value, -C value cache file used for message caching [$NTFY_CACHE_FILE] --cache-batch-size value, --cache_batch_size value max size of messages to batch together when writing to message cache (if zero, writes are synchronous) (default: 0) [$NTFY_BATCH_SIZE] - --cache-batch-timeout value, --cache_batch_timeout value timeout for batched async writes to the message cache (if zero, writes are synchronous) (default: 0s) [$NTFY_CACHE_BATCH_TIMEOUT] + --cache-batch-timeout value, --cache_batch_timeout value timeout for batched async writes to the message cache (if zero, writes are synchronous) (default: 0s) [$NTFY_CACHE_BATCH_TIMEOUT] --cache-startup-queries value, --cache_startup_queries value queries run when the cache database is initialized [$NTFY_CACHE_STARTUP_QUERIES] --cert-file value, --cert_file value, -E value certificate file, if listen-https is set [$NTFY_CERT_FILE] --config value, -c value config file (default: /etc/ntfy/server.yml) [$NTFY_CONFIG_FILE] @@ -1099,4 +1099,3 @@ OPTIONS: --visitor-subscription-limit value, --visitor_subscription_limit value number of subscriptions per visitor (default: 30) [$NTFY_VISITOR_SUBSCRIPTION_LIMIT] --web-root value, --web_root value sets web root to landing page (home), web app (app) or disabled (disable) (default: "app") [$NTFY_WEB_ROOT] ``` - diff --git a/docs/deprecations.md b/docs/deprecations.md index 8cbc997a..7d8f8bbf 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -1,5 +1,5 @@ # Deprecation notices -This page is used to list deprecation notices for ntfy. Deprecated commands and options will be +This page is used to list deprecation notices for ntfy. Deprecated commands and options will be **removed after 1-3 months** from the time they were deprecated. How long the feature is deprecated before the behavior is changed depends on the severity of the change, and how prominent the feature is. @@ -34,7 +34,7 @@ and add a notice banner in the Android app instead. ### Android app: Using `since=` instead of `since=` > Active since 2022-02-27, behavior changed with v1.14.0 -The Android app started using `since=` instead of `since=`, which means as of Android app v1.14.0, +The Android app started using `since=` instead of `since=`, which means as of Android app v1.14.0, it will not work with servers older than v1.16.0 anymore. This is to simplify handling of deduplication in the Android app. The `since=` endpoint will continue to work. This is merely a notice that the Android app behavior will change. @@ -57,4 +57,3 @@ just the server. $ ntfy serve 2021/12/17 08:16:01 Listening on :80/http ``` - diff --git a/docs/develop.md b/docs/develop.md index 23a6c1bb..38438314 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -1,26 +1,26 @@ # Development Hurray 🥳 🎉, you are interested in writing code for ntfy! **That's awesome.** 😎 -I tried my very best to write up detailed instructions, but if at any point in time you run into issues, don't +I tried my very best to write up detailed instructions, but if at any point in time you run into issues, don't hesitate to **contact me on [Discord](https://discord.gg/cT7ECsZj9w) or [Matrix](https://matrix.to/#/#ntfy:matrix.org)**. ## ntfy server The ntfy server source code is available [on GitHub](https://github.com/binwiederhier/ntfy). The codebase for the server consists of three components: -* **The main server/client** is written in [Go](https://go.dev/) (so you'll need Go). Its main entrypoint is at - [main.go](https://github.com/binwiederhier/ntfy/blob/main/main.go), and the meat you're likely interested in is - in [server.go](https://github.com/binwiederhier/ntfy/blob/main/server/server.go). Notably, the server uses a - [SQLite](https://sqlite.org) library called [go-sqlite3](https://github.com/mattn/go-sqlite3), which requires +* **The main server/client** is written in [Go](https://go.dev/) (so you'll need Go). Its main entrypoint is at + [main.go](https://github.com/binwiederhier/ntfy/blob/main/main.go), and the meat you're likely interested in is + in [server.go](https://github.com/binwiederhier/ntfy/blob/main/server/server.go). Notably, the server uses a + [SQLite](https://sqlite.org) library called [go-sqlite3](https://github.com/mattn/go-sqlite3), which requires [Cgo](https://go.dev/blog/cgo) and `CGO_ENABLED=1` to be set. Otherwise things will not work (see below). * **The documentation** is generated by [MkDocs](https://www.mkdocs.org/) and [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/), which is written in [Python](https://www.python.org/). You'll need Python and MkDocs (via `pip`) only if you want to build the docs. * **The web app** is written in [React](https://reactjs.org/), using [MUI](https://mui.com/). It uses [Create React App](https://create-react-app.dev/) - to build the production build. If you want to modify the web app, you need [nodejs](https://nodejs.org/en/) (for `npm`) + to build the production build. If you want to modify the web app, you need [nodejs](https://nodejs.org/en/) (for `npm`) and install all the 100,000 dependencies (*sigh*). -All of these components are built and then **baked into one binary**. +All of these components are built and then **baked into one binary**. ### Navigating the code Code: @@ -44,7 +44,7 @@ The `web/` and `docs/` folder are the sources for web app and documentation. Dur the generated output is copied to `server/site` (web app and landing page) and `server/docs` (documentation). ### Build/test on Gitpod -To get a quick working development environment you can use [Gitpod](https://gitpod.io), an in-browser IDE +To get a quick working development environment you can use [Gitpod](https://gitpod.io), an in-browser IDE that makes it easy to develop ntfy without having to set up a desktop IDE. For any real development, I do suggest a proper IDE like [IntelliJ IDEA](https://www.jetbrains.com/idea/). @@ -57,7 +57,7 @@ I do suggest a proper IDE like [IntelliJ IDEA](https://www.jetbrains.com/idea/). * [Make](https://www.gnu.org/software/make/) (required for convenience) * [libsqlite3/libsqlite3-dev](https://www.sqlite.org/) (required for main server, for SQLite cgo-based bindings) * [GoReleaser](https://goreleaser.com/) (required for a proper main server build) -* [Python](https://www.python.org/) (for `pip`, only to build the docs) +* [Python](https://www.python.org/) (for `pip`, only to build the docs) * [nodejs](https://nodejs.org/en/) (for `npm`, only to build the web app) ### Install dependencies @@ -107,16 +107,16 @@ Now check out via git from the [GitHub repository](https://github.com/binwiederh === "via SSH" ``` shell - git clone git@github.com:binwiederhier/ntfy.git + git clone git@github.com:binwiederhier/ntfy.git cd ntfy ``` ### Build all the things -Now you can finally build everything. There are tons of `make` targets, so maybe just review what's there first +Now you can finally build everything. There are tons of `make` targets, so maybe just review what's there first by typing `make`: ``` shell -$ make +$ make Typical commands (more see below): make build - Build web app, documentation and server/client (sloowwww) make cli-linux-amd64 - Build server/client binary (amd64, no web app or docs) @@ -127,20 +127,20 @@ Typical commands (more see below): ... ``` -If you want to build the **ntfy binary including web app and docs for all supported architectures** (amd64, armv7, and arm64), +If you want to build the **ntfy binary including web app and docs for all supported architectures** (amd64, armv7, and arm64), you can simply run `make build`: ``` shell $ make build ... -# This builds web app, docs, and the ntfy binary (for amd64, armv7 and arm64). +# This builds web app, docs, and the ntfy binary (for amd64, armv7 and arm64). # This will be SLOW (5+ minutes on my laptop on the first run). Maybe look at the other make targets? ``` You'll see all the outputs in the `dist/` folder afterwards: ``` bash -$ find dist +$ find dist dist dist/metadata.json dist/ntfy_arm64_linux_arm64 @@ -153,7 +153,7 @@ dist/config.yaml dist/artifacts.json ``` -If you also want to build the **Debian/RPM packages and the Docker images for all supported architectures**, you can +If you also want to build the **Debian/RPM packages and the Docker images for all supported architectures**, you can use the `make release-snapshot` target: ``` shell @@ -188,7 +188,7 @@ $ make cli-linux-amd64 install-linux-amd64 $ ntfy serve ``` -**During development of the main app, you can also just use `go run main.go`**, as long as you run +**During development of the main app, you can also just use `go run main.go`**, as long as you run `make cli-deps-static-sites`at least once and `CGO_ENABLED=1`: ``` shell @@ -209,11 +209,11 @@ This is because we use `go:embed` to embed the documentation and web app, so the present at `server/docs` and `server/site`. If they are not, you'll see the above error. The `cli-deps-static-sites` target creates dummy files that ensure that you'll be able to build. -While not officially supported (or released), you can build and run the server **on macOS** as well. Simply run +While not officially supported (or released), you can build and run the server **on macOS** as well. Simply run `make cli-darwin-server` to build a binary, or `go run main.go serve` (see above) to run it. ### Build the web app -The sources for the web app live in `web/`. As long as you have `npm` installed (see above), building the web app +The sources for the web app live in `web/`. As long as you have `npm` installed (see above), building the web app is really simple. Just type `make web` and you're in business: ``` shell @@ -221,11 +221,11 @@ $ make web ... ``` -This will build the web app using Create React App and then **copy the production build to the `server/site` folder**, so +This will build the web app using Create React App and then **copy the production build to the `server/site` folder**, so that when you `make cli` (or `make cli-linux-amd64`, ...), you will have the web app included in the `ntfy` binary. If you're developing on the web app, it's best to just `cd web` and run `npm start` manually. This will open your browser -at `http://127.0.0.1:3000` with the web app, and as you edit the source files, they will be recompiled and the browser +at `http://127.0.0.1:3000` with the web app, and as you edit the source files, they will be recompiled and the browser will automatically refresh: ``` shell @@ -234,7 +234,7 @@ $ npm start ``` ### Build the docs -The sources for the docs live in `docs/`. Similarly to the web app, you can simply run `make docs` to build the +The sources for the docs live in `docs/`. Similarly to the web app, you can simply run `make docs` to build the documentation. As long as you have `mkdocs` installed (see above), this should work fine: ``` shell @@ -242,8 +242,8 @@ $ make docs ... ``` -If you are changing the documentation, you should be running `mkdocs serve` directly. This will build the documentation, -serve the files at `http://127.0.0.1:8000/`, and rebuild every time you save the source files: +If you are changing the documentation, you should be running `mkdocs serve` directly. This will build the documentation, +serve the files at `http://127.0.0.1:8000/`, and rebuild every time you save the source files: ``` $ mkdocs serve @@ -269,8 +269,8 @@ The Android app has two flavors: * [build.gradle](https://github.com/binwiederhier/ntfy-android/blob/main/app/build.gradle) - Main build file ### IDE/Environment -You should download [Android Studio](https://developer.android.com/studio) (or [IntelliJ IDEA](https://www.jetbrains.com/idea/) -with the relevant Android plugins). Everything else will just be a pain for you. Do yourself a favor. 😀 +You should download [Android Studio](https://developer.android.com/studio) (or [IntelliJ IDEA](https://www.jetbrains.com/idea/) +with the relevant Android plugins). Everything else will just be a pain for you. Do yourself a favor. 😀 ### Check out the code First check out the repository: diff --git a/docs/examples.md b/docs/examples.md index b9adf443..849dacca 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -33,10 +33,10 @@ GitHub have been hopeless. In case it ever becomes available, I want to know imm ## Low disk space alerts -Here's a simple cronjob that I use to alert me when the disk space on the root disk is running low. It's simple, but -effective. +Here's a simple cronjob that I use to alert me when the disk space on the root disk is running low. It's simple, but +effective. -``` bash +``` bash #!/bin/bash mingigs=10 @@ -78,7 +78,7 @@ to notify yourself on SSH login. ## Collect data from multiple machines The other day I was running tasks on 20 servers, and I wanted to collect the interim results -as a CSV in one place. Each of the servers was publishing to a topic as the results completed (`publish-result.sh`), +as a CSV in one place. Each of the servers was publishing to a topic as the results completed (`publish-result.sh`), and I had one central collector to grab the results as they came in (`collect-results.sh`). It looked something like this: @@ -89,10 +89,10 @@ It looked something like this: [ -n "$result" ] && echo "$result" >> results.csv done < <(stdbuf -i0 -o0 curl -s ntfy.sh/results/raw) ``` -=== "publish-result.sh" +=== "publish-result.sh" ```bash // This script was run on each of the 20 servers. It was doing heavy processing ... - + // Publish script results curl -d "$(hostname),$count,$time" ntfy.sh/results ``` @@ -136,7 +136,7 @@ You can send a message during a workflow run with curl. Here is an example sendi ``` ## Watchtower (shoutrrr) -You can use [shoutrrr](https://github.com/containrrr/shoutrrr) generic webhook support to send +You can use [shoutrrr](https://github.com/containrrr/shoutrrr) generic webhook support to send [Watchtower](https://github.com/containrrr/watchtower/) notifications to your ntfy topic. Example docker-compose.yml: @@ -156,7 +156,7 @@ shoutrrr send -u "generic+https://ntfy.sh/my_watchtower_topic?title=WatchtowerUp ## Sonarr, Radarr, Lidarr, Readarr, Prowlarr, SABnzbd It's possible to use custom scripts for all the *arr services, plus SABnzbd. Notifications for downloads, warnings, grabs etc. -Some simple bash scripts to achieve this are kindly provided in [nickexyz's repository](https://github.com/nickexyz/ntfy-shellscripts). +Some simple bash scripts to achieve this are kindly provided in [nickexyz's repository](https://github.com/nickexyz/ntfy-shellscripts). ## Node-RED You can use the HTTP request node to send messages with [Node-RED](https://nodered.org), some examples: @@ -503,7 +503,7 @@ Select **Alert Contact Type** = Webhook. Then set your desired **Friendly Name** { "topic":"myTopic", "title": "*monitorFriendlyName* *alertTypeFriendlyName*", - "message": "*alertDetails*", + "message": "*alertDetails*", "tags": ["green_circle"], "priority": 3, "click": https://uptimerobot.com/dashboard#*monitorID* @@ -515,7 +515,7 @@ You can create two Alert Contacts each with a different icon and priority, for e { "topic":"myTopic", "title": "*monitorFriendlyName* *alertTypeFriendlyName*", - "message": "*alertDetails*", + "message": "*alertDetails*", "tags": ["red_circle"], "priority": 3, "click": https://uptimerobot.com/dashboard#*monitorID* @@ -529,7 +529,7 @@ You can now add the created Alerts Contact(s) to the monitor(s) and test the not ## Apprise -ntfy is integrated natively into [Apprise](https://github.com/caronc/apprise) (also check out the +ntfy is integrated natively into [Apprise](https://github.com/caronc/apprise) (also check out the [Apprise/ntfy wiki page](https://github.com/caronc/apprise/wiki/Notify_ntfy)). You can use it like this: @@ -548,7 +548,7 @@ apprise -vv -t "Test Message Title" -b "Test Message Body" \ ## Rundeck -Rundeck by default sends only HTML email which is not processed by ntfy SMTP server. Append following configurations to +Rundeck by default sends only HTML email which is not processed by ntfy SMTP server. Append following configurations to [rundeck-config.properties](https://docs.rundeck.com/docs/administration/configuration/config-file-reference.html) : ``` @@ -570,5 +570,3 @@ Example `template.html`: Add notification on Rundeck (attachment type must be: `Attached as file to email`): ![Rundeck](static/img/rundeck.png) - - diff --git a/docs/faq.md b/docs/faq.md index 4eb17b98..38be6399 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -8,15 +8,15 @@ Yes. As long as you don't abuse it, it'll be available and free of charge. While server without signup and free of charge, I may also offer paid plans in the future. ## What are the uptime guarantees? -Best effort. +Best effort. ntfy currently runs on a single DigitalOcean droplet, without any scale out strategy or redundancies. When the time comes, I'll add scale out features, but for now it is what it is. -In the first year of its life, and to this day (Dec'22), ntfy had **no outages** that I can remember. Other than short -blips and some HTTP 500 spikes, it has been rock solid. +In the first year of its life, and to this day (Dec'22), ntfy had **no outages** that I can remember. Other than short +blips and some HTTP 500 spikes, it has been rock solid. -There is a [status page](https://ntfy.statuspage.io/) which is updated based on some automated checks via the amazingly +There is a [status page](https://ntfy.statuspage.io/) which is updated based on some automated checks via the amazingly awesome [healthchecks.io](https://healthchecks.io/) (_no affiliation, just a fan_). ## What happens if there are multiple subscribers to the same topic? @@ -25,7 +25,7 @@ As per usual with pub-sub, all subscribers receive notifications if they are sub ## Will you know what topics exist, can you spy on me? If you don't trust me or your messages are sensitive, run your own server. It's open source. That said, the logs do contain topic names and IP addresses, but I don't use them for anything other than -troubleshooting and rate limiting. Messages are cached for the duration configured in `server.yml` (12h by default) +troubleshooting and rate limiting. Messages are cached for the duration configured in `server.yml` (12h by default) to facilitate service restarts, message polling and to overcome client network disruptions. ## Can I self-host it? @@ -35,16 +35,16 @@ your own server as well. Check out the [install instructions](install.md). ## Is Firebase used? In addition to caching messages locally and delivering them to long-polling subscribers, all messages are also published to Firebase Cloud Messaging (FCM) (if `FirebaseKeyFile` is set, which it is on ntfy.sh). This -is to facilitate notifications on Android. +is to facilitate notifications on Android. If you do not care for Firebase, I suggest you install the [F-Droid version](https://f-droid.org/en/packages/io.heckel.ntfy/) of the app and [self-host your own ntfy server](install.md). ## How much battery does the Android app use? -If you use the ntfy.sh server, and you don't use the [instant delivery](subscribe/phone.md#instant-delivery) feature, -the Android/iOS app uses no additional battery, since Firebase Cloud Messaging (FCM) is used. If you use your own server, -or you use *instant delivery* (Android only), the app has to maintain a constant connection to the server, which consumes -about 0-1% of battery in 17h of use (on my phone). There has been a ton of testing and improvement around this. I think it's pretty +If you use the ntfy.sh server, and you don't use the [instant delivery](subscribe/phone.md#instant-delivery) feature, +the Android/iOS app uses no additional battery, since Firebase Cloud Messaging (FCM) is used. If you use your own server, +or you use *instant delivery* (Android only), the app has to maintain a constant connection to the server, which consumes +about 0-1% of battery in 17h of use (on my phone). There has been a ton of testing and improvement around this. I think it's pretty decent now. ## What is instant delivery? @@ -63,10 +63,10 @@ it, or hopefully, somebody else will come along and help out. Please review the ## Can I disable the web app? Can I protect it with a login screen? The web app is a static website without a backend (other than the ntfy API). All data is stored locally in the browser -cache and local storage. That means it does not need to be protected with a login screen, and it poses no additional +cache and local storage. That means it does not need to be protected with a login screen, and it poses no additional security risk. So technically, it does not need to be disabled. -However, if you still want to disable it, you can do so with the `web-root: disable` option in the `server.yml` file. +However, if you still want to disable it, you can do so with the `web-root: disable` option in the `server.yml` file. Think of the ntfy web app like an Android/iOS app. It is freely available and accessible to anyone, yet useless without a proper backend. So as long as you secure your backend with ACLs, exposing the ntfy web app to the Internet is harmless. diff --git a/docs/index.md b/docs/index.md index 27314f1a..5042f125 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,8 +9,8 @@ or POST requests. I use it to notify myself when scripts fail, or long-running c To [receive notifications on your phone](subscribe/phone.md), install the app, either via Google Play or F-Droid. Once installed, open it and subscribe to a topic of your choosing. Topics don't have to explicitly be created, so just -pick a name and use it later when you [publish a message](publish.md). Note that **topic names are public, so it's wise -to choose something that cannot be guessed easily.** +pick a name and use it later when you [publish a message](publish.md). Note that **topic names are public, so it's wise +to choose something that cannot be guessed easily.** For this guide, we'll just use `mytopic` as our topic name: @@ -23,7 +23,7 @@ That's it. After you tap "Subscribe", the app is listening for new messages on t ## Step 2: Send a message Now let's [send a message](publish.md) to our topic. It's easy in every language, since we're just using HTTP PUT/POST, -or with the [ntfy CLI](install.md). The message is in the request body. Here's an example showing how to publish a +or with the [ntfy CLI](install.md). The message is in the request body. Here's an example showing how to publish a simple message using a POST request: === "Command line (curl)" @@ -40,7 +40,7 @@ simple message using a POST request: ``` http POST /mytopic HTTP/1.1 Host: ntfy.sh - + Backup successful 😀 ``` @@ -91,5 +91,3 @@ Here's another video showing the entire process:
Sending push notifications to your Android phone
- - diff --git a/docs/install.md b/docs/install.md index 77c9aefd..bbfe764b 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,7 +1,7 @@ # Installing ntfy The `ntfy` CLI allows you to [publish messages](publish.md), [subscribe to topics](subscribe/cli.md) as well as to -self-host your own ntfy server. It's all pretty straight forward. Just install the binary, package or Docker image, -configure it and run it. Just like any other software. No fuzz. +self-host your own ntfy server. It's all pretty straight forward. Just install the binary, package or Docker image, +configure it and run it. Just like any other software. No fuzz. !!! info The following steps are only required if you want to **self-host your own ntfy server or you want to use the ntfy CLI**. @@ -18,7 +18,7 @@ We support amd64, armv7 and arm64. To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` when using the deb/rpm). To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI](subscribe/cli.md) -for details). +for details). ## Linux binaries Please check out the [releases page](https://github.com/binwiederhier/ntfy/releases) for binaries and @@ -69,7 +69,7 @@ Installation via Debian repository: curl -fsSL https://archive.heckel.io/apt/pubkey.txt | sudo gpg --dearmor -o /etc/apt/keyrings/archive.heckel.io.gpg sudo apt install apt-transport-https sudo sh -c "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/archive.heckel.io.gpg] https://archive.heckel.io/apt debian main' \ - > /etc/apt/sources.list.d/archive.heckel.io.list" + > /etc/apt/sources.list.d/archive.heckel.io.list" sudo apt update sudo apt install ntfy sudo systemctl enable ntfy @@ -141,7 +141,7 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_linux_amd64.rpm - sudo systemctl enable ntfy + sudo systemctl enable ntfy sudo systemctl start ntfy ``` @@ -155,14 +155,14 @@ Manually installing the .deb file: === "armv7/armhf" ```bash sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_linux_armv7.rpm - sudo systemctl enable ntfy + sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "arm64" ```bash sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_linux_arm64.rpm - sudo systemctl enable ntfy + sudo systemctl enable ntfy sudo systemctl start ntfy ``` @@ -185,35 +185,35 @@ ntfy is packaged in nixpkgs as `ntfy-sh`. It can be installed by adding the pack nix-env -iA ntfy-sh ``` -NixOS also supports [declarative setup of the ntfy server](https://search.nixos.org/options?channel=unstable&show=services.ntfy-sh.enable&from=0&size=50&sort=relevance&type=packages&query=ntfy). +NixOS also supports [declarative setup of the ntfy server](https://search.nixos.org/options?channel=unstable&show=services.ntfy-sh.enable&from=0&size=50&sort=relevance&type=packages&query=ntfy). ## macOS -The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on macOS as well. -To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_macOS_all.tar.gz), -extract it and place it somewhere in your `PATH` (e.g. `/usr/local/bin/ntfy`). +The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on macOS as well. +To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_macOS_all.tar.gz), +extract it and place it somewhere in your `PATH` (e.g. `/usr/local/bin/ntfy`). -If run as `root`, ntfy will look for its config at `/etc/ntfy/client.yml`. For all other users, it'll look for it at +If run as `root`, ntfy will look for its config at `/etc/ntfy/client.yml`. For all other users, it'll look for it at `~/Library/Application Support/ntfy/client.yml` (sample included in the tarball). ```bash curl -L https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_macOS_all.tar.gz > ntfy_1.29.1_macOS_all.tar.gz tar zxvf ntfy_1.29.1_macOS_all.tar.gz sudo cp -a ntfy_1.29.1_macOS_all/ntfy /usr/local/bin/ntfy -mkdir ~/Library/Application\ Support/ntfy +mkdir ~/Library/Application\ Support/ntfy cp ntfy_1.29.1_macOS_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml ntfy --help ``` !!! info There is a [GitHub issue](https://github.com/binwiederhier/ntfy/issues/286) about making ntfy installable via - [Homebrew](https://brew.sh/). I'll eventually get to that, but I'd also love if somebody else stepped up to do it. - Also, you can build and run the ntfy server on macOS as well, though I don't officially support that. + [Homebrew](https://brew.sh/). I'll eventually get to that, but I'd also love if somebody else stepped up to do it. + Also, you can build and run the ntfy server on macOS as well, though I don't officially support that. Check out the [build instructions](develop.md) for details. ## Windows The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on Windows as well. To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v1.29.1/ntfy_1.29.1_windows_x86_64.zip), -extract it and place the `ntfy.exe` binary somewhere in your `%Path%`. +extract it and place the `ntfy.exe` binary somewhere in your `%Path%`. The default path for the client config file is at `%AppData%\ntfy\client.yml` (not created automatically, sample in the ZIP file). @@ -226,15 +226,15 @@ Also available in [Scoop's](https://scoop.sh) Main repository: [GitHub issue](https://github.com/binwiederhier/ntfy/issues) to let me know. ## Docker -The [ntfy image](https://hub.docker.com/r/binwiederhier/ntfy) is available for amd64, armv6, armv7 and arm64. It should +The [ntfy image](https://hub.docker.com/r/binwiederhier/ntfy) is available for amd64, armv6, armv7 and arm64. It should be pretty straight forward to use. -The server exposes its web UI and the API on port 80, so you need to expose that in Docker. To use the persistent -[message cache](config.md#message-cache), you also need to map a volume to `/var/cache/ntfy`. To change other settings, +The server exposes its web UI and the API on port 80, so you need to expose that in Docker. To use the persistent +[message cache](config.md#message-cache), you also need to map a volume to `/var/cache/ntfy`. To change other settings, you should map `/etc/ntfy`, so you can edit `/etc/ntfy/server.yml`. !!! info - Note that the Docker image **does not contain a `/etc/ntfy/server.yml` file**. If you'd like to use a config file, + Note that the Docker image **does not contain a `/etc/ntfy/server.yml` file**. If you'd like to use a config file, please manually create one outside the image and map it as a volume, e.g. via `-v /etc/ntfy:/etc/ntfy`. You may use the [`server.yml` file on GitHub](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml) as a template. @@ -438,7 +438,7 @@ Configuration is relatively straightforward. As an example, a minimal configurat === "from-file" ```bash - kubectl create configmap ntfy --from-file=server.yml + kubectl create configmap ntfy --from-file=server.yml ``` ## Kustomize @@ -447,16 +447,16 @@ ntfy can be deployed in a Kubernetes cluster with [Kustomize](https://github.com to customize Kubernetes objects using a `kustomization.yaml` file. 1. Create new folder - `ntfy` -2. Add all files listed below +2. Add all files listed below 1. `kustomization.yaml` - stores all configmaps and resources used in a deployment 2. `ntfy-deployment.yaml` - define deployment type and its parameters - 3. `ntfy-pvc.yaml` - describes how [persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) will be created + 3. `ntfy-pvc.yaml` - describes how [persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) will be created 4. `ntfy-svc.yaml` - expose application to the internal kubernetes network 5. `ntfy-ingress.yaml` - expose service to outside the network using [ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) 6. `server.yaml` - simple server configuration -3. Replace **TESTNAMESPACE** within `kustomization.yaml` with designated namespace +3. Replace **TESTNAMESPACE** within `kustomization.yaml` with designated namespace 4. Replace **ntfy.test** within `ntfy-ingress.yaml` with desired DNS name -5. Apply configuration to cluster set in current context: +5. Apply configuration to cluster set in current context: ```bash kubectl apply -k /ntfy @@ -473,9 +473,9 @@ kubectl apply -k /ntfy - ntfy-ingress.yaml # ingress definition configMapGenerator: # will parse config from raw config to configmap,it allows for dynamic reload of application if additional app is deployed ie https://github.com/stakater/Reloader - name: server-config - files: + files: - server.yml - namespace: TESTNAMESPACE # select namespace for whole application + namespace: TESTNAMESPACE # select namespace for whole application ``` === "ntfy-deployment.yaml" ```yaml @@ -497,7 +497,7 @@ kubectl apply -k /ntfy app: ntfy-pod spec: containers: - - name: ntfy + - name: ntfy image: binwiederhier/ntfy:v1.28.0 # set deployed version args: ["serve"] env: #example of adjustments made in environmental variables @@ -508,8 +508,8 @@ kubectl apply -k /ntfy - name: NTFY_LOG_LEVEL # adjust log level value: INFO - name: NTFY_BASE_URL # add base url - value: XXXXXXXXXX - ports: + value: XXXXXXXXXX + ports: - containerPort: 80 name: http-ntfy resources: @@ -533,7 +533,7 @@ kubectl apply -k /ntfy persistentVolumeClaim: # stores /cache/ntfy in defined pv claimName: ntfy-pvc ``` - + === "ntfy-pvc.yaml" ```yaml apiVersion: v1 @@ -554,7 +554,7 @@ kubectl apply -k /ntfy apiVersion: v1 kind: Service metadata: - name: ntfy-svc + name: ntfy-svc spec: type: ClusterIP selector: diff --git a/docs/integrations.md b/docs/integrations.md index 43bd3aa6..62920ed9 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -6,7 +6,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Public ntfy servers -Here's a list of public ntfy servers. As of right now, there is only one official server. The others are provided by the +Here's a list of public ntfy servers. As of right now, there is only one official server. The others are provided by the ntfy community. Thanks to everyone running a public server. **You guys rock!** | URL | Country | @@ -43,7 +43,7 @@ and uptime of third party servers, so use of each server is **at your own discre - [FindMyDevice](https://gitlab.com/Nulide/findmydevice/) - Find your Device with an SMS or online with the help of FMDServer - [Tox Push Message App](https://github.com/zoff99/tox_push_msg_app) - Tox Push Message App -## Libraries +## Libraries - [ntfy-php-library](https://github.com/VerifiedJoseph/ntfy-php-library) - PHP library for sending messages using a ntfy server (PHP) - [ntfy-notifier](https://github.com/DAcodedBEAT/ntfy-notifier) - Symfony Notifier integration for ntfy (PHP) @@ -65,7 +65,7 @@ and uptime of third party servers, so use of each server is **at your own discre - [ntfyr](https://github.com/haxwithaxe/ntfyr) - A simple commandline tool to send notifications to ntfy - [ntfy.py](https://github.com/ioqy/ntfy-client-python) - ntfy.py is a simple nfty.sh client for sending notifications -## Projects + scripts +## Projects + scripts - [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust) - [ntfy-long-zsh-command](https://github.com/robfox92/ntfy-long-zsh-command) - Notifies you once a long-running command completes (zsh) @@ -97,16 +97,16 @@ and uptime of third party servers, so use of each server is **at your own discre - [ntfy-notification-channel](https://github.com/wijourdil/ntfy-notification-channel) - Laravel Notification channel for ntfy (PHP) - [ntfy_on_a_chip](https://github.com/gergepalfi/ntfy_on_a_chip) - ESP8266 and ESP32 client code to communicate with ntfy - [ntfy-sdk](https://github.com/yukibtc/ntfy-sdk) - ntfy client library to send notifications (Rust) -- [ntfy_ynh](https://github.com/YunoHost-Apps/ntfy_ynh) - ntfy app for YunoHost +- [ntfy_ynh](https://github.com/YunoHost-Apps/ntfy_ynh) - ntfy app for YunoHost - [drone-ntfy](https://github.com/Clortox/drone-ntfy) - Drone.io plugin for sending ntfy notifications from a pipeline ## Blog + forum posts - [ntfy setup instructions](https://docs.benjamin-altpeter.de/network/vms/1001029-ntfy/) - benjamin-altpeter.de - 12/2022 -- [Ntfy Self-Hosted Push Notifications](https://lachlanlife.net/posts/2022-12-ntfy/) - lachlanlife.net - 12/2022 +- [Ntfy Self-Hosted Push Notifications](https://lachlanlife.net/posts/2022-12-ntfy/) - lachlanlife.net - 12/2022 - [ntfy.sh](https://paramdeo.com/til/ntfy-sh) - paramdeo.com - 11/2022 - [Using ntfy to warn me when my computer is discharging](https://ulysseszh.github.io/programming/2022/11/28/ntfy-warn-discharge.html) - ulysseszh.github.io - 11/2022 -- [ntfy - Push Notification Service](https://dizzytech.de/posts/ntfy/) - dizzytech.de - 11/2022 +- [ntfy - Push Notification Service](https://dizzytech.de/posts/ntfy/) - dizzytech.de - 11/2022 - [Console #132](https://console.substack.com/p/console-132) ⭐ - console.substack.com - 11/2022 - [MeshCentral - Ntfy Push Notifications ](https://www.youtube.com/watch?v=wyE4rtUd4Bg) - youtube.com - 11/2022 - [Changelog | Tracking layoffs, tech worker demand still high, ntfy, ...](https://changelog.com/news/tracking-layoffs-tech-worker-demand-still-high-ntfy-devenv-markdoc-mike-bifulco-Y1jW) ⭐ - changelog.com - 11/2022 @@ -118,11 +118,11 @@ and uptime of third party servers, so use of each server is **at your own discre - [Ntfy et Jeedom : un plugin](https://lunarok-domotique.com/2022/11/ntfy-et-jeedom/) - lunarok-domotique.com - 11/2022 - [Crea tu propio servidor de notificaciones con Ntfy](https://blog.parravidales.es/crea-tu-propio-servidor-de-notificaciones-con-ntfy/) - blog.parravidales.es - 11/2022 - [Zero-cost push notifications to your phone or desktop via PUT/POST ](https://lobste.rs/s/41dq13/zero_cost_push_notifications_your_phone) - lobste.rs - 10/2022 -- [A nifty push notification system: ntfy](https://jpmens.net/2022/10/30/a-nifty-push-notification-system-ntfy/) - jpmens.net - 10/2022 +- [A nifty push notification system: ntfy](https://jpmens.net/2022/10/30/a-nifty-push-notification-system-ntfy/) - jpmens.net - 10/2022 - [Alarmanlage der dritten Art (YouTube video)](https://www.youtube.com/watch?v=altb5QLHbaU&feature=youtu.be) - youtube.com - 10/2022 - [Neue Services: Ntfy, TikTok und RustDesk](https://adminforge.de/tools/neue-services-ntfy-tiktok-und-rustdesk/) - adminforge.de - 9/2022 - [Ntfy, le service de notifications qu’il vous faut](https://www.cachem.fr/ntfy-le-service-de-notifications-quil-vous-faut/) - cachem.fr - 9/2022 -- [NAS Synology et notifications avec ntfy](https://www.cachem.fr/synology-notifications-ntfy/) - cachem.fr - 9/2022 +- [NAS Synology et notifications avec ntfy](https://www.cachem.fr/synology-notifications-ntfy/) - cachem.fr - 9/2022 - [Self hosted Mobile Push Notifications using NTFY | Thejesh GN](https://thejeshgn.com/2022/08/23/self-hosted-mobile-push-notifications-using-ntfy/) - thejeshgn.com - 8/2022 - [Fedora Magazine | 4 cool new projects to try in Copr](https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-august-2022/) - fedoramagazine.org - 8/2022 - [Docker로 오픈소스 푸시알람 프로젝트 ntfy.sh 설치 및 사용하기.(Feat. Uptimekuma)](https://svrforum.com/svr/398979) - svrforum.com - 8/2022 @@ -131,7 +131,7 @@ and uptime of third party servers, so use of each server is **at your own discre - [Install guide (with Docker)](https://chowdera.com/2022/150/202205301257379077.html) - chowdera.com - 5/2022 - [无需注册的通知服务ntfy](https://blog.csdn.net/wbsu2004/article/details/125040247) - blog.csdn.net - 5/2022 - [Updated review post (Jan-Lukas Else)](https://jlelse.blog/thoughts/2022/04/ntfy) - jlelse.blog - 4/2022 -- [Using ntfy and Tasker together](https://lachlanlife.net/posts/2022-04-tasker-ntfy/) - lachlanlife.net - 4/2022 +- [Using ntfy and Tasker together](https://lachlanlife.net/posts/2022-04-tasker-ntfy/) - lachlanlife.net - 4/2022 - [Reddit feature update post](https://www.reddit.com/r/selfhosted/comments/uetlso/ntfy_is_a_tool_to_send_push_notifications_to_your/) ⭐ - reddit.com - 4/2022 - [無料で簡単に通知の送受信ができつつオープンソースでセルフホストも可能な「ntfy」を使ってみた](https://gigazine.net/news/20220404-ntfy-push-notification/) - gigazine.net - 4/2022 - [Pocketmags ntfy review](https://pocketmags.com/us/linux-format-magazine/march-2022/articles/1104187/ntfy) - pocketmags.com - 3/2022 diff --git a/docs/known-issues.md b/docs/known-issues.md index defb4a6e..b6dc9113 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -15,14 +15,14 @@ Please send experienced iOS developers my way to help me figure this out. ## iOS app not receiving notifications (anymore) If notifications do not show up at all anymore, there are a few causes for it (that I know of): -**Firebase+APNS are being weird and buggy**: -If this is the case, usually it helps to **remove the topic/subscription and re-add it**. That will force Firebase to +**Firebase+APNS are being weird and buggy**: +If this is the case, usually it helps to **remove the topic/subscription and re-add it**. That will force Firebase to re-subscribe to the Firebase topic. -**Self-hosted only: No `upstream-base-url` set, or `base-url` mismatch**: +**Self-hosted only: No `upstream-base-url` set, or `base-url` mismatch**: To make self-hosted servers work with the iOS app, I had to do some horrible things (see [iOS instant notifications](config.md#ios-instant-notifications) for details). Be sure that in your selfhosted server: * Set `upstream-base-url: "https://ntfy.sh"` (**not your own hostname!**) -* Ensure that the URL you set in `base-url` **matches exactly** what you set the Default Server in iOS to +* Ensure that the URL you set in `base-url` **matches exactly** what you set the Default Server in iOS to diff --git a/docs/privacy.md b/docs/privacy.md index f89f9aaa..e2934eeb 100644 --- a/docs/privacy.md +++ b/docs/privacy.md @@ -8,5 +8,5 @@ any outside service. All data is exclusively used to make the service function p I use is Firebase Cloud Messaging (FCM) service, which is required to provide instant Android notifications (see [FAQ](faq.md) for details). To avoid FCM altogether, download the F-Droid version. -For debugging purposes, the ntfy server may temporarily log request paths, remote IP addresses or even topics +For debugging purposes, the ntfy server may temporarily log request paths, remote IP addresses or even topics or messages, though typically this is turned off. diff --git a/docs/publish.md b/docs/publish.md index e69be44e..83cd2b8e 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -1,6 +1,6 @@ # Publishing -Publishing messages can be done via HTTP PUT/POST or via the [ntfy CLI](install.md). Topics are created on the fly by -subscribing or publishing to them. Because there is no sign-up, **the topic is essentially a password**, so pick +Publishing messages can be done via HTTP PUT/POST or via the [ntfy CLI](install.md). Topics are created on the fly by +subscribing or publishing to them. Because there is no sign-up, **the topic is essentially a password**, so pick something that's not easily guessable. Here's an example showing how to publish a simple message using a POST request: @@ -43,7 +43,7 @@ Here's an example showing how to publish a simple message using a POST request: === "Python" ``` python - requests.post("https://ntfy.sh/mytopic", + requests.post("https://ntfy.sh/mytopic", data="Backup successful 😀".encode(encoding='utf-8')) ``` @@ -65,7 +65,7 @@ If you have the [Android app](subscribe/phone.md) installed on your phone, this
Android notification
-There are more features related to publishing messages: You can set a [notification priority](#message-priority), +There are more features related to publishing messages: You can set a [notification priority](#message-priority), a [title](#message-title), and [tag messages](#tags-emojis) 🥳 🎉. Here's an example that uses some of them at together: === "Command line (curl)" @@ -95,7 +95,7 @@ a [title](#message-title), and [tag messages](#tags-emojis) 🥳 🎉. Here's an Title: Unauthorized access detected Priority: urgent Tags: warning,skull - + Remote access to phils-laptop detected. Act right away. ``` @@ -128,10 +128,10 @@ a [title](#message-title), and [tag messages](#tags-emojis) 🥳 🎉. Here's an $headers = @{ Title="Unauthorized access detected" Priority="urgent" Tags="warning,skull" } - $body = "Remote access to phils-laptop detected. Act right away." + $body = "Remote access to phils-laptop detected. Act right away." Invoke-RestMethod -Method 'Post' -Uri $uri -Headers $headers -Body $body -UseBasicParsing ``` - + === "Python" ``` python requests.post("https://ntfy.sh/phil_alerts", @@ -174,8 +174,8 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# -H "Actions: http, Open door, https://api.nest.com/open/yAxkasd, clear=true" \ -H "Email: phil@example.com" \ -d "There's someone at the door. 🐶 - - Please check if it's a good boy or a hooman. + + Please check if it's a good boy or a hooman. Doggies have been known to ring the doorbell." \ ntfy.sh/mydoorbell ``` @@ -189,8 +189,8 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# --email="phil@example.com" \ mydoorbell \ "There's someone at the door. 🐶 - - Please check if it's a good boy or a hooman. + + Please check if it's a good boy or a hooman. Doggies have been known to ring the doorbell." ``` @@ -202,13 +202,13 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# Attach: https://nest.com/view/yAxkasd.jpg Actions: http, Open door, https://api.nest.com/open/yAxkasd, clear=true Email: phil@example.com - + There's someone at the door. 🐶 - - Please check if it's a good boy or a hooman. + + Please check if it's a good boy or a hooman. Doggies have been known to ring the doorbell. ``` - + === "JavaScript" ``` javascript fetch('https://ntfy.sh/mydoorbell', { @@ -220,8 +220,8 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# 'Email': 'phil@example.com' }, body: `There's someone at the door. 🐶 - - Please check if it's a good boy or a hooman. + + Please check if it's a good boy or a hooman. Doggies have been known to ring the doorbell.`, }) ``` @@ -230,8 +230,8 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# ``` go req, _ := http.NewRequest("POST", "https://ntfy.sh/mydoorbell", strings.NewReader(`There's someone at the door. 🐶 - - Please check if it's a good boy or a hooman. + + Please check if it's a good boy or a hooman. Doggies have been known to ring the doorbell.`)) req.Header.Set("Click", "https://home.nest.com/") req.Header.Set("Attach", "https://nest.com/view/yAxkasd.jpg") @@ -249,7 +249,7 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# Email="phil@example.com" } $body = @' There's someone at the door. 🐶 - + Please check if it's a good boy or a hooman. Doggies have been known to ring the doorbell. '@ @@ -283,7 +283,7 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# "Actions": "http, Open door, https://api.nest.com/open/yAxkasd, clear=true\r\n" . "Email": "phil@example.com\r\n", 'content' => 'There\'s someone at the door. 🐶 - + Please check if it\'s a good boy or a hooman. Doggies have been known to ring the doorbell.' ] @@ -298,7 +298,7 @@ an [external image attachment](#attach-file-from-a-url) and [email publishing](# ## Message title _Supported on:_ :material-android: :material-apple: :material-firefox: -The notification title is typically set to the topic short URL (e.g. `ntfy.sh/mytopic`). To override the title, +The notification title is typically set to the topic short URL (e.g. `ntfy.sh/mytopic`). To override the title, you can set the `X-Title` header (or any of its aliases: `Title`, `ti`, or `t`). === "Command line (curl)" @@ -320,7 +320,7 @@ you can set the `X-Title` header (or any of its aliases: `Title`, `ti`, or `t`). POST /controversial HTTP/1.1 Host: ntfy.sh Title: Dogs are better than cats - + Oh my ... ``` @@ -400,7 +400,7 @@ You can set the priority with the header `X-Priority` (or any of its aliases: `P === "ntfy CLI" ``` - ntfy publish \ + ntfy publish \ -p 5 \ phil_alerts An urgent message ``` @@ -437,7 +437,7 @@ You can set the priority with the header `X-Priority` (or any of its aliases: `P $body = "An urgent message" Invoke-RestMethod -Method 'Post' -Uri $uri -Headers $headers -Body $body -UseBasicParsing ``` - + === "Python" ``` python requests.post("https://ntfy.sh/phil_alerts", @@ -468,12 +468,12 @@ _Supported on:_ :material-android: :material-apple: :material-firefox: You can tag messages with emojis and other relevant strings: -* **Emojis**: If a tag matches an [emoji short code](emojis.md), it'll be converted to an emoji and prepended +* **Emojis**: If a tag matches an [emoji short code](emojis.md), it'll be converted to an emoji and prepended to title or message. -* **Other tags:** If a tag doesn't match, it will be listed below the notification. +* **Other tags:** If a tag doesn't match, it will be listed below the notification. -This feature is useful for things like warnings (⚠️, ️🚨, or 🚩), but also to simply tag messages otherwise (e.g. script -names, hostnames, etc.). Use [the emoji short code list](emojis.md) to figure out what tags can be converted to emojis. +This feature is useful for things like warnings (⚠️, ️🚨, or 🚩), but also to simply tag messages otherwise (e.g. script +names, hostnames, etc.). Use [the emoji short code list](emojis.md) to figure out what tags can be converted to emojis. Here's an **excerpt of emojis** I've found very useful in alert messages: @@ -488,7 +488,7 @@ Here's an **excerpt of emojis** I've found very useful in alert messages:
- +
TagEmoji
@@ -502,7 +502,7 @@ Here's an **excerpt of emojis** I've found very useful in alert messages: - +
TagEmoji
-1👎️
warning⚠️
rotating_light️🚨
facepalm🤦
no_entry
no_entry_sign🚫
cd💿
cd💿
computer💻
......
@@ -531,7 +531,7 @@ them with a comma, e.g. `tag1,tag2,tag3`. POST /backups HTTP/1.1 Host: ntfy.sh Tags: warning,mailsrv13,daily-backup - + Backup of mailsrv13 failed ``` @@ -587,22 +587,22 @@ them with a comma, e.g. `tag1,tag2,tag3`. ## Scheduled delivery _Supported on:_ :material-android: :material-apple: :material-firefox: -You can delay the delivery of messages and let ntfy send them at a later date. This can be used to send yourself +You can delay the delivery of messages and let ntfy send them at a later date. This can be used to send yourself reminders or even to execute commands at a later date (if your subscriber acts on messages). -Usage is pretty straight forward. You can set the delivery time using the `X-Delay` header (or any of its aliases: `Delay`, -`X-At`, `At`, `X-In` or `In`), either by specifying a Unix timestamp (e.g. `1639194738`), a duration (e.g. `30m`, -`3h`, `2 days`), or a natural language time string (e.g. `10am`, `8:30pm`, `tomorrow, 3pm`, `Tuesday, 7am`, -[and more](https://github.com/olebedev/when)). +Usage is pretty straight forward. You can set the delivery time using the `X-Delay` header (or any of its aliases: `Delay`, +`X-At`, `At`, `X-In` or `In`), either by specifying a Unix timestamp (e.g. `1639194738`), a duration (e.g. `30m`, +`3h`, `2 days`), or a natural language time string (e.g. `10am`, `8:30pm`, `tomorrow, 3pm`, `Tuesday, 7am`, +[and more](https://github.com/olebedev/when)). As of today, the minimum delay you can set is **10 seconds** and the maximum delay is **3 days**. This can currently -not be configured otherwise ([let me know](https://github.com/binwiederhier/ntfy/issues) if you'd like to change +not be configured otherwise ([let me know](https://github.com/binwiederhier/ntfy/issues) if you'd like to change these limits). -For the purposes of [message caching](config.md#message-cache), scheduled messages are kept in the cache until 12 hours +For the purposes of [message caching](config.md#message-cache), scheduled messages are kept in the cache until 12 hours after they were delivered (or whatever the server-side cache duration is set to). For instance, if a message is scheduled -to be delivered in 3 days, it'll remain in the cache for 3 days and 12 hours. Also note that naturally, -[turning off server-side caching](#message-caching) is not possible in combination with this feature. +to be delivered in 3 days, it'll remain in the cache for 3 days and 12 hours. Also note that naturally, +[turning off server-side caching](#message-caching) is not possible in combination with this feature. === "Command line (curl)" ``` @@ -650,7 +650,7 @@ to be delivered in 3 days, it'll remain in the cache for 3 days and 12 hours. Al $body = "Good morning" Invoke-RestMethod -Method 'Post' -Uri $uri -Headers $headers -Body $body -UseBasicParsing ``` - + === "Python" ``` python requests.post("https://ntfy.sh/hello", @@ -686,19 +686,19 @@ Here are a few examples (assuming today's date is **12/10/2021, 9am, Eastern Tim -## Webhooks (publish via GET) +## Webhooks (publish via GET) _Supported on:_ :material-android: :material-apple: :material-firefox: -In addition to using PUT/POST, you can also send to topics via simple HTTP GET requests. This makes it easy to use +In addition to using PUT/POST, you can also send to topics via simple HTTP GET requests. This makes it easy to use a ntfy topic as a [webhook](https://en.wikipedia.org/wiki/Webhook), or if your client has limited HTTP support (e.g. like the [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) Android app). -To send messages via HTTP GET, simply call the `/publish` endpoint (or its aliases `/send` and `/trigger`). Without -any arguments, this will send the message `triggered` to the topic. However, you can provide all arguments that are -also supported as HTTP headers as URL-encoded arguments. Be sure to check the list of all +To send messages via HTTP GET, simply call the `/publish` endpoint (or its aliases `/send` and `/trigger`). Without +any arguments, this will send the message `triggered` to the topic. However, you can provide all arguments that are +also supported as HTTP headers as URL-encoded arguments. Be sure to check the list of all [supported parameters and headers](#list-of-all-parameters) for details. -For instance, assuming your topic is `mywebhook`, you can simply call `/mywebhook/trigger` to send a message +For instance, assuming your topic is `mywebhook`, you can simply call `/mywebhook/trigger` to send a message (aka trigger the webhook): === "Command line (curl)" @@ -730,7 +730,7 @@ For instance, assuming your topic is `mywebhook`, you can simply call `/mywebhoo === "PowerShell" ``` powershell Invoke-RestMethod -Method 'Get' -Uri "ntfy.sh/mywebhook/trigger" - ``` + ``` === "Python" ``` python @@ -742,8 +742,8 @@ For instance, assuming your topic is `mywebhook`, you can simply call `/mywebhoo file_get_contents('https://ntfy.sh/mywebhook/trigger'); ``` -To add a custom message, simply append the `message=` URL parameter. And of course you can set the -[message priority](#message-priority), the [message title](#message-title), and [tags](#tags-emojis) as well. +To add a custom message, simply append the `message=` URL parameter. And of course you can set the +[message priority](#message-priority), the [message title](#message-title), and [tags](#tags-emojis) as well. For a full list of possible parameters, check the list of [supported parameters and headers](#list-of-all-parameters). Here's an example with a custom message, tags and a priority: @@ -794,8 +794,8 @@ Here's an example with a custom message, tags and a priority: ## Publish as JSON _Supported on:_ :material-android: :material-apple: :material-firefox: -For some integrations with other tools (e.g. [Jellyfin](https://jellyfin.org/), [overseerr](https://overseerr.dev/)), -adding custom headers to HTTP requests may be tricky or impossible, so ntfy also allows publishing the entire message +For some integrations with other tools (e.g. [Jellyfin](https://jellyfin.org/), [overseerr](https://overseerr.dev/)), +adding custom headers to HTTP requests may be tricky or impossible, so ntfy also allows publishing the entire message as JSON in the request body. To publish as JSON, simple PUT/POST the JSON object directly to the ntfy root URL. The message format is described below @@ -803,9 +803,9 @@ the example. !!! info To publish as JSON, you must **PUT/POST to the ntfy root URL**, not to the topic URL. Be sure to check that you're - POST-ing to `https://ntfy.sh/` (correct), and not to `https://ntfy.sh/mytopic` (incorrect). + POST-ing to `https://ntfy.sh/` (correct), and not to `https://ntfy.sh/mytopic` (incorrect). -Here's an example using most supported parameters. Check the table below for a complete list. The `topic` parameter +Here's an example using most supported parameters. Check the table below for a complete list. The `topic` parameter is the only required one: === "Command line (curl)" @@ -863,9 +863,9 @@ is the only required one: === "Go" ``` go // You should probably use json.Marshal() instead and make a proper struct, - // or even just use req.Header.Set() like in the other examples, but for the + // or even just use req.Header.Set() like in the other examples, but for the // sake of the example, this is easier. - + body := `{ "topic": "mytopic", "message": "Disk space is low at 5.1 GB", @@ -894,7 +894,7 @@ is the only required one: tags = @("warning", "cd") click = "https://homecamera.lan/xasds1h2xsSsa/" actions = @( - @{ + @{ action = "view" label = "Admin panel" url = "https://filesrv.lan/admin" @@ -942,7 +942,7 @@ is the only required one: ])); ``` -The JSON message format closely mirrors the format of the message you can consume when you [subscribe via the API](subscribe/api.md) +The JSON message format closely mirrors the format of the message you can consume when you [subscribe via the API](subscribe/api.md) (see [JSON message format](subscribe/api.md#json-message-format) for details), but is not exactly identical. Here's an overview of all the supported fields: @@ -964,9 +964,9 @@ all the supported fields: _Supported on:_ :material-android: :material-apple: :material-firefox: You can add action buttons to notifications to allow yourself to react to a notification directly. This is incredibly -useful and has countless applications. +useful and has countless applications. -You can control your home appliances (open/close garage door, change temperature on thermostat, ...), react to common +You can control your home appliances (open/close garage door, change temperature on thermostat, ...), react to common monitoring alerts (clear logs when disk is full, ...), and many other things. The sky is the limit. As of today, the following actions are supported: @@ -987,7 +987,7 @@ Here's an example of what that a notification with actions can look like: You can define **up to three user actions** in your notifications, using either of the following methods: * In the [`X-Actions` header](#using-a-header), using a simple comma-separated format -* As a [JSON array](#using-a-json-array) in the `actions` key, when [publishing as JSON](#publish-as-json) +* As a [JSON array](#using-a-json-array) in the `actions` key, when [publishing as JSON](#publish-as-json) #### Using a header To define actions using the `X-Actions` header (or any of its aliases: `Actions`, `Action`), use the following format: @@ -1002,14 +1002,14 @@ To define actions using the `X-Actions` header (or any of its aliases: `Actions` , , paramN=... [; , , ...] ``` -Multiple actions are separated by a semicolon (`;`), and key/value pairs are separated by commas (`,`). Values may be -quoted with double quotes (`"`) or single quotes (`'`) if the value itself contains commas or semicolons. +Multiple actions are separated by a semicolon (`;`), and key/value pairs are separated by commas (`,`). Values may be +quoted with double quotes (`"`) or single quotes (`'`) if the value itself contains commas or semicolons. -The `action=` and `label=` prefix are optional in all actions, and the `url=` prefix is optional in the `view` and -`http` action. The only limitation of this format is that depending on your language/library, UTF-8 characters may not +The `action=` and `label=` prefix are optional in all actions, and the `url=` prefix is optional in the `view` and +`http` action. The only limitation of this format is that depending on your language/library, UTF-8 characters may not work. If they don't, use the [JSON array format](#using-a-json-array) instead. -As an example, here's how you can create the above notification using this format. Refer to the [`view` action](#open-websiteapp) and +As an example, here's how you can create the above notification using this format. Refer to the [`view` action](#open-websiteapp) and [`http` action](#send-http-request) section for details on the specific actions: === "Command line (curl)" @@ -1046,8 +1046,8 @@ As an example, here's how you can create the above notification using this forma fetch('https://ntfy.sh/myhome', { method: 'POST', body: 'You left the house. Turn down the A/C?', - headers: { - 'Actions': 'view, Open portal, https://home.nest.com/, clear=true; http, Turn down, https://api.nest.com/, body=\'{"temperature": 65}\'' + headers: { + 'Actions': 'view, Open portal, https://home.nest.com/, clear=true; http, Turn down, https://api.nest.com/, body=\'{"temperature": 65}\'' } }) ``` @@ -1086,9 +1086,9 @@ As an example, here's how you can create the above notification using this forma ] ])); ``` - + #### Using a JSON array -Alternatively, the same actions can be defined as **JSON array**, if the notification is defined as part of the JSON body +Alternatively, the same actions can be defined as **JSON array**, if the notification is defined as part of the JSON body (see [publish as JSON](#publish-as-json)): === "Command line (curl)" @@ -1189,7 +1189,7 @@ Alternatively, the same actions can be defined as **JSON array**, if the notific ``` go // You should probably use json.Marshal() instead and make a proper struct, // but for the sake of the example, this is easier. - + body := `{ "topic": "myhome", "message": "You left the house. Turn down the A/C?", @@ -1291,16 +1291,16 @@ Alternatively, the same actions can be defined as **JSON array**, if the notific ])); ``` -The required/optional fields for each action depend on the type of the action itself. Please refer to -[`view` action](#open-websiteapp), [`broadcasst` action](#send-android-broadcast), and [`http` action](#send-http-request) +The required/optional fields for each action depend on the type of the action itself. Please refer to +[`view` action](#open-websiteapp), [`broadcasst` action](#send-android-broadcast), and [`http` action](#send-http-request) for details. ### Open website/app _Supported on:_ :material-android: :material-apple: :material-firefox: The `view` action **opens a website or app when the action button is tapped**, e.g. a browser, a Google Maps location, or -even a deep link into Twitter or a show ntfy topic. How exactly the action is handled depends on how Android and your -desktop browser treat the links. Normally it'll just open a link in the browser. +even a deep link into Twitter or a show ntfy topic. How exactly the action is handled depends on how Android and your +desktop browser treat the links. Normally it'll just open a link in the browser. Examples: @@ -1343,8 +1343,8 @@ Here's an example using the [`X-Actions` header](#using-a-header): fetch('https://ntfy.sh/myhome', { method: 'POST', body: 'Somebody retweeted your tweet.', - headers: { - 'Actions': 'view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392' + headers: { + 'Actions': 'view, Open Twitter, https://twitter.com/binwiederhier/status/1467633927951163392' } }) ``` @@ -1456,7 +1456,7 @@ And the same example using [JSON publishing](#publish-as-json): ``` go // You should probably use json.Marshal() instead and make a proper struct, // but for the sake of the example, this is easier. - + body := `{ "topic": "myhome", "message": "Somebody retweeted your tweet.", @@ -1585,8 +1585,8 @@ Here's an example using the [`X-Actions` header](#using-a-header): fetch('https://ntfy.sh/wifey', { method: 'POST', body: 'Your wife requested you send a picture of yourself.', - headers: { - 'Actions': 'broadcast, Take picture, extras.cmd=pic, extras.camera=front' + headers: { + 'Actions': 'broadcast, Take picture, extras.cmd=pic, extras.camera=front' } }) ``` @@ -1710,7 +1710,7 @@ And the same example using [JSON publishing](#publish-as-json): ``` go // You should probably use json.Marshal() instead and make a proper struct, // but for the sake of the example, this is easier. - + body := `{ "topic": "wifey", "message": "Your wife requested you send a picture of yourself.", @@ -1812,7 +1812,7 @@ The `http` action **sends a HTTP request when the action button is tapped**. You for whatever systems you have, e.g. opening the garage door, or turning on/off lights. By default, this action sends a **POST request** (not GET!), though this can be changed with the `method` parameter. -The only required parameter is `url`. Headers can be passed along using the `headers` parameter. +The only required parameter is `url`. Headers can be passed along using the `headers` parameter. Here's an example using the [`X-Actions` header](#using-a-header): @@ -1846,8 +1846,8 @@ Here's an example using the [`X-Actions` header](#using-a-header): fetch('https://ntfy.sh/myhome', { method: 'POST', body: 'Garage door has been open for 15 minutes. Close it?', - headers: { - 'Actions': 'http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}' + headers: { + 'Actions': 'http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}' } }) ``` @@ -1979,7 +1979,7 @@ And the same example using [JSON publishing](#publish-as-json): ``` go // You should probably use json.Marshal() instead and make a proper struct, // but for the sake of the example, this is easier. - + body := `{ "topic": "myhome", "message": "Garage door has been open for 15 minutes. Close it?", @@ -2002,7 +2002,7 @@ And the same example using [JSON publishing](#publish-as-json): === "PowerShell" ``` powershell - # Powershell requires the 'Depth' argument to equal 3 here to expand 'headers', + # Powershell requires the 'Depth' argument to equal 3 here to expand 'headers', # otherwise it will read System.Collections.Hashtable in the returned JSON $uri = "https://ntfy.sh" @@ -2088,13 +2088,13 @@ The `http` action supports the following fields: ## Click action _Supported on:_ :material-android: :material-apple: :material-firefox: -You can define which URL to open when a notification is clicked. This may be useful if your notification is related +You can define which URL to open when a notification is clicked. This may be useful if your notification is related to a Zabbix alert or a transaction that you'd like to provide the deep-link for. Tapping the notification will open the web browser (or the app) and open the website. To define a click action for the notification, pass a URL as the value of the `X-Click` header (or its aliase `Click`). If you pass a website URL (`http://` or `https://`) the web browser will open. If you pass another URI that can be handled -by another app, the responsible app may open. +by another app, the responsible app may open. Examples: @@ -2126,7 +2126,7 @@ Here's an example that will open Reddit when the notification is clicked: ``` http POST /reddit_alerts HTTP/1.1 Host: ntfy.sh - Click: https://www.reddit.com/message/messages + Click: https://www.reddit.com/message/messages New messages on Reddit ``` @@ -2181,19 +2181,19 @@ _Supported on:_ :material-android: :material-firefox: You can **send images and other files to your phone** as attachments to a notification. The attachments are then downloaded onto your phone (depending on size and setting automatically), and can be used from the Downloads folder. -There are two different ways to send attachments: +There are two different ways to send attachments: * sending [a local file](#attach-local-file) via PUT, e.g. from `~/Flowers/flower.jpg` or `ringtone.mp3` -* or by [passing an external URL](#attach-file-from-a-url) as an attachment, e.g. `https://f-droid.org/F-Droid.apk` +* or by [passing an external URL](#attach-file-from-a-url) as an attachment, e.g. `https://f-droid.org/F-Droid.apk` ### Attach local file -To **send a file from your computer** as an attachment, you can send it as the PUT request body. If a message is greater -than the maximum message size (4,096 bytes) or consists of non UTF-8 characters, the ntfy server will automatically -detect the mime type and size, and send the message as an attachment file. To send smaller text-only messages or files -as attachments, you must pass a filename by passing the `X-Filename` header or query parameter (or any of its aliases -`Filename`, `File` or `f`). +To **send a file from your computer** as an attachment, you can send it as the PUT request body. If a message is greater +than the maximum message size (4,096 bytes) or consists of non UTF-8 characters, the ntfy server will automatically +detect the mime type and size, and send the message as an attachment file. To send smaller text-only messages or files +as attachments, you must pass a filename by passing the `X-Filename` header or query parameter (or any of its aliases +`Filename`, `File` or `f`). -By default, and how ntfy.sh is configured, the **max attachment size is 15 MB** (with 100 MB total per visitor). +By default, and how ntfy.sh is configured, the **max attachment size is 15 MB** (with 100 MB total per visitor). Attachments **expire after 3 hours**, which typically is plenty of time for the user to download it, or for the Android app to auto-download it. Please also check out the [other limits below](#limitations). @@ -2220,7 +2220,7 @@ Here's an example showing how to upload an image: Host: ntfy.sh Filename: flower.jpg Content-Type: 52312 - + (binary JPEG data) ``` @@ -2256,7 +2256,7 @@ Here's an example showing how to upload an image: 'header' => "Content-Type: application/octet-stream\r\n" . // Does not matter "Filename: flower.jpg", - 'content' => file_get_contents('flower.jpg') // Dangerous for large files + 'content' => file_get_contents('flower.jpg') // Dangerous for large files ] ])); ``` @@ -2270,13 +2270,13 @@ Here's what that looks like on Android: ### Attach file from a URL Instead of sending a local file to your phone, you can use **an external URL** to specify where the attachment is hosted. -This could be a Dropbox link, a file from social media, or any other publicly available URL. Since the files are +This could be a Dropbox link, a file from social media, or any other publicly available URL. Since the files are externally hosted, the expiration or size limits from above do not apply here. To attach an external file, simple pass the `X-Attach` header or query parameter (or any of its aliases `Attach` or `a`) -to specify the attachment URL. It can be any type of file. +to specify the attachment URL. It can be any type of file. -ntfy will automatically try to derive the file name from the URL (e.g `https://example.com/flower.jpg` will yield a +ntfy will automatically try to derive the file name from the URL (e.g `https://example.com/flower.jpg` will yield a filename `flower.jpg`). To override this filename, you may send the `X-Filename` header or query parameter (or any of its aliases `Filename`, `File` or `f`). @@ -2354,7 +2354,7 @@ _Supported on:_ :material-android: You can include an icon that will appear next to the text of the notification. Simply pass the `X-Icon` header or query parameter (or its alias `Icon`) to specify the URL that the icon is located at. The client will automatically download -the icon (unless it is already cached locally, and less than 24 hours old), and show it in the notification. Icons are +the icon (unless it is already cached locally, and less than 24 hours old), and show it in the notification. Icons are cached locally in the client until the notification is deleted. **Only JPEG and PNG images are supported at this time**. Here's an example showing how to include an icon: @@ -2394,7 +2394,7 @@ Here's an example showing how to include an icon: ``` javascript fetch('https://ntfy.sh/tvshows', { method: 'POST', - headers: { + headers: { 'Icon': 'https://styles.redditmedia.com/t5_32uhe/styles/communityIcon_xnt6chtnr2j21.png', 'Title': 'Kodi: Resuming Playback', 'Tags': 'arrow_forward' @@ -2458,14 +2458,14 @@ Here's an example of how it will look on Android: ## E-mail notifications _Supported on:_ :material-android: :material-apple: :material-firefox: -You can forward messages to e-mail by specifying an address in the header. This can be useful for messages that -you'd like to persist longer, or to blast-notify yourself on all possible channels. +You can forward messages to e-mail by specifying an address in the header. This can be useful for messages that +you'd like to persist longer, or to blast-notify yourself on all possible channels. Usage is easy: Simply pass the `X-Email` header (or any of its aliases: `X-E-mail`, `Email`, `E-mail`, `Mail`, or `e`). Only one e-mail address is supported. -Since ntfy does not provide auth (yet), the rate limiting is pretty strict (see [limitations](#limitations)). In the -default configuration, you get **16 e-mails per visitor** (IP address) and then after that one per hour. On top of +Since ntfy does not provide auth (yet), the rate limiting is pretty strict (see [limitations](#limitations)). In the +default configuration, you get **16 e-mails per visitor** (IP address) and then after that one per hour. On top of that, your IP address appears in the e-mail body. This is to prevent abuse. === "Command line (curl)" @@ -2476,7 +2476,7 @@ that, your IP address appears in the e-mail body. This is to prevent abuse. -H "Priority: high" \ -d "Unknown login from 5.31.23.83 to backups.example.com" \ ntfy.sh/alerts - curl -H "Email: phil@example.com" -d "You've Got Mail" + curl -H "Email: phil@example.com" -d "You've Got Mail" curl -d "You've Got Mail" "ntfy.sh/alerts?email=phil@example.com" ``` @@ -2505,7 +2505,7 @@ that, your IP address appears in the e-mail body. This is to prevent abuse. fetch('https://ntfy.sh/alerts', { method: 'POST', body: "Unknown login from 5.31.23.83 to backups.example.com", - headers: { + headers: { 'Email': 'phil@example.com', 'Tags': 'warning,skull,backup-host,ssh-login', 'Priority': 'high' @@ -2515,7 +2515,7 @@ that, your IP address appears in the e-mail body. This is to prevent abuse. === "Go" ``` go - req, _ := http.NewRequest("POST", "https://ntfy.sh/alerts", + req, _ := http.NewRequest("POST", "https://ntfy.sh/alerts", strings.NewReader("Unknown login from 5.31.23.83 to backups.example.com")) req.Header.Set("Email", "phil@example.com") req.Header.Set("Tags", "warning,skull,backup-host,ssh-login") @@ -2538,7 +2538,7 @@ that, your IP address appears in the e-mail body. This is to prevent abuse. ``` python requests.post("https://ntfy.sh/alerts", data="Unknown login from 5.31.23.83 to backups.example.com", - headers={ + headers={ "Email": "phil@example.com", "Tags": "warning,skull,backup-host,ssh-login", "Priority": "high" @@ -2571,11 +2571,11 @@ Here's what that looks like in Google Mail: _Supported on:_ :material-android: :material-apple: :material-firefox: You can publish messages to a topic via e-mail, i.e. by sending an email to a specific address. For instance, you can -publish a message to the topic `sometopic` by sending an e-mail to `ntfy-sometopic@ntfy.sh`. This is useful for e-mail +publish a message to the topic `sometopic` by sending an e-mail to `ntfy-sometopic@ntfy.sh`. This is useful for e-mail based integrations such as for statuspage.io (though these days most services also support webhooks and HTTP calls). -Depending on the [server configuration](config.md#e-mail-publishing), the e-mail address format can have a prefix to -prevent spam on topics. For ntfy.sh, the prefix is configured to `ntfy-`, meaning that the general e-mail address +Depending on the [server configuration](config.md#e-mail-publishing), the e-mail address format can have a prefix to +prevent spam on topics. For ntfy.sh, the prefix is configured to `ntfy-`, meaning that the general e-mail address format is: ``` @@ -2583,7 +2583,7 @@ ntfy-$topic@ntfy.sh ``` As of today, e-mail publishing only supports adding a [message title](#message-title) (the e-mail subject). Tags, priority, -delay and other features are not supported (yet). Here's an example that will publish a message with the +delay and other features are not supported (yet). Here's an example that will publish a message with the title `You've Got Mail` to topic `sometopic` (see [ntfy.sh/sometopic](https://ntfy.sh/sometopic)):
@@ -2596,17 +2596,17 @@ title `You've Got Mail` to topic `sometopic` (see [ntfy.sh/sometopic](https://nt ### Authentication Depending on whether the server is configured to support [access control](config.md#access-control), some topics may be read/write protected so that only users with the correct credentials can subscribe or publish to them. -To publish/subscribe to protected topics, you can: +To publish/subscribe to protected topics, you can: * Use [basic auth](#basic-auth), e.g. `Authorization: Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk` * or use the [`auth` query parameter](#query-param), e.g. `?auth=QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw` !!! warning - Base64 only encodes username and password. It **is not encrypting it**. For your self-hosted server, - **be sure to use HTTPS to avoid eavesdropping** and exposing your password. + Base64 only encodes username and password. It **is not encrypting it**. For your self-hosted server, + **be sure to use HTTPS to avoid eavesdropping** and exposing your password. #### Basic auth -Here's an example using [Basic auth](https://en.wikipedia.org/wiki/Basic_access_authentication), with a user `testuser` +Here's an example using [Basic auth](https://en.wikipedia.org/wiki/Basic_access_authentication), with a user `testuser` and password `fakepassword`: === "Command line (curl)" @@ -2685,8 +2685,8 @@ and password `fakepassword`: ])); ``` -To generate the `Authorization` header, use **standard base64** to encode the colon-separated `:` -and prepend the word `Basic`, i.e. `Authorization: Basic base64(:)`. Here's some pseudo-code that +To generate the `Authorization` header, use **standard base64** to encode the colon-separated `:` +and prepend the word `Basic`, i.e. `Authorization: Basic base64(:)`. Here's some pseudo-code that hopefully explains it better: ``` @@ -2766,8 +2766,8 @@ Here's an example using the `auth` query parameter: ])); ``` -To generate the value of the `auth` parameter, encode the value of the `Authorization` header (see anove) using -**raw base64 encoding** (like base64, but strip any trailing `=`). Here's some pseudo-code that hopefully +To generate the value of the `auth` parameter, encode the value of the `Authorization` header (see anove) using +**raw base64 encoding** (like base64, but strip any trailing `=`). Here's some pseudo-code that hopefully explains it better: ``` @@ -2777,7 +2777,7 @@ authHeader = "Basic " + base64(username + ":" + password) // -> Basic dGVzdHVzZX authParam = base64_raw(authHeader) // -> QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw (no trailing =) // If your language does not have a function to encode raw base64, simply use normal base64 -// and REMOVE TRAILING "=" characters. +// and REMOVE TRAILING "=" characters. ``` The following command will generate the appropriate value for you on *nix systems: @@ -2788,17 +2788,17 @@ echo -n "Basic `echo -n 'testuser:fakepassword' | base64`" | base64 | tr -d '=' ### Message caching !!! info - If `Cache: no` is used, messages will only be delivered to connected subscribers, and won't be re-delivered if a - client re-connects. If a subscriber has (temporary) network issues or is reconnecting momentarily, + If `Cache: no` is used, messages will only be delivered to connected subscribers, and won't be re-delivered if a + client re-connects. If a subscriber has (temporary) network issues or is reconnecting momentarily, **messages might be missed**. By default, the ntfy server caches messages on disk for 12 hours (see [message caching](config.md#message-cache)), so -all messages you publish are stored server-side for a little while. The reason for this is to overcome temporary +all messages you publish are stored server-side for a little while. The reason for this is to overcome temporary client-side network disruptions, but arguably this feature also may raise privacy concerns. -To avoid messages being cached server-side entirely, you can set `X-Cache` header (or its alias: `Cache`) to `no`. +To avoid messages being cached server-side entirely, you can set `X-Cache` header (or its alias: `Cache`) to `no`. This will make sure that your message is not cached on the server, even if server-side caching is enabled. Messages -are still delivered to connected subscribers, but [`since=`](subscribe/api.md#fetch-cached-messages) and +are still delivered to connected subscribers, but [`since=`](subscribe/api.md#fetch-cached-messages) and [`poll=1`](subscribe/api.md#poll-for-messages) won't return the message anymore. === "Command line (curl)" @@ -2869,12 +2869,12 @@ are still delivered to connected subscribers, but [`since=`](subscribe/api.md#fe ### Disable Firebase !!! info - If `Firebase: no` is used and [instant delivery](subscribe/phone.md#instant-delivery) isn't enabled in the Android - app (Google Play variant only), **message delivery will be significantly delayed (up to 15 minutes)**. To overcome + If `Firebase: no` is used and [instant delivery](subscribe/phone.md#instant-delivery) isn't enabled in the Android + app (Google Play variant only), **message delivery will be significantly delayed (up to 15 minutes)**. To overcome this delay, simply enable instant delivery. The ntfy server can be configured to use [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging) -(see [Firebase config](config.md#firebase-fcm)) for message delivery on Android (to minimize the app's battery footprint). +(see [Firebase config](config.md#firebase-fcm)) for message delivery on Android (to minimize the app's battery footprint). The ntfy.sh server is configured this way, meaning that all messages published to ntfy.sh are also published to corresponding FCM topics. @@ -2949,7 +2949,7 @@ to `no`. This will instruct the server not to forward messages to Firebase. ### UnifiedPush !!! info - This setting is not relevant to users, only to app developers and people interested in [UnifiedPush](https://unifiedpush.org). + This setting is not relevant to users, only to app developers and people interested in [UnifiedPush](https://unifiedpush.org). [UnifiedPush](https://unifiedpush.org) is a standard for receiving push notifications without using the Google-owned [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging) service. It puts push notifications @@ -2957,16 +2957,16 @@ in the control of the user. ntfy can act as a **UnifiedPush distributor**, forwa When publishing messages to a topic, apps using ntfy as a UnifiedPush distributor can set the `X-UnifiedPush` header or query parameter (or any of its aliases `unifiedpush` or `up`) to `1` to [disable Firebase](#disable-firebase). As of today, this -option is mostly equivalent to `Firebase: no`, but was introduced to allow future flexibility. The flag additionally +option is mostly equivalent to `Firebase: no`, but was introduced to allow future flexibility. The flag additionally enables auto-detection of the message encoding. If the message is binary, it'll be encoded as base64. ### Matrix Gateway The ntfy server implements a [Matrix Push Gateway](https://spec.matrix.org/v1.2/push-gateway-api/) (in combination with [UnifiedPush](https://unifiedpush.org) as the [Provider Push Protocol](https://unifiedpush.org/developers/gateway/)). This makes it easier to integrate -with self-hosted [Matrix](https://matrix.org/) servers (such as [synapse](https://github.com/matrix-org/synapse)), since +with self-hosted [Matrix](https://matrix.org/) servers (such as [synapse](https://github.com/matrix-org/synapse)), since you don't have to set up a separate push proxy (such as [common-proxies](https://github.com/UnifiedPush/common-proxies)). -In short, ntfy accepts Matrix messages on the `/_matrix/push/v1/notify` endpoint (see [Push Gateway API](https://spec.matrix.org/v1.2/push-gateway-api/)), +In short, ntfy accepts Matrix messages on the `/_matrix/push/v1/notify` endpoint (see [Push Gateway API](https://spec.matrix.org/v1.2/push-gateway-api/)), and forwards them to the ntfy topic defined in the `pushkey` of the message. The message will then be forwarded to the ntfy Android app, and passed on to the Matrix client there. @@ -2989,7 +2989,7 @@ that you can use to try out what [authentication and access control](#authentica | [mytopic-wo](https://ntfy.sh/mytopic-wo) | `testuser` (password: `testuser`) | Write-only for `testuser`, no access for anyone else | Test topic | ## Limitations -There are a few limitations to the API to prevent abuse and to keep the server healthy. Almost all of these settings +There are a few limitations to the API to prevent abuse and to keep the server healthy. Almost all of these settings are configurable via the server side [rate limiting settings](config.md#rate-limiting). Most of these limits you won't run into, but just in case, let's list them all: diff --git a/docs/releases.md b/docs/releases.md index a2c69253..82e15ab3 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -7,7 +7,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Features:** * Web: Generate random topic name button ([#453](https://github.com/binwiederhier/ntfy/issues/453), thanks to [@yardenshoham](https://github.com/yardenshoham)) -* Add [Gitpod config](https://github.com/binwiederhier/ntfy/blob/main/.gitpod.yml) ([#540](https://github.com/binwiederhier/ntfy/pull/540), thanks to [@yardenshoham](https://github.com/yardenshoham)) +* Add [Gitpod config](https://github.com/binwiederhier/ntfy/blob/main/.gitpod.yml) ([#540](https://github.com/binwiederhier/ntfy/pull/540), thanks to [@yardenshoham](https://github.com/yardenshoham)) **Bug fixes + maintenance:** @@ -67,7 +67,7 @@ requests. **Documentation:** * GitHub Actions example ([#492](https://github.com/binwiederhier/ntfy/pull/492), thanks to [@ksurl](https://github.com/ksurl)) -* UnifiedPush ACL clarification ([#497](https://github.com/binwiederhier/ntfy/issues/497), thanks to [@bt90](https://github.com/bt90)) +* UnifiedPush ACL clarification ([#497](https://github.com/binwiederhier/ntfy/issues/497), thanks to [@bt90](https://github.com/bt90)) * Install instructions for Kustomize ([#463](https://github.com/binwiederhier/ntfy/pull/463), thanks to [@l-maciej](https://github.com/l-maciej)) **Other things:** @@ -78,11 +78,11 @@ requests. ## ntfy server v1.29.0 Released November 12, 2022 -This release adds the ability to add rate limit exemptions for IP ranges instead of just specific IP addresses. It also fixes +This release adds the ability to add rate limit exemptions for IP ranges instead of just specific IP addresses. It also fixes a few bugs in the web app and the CLI and adds lots of new examples and install instructions. Thanks to [some love on HN](https://news.ycombinator.com/item?id=33517944), we got so many new ntfy users trying out ntfy -and joining the [chat rooms](https://github.com/binwiederhier/ntfy#chat--forum). **Welcome to the ntfy community to all of you!** +and joining the [chat rooms](https://github.com/binwiederhier/ntfy#chat--forum). **Welcome to the ntfy community to all of you!** We also got a ton of new **[sponsors and donations](https://github.com/sponsors/binwiederhier)** 💸, which is amazing. I'd like to thank all of you for believing in the project, and for helping me pay the server cost. The HN spike increased the AWS cost quite a bit. @@ -120,13 +120,13 @@ all of you for believing in the project, and for helping me pay the server cost. **Sponsorships:**: -Thank you to the amazing folks who decided to [sponsor ntfy](https://github.com/sponsors/binwiederhier). Thank you for -helping carry the cost of the public server and developer licenses, and more importantly: Thank you for believing in ntfy! -You guys rock! +Thank you to the amazing folks who decided to [sponsor ntfy](https://github.com/sponsors/binwiederhier). Thank you for +helping carry the cost of the public server and developer licenses, and more importantly: Thank you for believing in ntfy! +You guys rock! A list of all the sponsors can be found in the [README](https://github.com/binwiederhier/ntfy/blob/main/README.md). -## ntfy Android app v1.14.0 +## ntfy Android app v1.14.0 Released September 27, 2022 This release adds the ability to set a custom icon to each notification, as well as a display name to subscriptions. We @@ -164,7 +164,7 @@ This release primarily adds icon support for the Android app, and adds a display Aside from that, we fixed a few random bugs, most importantly the `Priority` header bug that allows the use behind Cloudflare. We also added a ton of documentation. Most prominently, an [integrations + projects page](https://ntfy.sh/docs/integrations/). -As of now, I also have started accepting **[donations and sponsorships](https://github.com/sponsors/binwiederhier)** 💸. +As of now, I also have started accepting **[donations and sponsorships](https://github.com/sponsors/binwiederhier)** 💸. I would be very humbled if you consider donating. **Features:** @@ -200,8 +200,8 @@ I would be very humbled if you consider donating. Released June 23, 2022 This release brings two new CLI options to wait for a command to finish, or for a PID to exit. It also adds more detail -to trace debug output. Aside from other bugs, it fixes a performance issue that occurred in large installations every -minute or so, due to competing stats gathering (personal installations will likely be unaffected by this). +to trace debug output. Aside from other bugs, it fixes a performance issue that occurred in large installations every +minute or so, due to competing stats gathering (personal installations will likely be unaffected by this). **Features:** @@ -226,7 +226,7 @@ minute or so, due to competing stats gathering (personal installations will like Released June 16, 2022 This release adds a Matrix Push Gateway directly into ntfy, to make self-hosting a Matrix server easier. The Windows -CLI is now available via Scoop, and ntfy is now natively supported in Uptime Kuma. +CLI is now available via Scoop, and ntfy is now natively supported in Uptime Kuma. **Features:** @@ -265,8 +265,8 @@ set your server as the default server for new topics. ## ntfy server v1.25.2 Released June 2, 2022 -This release adds the ability to set a log level to facilitate easier debugging of live systems. It also solves a -production problem with a few over-users that resulted in Firebase quota problems (only applying to the over-users). +This release adds the ability to set a log level to facilitate easier debugging of live systems. It also solves a +production problem with a few over-users that resulted in Firebase quota problems (only applying to the over-users). We now block visitors from using Firebase if they trigger a quota exceeded response. On top of that, we updated the Firebase SDK and are now building the release in GitHub Actions. We've also got two @@ -279,7 +279,7 @@ more translations: Chinese/Simplified and Dutch. **Bugs**: * Respect Firebase "quota exceeded" response for topics, block Firebase publishing for user for 10min ([#289](https://github.com/binwiederhier/ntfy/issues/289)) -* Fix documentation header blue header due to mkdocs-material theme update (no ticket) +* Fix documentation header blue header due to mkdocs-material theme update (no ticket) **Maintenance:** @@ -367,7 +367,7 @@ The app is now available in the [App Store](https://apps.apple.com/us/app/ntfy/i ## ntfy server v1.23.0 Released May 21, 2022 -This release ships a CLI for Windows and macOS, as well as the ability to disable the web app entirely. On top of that, +This release ships a CLI for Windows and macOS, as well as the ability to disable the web app entirely. On top of that, it adds support for APNs, the iOS messaging service. This is needed for the (soon to be released) iOS app. **Features:** @@ -391,7 +391,7 @@ it adds support for APNs, the iOS messaging service. This is needed for the (soo * Portuguese/Brazil (thanks to [@tiagotriques](https://hosted.weblate.org/user/tiagotriques/) and [@pireshenrique22](https://hosted.weblate.org/user/pireshenrique22/)) -Thank you to the many translators, who helped translate the new strings so quickly. I am humbled and amazed by your help. +Thank you to the many translators, who helped translate the new strings so quickly. I am humbled and amazed by your help. ## ntfy Android app v1.13.0 Released May 11, 2022 @@ -465,10 +465,10 @@ Released Apr 25, 2022 The main feature in this Android release is [Action Buttons](https://ntfy.sh/docs/publish/#action-buttons), a feature that allows users to add actions to the notifications. Actions can be to view a website or app, send a broadcast, or -send a HTTP request. +send a HTTP request. -We also added support for [ntfy:// deep links](https://ntfy.sh/docs/subscribe/phone/#ntfy-links), added three more -languages and fixed a ton of bugs. +We also added support for [ntfy:// deep links](https://ntfy.sh/docs/subscribe/phone/#ntfy-links), added three more +languages and fixed a ton of bugs. **Features:** @@ -509,9 +509,9 @@ Thanks to [@s-h-a-r-d](https://github.com/s-h-a-r-d) (aka @Shard), [@cmeis](http ## ntfy server v1.21.2 Released Apr 24, 2022 -In this release, the web app got translation support and was translated into 9 languages already 🇧🇬 🇩🇪 🇺🇸 🌎. +In this release, the web app got translation support and was translated into 9 languages already 🇧🇬 🇩🇪 🇺🇸 🌎. It also re-adds support for ARMv6, and adds server-side support for Action Buttons. [Action Buttons](https://ntfy.sh/docs/publish/#action-buttons) -is a feature that will be released in the Android app soon. It allows users to add actions to the notifications. +is a feature that will be released in the Android app soon. It allows users to add actions to the notifications. Limited support is available in the web app. **Features:** @@ -543,7 +543,7 @@ Limited support is available in the web app. **Integrations:** [Apprise](https://github.com/caronc/apprise) support was fully released in [v0.9.8.2](https://github.com/caronc/apprise/releases/tag/v0.9.8.2) -of Apprise. Thanks to [@particledecay](https://github.com/particledecay) and [@caronc](https://github.com/caronc) for their fantastic work. +of Apprise. Thanks to [@particledecay](https://github.com/particledecay) and [@caronc](https://github.com/caronc) for their fantastic work. You can try it yourself like this (detailed usage in the [Apprise wiki](https://github.com/caronc/apprise/wiki/Notify_ntfy)): ``` @@ -593,7 +593,7 @@ Released Apr 6, 2022 **Features:**: -* Added message bar and publish dialog ([#196](https://github.com/binwiederhier/ntfy/issues/196)) +* Added message bar and publish dialog ([#196](https://github.com/binwiederhier/ntfy/issues/196)) **Bug fixes:** @@ -624,7 +624,7 @@ Released Mar 30, 2022 * Improved [e-mail publishing](config.md#e-mail-publishing) documentation ## ntfy server v1.18.1 -Released Mar 21, 2022 +Released Mar 21, 2022 _This release ships no features or bug fixes. It's merely a documentation update._ **Documentation:** @@ -653,8 +653,8 @@ Released Mar 16, 2022 **Features:** -* [Publish messages as JSON](https://ntfy.sh/docs/publish/#publish-as-json) ([#133](https://github.com/binwiederhier/ntfy/issues/133), - thanks [@cmeis](https://github.com/cmeis) for reporting, thanks to [@Joeharrison94](https://github.com/Joeharrison94) and +* [Publish messages as JSON](https://ntfy.sh/docs/publish/#publish-as-json) ([#133](https://github.com/binwiederhier/ntfy/issues/133), + thanks [@cmeis](https://github.com/cmeis) for reporting, thanks to [@Joeharrison94](https://github.com/Joeharrison94) and [@Fallenbagel](https://github.com/Fallenbagel) for testing) **Bug fixes:** @@ -682,7 +682,7 @@ Released Mar 11, 2022 * Replace [web app](https://ntfy.sh/app) with a React/MUI-based web app from the 21st century (#111) * Web UI broken with auth (#132, thanks for reporting @arminus) * Send static web resources as `Content-Encoding: gzip`, i.e. docs and web app (no ticket) -* Add support for auth via `?auth=...` query param, used by WebSocket in web app (no ticket) +* Add support for auth via `?auth=...` query param, used by WebSocket in web app (no ticket) ## ntfy server v1.16.0 Released Feb 27, 2022 @@ -699,7 +699,7 @@ Released Feb 27, 2022 **Technical notes:** -* As of this release, message IDs will be 12 characters long (as opposed to 10 characters). This is to be able to +* As of this release, message IDs will be 12 characters long (as opposed to 10 characters). This is to be able to distinguish them from Unix timestamps for #151. ## ntfy Android app v1.9.1 @@ -746,7 +746,7 @@ Released Feb 6, 2022 **Features:** -* Support [auth / access control](https://ntfy.sh/docs/config/#access-control) (#19, thanks to @cmeis, @drsprite/@poblabs, +* Support [auth / access control](https://ntfy.sh/docs/config/#access-control) (#19, thanks to @cmeis, @drsprite/@poblabs, @gedw99, @karmanyaahm, @Mek101, @gc-ss, @julianfoad, @nmoseman, Jakob, PeterCxy, Techlosopher) * Export/upload log now allows censored/uncensored logs (no ticket) * Removed wake lock (except for notification dispatching, no ticket) diff --git a/docs/static/css/extra.css b/docs/static/css/extra.css index 6ac0b7e7..25417062 100644 --- a/docs/static/css/extra.css +++ b/docs/static/css/extra.css @@ -1,130 +1,133 @@ :root > * { - --md-primary-fg-color: #338574; - --md-primary-fg-color--light: #338574; - --md-primary-fg-color--dark: #338574; + --md-primary-fg-color: #338574; + --md-primary-fg-color--light: #338574; + --md-primary-fg-color--dark: #338574; } .md-header__button.md-logo :is(img, svg) { - width: unset !important; + width: unset !important; } .md-header__topic:first-child { - font-weight: 400; + font-weight: 400; } .md-typeset h4 { - font-weight: 500 !important; - margin: 0 !important; - font-size: 1.1em !important; + font-weight: 500 !important; + margin: 0 !important; + font-size: 1.1em !important; } .admonition { - font-size: .74rem !important; + font-size: 0.74rem !important; } article { - padding-bottom: 50px; + padding-bottom: 50px; } -figure img, figure video { - border-radius: 7px; +figure img, +figure video { + border-radius: 7px; } -body[data-md-color-scheme="default"] figure img, body[data-md-color-scheme="default"] figure video { - filter: drop-shadow(3px 3px 3px #ccc); +body[data-md-color-scheme="default"] figure img, +body[data-md-color-scheme="default"] figure video { + filter: drop-shadow(3px 3px 3px #ccc); } -body[data-md-color-scheme="slate"] figure img, body[data-md-color-scheme="slate"] figure video { - filter: drop-shadow(3px 3px 3px #1a1313); +body[data-md-color-scheme="slate"] figure img, +body[data-md-color-scheme="slate"] figure video { + filter: drop-shadow(3px 3px 3px #1a1313); } figure video { - width: 100%; - max-height: 450px; + width: 100%; + max-height: 450px; } .remove-md-box { - background: none; - border: none; - margin: 0 auto; + background: none; + border: none; + margin: 0 auto; } .remove-md-box td { - padding: 0 10px + padding: 0 10px; } /* Lightbox; thanks to https://yossiabramov.com/blog/vanilla-js-lightbox */ .screenshots { - text-align: center; + text-align: center; } .screenshots img { - max-height: 230px; - max-width: 300px; - margin: 3px; - border-radius: 5px; - filter: drop-shadow(2px 2px 2px #ddd); + max-height: 230px; + max-width: 300px; + margin: 3px; + border-radius: 5px; + filter: drop-shadow(2px 2px 2px #ddd); } .screenshots .nowrap { - white-space: nowrap; + white-space: nowrap; } .lightbox { - opacity: 0; - visibility: hidden; - position: fixed; - left:0; - right: 0; - top: 0; - bottom: 0; - z-index: -1; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.15s ease-in; + opacity: 0; + visibility: hidden; + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: -1; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.15s ease-in; } .lightbox.show { - background-color: rgba(0,0,0, 0.75); - opacity: 1; - visibility: visible; - z-index: 1000; + background-color: rgba(0, 0, 0, 0.75); + opacity: 1; + visibility: visible; + z-index: 1000; } .lightbox img { - max-width: 90%; - max-height: 90%; - filter: drop-shadow(5px 5px 10px #222); - border-radius: 5px; + max-width: 90%; + max-height: 90%; + filter: drop-shadow(5px 5px 10px #222); + border-radius: 5px; } .lightbox .close-lightbox { - cursor: pointer; - position: absolute; - top: 30px; - right: 30px; - width: 20px; - height: 20px; + cursor: pointer; + position: absolute; + top: 30px; + right: 30px; + width: 20px; + height: 20px; } .lightbox .close-lightbox::after, .lightbox .close-lightbox::before { - content: ''; - width: 3px; - height: 20px; - background-color: #ddd; - position: absolute; - border-radius: 5px; - transform: rotate(45deg); + content: ""; + width: 3px; + height: 20px; + background-color: #ddd; + position: absolute; + border-radius: 5px; + transform: rotate(45deg); } .lightbox .close-lightbox::before { - transform: rotate(-45deg); + transform: rotate(-45deg); } .lightbox .close-lightbox:hover::after, .lightbox .close-lightbox:hover::before { - background-color: #fff; + background-color: #fff; } diff --git a/docs/static/js/extra.js b/docs/static/js/extra.js index 6ddf07a9..a882ce29 100644 --- a/docs/static/js/extra.js +++ b/docs/static/js/extra.js @@ -1,99 +1,109 @@ // Link tabs, as per https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/#linked-tabs -const savedCodeTab = localStorage.getItem('savedTab') -const codeTabs = document.querySelectorAll(".tabbed-set > input") +const savedCodeTab = localStorage.getItem("savedTab"); +const codeTabs = document.querySelectorAll(".tabbed-set > input"); for (const tab of codeTabs) { - tab.addEventListener("click", () => { - const current = document.querySelector(`label[for=${tab.id}]`) - const pos = current.getBoundingClientRect().top - const labelContent = current.innerHTML - const labels = document.querySelectorAll('.tabbed-set > label, .tabbed-alternate > .tabbed-labels > label') - for (const label of labels) { - if (label.innerHTML === labelContent) { - document.querySelector(`input[id=${label.getAttribute('for')}]`).checked = true - } - } - - // Preserve scroll position - const delta = (current.getBoundingClientRect().top) - pos - window.scrollBy(0, delta) - - // Save - localStorage.setItem('savedTab', labelContent) - }) - - // Select saved tab - const current = document.querySelector(`label[for=${tab.id}]`) - const labelContent = current.innerHTML - if (savedCodeTab === labelContent) { - tab.checked = true + tab.addEventListener("click", () => { + const current = document.querySelector(`label[for=${tab.id}]`); + const pos = current.getBoundingClientRect().top; + const labelContent = current.innerHTML; + const labels = document.querySelectorAll( + ".tabbed-set > label, .tabbed-alternate > .tabbed-labels > label", + ); + for (const label of labels) { + if (label.innerHTML === labelContent) { + document.querySelector( + `input[id=${label.getAttribute("for")}]`, + ).checked = true; + } } + + // Preserve scroll position + const delta = current.getBoundingClientRect().top - pos; + window.scrollBy(0, delta); + + // Save + localStorage.setItem("savedTab", labelContent); + }); + + // Select saved tab + const current = document.querySelector(`label[for=${tab.id}]`); + const labelContent = current.innerHTML; + if (savedCodeTab === labelContent) { + tab.checked = true; + } } // Lightbox for screenshot -const lightbox = document.createElement('div'); -lightbox.classList.add('lightbox'); +const lightbox = document.createElement("div"); +lightbox.classList.add("lightbox"); document.body.appendChild(lightbox); const showScreenshotOverlay = (e, el, group, index) => { - lightbox.classList.add('show'); - document.addEventListener('keydown', nextScreenshotKeyboardListener); - return showScreenshot(e, group, index); + lightbox.classList.add("show"); + document.addEventListener("keydown", nextScreenshotKeyboardListener); + return showScreenshot(e, group, index); }; const showScreenshot = (e, group, index) => { - const actualIndex = resolveScreenshotIndex(group, index); - lightbox.innerHTML = '
' + screenshots[group][actualIndex].innerHTML; - lightbox.querySelector('img').onclick = (e) => { return showScreenshot(e, group, actualIndex+1); }; - currentScreenshotGroup = group; - currentScreenshotIndex = actualIndex; - e.stopPropagation(); - return false; + const actualIndex = resolveScreenshotIndex(group, index); + lightbox.innerHTML = + '
' + + screenshots[group][actualIndex].innerHTML; + lightbox.querySelector("img").onclick = (e) => { + return showScreenshot(e, group, actualIndex + 1); + }; + currentScreenshotGroup = group; + currentScreenshotIndex = actualIndex; + e.stopPropagation(); + return false; }; const nextScreenshot = (e) => { - return showScreenshot(e, currentScreenshotGroup, currentScreenshotIndex+1); + return showScreenshot(e, currentScreenshotGroup, currentScreenshotIndex + 1); }; const previousScreenshot = (e) => { - return showScreenshot(e, currentScreenshotGroup, currentScreenshotIndex-1); + return showScreenshot(e, currentScreenshotGroup, currentScreenshotIndex - 1); }; const resolveScreenshotIndex = (group, index) => { - if (index < 0) { - return screenshots[group].length - 1; - } else if (index > screenshots[group].length - 1) { - return 0; - } - return index; + if (index < 0) { + return screenshots[group].length - 1; + } else if (index > screenshots[group].length - 1) { + return 0; + } + return index; }; const hideScreenshotOverlay = (e) => { - lightbox.classList.remove('show'); - document.removeEventListener('keydown', nextScreenshotKeyboardListener); + lightbox.classList.remove("show"); + document.removeEventListener("keydown", nextScreenshotKeyboardListener); }; const nextScreenshotKeyboardListener = (e) => { - switch (e.keyCode) { - case 37: - previousScreenshot(e); - break; - case 39: - nextScreenshot(e); - break; - } + switch (e.keyCode) { + case 37: + previousScreenshot(e); + break; + case 39: + nextScreenshot(e); + break; + } }; -let currentScreenshotGroup = ''; +let currentScreenshotGroup = ""; let currentScreenshotIndex = 0; let screenshots = {}; -Array.from(document.getElementsByClassName('screenshots')).forEach((sg) => { - const group = sg.id; - screenshots[group] = [...sg.querySelectorAll('a')]; - screenshots[group].forEach((el, index) => { - el.onclick = (e) => { return showScreenshotOverlay(e, el, group, index); }; - }); +Array.from(document.getElementsByClassName("screenshots")).forEach((sg) => { + const group = sg.id; + screenshots[group] = [...sg.querySelectorAll("a")]; + screenshots[group].forEach((el, index) => { + el.onclick = (e) => { + return showScreenshotOverlay(e, el, group, index); + }; + }); }); lightbox.onclick = hideScreenshotOverlay; diff --git a/docs/subscribe/api.md b/docs/subscribe/api.md index db1bf3d0..80f8c018 100644 --- a/docs/subscribe/api.md +++ b/docs/subscribe/api.md @@ -1,14 +1,14 @@ # Subscribe via API You can create and subscribe to a topic in the [web UI](web.md), via the [phone app](phone.md), via the [ntfy CLI](cli.md), -or in your own app or script by subscribing the API. This page describes how to subscribe via API. You may also want to +or in your own app or script by subscribing the API. This page describes how to subscribe via API. You may also want to check out the page that describes how to [publish messages](../publish.md). -You can consume the subscription API as either a **[simple HTTP stream (JSON, SSE or raw)](#http-stream)**, or +You can consume the subscription API as either a **[simple HTTP stream (JSON, SSE or raw)](#http-stream)**, or **[via WebSockets](#websockets)**. Both are incredibly simple to use. ## HTTP stream The HTTP stream-based API relies on a simple GET request with a streaming HTTP response, i.e **you open a GET request and -the connection stays open forever**, sending messages back as they come in. There are three different API endpoints, which +the connection stays open forever**, sending messages back as they come in. There are three different API endpoints, which only differ in the response format: * [JSON stream](#subscribe-as-json-stream): `/json` returns a JSON stream, with one JSON message object per line @@ -17,8 +17,8 @@ only differ in the response format: * [Raw stream](#subscribe-as-raw-stream): `/raw` returns messages as raw text, with one line per message ### Subscribe as JSON stream -Here are a few examples of how to consume the JSON endpoint (`/json`). For almost all languages, **this is the -recommended way to subscribe to a topic**. The notable exception is JavaScript, for which the +Here are a few examples of how to consume the JSON endpoint (`/json`). For almost all languages, **this is the +recommended way to subscribe to a topic**. The notable exception is JavaScript, for which the [SSE/EventSource stream](#subscribe-as-sse-stream) is much easier to work with. === "Command line (curl)" @@ -45,7 +45,7 @@ recommended way to subscribe to a topic**. The notable exception is JavaScript, HTTP/1.1 200 OK Content-Type: application/x-ndjson; charset=utf-8 Transfer-Encoding: chunked - + {"id":"SLiKI64DOt","time":1635528757,"event":"open","topic":"mytopic"} {"id":"hwQ2YpKdmg","time":1635528741,"event":"message","topic":"mytopic","message":"Disk full"} {"id":"DGUDShMCsc","time":1635528787,"event":"keepalive","topic":"mytopic"} @@ -86,7 +86,7 @@ recommended way to subscribe to a topic**. The notable exception is JavaScript, ### Subscribe as SSE stream Using [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) in JavaScript, you can consume -notifications via a [Server-Sent Events (SSE)](https://en.wikipedia.org/wiki/Server-sent_events) stream. It's incredibly +notifications via a [Server-Sent Events (SSE)](https://en.wikipedia.org/wiki/Server-sent_events) stream. It's incredibly easy to use. Here's what it looks like. You may also want to check out the [full example on GitHub](https://github.com/binwiederhier/ntfy/tree/main/examples/web-example-eventsource). === "Command line (curl)" @@ -94,9 +94,9 @@ easy to use. Here's what it looks like. You may also want to check out the [full $ curl -s ntfy.sh/mytopic/sse event: open data: {"id":"weSj9RtNkj","time":1635528898,"event":"open","topic":"mytopic"} - + data: {"id":"p0M5y6gcCY","time":1635528909,"event":"message","topic":"mytopic","message":"Hi!"} - + event: keepalive data: {"id":"VNxNIg5fpt","time":1635528928,"event":"keepalive","topic":"test"} ... @@ -113,9 +113,9 @@ easy to use. Here's what it looks like. You may also want to check out the [full event: open data: {"id":"weSj9RtNkj","time":1635528898,"event":"open","topic":"mytopic"} - + data: {"id":"p0M5y6gcCY","time":1635528909,"event":"message","topic":"mytopic","message":"Hi!"} - + event: keepalive data: {"id":"VNxNIg5fpt","time":1635528928,"event":"keepalive","topic":"test"} ... @@ -131,14 +131,14 @@ easy to use. Here's what it looks like. You may also want to check out the [full ### Subscribe as raw stream The `/raw` endpoint will output one line per message, and **will only include the message body**. It's useful for extremely -simple scripts, and doesn't include all the data. Additional fields such as [priority](../publish.md#message-priority), -[tags](../publish.md#tags--emojis--) or [message title](../publish.md#message-title) are not included in this output +simple scripts, and doesn't include all the data. Additional fields such as [priority](../publish.md#message-priority), +[tags](../publish.md#tags--emojis--) or [message title](../publish.md#message-title) are not included in this output format. Keepalive messages are sent as empty lines. === "Command line (curl)" ``` $ curl -s ntfy.sh/disk-alerts/raw - + Disk full ... ``` @@ -170,7 +170,7 @@ format. Keepalive messages are sent as empty lines. ``` === "Python" - ``` python + ``` python resp = requests.get("https://ntfy.sh/disk-alerts/raw", stream=True) for line in resp.iter_lines(): if line: @@ -189,13 +189,13 @@ format. Keepalive messages are sent as empty lines. ``` ## WebSockets -You may also subscribe to topics via [WebSockets](https://en.wikipedia.org/wiki/WebSocket), which is also widely -supported in many languages. Most notably, WebSockets are natively supported in JavaScript. On the command line, +You may also subscribe to topics via [WebSockets](https://en.wikipedia.org/wiki/WebSocket), which is also widely +supported in many languages. Most notably, WebSockets are natively supported in JavaScript. On the command line, I recommend [websocat](https://github.com/vi/websocat), a fantastic tool similar to `socat` or `curl`, but specifically -for WebSockets. +for WebSockets. -The WebSockets endpoint is available at `/ws` and returns messages as JSON objects similar to the -[JSON stream endpoint](#subscribe-as-json-stream). +The WebSockets endpoint is available at `/ws` and returns messages as JSON objects similar to the +[JSON stream endpoint](#subscribe-as-json-stream). === "Command line (websocat)" ``` @@ -246,7 +246,7 @@ curl -s "ntfy.sh/mytopic/json?poll=1" ### Fetch cached messages Messages may be cached for a couple of hours (see [message caching](../config.md#message-cache)) to account for network -interruptions of subscribers. If the server has configured message caching, you can read back what you missed by using +interruptions of subscribers. If the server has configured message caching, you can read back what you missed by using the `since=` query parameter. It takes a duration (e.g. `10m` or `30s`), a Unix timestamp (e.g. `1635528757`), a message ID (e.g. `nFS3knfcQ1xe`), or `all` (all cached messages). @@ -257,9 +257,9 @@ curl -s "ntfy.sh/mytopic/json?since=nFS3knfcQ1xe" ``` ### Fetch scheduled messages -Messages that are [scheduled to be delivered](../publish.md#scheduled-delivery) at a later date are not typically -returned when subscribing via the API, which makes sense, because after all, the messages have technically not been -delivered yet. To also return scheduled messages from the API, you can use the `scheduled=1` (alias: `sched=1`) +Messages that are [scheduled to be delivered](../publish.md#scheduled-delivery) at a later date are not typically +returned when subscribing via the API, which makes sense, because after all, the messages have technically not been +delivered yet. To also return scheduled messages from the API, you can use the `scheduled=1` (alias: `sched=1`) parameter (makes most sense with the `poll=1` parameter): ``` @@ -268,8 +268,8 @@ curl -s "ntfy.sh/mytopic/json?poll=1&sched=1" ### Filter messages You can filter which messages are returned based on the well-known message fields `id`, `message`, `title`, `priority` and -`tags`. Here's an example that only returns messages of high or urgent priority that contains the both tags -"zfs-error" and "error". Note that the `priority` filter is a logical OR and the `tags` filter is a logical AND. +`tags`. Here's an example that only returns messages of high or urgent priority that contains the both tags +"zfs-error" and "error". Note that the `priority` filter is a logical OR and the `tags` filter is a logical AND. ``` $ curl "ntfy.sh/alerts/json?priority=high&tags=zfs-error" @@ -289,7 +289,7 @@ Available filters (all case-insensitive): | `tags` | `X-Tags`, `tag`, `ta` | `ntfy.sh/mytopic?/jsontags=error,alert` | Only return messages that match *all listed tags* (comma-separated) | ### Subscribe to multiple topics -It's possible to subscribe to multiple topics in one HTTP call by providing a comma-separated list of topics +It's possible to subscribe to multiple topics in one HTTP call by providing a comma-separated list of topics in the URL. This allows you to reduce the number of connections you have to maintain: ``` @@ -318,7 +318,7 @@ format of the message. It's very straight forward: | Field | Required | Type | Example | Description | |--------------|----------|---------------------------------------------------|-------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------| | `id` | ✔️ | *string* | `hwQ2YpKdmg` | Randomly chosen message identifier | -| `time` | ✔️ | *number* | `1635528741` | Message date time, as Unix time stamp | +| `time` | ✔️ | *number* | `1635528741` | Message date time, as Unix time stamp | | `event` | ✔️ | `open`, `keepalive`, `message`, or `poll_request` | `message` | Message type, typically you'd be only interested in `message` | | `topic` | ✔️ | *string* | `topic1,topic2` | Comma-separated list of topics the message is associated with; only one for all `message` events, but may be a list in `open` events | | `message` | - | *string* | `Some message` | Message body; always present in `message` events | @@ -334,7 +334,7 @@ format of the message. It's very straight forward: | Field | Required | Type | Example | Description | |-----------|----------|-------------|--------------------------------|-----------------------------------------------------------------------------------------------------------| | `name` | ✔️ | *string* | `attachment.jpg` | Name of the attachment, can be overridden with `X-Filename`, see [attachments](../publish.md#attachments) | -| `url` | ✔️ | *URL* | `https://example.com/file.jpg` | URL of the attachment | +| `url` | ✔️ | *URL* | `https://example.com/file.jpg` | URL of the attachment | | `type` | -️ | *mime type* | `image/jpeg` | Mime type of the attachment, only defined if attachment was uploaded to ntfy server | | `size` | -️ | *number* | `33848` | Size of the attachment in bytes, only defined if attachment was uploaded to ntfy server | | `expires` | -️ | *number* | `1635528741` | Attachment expiry date as Unix time stamp, only defined if attachment was uploaded to ntfy server | @@ -396,7 +396,7 @@ Here's an example for each message type: "event": "keepalive", "topic": "phil_alerts" } - ``` + ``` === "Poll request message" ``` json diff --git a/docs/subscribe/cli.md b/docs/subscribe/cli.md index f1f9e760..7a1e384f 100644 --- a/docs/subscribe/cli.md +++ b/docs/subscribe/cli.md @@ -4,14 +4,14 @@ to topics via the ntfy CLI. The CLI is included in the same `ntfy` binary that c !!! info The **ntfy CLI is not required to send or receive messages**. You can instead [send messages with curl](../publish.md), - and even use it to [subscribe to topics](api.md). It may be a little more convenient to use the ntfy CLI than writing + and even use it to [subscribe to topics](api.md). It may be a little more convenient to use the ntfy CLI than writing your own script. It all depends on the use case. 😀 ## Install + configure -To install the ntfy CLI, simply **follow the steps outlined on the [install page](../install.md)**. The ntfy server and -client are the same binary, so it's all very convenient. After installing, you can (optionally) configure the client -by creating `~/.config/ntfy/client.yml` (for the non-root user), or `/etc/ntfy/client.yml` (for the root user). You -can find a [skeleton config](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml) on GitHub. +To install the ntfy CLI, simply **follow the steps outlined on the [install page](../install.md)**. The ntfy server and +client are the same binary, so it's all very convenient. After installing, you can (optionally) configure the client +by creating `~/.config/ntfy/client.yml` (for the non-root user), or `/etc/ntfy/client.yml` (for the root user). You +can find a [skeleton config](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml) on GitHub. If you just want to use [ntfy.sh](https://ntfy.sh), you don't have to change anything. If you **self-host your own server**, you may want to edit the `default-host` option: @@ -24,7 +24,7 @@ default-host: https://ntfy.myhost.com ``` ## Publish messages -You can send messages with the ntfy CLI using the `ntfy publish` command (or any of its aliases `pub`, `send` or +You can send messages with the ntfy CLI using the `ntfy publish` command (or any of its aliases `pub`, `send` or `trigger`). There are a lot of examples on the page about [publishing messages](../publish.md), but here are a few quick ones: @@ -32,7 +32,7 @@ quick ones: ``` ntfy publish mytopic This is a message ntfy publish mytopic "This is a message" - ntfy pub mytopic "This is a message" + ntfy pub mytopic "This is a message" ``` === "Send with title, priority, and tags" @@ -78,7 +78,7 @@ $ ntfy pub --file README.md mytopic | jq . ``` ### Wait for PID/command -If you have a long-running command and want to **publish a notification when the command completes**, +If you have a long-running command and want to **publish a notification when the command completes**, you may wrap it with `ntfy publish --wait-cmd` (aliases: `--cmd`, `--done`). Or, if you forgot to wrap it, and the command is already running, you can wait for the process to complete with `ntfy publish --wait-pid` (alias: `--pid`). @@ -123,15 +123,15 @@ Or, if you already started the long-running process and want to wait for it usin ## Subscribe to topics You can subscribe to topics using `ntfy subscribe`. Depending on how it is called, this command -will either print or execute a command for every arriving message. There are a few different ways +will either print or execute a command for every arriving message. There are a few different ways in which the command can be run: ### Stream messages as JSON ``` ntfy subscribe TOPIC ``` -If you run the command like this, it prints the JSON representation of every incoming message. This is useful -when you have a command that wants to stream-read incoming JSON messages. Unless `--poll` is passed, this command +If you run the command like this, it prints the JSON representation of every incoming message. This is useful +when you have a command that wants to stream-read incoming JSON messages. Unless `--poll` is passed, this command stays open forever. ``` @@ -152,7 +152,7 @@ ntfy subscribe TOPIC COMMAND ``` If you run it like this, a COMMAND is executed for every incoming messages. Scroll down to see a list of available environment variables. Here are a few examples: - + ``` ntfy sub mytopic 'notify-send "$m"' ntfy sub topic1 /my/script.sh @@ -164,7 +164,7 @@ ntfy sub topic1 'echo "Message $m was received. Its title was $t and it had prio
Execute command on incoming messages
-The message fields are passed to the command as environment variables and can be used in scripts. Note that since +The message fields are passed to the command as environment variables and can be used in scripts. Note that since these are environment variables, you typically don't have to worry about quoting too much, as long as you enclose them in double-quotes, you should be fine: @@ -178,7 +178,7 @@ in double-quotes, you should be fine: | `$NTFY_PRIORITY` | `$priority`, `$prio`, `$p` | Message priority (1=min, 5=max) | | `$NTFY_TAGS` | `$tags`, `$tag`, `$ta` | Message tags (comma separated list) | | `$NTFY_RAW` | `$raw` | Raw JSON message | - + ### Subscribe to multiple topics ``` ntfy subscribe --from-config @@ -242,8 +242,8 @@ Here's an example config file that subscribes to three different topics, executi In this example, when `ntfy subscribe --from-config` is executed: * Messages to `echo-this` simply echos to standard out -* Messages to `alerts` display as desktop notification for high priority messages using [notify-send](https://manpages.ubuntu.com/manpages/focal/man1/notify-send.1.html) (Linux), - [notifu](https://www.paralint.com/projects/notifu/) (Windows) or `osascript` (macOS) +* Messages to `alerts` display as desktop notification for high priority messages using [notify-send](https://manpages.ubuntu.com/manpages/focal/man1/notify-send.1.html) (Linux), + [notifu](https://www.paralint.com/projects/notifu/) (Windows) or `osascript` (macOS) * Messages to `calc` open the calculator 😀 (*because, why not*) * Messages to `print-temp` execute an inline script and print the CPU temperature (Linux version only) @@ -271,8 +271,8 @@ if you install the deb/rpm package. To configure it, simply edit `/etc/ntfy/clie The `ntfy-client.service` runs as user `ntfy`, meaning that typical Linux permission restrictions apply. See below for how to fix this. -If the service runs on your personal desktop machine, you may want to override the service user/group (`User=` and `Group=`), and -adjust the `DISPLAY` and `DBUS_SESSION_BUS_ADDRESS` environment variables. This will allow you to run commands in your X session +If the service runs on your personal desktop machine, you may want to override the service user/group (`User=` and `Group=`), and +adjust the `DISPLAY` and `DBUS_SESSION_BUS_ADDRESS` environment variables. This will allow you to run commands in your X session as the primary machine user. You can either manually override these systemd service entries with `sudo systemctl edit ntfy-client`, and add this @@ -306,7 +306,7 @@ Depending on whether the server is configured to support [access control](../con may be read/write protected so that only users with the correct credentials can subscribe or publish to them. To publish/subscribe to protected topics, you can use [Basic Auth](https://en.wikipedia.org/wiki/Basic_access_authentication) with a valid username/password. For your self-hosted server, **be sure to use HTTPS to avoid eavesdropping** and exposing -your password. +your password. You can either add your username and password to the configuration file: === "~/.config/ntfy/client.yml" diff --git a/docs/subscribe/phone.md b/docs/subscribe/phone.md index 440dbbe3..145fa762 100644 --- a/docs/subscribe/phone.md +++ b/docs/subscribe/phone.md @@ -1,14 +1,14 @@ # Subscribe from your phone You can use the ntfy [Android App](https://play.google.com/store/apps/details?id=io.heckel.ntfy) or [iOS app](https://apps.apple.com/us/app/ntfy/id1625396347) to receive notifications directly on your phone. Just like the server, this app is also open source, and the code is available -on GitHub ([Android](https://github.com/binwiederhier/ntfy-android), [iOS](https://github.com/binwiederhier/ntfy-ios)). Feel free to +on GitHub ([Android](https://github.com/binwiederhier/ntfy-android), [iOS](https://github.com/binwiederhier/ntfy-ios)). Feel free to contribute, or [build your own](../develop.md). -You can get the Android app from both [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) and +You can get the Android app from both [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) and from [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/). Both are largely identical, with the one exception that the F-Droid flavor does not use Firebase. The iOS app can be downloaded from the [App Store](https://apps.apple.com/us/app/ntfy/id1625396347). @@ -65,8 +65,8 @@ setting, and other settings such as popover or notification dot: ## Instant delivery _Supported on:_ :material-android: -Instant delivery allows you to receive messages on your phone instantly, **even when your phone is in doze mode**, i.e. -when the screen turns off, and you leave it on the desk for a while. This is achieved with a foreground service, which +Instant delivery allows you to receive messages on your phone instantly, **even when your phone is in doze mode**, i.e. +when the screen turns off, and you leave it on the desk for a while. This is achieved with a foreground service, which you'll see as a permanent notification that looks like this:
@@ -75,7 +75,7 @@ you'll see as a permanent notification that looks like this:
Android does not allow you to dismiss this notification, unless you turn off the notification channel in the settings. -To do so, long-press on the foreground notification (screenshot above) and navigate to the settings. Then toggle the +To do so, long-press on the foreground notification (screenshot above) and navigate to the settings. Then toggle the "Subscription Service" off:
@@ -83,12 +83,12 @@ To do so, long-press on the foreground notification (screenshot above) and navig
Turning off the persistent instant delivery notification
-**Limitations without instant delivery**: Without instant delivery, **messages may arrive with a significant delay** -(sometimes many minutes, or even hours later). If you've ever picked up your phone and +**Limitations without instant delivery**: Without instant delivery, **messages may arrive with a significant delay** +(sometimes many minutes, or even hours later). If you've ever picked up your phone and suddenly had 10 messages that were sent long before you know what I'm talking about. -The reason for this is [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging). FCM is the -*only* Google approved way to send push messages to Android devices, and it's what pretty much all apps use to deliver push +The reason for this is [Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging). FCM is the +*only* Google approved way to send push messages to Android devices, and it's what pretty much all apps use to deliver push notifications. Firebase is overall pretty bad at delivering messages in time, but on Android, most apps are stuck with it. The ntfy Android app uses Firebase only for the main host `ntfy.sh`, and only in the Google Play flavor of the app. @@ -113,10 +113,10 @@ _Supported on:_ :material-android: The ntfy Android app supports deep linking directly to topics. This is useful when integrating with [automation apps](#automation-apps) such as [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) or [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), -or to simply directly link to a topic from a mobile website. +or to simply directly link to a topic from a mobile website. !!! info - Android deep linking of http/https links is very brittle and limited, which is why something like `https:////subscribe` is + Android deep linking of http/https links is very brittle and limited, which is why something like `https:////subscribe` is **not possible**, and instead `ntfy://` links have to be used. More details in [issue #20](https://github.com/binwiederhier/ntfy/issues/20). **Supported link formats:** @@ -132,10 +132,10 @@ or to simply directly link to a topic from a mobile website. _Supported on:_ :material-android: [UnifiedPush](https://unifiedpush.org) is a standard for receiving push notifications without using the Google-owned -[Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging) service. It puts push notifications -in the control of the user. ntfy can act as a **UnifiedPush distributor**, forwarding messages to apps that support it. +[Firebase Cloud Messaging (FCM)](https://firebase.google.com/docs/cloud-messaging) service. It puts push notifications +in the control of the user. ntfy can act as a **UnifiedPush distributor**, forwarding messages to apps that support it. -To use ntfy as a distributor, simply select it in one of the [supported apps](https://unifiedpush.org/users/apps/). +To use ntfy as a distributor, simply select it in one of the [supported apps](https://unifiedpush.org/users/apps/). That's it. It's a one-step installation 😀. If desired, you can select your own [selfhosted ntfy server](../install.md) to handle messages. Here's an example with [FluffyChat](https://fluffychat.im/): @@ -156,7 +156,7 @@ or [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android. To react on incoming notifications, you have to register to intents with the `io.heckel.ntfy.MESSAGE_RECEIVED` action (see [code for details](https://github.com/binwiederhier/ntfy-android/blob/main/app/src/main/java/io/heckel/ntfy/msg/BroadcastService.kt)). Here's an example using [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) -and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), but any app that can catch +and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), but any app that can catch broadcasts is supported:
@@ -170,7 +170,7 @@ broadcasts is supported:
For MacroDroid, be sure to type in the package name `io.heckel.ntfy`, otherwise intents may be silently swallowed. -If you're using topics to drive automation, you'll likely want to mute the topic in the ntfy app. This will prevent +If you're using topics to drive automation, you'll likely want to mute the topic in the ntfy app. This will prevent notification popups:
@@ -204,10 +204,10 @@ Here's a list of extras you can access. Most likely, you'll want to filter for ` #### Send messages using intents To send messages from other apps (such as [MacroDroid](https://play.google.com/store/apps/details?id=com.arlosoft.macrodroid) -and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)), you can +and [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)), you can broadcast an intent with the `io.heckel.ntfy.SEND_MESSAGE` action. The ntfy Android app will forward the intent as a HTTP POST request to [publish a message](../publish.md). This is primarily useful for apps that do not support HTTP POST/PUT -(like MacroDroid). In Tasker, you can simply use the "HTTP Request" action, which is a little easier and also works if +(like MacroDroid). In Tasker, you can simply use the "HTTP Request" action, which is a little easier and also works if ntfy is not installed. Here's what that looks like: diff --git a/docs/subscribe/web.md b/docs/subscribe/web.md index 74763b83..b644b2b8 100644 --- a/docs/subscribe/web.md +++ b/docs/subscribe/web.md @@ -1,12 +1,12 @@ # Subscribe from the Web UI You can use the Web UI to subscribe to topics as well. If you do, and you keep the website open, **notifications will -pop up as desktop notifications**. Simply type in the topic name and click the *Subscribe* button. The browser will +pop up as desktop notifications**. Simply type in the topic name and click the *Subscribe* button. The browser will keep a connection open and listen for incoming notifications. To learn how to send messages, check out the [publishing page](../publish.md).
- +
diff --git a/examples/web-example-eventsource/example-sse.html b/examples/web-example-eventsource/example-sse.html index e558ef12..de2bf643 100644 --- a/examples/web-example-eventsource/example-sse.html +++ b/examples/web-example-eventsource/example-sse.html @@ -1,56 +1,64 @@ - + - - + + ntfy.sh: EventSource Example - - -

ntfy.sh: EventSource Example

-

- This is an example showing how to use ntfy.sh with - EventSource.
- This example doesn't need a server. You can just save the HTML page and run it from anywhere. -

- -

Log:

-
+ + +

ntfy.sh: EventSource Example

+

+ This is an example showing how to use + ntfy.sh with + EventSource.
+ This example doesn't need a server. You can just save the HTML page and + run it from anywhere. +

+ +

Log:

+
- - - + }; + + diff --git a/main.go b/main.go index 5b1428d1..5b092493 100644 --- a/main.go +++ b/main.go @@ -2,10 +2,11 @@ package main import ( "fmt" - "github.com/urfave/cli/v2" - "heckel.io/ntfy/cmd" "os" "runtime" + + "github.com/urfave/cli/v2" + "heckel.io/ntfy/cmd" ) var ( diff --git a/mkdocs.yml b/mkdocs.yml index bd6e02f6..198a31ea 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -15,12 +15,12 @@ theme: include_search_page: false search_index_only: true palette: - - media: "(prefers-color-scheme: light)" # Light mode + - media: "(prefers-color-scheme: light)" # Light mode scheme: default toggle: icon: material/lightbulb-outline name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" # Dark mode + - media: "(prefers-color-scheme: dark)" # Dark mode scheme: slate accent: indigo toggle: @@ -71,26 +71,24 @@ plugins: minify_html: true nav: -- "Getting started": index.md -- "Publishing": - - "Sending messages": publish.md -- "Subscribing": - - "From your phone": subscribe/phone.md - - "From the Web UI": subscribe/web.md - - "From the CLI": subscribe/cli.md - - "Using the API": subscribe/api.md -- "Self-hosting": - - "Installation": install.md - - "Configuration": config.md -- "Other things": - - "FAQs": faq.md - - "Examples": examples.md - - "Integrations + projects": integrations.md - - "Release notes": releases.md - - "Emojis 🥳 🎉": emojis.md - - "Known issues": known-issues.md - - "Deprecation notices": deprecations.md - - "Development": develop.md - - "Privacy policy": privacy.md - - + - "Getting started": index.md + - "Publishing": + - "Sending messages": publish.md + - "Subscribing": + - "From your phone": subscribe/phone.md + - "From the Web UI": subscribe/web.md + - "From the CLI": subscribe/cli.md + - "Using the API": subscribe/api.md + - "Self-hosting": + - "Installation": install.md + - "Configuration": config.md + - "Other things": + - "FAQs": faq.md + - "Examples": examples.md + - "Integrations + projects": integrations.md + - "Release notes": releases.md + - "Emojis 🥳 🎉": emojis.md + - "Known issues": known-issues.md + - "Deprecation notices": deprecations.md + - "Development": develop.md + - "Privacy policy": privacy.md diff --git a/scripts/emoji.json b/scripts/emoji.json index aa7dbb0a..2fe9c220 100644 --- a/scripts/emoji.json +++ b/scripts/emoji.json @@ -1,22747 +1,16602 @@ [ { - "emoji": "😀" - , "description": "grinning face" - , "category": "Smileys & Emotion" - , "aliases": [ - "grinning" - ] - , "tags": [ - "smile" - , "happy" - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😃" - , "description": "grinning face with big eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "smiley" - ] - , "tags": [ - "happy" - , "joy" - , "haha" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😄" - , "description": "grinning face with smiling eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "smile" - ] - , "tags": [ - "happy" - , "joy" - , "laugh" - , "pleased" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😁" - , "description": "beaming face with smiling eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "grin" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😆" - , "description": "grinning squinting face" - , "category": "Smileys & Emotion" - , "aliases": [ - "laughing" - , "satisfied" - ] - , "tags": [ - "happy" - , "haha" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😅" - , "description": "grinning face with sweat" - , "category": "Smileys & Emotion" - , "aliases": [ - "sweat_smile" - ] - , "tags": [ - "hot" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤣" - , "description": "rolling on the floor laughing" - , "category": "Smileys & Emotion" - , "aliases": [ - "rofl" - ] - , "tags": [ - "lol" - , "laughing" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "😂" - , "description": "face with tears of joy" - , "category": "Smileys & Emotion" - , "aliases": [ - "joy" - ] - , "tags": [ - "tears" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🙂" - , "description": "slightly smiling face" - , "category": "Smileys & Emotion" - , "aliases": [ - "slightly_smiling_face" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🙃" - , "description": "upside-down face" - , "category": "Smileys & Emotion" - , "aliases": [ - "upside_down_face" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "😉" - , "description": "winking face" - , "category": "Smileys & Emotion" - , "aliases": [ - "wink" - ] - , "tags": [ - "flirt" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😊" - , "description": "smiling face with smiling eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "blush" - ] - , "tags": [ - "proud" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😇" - , "description": "smiling face with halo" - , "category": "Smileys & Emotion" - , "aliases": [ - "innocent" - ] - , "tags": [ - "angel" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥰" - , "description": "smiling face with hearts" - , "category": "Smileys & Emotion" - , "aliases": [ - "smiling_face_with_three_hearts" - ] - , "tags": [ - "love" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😍" - , "description": "smiling face with heart-eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "heart_eyes" - ] - , "tags": [ - "love" - , "crush" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤩" - , "description": "star-struck" - , "category": "Smileys & Emotion" - , "aliases": [ - "star_struck" - ] - , "tags": [ - "eyes" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😘" - , "description": "face blowing a kiss" - , "category": "Smileys & Emotion" - , "aliases": [ - "kissing_heart" - ] - , "tags": [ - "flirt" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😗" - , "description": "kissing face" - , "category": "Smileys & Emotion" - , "aliases": [ - "kissing" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "☺️" - , "description": "smiling face" - , "category": "Smileys & Emotion" - , "aliases": [ - "relaxed" - ] - , "tags": [ - "blush" - , "pleased" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "😚" - , "description": "kissing face with closed eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "kissing_closed_eyes" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😙" - , "description": "kissing face with smiling eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "kissing_smiling_eyes" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "🥲" - , "description": "smiling face with tear" - , "category": "Smileys & Emotion" - , "aliases": [ - "smiling_face_with_tear" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "😋" - , "description": "face savoring food" - , "category": "Smileys & Emotion" - , "aliases": [ - "yum" - ] - , "tags": [ - "tongue" - , "lick" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😛" - , "description": "face with tongue" - , "category": "Smileys & Emotion" - , "aliases": [ - "stuck_out_tongue" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😜" - , "description": "winking face with tongue" - , "category": "Smileys & Emotion" - , "aliases": [ - "stuck_out_tongue_winking_eye" - ] - , "tags": [ - "prank" - , "silly" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤪" - , "description": "zany face" - , "category": "Smileys & Emotion" - , "aliases": [ - "zany_face" - ] - , "tags": [ - "goofy" - , "wacky" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😝" - , "description": "squinting face with tongue" - , "category": "Smileys & Emotion" - , "aliases": [ - "stuck_out_tongue_closed_eyes" - ] - , "tags": [ - "prank" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤑" - , "description": "money-mouth face" - , "category": "Smileys & Emotion" - , "aliases": [ - "money_mouth_face" - ] - , "tags": [ - "rich" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🤗" - , "description": "hugging face" - , "category": "Smileys & Emotion" - , "aliases": [ - "hugs" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🤭" - , "description": "face with hand over mouth" - , "category": "Smileys & Emotion" - , "aliases": [ - "hand_over_mouth" - ] - , "tags": [ - "quiet" - , "whoops" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🤫" - , "description": "shushing face" - , "category": "Smileys & Emotion" - , "aliases": [ - "shushing_face" - ] - , "tags": [ - "silence" - , "quiet" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🤔" - , "description": "thinking face" - , "category": "Smileys & Emotion" - , "aliases": [ - "thinking" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🤐" - , "description": "zipper-mouth face" - , "category": "Smileys & Emotion" - , "aliases": [ - "zipper_mouth_face" - ] - , "tags": [ - "silence" - , "hush" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🤨" - , "description": "face with raised eyebrow" - , "category": "Smileys & Emotion" - , "aliases": [ - "raised_eyebrow" - ] - , "tags": [ - "suspicious" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😐" - , "description": "neutral face" - , "category": "Smileys & Emotion" - , "aliases": [ - "neutral_face" - ] - , "tags": [ - "meh" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😑" - , "description": "expressionless face" - , "category": "Smileys & Emotion" - , "aliases": [ - "expressionless" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😶" - , "description": "face without mouth" - , "category": "Smileys & Emotion" - , "aliases": [ - "no_mouth" - ] - , "tags": [ - "mute" - , "silence" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😶‍🌫️" - , "description": "face in clouds" - , "category": "Smileys & Emotion" - , "aliases": [ - "face_in_clouds" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - } -, { - "emoji": "😏" - , "description": "smirking face" - , "category": "Smileys & Emotion" - , "aliases": [ - "smirk" - ] - , "tags": [ - "smug" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😒" - , "description": "unamused face" - , "category": "Smileys & Emotion" - , "aliases": [ - "unamused" - ] - , "tags": [ - "meh" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🙄" - , "description": "face with rolling eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "roll_eyes" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "😬" - , "description": "grimacing face" - , "category": "Smileys & Emotion" - , "aliases": [ - "grimacing" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😮‍💨" - , "description": "face exhaling" - , "category": "Smileys & Emotion" - , "aliases": [ - "face_exhaling" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - } -, { - "emoji": "🤥" - , "description": "lying face" - , "category": "Smileys & Emotion" - , "aliases": [ - "lying_face" - ] - , "tags": [ - "liar" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "😌" - , "description": "relieved face" - , "category": "Smileys & Emotion" - , "aliases": [ - "relieved" - ] - , "tags": [ - "whew" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😔" - , "description": "pensive face" - , "category": "Smileys & Emotion" - , "aliases": [ - "pensive" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😪" - , "description": "sleepy face" - , "category": "Smileys & Emotion" - , "aliases": [ - "sleepy" - ] - , "tags": [ - "tired" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤤" - , "description": "drooling face" - , "category": "Smileys & Emotion" - , "aliases": [ - "drooling_face" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "😴" - , "description": "sleeping face" - , "category": "Smileys & Emotion" - , "aliases": [ - "sleeping" - ] - , "tags": [ - "zzz" - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😷" - , "description": "face with medical mask" - , "category": "Smileys & Emotion" - , "aliases": [ - "mask" - ] - , "tags": [ - "sick" - , "ill" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤒" - , "description": "face with thermometer" - , "category": "Smileys & Emotion" - , "aliases": [ - "face_with_thermometer" - ] - , "tags": [ - "sick" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🤕" - , "description": "face with head-bandage" - , "category": "Smileys & Emotion" - , "aliases": [ - "face_with_head_bandage" - ] - , "tags": [ - "hurt" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🤢" - , "description": "nauseated face" - , "category": "Smileys & Emotion" - , "aliases": [ - "nauseated_face" - ] - , "tags": [ - "sick" - , "barf" - , "disgusted" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🤮" - , "description": "face vomiting" - , "category": "Smileys & Emotion" - , "aliases": [ - "vomiting_face" - ] - , "tags": [ - "barf" - , "sick" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🤧" - , "description": "sneezing face" - , "category": "Smileys & Emotion" - , "aliases": [ - "sneezing_face" - ] - , "tags": [ - "achoo" - , "sick" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥵" - , "description": "hot face" - , "category": "Smileys & Emotion" - , "aliases": [ - "hot_face" - ] - , "tags": [ - "heat" - , "sweating" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥶" - , "description": "cold face" - , "category": "Smileys & Emotion" - , "aliases": [ - "cold_face" - ] - , "tags": [ - "freezing" - , "ice" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥴" - , "description": "woozy face" - , "category": "Smileys & Emotion" - , "aliases": [ - "woozy_face" - ] - , "tags": [ - "groggy" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😵" - , "description": "knocked-out face" - , "category": "Smileys & Emotion" - , "aliases": [ - "dizzy_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😵‍💫" - , "description": "face with spiral eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "face_with_spiral_eyes" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - } -, { - "emoji": "🤯" - , "description": "exploding head" - , "category": "Smileys & Emotion" - , "aliases": [ - "exploding_head" - ] - , "tags": [ - "mind" - , "blown" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🤠" - , "description": "cowboy hat face" - , "category": "Smileys & Emotion" - , "aliases": [ - "cowboy_hat_face" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥳" - , "description": "partying face" - , "category": "Smileys & Emotion" - , "aliases": [ - "partying_face" - ] - , "tags": [ - "celebration" - , "birthday" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥸" - , "description": "disguised face" - , "category": "Smileys & Emotion" - , "aliases": [ - "disguised_face" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "😎" - , "description": "smiling face with sunglasses" - , "category": "Smileys & Emotion" - , "aliases": [ - "sunglasses" - ] - , "tags": [ - "cool" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤓" - , "description": "nerd face" - , "category": "Smileys & Emotion" - , "aliases": [ - "nerd_face" - ] - , "tags": [ - "geek" - , "glasses" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🧐" - , "description": "face with monocle" - , "category": "Smileys & Emotion" - , "aliases": [ - "monocle_face" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😕" - , "description": "confused face" - , "category": "Smileys & Emotion" - , "aliases": [ - "confused" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😟" - , "description": "worried face" - , "category": "Smileys & Emotion" - , "aliases": [ - "worried" - ] - , "tags": [ - "nervous" - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "🙁" - , "description": "slightly frowning face" - , "category": "Smileys & Emotion" - , "aliases": [ - "slightly_frowning_face" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "☹️" - , "description": "frowning face" - , "category": "Smileys & Emotion" - , "aliases": [ - "frowning_face" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "😮" - , "description": "face with open mouth" - , "category": "Smileys & Emotion" - , "aliases": [ - "open_mouth" - ] - , "tags": [ - "surprise" - , "impressed" - , "wow" - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😯" - , "description": "hushed face" - , "category": "Smileys & Emotion" - , "aliases": [ - "hushed" - ] - , "tags": [ - "silence" - , "speechless" - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😲" - , "description": "astonished face" - , "category": "Smileys & Emotion" - , "aliases": [ - "astonished" - ] - , "tags": [ - "amazed" - , "gasp" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😳" - , "description": "flushed face" - , "category": "Smileys & Emotion" - , "aliases": [ - "flushed" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥺" - , "description": "pleading face" - , "category": "Smileys & Emotion" - , "aliases": [ - "pleading_face" - ] - , "tags": [ - "puppy" - , "eyes" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😦" - , "description": "frowning face with open mouth" - , "category": "Smileys & Emotion" - , "aliases": [ - "frowning" - ] - , "tags": [ - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😧" - , "description": "anguished face" - , "category": "Smileys & Emotion" - , "aliases": [ - "anguished" - ] - , "tags": [ - "stunned" - ] - , "unicode_version": "6.1" - , "ios_version": "6.0" - } -, { - "emoji": "😨" - , "description": "fearful face" - , "category": "Smileys & Emotion" - , "aliases": [ - "fearful" - ] - , "tags": [ - "scared" - , "shocked" - , "oops" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😰" - , "description": "anxious face with sweat" - , "category": "Smileys & Emotion" - , "aliases": [ - "cold_sweat" - ] - , "tags": [ - "nervous" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😥" - , "description": "sad but relieved face" - , "category": "Smileys & Emotion" - , "aliases": [ - "disappointed_relieved" - ] - , "tags": [ - "phew" - , "sweat" - , "nervous" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😢" - , "description": "crying face" - , "category": "Smileys & Emotion" - , "aliases": [ - "cry" - ] - , "tags": [ - "sad" - , "tear" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😭" - , "description": "loudly crying face" - , "category": "Smileys & Emotion" - , "aliases": [ - "sob" - ] - , "tags": [ - "sad" - , "cry" - , "bawling" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😱" - , "description": "face screaming in fear" - , "category": "Smileys & Emotion" - , "aliases": [ - "scream" - ] - , "tags": [ - "horror" - , "shocked" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😖" - , "description": "confounded face" - , "category": "Smileys & Emotion" - , "aliases": [ - "confounded" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😣" - , "description": "persevering face" - , "category": "Smileys & Emotion" - , "aliases": [ - "persevere" - ] - , "tags": [ - "struggling" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😞" - , "description": "disappointed face" - , "category": "Smileys & Emotion" - , "aliases": [ - "disappointed" - ] - , "tags": [ - "sad" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😓" - , "description": "downcast face with sweat" - , "category": "Smileys & Emotion" - , "aliases": [ - "sweat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😩" - , "description": "weary face" - , "category": "Smileys & Emotion" - , "aliases": [ - "weary" - ] - , "tags": [ - "tired" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😫" - , "description": "tired face" - , "category": "Smileys & Emotion" - , "aliases": [ - "tired_face" - ] - , "tags": [ - "upset" - , "whine" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥱" - , "description": "yawning face" - , "category": "Smileys & Emotion" - , "aliases": [ - "yawning_face" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "😤" - , "description": "face with steam from nose" - , "category": "Smileys & Emotion" - , "aliases": [ - "triumph" - ] - , "tags": [ - "smug" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😡" - , "description": "pouting face" - , "category": "Smileys & Emotion" - , "aliases": [ - "rage" - , "pout" - ] - , "tags": [ - "angry" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😠" - , "description": "angry face" - , "category": "Smileys & Emotion" - , "aliases": [ - "angry" - ] - , "tags": [ - "mad" - , "annoyed" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤬" - , "description": "face with symbols on mouth" - , "category": "Smileys & Emotion" - , "aliases": [ - "cursing_face" - ] - , "tags": [ - "foul" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "😈" - , "description": "smiling face with horns" - , "category": "Smileys & Emotion" - , "aliases": [ - "smiling_imp" - ] - , "tags": [ - "devil" - , "evil" - , "horns" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👿" - , "description": "angry face with horns" - , "category": "Smileys & Emotion" - , "aliases": [ - "imp" - ] - , "tags": [ - "angry" - , "devil" - , "evil" - , "horns" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💀" - , "description": "skull" - , "category": "Smileys & Emotion" - , "aliases": [ - "skull" - ] - , "tags": [ - "dead" - , "danger" - , "poison" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☠️" - , "description": "skull and crossbones" - , "category": "Smileys & Emotion" - , "aliases": [ - "skull_and_crossbones" - ] - , "tags": [ - "danger" - , "pirate" - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "💩" - , "description": "pile of poo" - , "category": "Smileys & Emotion" - , "aliases": [ - "hankey" - , "poop" - , "shit" - ] - , "tags": [ - "crap" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤡" - , "description": "clown face" - , "category": "Smileys & Emotion" - , "aliases": [ - "clown_face" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "👹" - , "description": "ogre" - , "category": "Smileys & Emotion" - , "aliases": [ - "japanese_ogre" - ] - , "tags": [ - "monster" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👺" - , "description": "goblin" - , "category": "Smileys & Emotion" - , "aliases": [ - "japanese_goblin" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👻" - , "description": "ghost" - , "category": "Smileys & Emotion" - , "aliases": [ - "ghost" - ] - , "tags": [ - "halloween" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👽" - , "description": "alien" - , "category": "Smileys & Emotion" - , "aliases": [ - "alien" - ] - , "tags": [ - "ufo" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👾" - , "description": "alien monster" - , "category": "Smileys & Emotion" - , "aliases": [ - "space_invader" - ] - , "tags": [ - "game" - , "retro" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤖" - , "description": "robot" - , "category": "Smileys & Emotion" - , "aliases": [ - "robot" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "😺" - , "description": "grinning cat" - , "category": "Smileys & Emotion" - , "aliases": [ - "smiley_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😸" - , "description": "grinning cat with smiling eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "smile_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😹" - , "description": "cat with tears of joy" - , "category": "Smileys & Emotion" - , "aliases": [ - "joy_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😻" - , "description": "smiling cat with heart-eyes" - , "category": "Smileys & Emotion" - , "aliases": [ - "heart_eyes_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😼" - , "description": "cat with wry smile" - , "category": "Smileys & Emotion" - , "aliases": [ - "smirk_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😽" - , "description": "kissing cat" - , "category": "Smileys & Emotion" - , "aliases": [ - "kissing_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🙀" - , "description": "weary cat" - , "category": "Smileys & Emotion" - , "aliases": [ - "scream_cat" - ] - , "tags": [ - "horror" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😿" - , "description": "crying cat" - , "category": "Smileys & Emotion" - , "aliases": [ - "crying_cat_face" - ] - , "tags": [ - "sad" - , "tear" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "😾" - , "description": "pouting cat" - , "category": "Smileys & Emotion" - , "aliases": [ - "pouting_cat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🙈" - , "description": "see-no-evil monkey" - , "category": "Smileys & Emotion" - , "aliases": [ - "see_no_evil" - ] - , "tags": [ - "monkey" - , "blind" - , "ignore" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🙉" - , "description": "hear-no-evil monkey" - , "category": "Smileys & Emotion" - , "aliases": [ - "hear_no_evil" - ] - , "tags": [ - "monkey" - , "deaf" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🙊" - , "description": "speak-no-evil monkey" - , "category": "Smileys & Emotion" - , "aliases": [ - "speak_no_evil" - ] - , "tags": [ - "monkey" - , "mute" - , "hush" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💋" - , "description": "kiss mark" - , "category": "Smileys & Emotion" - , "aliases": [ - "kiss" - ] - , "tags": [ - "lipstick" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💌" - , "description": "love letter" - , "category": "Smileys & Emotion" - , "aliases": [ - "love_letter" - ] - , "tags": [ - "email" - , "envelope" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💘" - , "description": "heart with arrow" - , "category": "Smileys & Emotion" - , "aliases": [ - "cupid" - ] - , "tags": [ - "love" - , "heart" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💝" - , "description": "heart with ribbon" - , "category": "Smileys & Emotion" - , "aliases": [ - "gift_heart" - ] - , "tags": [ - "chocolates" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💖" - , "description": "sparkling heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "sparkling_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💗" - , "description": "growing heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "heartpulse" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💓" - , "description": "beating heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "heartbeat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💞" - , "description": "revolving hearts" - , "category": "Smileys & Emotion" - , "aliases": [ - "revolving_hearts" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💕" - , "description": "two hearts" - , "category": "Smileys & Emotion" - , "aliases": [ - "two_hearts" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💟" - , "description": "heart decoration" - , "category": "Smileys & Emotion" - , "aliases": [ - "heart_decoration" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "❣️" - , "description": "heart exclamation" - , "category": "Smileys & Emotion" - , "aliases": [ - "heavy_heart_exclamation" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "💔" - , "description": "broken heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "broken_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "❤️‍🔥" - , "description": "heart on fire" - , "category": "Smileys & Emotion" - , "aliases": [ - "heart_on_fire" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - } -, { - "emoji": "❤️‍🩹" - , "description": "mending heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "mending_heart" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - } -, { - "emoji": "❤️" - , "description": "red heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "heart" - ] - , "tags": [ - "love" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🧡" - , "description": "orange heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "orange_heart" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "💛" - , "description": "yellow heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "yellow_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💚" - , "description": "green heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "green_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💙" - , "description": "blue heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "blue_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💜" - , "description": "purple heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "purple_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤎" - , "description": "brown heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "brown_heart" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🖤" - , "description": "black heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "black_heart" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🤍" - , "description": "white heart" - , "category": "Smileys & Emotion" - , "aliases": [ - "white_heart" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "💯" - , "description": "hundred points" - , "category": "Smileys & Emotion" - , "aliases": [ - "100" - ] - , "tags": [ - "score" - , "perfect" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💢" - , "description": "anger symbol" - , "category": "Smileys & Emotion" - , "aliases": [ - "anger" - ] - , "tags": [ - "angry" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💥" - , "description": "collision" - , "category": "Smileys & Emotion" - , "aliases": [ - "boom" - , "collision" - ] - , "tags": [ - "explode" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💫" - , "description": "dizzy" - , "category": "Smileys & Emotion" - , "aliases": [ - "dizzy" - ] - , "tags": [ - "star" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💦" - , "description": "sweat droplets" - , "category": "Smileys & Emotion" - , "aliases": [ - "sweat_drops" - ] - , "tags": [ - "water" - , "workout" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💨" - , "description": "dashing away" - , "category": "Smileys & Emotion" - , "aliases": [ - "dash" - ] - , "tags": [ - "wind" - , "blow" - , "fast" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕳️" - , "description": "hole" - , "category": "Smileys & Emotion" - , "aliases": [ - "hole" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "💣" - , "description": "bomb" - , "category": "Smileys & Emotion" - , "aliases": [ - "bomb" - ] - , "tags": [ - "boom" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💬" - , "description": "speech balloon" - , "category": "Smileys & Emotion" - , "aliases": [ - "speech_balloon" - ] - , "tags": [ - "comment" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👁️‍🗨️" - , "description": "eye in speech bubble" - , "category": "Smileys & Emotion" - , "aliases": [ - "eye_speech_bubble" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🗨️" - , "description": "left speech bubble" - , "category": "Smileys & Emotion" - , "aliases": [ - "left_speech_bubble" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🗯️" - , "description": "right anger bubble" - , "category": "Smileys & Emotion" - , "aliases": [ - "right_anger_bubble" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "💭" - , "description": "thought balloon" - , "category": "Smileys & Emotion" - , "aliases": [ - "thought_balloon" - ] - , "tags": [ - "thinking" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💤" - , "description": "zzz" - , "category": "Smileys & Emotion" - , "aliases": [ - "zzz" - ] - , "tags": [ - "sleeping" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👋" - , "description": "waving hand" - , "category": "People & Body" - , "aliases": [ - "wave" - ] - , "tags": [ - "goodbye" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤚" - , "description": "raised back of hand" - , "category": "People & Body" - , "aliases": [ - "raised_back_of_hand" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🖐️" - , "description": "hand with fingers splayed" - , "category": "People & Body" - , "aliases": [ - "raised_hand_with_fingers_splayed" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "✋" - , "description": "raised hand" - , "category": "People & Body" - , "aliases": [ - "hand" - , "raised_hand" - ] - , "tags": [ - "highfive" - , "stop" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🖖" - , "description": "vulcan salute" - , "category": "People & Body" - , "aliases": [ - "vulcan_salute" - ] - , "tags": [ - "prosper" - , "spock" - ] - , "unicode_version": "7.0" - , "ios_version": "8.3" - , "skin_tones": true - } -, { - "emoji": "👌" - , "description": "OK hand" - , "category": "People & Body" - , "aliases": [ - "ok_hand" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤌" - , "description": "pinched fingers" - , "category": "People & Body" - , "aliases": [ - "pinched_fingers" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "🤏" - , "description": "pinching hand" - , "category": "People & Body" - , "aliases": [ - "pinching_hand" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "✌️" - , "description": "victory hand" - , "category": "People & Body" - , "aliases": [ - "v" - ] - , "tags": [ - "victory" - , "peace" - ] - , "unicode_version": "" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤞" - , "description": "crossed fingers" - , "category": "People & Body" - , "aliases": [ - "crossed_fingers" - ] - , "tags": [ - "luck" - , "hopeful" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤟" - , "description": "love-you gesture" - , "category": "People & Body" - , "aliases": [ - "love_you_gesture" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤘" - , "description": "sign of the horns" - , "category": "People & Body" - , "aliases": [ - "metal" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "🤙" - , "description": "call me hand" - , "category": "People & Body" - , "aliases": [ - "call_me_hand" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👈" - , "description": "backhand index pointing left" - , "category": "People & Body" - , "aliases": [ - "point_left" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👉" - , "description": "backhand index pointing right" - , "category": "People & Body" - , "aliases": [ - "point_right" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👆" - , "description": "backhand index pointing up" - , "category": "People & Body" - , "aliases": [ - "point_up_2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🖕" - , "description": "middle finger" - , "category": "People & Body" - , "aliases": [ - "middle_finger" - , "fu" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "👇" - , "description": "backhand index pointing down" - , "category": "People & Body" - , "aliases": [ - "point_down" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "☝️" - , "description": "index pointing up" - , "category": "People & Body" - , "aliases": [ - "point_up" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👍" - , "description": "thumbs up" - , "category": "People & Body" - , "aliases": [ - "+1" - , "thumbsup" - ] - , "tags": [ - "approve" - , "ok" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👎" - , "description": "thumbs down" - , "category": "People & Body" - , "aliases": [ - "-1" - , "thumbsdown" - ] - , "tags": [ - "disapprove" - , "bury" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "✊" - , "description": "raised fist" - , "category": "People & Body" - , "aliases": [ - "fist_raised" - , "fist" - ] - , "tags": [ - "power" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👊" - , "description": "oncoming fist" - , "category": "People & Body" - , "aliases": [ - "fist_oncoming" - , "facepunch" - , "punch" - ] - , "tags": [ - "attack" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤛" - , "description": "left-facing fist" - , "category": "People & Body" - , "aliases": [ - "fist_left" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤜" - , "description": "right-facing fist" - , "category": "People & Body" - , "aliases": [ - "fist_right" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👏" - , "description": "clapping hands" - , "category": "People & Body" - , "aliases": [ - "clap" - ] - , "tags": [ - "praise" - , "applause" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙌" - , "description": "raising hands" - , "category": "People & Body" - , "aliases": [ - "raised_hands" - ] - , "tags": [ - "hooray" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👐" - , "description": "open hands" - , "category": "People & Body" - , "aliases": [ - "open_hands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤲" - , "description": "palms up together" - , "category": "People & Body" - , "aliases": [ - "palms_up_together" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤝" - , "description": "handshake" - , "category": "People & Body" - , "aliases": [ - "handshake" - ] - , "tags": [ - "deal" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🙏" - , "description": "folded hands" - , "category": "People & Body" - , "aliases": [ - "pray" - ] - , "tags": [ - "please" - , "hope" - , "wish" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "✍️" - , "description": "writing hand" - , "category": "People & Body" - , "aliases": [ - "writing_hand" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "💅" - , "description": "nail polish" - , "category": "People & Body" - , "aliases": [ - "nail_care" - ] - , "tags": [ - "beauty" - , "manicure" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤳" - , "description": "selfie" - , "category": "People & Body" - , "aliases": [ - "selfie" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "💪" - , "description": "flexed biceps" - , "category": "People & Body" - , "aliases": [ - "muscle" - ] - , "tags": [ - "flex" - , "bicep" - , "strong" - , "workout" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🦾" - , "description": "mechanical arm" - , "category": "People & Body" - , "aliases": [ - "mechanical_arm" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦿" - , "description": "mechanical leg" - , "category": "People & Body" - , "aliases": [ - "mechanical_leg" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦵" - , "description": "leg" - , "category": "People & Body" - , "aliases": [ - "leg" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🦶" - , "description": "foot" - , "category": "People & Body" - , "aliases": [ - "foot" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👂" - , "description": "ear" - , "category": "People & Body" - , "aliases": [ - "ear" - ] - , "tags": [ - "hear" - , "sound" - , "listen" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🦻" - , "description": "ear with hearing aid" - , "category": "People & Body" - , "aliases": [ - "ear_with_hearing_aid" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "👃" - , "description": "nose" - , "category": "People & Body" - , "aliases": [ - "nose" - ] - , "tags": [ - "smell" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🧠" - , "description": "brain" - , "category": "People & Body" - , "aliases": [ - "brain" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🫀" - , "description": "anatomical heart" - , "category": "People & Body" - , "aliases": [ - "anatomical_heart" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🫁" - , "description": "lungs" - , "category": "People & Body" - , "aliases": [ - "lungs" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🦷" - , "description": "tooth" - , "category": "People & Body" - , "aliases": [ - "tooth" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦴" - , "description": "bone" - , "category": "People & Body" - , "aliases": [ - "bone" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "👀" - , "description": "eyes" - , "category": "People & Body" - , "aliases": [ - "eyes" - ] - , "tags": [ - "look" - , "see" - , "watch" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👁️" - , "description": "eye" - , "category": "People & Body" - , "aliases": [ - "eye" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "👅" - , "description": "tongue" - , "category": "People & Body" - , "aliases": [ - "tongue" - ] - , "tags": [ - "taste" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👄" - , "description": "mouth" - , "category": "People & Body" - , "aliases": [ - "lips" - ] - , "tags": [ - "kiss" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👶" - , "description": "baby" - , "category": "People & Body" - , "aliases": [ - "baby" - ] - , "tags": [ - "child" - , "newborn" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🧒" - , "description": "child" - , "category": "People & Body" - , "aliases": [ - "child" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👦" - , "description": "boy" - , "category": "People & Body" - , "aliases": [ - "boy" - ] - , "tags": [ - "child" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👧" - , "description": "girl" - , "category": "People & Body" - , "aliases": [ - "girl" - ] - , "tags": [ - "child" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🧑" - , "description": "person" - , "category": "People & Body" - , "aliases": [ - "adult" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👱" - , "description": "person: blond hair" - , "category": "People & Body" - , "aliases": [ - "blond_haired_person" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👨" - , "description": "man" - , "category": "People & Body" - , "aliases": [ - "man" - ] - , "tags": [ - "mustache" - , "father" - , "dad" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🧔" - , "description": "person: beard" - , "category": "People & Body" - , "aliases": [ - "bearded_person" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧔‍♂️" - , "description": "man: beard" - , "category": "People & Body" - , "aliases": [ - "man_beard" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "🧔‍♀️" - , "description": "woman: beard" - , "category": "People & Body" - , "aliases": [ - "woman_beard" - ] - , "tags": [ - ] - , "unicode_version": "13.1" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "👨‍🦰" - , "description": "man: red hair" - , "category": "People & Body" - , "aliases": [ - "red_haired_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👨‍🦱" - , "description": "man: curly hair" - , "category": "People & Body" - , "aliases": [ - "curly_haired_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👨‍🦳" - , "description": "man: white hair" - , "category": "People & Body" - , "aliases": [ - "white_haired_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👨‍🦲" - , "description": "man: bald" - , "category": "People & Body" - , "aliases": [ - "bald_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👩" - , "description": "woman" - , "category": "People & Body" - , "aliases": [ - "woman" - ] - , "tags": [ - "girls" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👩‍🦰" - , "description": "woman: red hair" - , "category": "People & Body" - , "aliases": [ - "red_haired_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦰" - , "description": "person: red hair" - , "category": "People & Body" - , "aliases": [ - "person_red_hair" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🦱" - , "description": "woman: curly hair" - , "category": "People & Body" - , "aliases": [ - "curly_haired_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦱" - , "description": "person: curly hair" - , "category": "People & Body" - , "aliases": [ - "person_curly_hair" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🦳" - , "description": "woman: white hair" - , "category": "People & Body" - , "aliases": [ - "white_haired_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦳" - , "description": "person: white hair" - , "category": "People & Body" - , "aliases": [ - "person_white_hair" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🦲" - , "description": "woman: bald" - , "category": "People & Body" - , "aliases": [ - "bald_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦲" - , "description": "person: bald" - , "category": "People & Body" - , "aliases": [ - "person_bald" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👱‍♀️" - , "description": "woman: blond hair" - , "category": "People & Body" - , "aliases": [ - "blond_haired_woman" - , "blonde_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "👱‍♂️" - , "description": "man: blond hair" - , "category": "People & Body" - , "aliases": [ - "blond_haired_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧓" - , "description": "older person" - , "category": "People & Body" - , "aliases": [ - "older_adult" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👴" - , "description": "old man" - , "category": "People & Body" - , "aliases": [ - "older_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👵" - , "description": "old woman" - , "category": "People & Body" - , "aliases": [ - "older_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙍" - , "description": "person frowning" - , "category": "People & Body" - , "aliases": [ - "frowning_person" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙍‍♂️" - , "description": "man frowning" - , "category": "People & Body" - , "aliases": [ - "frowning_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🙍‍♀️" - , "description": "woman frowning" - , "category": "People & Body" - , "aliases": [ - "frowning_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🙎" - , "description": "person pouting" - , "category": "People & Body" - , "aliases": [ - "pouting_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙎‍♂️" - , "description": "man pouting" - , "category": "People & Body" - , "aliases": [ - "pouting_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🙎‍♀️" - , "description": "woman pouting" - , "category": "People & Body" - , "aliases": [ - "pouting_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🙅" - , "description": "person gesturing NO" - , "category": "People & Body" - , "aliases": [ - "no_good" - ] - , "tags": [ - "stop" - , "halt" - , "denied" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙅‍♂️" - , "description": "man gesturing NO" - , "category": "People & Body" - , "aliases": [ - "no_good_man" - , "ng_man" - ] - , "tags": [ - "stop" - , "halt" - , "denied" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🙅‍♀️" - , "description": "woman gesturing NO" - , "category": "People & Body" - , "aliases": [ - "no_good_woman" - , "ng_woman" - ] - , "tags": [ - "stop" - , "halt" - , "denied" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🙆" - , "description": "person gesturing OK" - , "category": "People & Body" - , "aliases": [ - "ok_person" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙆‍♂️" - , "description": "man gesturing OK" - , "category": "People & Body" - , "aliases": [ - "ok_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🙆‍♀️" - , "description": "woman gesturing OK" - , "category": "People & Body" - , "aliases": [ - "ok_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "💁" - , "description": "person tipping hand" - , "category": "People & Body" - , "aliases": [ - "tipping_hand_person" - , "information_desk_person" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "💁‍♂️" - , "description": "man tipping hand" - , "category": "People & Body" - , "aliases": [ - "tipping_hand_man" - , "sassy_man" - ] - , "tags": [ - "information" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "💁‍♀️" - , "description": "woman tipping hand" - , "category": "People & Body" - , "aliases": [ - "tipping_hand_woman" - , "sassy_woman" - ] - , "tags": [ - "information" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🙋" - , "description": "person raising hand" - , "category": "People & Body" - , "aliases": [ - "raising_hand" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙋‍♂️" - , "description": "man raising hand" - , "category": "People & Body" - , "aliases": [ - "raising_hand_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🙋‍♀️" - , "description": "woman raising hand" - , "category": "People & Body" - , "aliases": [ - "raising_hand_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧏" - , "description": "deaf person" - , "category": "People & Body" - , "aliases": [ - "deaf_person" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧏‍♂️" - , "description": "deaf man" - , "category": "People & Body" - , "aliases": [ - "deaf_man" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧏‍♀️" - , "description": "deaf woman" - , "category": "People & Body" - , "aliases": [ - "deaf_woman" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🙇" - , "description": "person bowing" - , "category": "People & Body" - , "aliases": [ - "bow" - ] - , "tags": [ - "respect" - , "thanks" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🙇‍♂️" - , "description": "man bowing" - , "category": "People & Body" - , "aliases": [ - "bowing_man" - ] - , "tags": [ - "respect" - , "thanks" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🙇‍♀️" - , "description": "woman bowing" - , "category": "People & Body" - , "aliases": [ - "bowing_woman" - ] - , "tags": [ - "respect" - , "thanks" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🤦" - , "description": "person facepalming" - , "category": "People & Body" - , "aliases": [ - "facepalm" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤦‍♂️" - , "description": "man facepalming" - , "category": "People & Body" - , "aliases": [ - "man_facepalming" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤦‍♀️" - , "description": "woman facepalming" - , "category": "People & Body" - , "aliases": [ - "woman_facepalming" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤷" - , "description": "person shrugging" - , "category": "People & Body" - , "aliases": [ - "shrug" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤷‍♂️" - , "description": "man shrugging" - , "category": "People & Body" - , "aliases": [ - "man_shrugging" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤷‍♀️" - , "description": "woman shrugging" - , "category": "People & Body" - , "aliases": [ - "woman_shrugging" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍⚕️" - , "description": "health worker" - , "category": "People & Body" - , "aliases": [ - "health_worker" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍⚕️" - , "description": "man health worker" - , "category": "People & Body" - , "aliases": [ - "man_health_worker" - ] - , "tags": [ - "doctor" - , "nurse" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍⚕️" - , "description": "woman health worker" - , "category": "People & Body" - , "aliases": [ - "woman_health_worker" - ] - , "tags": [ - "doctor" - , "nurse" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🎓" - , "description": "student" - , "category": "People & Body" - , "aliases": [ - "student" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🎓" - , "description": "man student" - , "category": "People & Body" - , "aliases": [ - "man_student" - ] - , "tags": [ - "graduation" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🎓" - , "description": "woman student" - , "category": "People & Body" - , "aliases": [ - "woman_student" - ] - , "tags": [ - "graduation" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🏫" - , "description": "teacher" - , "category": "People & Body" - , "aliases": [ - "teacher" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🏫" - , "description": "man teacher" - , "category": "People & Body" - , "aliases": [ - "man_teacher" - ] - , "tags": [ - "school" - , "professor" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🏫" - , "description": "woman teacher" - , "category": "People & Body" - , "aliases": [ - "woman_teacher" - ] - , "tags": [ - "school" - , "professor" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍⚖️" - , "description": "judge" - , "category": "People & Body" - , "aliases": [ - "judge" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍⚖️" - , "description": "man judge" - , "category": "People & Body" - , "aliases": [ - "man_judge" - ] - , "tags": [ - "justice" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍⚖️" - , "description": "woman judge" - , "category": "People & Body" - , "aliases": [ - "woman_judge" - ] - , "tags": [ - "justice" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🌾" - , "description": "farmer" - , "category": "People & Body" - , "aliases": [ - "farmer" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🌾" - , "description": "man farmer" - , "category": "People & Body" - , "aliases": [ - "man_farmer" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🌾" - , "description": "woman farmer" - , "category": "People & Body" - , "aliases": [ - "woman_farmer" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🍳" - , "description": "cook" - , "category": "People & Body" - , "aliases": [ - "cook" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🍳" - , "description": "man cook" - , "category": "People & Body" - , "aliases": [ - "man_cook" - ] - , "tags": [ - "chef" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🍳" - , "description": "woman cook" - , "category": "People & Body" - , "aliases": [ - "woman_cook" - ] - , "tags": [ - "chef" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🔧" - , "description": "mechanic" - , "category": "People & Body" - , "aliases": [ - "mechanic" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🔧" - , "description": "man mechanic" - , "category": "People & Body" - , "aliases": [ - "man_mechanic" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🔧" - , "description": "woman mechanic" - , "category": "People & Body" - , "aliases": [ - "woman_mechanic" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🏭" - , "description": "factory worker" - , "category": "People & Body" - , "aliases": [ - "factory_worker" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🏭" - , "description": "man factory worker" - , "category": "People & Body" - , "aliases": [ - "man_factory_worker" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🏭" - , "description": "woman factory worker" - , "category": "People & Body" - , "aliases": [ - "woman_factory_worker" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍💼" - , "description": "office worker" - , "category": "People & Body" - , "aliases": [ - "office_worker" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍💼" - , "description": "man office worker" - , "category": "People & Body" - , "aliases": [ - "man_office_worker" - ] - , "tags": [ - "business" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍💼" - , "description": "woman office worker" - , "category": "People & Body" - , "aliases": [ - "woman_office_worker" - ] - , "tags": [ - "business" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🔬" - , "description": "scientist" - , "category": "People & Body" - , "aliases": [ - "scientist" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🔬" - , "description": "man scientist" - , "category": "People & Body" - , "aliases": [ - "man_scientist" - ] - , "tags": [ - "research" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🔬" - , "description": "woman scientist" - , "category": "People & Body" - , "aliases": [ - "woman_scientist" - ] - , "tags": [ - "research" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍💻" - , "description": "technologist" - , "category": "People & Body" - , "aliases": [ - "technologist" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍💻" - , "description": "man technologist" - , "category": "People & Body" - , "aliases": [ - "man_technologist" - ] - , "tags": [ - "coder" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍💻" - , "description": "woman technologist" - , "category": "People & Body" - , "aliases": [ - "woman_technologist" - ] - , "tags": [ - "coder" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🎤" - , "description": "singer" - , "category": "People & Body" - , "aliases": [ - "singer" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🎤" - , "description": "man singer" - , "category": "People & Body" - , "aliases": [ - "man_singer" - ] - , "tags": [ - "rockstar" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🎤" - , "description": "woman singer" - , "category": "People & Body" - , "aliases": [ - "woman_singer" - ] - , "tags": [ - "rockstar" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🎨" - , "description": "artist" - , "category": "People & Body" - , "aliases": [ - "artist" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🎨" - , "description": "man artist" - , "category": "People & Body" - , "aliases": [ - "man_artist" - ] - , "tags": [ - "painter" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🎨" - , "description": "woman artist" - , "category": "People & Body" - , "aliases": [ - "woman_artist" - ] - , "tags": [ - "painter" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍✈️" - , "description": "pilot" - , "category": "People & Body" - , "aliases": [ - "pilot" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍✈️" - , "description": "man pilot" - , "category": "People & Body" - , "aliases": [ - "man_pilot" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍✈️" - , "description": "woman pilot" - , "category": "People & Body" - , "aliases": [ - "woman_pilot" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🚀" - , "description": "astronaut" - , "category": "People & Body" - , "aliases": [ - "astronaut" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🚀" - , "description": "man astronaut" - , "category": "People & Body" - , "aliases": [ - "man_astronaut" - ] - , "tags": [ - "space" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🚀" - , "description": "woman astronaut" - , "category": "People & Body" - , "aliases": [ - "woman_astronaut" - ] - , "tags": [ - "space" - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🚒" - , "description": "firefighter" - , "category": "People & Body" - , "aliases": [ - "firefighter" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🚒" - , "description": "man firefighter" - , "category": "People & Body" - , "aliases": [ - "man_firefighter" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👩‍🚒" - , "description": "woman firefighter" - , "category": "People & Body" - , "aliases": [ - "woman_firefighter" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👮" - , "description": "police officer" - , "category": "People & Body" - , "aliases": [ - "police_officer" - , "cop" - ] - , "tags": [ - "law" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👮‍♂️" - , "description": "man police officer" - , "category": "People & Body" - , "aliases": [ - "policeman" - ] - , "tags": [ - "law" - , "cop" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👮‍♀️" - , "description": "woman police officer" - , "category": "People & Body" - , "aliases": [ - "policewoman" - ] - , "tags": [ - "law" - , "cop" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🕵️" - , "description": "detective" - , "category": "People & Body" - , "aliases": [ - "detective" - ] - , "tags": [ - "sleuth" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "🕵️‍♂️" - , "description": "man detective" - , "category": "People & Body" - , "aliases": [ - "male_detective" - ] - , "tags": [ - "sleuth" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🕵️‍♀️" - , "description": "woman detective" - , "category": "People & Body" - , "aliases": [ - "female_detective" - ] - , "tags": [ - "sleuth" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "💂" - , "description": "guard" - , "category": "People & Body" - , "aliases": [ - "guard" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "💂‍♂️" - , "description": "man guard" - , "category": "People & Body" - , "aliases": [ - "guardsman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "💂‍♀️" - , "description": "woman guard" - , "category": "People & Body" - , "aliases": [ - "guardswoman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🥷" - , "description": "ninja" - , "category": "People & Body" - , "aliases": [ - "ninja" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "👷" - , "description": "construction worker" - , "category": "People & Body" - , "aliases": [ - "construction_worker" - ] - , "tags": [ - "helmet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👷‍♂️" - , "description": "man construction worker" - , "category": "People & Body" - , "aliases": [ - "construction_worker_man" - ] - , "tags": [ - "helmet" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👷‍♀️" - , "description": "woman construction worker" - , "category": "People & Body" - , "aliases": [ - "construction_worker_woman" - ] - , "tags": [ - "helmet" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🤴" - , "description": "prince" - , "category": "People & Body" - , "aliases": [ - "prince" - ] - , "tags": [ - "crown" - , "royal" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "👸" - , "description": "princess" - , "category": "People & Body" - , "aliases": [ - "princess" - ] - , "tags": [ - "crown" - , "royal" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👳" - , "description": "person wearing turban" - , "category": "People & Body" - , "aliases": [ - "person_with_turban" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👳‍♂️" - , "description": "man wearing turban" - , "category": "People & Body" - , "aliases": [ - "man_with_turban" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👳‍♀️" - , "description": "woman wearing turban" - , "category": "People & Body" - , "aliases": [ - "woman_with_turban" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "👲" - , "description": "person with skullcap" - , "category": "People & Body" - , "aliases": [ - "man_with_gua_pi_mao" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🧕" - , "description": "woman with headscarf" - , "category": "People & Body" - , "aliases": [ - "woman_with_headscarf" - ] - , "tags": [ - "hijab" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤵" - , "description": "person in tuxedo" - , "category": "People & Body" - , "aliases": [ - "person_in_tuxedo" - ] - , "tags": [ - "groom" - , "marriage" - , "wedding" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤵‍♂️" - , "description": "man in tuxedo" - , "category": "People & Body" - , "aliases": [ - "man_in_tuxedo" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "🤵‍♀️" - , "description": "woman in tuxedo" - , "category": "People & Body" - , "aliases": [ - "woman_in_tuxedo" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "👰" - , "description": "person with veil" - , "category": "People & Body" - , "aliases": [ - "person_with_veil" - ] - , "tags": [ - "marriage" - , "wedding" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👰‍♂️" - , "description": "man with veil" - , "category": "People & Body" - , "aliases": [ - "man_with_veil" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "👰‍♀️" - , "description": "woman with veil" - , "category": "People & Body" - , "aliases": [ - "woman_with_veil" - , "bride_with_veil" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "🤰" - , "description": "pregnant woman" - , "category": "People & Body" - , "aliases": [ - "pregnant_woman" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤱" - , "description": "breast-feeding" - , "category": "People & Body" - , "aliases": [ - "breast_feeding" - ] - , "tags": [ - "nursing" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👩‍🍼" - , "description": "woman feeding baby" - , "category": "People & Body" - , "aliases": [ - "woman_feeding_baby" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "👨‍🍼" - , "description": "man feeding baby" - , "category": "People & Body" - , "aliases": [ - "man_feeding_baby" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "🧑‍🍼" - , "description": "person feeding baby" - , "category": "People & Body" - , "aliases": [ - "person_feeding_baby" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "👼" - , "description": "baby angel" - , "category": "People & Body" - , "aliases": [ - "angel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🎅" - , "description": "Santa Claus" - , "category": "People & Body" - , "aliases": [ - "santa" - ] - , "tags": [ - "christmas" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🤶" - , "description": "Mrs. Claus" - , "category": "People & Body" - , "aliases": [ - "mrs_claus" - ] - , "tags": [ - "santa" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧑‍🎄" - , "description": "mx claus" - , "category": "People & Body" - , "aliases": [ - "mx_claus" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - , "skin_tones": true - } -, { - "emoji": "🦸" - , "description": "superhero" - , "category": "People & Body" - , "aliases": [ - "superhero" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🦸‍♂️" - , "description": "man superhero" - , "category": "People & Body" - , "aliases": [ - "superhero_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🦸‍♀️" - , "description": "woman superhero" - , "category": "People & Body" - , "aliases": [ - "superhero_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🦹" - , "description": "supervillain" - , "category": "People & Body" - , "aliases": [ - "supervillain" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🦹‍♂️" - , "description": "man supervillain" - , "category": "People & Body" - , "aliases": [ - "supervillain_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🦹‍♀️" - , "description": "woman supervillain" - , "category": "People & Body" - , "aliases": [ - "supervillain_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧙" - , "description": "mage" - , "category": "People & Body" - , "aliases": [ - "mage" - ] - , "tags": [ - "wizard" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧙‍♂️" - , "description": "man mage" - , "category": "People & Body" - , "aliases": [ - "mage_man" - ] - , "tags": [ - "wizard" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧙‍♀️" - , "description": "woman mage" - , "category": "People & Body" - , "aliases": [ - "mage_woman" - ] - , "tags": [ - "wizard" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧚" - , "description": "fairy" - , "category": "People & Body" - , "aliases": [ - "fairy" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧚‍♂️" - , "description": "man fairy" - , "category": "People & Body" - , "aliases": [ - "fairy_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧚‍♀️" - , "description": "woman fairy" - , "category": "People & Body" - , "aliases": [ - "fairy_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧛" - , "description": "vampire" - , "category": "People & Body" - , "aliases": [ - "vampire" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧛‍♂️" - , "description": "man vampire" - , "category": "People & Body" - , "aliases": [ - "vampire_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧛‍♀️" - , "description": "woman vampire" - , "category": "People & Body" - , "aliases": [ - "vampire_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧜" - , "description": "merperson" - , "category": "People & Body" - , "aliases": [ - "merperson" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧜‍♂️" - , "description": "merman" - , "category": "People & Body" - , "aliases": [ - "merman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧜‍♀️" - , "description": "mermaid" - , "category": "People & Body" - , "aliases": [ - "mermaid" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧝" - , "description": "elf" - , "category": "People & Body" - , "aliases": [ - "elf" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧝‍♂️" - , "description": "man elf" - , "category": "People & Body" - , "aliases": [ - "elf_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧝‍♀️" - , "description": "woman elf" - , "category": "People & Body" - , "aliases": [ - "elf_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧞" - , "description": "genie" - , "category": "People & Body" - , "aliases": [ - "genie" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧞‍♂️" - , "description": "man genie" - , "category": "People & Body" - , "aliases": [ - "genie_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧞‍♀️" - , "description": "woman genie" - , "category": "People & Body" - , "aliases": [ - "genie_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧟" - , "description": "zombie" - , "category": "People & Body" - , "aliases": [ - "zombie" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧟‍♂️" - , "description": "man zombie" - , "category": "People & Body" - , "aliases": [ - "zombie_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧟‍♀️" - , "description": "woman zombie" - , "category": "People & Body" - , "aliases": [ - "zombie_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "💆" - , "description": "person getting massage" - , "category": "People & Body" - , "aliases": [ - "massage" - ] - , "tags": [ - "spa" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "💆‍♂️" - , "description": "man getting massage" - , "category": "People & Body" - , "aliases": [ - "massage_man" - ] - , "tags": [ - "spa" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "💆‍♀️" - , "description": "woman getting massage" - , "category": "People & Body" - , "aliases": [ - "massage_woman" - ] - , "tags": [ - "spa" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "💇" - , "description": "person getting haircut" - , "category": "People & Body" - , "aliases": [ - "haircut" - ] - , "tags": [ - "beauty" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "💇‍♂️" - , "description": "man getting haircut" - , "category": "People & Body" - , "aliases": [ - "haircut_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "💇‍♀️" - , "description": "woman getting haircut" - , "category": "People & Body" - , "aliases": [ - "haircut_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🚶" - , "description": "person walking" - , "category": "People & Body" - , "aliases": [ - "walking" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🚶‍♂️" - , "description": "man walking" - , "category": "People & Body" - , "aliases": [ - "walking_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🚶‍♀️" - , "description": "woman walking" - , "category": "People & Body" - , "aliases": [ - "walking_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🧍" - , "description": "person standing" - , "category": "People & Body" - , "aliases": [ - "standing_person" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧍‍♂️" - , "description": "man standing" - , "category": "People & Body" - , "aliases": [ - "standing_man" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧍‍♀️" - , "description": "woman standing" - , "category": "People & Body" - , "aliases": [ - "standing_woman" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧎" - , "description": "person kneeling" - , "category": "People & Body" - , "aliases": [ - "kneeling_person" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧎‍♂️" - , "description": "man kneeling" - , "category": "People & Body" - , "aliases": [ - "kneeling_man" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧎‍♀️" - , "description": "woman kneeling" - , "category": "People & Body" - , "aliases": [ - "kneeling_woman" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦯" - , "description": "person with white cane" - , "category": "People & Body" - , "aliases": [ - "person_with_probing_cane" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🦯" - , "description": "man with white cane" - , "category": "People & Body" - , "aliases": [ - "man_with_probing_cane" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "👩‍🦯" - , "description": "woman with white cane" - , "category": "People & Body" - , "aliases": [ - "woman_with_probing_cane" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦼" - , "description": "person in motorized wheelchair" - , "category": "People & Body" - , "aliases": [ - "person_in_motorized_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🦼" - , "description": "man in motorized wheelchair" - , "category": "People & Body" - , "aliases": [ - "man_in_motorized_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "👩‍🦼" - , "description": "woman in motorized wheelchair" - , "category": "People & Body" - , "aliases": [ - "woman_in_motorized_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🧑‍🦽" - , "description": "person in manual wheelchair" - , "category": "People & Body" - , "aliases": [ - "person_in_manual_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.1" - , "ios_version": "13.2" - , "skin_tones": true - } -, { - "emoji": "👨‍🦽" - , "description": "man in manual wheelchair" - , "category": "People & Body" - , "aliases": [ - "man_in_manual_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "👩‍🦽" - , "description": "woman in manual wheelchair" - , "category": "People & Body" - , "aliases": [ - "woman_in_manual_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "🏃" - , "description": "person running" - , "category": "People & Body" - , "aliases": [ - "runner" - , "running" - ] - , "tags": [ - "exercise" - , "workout" - , "marathon" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🏃‍♂️" - , "description": "man running" - , "category": "People & Body" - , "aliases": [ - "running_man" - ] - , "tags": [ - "exercise" - , "workout" - , "marathon" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🏃‍♀️" - , "description": "woman running" - , "category": "People & Body" - , "aliases": [ - "running_woman" - ] - , "tags": [ - "exercise" - , "workout" - , "marathon" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "💃" - , "description": "woman dancing" - , "category": "People & Body" - , "aliases": [ - "woman_dancing" - , "dancer" - ] - , "tags": [ - "dress" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🕺" - , "description": "man dancing" - , "category": "People & Body" - , "aliases": [ - "man_dancing" - ] - , "tags": [ - "dancer" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🕴️" - , "description": "person in suit levitating" - , "category": "People & Body" - , "aliases": [ - "business_suit_levitating" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "👯" - , "description": "people with bunny ears" - , "category": "People & Body" - , "aliases": [ - "dancers" - ] - , "tags": [ - "bunny" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👯‍♂️" - , "description": "men with bunny ears" - , "category": "People & Body" - , "aliases": [ - "dancing_men" - ] - , "tags": [ - "bunny" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👯‍♀️" - , "description": "women with bunny ears" - , "category": "People & Body" - , "aliases": [ - "dancing_women" - ] - , "tags": [ - "bunny" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧖" - , "description": "person in steamy room" - , "category": "People & Body" - , "aliases": [ - "sauna_person" - ] - , "tags": [ - "steamy" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧖‍♂️" - , "description": "man in steamy room" - , "category": "People & Body" - , "aliases": [ - "sauna_man" - ] - , "tags": [ - "steamy" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧖‍♀️" - , "description": "woman in steamy room" - , "category": "People & Body" - , "aliases": [ - "sauna_woman" - ] - , "tags": [ - "steamy" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧗" - , "description": "person climbing" - , "category": "People & Body" - , "aliases": [ - "climbing" - ] - , "tags": [ - "bouldering" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧗‍♂️" - , "description": "man climbing" - , "category": "People & Body" - , "aliases": [ - "climbing_man" - ] - , "tags": [ - "bouldering" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧗‍♀️" - , "description": "woman climbing" - , "category": "People & Body" - , "aliases": [ - "climbing_woman" - ] - , "tags": [ - "bouldering" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤺" - , "description": "person fencing" - , "category": "People & Body" - , "aliases": [ - "person_fencing" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🏇" - , "description": "horse racing" - , "category": "People & Body" - , "aliases": [ - "horse_racing" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "⛷️" - , "description": "skier" - , "category": "People & Body" - , "aliases": [ - "skier" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🏂" - , "description": "snowboarder" - , "category": "People & Body" - , "aliases": [ - "snowboarder" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🏌️" - , "description": "person golfing" - , "category": "People & Body" - , "aliases": [ - "golfing" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "🏌️‍♂️" - , "description": "man golfing" - , "category": "People & Body" - , "aliases": [ - "golfing_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🏌️‍♀️" - , "description": "woman golfing" - , "category": "People & Body" - , "aliases": [ - "golfing_woman" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🏄" - , "description": "person surfing" - , "category": "People & Body" - , "aliases": [ - "surfer" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🏄‍♂️" - , "description": "man surfing" - , "category": "People & Body" - , "aliases": [ - "surfing_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🏄‍♀️" - , "description": "woman surfing" - , "category": "People & Body" - , "aliases": [ - "surfing_woman" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🚣" - , "description": "person rowing boat" - , "category": "People & Body" - , "aliases": [ - "rowboat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🚣‍♂️" - , "description": "man rowing boat" - , "category": "People & Body" - , "aliases": [ - "rowing_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🚣‍♀️" - , "description": "woman rowing boat" - , "category": "People & Body" - , "aliases": [ - "rowing_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🏊" - , "description": "person swimming" - , "category": "People & Body" - , "aliases": [ - "swimmer" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🏊‍♂️" - , "description": "man swimming" - , "category": "People & Body" - , "aliases": [ - "swimming_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🏊‍♀️" - , "description": "woman swimming" - , "category": "People & Body" - , "aliases": [ - "swimming_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "⛹️" - , "description": "person bouncing ball" - , "category": "People & Body" - , "aliases": [ - "bouncing_ball_person" - ] - , "tags": [ - "basketball" - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "⛹️‍♂️" - , "description": "man bouncing ball" - , "category": "People & Body" - , "aliases": [ - "bouncing_ball_man" - , "basketball_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "⛹️‍♀️" - , "description": "woman bouncing ball" - , "category": "People & Body" - , "aliases": [ - "bouncing_ball_woman" - , "basketball_woman" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🏋️" - , "description": "person lifting weights" - , "category": "People & Body" - , "aliases": [ - "weight_lifting" - ] - , "tags": [ - "gym" - , "workout" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "🏋️‍♂️" - , "description": "man lifting weights" - , "category": "People & Body" - , "aliases": [ - "weight_lifting_man" - ] - , "tags": [ - "gym" - , "workout" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🏋️‍♀️" - , "description": "woman lifting weights" - , "category": "People & Body" - , "aliases": [ - "weight_lifting_woman" - ] - , "tags": [ - "gym" - , "workout" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🚴" - , "description": "person biking" - , "category": "People & Body" - , "aliases": [ - "bicyclist" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🚴‍♂️" - , "description": "man biking" - , "category": "People & Body" - , "aliases": [ - "biking_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🚴‍♀️" - , "description": "woman biking" - , "category": "People & Body" - , "aliases": [ - "biking_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🚵" - , "description": "person mountain biking" - , "category": "People & Body" - , "aliases": [ - "mountain_bicyclist" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🚵‍♂️" - , "description": "man mountain biking" - , "category": "People & Body" - , "aliases": [ - "mountain_biking_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🚵‍♀️" - , "description": "woman mountain biking" - , "category": "People & Body" - , "aliases": [ - "mountain_biking_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - , "skin_tones": true - } -, { - "emoji": "🤸" - , "description": "person cartwheeling" - , "category": "People & Body" - , "aliases": [ - "cartwheeling" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤸‍♂️" - , "description": "man cartwheeling" - , "category": "People & Body" - , "aliases": [ - "man_cartwheeling" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤸‍♀️" - , "description": "woman cartwheeling" - , "category": "People & Body" - , "aliases": [ - "woman_cartwheeling" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤼" - , "description": "people wrestling" - , "category": "People & Body" - , "aliases": [ - "wrestling" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🤼‍♂️" - , "description": "men wrestling" - , "category": "People & Body" - , "aliases": [ - "men_wrestling" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🤼‍♀️" - , "description": "women wrestling" - , "category": "People & Body" - , "aliases": [ - "women_wrestling" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🤽" - , "description": "person playing water polo" - , "category": "People & Body" - , "aliases": [ - "water_polo" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤽‍♂️" - , "description": "man playing water polo" - , "category": "People & Body" - , "aliases": [ - "man_playing_water_polo" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤽‍♀️" - , "description": "woman playing water polo" - , "category": "People & Body" - , "aliases": [ - "woman_playing_water_polo" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤾" - , "description": "person playing handball" - , "category": "People & Body" - , "aliases": [ - "handball_person" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤾‍♂️" - , "description": "man playing handball" - , "category": "People & Body" - , "aliases": [ - "man_playing_handball" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤾‍♀️" - , "description": "woman playing handball" - , "category": "People & Body" - , "aliases": [ - "woman_playing_handball" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤹" - , "description": "person juggling" - , "category": "People & Body" - , "aliases": [ - "juggling_person" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🤹‍♂️" - , "description": "man juggling" - , "category": "People & Body" - , "aliases": [ - "man_juggling" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🤹‍♀️" - , "description": "woman juggling" - , "category": "People & Body" - , "aliases": [ - "woman_juggling" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - , "skin_tones": true - } -, { - "emoji": "🧘" - , "description": "person in lotus position" - , "category": "People & Body" - , "aliases": [ - "lotus_position" - ] - , "tags": [ - "meditation" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧘‍♂️" - , "description": "man in lotus position" - , "category": "People & Body" - , "aliases": [ - "lotus_position_man" - ] - , "tags": [ - "meditation" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🧘‍♀️" - , "description": "woman in lotus position" - , "category": "People & Body" - , "aliases": [ - "lotus_position_woman" - ] - , "tags": [ - "meditation" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "🛀" - , "description": "person taking bath" - , "category": "People & Body" - , "aliases": [ - "bath" - ] - , "tags": [ - "shower" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "🛌" - , "description": "person in bed" - , "category": "People & Body" - , "aliases": [ - "sleeping_bed" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - , "skin_tones": true - } -, { - "emoji": "🧑‍🤝‍🧑" - , "description": "people holding hands" - , "category": "People & Body" - , "aliases": [ - "people_holding_hands" - ] - , "tags": [ - "couple" - , "date" - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - , "skin_tones": true - } -, { - "emoji": "👭" - , "description": "women holding hands" - , "category": "People & Body" - , "aliases": [ - "two_women_holding_hands" - ] - , "tags": [ - "couple" - , "date" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👫" - , "description": "woman and man holding hands" - , "category": "People & Body" - , "aliases": [ - "couple" - ] - , "tags": [ - "date" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👬" - , "description": "men holding hands" - , "category": "People & Body" - , "aliases": [ - "two_men_holding_hands" - ] - , "tags": [ - "couple" - , "date" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "💏" - , "description": "kiss" - , "category": "People & Body" - , "aliases": [ - "couplekiss" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👩‍❤️‍💋‍👨" - , "description": "kiss: woman, man" - , "category": "People & Body" - , "aliases": [ - "couplekiss_man_woman" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👨‍❤️‍💋‍👨" - , "description": "kiss: man, man" - , "category": "People & Body" - , "aliases": [ - "couplekiss_man_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - , "skin_tones": true - } -, { - "emoji": "👩‍❤️‍💋‍👩" - , "description": "kiss: woman, woman" - , "category": "People & Body" - , "aliases": [ - "couplekiss_woman_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - , "skin_tones": true - } -, { - "emoji": "💑" - , "description": "couple with heart" - , "category": "People & Body" - , "aliases": [ - "couple_with_heart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - , "skin_tones": true - } -, { - "emoji": "👩‍❤️‍👨" - , "description": "couple with heart: woman, man" - , "category": "People & Body" - , "aliases": [ - "couple_with_heart_woman_man" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - , "skin_tones": true - } -, { - "emoji": "👨‍❤️‍👨" - , "description": "couple with heart: man, man" - , "category": "People & Body" - , "aliases": [ - "couple_with_heart_man_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - , "skin_tones": true - } -, { - "emoji": "👩‍❤️‍👩" - , "description": "couple with heart: woman, woman" - , "category": "People & Body" - , "aliases": [ - "couple_with_heart_woman_woman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - , "skin_tones": true - } -, { - "emoji": "👪" - , "description": "family" - , "category": "People & Body" - , "aliases": [ - "family" - ] - , "tags": [ - "home" - , "parents" - , "child" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👨‍👩‍👦" - , "description": "family: man, woman, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_woman_boy" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "👨‍👩‍👧" - , "description": "family: man, woman, girl" - , "category": "People & Body" - , "aliases": [ - "family_man_woman_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👩‍👧‍👦" - , "description": "family: man, woman, girl, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_woman_girl_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👩‍👦‍👦" - , "description": "family: man, woman, boy, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_woman_boy_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👩‍👧‍👧" - , "description": "family: man, woman, girl, girl" - , "category": "People & Body" - , "aliases": [ - "family_man_woman_girl_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👨‍👦" - , "description": "family: man, man, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_man_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👨‍👧" - , "description": "family: man, man, girl" - , "category": "People & Body" - , "aliases": [ - "family_man_man_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👨‍👧‍👦" - , "description": "family: man, man, girl, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_man_girl_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👨‍👦‍👦" - , "description": "family: man, man, boy, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_man_boy_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👨‍👧‍👧" - , "description": "family: man, man, girl, girl" - , "category": "People & Body" - , "aliases": [ - "family_man_man_girl_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👩‍👩‍👦" - , "description": "family: woman, woman, boy" - , "category": "People & Body" - , "aliases": [ - "family_woman_woman_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👩‍👩‍👧" - , "description": "family: woman, woman, girl" - , "category": "People & Body" - , "aliases": [ - "family_woman_woman_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👩‍👩‍👧‍👦" - , "description": "family: woman, woman, girl, boy" - , "category": "People & Body" - , "aliases": [ - "family_woman_woman_girl_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👩‍👩‍👦‍👦" - , "description": "family: woman, woman, boy, boy" - , "category": "People & Body" - , "aliases": [ - "family_woman_woman_boy_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👩‍👩‍👧‍👧" - , "description": "family: woman, woman, girl, girl" - , "category": "People & Body" - , "aliases": [ - "family_woman_woman_girl_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "👨‍👦" - , "description": "family: man, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👨‍👦‍👦" - , "description": "family: man, boy, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_boy_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👨‍👧" - , "description": "family: man, girl" - , "category": "People & Body" - , "aliases": [ - "family_man_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👨‍👧‍👦" - , "description": "family: man, girl, boy" - , "category": "People & Body" - , "aliases": [ - "family_man_girl_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👨‍👧‍👧" - , "description": "family: man, girl, girl" - , "category": "People & Body" - , "aliases": [ - "family_man_girl_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👩‍👦" - , "description": "family: woman, boy" - , "category": "People & Body" - , "aliases": [ - "family_woman_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👩‍👦‍👦" - , "description": "family: woman, boy, boy" - , "category": "People & Body" - , "aliases": [ - "family_woman_boy_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👩‍👧" - , "description": "family: woman, girl" - , "category": "People & Body" - , "aliases": [ - "family_woman_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👩‍👧‍👦" - , "description": "family: woman, girl, boy" - , "category": "People & Body" - , "aliases": [ - "family_woman_girl_boy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "👩‍👧‍👧" - , "description": "family: woman, girl, girl" - , "category": "People & Body" - , "aliases": [ - "family_woman_girl_girl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "🗣️" - , "description": "speaking head" - , "category": "People & Body" - , "aliases": [ - "speaking_head" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "👤" - , "description": "bust in silhouette" - , "category": "People & Body" - , "aliases": [ - "bust_in_silhouette" - ] - , "tags": [ - "user" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👥" - , "description": "busts in silhouette" - , "category": "People & Body" - , "aliases": [ - "busts_in_silhouette" - ] - , "tags": [ - "users" - , "group" - , "team" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🫂" - , "description": "people hugging" - , "category": "People & Body" - , "aliases": [ - "people_hugging" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "👣" - , "description": "footprints" - , "category": "People & Body" - , "aliases": [ - "footprints" - ] - , "tags": [ - "feet" - , "tracks" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐵" - , "description": "monkey face" - , "category": "Animals & Nature" - , "aliases": [ - "monkey_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐒" - , "description": "monkey" - , "category": "Animals & Nature" - , "aliases": [ - "monkey" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦍" - , "description": "gorilla" - , "category": "Animals & Nature" - , "aliases": [ - "gorilla" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦧" - , "description": "orangutan" - , "category": "Animals & Nature" - , "aliases": [ - "orangutan" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🐶" - , "description": "dog face" - , "category": "Animals & Nature" - , "aliases": [ - "dog" - ] - , "tags": [ - "pet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐕" - , "description": "dog" - , "category": "Animals & Nature" - , "aliases": [ - "dog2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦮" - , "description": "guide dog" - , "category": "Animals & Nature" - , "aliases": [ - "guide_dog" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🐕‍🦺" - , "description": "service dog" - , "category": "Animals & Nature" - , "aliases": [ - "service_dog" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🐩" - , "description": "poodle" - , "category": "Animals & Nature" - , "aliases": [ - "poodle" - ] - , "tags": [ - "dog" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐺" - , "description": "wolf" - , "category": "Animals & Nature" - , "aliases": [ - "wolf" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦊" - , "description": "fox" - , "category": "Animals & Nature" - , "aliases": [ - "fox_face" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦝" - , "description": "raccoon" - , "category": "Animals & Nature" - , "aliases": [ - "raccoon" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🐱" - , "description": "cat face" - , "category": "Animals & Nature" - , "aliases": [ - "cat" - ] - , "tags": [ - "pet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐈" - , "description": "cat" - , "category": "Animals & Nature" - , "aliases": [ - "cat2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐈‍⬛" - , "description": "black cat" - , "category": "Animals & Nature" - , "aliases": [ - "black_cat" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🦁" - , "description": "lion" - , "category": "Animals & Nature" - , "aliases": [ - "lion" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🐯" - , "description": "tiger face" - , "category": "Animals & Nature" - , "aliases": [ - "tiger" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐅" - , "description": "tiger" - , "category": "Animals & Nature" - , "aliases": [ - "tiger2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐆" - , "description": "leopard" - , "category": "Animals & Nature" - , "aliases": [ - "leopard" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐴" - , "description": "horse face" - , "category": "Animals & Nature" - , "aliases": [ - "horse" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐎" - , "description": "horse" - , "category": "Animals & Nature" - , "aliases": [ - "racehorse" - ] - , "tags": [ - "speed" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦄" - , "description": "unicorn" - , "category": "Animals & Nature" - , "aliases": [ - "unicorn" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🦓" - , "description": "zebra" - , "category": "Animals & Nature" - , "aliases": [ - "zebra" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦌" - , "description": "deer" - , "category": "Animals & Nature" - , "aliases": [ - "deer" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦬" - , "description": "bison" - , "category": "Animals & Nature" - , "aliases": [ - "bison" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🐮" - , "description": "cow face" - , "category": "Animals & Nature" - , "aliases": [ - "cow" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐂" - , "description": "ox" - , "category": "Animals & Nature" - , "aliases": [ - "ox" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐃" - , "description": "water buffalo" - , "category": "Animals & Nature" - , "aliases": [ - "water_buffalo" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐄" - , "description": "cow" - , "category": "Animals & Nature" - , "aliases": [ - "cow2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐷" - , "description": "pig face" - , "category": "Animals & Nature" - , "aliases": [ - "pig" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐖" - , "description": "pig" - , "category": "Animals & Nature" - , "aliases": [ - "pig2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐗" - , "description": "boar" - , "category": "Animals & Nature" - , "aliases": [ - "boar" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐽" - , "description": "pig nose" - , "category": "Animals & Nature" - , "aliases": [ - "pig_nose" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐏" - , "description": "ram" - , "category": "Animals & Nature" - , "aliases": [ - "ram" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐑" - , "description": "ewe" - , "category": "Animals & Nature" - , "aliases": [ - "sheep" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐐" - , "description": "goat" - , "category": "Animals & Nature" - , "aliases": [ - "goat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐪" - , "description": "camel" - , "category": "Animals & Nature" - , "aliases": [ - "dromedary_camel" - ] - , "tags": [ - "desert" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐫" - , "description": "two-hump camel" - , "category": "Animals & Nature" - , "aliases": [ - "camel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦙" - , "description": "llama" - , "category": "Animals & Nature" - , "aliases": [ - "llama" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦒" - , "description": "giraffe" - , "category": "Animals & Nature" - , "aliases": [ - "giraffe" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🐘" - , "description": "elephant" - , "category": "Animals & Nature" - , "aliases": [ - "elephant" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦣" - , "description": "mammoth" - , "category": "Animals & Nature" - , "aliases": [ - "mammoth" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🦏" - , "description": "rhinoceros" - , "category": "Animals & Nature" - , "aliases": [ - "rhinoceros" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦛" - , "description": "hippopotamus" - , "category": "Animals & Nature" - , "aliases": [ - "hippopotamus" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🐭" - , "description": "mouse face" - , "category": "Animals & Nature" - , "aliases": [ - "mouse" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐁" - , "description": "mouse" - , "category": "Animals & Nature" - , "aliases": [ - "mouse2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐀" - , "description": "rat" - , "category": "Animals & Nature" - , "aliases": [ - "rat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐹" - , "description": "hamster" - , "category": "Animals & Nature" - , "aliases": [ - "hamster" - ] - , "tags": [ - "pet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐰" - , "description": "rabbit face" - , "category": "Animals & Nature" - , "aliases": [ - "rabbit" - ] - , "tags": [ - "bunny" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐇" - , "description": "rabbit" - , "category": "Animals & Nature" - , "aliases": [ - "rabbit2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐿️" - , "description": "chipmunk" - , "category": "Animals & Nature" - , "aliases": [ - "chipmunk" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🦫" - , "description": "beaver" - , "category": "Animals & Nature" - , "aliases": [ - "beaver" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🦔" - , "description": "hedgehog" - , "category": "Animals & Nature" - , "aliases": [ - "hedgehog" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦇" - , "description": "bat" - , "category": "Animals & Nature" - , "aliases": [ - "bat" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🐻" - , "description": "bear" - , "category": "Animals & Nature" - , "aliases": [ - "bear" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐻‍❄️" - , "description": "polar bear" - , "category": "Animals & Nature" - , "aliases": [ - "polar_bear" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🐨" - , "description": "koala" - , "category": "Animals & Nature" - , "aliases": [ - "koala" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐼" - , "description": "panda" - , "category": "Animals & Nature" - , "aliases": [ - "panda_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦥" - , "description": "sloth" - , "category": "Animals & Nature" - , "aliases": [ - "sloth" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦦" - , "description": "otter" - , "category": "Animals & Nature" - , "aliases": [ - "otter" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦨" - , "description": "skunk" - , "category": "Animals & Nature" - , "aliases": [ - "skunk" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦘" - , "description": "kangaroo" - , "category": "Animals & Nature" - , "aliases": [ - "kangaroo" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦡" - , "description": "badger" - , "category": "Animals & Nature" - , "aliases": [ - "badger" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🐾" - , "description": "paw prints" - , "category": "Animals & Nature" - , "aliases": [ - "feet" - , "paw_prints" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦃" - , "description": "turkey" - , "category": "Animals & Nature" - , "aliases": [ - "turkey" - ] - , "tags": [ - "thanksgiving" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🐔" - , "description": "chicken" - , "category": "Animals & Nature" - , "aliases": [ - "chicken" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐓" - , "description": "rooster" - , "category": "Animals & Nature" - , "aliases": [ - "rooster" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐣" - , "description": "hatching chick" - , "category": "Animals & Nature" - , "aliases": [ - "hatching_chick" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐤" - , "description": "baby chick" - , "category": "Animals & Nature" - , "aliases": [ - "baby_chick" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐥" - , "description": "front-facing baby chick" - , "category": "Animals & Nature" - , "aliases": [ - "hatched_chick" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐦" - , "description": "bird" - , "category": "Animals & Nature" - , "aliases": [ - "bird" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐧" - , "description": "penguin" - , "category": "Animals & Nature" - , "aliases": [ - "penguin" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕊️" - , "description": "dove" - , "category": "Animals & Nature" - , "aliases": [ - "dove" - ] - , "tags": [ - "peace" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🦅" - , "description": "eagle" - , "category": "Animals & Nature" - , "aliases": [ - "eagle" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦆" - , "description": "duck" - , "category": "Animals & Nature" - , "aliases": [ - "duck" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦢" - , "description": "swan" - , "category": "Animals & Nature" - , "aliases": [ - "swan" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦉" - , "description": "owl" - , "category": "Animals & Nature" - , "aliases": [ - "owl" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦤" - , "description": "dodo" - , "category": "Animals & Nature" - , "aliases": [ - "dodo" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪶" - , "description": "feather" - , "category": "Animals & Nature" - , "aliases": [ - "feather" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🦩" - , "description": "flamingo" - , "category": "Animals & Nature" - , "aliases": [ - "flamingo" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦚" - , "description": "peacock" - , "category": "Animals & Nature" - , "aliases": [ - "peacock" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦜" - , "description": "parrot" - , "category": "Animals & Nature" - , "aliases": [ - "parrot" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🐸" - , "description": "frog" - , "category": "Animals & Nature" - , "aliases": [ - "frog" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐊" - , "description": "crocodile" - , "category": "Animals & Nature" - , "aliases": [ - "crocodile" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐢" - , "description": "turtle" - , "category": "Animals & Nature" - , "aliases": [ - "turtle" - ] - , "tags": [ - "slow" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦎" - , "description": "lizard" - , "category": "Animals & Nature" - , "aliases": [ - "lizard" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🐍" - , "description": "snake" - , "category": "Animals & Nature" - , "aliases": [ - "snake" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐲" - , "description": "dragon face" - , "category": "Animals & Nature" - , "aliases": [ - "dragon_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐉" - , "description": "dragon" - , "category": "Animals & Nature" - , "aliases": [ - "dragon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦕" - , "description": "sauropod" - , "category": "Animals & Nature" - , "aliases": [ - "sauropod" - ] - , "tags": [ - "dinosaur" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦖" - , "description": "T-Rex" - , "category": "Animals & Nature" - , "aliases": [ - "t-rex" - ] - , "tags": [ - "dinosaur" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🐳" - , "description": "spouting whale" - , "category": "Animals & Nature" - , "aliases": [ - "whale" - ] - , "tags": [ - "sea" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐋" - , "description": "whale" - , "category": "Animals & Nature" - , "aliases": [ - "whale2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐬" - , "description": "dolphin" - , "category": "Animals & Nature" - , "aliases": [ - "dolphin" - , "flipper" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦭" - , "description": "seal" - , "category": "Animals & Nature" - , "aliases": [ - "seal" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🐟" - , "description": "fish" - , "category": "Animals & Nature" - , "aliases": [ - "fish" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐠" - , "description": "tropical fish" - , "category": "Animals & Nature" - , "aliases": [ - "tropical_fish" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐡" - , "description": "blowfish" - , "category": "Animals & Nature" - , "aliases": [ - "blowfish" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦈" - , "description": "shark" - , "category": "Animals & Nature" - , "aliases": [ - "shark" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🐙" - , "description": "octopus" - , "category": "Animals & Nature" - , "aliases": [ - "octopus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐚" - , "description": "spiral shell" - , "category": "Animals & Nature" - , "aliases": [ - "shell" - ] - , "tags": [ - "sea" - , "beach" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐌" - , "description": "snail" - , "category": "Animals & Nature" - , "aliases": [ - "snail" - ] - , "tags": [ - "slow" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦋" - , "description": "butterfly" - , "category": "Animals & Nature" - , "aliases": [ - "butterfly" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🐛" - , "description": "bug" - , "category": "Animals & Nature" - , "aliases": [ - "bug" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐜" - , "description": "ant" - , "category": "Animals & Nature" - , "aliases": [ - "ant" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🐝" - , "description": "honeybee" - , "category": "Animals & Nature" - , "aliases": [ - "bee" - , "honeybee" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪲" - , "description": "beetle" - , "category": "Animals & Nature" - , "aliases": [ - "beetle" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🐞" - , "description": "lady beetle" - , "category": "Animals & Nature" - , "aliases": [ - "lady_beetle" - ] - , "tags": [ - "bug" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🦗" - , "description": "cricket" - , "category": "Animals & Nature" - , "aliases": [ - "cricket" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪳" - , "description": "cockroach" - , "category": "Animals & Nature" - , "aliases": [ - "cockroach" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🕷️" - , "description": "spider" - , "category": "Animals & Nature" - , "aliases": [ - "spider" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🕸️" - , "description": "spider web" - , "category": "Animals & Nature" - , "aliases": [ - "spider_web" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🦂" - , "description": "scorpion" - , "category": "Animals & Nature" - , "aliases": [ - "scorpion" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🦟" - , "description": "mosquito" - , "category": "Animals & Nature" - , "aliases": [ - "mosquito" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪰" - , "description": "fly" - , "category": "Animals & Nature" - , "aliases": [ - "fly" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪱" - , "description": "worm" - , "category": "Animals & Nature" - , "aliases": [ - "worm" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🦠" - , "description": "microbe" - , "category": "Animals & Nature" - , "aliases": [ - "microbe" - ] - , "tags": [ - "germ" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "💐" - , "description": "bouquet" - , "category": "Animals & Nature" - , "aliases": [ - "bouquet" - ] - , "tags": [ - "flowers" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌸" - , "description": "cherry blossom" - , "category": "Animals & Nature" - , "aliases": [ - "cherry_blossom" - ] - , "tags": [ - "flower" - , "spring" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💮" - , "description": "white flower" - , "category": "Animals & Nature" - , "aliases": [ - "white_flower" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏵️" - , "description": "rosette" - , "category": "Animals & Nature" - , "aliases": [ - "rosette" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌹" - , "description": "rose" - , "category": "Animals & Nature" - , "aliases": [ - "rose" - ] - , "tags": [ - "flower" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥀" - , "description": "wilted flower" - , "category": "Animals & Nature" - , "aliases": [ - "wilted_flower" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🌺" - , "description": "hibiscus" - , "category": "Animals & Nature" - , "aliases": [ - "hibiscus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌻" - , "description": "sunflower" - , "category": "Animals & Nature" - , "aliases": [ - "sunflower" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌼" - , "description": "blossom" - , "category": "Animals & Nature" - , "aliases": [ - "blossom" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌷" - , "description": "tulip" - , "category": "Animals & Nature" - , "aliases": [ - "tulip" - ] - , "tags": [ - "flower" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌱" - , "description": "seedling" - , "category": "Animals & Nature" - , "aliases": [ - "seedling" - ] - , "tags": [ - "plant" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪴" - , "description": "potted plant" - , "category": "Animals & Nature" - , "aliases": [ - "potted_plant" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🌲" - , "description": "evergreen tree" - , "category": "Animals & Nature" - , "aliases": [ - "evergreen_tree" - ] - , "tags": [ - "wood" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌳" - , "description": "deciduous tree" - , "category": "Animals & Nature" - , "aliases": [ - "deciduous_tree" - ] - , "tags": [ - "wood" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌴" - , "description": "palm tree" - , "category": "Animals & Nature" - , "aliases": [ - "palm_tree" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌵" - , "description": "cactus" - , "category": "Animals & Nature" - , "aliases": [ - "cactus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌾" - , "description": "sheaf of rice" - , "category": "Animals & Nature" - , "aliases": [ - "ear_of_rice" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌿" - , "description": "herb" - , "category": "Animals & Nature" - , "aliases": [ - "herb" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☘️" - , "description": "shamrock" - , "category": "Animals & Nature" - , "aliases": [ - "shamrock" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🍀" - , "description": "four leaf clover" - , "category": "Animals & Nature" - , "aliases": [ - "four_leaf_clover" - ] - , "tags": [ - "luck" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍁" - , "description": "maple leaf" - , "category": "Animals & Nature" - , "aliases": [ - "maple_leaf" - ] - , "tags": [ - "canada" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍂" - , "description": "fallen leaf" - , "category": "Animals & Nature" - , "aliases": [ - "fallen_leaf" - ] - , "tags": [ - "autumn" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍃" - , "description": "leaf fluttering in wind" - , "category": "Animals & Nature" - , "aliases": [ - "leaves" - ] - , "tags": [ - "leaf" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍇" - , "description": "grapes" - , "category": "Food & Drink" - , "aliases": [ - "grapes" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍈" - , "description": "melon" - , "category": "Food & Drink" - , "aliases": [ - "melon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍉" - , "description": "watermelon" - , "category": "Food & Drink" - , "aliases": [ - "watermelon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍊" - , "description": "tangerine" - , "category": "Food & Drink" - , "aliases": [ - "tangerine" - , "orange" - , "mandarin" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍋" - , "description": "lemon" - , "category": "Food & Drink" - , "aliases": [ - "lemon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍌" - , "description": "banana" - , "category": "Food & Drink" - , "aliases": [ - "banana" - ] - , "tags": [ - "fruit" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍍" - , "description": "pineapple" - , "category": "Food & Drink" - , "aliases": [ - "pineapple" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥭" - , "description": "mango" - , "category": "Food & Drink" - , "aliases": [ - "mango" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🍎" - , "description": "red apple" - , "category": "Food & Drink" - , "aliases": [ - "apple" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍏" - , "description": "green apple" - , "category": "Food & Drink" - , "aliases": [ - "green_apple" - ] - , "tags": [ - "fruit" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍐" - , "description": "pear" - , "category": "Food & Drink" - , "aliases": [ - "pear" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍑" - , "description": "peach" - , "category": "Food & Drink" - , "aliases": [ - "peach" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍒" - , "description": "cherries" - , "category": "Food & Drink" - , "aliases": [ - "cherries" - ] - , "tags": [ - "fruit" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍓" - , "description": "strawberry" - , "category": "Food & Drink" - , "aliases": [ - "strawberry" - ] - , "tags": [ - "fruit" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🫐" - , "description": "blueberries" - , "category": "Food & Drink" - , "aliases": [ - "blueberries" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🥝" - , "description": "kiwi fruit" - , "category": "Food & Drink" - , "aliases": [ - "kiwi_fruit" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🍅" - , "description": "tomato" - , "category": "Food & Drink" - , "aliases": [ - "tomato" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🫒" - , "description": "olive" - , "category": "Food & Drink" - , "aliases": [ - "olive" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🥥" - , "description": "coconut" - , "category": "Food & Drink" - , "aliases": [ - "coconut" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥑" - , "description": "avocado" - , "category": "Food & Drink" - , "aliases": [ - "avocado" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🍆" - , "description": "eggplant" - , "category": "Food & Drink" - , "aliases": [ - "eggplant" - ] - , "tags": [ - "aubergine" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥔" - , "description": "potato" - , "category": "Food & Drink" - , "aliases": [ - "potato" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥕" - , "description": "carrot" - , "category": "Food & Drink" - , "aliases": [ - "carrot" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🌽" - , "description": "ear of corn" - , "category": "Food & Drink" - , "aliases": [ - "corn" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌶️" - , "description": "hot pepper" - , "category": "Food & Drink" - , "aliases": [ - "hot_pepper" - ] - , "tags": [ - "spicy" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🫑" - , "description": "bell pepper" - , "category": "Food & Drink" - , "aliases": [ - "bell_pepper" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🥒" - , "description": "cucumber" - , "category": "Food & Drink" - , "aliases": [ - "cucumber" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥬" - , "description": "leafy green" - , "category": "Food & Drink" - , "aliases": [ - "leafy_green" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥦" - , "description": "broccoli" - , "category": "Food & Drink" - , "aliases": [ - "broccoli" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧄" - , "description": "garlic" - , "category": "Food & Drink" - , "aliases": [ - "garlic" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🧅" - , "description": "onion" - , "category": "Food & Drink" - , "aliases": [ - "onion" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🍄" - , "description": "mushroom" - , "category": "Food & Drink" - , "aliases": [ - "mushroom" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥜" - , "description": "peanuts" - , "category": "Food & Drink" - , "aliases": [ - "peanuts" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🌰" - , "description": "chestnut" - , "category": "Food & Drink" - , "aliases": [ - "chestnut" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍞" - , "description": "bread" - , "category": "Food & Drink" - , "aliases": [ - "bread" - ] - , "tags": [ - "toast" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥐" - , "description": "croissant" - , "category": "Food & Drink" - , "aliases": [ - "croissant" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥖" - , "description": "baguette bread" - , "category": "Food & Drink" - , "aliases": [ - "baguette_bread" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🫓" - , "description": "flatbread" - , "category": "Food & Drink" - , "aliases": [ - "flatbread" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🥨" - , "description": "pretzel" - , "category": "Food & Drink" - , "aliases": [ - "pretzel" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥯" - , "description": "bagel" - , "category": "Food & Drink" - , "aliases": [ - "bagel" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥞" - , "description": "pancakes" - , "category": "Food & Drink" - , "aliases": [ - "pancakes" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🧇" - , "description": "waffle" - , "category": "Food & Drink" - , "aliases": [ - "waffle" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🧀" - , "description": "cheese wedge" - , "category": "Food & Drink" - , "aliases": [ - "cheese" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🍖" - , "description": "meat on bone" - , "category": "Food & Drink" - , "aliases": [ - "meat_on_bone" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍗" - , "description": "poultry leg" - , "category": "Food & Drink" - , "aliases": [ - "poultry_leg" - ] - , "tags": [ - "meat" - , "chicken" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥩" - , "description": "cut of meat" - , "category": "Food & Drink" - , "aliases": [ - "cut_of_meat" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥓" - , "description": "bacon" - , "category": "Food & Drink" - , "aliases": [ - "bacon" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🍔" - , "description": "hamburger" - , "category": "Food & Drink" - , "aliases": [ - "hamburger" - ] - , "tags": [ - "burger" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍟" - , "description": "french fries" - , "category": "Food & Drink" - , "aliases": [ - "fries" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍕" - , "description": "pizza" - , "category": "Food & Drink" - , "aliases": [ - "pizza" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌭" - , "description": "hot dog" - , "category": "Food & Drink" - , "aliases": [ - "hotdog" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🥪" - , "description": "sandwich" - , "category": "Food & Drink" - , "aliases": [ - "sandwich" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🌮" - , "description": "taco" - , "category": "Food & Drink" - , "aliases": [ - "taco" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌯" - , "description": "burrito" - , "category": "Food & Drink" - , "aliases": [ - "burrito" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🫔" - , "description": "tamale" - , "category": "Food & Drink" - , "aliases": [ - "tamale" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🥙" - , "description": "stuffed flatbread" - , "category": "Food & Drink" - , "aliases": [ - "stuffed_flatbread" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🧆" - , "description": "falafel" - , "category": "Food & Drink" - , "aliases": [ - "falafel" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🥚" - , "description": "egg" - , "category": "Food & Drink" - , "aliases": [ - "egg" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🍳" - , "description": "cooking" - , "category": "Food & Drink" - , "aliases": [ - "fried_egg" - ] - , "tags": [ - "breakfast" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥘" - , "description": "shallow pan of food" - , "category": "Food & Drink" - , "aliases": [ - "shallow_pan_of_food" - ] - , "tags": [ - "paella" - , "curry" - ] - , "unicode_version": "" - , "ios_version": "10.2" - } -, { - "emoji": "🍲" - , "description": "pot of food" - , "category": "Food & Drink" - , "aliases": [ - "stew" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🫕" - , "description": "fondue" - , "category": "Food & Drink" - , "aliases": [ - "fondue" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🥣" - , "description": "bowl with spoon" - , "category": "Food & Drink" - , "aliases": [ - "bowl_with_spoon" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥗" - , "description": "green salad" - , "category": "Food & Drink" - , "aliases": [ - "green_salad" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🍿" - , "description": "popcorn" - , "category": "Food & Drink" - , "aliases": [ - "popcorn" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🧈" - , "description": "butter" - , "category": "Food & Drink" - , "aliases": [ - "butter" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🧂" - , "description": "salt" - , "category": "Food & Drink" - , "aliases": [ - "salt" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥫" - , "description": "canned food" - , "category": "Food & Drink" - , "aliases": [ - "canned_food" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🍱" - , "description": "bento box" - , "category": "Food & Drink" - , "aliases": [ - "bento" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍘" - , "description": "rice cracker" - , "category": "Food & Drink" - , "aliases": [ - "rice_cracker" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍙" - , "description": "rice ball" - , "category": "Food & Drink" - , "aliases": [ - "rice_ball" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍚" - , "description": "cooked rice" - , "category": "Food & Drink" - , "aliases": [ - "rice" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍛" - , "description": "curry rice" - , "category": "Food & Drink" - , "aliases": [ - "curry" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍜" - , "description": "steaming bowl" - , "category": "Food & Drink" - , "aliases": [ - "ramen" - ] - , "tags": [ - "noodle" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍝" - , "description": "spaghetti" - , "category": "Food & Drink" - , "aliases": [ - "spaghetti" - ] - , "tags": [ - "pasta" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍠" - , "description": "roasted sweet potato" - , "category": "Food & Drink" - , "aliases": [ - "sweet_potato" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍢" - , "description": "oden" - , "category": "Food & Drink" - , "aliases": [ - "oden" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍣" - , "description": "sushi" - , "category": "Food & Drink" - , "aliases": [ - "sushi" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍤" - , "description": "fried shrimp" - , "category": "Food & Drink" - , "aliases": [ - "fried_shrimp" - ] - , "tags": [ - "tempura" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍥" - , "description": "fish cake with swirl" - , "category": "Food & Drink" - , "aliases": [ - "fish_cake" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥮" - , "description": "moon cake" - , "category": "Food & Drink" - , "aliases": [ - "moon_cake" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🍡" - , "description": "dango" - , "category": "Food & Drink" - , "aliases": [ - "dango" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥟" - , "description": "dumpling" - , "category": "Food & Drink" - , "aliases": [ - "dumpling" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥠" - , "description": "fortune cookie" - , "category": "Food & Drink" - , "aliases": [ - "fortune_cookie" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥡" - , "description": "takeout box" - , "category": "Food & Drink" - , "aliases": [ - "takeout_box" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦀" - , "description": "crab" - , "category": "Food & Drink" - , "aliases": [ - "crab" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🦞" - , "description": "lobster" - , "category": "Food & Drink" - , "aliases": [ - "lobster" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦐" - , "description": "shrimp" - , "category": "Food & Drink" - , "aliases": [ - "shrimp" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦑" - , "description": "squid" - , "category": "Food & Drink" - , "aliases": [ - "squid" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦪" - , "description": "oyster" - , "category": "Food & Drink" - , "aliases": [ - "oyster" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🍦" - , "description": "soft ice cream" - , "category": "Food & Drink" - , "aliases": [ - "icecream" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍧" - , "description": "shaved ice" - , "category": "Food & Drink" - , "aliases": [ - "shaved_ice" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍨" - , "description": "ice cream" - , "category": "Food & Drink" - , "aliases": [ - "ice_cream" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍩" - , "description": "doughnut" - , "category": "Food & Drink" - , "aliases": [ - "doughnut" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍪" - , "description": "cookie" - , "category": "Food & Drink" - , "aliases": [ - "cookie" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎂" - , "description": "birthday cake" - , "category": "Food & Drink" - , "aliases": [ - "birthday" - ] - , "tags": [ - "party" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍰" - , "description": "shortcake" - , "category": "Food & Drink" - , "aliases": [ - "cake" - ] - , "tags": [ - "dessert" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧁" - , "description": "cupcake" - , "category": "Food & Drink" - , "aliases": [ - "cupcake" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥧" - , "description": "pie" - , "category": "Food & Drink" - , "aliases": [ - "pie" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🍫" - , "description": "chocolate bar" - , "category": "Food & Drink" - , "aliases": [ - "chocolate_bar" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍬" - , "description": "candy" - , "category": "Food & Drink" - , "aliases": [ - "candy" - ] - , "tags": [ - "sweet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍭" - , "description": "lollipop" - , "category": "Food & Drink" - , "aliases": [ - "lollipop" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍮" - , "description": "custard" - , "category": "Food & Drink" - , "aliases": [ - "custard" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍯" - , "description": "honey pot" - , "category": "Food & Drink" - , "aliases": [ - "honey_pot" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍼" - , "description": "baby bottle" - , "category": "Food & Drink" - , "aliases": [ - "baby_bottle" - ] - , "tags": [ - "milk" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥛" - , "description": "glass of milk" - , "category": "Food & Drink" - , "aliases": [ - "milk_glass" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "☕" - , "description": "hot beverage" - , "category": "Food & Drink" - , "aliases": [ - "coffee" - ] - , "tags": [ - "cafe" - , "espresso" - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "🫖" - , "description": "teapot" - , "category": "Food & Drink" - , "aliases": [ - "teapot" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🍵" - , "description": "teacup without handle" - , "category": "Food & Drink" - , "aliases": [ - "tea" - ] - , "tags": [ - "green" - , "breakfast" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍶" - , "description": "sake" - , "category": "Food & Drink" - , "aliases": [ - "sake" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍾" - , "description": "bottle with popping cork" - , "category": "Food & Drink" - , "aliases": [ - "champagne" - ] - , "tags": [ - "bottle" - , "bubbly" - , "celebration" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🍷" - , "description": "wine glass" - , "category": "Food & Drink" - , "aliases": [ - "wine_glass" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍸" - , "description": "cocktail glass" - , "category": "Food & Drink" - , "aliases": [ - "cocktail" - ] - , "tags": [ - "drink" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍹" - , "description": "tropical drink" - , "category": "Food & Drink" - , "aliases": [ - "tropical_drink" - ] - , "tags": [ - "summer" - , "vacation" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍺" - , "description": "beer mug" - , "category": "Food & Drink" - , "aliases": [ - "beer" - ] - , "tags": [ - "drink" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🍻" - , "description": "clinking beer mugs" - , "category": "Food & Drink" - , "aliases": [ - "beers" - ] - , "tags": [ - "drinks" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥂" - , "description": "clinking glasses" - , "category": "Food & Drink" - , "aliases": [ - "clinking_glasses" - ] - , "tags": [ - "cheers" - , "toast" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥃" - , "description": "tumbler glass" - , "category": "Food & Drink" - , "aliases": [ - "tumbler_glass" - ] - , "tags": [ - "whisky" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥤" - , "description": "cup with straw" - , "category": "Food & Drink" - , "aliases": [ - "cup_with_straw" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧋" - , "description": "bubble tea" - , "category": "Food & Drink" - , "aliases": [ - "bubble_tea" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🧃" - , "description": "beverage box" - , "category": "Food & Drink" - , "aliases": [ - "beverage_box" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🧉" - , "description": "mate" - , "category": "Food & Drink" - , "aliases": [ - "mate" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🧊" - , "description": "ice" - , "category": "Food & Drink" - , "aliases": [ - "ice_cube" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🥢" - , "description": "chopsticks" - , "category": "Food & Drink" - , "aliases": [ - "chopsticks" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🍽️" - , "description": "fork and knife with plate" - , "category": "Food & Drink" - , "aliases": [ - "plate_with_cutlery" - ] - , "tags": [ - "dining" - , "dinner" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🍴" - , "description": "fork and knife" - , "category": "Food & Drink" - , "aliases": [ - "fork_and_knife" - ] - , "tags": [ - "cutlery" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥄" - , "description": "spoon" - , "category": "Food & Drink" - , "aliases": [ - "spoon" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🔪" - , "description": "kitchen knife" - , "category": "Food & Drink" - , "aliases": [ - "hocho" - , "knife" - ] - , "tags": [ - "cut" - , "chop" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏺" - , "description": "amphora" - , "category": "Food & Drink" - , "aliases": [ - "amphora" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌍" - , "description": "globe showing Europe-Africa" - , "category": "Travel & Places" - , "aliases": [ - "earth_africa" - ] - , "tags": [ - "globe" - , "world" - , "international" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌎" - , "description": "globe showing Americas" - , "category": "Travel & Places" - , "aliases": [ - "earth_americas" - ] - , "tags": [ - "globe" - , "world" - , "international" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌏" - , "description": "globe showing Asia-Australia" - , "category": "Travel & Places" - , "aliases": [ - "earth_asia" - ] - , "tags": [ - "globe" - , "world" - , "international" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌐" - , "description": "globe with meridians" - , "category": "Travel & Places" - , "aliases": [ - "globe_with_meridians" - ] - , "tags": [ - "world" - , "global" - , "international" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗺️" - , "description": "world map" - , "category": "Travel & Places" - , "aliases": [ - "world_map" - ] - , "tags": [ - "travel" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🗾" - , "description": "map of Japan" - , "category": "Travel & Places" - , "aliases": [ - "japan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧭" - , "description": "compass" - , "category": "Travel & Places" - , "aliases": [ - "compass" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🏔️" - , "description": "snow-capped mountain" - , "category": "Travel & Places" - , "aliases": [ - "mountain_snow" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⛰️" - , "description": "mountain" - , "category": "Travel & Places" - , "aliases": [ - "mountain" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🌋" - , "description": "volcano" - , "category": "Travel & Places" - , "aliases": [ - "volcano" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗻" - , "description": "mount fuji" - , "category": "Travel & Places" - , "aliases": [ - "mount_fuji" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏕️" - , "description": "camping" - , "category": "Travel & Places" - , "aliases": [ - "camping" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏖️" - , "description": "beach with umbrella" - , "category": "Travel & Places" - , "aliases": [ - "beach_umbrella" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏜️" - , "description": "desert" - , "category": "Travel & Places" - , "aliases": [ - "desert" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏝️" - , "description": "desert island" - , "category": "Travel & Places" - , "aliases": [ - "desert_island" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏞️" - , "description": "national park" - , "category": "Travel & Places" - , "aliases": [ - "national_park" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏟️" - , "description": "stadium" - , "category": "Travel & Places" - , "aliases": [ - "stadium" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏛️" - , "description": "classical building" - , "category": "Travel & Places" - , "aliases": [ - "classical_building" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏗️" - , "description": "building construction" - , "category": "Travel & Places" - , "aliases": [ - "building_construction" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🧱" - , "description": "brick" - , "category": "Travel & Places" - , "aliases": [ - "bricks" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪨" - , "description": "rock" - , "category": "Travel & Places" - , "aliases": [ - "rock" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪵" - , "description": "wood" - , "category": "Travel & Places" - , "aliases": [ - "wood" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🛖" - , "description": "hut" - , "category": "Travel & Places" - , "aliases": [ - "hut" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🏘️" - , "description": "houses" - , "category": "Travel & Places" - , "aliases": [ - "houses" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏚️" - , "description": "derelict house" - , "category": "Travel & Places" - , "aliases": [ - "derelict_house" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏠" - , "description": "house" - , "category": "Travel & Places" - , "aliases": [ - "house" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏡" - , "description": "house with garden" - , "category": "Travel & Places" - , "aliases": [ - "house_with_garden" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏢" - , "description": "office building" - , "category": "Travel & Places" - , "aliases": [ - "office" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏣" - , "description": "Japanese post office" - , "category": "Travel & Places" - , "aliases": [ - "post_office" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏤" - , "description": "post office" - , "category": "Travel & Places" - , "aliases": [ - "european_post_office" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏥" - , "description": "hospital" - , "category": "Travel & Places" - , "aliases": [ - "hospital" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏦" - , "description": "bank" - , "category": "Travel & Places" - , "aliases": [ - "bank" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏨" - , "description": "hotel" - , "category": "Travel & Places" - , "aliases": [ - "hotel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏩" - , "description": "love hotel" - , "category": "Travel & Places" - , "aliases": [ - "love_hotel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏪" - , "description": "convenience store" - , "category": "Travel & Places" - , "aliases": [ - "convenience_store" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏫" - , "description": "school" - , "category": "Travel & Places" - , "aliases": [ - "school" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏬" - , "description": "department store" - , "category": "Travel & Places" - , "aliases": [ - "department_store" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏭" - , "description": "factory" - , "category": "Travel & Places" - , "aliases": [ - "factory" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏯" - , "description": "Japanese castle" - , "category": "Travel & Places" - , "aliases": [ - "japanese_castle" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏰" - , "description": "castle" - , "category": "Travel & Places" - , "aliases": [ - "european_castle" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💒" - , "description": "wedding" - , "category": "Travel & Places" - , "aliases": [ - "wedding" - ] - , "tags": [ - "marriage" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗼" - , "description": "Tokyo tower" - , "category": "Travel & Places" - , "aliases": [ - "tokyo_tower" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗽" - , "description": "Statue of Liberty" - , "category": "Travel & Places" - , "aliases": [ - "statue_of_liberty" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⛪" - , "description": "church" - , "category": "Travel & Places" - , "aliases": [ - "church" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🕌" - , "description": "mosque" - , "category": "Travel & Places" - , "aliases": [ - "mosque" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛕" - , "description": "hindu temple" - , "category": "Travel & Places" - , "aliases": [ - "hindu_temple" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🕍" - , "description": "synagogue" - , "category": "Travel & Places" - , "aliases": [ - "synagogue" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "⛩️" - , "description": "shinto shrine" - , "category": "Travel & Places" - , "aliases": [ - "shinto_shrine" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🕋" - , "description": "kaaba" - , "category": "Travel & Places" - , "aliases": [ - "kaaba" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "⛲" - , "description": "fountain" - , "category": "Travel & Places" - , "aliases": [ - "fountain" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "⛺" - , "description": "tent" - , "category": "Travel & Places" - , "aliases": [ - "tent" - ] - , "tags": [ - "camping" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🌁" - , "description": "foggy" - , "category": "Travel & Places" - , "aliases": [ - "foggy" - ] - , "tags": [ - "karl" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌃" - , "description": "night with stars" - , "category": "Travel & Places" - , "aliases": [ - "night_with_stars" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏙️" - , "description": "cityscape" - , "category": "Travel & Places" - , "aliases": [ - "cityscape" - ] - , "tags": [ - "skyline" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌄" - , "description": "sunrise over mountains" - , "category": "Travel & Places" - , "aliases": [ - "sunrise_over_mountains" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌅" - , "description": "sunrise" - , "category": "Travel & Places" - , "aliases": [ - "sunrise" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌆" - , "description": "cityscape at dusk" - , "category": "Travel & Places" - , "aliases": [ - "city_sunset" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌇" - , "description": "sunset" - , "category": "Travel & Places" - , "aliases": [ - "city_sunrise" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌉" - , "description": "bridge at night" - , "category": "Travel & Places" - , "aliases": [ - "bridge_at_night" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "♨️" - , "description": "hot springs" - , "category": "Travel & Places" - , "aliases": [ - "hotsprings" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🎠" - , "description": "carousel horse" - , "category": "Travel & Places" - , "aliases": [ - "carousel_horse" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎡" - , "description": "ferris wheel" - , "category": "Travel & Places" - , "aliases": [ - "ferris_wheel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎢" - , "description": "roller coaster" - , "category": "Travel & Places" - , "aliases": [ - "roller_coaster" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💈" - , "description": "barber pole" - , "category": "Travel & Places" - , "aliases": [ - "barber" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎪" - , "description": "circus tent" - , "category": "Travel & Places" - , "aliases": [ - "circus_tent" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚂" - , "description": "locomotive" - , "category": "Travel & Places" - , "aliases": [ - "steam_locomotive" - ] - , "tags": [ - "train" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚃" - , "description": "railway car" - , "category": "Travel & Places" - , "aliases": [ - "railway_car" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚄" - , "description": "high-speed train" - , "category": "Travel & Places" - , "aliases": [ - "bullettrain_side" - ] - , "tags": [ - "train" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚅" - , "description": "bullet train" - , "category": "Travel & Places" - , "aliases": [ - "bullettrain_front" - ] - , "tags": [ - "train" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚆" - , "description": "train" - , "category": "Travel & Places" - , "aliases": [ - "train2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚇" - , "description": "metro" - , "category": "Travel & Places" - , "aliases": [ - "metro" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚈" - , "description": "light rail" - , "category": "Travel & Places" - , "aliases": [ - "light_rail" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚉" - , "description": "station" - , "category": "Travel & Places" - , "aliases": [ - "station" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚊" - , "description": "tram" - , "category": "Travel & Places" - , "aliases": [ - "tram" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚝" - , "description": "monorail" - , "category": "Travel & Places" - , "aliases": [ - "monorail" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚞" - , "description": "mountain railway" - , "category": "Travel & Places" - , "aliases": [ - "mountain_railway" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚋" - , "description": "tram car" - , "category": "Travel & Places" - , "aliases": [ - "train" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚌" - , "description": "bus" - , "category": "Travel & Places" - , "aliases": [ - "bus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚍" - , "description": "oncoming bus" - , "category": "Travel & Places" - , "aliases": [ - "oncoming_bus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚎" - , "description": "trolleybus" - , "category": "Travel & Places" - , "aliases": [ - "trolleybus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚐" - , "description": "minibus" - , "category": "Travel & Places" - , "aliases": [ - "minibus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚑" - , "description": "ambulance" - , "category": "Travel & Places" - , "aliases": [ - "ambulance" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚒" - , "description": "fire engine" - , "category": "Travel & Places" - , "aliases": [ - "fire_engine" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚓" - , "description": "police car" - , "category": "Travel & Places" - , "aliases": [ - "police_car" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚔" - , "description": "oncoming police car" - , "category": "Travel & Places" - , "aliases": [ - "oncoming_police_car" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚕" - , "description": "taxi" - , "category": "Travel & Places" - , "aliases": [ - "taxi" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚖" - , "description": "oncoming taxi" - , "category": "Travel & Places" - , "aliases": [ - "oncoming_taxi" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚗" - , "description": "automobile" - , "category": "Travel & Places" - , "aliases": [ - "car" - , "red_car" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚘" - , "description": "oncoming automobile" - , "category": "Travel & Places" - , "aliases": [ - "oncoming_automobile" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚙" - , "description": "sport utility vehicle" - , "category": "Travel & Places" - , "aliases": [ - "blue_car" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛻" - , "description": "pickup truck" - , "category": "Travel & Places" - , "aliases": [ - "pickup_truck" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🚚" - , "description": "delivery truck" - , "category": "Travel & Places" - , "aliases": [ - "truck" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚛" - , "description": "articulated lorry" - , "category": "Travel & Places" - , "aliases": [ - "articulated_lorry" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚜" - , "description": "tractor" - , "category": "Travel & Places" - , "aliases": [ - "tractor" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏎️" - , "description": "racing car" - , "category": "Travel & Places" - , "aliases": [ - "racing_car" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏍️" - , "description": "motorcycle" - , "category": "Travel & Places" - , "aliases": [ - "motorcycle" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛵" - , "description": "motor scooter" - , "category": "Travel & Places" - , "aliases": [ - "motor_scooter" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🦽" - , "description": "manual wheelchair" - , "category": "Travel & Places" - , "aliases": [ - "manual_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🦼" - , "description": "motorized wheelchair" - , "category": "Travel & Places" - , "aliases": [ - "motorized_wheelchair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🛺" - , "description": "auto rickshaw" - , "category": "Travel & Places" - , "aliases": [ - "auto_rickshaw" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🚲" - , "description": "bicycle" - , "category": "Travel & Places" - , "aliases": [ - "bike" - ] - , "tags": [ - "bicycle" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛴" - , "description": "kick scooter" - , "category": "Travel & Places" - , "aliases": [ - "kick_scooter" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🛹" - , "description": "skateboard" - , "category": "Travel & Places" - , "aliases": [ - "skateboard" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🛼" - , "description": "roller skate" - , "category": "Travel & Places" - , "aliases": [ - "roller_skate" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🚏" - , "description": "bus stop" - , "category": "Travel & Places" - , "aliases": [ - "busstop" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛣️" - , "description": "motorway" - , "category": "Travel & Places" - , "aliases": [ - "motorway" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛤️" - , "description": "railway track" - , "category": "Travel & Places" - , "aliases": [ - "railway_track" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛢️" - , "description": "oil drum" - , "category": "Travel & Places" - , "aliases": [ - "oil_drum" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⛽" - , "description": "fuel pump" - , "category": "Travel & Places" - , "aliases": [ - "fuelpump" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🚨" - , "description": "police car light" - , "category": "Travel & Places" - , "aliases": [ - "rotating_light" - ] - , "tags": [ - "911" - , "emergency" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚥" - , "description": "horizontal traffic light" - , "category": "Travel & Places" - , "aliases": [ - "traffic_light" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚦" - , "description": "vertical traffic light" - , "category": "Travel & Places" - , "aliases": [ - "vertical_traffic_light" - ] - , "tags": [ - "semaphore" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛑" - , "description": "stop sign" - , "category": "Travel & Places" - , "aliases": [ - "stop_sign" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🚧" - , "description": "construction" - , "category": "Travel & Places" - , "aliases": [ - "construction" - ] - , "tags": [ - "wip" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⚓" - , "description": "anchor" - , "category": "Travel & Places" - , "aliases": [ - "anchor" - ] - , "tags": [ - "ship" - ] - , "unicode_version": "4.1" - , "ios_version": "6.0" - } -, { - "emoji": "⛵" - , "description": "sailboat" - , "category": "Travel & Places" - , "aliases": [ - "boat" - , "sailboat" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🛶" - , "description": "canoe" - , "category": "Travel & Places" - , "aliases": [ - "canoe" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🚤" - , "description": "speedboat" - , "category": "Travel & Places" - , "aliases": [ - "speedboat" - ] - , "tags": [ - "ship" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛳️" - , "description": "passenger ship" - , "category": "Travel & Places" - , "aliases": [ - "passenger_ship" - ] - , "tags": [ - "cruise" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⛴️" - , "description": "ferry" - , "category": "Travel & Places" - , "aliases": [ - "ferry" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🛥️" - , "description": "motor boat" - , "category": "Travel & Places" - , "aliases": [ - "motor_boat" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🚢" - , "description": "ship" - , "category": "Travel & Places" - , "aliases": [ - "ship" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "✈️" - , "description": "airplane" - , "category": "Travel & Places" - , "aliases": [ - "airplane" - ] - , "tags": [ - "flight" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🛩️" - , "description": "small airplane" - , "category": "Travel & Places" - , "aliases": [ - "small_airplane" - ] - , "tags": [ - "flight" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛫" - , "description": "airplane departure" - , "category": "Travel & Places" - , "aliases": [ - "flight_departure" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛬" - , "description": "airplane arrival" - , "category": "Travel & Places" - , "aliases": [ - "flight_arrival" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🪂" - , "description": "parachute" - , "category": "Travel & Places" - , "aliases": [ - "parachute" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "💺" - , "description": "seat" - , "category": "Travel & Places" - , "aliases": [ - "seat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚁" - , "description": "helicopter" - , "category": "Travel & Places" - , "aliases": [ - "helicopter" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚟" - , "description": "suspension railway" - , "category": "Travel & Places" - , "aliases": [ - "suspension_railway" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚠" - , "description": "mountain cableway" - , "category": "Travel & Places" - , "aliases": [ - "mountain_cableway" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚡" - , "description": "aerial tramway" - , "category": "Travel & Places" - , "aliases": [ - "aerial_tramway" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛰️" - , "description": "satellite" - , "category": "Travel & Places" - , "aliases": [ - "artificial_satellite" - ] - , "tags": [ - "orbit" - , "space" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🚀" - , "description": "rocket" - , "category": "Travel & Places" - , "aliases": [ - "rocket" - ] - , "tags": [ - "ship" - , "launch" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛸" - , "description": "flying saucer" - , "category": "Travel & Places" - , "aliases": [ - "flying_saucer" - ] - , "tags": [ - "ufo" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🛎️" - , "description": "bellhop bell" - , "category": "Travel & Places" - , "aliases": [ - "bellhop_bell" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🧳" - , "description": "luggage" - , "category": "Travel & Places" - , "aliases": [ - "luggage" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "⌛" - , "description": "hourglass done" - , "category": "Travel & Places" - , "aliases": [ - "hourglass" - ] - , "tags": [ - "time" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⏳" - , "description": "hourglass not done" - , "category": "Travel & Places" - , "aliases": [ - "hourglass_flowing_sand" - ] - , "tags": [ - "time" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⌚" - , "description": "watch" - , "category": "Travel & Places" - , "aliases": [ - "watch" - ] - , "tags": [ - "time" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⏰" - , "description": "alarm clock" - , "category": "Travel & Places" - , "aliases": [ - "alarm_clock" - ] - , "tags": [ - "morning" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⏱️" - , "description": "stopwatch" - , "category": "Travel & Places" - , "aliases": [ - "stopwatch" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.1" - } -, { - "emoji": "⏲️" - , "description": "timer clock" - , "category": "Travel & Places" - , "aliases": [ - "timer_clock" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.1" - } -, { - "emoji": "🕰️" - , "description": "mantelpiece clock" - , "category": "Travel & Places" - , "aliases": [ - "mantelpiece_clock" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🕛" - , "description": "twelve o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock12" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕧" - , "description": "twelve-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock1230" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕐" - , "description": "one o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock1" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕜" - , "description": "one-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock130" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕑" - , "description": "two o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕝" - , "description": "two-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock230" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕒" - , "description": "three o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock3" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕞" - , "description": "three-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock330" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕓" - , "description": "four o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock4" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕟" - , "description": "four-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock430" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕔" - , "description": "five o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock5" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕠" - , "description": "five-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock530" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕕" - , "description": "six o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock6" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕡" - , "description": "six-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock630" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕖" - , "description": "seven o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock7" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕢" - , "description": "seven-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock730" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕗" - , "description": "eight o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock8" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕣" - , "description": "eight-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock830" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕘" - , "description": "nine o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock9" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕤" - , "description": "nine-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock930" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕙" - , "description": "ten o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock10" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕥" - , "description": "ten-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock1030" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕚" - , "description": "eleven o’clock" - , "category": "Travel & Places" - , "aliases": [ - "clock11" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕦" - , "description": "eleven-thirty" - , "category": "Travel & Places" - , "aliases": [ - "clock1130" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌑" - , "description": "new moon" - , "category": "Travel & Places" - , "aliases": [ - "new_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌒" - , "description": "waxing crescent moon" - , "category": "Travel & Places" - , "aliases": [ - "waxing_crescent_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌓" - , "description": "first quarter moon" - , "category": "Travel & Places" - , "aliases": [ - "first_quarter_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌔" - , "description": "waxing gibbous moon" - , "category": "Travel & Places" - , "aliases": [ - "moon" - , "waxing_gibbous_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌕" - , "description": "full moon" - , "category": "Travel & Places" - , "aliases": [ - "full_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌖" - , "description": "waning gibbous moon" - , "category": "Travel & Places" - , "aliases": [ - "waning_gibbous_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌗" - , "description": "last quarter moon" - , "category": "Travel & Places" - , "aliases": [ - "last_quarter_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌘" - , "description": "waning crescent moon" - , "category": "Travel & Places" - , "aliases": [ - "waning_crescent_moon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌙" - , "description": "crescent moon" - , "category": "Travel & Places" - , "aliases": [ - "crescent_moon" - ] - , "tags": [ - "night" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌚" - , "description": "new moon face" - , "category": "Travel & Places" - , "aliases": [ - "new_moon_with_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌛" - , "description": "first quarter moon face" - , "category": "Travel & Places" - , "aliases": [ - "first_quarter_moon_with_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌜" - , "description": "last quarter moon face" - , "category": "Travel & Places" - , "aliases": [ - "last_quarter_moon_with_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌡️" - , "description": "thermometer" - , "category": "Travel & Places" - , "aliases": [ - "thermometer" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "☀️" - , "description": "sun" - , "category": "Travel & Places" - , "aliases": [ - "sunny" - ] - , "tags": [ - "weather" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🌝" - , "description": "full moon face" - , "category": "Travel & Places" - , "aliases": [ - "full_moon_with_face" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌞" - , "description": "sun with face" - , "category": "Travel & Places" - , "aliases": [ - "sun_with_face" - ] - , "tags": [ - "summer" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪐" - , "description": "ringed planet" - , "category": "Travel & Places" - , "aliases": [ - "ringed_planet" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "⭐" - , "description": "star" - , "category": "Travel & Places" - , "aliases": [ - "star" - ] - , "tags": [ - ] - , "unicode_version": "5.1" - , "ios_version": "6.0" - } -, { - "emoji": "🌟" - , "description": "glowing star" - , "category": "Travel & Places" - , "aliases": [ - "star2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌠" - , "description": "shooting star" - , "category": "Travel & Places" - , "aliases": [ - "stars" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌌" - , "description": "milky way" - , "category": "Travel & Places" - , "aliases": [ - "milky_way" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☁️" - , "description": "cloud" - , "category": "Travel & Places" - , "aliases": [ - "cloud" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⛅" - , "description": "sun behind cloud" - , "category": "Travel & Places" - , "aliases": [ - "partly_sunny" - ] - , "tags": [ - "weather" - , "cloud" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "⛈️" - , "description": "cloud with lightning and rain" - , "category": "Travel & Places" - , "aliases": [ - "cloud_with_lightning_and_rain" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🌤️" - , "description": "sun behind small cloud" - , "category": "Travel & Places" - , "aliases": [ - "sun_behind_small_cloud" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌥️" - , "description": "sun behind large cloud" - , "category": "Travel & Places" - , "aliases": [ - "sun_behind_large_cloud" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌦️" - , "description": "sun behind rain cloud" - , "category": "Travel & Places" - , "aliases": [ - "sun_behind_rain_cloud" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌧️" - , "description": "cloud with rain" - , "category": "Travel & Places" - , "aliases": [ - "cloud_with_rain" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌨️" - , "description": "cloud with snow" - , "category": "Travel & Places" - , "aliases": [ - "cloud_with_snow" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌩️" - , "description": "cloud with lightning" - , "category": "Travel & Places" - , "aliases": [ - "cloud_with_lightning" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌪️" - , "description": "tornado" - , "category": "Travel & Places" - , "aliases": [ - "tornado" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌫️" - , "description": "fog" - , "category": "Travel & Places" - , "aliases": [ - "fog" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌬️" - , "description": "wind face" - , "category": "Travel & Places" - , "aliases": [ - "wind_face" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🌀" - , "description": "cyclone" - , "category": "Travel & Places" - , "aliases": [ - "cyclone" - ] - , "tags": [ - "swirl" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌈" - , "description": "rainbow" - , "category": "Travel & Places" - , "aliases": [ - "rainbow" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌂" - , "description": "closed umbrella" - , "category": "Travel & Places" - , "aliases": [ - "closed_umbrella" - ] - , "tags": [ - "weather" - , "rain" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☂️" - , "description": "umbrella" - , "category": "Travel & Places" - , "aliases": [ - "open_umbrella" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☔" - , "description": "umbrella with rain drops" - , "category": "Travel & Places" - , "aliases": [ - "umbrella" - ] - , "tags": [ - "rain" - , "weather" - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "⛱️" - , "description": "umbrella on ground" - , "category": "Travel & Places" - , "aliases": [ - "parasol_on_ground" - ] - , "tags": [ - "beach_umbrella" - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "⚡" - , "description": "high voltage" - , "category": "Travel & Places" - , "aliases": [ - "zap" - ] - , "tags": [ - "lightning" - , "thunder" - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "❄️" - , "description": "snowflake" - , "category": "Travel & Places" - , "aliases": [ - "snowflake" - ] - , "tags": [ - "winter" - , "cold" - , "weather" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "☃️" - , "description": "snowman" - , "category": "Travel & Places" - , "aliases": [ - "snowman_with_snow" - ] - , "tags": [ - "winter" - , "christmas" - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "⛄" - , "description": "snowman without snow" - , "category": "Travel & Places" - , "aliases": [ - "snowman" - ] - , "tags": [ - "winter" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "☄️" - , "description": "comet" - , "category": "Travel & Places" - , "aliases": [ - "comet" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "🔥" - , "description": "fire" - , "category": "Travel & Places" - , "aliases": [ - "fire" - ] - , "tags": [ - "burn" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💧" - , "description": "droplet" - , "category": "Travel & Places" - , "aliases": [ - "droplet" - ] - , "tags": [ - "water" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🌊" - , "description": "water wave" - , "category": "Travel & Places" - , "aliases": [ - "ocean" - ] - , "tags": [ - "sea" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎃" - , "description": "jack-o-lantern" - , "category": "Activities" - , "aliases": [ - "jack_o_lantern" - ] - , "tags": [ - "halloween" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎄" - , "description": "Christmas tree" - , "category": "Activities" - , "aliases": [ - "christmas_tree" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎆" - , "description": "fireworks" - , "category": "Activities" - , "aliases": [ - "fireworks" - ] - , "tags": [ - "festival" - , "celebration" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎇" - , "description": "sparkler" - , "category": "Activities" - , "aliases": [ - "sparkler" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧨" - , "description": "firecracker" - , "category": "Activities" - , "aliases": [ - "firecracker" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "✨" - , "description": "sparkles" - , "category": "Activities" - , "aliases": [ - "sparkles" - ] - , "tags": [ - "shiny" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎈" - , "description": "balloon" - , "category": "Activities" - , "aliases": [ - "balloon" - ] - , "tags": [ - "party" - , "birthday" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎉" - , "description": "party popper" - , "category": "Activities" - , "aliases": [ - "tada" - ] - , "tags": [ - "hooray" - , "party" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎊" - , "description": "confetti ball" - , "category": "Activities" - , "aliases": [ - "confetti_ball" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎋" - , "description": "tanabata tree" - , "category": "Activities" - , "aliases": [ - "tanabata_tree" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎍" - , "description": "pine decoration" - , "category": "Activities" - , "aliases": [ - "bamboo" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎎" - , "description": "Japanese dolls" - , "category": "Activities" - , "aliases": [ - "dolls" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎏" - , "description": "carp streamer" - , "category": "Activities" - , "aliases": [ - "flags" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎐" - , "description": "wind chime" - , "category": "Activities" - , "aliases": [ - "wind_chime" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎑" - , "description": "moon viewing ceremony" - , "category": "Activities" - , "aliases": [ - "rice_scene" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧧" - , "description": "red envelope" - , "category": "Activities" - , "aliases": [ - "red_envelope" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🎀" - , "description": "ribbon" - , "category": "Activities" - , "aliases": [ - "ribbon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎁" - , "description": "wrapped gift" - , "category": "Activities" - , "aliases": [ - "gift" - ] - , "tags": [ - "present" - , "birthday" - , "christmas" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎗️" - , "description": "reminder ribbon" - , "category": "Activities" - , "aliases": [ - "reminder_ribbon" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎟️" - , "description": "admission tickets" - , "category": "Activities" - , "aliases": [ - "tickets" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎫" - , "description": "ticket" - , "category": "Activities" - , "aliases": [ - "ticket" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎖️" - , "description": "military medal" - , "category": "Activities" - , "aliases": [ - "medal_military" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏆" - , "description": "trophy" - , "category": "Activities" - , "aliases": [ - "trophy" - ] - , "tags": [ - "award" - , "contest" - , "winner" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏅" - , "description": "sports medal" - , "category": "Activities" - , "aliases": [ - "medal_sports" - ] - , "tags": [ - "gold" - , "winner" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🥇" - , "description": "1st place medal" - , "category": "Activities" - , "aliases": [ - "1st_place_medal" - ] - , "tags": [ - "gold" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥈" - , "description": "2nd place medal" - , "category": "Activities" - , "aliases": [ - "2nd_place_medal" - ] - , "tags": [ - "silver" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥉" - , "description": "3rd place medal" - , "category": "Activities" - , "aliases": [ - "3rd_place_medal" - ] - , "tags": [ - "bronze" - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "⚽" - , "description": "soccer ball" - , "category": "Activities" - , "aliases": [ - "soccer" - ] - , "tags": [ - "sports" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "⚾" - , "description": "baseball" - , "category": "Activities" - , "aliases": [ - "baseball" - ] - , "tags": [ - "sports" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🥎" - , "description": "softball" - , "category": "Activities" - , "aliases": [ - "softball" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🏀" - , "description": "basketball" - , "category": "Activities" - , "aliases": [ - "basketball" - ] - , "tags": [ - "sports" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏐" - , "description": "volleyball" - , "category": "Activities" - , "aliases": [ - "volleyball" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏈" - , "description": "american football" - , "category": "Activities" - , "aliases": [ - "football" - ] - , "tags": [ - "sports" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏉" - , "description": "rugby football" - , "category": "Activities" - , "aliases": [ - "rugby_football" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎾" - , "description": "tennis" - , "category": "Activities" - , "aliases": [ - "tennis" - ] - , "tags": [ - "sports" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥏" - , "description": "flying disc" - , "category": "Activities" - , "aliases": [ - "flying_disc" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🎳" - , "description": "bowling" - , "category": "Activities" - , "aliases": [ - "bowling" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏏" - , "description": "cricket game" - , "category": "Activities" - , "aliases": [ - "cricket_game" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏑" - , "description": "field hockey" - , "category": "Activities" - , "aliases": [ - "field_hockey" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏒" - , "description": "ice hockey" - , "category": "Activities" - , "aliases": [ - "ice_hockey" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🥍" - , "description": "lacrosse" - , "category": "Activities" - , "aliases": [ - "lacrosse" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🏓" - , "description": "ping pong" - , "category": "Activities" - , "aliases": [ - "ping_pong" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏸" - , "description": "badminton" - , "category": "Activities" - , "aliases": [ - "badminton" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🥊" - , "description": "boxing glove" - , "category": "Activities" - , "aliases": [ - "boxing_glove" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥋" - , "description": "martial arts uniform" - , "category": "Activities" - , "aliases": [ - "martial_arts_uniform" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🥅" - , "description": "goal net" - , "category": "Activities" - , "aliases": [ - "goal_net" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "⛳" - , "description": "flag in hole" - , "category": "Activities" - , "aliases": [ - "golf" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "⛸️" - , "description": "ice skate" - , "category": "Activities" - , "aliases": [ - "ice_skate" - ] - , "tags": [ - "skating" - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🎣" - , "description": "fishing pole" - , "category": "Activities" - , "aliases": [ - "fishing_pole_and_fish" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🤿" - , "description": "diving mask" - , "category": "Activities" - , "aliases": [ - "diving_mask" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🎽" - , "description": "running shirt" - , "category": "Activities" - , "aliases": [ - "running_shirt_with_sash" - ] - , "tags": [ - "marathon" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎿" - , "description": "skis" - , "category": "Activities" - , "aliases": [ - "ski" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛷" - , "description": "sled" - , "category": "Activities" - , "aliases": [ - "sled" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥌" - , "description": "curling stone" - , "category": "Activities" - , "aliases": [ - "curling_stone" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🎯" - , "description": "bullseye" - , "category": "Activities" - , "aliases": [ - "dart" - ] - , "tags": [ - "target" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪀" - , "description": "yo-yo" - , "category": "Activities" - , "aliases": [ - "yo_yo" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🪁" - , "description": "kite" - , "category": "Activities" - , "aliases": [ - "kite" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🎱" - , "description": "pool 8 ball" - , "category": "Activities" - , "aliases": [ - "8ball" - ] - , "tags": [ - "pool" - , "billiards" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔮" - , "description": "crystal ball" - , "category": "Activities" - , "aliases": [ - "crystal_ball" - ] - , "tags": [ - "fortune" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪄" - , "description": "magic wand" - , "category": "Activities" - , "aliases": [ - "magic_wand" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🧿" - , "description": "nazar amulet" - , "category": "Activities" - , "aliases": [ - "nazar_amulet" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🎮" - , "description": "video game" - , "category": "Activities" - , "aliases": [ - "video_game" - ] - , "tags": [ - "play" - , "controller" - , "console" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕹️" - , "description": "joystick" - , "category": "Activities" - , "aliases": [ - "joystick" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎰" - , "description": "slot machine" - , "category": "Activities" - , "aliases": [ - "slot_machine" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎲" - , "description": "game die" - , "category": "Activities" - , "aliases": [ - "game_die" - ] - , "tags": [ - "dice" - , "gambling" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧩" - , "description": "puzzle piece" - , "category": "Activities" - , "aliases": [ - "jigsaw" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧸" - , "description": "teddy bear" - , "category": "Activities" - , "aliases": [ - "teddy_bear" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪅" - , "description": "piñata" - , "category": "Activities" - , "aliases": [ - "pinata" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪆" - , "description": "nesting dolls" - , "category": "Activities" - , "aliases": [ - "nesting_dolls" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "♠️" - , "description": "spade suit" - , "category": "Activities" - , "aliases": [ - "spades" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♥️" - , "description": "heart suit" - , "category": "Activities" - , "aliases": [ - "hearts" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♦️" - , "description": "diamond suit" - , "category": "Activities" - , "aliases": [ - "diamonds" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♣️" - , "description": "club suit" - , "category": "Activities" - , "aliases": [ - "clubs" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♟️" - , "description": "chess pawn" - , "category": "Activities" - , "aliases": [ - "chess_pawn" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🃏" - , "description": "joker" - , "category": "Activities" - , "aliases": [ - "black_joker" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🀄" - , "description": "mahjong red dragon" - , "category": "Activities" - , "aliases": [ - "mahjong" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🎴" - , "description": "flower playing cards" - , "category": "Activities" - , "aliases": [ - "flower_playing_cards" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎭" - , "description": "performing arts" - , "category": "Activities" - , "aliases": [ - "performing_arts" - ] - , "tags": [ - "theater" - , "drama" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🖼️" - , "description": "framed picture" - , "category": "Activities" - , "aliases": [ - "framed_picture" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎨" - , "description": "artist palette" - , "category": "Activities" - , "aliases": [ - "art" - ] - , "tags": [ - "design" - , "paint" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧵" - , "description": "thread" - , "category": "Activities" - , "aliases": [ - "thread" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪡" - , "description": "sewing needle" - , "category": "Activities" - , "aliases": [ - "sewing_needle" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🧶" - , "description": "yarn" - , "category": "Activities" - , "aliases": [ - "yarn" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪢" - , "description": "knot" - , "category": "Activities" - , "aliases": [ - "knot" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "👓" - , "description": "glasses" - , "category": "Objects" - , "aliases": [ - "eyeglasses" - ] - , "tags": [ - "glasses" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕶️" - , "description": "sunglasses" - , "category": "Objects" - , "aliases": [ - "dark_sunglasses" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🥽" - , "description": "goggles" - , "category": "Objects" - , "aliases": [ - "goggles" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥼" - , "description": "lab coat" - , "category": "Objects" - , "aliases": [ - "lab_coat" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🦺" - , "description": "safety vest" - , "category": "Objects" - , "aliases": [ - "safety_vest" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "👔" - , "description": "necktie" - , "category": "Objects" - , "aliases": [ - "necktie" - ] - , "tags": [ - "shirt" - , "formal" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👕" - , "description": "t-shirt" - , "category": "Objects" - , "aliases": [ - "shirt" - , "tshirt" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👖" - , "description": "jeans" - , "category": "Objects" - , "aliases": [ - "jeans" - ] - , "tags": [ - "pants" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧣" - , "description": "scarf" - , "category": "Objects" - , "aliases": [ - "scarf" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧤" - , "description": "gloves" - , "category": "Objects" - , "aliases": [ - "gloves" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧥" - , "description": "coat" - , "category": "Objects" - , "aliases": [ - "coat" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧦" - , "description": "socks" - , "category": "Objects" - , "aliases": [ - "socks" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "👗" - , "description": "dress" - , "category": "Objects" - , "aliases": [ - "dress" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👘" - , "description": "kimono" - , "category": "Objects" - , "aliases": [ - "kimono" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥻" - , "description": "sari" - , "category": "Objects" - , "aliases": [ - "sari" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🩱" - , "description": "one-piece swimsuit" - , "category": "Objects" - , "aliases": [ - "one_piece_swimsuit" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🩲" - , "description": "briefs" - , "category": "Objects" - , "aliases": [ - "swim_brief" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🩳" - , "description": "shorts" - , "category": "Objects" - , "aliases": [ - "shorts" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "👙" - , "description": "bikini" - , "category": "Objects" - , "aliases": [ - "bikini" - ] - , "tags": [ - "beach" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👚" - , "description": "woman’s clothes" - , "category": "Objects" - , "aliases": [ - "womans_clothes" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👛" - , "description": "purse" - , "category": "Objects" - , "aliases": [ - "purse" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👜" - , "description": "handbag" - , "category": "Objects" - , "aliases": [ - "handbag" - ] - , "tags": [ - "bag" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👝" - , "description": "clutch bag" - , "category": "Objects" - , "aliases": [ - "pouch" - ] - , "tags": [ - "bag" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛍️" - , "description": "shopping bags" - , "category": "Objects" - , "aliases": [ - "shopping" - ] - , "tags": [ - "bags" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎒" - , "description": "backpack" - , "category": "Objects" - , "aliases": [ - "school_satchel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🩴" - , "description": "thong sandal" - , "category": "Objects" - , "aliases": [ - "thong_sandal" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "👞" - , "description": "man’s shoe" - , "category": "Objects" - , "aliases": [ - "mans_shoe" - , "shoe" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👟" - , "description": "running shoe" - , "category": "Objects" - , "aliases": [ - "athletic_shoe" - ] - , "tags": [ - "sneaker" - , "sport" - , "running" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🥾" - , "description": "hiking boot" - , "category": "Objects" - , "aliases": [ - "hiking_boot" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🥿" - , "description": "flat shoe" - , "category": "Objects" - , "aliases": [ - "flat_shoe" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "👠" - , "description": "high-heeled shoe" - , "category": "Objects" - , "aliases": [ - "high_heel" - ] - , "tags": [ - "shoe" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👡" - , "description": "woman’s sandal" - , "category": "Objects" - , "aliases": [ - "sandal" - ] - , "tags": [ - "shoe" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🩰" - , "description": "ballet shoes" - , "category": "Objects" - , "aliases": [ - "ballet_shoes" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "👢" - , "description": "woman’s boot" - , "category": "Objects" - , "aliases": [ - "boot" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👑" - , "description": "crown" - , "category": "Objects" - , "aliases": [ - "crown" - ] - , "tags": [ - "king" - , "queen" - , "royal" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "👒" - , "description": "woman’s hat" - , "category": "Objects" - , "aliases": [ - "womans_hat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎩" - , "description": "top hat" - , "category": "Objects" - , "aliases": [ - "tophat" - ] - , "tags": [ - "hat" - , "classy" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎓" - , "description": "graduation cap" - , "category": "Objects" - , "aliases": [ - "mortar_board" - ] - , "tags": [ - "education" - , "college" - , "university" - , "graduation" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧢" - , "description": "billed cap" - , "category": "Objects" - , "aliases": [ - "billed_cap" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪖" - , "description": "military helmet" - , "category": "Objects" - , "aliases": [ - "military_helmet" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "⛑️" - , "description": "rescue worker’s helmet" - , "category": "Objects" - , "aliases": [ - "rescue_worker_helmet" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "📿" - , "description": "prayer beads" - , "category": "Objects" - , "aliases": [ - "prayer_beads" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "💄" - , "description": "lipstick" - , "category": "Objects" - , "aliases": [ - "lipstick" - ] - , "tags": [ - "makeup" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💍" - , "description": "ring" - , "category": "Objects" - , "aliases": [ - "ring" - ] - , "tags": [ - "wedding" - , "marriage" - , "engaged" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💎" - , "description": "gem stone" - , "category": "Objects" - , "aliases": [ - "gem" - ] - , "tags": [ - "diamond" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔇" - , "description": "muted speaker" - , "category": "Objects" - , "aliases": [ - "mute" - ] - , "tags": [ - "sound" - , "volume" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔈" - , "description": "speaker low volume" - , "category": "Objects" - , "aliases": [ - "speaker" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔉" - , "description": "speaker medium volume" - , "category": "Objects" - , "aliases": [ - "sound" - ] - , "tags": [ - "volume" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔊" - , "description": "speaker high volume" - , "category": "Objects" - , "aliases": [ - "loud_sound" - ] - , "tags": [ - "volume" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📢" - , "description": "loudspeaker" - , "category": "Objects" - , "aliases": [ - "loudspeaker" - ] - , "tags": [ - "announcement" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📣" - , "description": "megaphone" - , "category": "Objects" - , "aliases": [ - "mega" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📯" - , "description": "postal horn" - , "category": "Objects" - , "aliases": [ - "postal_horn" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔔" - , "description": "bell" - , "category": "Objects" - , "aliases": [ - "bell" - ] - , "tags": [ - "sound" - , "notification" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔕" - , "description": "bell with slash" - , "category": "Objects" - , "aliases": [ - "no_bell" - ] - , "tags": [ - "volume" - , "off" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎼" - , "description": "musical score" - , "category": "Objects" - , "aliases": [ - "musical_score" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎵" - , "description": "musical note" - , "category": "Objects" - , "aliases": [ - "musical_note" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎶" - , "description": "musical notes" - , "category": "Objects" - , "aliases": [ - "notes" - ] - , "tags": [ - "music" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎙️" - , "description": "studio microphone" - , "category": "Objects" - , "aliases": [ - "studio_microphone" - ] - , "tags": [ - "podcast" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎚️" - , "description": "level slider" - , "category": "Objects" - , "aliases": [ - "level_slider" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎛️" - , "description": "control knobs" - , "category": "Objects" - , "aliases": [ - "control_knobs" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎤" - , "description": "microphone" - , "category": "Objects" - , "aliases": [ - "microphone" - ] - , "tags": [ - "sing" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎧" - , "description": "headphone" - , "category": "Objects" - , "aliases": [ - "headphones" - ] - , "tags": [ - "music" - , "earphones" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📻" - , "description": "radio" - , "category": "Objects" - , "aliases": [ - "radio" - ] - , "tags": [ - "podcast" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎷" - , "description": "saxophone" - , "category": "Objects" - , "aliases": [ - "saxophone" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪗" - , "description": "accordion" - , "category": "Objects" - , "aliases": [ - "accordion" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🎸" - , "description": "guitar" - , "category": "Objects" - , "aliases": [ - "guitar" - ] - , "tags": [ - "rock" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎹" - , "description": "musical keyboard" - , "category": "Objects" - , "aliases": [ - "musical_keyboard" - ] - , "tags": [ - "piano" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎺" - , "description": "trumpet" - , "category": "Objects" - , "aliases": [ - "trumpet" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎻" - , "description": "violin" - , "category": "Objects" - , "aliases": [ - "violin" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪕" - , "description": "banjo" - , "category": "Objects" - , "aliases": [ - "banjo" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🥁" - , "description": "drum" - , "category": "Objects" - , "aliases": [ - "drum" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "10.2" - } -, { - "emoji": "🪘" - , "description": "long drum" - , "category": "Objects" - , "aliases": [ - "long_drum" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "📱" - , "description": "mobile phone" - , "category": "Objects" - , "aliases": [ - "iphone" - ] - , "tags": [ - "smartphone" - , "mobile" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📲" - , "description": "mobile phone with arrow" - , "category": "Objects" - , "aliases": [ - "calling" - ] - , "tags": [ - "call" - , "incoming" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☎️" - , "description": "telephone" - , "category": "Objects" - , "aliases": [ - "phone" - , "telephone" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "📞" - , "description": "telephone receiver" - , "category": "Objects" - , "aliases": [ - "telephone_receiver" - ] - , "tags": [ - "phone" - , "call" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📟" - , "description": "pager" - , "category": "Objects" - , "aliases": [ - "pager" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📠" - , "description": "fax machine" - , "category": "Objects" - , "aliases": [ - "fax" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔋" - , "description": "battery" - , "category": "Objects" - , "aliases": [ - "battery" - ] - , "tags": [ - "power" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔌" - , "description": "electric plug" - , "category": "Objects" - , "aliases": [ - "electric_plug" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💻" - , "description": "laptop" - , "category": "Objects" - , "aliases": [ - "computer" - ] - , "tags": [ - "desktop" - , "screen" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🖥️" - , "description": "desktop computer" - , "category": "Objects" - , "aliases": [ - "desktop_computer" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🖨️" - , "description": "printer" - , "category": "Objects" - , "aliases": [ - "printer" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⌨️" - , "description": "keyboard" - , "category": "Objects" - , "aliases": [ - "keyboard" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "🖱️" - , "description": "computer mouse" - , "category": "Objects" - , "aliases": [ - "computer_mouse" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🖲️" - , "description": "trackball" - , "category": "Objects" - , "aliases": [ - "trackball" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "💽" - , "description": "computer disk" - , "category": "Objects" - , "aliases": [ - "minidisc" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💾" - , "description": "floppy disk" - , "category": "Objects" - , "aliases": [ - "floppy_disk" - ] - , "tags": [ - "save" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💿" - , "description": "optical disk" - , "category": "Objects" - , "aliases": [ - "cd" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📀" - , "description": "dvd" - , "category": "Objects" - , "aliases": [ - "dvd" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧮" - , "description": "abacus" - , "category": "Objects" - , "aliases": [ - "abacus" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🎥" - , "description": "movie camera" - , "category": "Objects" - , "aliases": [ - "movie_camera" - ] - , "tags": [ - "film" - , "video" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎞️" - , "description": "film frames" - , "category": "Objects" - , "aliases": [ - "film_strip" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📽️" - , "description": "film projector" - , "category": "Objects" - , "aliases": [ - "film_projector" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🎬" - , "description": "clapper board" - , "category": "Objects" - , "aliases": [ - "clapper" - ] - , "tags": [ - "film" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📺" - , "description": "television" - , "category": "Objects" - , "aliases": [ - "tv" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📷" - , "description": "camera" - , "category": "Objects" - , "aliases": [ - "camera" - ] - , "tags": [ - "photo" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📸" - , "description": "camera with flash" - , "category": "Objects" - , "aliases": [ - "camera_flash" - ] - , "tags": [ - "photo" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📹" - , "description": "video camera" - , "category": "Objects" - , "aliases": [ - "video_camera" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📼" - , "description": "videocassette" - , "category": "Objects" - , "aliases": [ - "vhs" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔍" - , "description": "magnifying glass tilted left" - , "category": "Objects" - , "aliases": [ - "mag" - ] - , "tags": [ - "search" - , "zoom" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔎" - , "description": "magnifying glass tilted right" - , "category": "Objects" - , "aliases": [ - "mag_right" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🕯️" - , "description": "candle" - , "category": "Objects" - , "aliases": [ - "candle" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "💡" - , "description": "light bulb" - , "category": "Objects" - , "aliases": [ - "bulb" - ] - , "tags": [ - "idea" - , "light" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔦" - , "description": "flashlight" - , "category": "Objects" - , "aliases": [ - "flashlight" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏮" - , "description": "red paper lantern" - , "category": "Objects" - , "aliases": [ - "izakaya_lantern" - , "lantern" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪔" - , "description": "diya lamp" - , "category": "Objects" - , "aliases": [ - "diya_lamp" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "📔" - , "description": "notebook with decorative cover" - , "category": "Objects" - , "aliases": [ - "notebook_with_decorative_cover" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📕" - , "description": "closed book" - , "category": "Objects" - , "aliases": [ - "closed_book" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📖" - , "description": "open book" - , "category": "Objects" - , "aliases": [ - "book" - , "open_book" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📗" - , "description": "green book" - , "category": "Objects" - , "aliases": [ - "green_book" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📘" - , "description": "blue book" - , "category": "Objects" - , "aliases": [ - "blue_book" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📙" - , "description": "orange book" - , "category": "Objects" - , "aliases": [ - "orange_book" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📚" - , "description": "books" - , "category": "Objects" - , "aliases": [ - "books" - ] - , "tags": [ - "library" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📓" - , "description": "notebook" - , "category": "Objects" - , "aliases": [ - "notebook" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📒" - , "description": "ledger" - , "category": "Objects" - , "aliases": [ - "ledger" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📃" - , "description": "page with curl" - , "category": "Objects" - , "aliases": [ - "page_with_curl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📜" - , "description": "scroll" - , "category": "Objects" - , "aliases": [ - "scroll" - ] - , "tags": [ - "document" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📄" - , "description": "page facing up" - , "category": "Objects" - , "aliases": [ - "page_facing_up" - ] - , "tags": [ - "document" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📰" - , "description": "newspaper" - , "category": "Objects" - , "aliases": [ - "newspaper" - ] - , "tags": [ - "press" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗞️" - , "description": "rolled-up newspaper" - , "category": "Objects" - , "aliases": [ - "newspaper_roll" - ] - , "tags": [ - "press" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📑" - , "description": "bookmark tabs" - , "category": "Objects" - , "aliases": [ - "bookmark_tabs" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔖" - , "description": "bookmark" - , "category": "Objects" - , "aliases": [ - "bookmark" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏷️" - , "description": "label" - , "category": "Objects" - , "aliases": [ - "label" - ] - , "tags": [ - "tag" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "💰" - , "description": "money bag" - , "category": "Objects" - , "aliases": [ - "moneybag" - ] - , "tags": [ - "dollar" - , "cream" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪙" - , "description": "coin" - , "category": "Objects" - , "aliases": [ - "coin" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "💴" - , "description": "yen banknote" - , "category": "Objects" - , "aliases": [ - "yen" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💵" - , "description": "dollar banknote" - , "category": "Objects" - , "aliases": [ - "dollar" - ] - , "tags": [ - "money" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💶" - , "description": "euro banknote" - , "category": "Objects" - , "aliases": [ - "euro" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💷" - , "description": "pound banknote" - , "category": "Objects" - , "aliases": [ - "pound" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💸" - , "description": "money with wings" - , "category": "Objects" - , "aliases": [ - "money_with_wings" - ] - , "tags": [ - "dollar" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💳" - , "description": "credit card" - , "category": "Objects" - , "aliases": [ - "credit_card" - ] - , "tags": [ - "subscription" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🧾" - , "description": "receipt" - , "category": "Objects" - , "aliases": [ - "receipt" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "💹" - , "description": "chart increasing with yen" - , "category": "Objects" - , "aliases": [ - "chart" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "✉️" - , "description": "envelope" - , "category": "Objects" - , "aliases": [ - "envelope" - ] - , "tags": [ - "letter" - , "email" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "📧" - , "description": "e-mail" - , "category": "Objects" - , "aliases": [ - "email" - , "e-mail" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📨" - , "description": "incoming envelope" - , "category": "Objects" - , "aliases": [ - "incoming_envelope" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📩" - , "description": "envelope with arrow" - , "category": "Objects" - , "aliases": [ - "envelope_with_arrow" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📤" - , "description": "outbox tray" - , "category": "Objects" - , "aliases": [ - "outbox_tray" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📥" - , "description": "inbox tray" - , "category": "Objects" - , "aliases": [ - "inbox_tray" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📦" - , "description": "package" - , "category": "Objects" - , "aliases": [ - "package" - ] - , "tags": [ - "shipping" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📫" - , "description": "closed mailbox with raised flag" - , "category": "Objects" - , "aliases": [ - "mailbox" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📪" - , "description": "closed mailbox with lowered flag" - , "category": "Objects" - , "aliases": [ - "mailbox_closed" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📬" - , "description": "open mailbox with raised flag" - , "category": "Objects" - , "aliases": [ - "mailbox_with_mail" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📭" - , "description": "open mailbox with lowered flag" - , "category": "Objects" - , "aliases": [ - "mailbox_with_no_mail" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📮" - , "description": "postbox" - , "category": "Objects" - , "aliases": [ - "postbox" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗳️" - , "description": "ballot box with ballot" - , "category": "Objects" - , "aliases": [ - "ballot_box" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "✏️" - , "description": "pencil" - , "category": "Objects" - , "aliases": [ - "pencil2" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "✒️" - , "description": "black nib" - , "category": "Objects" - , "aliases": [ - "black_nib" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🖋️" - , "description": "fountain pen" - , "category": "Objects" - , "aliases": [ - "fountain_pen" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🖊️" - , "description": "pen" - , "category": "Objects" - , "aliases": [ - "pen" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🖌️" - , "description": "paintbrush" - , "category": "Objects" - , "aliases": [ - "paintbrush" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🖍️" - , "description": "crayon" - , "category": "Objects" - , "aliases": [ - "crayon" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📝" - , "description": "memo" - , "category": "Objects" - , "aliases": [ - "memo" - , "pencil" - ] - , "tags": [ - "document" - , "note" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💼" - , "description": "briefcase" - , "category": "Objects" - , "aliases": [ - "briefcase" - ] - , "tags": [ - "business" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📁" - , "description": "file folder" - , "category": "Objects" - , "aliases": [ - "file_folder" - ] - , "tags": [ - "directory" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📂" - , "description": "open file folder" - , "category": "Objects" - , "aliases": [ - "open_file_folder" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗂️" - , "description": "card index dividers" - , "category": "Objects" - , "aliases": [ - "card_index_dividers" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📅" - , "description": "calendar" - , "category": "Objects" - , "aliases": [ - "date" - ] - , "tags": [ - "calendar" - , "schedule" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📆" - , "description": "tear-off calendar" - , "category": "Objects" - , "aliases": [ - "calendar" - ] - , "tags": [ - "schedule" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗒️" - , "description": "spiral notepad" - , "category": "Objects" - , "aliases": [ - "spiral_notepad" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🗓️" - , "description": "spiral calendar" - , "category": "Objects" - , "aliases": [ - "spiral_calendar" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📇" - , "description": "card index" - , "category": "Objects" - , "aliases": [ - "card_index" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📈" - , "description": "chart increasing" - , "category": "Objects" - , "aliases": [ - "chart_with_upwards_trend" - ] - , "tags": [ - "graph" - , "metrics" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📉" - , "description": "chart decreasing" - , "category": "Objects" - , "aliases": [ - "chart_with_downwards_trend" - ] - , "tags": [ - "graph" - , "metrics" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📊" - , "description": "bar chart" - , "category": "Objects" - , "aliases": [ - "bar_chart" - ] - , "tags": [ - "stats" - , "metrics" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📋" - , "description": "clipboard" - , "category": "Objects" - , "aliases": [ - "clipboard" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📌" - , "description": "pushpin" - , "category": "Objects" - , "aliases": [ - "pushpin" - ] - , "tags": [ - "location" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📍" - , "description": "round pushpin" - , "category": "Objects" - , "aliases": [ - "round_pushpin" - ] - , "tags": [ - "location" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📎" - , "description": "paperclip" - , "category": "Objects" - , "aliases": [ - "paperclip" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🖇️" - , "description": "linked paperclips" - , "category": "Objects" - , "aliases": [ - "paperclips" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "📏" - , "description": "straight ruler" - , "category": "Objects" - , "aliases": [ - "straight_ruler" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📐" - , "description": "triangular ruler" - , "category": "Objects" - , "aliases": [ - "triangular_ruler" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "✂️" - , "description": "scissors" - , "category": "Objects" - , "aliases": [ - "scissors" - ] - , "tags": [ - "cut" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🗃️" - , "description": "card file box" - , "category": "Objects" - , "aliases": [ - "card_file_box" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🗄️" - , "description": "file cabinet" - , "category": "Objects" - , "aliases": [ - "file_cabinet" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🗑️" - , "description": "wastebasket" - , "category": "Objects" - , "aliases": [ - "wastebasket" - ] - , "tags": [ - "trash" - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🔒" - , "description": "locked" - , "category": "Objects" - , "aliases": [ - "lock" - ] - , "tags": [ - "security" - , "private" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔓" - , "description": "unlocked" - , "category": "Objects" - , "aliases": [ - "unlock" - ] - , "tags": [ - "security" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔏" - , "description": "locked with pen" - , "category": "Objects" - , "aliases": [ - "lock_with_ink_pen" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔐" - , "description": "locked with key" - , "category": "Objects" - , "aliases": [ - "closed_lock_with_key" - ] - , "tags": [ - "security" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔑" - , "description": "key" - , "category": "Objects" - , "aliases": [ - "key" - ] - , "tags": [ - "lock" - , "password" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🗝️" - , "description": "old key" - , "category": "Objects" - , "aliases": [ - "old_key" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🔨" - , "description": "hammer" - , "category": "Objects" - , "aliases": [ - "hammer" - ] - , "tags": [ - "tool" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪓" - , "description": "axe" - , "category": "Objects" - , "aliases": [ - "axe" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "⛏️" - , "description": "pick" - , "category": "Objects" - , "aliases": [ - "pick" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "⚒️" - , "description": "hammer and pick" - , "category": "Objects" - , "aliases": [ - "hammer_and_pick" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🛠️" - , "description": "hammer and wrench" - , "category": "Objects" - , "aliases": [ - "hammer_and_wrench" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🗡️" - , "description": "dagger" - , "category": "Objects" - , "aliases": [ - "dagger" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⚔️" - , "description": "crossed swords" - , "category": "Objects" - , "aliases": [ - "crossed_swords" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🔫" - , "description": "water pistol" - , "category": "Objects" - , "aliases": [ - "gun" - ] - , "tags": [ - "shoot" - , "weapon" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪃" - , "description": "boomerang" - , "category": "Objects" - , "aliases": [ - "boomerang" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🏹" - , "description": "bow and arrow" - , "category": "Objects" - , "aliases": [ - "bow_and_arrow" - ] - , "tags": [ - "archery" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛡️" - , "description": "shield" - , "category": "Objects" - , "aliases": [ - "shield" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🪚" - , "description": "carpentry saw" - , "category": "Objects" - , "aliases": [ - "carpentry_saw" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🔧" - , "description": "wrench" - , "category": "Objects" - , "aliases": [ - "wrench" - ] - , "tags": [ - "tool" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪛" - , "description": "screwdriver" - , "category": "Objects" - , "aliases": [ - "screwdriver" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🔩" - , "description": "nut and bolt" - , "category": "Objects" - , "aliases": [ - "nut_and_bolt" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⚙️" - , "description": "gear" - , "category": "Objects" - , "aliases": [ - "gear" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🗜️" - , "description": "clamp" - , "category": "Objects" - , "aliases": [ - "clamp" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⚖️" - , "description": "balance scale" - , "category": "Objects" - , "aliases": [ - "balance_scale" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🦯" - , "description": "white cane" - , "category": "Objects" - , "aliases": [ - "probing_cane" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🔗" - , "description": "link" - , "category": "Objects" - , "aliases": [ - "link" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⛓️" - , "description": "chains" - , "category": "Objects" - , "aliases": [ - "chains" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "9.1" - } -, { - "emoji": "🪝" - , "description": "hook" - , "category": "Objects" - , "aliases": [ - "hook" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🧰" - , "description": "toolbox" - , "category": "Objects" - , "aliases": [ - "toolbox" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧲" - , "description": "magnet" - , "category": "Objects" - , "aliases": [ - "magnet" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪜" - , "description": "ladder" - , "category": "Objects" - , "aliases": [ - "ladder" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "⚗️" - , "description": "alembic" - , "category": "Objects" - , "aliases": [ - "alembic" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🧪" - , "description": "test tube" - , "category": "Objects" - , "aliases": [ - "test_tube" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧫" - , "description": "petri dish" - , "category": "Objects" - , "aliases": [ - "petri_dish" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧬" - , "description": "dna" - , "category": "Objects" - , "aliases": [ - "dna" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🔬" - , "description": "microscope" - , "category": "Objects" - , "aliases": [ - "microscope" - ] - , "tags": [ - "science" - , "laboratory" - , "investigate" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔭" - , "description": "telescope" - , "category": "Objects" - , "aliases": [ - "telescope" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📡" - , "description": "satellite antenna" - , "category": "Objects" - , "aliases": [ - "satellite" - ] - , "tags": [ - "signal" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💉" - , "description": "syringe" - , "category": "Objects" - , "aliases": [ - "syringe" - ] - , "tags": [ - "health" - , "hospital" - , "needle" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🩸" - , "description": "drop of blood" - , "category": "Objects" - , "aliases": [ - "drop_of_blood" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "💊" - , "description": "pill" - , "category": "Objects" - , "aliases": [ - "pill" - ] - , "tags": [ - "health" - , "medicine" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🩹" - , "description": "adhesive bandage" - , "category": "Objects" - , "aliases": [ - "adhesive_bandage" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🩺" - , "description": "stethoscope" - , "category": "Objects" - , "aliases": [ - "stethoscope" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🚪" - , "description": "door" - , "category": "Objects" - , "aliases": [ - "door" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛗" - , "description": "elevator" - , "category": "Objects" - , "aliases": [ - "elevator" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪞" - , "description": "mirror" - , "category": "Objects" - , "aliases": [ - "mirror" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪟" - , "description": "window" - , "category": "Objects" - , "aliases": [ - "window" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🛏️" - , "description": "bed" - , "category": "Objects" - , "aliases": [ - "bed" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🛋️" - , "description": "couch and lamp" - , "category": "Objects" - , "aliases": [ - "couch_and_lamp" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🪑" - , "description": "chair" - , "category": "Objects" - , "aliases": [ - "chair" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🚽" - , "description": "toilet" - , "category": "Objects" - , "aliases": [ - "toilet" - ] - , "tags": [ - "wc" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪠" - , "description": "plunger" - , "category": "Objects" - , "aliases": [ - "plunger" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🚿" - , "description": "shower" - , "category": "Objects" - , "aliases": [ - "shower" - ] - , "tags": [ - "bath" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛁" - , "description": "bathtub" - , "category": "Objects" - , "aliases": [ - "bathtub" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪤" - , "description": "mouse trap" - , "category": "Objects" - , "aliases": [ - "mouse_trap" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🪒" - , "description": "razor" - , "category": "Objects" - , "aliases": [ - "razor" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🧴" - , "description": "lotion bottle" - , "category": "Objects" - , "aliases": [ - "lotion_bottle" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧷" - , "description": "safety pin" - , "category": "Objects" - , "aliases": [ - "safety_pin" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧹" - , "description": "broom" - , "category": "Objects" - , "aliases": [ - "broom" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧺" - , "description": "basket" - , "category": "Objects" - , "aliases": [ - "basket" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧻" - , "description": "roll of paper" - , "category": "Objects" - , "aliases": [ - "roll_of_paper" - ] - , "tags": [ - "toilet" - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪣" - , "description": "bucket" - , "category": "Objects" - , "aliases": [ - "bucket" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🧼" - , "description": "soap" - , "category": "Objects" - , "aliases": [ - "soap" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🪥" - , "description": "toothbrush" - , "category": "Objects" - , "aliases": [ - "toothbrush" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🧽" - , "description": "sponge" - , "category": "Objects" - , "aliases": [ - "sponge" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🧯" - , "description": "fire extinguisher" - , "category": "Objects" - , "aliases": [ - "fire_extinguisher" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🛒" - , "description": "shopping cart" - , "category": "Objects" - , "aliases": [ - "shopping_cart" - ] - , "tags": [ - ] - , "unicode_version": "9.0" - , "ios_version": "10.2" - } -, { - "emoji": "🚬" - , "description": "cigarette" - , "category": "Objects" - , "aliases": [ - "smoking" - ] - , "tags": [ - "cigarette" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⚰️" - , "description": "coffin" - , "category": "Objects" - , "aliases": [ - "coffin" - ] - , "tags": [ - "funeral" - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🪦" - , "description": "headstone" - , "category": "Objects" - , "aliases": [ - "headstone" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "⚱️" - , "description": "funeral urn" - , "category": "Objects" - , "aliases": [ - "funeral_urn" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🗿" - , "description": "moai" - , "category": "Objects" - , "aliases": [ - "moyai" - ] - , "tags": [ - "stone" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🪧" - , "description": "placard" - , "category": "Objects" - , "aliases": [ - "placard" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🏧" - , "description": "ATM sign" - , "category": "Symbols" - , "aliases": [ - "atm" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚮" - , "description": "litter in bin sign" - , "category": "Symbols" - , "aliases": [ - "put_litter_in_its_place" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚰" - , "description": "potable water" - , "category": "Symbols" - , "aliases": [ - "potable_water" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "♿" - , "description": "wheelchair symbol" - , "category": "Symbols" - , "aliases": [ - "wheelchair" - ] - , "tags": [ - "accessibility" - ] - , "unicode_version": "4.1" - , "ios_version": "6.0" - } -, { - "emoji": "🚹" - , "description": "men’s room" - , "category": "Symbols" - , "aliases": [ - "mens" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚺" - , "description": "women’s room" - , "category": "Symbols" - , "aliases": [ - "womens" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚻" - , "description": "restroom" - , "category": "Symbols" - , "aliases": [ - "restroom" - ] - , "tags": [ - "toilet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚼" - , "description": "baby symbol" - , "category": "Symbols" - , "aliases": [ - "baby_symbol" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚾" - , "description": "water closet" - , "category": "Symbols" - , "aliases": [ - "wc" - ] - , "tags": [ - "toilet" - , "restroom" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛂" - , "description": "passport control" - , "category": "Symbols" - , "aliases": [ - "passport_control" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛃" - , "description": "customs" - , "category": "Symbols" - , "aliases": [ - "customs" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛄" - , "description": "baggage claim" - , "category": "Symbols" - , "aliases": [ - "baggage_claim" - ] - , "tags": [ - "airport" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛅" - , "description": "left luggage" - , "category": "Symbols" - , "aliases": [ - "left_luggage" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⚠️" - , "description": "warning" - , "category": "Symbols" - , "aliases": [ - "warning" - ] - , "tags": [ - "wip" - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚸" - , "description": "children crossing" - , "category": "Symbols" - , "aliases": [ - "children_crossing" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⛔" - , "description": "no entry" - , "category": "Symbols" - , "aliases": [ - "no_entry" - ] - , "tags": [ - "limit" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🚫" - , "description": "prohibited" - , "category": "Symbols" - , "aliases": [ - "no_entry_sign" - ] - , "tags": [ - "block" - , "forbidden" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚳" - , "description": "no bicycles" - , "category": "Symbols" - , "aliases": [ - "no_bicycles" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚭" - , "description": "no smoking" - , "category": "Symbols" - , "aliases": [ - "no_smoking" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚯" - , "description": "no littering" - , "category": "Symbols" - , "aliases": [ - "do_not_litter" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚱" - , "description": "non-potable water" - , "category": "Symbols" - , "aliases": [ - "non-potable_water" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚷" - , "description": "no pedestrians" - , "category": "Symbols" - , "aliases": [ - "no_pedestrians" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📵" - , "description": "no mobile phones" - , "category": "Symbols" - , "aliases": [ - "no_mobile_phones" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔞" - , "description": "no one under eighteen" - , "category": "Symbols" - , "aliases": [ - "underage" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☢️" - , "description": "radioactive" - , "category": "Symbols" - , "aliases": [ - "radioactive" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☣️" - , "description": "biohazard" - , "category": "Symbols" - , "aliases": [ - "biohazard" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "⬆️" - , "description": "up arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_up" - ] - , "tags": [ - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "↗️" - , "description": "up-right arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_upper_right" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "➡️" - , "description": "right arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_right" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "↘️" - , "description": "down-right arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_lower_right" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⬇️" - , "description": "down arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_down" - ] - , "tags": [ - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "↙️" - , "description": "down-left arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_lower_left" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⬅️" - , "description": "left arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_left" - ] - , "tags": [ - ] - , "unicode_version": "4.0" - , "ios_version": "6.0" - } -, { - "emoji": "↖️" - , "description": "up-left arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_upper_left" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "↕️" - , "description": "up-down arrow" - , "category": "Symbols" - , "aliases": [ - "arrow_up_down" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "↔️" - , "description": "left-right arrow" - , "category": "Symbols" - , "aliases": [ - "left_right_arrow" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "↩️" - , "description": "right arrow curving left" - , "category": "Symbols" - , "aliases": [ - "leftwards_arrow_with_hook" - ] - , "tags": [ - "return" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "↪️" - , "description": "left arrow curving right" - , "category": "Symbols" - , "aliases": [ - "arrow_right_hook" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⤴️" - , "description": "right arrow curving up" - , "category": "Symbols" - , "aliases": [ - "arrow_heading_up" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⤵️" - , "description": "right arrow curving down" - , "category": "Symbols" - , "aliases": [ - "arrow_heading_down" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🔃" - , "description": "clockwise vertical arrows" - , "category": "Symbols" - , "aliases": [ - "arrows_clockwise" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔄" - , "description": "counterclockwise arrows button" - , "category": "Symbols" - , "aliases": [ - "arrows_counterclockwise" - ] - , "tags": [ - "sync" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔙" - , "description": "BACK arrow" - , "category": "Symbols" - , "aliases": [ - "back" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔚" - , "description": "END arrow" - , "category": "Symbols" - , "aliases": [ - "end" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔛" - , "description": "ON! arrow" - , "category": "Symbols" - , "aliases": [ - "on" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔜" - , "description": "SOON arrow" - , "category": "Symbols" - , "aliases": [ - "soon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔝" - , "description": "TOP arrow" - , "category": "Symbols" - , "aliases": [ - "top" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🛐" - , "description": "place of worship" - , "category": "Symbols" - , "aliases": [ - "place_of_worship" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "⚛️" - , "description": "atom symbol" - , "category": "Symbols" - , "aliases": [ - "atom_symbol" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🕉️" - , "description": "om" - , "category": "Symbols" - , "aliases": [ - "om" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "✡️" - , "description": "star of David" - , "category": "Symbols" - , "aliases": [ - "star_of_david" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☸️" - , "description": "wheel of dharma" - , "category": "Symbols" - , "aliases": [ - "wheel_of_dharma" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☯️" - , "description": "yin yang" - , "category": "Symbols" - , "aliases": [ - "yin_yang" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "✝️" - , "description": "latin cross" - , "category": "Symbols" - , "aliases": [ - "latin_cross" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☦️" - , "description": "orthodox cross" - , "category": "Symbols" - , "aliases": [ - "orthodox_cross" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☪️" - , "description": "star and crescent" - , "category": "Symbols" - , "aliases": [ - "star_and_crescent" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "☮️" - , "description": "peace symbol" - , "category": "Symbols" - , "aliases": [ - "peace_symbol" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "🕎" - , "description": "menorah" - , "category": "Symbols" - , "aliases": [ - "menorah" - ] - , "tags": [ - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🔯" - , "description": "dotted six-pointed star" - , "category": "Symbols" - , "aliases": [ - "six_pointed_star" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "♈" - , "description": "Aries" - , "category": "Symbols" - , "aliases": [ - "aries" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♉" - , "description": "Taurus" - , "category": "Symbols" - , "aliases": [ - "taurus" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♊" - , "description": "Gemini" - , "category": "Symbols" - , "aliases": [ - "gemini" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♋" - , "description": "Cancer" - , "category": "Symbols" - , "aliases": [ - "cancer" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♌" - , "description": "Leo" - , "category": "Symbols" - , "aliases": [ - "leo" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♍" - , "description": "Virgo" - , "category": "Symbols" - , "aliases": [ - "virgo" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♎" - , "description": "Libra" - , "category": "Symbols" - , "aliases": [ - "libra" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♏" - , "description": "Scorpio" - , "category": "Symbols" - , "aliases": [ - "scorpius" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♐" - , "description": "Sagittarius" - , "category": "Symbols" - , "aliases": [ - "sagittarius" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♑" - , "description": "Capricorn" - , "category": "Symbols" - , "aliases": [ - "capricorn" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♒" - , "description": "Aquarius" - , "category": "Symbols" - , "aliases": [ - "aquarius" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "♓" - , "description": "Pisces" - , "category": "Symbols" - , "aliases": [ - "pisces" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⛎" - , "description": "Ophiuchus" - , "category": "Symbols" - , "aliases": [ - "ophiuchus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔀" - , "description": "shuffle tracks button" - , "category": "Symbols" - , "aliases": [ - "twisted_rightwards_arrows" - ] - , "tags": [ - "shuffle" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔁" - , "description": "repeat button" - , "category": "Symbols" - , "aliases": [ - "repeat" - ] - , "tags": [ - "loop" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔂" - , "description": "repeat single button" - , "category": "Symbols" - , "aliases": [ - "repeat_one" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "▶️" - , "description": "play button" - , "category": "Symbols" - , "aliases": [ - "arrow_forward" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⏩" - , "description": "fast-forward button" - , "category": "Symbols" - , "aliases": [ - "fast_forward" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⏭️" - , "description": "next track button" - , "category": "Symbols" - , "aliases": [ - "next_track_button" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.1" - } -, { - "emoji": "⏯️" - , "description": "play or pause button" - , "category": "Symbols" - , "aliases": [ - "play_or_pause_button" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.1" - } -, { - "emoji": "◀️" - , "description": "reverse button" - , "category": "Symbols" - , "aliases": [ - "arrow_backward" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⏪" - , "description": "fast reverse button" - , "category": "Symbols" - , "aliases": [ - "rewind" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⏮️" - , "description": "last track button" - , "category": "Symbols" - , "aliases": [ - "previous_track_button" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.1" - } -, { - "emoji": "🔼" - , "description": "upwards button" - , "category": "Symbols" - , "aliases": [ - "arrow_up_small" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⏫" - , "description": "fast up button" - , "category": "Symbols" - , "aliases": [ - "arrow_double_up" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔽" - , "description": "downwards button" - , "category": "Symbols" - , "aliases": [ - "arrow_down_small" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⏬" - , "description": "fast down button" - , "category": "Symbols" - , "aliases": [ - "arrow_double_down" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⏸️" - , "description": "pause button" - , "category": "Symbols" - , "aliases": [ - "pause_button" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⏹️" - , "description": "stop button" - , "category": "Symbols" - , "aliases": [ - "stop_button" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⏺️" - , "description": "record button" - , "category": "Symbols" - , "aliases": [ - "record_button" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "⏏️" - , "description": "eject button" - , "category": "Symbols" - , "aliases": [ - "eject_button" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🎦" - , "description": "cinema" - , "category": "Symbols" - , "aliases": [ - "cinema" - ] - , "tags": [ - "film" - , "movie" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔅" - , "description": "dim button" - , "category": "Symbols" - , "aliases": [ - "low_brightness" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔆" - , "description": "bright button" - , "category": "Symbols" - , "aliases": [ - "high_brightness" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📶" - , "description": "antenna bars" - , "category": "Symbols" - , "aliases": [ - "signal_strength" - ] - , "tags": [ - "wifi" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📳" - , "description": "vibration mode" - , "category": "Symbols" - , "aliases": [ - "vibration_mode" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📴" - , "description": "mobile phone off" - , "category": "Symbols" - , "aliases": [ - "mobile_phone_off" - ] - , "tags": [ - "mute" - , "off" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "♀️" - , "description": "female sign" - , "category": "Symbols" - , "aliases": [ - "female_sign" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "♂️" - , "description": "male sign" - , "category": "Symbols" - , "aliases": [ - "male_sign" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "⚧️" - , "description": "transgender symbol" - , "category": "Symbols" - , "aliases": [ - "transgender_symbol" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "✖️" - , "description": "multiply" - , "category": "Symbols" - , "aliases": [ - "heavy_multiplication_x" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "➕" - , "description": "plus" - , "category": "Symbols" - , "aliases": [ - "heavy_plus_sign" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "➖" - , "description": "minus" - , "category": "Symbols" - , "aliases": [ - "heavy_minus_sign" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "➗" - , "description": "divide" - , "category": "Symbols" - , "aliases": [ - "heavy_division_sign" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "♾️" - , "description": "infinity" - , "category": "Symbols" - , "aliases": [ - "infinity" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "‼️" - , "description": "double exclamation mark" - , "category": "Symbols" - , "aliases": [ - "bangbang" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "⁉️" - , "description": "exclamation question mark" - , "category": "Symbols" - , "aliases": [ - "interrobang" - ] - , "tags": [ - ] - , "unicode_version": "3.0" - , "ios_version": "6.0" - } -, { - "emoji": "❓" - , "description": "red question mark" - , "category": "Symbols" - , "aliases": [ - "question" - ] - , "tags": [ - "confused" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "❔" - , "description": "white question mark" - , "category": "Symbols" - , "aliases": [ - "grey_question" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "❕" - , "description": "white exclamation mark" - , "category": "Symbols" - , "aliases": [ - "grey_exclamation" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "❗" - , "description": "red exclamation mark" - , "category": "Symbols" - , "aliases": [ - "exclamation" - , "heavy_exclamation_mark" - ] - , "tags": [ - "bang" - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "〰️" - , "description": "wavy dash" - , "category": "Symbols" - , "aliases": [ - "wavy_dash" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "💱" - , "description": "currency exchange" - , "category": "Symbols" - , "aliases": [ - "currency_exchange" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💲" - , "description": "heavy dollar sign" - , "category": "Symbols" - , "aliases": [ - "heavy_dollar_sign" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⚕️" - , "description": "medical symbol" - , "category": "Symbols" - , "aliases": [ - "medical_symbol" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "♻️" - , "description": "recycling symbol" - , "category": "Symbols" - , "aliases": [ - "recycle" - ] - , "tags": [ - "environment" - , "green" - ] - , "unicode_version": "3.2" - , "ios_version": "6.0" - } -, { - "emoji": "⚜️" - , "description": "fleur-de-lis" - , "category": "Symbols" - , "aliases": [ - "fleur_de_lis" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "9.1" - } -, { - "emoji": "🔱" - , "description": "trident emblem" - , "category": "Symbols" - , "aliases": [ - "trident" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "📛" - , "description": "name badge" - , "category": "Symbols" - , "aliases": [ - "name_badge" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔰" - , "description": "Japanese symbol for beginner" - , "category": "Symbols" - , "aliases": [ - "beginner" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "⭕" - , "description": "hollow red circle" - , "category": "Symbols" - , "aliases": [ - "o" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "✅" - , "description": "check mark button" - , "category": "Symbols" - , "aliases": [ - "white_check_mark" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "☑️" - , "description": "check box with check" - , "category": "Symbols" - , "aliases": [ - "ballot_box_with_check" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "✔️" - , "description": "check mark" - , "category": "Symbols" - , "aliases": [ - "heavy_check_mark" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "❌" - , "description": "cross mark" - , "category": "Symbols" - , "aliases": [ - "x" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "❎" - , "description": "cross mark button" - , "category": "Symbols" - , "aliases": [ - "negative_squared_cross_mark" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "➰" - , "description": "curly loop" - , "category": "Symbols" - , "aliases": [ - "curly_loop" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "➿" - , "description": "double curly loop" - , "category": "Symbols" - , "aliases": [ - "loop" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "〽️" - , "description": "part alternation mark" - , "category": "Symbols" - , "aliases": [ - "part_alternation_mark" - ] - , "tags": [ - ] - , "unicode_version": "3.2" - , "ios_version": "6.0" - } -, { - "emoji": "✳️" - , "description": "eight-spoked asterisk" - , "category": "Symbols" - , "aliases": [ - "eight_spoked_asterisk" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "✴️" - , "description": "eight-pointed star" - , "category": "Symbols" - , "aliases": [ - "eight_pointed_black_star" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "❇️" - , "description": "sparkle" - , "category": "Symbols" - , "aliases": [ - "sparkle" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "©️" - , "description": "copyright" - , "category": "Symbols" - , "aliases": [ - "copyright" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "®️" - , "description": "registered" - , "category": "Symbols" - , "aliases": [ - "registered" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "™️" - , "description": "trade mark" - , "category": "Symbols" - , "aliases": [ - "tm" - ] - , "tags": [ - "trademark" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "#️⃣" - , "description": "keycap: #" - , "category": "Symbols" - , "aliases": [ - "hash" - ] - , "tags": [ - "number" - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "*️⃣" - , "description": "keycap: *" - , "category": "Symbols" - , "aliases": [ - "asterisk" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "9.1" - } -, { - "emoji": "0️⃣" - , "description": "keycap: 0" - , "category": "Symbols" - , "aliases": [ - "zero" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "1️⃣" - , "description": "keycap: 1" - , "category": "Symbols" - , "aliases": [ - "one" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "2️⃣" - , "description": "keycap: 2" - , "category": "Symbols" - , "aliases": [ - "two" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "3️⃣" - , "description": "keycap: 3" - , "category": "Symbols" - , "aliases": [ - "three" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "4️⃣" - , "description": "keycap: 4" - , "category": "Symbols" - , "aliases": [ - "four" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "5️⃣" - , "description": "keycap: 5" - , "category": "Symbols" - , "aliases": [ - "five" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "6️⃣" - , "description": "keycap: 6" - , "category": "Symbols" - , "aliases": [ - "six" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "7️⃣" - , "description": "keycap: 7" - , "category": "Symbols" - , "aliases": [ - "seven" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "8️⃣" - , "description": "keycap: 8" - , "category": "Symbols" - , "aliases": [ - "eight" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "9️⃣" - , "description": "keycap: 9" - , "category": "Symbols" - , "aliases": [ - "nine" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🔟" - , "description": "keycap: 10" - , "category": "Symbols" - , "aliases": [ - "keycap_ten" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔠" - , "description": "input latin uppercase" - , "category": "Symbols" - , "aliases": [ - "capital_abcd" - ] - , "tags": [ - "letters" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔡" - , "description": "input latin lowercase" - , "category": "Symbols" - , "aliases": [ - "abcd" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔢" - , "description": "input numbers" - , "category": "Symbols" - , "aliases": [ - "1234" - ] - , "tags": [ - "numbers" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔣" - , "description": "input symbols" - , "category": "Symbols" - , "aliases": [ - "symbols" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔤" - , "description": "input latin letters" - , "category": "Symbols" - , "aliases": [ - "abc" - ] - , "tags": [ - "alphabet" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🅰️" - , "description": "A button (blood type)" - , "category": "Symbols" - , "aliases": [ - "a" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆎" - , "description": "AB button (blood type)" - , "category": "Symbols" - , "aliases": [ - "ab" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🅱️" - , "description": "B button (blood type)" - , "category": "Symbols" - , "aliases": [ - "b" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆑" - , "description": "CL button" - , "category": "Symbols" - , "aliases": [ - "cl" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆒" - , "description": "COOL button" - , "category": "Symbols" - , "aliases": [ - "cool" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆓" - , "description": "FREE button" - , "category": "Symbols" - , "aliases": [ - "free" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "ℹ️" - , "description": "information" - , "category": "Symbols" - , "aliases": [ - "information_source" - ] - , "tags": [ - ] - , "unicode_version": "3.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆔" - , "description": "ID button" - , "category": "Symbols" - , "aliases": [ - "id" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "Ⓜ️" - , "description": "circled M" - , "category": "Symbols" - , "aliases": [ - "m" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🆕" - , "description": "NEW button" - , "category": "Symbols" - , "aliases": [ - "new" - ] - , "tags": [ - "fresh" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆖" - , "description": "NG button" - , "category": "Symbols" - , "aliases": [ - "ng" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🅾️" - , "description": "O button (blood type)" - , "category": "Symbols" - , "aliases": [ - "o2" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆗" - , "description": "OK button" - , "category": "Symbols" - , "aliases": [ - "ok" - ] - , "tags": [ - "yes" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🅿️" - , "description": "P button" - , "category": "Symbols" - , "aliases": [ - "parking" - ] - , "tags": [ - ] - , "unicode_version": "5.2" - , "ios_version": "6.0" - } -, { - "emoji": "🆘" - , "description": "SOS button" - , "category": "Symbols" - , "aliases": [ - "sos" - ] - , "tags": [ - "help" - , "emergency" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆙" - , "description": "UP! button" - , "category": "Symbols" - , "aliases": [ - "up" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🆚" - , "description": "VS button" - , "category": "Symbols" - , "aliases": [ - "vs" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈁" - , "description": "Japanese “here” button" - , "category": "Symbols" - , "aliases": [ - "koko" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈂️" - , "description": "Japanese “service charge” button" - , "category": "Symbols" - , "aliases": [ - "sa" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈷️" - , "description": "Japanese “monthly amount” button" - , "category": "Symbols" - , "aliases": [ - "u6708" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈶" - , "description": "Japanese “not free of charge” button" - , "category": "Symbols" - , "aliases": [ - "u6709" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈯" - , "description": "Japanese “reserved” button" - , "category": "Symbols" - , "aliases": [ - "u6307" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🉐" - , "description": "Japanese “bargain” button" - , "category": "Symbols" - , "aliases": [ - "ideograph_advantage" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈹" - , "description": "Japanese “discount” button" - , "category": "Symbols" - , "aliases": [ - "u5272" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈚" - , "description": "Japanese “free of charge” button" - , "category": "Symbols" - , "aliases": [ - "u7121" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🈲" - , "description": "Japanese “prohibited” button" - , "category": "Symbols" - , "aliases": [ - "u7981" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🉑" - , "description": "Japanese “acceptable” button" - , "category": "Symbols" - , "aliases": [ - "accept" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈸" - , "description": "Japanese “application” button" - , "category": "Symbols" - , "aliases": [ - "u7533" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈴" - , "description": "Japanese “passing grade” button" - , "category": "Symbols" - , "aliases": [ - "u5408" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈳" - , "description": "Japanese “vacancy” button" - , "category": "Symbols" - , "aliases": [ - "u7a7a" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "㊗️" - , "description": "Japanese “congratulations” button" - , "category": "Symbols" - , "aliases": [ - "congratulations" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "㊙️" - , "description": "Japanese “secret” button" - , "category": "Symbols" - , "aliases": [ - "secret" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🈺" - , "description": "Japanese “open for business” button" - , "category": "Symbols" - , "aliases": [ - "u55b6" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🈵" - , "description": "Japanese “no vacancy” button" - , "category": "Symbols" - , "aliases": [ - "u6e80" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔴" - , "description": "red circle" - , "category": "Symbols" - , "aliases": [ - "red_circle" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🟠" - , "description": "orange circle" - , "category": "Symbols" - , "aliases": [ - "orange_circle" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟡" - , "description": "yellow circle" - , "category": "Symbols" - , "aliases": [ - "yellow_circle" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟢" - , "description": "green circle" - , "category": "Symbols" - , "aliases": [ - "green_circle" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🔵" - , "description": "blue circle" - , "category": "Symbols" - , "aliases": [ - "large_blue_circle" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🟣" - , "description": "purple circle" - , "category": "Symbols" - , "aliases": [ - "purple_circle" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟤" - , "description": "brown circle" - , "category": "Symbols" - , "aliases": [ - "brown_circle" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "⚫" - , "description": "black circle" - , "category": "Symbols" - , "aliases": [ - "black_circle" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "6.0" - } -, { - "emoji": "⚪" - , "description": "white circle" - , "category": "Symbols" - , "aliases": [ - "white_circle" - ] - , "tags": [ - ] - , "unicode_version": "4.1" - , "ios_version": "6.0" - } -, { - "emoji": "🟥" - , "description": "red square" - , "category": "Symbols" - , "aliases": [ - "red_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟧" - , "description": "orange square" - , "category": "Symbols" - , "aliases": [ - "orange_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟨" - , "description": "yellow square" - , "category": "Symbols" - , "aliases": [ - "yellow_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟩" - , "description": "green square" - , "category": "Symbols" - , "aliases": [ - "green_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟦" - , "description": "blue square" - , "category": "Symbols" - , "aliases": [ - "blue_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟪" - , "description": "purple square" - , "category": "Symbols" - , "aliases": [ - "purple_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "🟫" - , "description": "brown square" - , "category": "Symbols" - , "aliases": [ - "brown_square" - ] - , "tags": [ - ] - , "unicode_version": "12.0" - , "ios_version": "13.0" - } -, { - "emoji": "⬛" - , "description": "black large square" - , "category": "Symbols" - , "aliases": [ - "black_large_square" - ] - , "tags": [ - ] - , "unicode_version": "5.1" - , "ios_version": "6.0" - } -, { - "emoji": "⬜" - , "description": "white large square" - , "category": "Symbols" - , "aliases": [ - "white_large_square" - ] - , "tags": [ - ] - , "unicode_version": "5.1" - , "ios_version": "6.0" - } -, { - "emoji": "◼️" - , "description": "black medium square" - , "category": "Symbols" - , "aliases": [ - "black_medium_square" - ] - , "tags": [ - ] - , "unicode_version": "3.2" - , "ios_version": "6.0" - } -, { - "emoji": "◻️" - , "description": "white medium square" - , "category": "Symbols" - , "aliases": [ - "white_medium_square" - ] - , "tags": [ - ] - , "unicode_version": "3.2" - , "ios_version": "6.0" - } -, { - "emoji": "◾" - , "description": "black medium-small square" - , "category": "Symbols" - , "aliases": [ - "black_medium_small_square" - ] - , "tags": [ - ] - , "unicode_version": "3.2" - , "ios_version": "6.0" - } -, { - "emoji": "◽" - , "description": "white medium-small square" - , "category": "Symbols" - , "aliases": [ - "white_medium_small_square" - ] - , "tags": [ - ] - , "unicode_version": "3.2" - , "ios_version": "6.0" - } -, { - "emoji": "▪️" - , "description": "black small square" - , "category": "Symbols" - , "aliases": [ - "black_small_square" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "▫️" - , "description": "white small square" - , "category": "Symbols" - , "aliases": [ - "white_small_square" - ] - , "tags": [ - ] - , "unicode_version": "" - , "ios_version": "6.0" - } -, { - "emoji": "🔶" - , "description": "large orange diamond" - , "category": "Symbols" - , "aliases": [ - "large_orange_diamond" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔷" - , "description": "large blue diamond" - , "category": "Symbols" - , "aliases": [ - "large_blue_diamond" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔸" - , "description": "small orange diamond" - , "category": "Symbols" - , "aliases": [ - "small_orange_diamond" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔹" - , "description": "small blue diamond" - , "category": "Symbols" - , "aliases": [ - "small_blue_diamond" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔺" - , "description": "red triangle pointed up" - , "category": "Symbols" - , "aliases": [ - "small_red_triangle" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔻" - , "description": "red triangle pointed down" - , "category": "Symbols" - , "aliases": [ - "small_red_triangle_down" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "💠" - , "description": "diamond with a dot" - , "category": "Symbols" - , "aliases": [ - "diamond_shape_with_a_dot_inside" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔘" - , "description": "radio button" - , "category": "Symbols" - , "aliases": [ - "radio_button" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔳" - , "description": "white square button" - , "category": "Symbols" - , "aliases": [ - "white_square_button" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🔲" - , "description": "black square button" - , "category": "Symbols" - , "aliases": [ - "black_square_button" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏁" - , "description": "chequered flag" - , "category": "Flags" - , "aliases": [ - "checkered_flag" - ] - , "tags": [ - "milestone" - , "finish" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🚩" - , "description": "triangular flag" - , "category": "Flags" - , "aliases": [ - "triangular_flag_on_post" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🎌" - , "description": "crossed flags" - , "category": "Flags" - , "aliases": [ - "crossed_flags" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🏴" - , "description": "black flag" - , "category": "Flags" - , "aliases": [ - "black_flag" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏳️" - , "description": "white flag" - , "category": "Flags" - , "aliases": [ - "white_flag" - ] - , "tags": [ - ] - , "unicode_version": "7.0" - , "ios_version": "9.1" - } -, { - "emoji": "🏳️‍🌈" - , "description": "rainbow flag" - , "category": "Flags" - , "aliases": [ - "rainbow_flag" - ] - , "tags": [ - "pride" - ] - , "unicode_version": "6.0" - , "ios_version": "10.0" - } -, { - "emoji": "🏳️‍⚧️" - , "description": "transgender flag" - , "category": "Flags" - , "aliases": [ - "transgender_flag" - ] - , "tags": [ - ] - , "unicode_version": "13.0" - , "ios_version": "14.0" - } -, { - "emoji": "🏴‍☠️" - , "description": "pirate flag" - , "category": "Flags" - , "aliases": [ - "pirate_flag" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇦🇨" - , "description": "flag: Ascension Island" - , "category": "Flags" - , "aliases": [ - "ascension_island" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇦🇩" - , "description": "flag: Andorra" - , "category": "Flags" - , "aliases": [ - "andorra" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇪" - , "description": "flag: United Arab Emirates" - , "category": "Flags" - , "aliases": [ - "united_arab_emirates" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇫" - , "description": "flag: Afghanistan" - , "category": "Flags" - , "aliases": [ - "afghanistan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇬" - , "description": "flag: Antigua & Barbuda" - , "category": "Flags" - , "aliases": [ - "antigua_barbuda" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇮" - , "description": "flag: Anguilla" - , "category": "Flags" - , "aliases": [ - "anguilla" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇱" - , "description": "flag: Albania" - , "category": "Flags" - , "aliases": [ - "albania" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇲" - , "description": "flag: Armenia" - , "category": "Flags" - , "aliases": [ - "armenia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇴" - , "description": "flag: Angola" - , "category": "Flags" - , "aliases": [ - "angola" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇶" - , "description": "flag: Antarctica" - , "category": "Flags" - , "aliases": [ - "antarctica" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇦🇷" - , "description": "flag: Argentina" - , "category": "Flags" - , "aliases": [ - "argentina" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇸" - , "description": "flag: American Samoa" - , "category": "Flags" - , "aliases": [ - "american_samoa" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇹" - , "description": "flag: Austria" - , "category": "Flags" - , "aliases": [ - "austria" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇺" - , "description": "flag: Australia" - , "category": "Flags" - , "aliases": [ - "australia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇼" - , "description": "flag: Aruba" - , "category": "Flags" - , "aliases": [ - "aruba" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇦🇽" - , "description": "flag: Åland Islands" - , "category": "Flags" - , "aliases": [ - "aland_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇦🇿" - , "description": "flag: Azerbaijan" - , "category": "Flags" - , "aliases": [ - "azerbaijan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇦" - , "description": "flag: Bosnia & Herzegovina" - , "category": "Flags" - , "aliases": [ - "bosnia_herzegovina" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇧" - , "description": "flag: Barbados" - , "category": "Flags" - , "aliases": [ - "barbados" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇩" - , "description": "flag: Bangladesh" - , "category": "Flags" - , "aliases": [ - "bangladesh" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇪" - , "description": "flag: Belgium" - , "category": "Flags" - , "aliases": [ - "belgium" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇫" - , "description": "flag: Burkina Faso" - , "category": "Flags" - , "aliases": [ - "burkina_faso" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇬" - , "description": "flag: Bulgaria" - , "category": "Flags" - , "aliases": [ - "bulgaria" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇭" - , "description": "flag: Bahrain" - , "category": "Flags" - , "aliases": [ - "bahrain" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇮" - , "description": "flag: Burundi" - , "category": "Flags" - , "aliases": [ - "burundi" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇯" - , "description": "flag: Benin" - , "category": "Flags" - , "aliases": [ - "benin" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇱" - , "description": "flag: St. Barthélemy" - , "category": "Flags" - , "aliases": [ - "st_barthelemy" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇧🇲" - , "description": "flag: Bermuda" - , "category": "Flags" - , "aliases": [ - "bermuda" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇳" - , "description": "flag: Brunei" - , "category": "Flags" - , "aliases": [ - "brunei" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇴" - , "description": "flag: Bolivia" - , "category": "Flags" - , "aliases": [ - "bolivia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇶" - , "description": "flag: Caribbean Netherlands" - , "category": "Flags" - , "aliases": [ - "caribbean_netherlands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇧🇷" - , "description": "flag: Brazil" - , "category": "Flags" - , "aliases": [ - "brazil" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇸" - , "description": "flag: Bahamas" - , "category": "Flags" - , "aliases": [ - "bahamas" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇹" - , "description": "flag: Bhutan" - , "category": "Flags" - , "aliases": [ - "bhutan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇻" - , "description": "flag: Bouvet Island" - , "category": "Flags" - , "aliases": [ - "bouvet_island" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇧🇼" - , "description": "flag: Botswana" - , "category": "Flags" - , "aliases": [ - "botswana" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇾" - , "description": "flag: Belarus" - , "category": "Flags" - , "aliases": [ - "belarus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇧🇿" - , "description": "flag: Belize" - , "category": "Flags" - , "aliases": [ - "belize" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇦" - , "description": "flag: Canada" - , "category": "Flags" - , "aliases": [ - "canada" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇨" - , "description": "flag: Cocos (Keeling) Islands" - , "category": "Flags" - , "aliases": [ - "cocos_islands" - ] - , "tags": [ - "keeling" - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇨🇩" - , "description": "flag: Congo - Kinshasa" - , "category": "Flags" - , "aliases": [ - "congo_kinshasa" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇫" - , "description": "flag: Central African Republic" - , "category": "Flags" - , "aliases": [ - "central_african_republic" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇬" - , "description": "flag: Congo - Brazzaville" - , "category": "Flags" - , "aliases": [ - "congo_brazzaville" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇭" - , "description": "flag: Switzerland" - , "category": "Flags" - , "aliases": [ - "switzerland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇮" - , "description": "flag: Côte d’Ivoire" - , "category": "Flags" - , "aliases": [ - "cote_divoire" - ] - , "tags": [ - "ivory" - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇰" - , "description": "flag: Cook Islands" - , "category": "Flags" - , "aliases": [ - "cook_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇱" - , "description": "flag: Chile" - , "category": "Flags" - , "aliases": [ - "chile" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇲" - , "description": "flag: Cameroon" - , "category": "Flags" - , "aliases": [ - "cameroon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇳" - , "description": "flag: China" - , "category": "Flags" - , "aliases": [ - "cn" - ] - , "tags": [ - "china" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇨🇴" - , "description": "flag: Colombia" - , "category": "Flags" - , "aliases": [ - "colombia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇵" - , "description": "flag: Clipperton Island" - , "category": "Flags" - , "aliases": [ - "clipperton_island" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇨🇷" - , "description": "flag: Costa Rica" - , "category": "Flags" - , "aliases": [ - "costa_rica" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇺" - , "description": "flag: Cuba" - , "category": "Flags" - , "aliases": [ - "cuba" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇻" - , "description": "flag: Cape Verde" - , "category": "Flags" - , "aliases": [ - "cape_verde" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇼" - , "description": "flag: Curaçao" - , "category": "Flags" - , "aliases": [ - "curacao" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇽" - , "description": "flag: Christmas Island" - , "category": "Flags" - , "aliases": [ - "christmas_island" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇨🇾" - , "description": "flag: Cyprus" - , "category": "Flags" - , "aliases": [ - "cyprus" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇨🇿" - , "description": "flag: Czechia" - , "category": "Flags" - , "aliases": [ - "czech_republic" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇩🇪" - , "description": "flag: Germany" - , "category": "Flags" - , "aliases": [ - "de" - ] - , "tags": [ - "flag" - , "germany" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇩🇬" - , "description": "flag: Diego Garcia" - , "category": "Flags" - , "aliases": [ - "diego_garcia" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇩🇯" - , "description": "flag: Djibouti" - , "category": "Flags" - , "aliases": [ - "djibouti" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇩🇰" - , "description": "flag: Denmark" - , "category": "Flags" - , "aliases": [ - "denmark" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇩🇲" - , "description": "flag: Dominica" - , "category": "Flags" - , "aliases": [ - "dominica" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇩🇴" - , "description": "flag: Dominican Republic" - , "category": "Flags" - , "aliases": [ - "dominican_republic" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇩🇿" - , "description": "flag: Algeria" - , "category": "Flags" - , "aliases": [ - "algeria" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇪🇦" - , "description": "flag: Ceuta & Melilla" - , "category": "Flags" - , "aliases": [ - "ceuta_melilla" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇪🇨" - , "description": "flag: Ecuador" - , "category": "Flags" - , "aliases": [ - "ecuador" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇪🇪" - , "description": "flag: Estonia" - , "category": "Flags" - , "aliases": [ - "estonia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇪🇬" - , "description": "flag: Egypt" - , "category": "Flags" - , "aliases": [ - "egypt" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇪🇭" - , "description": "flag: Western Sahara" - , "category": "Flags" - , "aliases": [ - "western_sahara" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇪🇷" - , "description": "flag: Eritrea" - , "category": "Flags" - , "aliases": [ - "eritrea" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇪🇸" - , "description": "flag: Spain" - , "category": "Flags" - , "aliases": [ - "es" - ] - , "tags": [ - "spain" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇪🇹" - , "description": "flag: Ethiopia" - , "category": "Flags" - , "aliases": [ - "ethiopia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇪🇺" - , "description": "flag: European Union" - , "category": "Flags" - , "aliases": [ - "eu" - , "european_union" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇫🇮" - , "description": "flag: Finland" - , "category": "Flags" - , "aliases": [ - "finland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇫🇯" - , "description": "flag: Fiji" - , "category": "Flags" - , "aliases": [ - "fiji" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇫🇰" - , "description": "flag: Falkland Islands" - , "category": "Flags" - , "aliases": [ - "falkland_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇫🇲" - , "description": "flag: Micronesia" - , "category": "Flags" - , "aliases": [ - "micronesia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇫🇴" - , "description": "flag: Faroe Islands" - , "category": "Flags" - , "aliases": [ - "faroe_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇫🇷" - , "description": "flag: France" - , "category": "Flags" - , "aliases": [ - "fr" - ] - , "tags": [ - "france" - , "french" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇬🇦" - , "description": "flag: Gabon" - , "category": "Flags" - , "aliases": [ - "gabon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇧" - , "description": "flag: United Kingdom" - , "category": "Flags" - , "aliases": [ - "gb" - , "uk" - ] - , "tags": [ - "flag" - , "british" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇬🇩" - , "description": "flag: Grenada" - , "category": "Flags" - , "aliases": [ - "grenada" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇪" - , "description": "flag: Georgia" - , "category": "Flags" - , "aliases": [ - "georgia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇫" - , "description": "flag: French Guiana" - , "category": "Flags" - , "aliases": [ - "french_guiana" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇬" - , "description": "flag: Guernsey" - , "category": "Flags" - , "aliases": [ - "guernsey" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇬🇭" - , "description": "flag: Ghana" - , "category": "Flags" - , "aliases": [ - "ghana" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇮" - , "description": "flag: Gibraltar" - , "category": "Flags" - , "aliases": [ - "gibraltar" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇱" - , "description": "flag: Greenland" - , "category": "Flags" - , "aliases": [ - "greenland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇬🇲" - , "description": "flag: Gambia" - , "category": "Flags" - , "aliases": [ - "gambia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇳" - , "description": "flag: Guinea" - , "category": "Flags" - , "aliases": [ - "guinea" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇵" - , "description": "flag: Guadeloupe" - , "category": "Flags" - , "aliases": [ - "guadeloupe" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇬🇶" - , "description": "flag: Equatorial Guinea" - , "category": "Flags" - , "aliases": [ - "equatorial_guinea" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇷" - , "description": "flag: Greece" - , "category": "Flags" - , "aliases": [ - "greece" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇸" - , "description": "flag: South Georgia & South Sandwich Islands" - , "category": "Flags" - , "aliases": [ - "south_georgia_south_sandwich_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇬🇹" - , "description": "flag: Guatemala" - , "category": "Flags" - , "aliases": [ - "guatemala" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇺" - , "description": "flag: Guam" - , "category": "Flags" - , "aliases": [ - "guam" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇼" - , "description": "flag: Guinea-Bissau" - , "category": "Flags" - , "aliases": [ - "guinea_bissau" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇬🇾" - , "description": "flag: Guyana" - , "category": "Flags" - , "aliases": [ - "guyana" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇭🇰" - , "description": "flag: Hong Kong SAR China" - , "category": "Flags" - , "aliases": [ - "hong_kong" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇭🇲" - , "description": "flag: Heard & McDonald Islands" - , "category": "Flags" - , "aliases": [ - "heard_mcdonald_islands" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇭🇳" - , "description": "flag: Honduras" - , "category": "Flags" - , "aliases": [ - "honduras" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇭🇷" - , "description": "flag: Croatia" - , "category": "Flags" - , "aliases": [ - "croatia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇭🇹" - , "description": "flag: Haiti" - , "category": "Flags" - , "aliases": [ - "haiti" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇭🇺" - , "description": "flag: Hungary" - , "category": "Flags" - , "aliases": [ - "hungary" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇨" - , "description": "flag: Canary Islands" - , "category": "Flags" - , "aliases": [ - "canary_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇮🇩" - , "description": "flag: Indonesia" - , "category": "Flags" - , "aliases": [ - "indonesia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇪" - , "description": "flag: Ireland" - , "category": "Flags" - , "aliases": [ - "ireland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇱" - , "description": "flag: Israel" - , "category": "Flags" - , "aliases": [ - "israel" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇲" - , "description": "flag: Isle of Man" - , "category": "Flags" - , "aliases": [ - "isle_of_man" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇮🇳" - , "description": "flag: India" - , "category": "Flags" - , "aliases": [ - "india" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇴" - , "description": "flag: British Indian Ocean Territory" - , "category": "Flags" - , "aliases": [ - "british_indian_ocean_territory" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇮🇶" - , "description": "flag: Iraq" - , "category": "Flags" - , "aliases": [ - "iraq" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇷" - , "description": "flag: Iran" - , "category": "Flags" - , "aliases": [ - "iran" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇸" - , "description": "flag: Iceland" - , "category": "Flags" - , "aliases": [ - "iceland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇮🇹" - , "description": "flag: Italy" - , "category": "Flags" - , "aliases": [ - "it" - ] - , "tags": [ - "italy" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇯🇪" - , "description": "flag: Jersey" - , "category": "Flags" - , "aliases": [ - "jersey" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇯🇲" - , "description": "flag: Jamaica" - , "category": "Flags" - , "aliases": [ - "jamaica" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇯🇴" - , "description": "flag: Jordan" - , "category": "Flags" - , "aliases": [ - "jordan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇯🇵" - , "description": "flag: Japan" - , "category": "Flags" - , "aliases": [ - "jp" - ] - , "tags": [ - "japan" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇰🇪" - , "description": "flag: Kenya" - , "category": "Flags" - , "aliases": [ - "kenya" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇬" - , "description": "flag: Kyrgyzstan" - , "category": "Flags" - , "aliases": [ - "kyrgyzstan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇭" - , "description": "flag: Cambodia" - , "category": "Flags" - , "aliases": [ - "cambodia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇮" - , "description": "flag: Kiribati" - , "category": "Flags" - , "aliases": [ - "kiribati" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇲" - , "description": "flag: Comoros" - , "category": "Flags" - , "aliases": [ - "comoros" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇳" - , "description": "flag: St. Kitts & Nevis" - , "category": "Flags" - , "aliases": [ - "st_kitts_nevis" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇵" - , "description": "flag: North Korea" - , "category": "Flags" - , "aliases": [ - "north_korea" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇷" - , "description": "flag: South Korea" - , "category": "Flags" - , "aliases": [ - "kr" - ] - , "tags": [ - "korea" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇰🇼" - , "description": "flag: Kuwait" - , "category": "Flags" - , "aliases": [ - "kuwait" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇾" - , "description": "flag: Cayman Islands" - , "category": "Flags" - , "aliases": [ - "cayman_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇰🇿" - , "description": "flag: Kazakhstan" - , "category": "Flags" - , "aliases": [ - "kazakhstan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇦" - , "description": "flag: Laos" - , "category": "Flags" - , "aliases": [ - "laos" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇧" - , "description": "flag: Lebanon" - , "category": "Flags" - , "aliases": [ - "lebanon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇨" - , "description": "flag: St. Lucia" - , "category": "Flags" - , "aliases": [ - "st_lucia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇮" - , "description": "flag: Liechtenstein" - , "category": "Flags" - , "aliases": [ - "liechtenstein" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇰" - , "description": "flag: Sri Lanka" - , "category": "Flags" - , "aliases": [ - "sri_lanka" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇷" - , "description": "flag: Liberia" - , "category": "Flags" - , "aliases": [ - "liberia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇸" - , "description": "flag: Lesotho" - , "category": "Flags" - , "aliases": [ - "lesotho" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇹" - , "description": "flag: Lithuania" - , "category": "Flags" - , "aliases": [ - "lithuania" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇺" - , "description": "flag: Luxembourg" - , "category": "Flags" - , "aliases": [ - "luxembourg" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇻" - , "description": "flag: Latvia" - , "category": "Flags" - , "aliases": [ - "latvia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇱🇾" - , "description": "flag: Libya" - , "category": "Flags" - , "aliases": [ - "libya" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇦" - , "description": "flag: Morocco" - , "category": "Flags" - , "aliases": [ - "morocco" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇨" - , "description": "flag: Monaco" - , "category": "Flags" - , "aliases": [ - "monaco" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇲🇩" - , "description": "flag: Moldova" - , "category": "Flags" - , "aliases": [ - "moldova" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇪" - , "description": "flag: Montenegro" - , "category": "Flags" - , "aliases": [ - "montenegro" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇫" - , "description": "flag: St. Martin" - , "category": "Flags" - , "aliases": [ - "st_martin" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇲🇬" - , "description": "flag: Madagascar" - , "category": "Flags" - , "aliases": [ - "madagascar" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇭" - , "description": "flag: Marshall Islands" - , "category": "Flags" - , "aliases": [ - "marshall_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇲🇰" - , "description": "flag: North Macedonia" - , "category": "Flags" - , "aliases": [ - "macedonia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇱" - , "description": "flag: Mali" - , "category": "Flags" - , "aliases": [ - "mali" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇲" - , "description": "flag: Myanmar (Burma)" - , "category": "Flags" - , "aliases": [ - "myanmar" - ] - , "tags": [ - "burma" - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇳" - , "description": "flag: Mongolia" - , "category": "Flags" - , "aliases": [ - "mongolia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇴" - , "description": "flag: Macao SAR China" - , "category": "Flags" - , "aliases": [ - "macau" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇵" - , "description": "flag: Northern Mariana Islands" - , "category": "Flags" - , "aliases": [ - "northern_mariana_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇶" - , "description": "flag: Martinique" - , "category": "Flags" - , "aliases": [ - "martinique" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇲🇷" - , "description": "flag: Mauritania" - , "category": "Flags" - , "aliases": [ - "mauritania" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇸" - , "description": "flag: Montserrat" - , "category": "Flags" - , "aliases": [ - "montserrat" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇹" - , "description": "flag: Malta" - , "category": "Flags" - , "aliases": [ - "malta" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇺" - , "description": "flag: Mauritius" - , "category": "Flags" - , "aliases": [ - "mauritius" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇲🇻" - , "description": "flag: Maldives" - , "category": "Flags" - , "aliases": [ - "maldives" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇼" - , "description": "flag: Malawi" - , "category": "Flags" - , "aliases": [ - "malawi" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇽" - , "description": "flag: Mexico" - , "category": "Flags" - , "aliases": [ - "mexico" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇾" - , "description": "flag: Malaysia" - , "category": "Flags" - , "aliases": [ - "malaysia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇲🇿" - , "description": "flag: Mozambique" - , "category": "Flags" - , "aliases": [ - "mozambique" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇦" - , "description": "flag: Namibia" - , "category": "Flags" - , "aliases": [ - "namibia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇨" - , "description": "flag: New Caledonia" - , "category": "Flags" - , "aliases": [ - "new_caledonia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇪" - , "description": "flag: Niger" - , "category": "Flags" - , "aliases": [ - "niger" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇫" - , "description": "flag: Norfolk Island" - , "category": "Flags" - , "aliases": [ - "norfolk_island" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇳🇬" - , "description": "flag: Nigeria" - , "category": "Flags" - , "aliases": [ - "nigeria" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇮" - , "description": "flag: Nicaragua" - , "category": "Flags" - , "aliases": [ - "nicaragua" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇱" - , "description": "flag: Netherlands" - , "category": "Flags" - , "aliases": [ - "netherlands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇴" - , "description": "flag: Norway" - , "category": "Flags" - , "aliases": [ - "norway" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇵" - , "description": "flag: Nepal" - , "category": "Flags" - , "aliases": [ - "nepal" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇷" - , "description": "flag: Nauru" - , "category": "Flags" - , "aliases": [ - "nauru" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇳🇺" - , "description": "flag: Niue" - , "category": "Flags" - , "aliases": [ - "niue" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇳🇿" - , "description": "flag: New Zealand" - , "category": "Flags" - , "aliases": [ - "new_zealand" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇴🇲" - , "description": "flag: Oman" - , "category": "Flags" - , "aliases": [ - "oman" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇦" - , "description": "flag: Panama" - , "category": "Flags" - , "aliases": [ - "panama" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇪" - , "description": "flag: Peru" - , "category": "Flags" - , "aliases": [ - "peru" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇫" - , "description": "flag: French Polynesia" - , "category": "Flags" - , "aliases": [ - "french_polynesia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇵🇬" - , "description": "flag: Papua New Guinea" - , "category": "Flags" - , "aliases": [ - "papua_new_guinea" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇭" - , "description": "flag: Philippines" - , "category": "Flags" - , "aliases": [ - "philippines" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇰" - , "description": "flag: Pakistan" - , "category": "Flags" - , "aliases": [ - "pakistan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇱" - , "description": "flag: Poland" - , "category": "Flags" - , "aliases": [ - "poland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇲" - , "description": "flag: St. Pierre & Miquelon" - , "category": "Flags" - , "aliases": [ - "st_pierre_miquelon" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇵🇳" - , "description": "flag: Pitcairn Islands" - , "category": "Flags" - , "aliases": [ - "pitcairn_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇵🇷" - , "description": "flag: Puerto Rico" - , "category": "Flags" - , "aliases": [ - "puerto_rico" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇸" - , "description": "flag: Palestinian Territories" - , "category": "Flags" - , "aliases": [ - "palestinian_territories" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇹" - , "description": "flag: Portugal" - , "category": "Flags" - , "aliases": [ - "portugal" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇼" - , "description": "flag: Palau" - , "category": "Flags" - , "aliases": [ - "palau" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇵🇾" - , "description": "flag: Paraguay" - , "category": "Flags" - , "aliases": [ - "paraguay" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇶🇦" - , "description": "flag: Qatar" - , "category": "Flags" - , "aliases": [ - "qatar" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇷🇪" - , "description": "flag: Réunion" - , "category": "Flags" - , "aliases": [ - "reunion" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇷🇴" - , "description": "flag: Romania" - , "category": "Flags" - , "aliases": [ - "romania" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇷🇸" - , "description": "flag: Serbia" - , "category": "Flags" - , "aliases": [ - "serbia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇷🇺" - , "description": "flag: Russia" - , "category": "Flags" - , "aliases": [ - "ru" - ] - , "tags": [ - "russia" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇷🇼" - , "description": "flag: Rwanda" - , "category": "Flags" - , "aliases": [ - "rwanda" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇦" - , "description": "flag: Saudi Arabia" - , "category": "Flags" - , "aliases": [ - "saudi_arabia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇧" - , "description": "flag: Solomon Islands" - , "category": "Flags" - , "aliases": [ - "solomon_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇨" - , "description": "flag: Seychelles" - , "category": "Flags" - , "aliases": [ - "seychelles" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇩" - , "description": "flag: Sudan" - , "category": "Flags" - , "aliases": [ - "sudan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇪" - , "description": "flag: Sweden" - , "category": "Flags" - , "aliases": [ - "sweden" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇬" - , "description": "flag: Singapore" - , "category": "Flags" - , "aliases": [ - "singapore" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇭" - , "description": "flag: St. Helena" - , "category": "Flags" - , "aliases": [ - "st_helena" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇸🇮" - , "description": "flag: Slovenia" - , "category": "Flags" - , "aliases": [ - "slovenia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇯" - , "description": "flag: Svalbard & Jan Mayen" - , "category": "Flags" - , "aliases": [ - "svalbard_jan_mayen" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇸🇰" - , "description": "flag: Slovakia" - , "category": "Flags" - , "aliases": [ - "slovakia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇱" - , "description": "flag: Sierra Leone" - , "category": "Flags" - , "aliases": [ - "sierra_leone" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇲" - , "description": "flag: San Marino" - , "category": "Flags" - , "aliases": [ - "san_marino" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇳" - , "description": "flag: Senegal" - , "category": "Flags" - , "aliases": [ - "senegal" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇴" - , "description": "flag: Somalia" - , "category": "Flags" - , "aliases": [ - "somalia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇷" - , "description": "flag: Suriname" - , "category": "Flags" - , "aliases": [ - "suriname" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇸" - , "description": "flag: South Sudan" - , "category": "Flags" - , "aliases": [ - "south_sudan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇹" - , "description": "flag: São Tomé & Príncipe" - , "category": "Flags" - , "aliases": [ - "sao_tome_principe" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇻" - , "description": "flag: El Salvador" - , "category": "Flags" - , "aliases": [ - "el_salvador" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇽" - , "description": "flag: Sint Maarten" - , "category": "Flags" - , "aliases": [ - "sint_maarten" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇾" - , "description": "flag: Syria" - , "category": "Flags" - , "aliases": [ - "syria" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇸🇿" - , "description": "flag: Eswatini" - , "category": "Flags" - , "aliases": [ - "swaziland" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇦" - , "description": "flag: Tristan da Cunha" - , "category": "Flags" - , "aliases": [ - "tristan_da_cunha" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇹🇨" - , "description": "flag: Turks & Caicos Islands" - , "category": "Flags" - , "aliases": [ - "turks_caicos_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇩" - , "description": "flag: Chad" - , "category": "Flags" - , "aliases": [ - "chad" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇹🇫" - , "description": "flag: French Southern Territories" - , "category": "Flags" - , "aliases": [ - "french_southern_territories" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇬" - , "description": "flag: Togo" - , "category": "Flags" - , "aliases": [ - "togo" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇭" - , "description": "flag: Thailand" - , "category": "Flags" - , "aliases": [ - "thailand" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇯" - , "description": "flag: Tajikistan" - , "category": "Flags" - , "aliases": [ - "tajikistan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇰" - , "description": "flag: Tokelau" - , "category": "Flags" - , "aliases": [ - "tokelau" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇹🇱" - , "description": "flag: Timor-Leste" - , "category": "Flags" - , "aliases": [ - "timor_leste" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇲" - , "description": "flag: Turkmenistan" - , "category": "Flags" - , "aliases": [ - "turkmenistan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇳" - , "description": "flag: Tunisia" - , "category": "Flags" - , "aliases": [ - "tunisia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇴" - , "description": "flag: Tonga" - , "category": "Flags" - , "aliases": [ - "tonga" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇷" - , "description": "flag: Turkey" - , "category": "Flags" - , "aliases": [ - "tr" - ] - , "tags": [ - "turkey" - ] - , "unicode_version": "8.0" - , "ios_version": "9.1" - } -, { - "emoji": "🇹🇹" - , "description": "flag: Trinidad & Tobago" - , "category": "Flags" - , "aliases": [ - "trinidad_tobago" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇻" - , "description": "flag: Tuvalu" - , "category": "Flags" - , "aliases": [ - "tuvalu" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇹🇼" - , "description": "flag: Taiwan" - , "category": "Flags" - , "aliases": [ - "taiwan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇹🇿" - , "description": "flag: Tanzania" - , "category": "Flags" - , "aliases": [ - "tanzania" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇺🇦" - , "description": "flag: Ukraine" - , "category": "Flags" - , "aliases": [ - "ukraine" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇺🇬" - , "description": "flag: Uganda" - , "category": "Flags" - , "aliases": [ - "uganda" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇺🇲" - , "description": "flag: U.S. Outlying Islands" - , "category": "Flags" - , "aliases": [ - "us_outlying_islands" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇺🇳" - , "description": "flag: United Nations" - , "category": "Flags" - , "aliases": [ - "united_nations" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🇺🇸" - , "description": "flag: United States" - , "category": "Flags" - , "aliases": [ - "us" - ] - , "tags": [ - "flag" - , "united" - , "america" - ] - , "unicode_version": "6.0" - , "ios_version": "6.0" - } -, { - "emoji": "🇺🇾" - , "description": "flag: Uruguay" - , "category": "Flags" - , "aliases": [ - "uruguay" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇺🇿" - , "description": "flag: Uzbekistan" - , "category": "Flags" - , "aliases": [ - "uzbekistan" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇻🇦" - , "description": "flag: Vatican City" - , "category": "Flags" - , "aliases": [ - "vatican_city" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇻🇨" - , "description": "flag: St. Vincent & Grenadines" - , "category": "Flags" - , "aliases": [ - "st_vincent_grenadines" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇻🇪" - , "description": "flag: Venezuela" - , "category": "Flags" - , "aliases": [ - "venezuela" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇻🇬" - , "description": "flag: British Virgin Islands" - , "category": "Flags" - , "aliases": [ - "british_virgin_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇻🇮" - , "description": "flag: U.S. Virgin Islands" - , "category": "Flags" - , "aliases": [ - "us_virgin_islands" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇻🇳" - , "description": "flag: Vietnam" - , "category": "Flags" - , "aliases": [ - "vietnam" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇻🇺" - , "description": "flag: Vanuatu" - , "category": "Flags" - , "aliases": [ - "vanuatu" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇼🇫" - , "description": "flag: Wallis & Futuna" - , "category": "Flags" - , "aliases": [ - "wallis_futuna" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇼🇸" - , "description": "flag: Samoa" - , "category": "Flags" - , "aliases": [ - "samoa" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇽🇰" - , "description": "flag: Kosovo" - , "category": "Flags" - , "aliases": [ - "kosovo" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇾🇪" - , "description": "flag: Yemen" - , "category": "Flags" - , "aliases": [ - "yemen" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇾🇹" - , "description": "flag: Mayotte" - , "category": "Flags" - , "aliases": [ - "mayotte" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "9.0" - } -, { - "emoji": "🇿🇦" - , "description": "flag: South Africa" - , "category": "Flags" - , "aliases": [ - "south_africa" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇿🇲" - , "description": "flag: Zambia" - , "category": "Flags" - , "aliases": [ - "zambia" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🇿🇼" - , "description": "flag: Zimbabwe" - , "category": "Flags" - , "aliases": [ - "zimbabwe" - ] - , "tags": [ - ] - , "unicode_version": "6.0" - , "ios_version": "8.3" - } -, { - "emoji": "🏴󠁧󠁢󠁥󠁮󠁧󠁿" - , "description": "flag: England" - , "category": "Flags" - , "aliases": [ - "england" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🏴󠁧󠁢󠁳󠁣󠁴󠁿" - , "description": "flag: Scotland" - , "category": "Flags" - , "aliases": [ - "scotland" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" - } -, { - "emoji": "🏴󠁧󠁢󠁷󠁬󠁳󠁿" - , "description": "flag: Wales" - , "category": "Flags" - , "aliases": [ - "wales" - ] - , "tags": [ - ] - , "unicode_version": "11.0" - , "ios_version": "12.1" + "emoji": "😀", + "description": "grinning face", + "category": "Smileys & Emotion", + "aliases": ["grinning"], + "tags": ["smile", "happy"], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😃", + "description": "grinning face with big eyes", + "category": "Smileys & Emotion", + "aliases": ["smiley"], + "tags": ["happy", "joy", "haha"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😄", + "description": "grinning face with smiling eyes", + "category": "Smileys & Emotion", + "aliases": ["smile"], + "tags": ["happy", "joy", "laugh", "pleased"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😁", + "description": "beaming face with smiling eyes", + "category": "Smileys & Emotion", + "aliases": ["grin"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😆", + "description": "grinning squinting face", + "category": "Smileys & Emotion", + "aliases": ["laughing", "satisfied"], + "tags": ["happy", "haha"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😅", + "description": "grinning face with sweat", + "category": "Smileys & Emotion", + "aliases": ["sweat_smile"], + "tags": ["hot"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤣", + "description": "rolling on the floor laughing", + "category": "Smileys & Emotion", + "aliases": ["rofl"], + "tags": ["lol", "laughing"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "😂", + "description": "face with tears of joy", + "category": "Smileys & Emotion", + "aliases": ["joy"], + "tags": ["tears"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🙂", + "description": "slightly smiling face", + "category": "Smileys & Emotion", + "aliases": ["slightly_smiling_face"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🙃", + "description": "upside-down face", + "category": "Smileys & Emotion", + "aliases": ["upside_down_face"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "😉", + "description": "winking face", + "category": "Smileys & Emotion", + "aliases": ["wink"], + "tags": ["flirt"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😊", + "description": "smiling face with smiling eyes", + "category": "Smileys & Emotion", + "aliases": ["blush"], + "tags": ["proud"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😇", + "description": "smiling face with halo", + "category": "Smileys & Emotion", + "aliases": ["innocent"], + "tags": ["angel"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥰", + "description": "smiling face with hearts", + "category": "Smileys & Emotion", + "aliases": ["smiling_face_with_three_hearts"], + "tags": ["love"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😍", + "description": "smiling face with heart-eyes", + "category": "Smileys & Emotion", + "aliases": ["heart_eyes"], + "tags": ["love", "crush"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤩", + "description": "star-struck", + "category": "Smileys & Emotion", + "aliases": ["star_struck"], + "tags": ["eyes"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😘", + "description": "face blowing a kiss", + "category": "Smileys & Emotion", + "aliases": ["kissing_heart"], + "tags": ["flirt"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😗", + "description": "kissing face", + "category": "Smileys & Emotion", + "aliases": ["kissing"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "☺️", + "description": "smiling face", + "category": "Smileys & Emotion", + "aliases": ["relaxed"], + "tags": ["blush", "pleased"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "😚", + "description": "kissing face with closed eyes", + "category": "Smileys & Emotion", + "aliases": ["kissing_closed_eyes"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😙", + "description": "kissing face with smiling eyes", + "category": "Smileys & Emotion", + "aliases": ["kissing_smiling_eyes"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "🥲", + "description": "smiling face with tear", + "category": "Smileys & Emotion", + "aliases": ["smiling_face_with_tear"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "😋", + "description": "face savoring food", + "category": "Smileys & Emotion", + "aliases": ["yum"], + "tags": ["tongue", "lick"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😛", + "description": "face with tongue", + "category": "Smileys & Emotion", + "aliases": ["stuck_out_tongue"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😜", + "description": "winking face with tongue", + "category": "Smileys & Emotion", + "aliases": ["stuck_out_tongue_winking_eye"], + "tags": ["prank", "silly"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤪", + "description": "zany face", + "category": "Smileys & Emotion", + "aliases": ["zany_face"], + "tags": ["goofy", "wacky"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😝", + "description": "squinting face with tongue", + "category": "Smileys & Emotion", + "aliases": ["stuck_out_tongue_closed_eyes"], + "tags": ["prank"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤑", + "description": "money-mouth face", + "category": "Smileys & Emotion", + "aliases": ["money_mouth_face"], + "tags": ["rich"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🤗", + "description": "hugging face", + "category": "Smileys & Emotion", + "aliases": ["hugs"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🤭", + "description": "face with hand over mouth", + "category": "Smileys & Emotion", + "aliases": ["hand_over_mouth"], + "tags": ["quiet", "whoops"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🤫", + "description": "shushing face", + "category": "Smileys & Emotion", + "aliases": ["shushing_face"], + "tags": ["silence", "quiet"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🤔", + "description": "thinking face", + "category": "Smileys & Emotion", + "aliases": ["thinking"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🤐", + "description": "zipper-mouth face", + "category": "Smileys & Emotion", + "aliases": ["zipper_mouth_face"], + "tags": ["silence", "hush"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🤨", + "description": "face with raised eyebrow", + "category": "Smileys & Emotion", + "aliases": ["raised_eyebrow"], + "tags": ["suspicious"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😐", + "description": "neutral face", + "category": "Smileys & Emotion", + "aliases": ["neutral_face"], + "tags": ["meh"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😑", + "description": "expressionless face", + "category": "Smileys & Emotion", + "aliases": ["expressionless"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😶", + "description": "face without mouth", + "category": "Smileys & Emotion", + "aliases": ["no_mouth"], + "tags": ["mute", "silence"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😶‍🌫️", + "description": "face in clouds", + "category": "Smileys & Emotion", + "aliases": ["face_in_clouds"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0" + }, + { + "emoji": "😏", + "description": "smirking face", + "category": "Smileys & Emotion", + "aliases": ["smirk"], + "tags": ["smug"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😒", + "description": "unamused face", + "category": "Smileys & Emotion", + "aliases": ["unamused"], + "tags": ["meh"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🙄", + "description": "face with rolling eyes", + "category": "Smileys & Emotion", + "aliases": ["roll_eyes"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "😬", + "description": "grimacing face", + "category": "Smileys & Emotion", + "aliases": ["grimacing"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😮‍💨", + "description": "face exhaling", + "category": "Smileys & Emotion", + "aliases": ["face_exhaling"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0" + }, + { + "emoji": "🤥", + "description": "lying face", + "category": "Smileys & Emotion", + "aliases": ["lying_face"], + "tags": ["liar"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "😌", + "description": "relieved face", + "category": "Smileys & Emotion", + "aliases": ["relieved"], + "tags": ["whew"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😔", + "description": "pensive face", + "category": "Smileys & Emotion", + "aliases": ["pensive"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😪", + "description": "sleepy face", + "category": "Smileys & Emotion", + "aliases": ["sleepy"], + "tags": ["tired"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤤", + "description": "drooling face", + "category": "Smileys & Emotion", + "aliases": ["drooling_face"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "😴", + "description": "sleeping face", + "category": "Smileys & Emotion", + "aliases": ["sleeping"], + "tags": ["zzz"], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😷", + "description": "face with medical mask", + "category": "Smileys & Emotion", + "aliases": ["mask"], + "tags": ["sick", "ill"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤒", + "description": "face with thermometer", + "category": "Smileys & Emotion", + "aliases": ["face_with_thermometer"], + "tags": ["sick"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🤕", + "description": "face with head-bandage", + "category": "Smileys & Emotion", + "aliases": ["face_with_head_bandage"], + "tags": ["hurt"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🤢", + "description": "nauseated face", + "category": "Smileys & Emotion", + "aliases": ["nauseated_face"], + "tags": ["sick", "barf", "disgusted"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🤮", + "description": "face vomiting", + "category": "Smileys & Emotion", + "aliases": ["vomiting_face"], + "tags": ["barf", "sick"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🤧", + "description": "sneezing face", + "category": "Smileys & Emotion", + "aliases": ["sneezing_face"], + "tags": ["achoo", "sick"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥵", + "description": "hot face", + "category": "Smileys & Emotion", + "aliases": ["hot_face"], + "tags": ["heat", "sweating"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥶", + "description": "cold face", + "category": "Smileys & Emotion", + "aliases": ["cold_face"], + "tags": ["freezing", "ice"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥴", + "description": "woozy face", + "category": "Smileys & Emotion", + "aliases": ["woozy_face"], + "tags": ["groggy"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😵", + "description": "knocked-out face", + "category": "Smileys & Emotion", + "aliases": ["dizzy_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😵‍💫", + "description": "face with spiral eyes", + "category": "Smileys & Emotion", + "aliases": ["face_with_spiral_eyes"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0" + }, + { + "emoji": "🤯", + "description": "exploding head", + "category": "Smileys & Emotion", + "aliases": ["exploding_head"], + "tags": ["mind", "blown"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🤠", + "description": "cowboy hat face", + "category": "Smileys & Emotion", + "aliases": ["cowboy_hat_face"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥳", + "description": "partying face", + "category": "Smileys & Emotion", + "aliases": ["partying_face"], + "tags": ["celebration", "birthday"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥸", + "description": "disguised face", + "category": "Smileys & Emotion", + "aliases": ["disguised_face"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "😎", + "description": "smiling face with sunglasses", + "category": "Smileys & Emotion", + "aliases": ["sunglasses"], + "tags": ["cool"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤓", + "description": "nerd face", + "category": "Smileys & Emotion", + "aliases": ["nerd_face"], + "tags": ["geek", "glasses"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🧐", + "description": "face with monocle", + "category": "Smileys & Emotion", + "aliases": ["monocle_face"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😕", + "description": "confused face", + "category": "Smileys & Emotion", + "aliases": ["confused"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😟", + "description": "worried face", + "category": "Smileys & Emotion", + "aliases": ["worried"], + "tags": ["nervous"], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "🙁", + "description": "slightly frowning face", + "category": "Smileys & Emotion", + "aliases": ["slightly_frowning_face"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "☹️", + "description": "frowning face", + "category": "Smileys & Emotion", + "aliases": ["frowning_face"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "😮", + "description": "face with open mouth", + "category": "Smileys & Emotion", + "aliases": ["open_mouth"], + "tags": ["surprise", "impressed", "wow"], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😯", + "description": "hushed face", + "category": "Smileys & Emotion", + "aliases": ["hushed"], + "tags": ["silence", "speechless"], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😲", + "description": "astonished face", + "category": "Smileys & Emotion", + "aliases": ["astonished"], + "tags": ["amazed", "gasp"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😳", + "description": "flushed face", + "category": "Smileys & Emotion", + "aliases": ["flushed"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥺", + "description": "pleading face", + "category": "Smileys & Emotion", + "aliases": ["pleading_face"], + "tags": ["puppy", "eyes"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😦", + "description": "frowning face with open mouth", + "category": "Smileys & Emotion", + "aliases": ["frowning"], + "tags": [], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😧", + "description": "anguished face", + "category": "Smileys & Emotion", + "aliases": ["anguished"], + "tags": ["stunned"], + "unicode_version": "6.1", + "ios_version": "6.0" + }, + { + "emoji": "😨", + "description": "fearful face", + "category": "Smileys & Emotion", + "aliases": ["fearful"], + "tags": ["scared", "shocked", "oops"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😰", + "description": "anxious face with sweat", + "category": "Smileys & Emotion", + "aliases": ["cold_sweat"], + "tags": ["nervous"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😥", + "description": "sad but relieved face", + "category": "Smileys & Emotion", + "aliases": ["disappointed_relieved"], + "tags": ["phew", "sweat", "nervous"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😢", + "description": "crying face", + "category": "Smileys & Emotion", + "aliases": ["cry"], + "tags": ["sad", "tear"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😭", + "description": "loudly crying face", + "category": "Smileys & Emotion", + "aliases": ["sob"], + "tags": ["sad", "cry", "bawling"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😱", + "description": "face screaming in fear", + "category": "Smileys & Emotion", + "aliases": ["scream"], + "tags": ["horror", "shocked"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😖", + "description": "confounded face", + "category": "Smileys & Emotion", + "aliases": ["confounded"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😣", + "description": "persevering face", + "category": "Smileys & Emotion", + "aliases": ["persevere"], + "tags": ["struggling"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😞", + "description": "disappointed face", + "category": "Smileys & Emotion", + "aliases": ["disappointed"], + "tags": ["sad"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😓", + "description": "downcast face with sweat", + "category": "Smileys & Emotion", + "aliases": ["sweat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😩", + "description": "weary face", + "category": "Smileys & Emotion", + "aliases": ["weary"], + "tags": ["tired"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😫", + "description": "tired face", + "category": "Smileys & Emotion", + "aliases": ["tired_face"], + "tags": ["upset", "whine"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥱", + "description": "yawning face", + "category": "Smileys & Emotion", + "aliases": ["yawning_face"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "😤", + "description": "face with steam from nose", + "category": "Smileys & Emotion", + "aliases": ["triumph"], + "tags": ["smug"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😡", + "description": "pouting face", + "category": "Smileys & Emotion", + "aliases": ["rage", "pout"], + "tags": ["angry"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😠", + "description": "angry face", + "category": "Smileys & Emotion", + "aliases": ["angry"], + "tags": ["mad", "annoyed"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤬", + "description": "face with symbols on mouth", + "category": "Smileys & Emotion", + "aliases": ["cursing_face"], + "tags": ["foul"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "😈", + "description": "smiling face with horns", + "category": "Smileys & Emotion", + "aliases": ["smiling_imp"], + "tags": ["devil", "evil", "horns"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👿", + "description": "angry face with horns", + "category": "Smileys & Emotion", + "aliases": ["imp"], + "tags": ["angry", "devil", "evil", "horns"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💀", + "description": "skull", + "category": "Smileys & Emotion", + "aliases": ["skull"], + "tags": ["dead", "danger", "poison"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☠️", + "description": "skull and crossbones", + "category": "Smileys & Emotion", + "aliases": ["skull_and_crossbones"], + "tags": ["danger", "pirate"], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "💩", + "description": "pile of poo", + "category": "Smileys & Emotion", + "aliases": ["hankey", "poop", "shit"], + "tags": ["crap"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤡", + "description": "clown face", + "category": "Smileys & Emotion", + "aliases": ["clown_face"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "👹", + "description": "ogre", + "category": "Smileys & Emotion", + "aliases": ["japanese_ogre"], + "tags": ["monster"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👺", + "description": "goblin", + "category": "Smileys & Emotion", + "aliases": ["japanese_goblin"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👻", + "description": "ghost", + "category": "Smileys & Emotion", + "aliases": ["ghost"], + "tags": ["halloween"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👽", + "description": "alien", + "category": "Smileys & Emotion", + "aliases": ["alien"], + "tags": ["ufo"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👾", + "description": "alien monster", + "category": "Smileys & Emotion", + "aliases": ["space_invader"], + "tags": ["game", "retro"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤖", + "description": "robot", + "category": "Smileys & Emotion", + "aliases": ["robot"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "😺", + "description": "grinning cat", + "category": "Smileys & Emotion", + "aliases": ["smiley_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😸", + "description": "grinning cat with smiling eyes", + "category": "Smileys & Emotion", + "aliases": ["smile_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😹", + "description": "cat with tears of joy", + "category": "Smileys & Emotion", + "aliases": ["joy_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😻", + "description": "smiling cat with heart-eyes", + "category": "Smileys & Emotion", + "aliases": ["heart_eyes_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😼", + "description": "cat with wry smile", + "category": "Smileys & Emotion", + "aliases": ["smirk_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😽", + "description": "kissing cat", + "category": "Smileys & Emotion", + "aliases": ["kissing_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🙀", + "description": "weary cat", + "category": "Smileys & Emotion", + "aliases": ["scream_cat"], + "tags": ["horror"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😿", + "description": "crying cat", + "category": "Smileys & Emotion", + "aliases": ["crying_cat_face"], + "tags": ["sad", "tear"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "😾", + "description": "pouting cat", + "category": "Smileys & Emotion", + "aliases": ["pouting_cat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🙈", + "description": "see-no-evil monkey", + "category": "Smileys & Emotion", + "aliases": ["see_no_evil"], + "tags": ["monkey", "blind", "ignore"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🙉", + "description": "hear-no-evil monkey", + "category": "Smileys & Emotion", + "aliases": ["hear_no_evil"], + "tags": ["monkey", "deaf"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🙊", + "description": "speak-no-evil monkey", + "category": "Smileys & Emotion", + "aliases": ["speak_no_evil"], + "tags": ["monkey", "mute", "hush"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💋", + "description": "kiss mark", + "category": "Smileys & Emotion", + "aliases": ["kiss"], + "tags": ["lipstick"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💌", + "description": "love letter", + "category": "Smileys & Emotion", + "aliases": ["love_letter"], + "tags": ["email", "envelope"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💘", + "description": "heart with arrow", + "category": "Smileys & Emotion", + "aliases": ["cupid"], + "tags": ["love", "heart"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💝", + "description": "heart with ribbon", + "category": "Smileys & Emotion", + "aliases": ["gift_heart"], + "tags": ["chocolates"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💖", + "description": "sparkling heart", + "category": "Smileys & Emotion", + "aliases": ["sparkling_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💗", + "description": "growing heart", + "category": "Smileys & Emotion", + "aliases": ["heartpulse"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💓", + "description": "beating heart", + "category": "Smileys & Emotion", + "aliases": ["heartbeat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💞", + "description": "revolving hearts", + "category": "Smileys & Emotion", + "aliases": ["revolving_hearts"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💕", + "description": "two hearts", + "category": "Smileys & Emotion", + "aliases": ["two_hearts"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💟", + "description": "heart decoration", + "category": "Smileys & Emotion", + "aliases": ["heart_decoration"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "❣️", + "description": "heart exclamation", + "category": "Smileys & Emotion", + "aliases": ["heavy_heart_exclamation"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "💔", + "description": "broken heart", + "category": "Smileys & Emotion", + "aliases": ["broken_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "❤️‍🔥", + "description": "heart on fire", + "category": "Smileys & Emotion", + "aliases": ["heart_on_fire"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0" + }, + { + "emoji": "❤️‍🩹", + "description": "mending heart", + "category": "Smileys & Emotion", + "aliases": ["mending_heart"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0" + }, + { + "emoji": "❤️", + "description": "red heart", + "category": "Smileys & Emotion", + "aliases": ["heart"], + "tags": ["love"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🧡", + "description": "orange heart", + "category": "Smileys & Emotion", + "aliases": ["orange_heart"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "💛", + "description": "yellow heart", + "category": "Smileys & Emotion", + "aliases": ["yellow_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💚", + "description": "green heart", + "category": "Smileys & Emotion", + "aliases": ["green_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💙", + "description": "blue heart", + "category": "Smileys & Emotion", + "aliases": ["blue_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💜", + "description": "purple heart", + "category": "Smileys & Emotion", + "aliases": ["purple_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤎", + "description": "brown heart", + "category": "Smileys & Emotion", + "aliases": ["brown_heart"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🖤", + "description": "black heart", + "category": "Smileys & Emotion", + "aliases": ["black_heart"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🤍", + "description": "white heart", + "category": "Smileys & Emotion", + "aliases": ["white_heart"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "💯", + "description": "hundred points", + "category": "Smileys & Emotion", + "aliases": ["100"], + "tags": ["score", "perfect"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💢", + "description": "anger symbol", + "category": "Smileys & Emotion", + "aliases": ["anger"], + "tags": ["angry"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💥", + "description": "collision", + "category": "Smileys & Emotion", + "aliases": ["boom", "collision"], + "tags": ["explode"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💫", + "description": "dizzy", + "category": "Smileys & Emotion", + "aliases": ["dizzy"], + "tags": ["star"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💦", + "description": "sweat droplets", + "category": "Smileys & Emotion", + "aliases": ["sweat_drops"], + "tags": ["water", "workout"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💨", + "description": "dashing away", + "category": "Smileys & Emotion", + "aliases": ["dash"], + "tags": ["wind", "blow", "fast"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕳️", + "description": "hole", + "category": "Smileys & Emotion", + "aliases": ["hole"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "💣", + "description": "bomb", + "category": "Smileys & Emotion", + "aliases": ["bomb"], + "tags": ["boom"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💬", + "description": "speech balloon", + "category": "Smileys & Emotion", + "aliases": ["speech_balloon"], + "tags": ["comment"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👁️‍🗨️", + "description": "eye in speech bubble", + "category": "Smileys & Emotion", + "aliases": ["eye_speech_bubble"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🗨️", + "description": "left speech bubble", + "category": "Smileys & Emotion", + "aliases": ["left_speech_bubble"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🗯️", + "description": "right anger bubble", + "category": "Smileys & Emotion", + "aliases": ["right_anger_bubble"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "💭", + "description": "thought balloon", + "category": "Smileys & Emotion", + "aliases": ["thought_balloon"], + "tags": ["thinking"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💤", + "description": "zzz", + "category": "Smileys & Emotion", + "aliases": ["zzz"], + "tags": ["sleeping"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👋", + "description": "waving hand", + "category": "People & Body", + "aliases": ["wave"], + "tags": ["goodbye"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤚", + "description": "raised back of hand", + "category": "People & Body", + "aliases": ["raised_back_of_hand"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🖐️", + "description": "hand with fingers splayed", + "category": "People & Body", + "aliases": ["raised_hand_with_fingers_splayed"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "✋", + "description": "raised hand", + "category": "People & Body", + "aliases": ["hand", "raised_hand"], + "tags": ["highfive", "stop"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🖖", + "description": "vulcan salute", + "category": "People & Body", + "aliases": ["vulcan_salute"], + "tags": ["prosper", "spock"], + "unicode_version": "7.0", + "ios_version": "8.3", + "skin_tones": true + }, + { + "emoji": "👌", + "description": "OK hand", + "category": "People & Body", + "aliases": ["ok_hand"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤌", + "description": "pinched fingers", + "category": "People & Body", + "aliases": ["pinched_fingers"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "🤏", + "description": "pinching hand", + "category": "People & Body", + "aliases": ["pinching_hand"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "✌️", + "description": "victory hand", + "category": "People & Body", + "aliases": ["v"], + "tags": ["victory", "peace"], + "unicode_version": "", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤞", + "description": "crossed fingers", + "category": "People & Body", + "aliases": ["crossed_fingers"], + "tags": ["luck", "hopeful"], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤟", + "description": "love-you gesture", + "category": "People & Body", + "aliases": ["love_you_gesture"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤘", + "description": "sign of the horns", + "category": "People & Body", + "aliases": ["metal"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "🤙", + "description": "call me hand", + "category": "People & Body", + "aliases": ["call_me_hand"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👈", + "description": "backhand index pointing left", + "category": "People & Body", + "aliases": ["point_left"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👉", + "description": "backhand index pointing right", + "category": "People & Body", + "aliases": ["point_right"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👆", + "description": "backhand index pointing up", + "category": "People & Body", + "aliases": ["point_up_2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🖕", + "description": "middle finger", + "category": "People & Body", + "aliases": ["middle_finger", "fu"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "👇", + "description": "backhand index pointing down", + "category": "People & Body", + "aliases": ["point_down"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "☝️", + "description": "index pointing up", + "category": "People & Body", + "aliases": ["point_up"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👍", + "description": "thumbs up", + "category": "People & Body", + "aliases": ["+1", "thumbsup"], + "tags": ["approve", "ok"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👎", + "description": "thumbs down", + "category": "People & Body", + "aliases": ["-1", "thumbsdown"], + "tags": ["disapprove", "bury"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "✊", + "description": "raised fist", + "category": "People & Body", + "aliases": ["fist_raised", "fist"], + "tags": ["power"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👊", + "description": "oncoming fist", + "category": "People & Body", + "aliases": ["fist_oncoming", "facepunch", "punch"], + "tags": ["attack"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤛", + "description": "left-facing fist", + "category": "People & Body", + "aliases": ["fist_left"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤜", + "description": "right-facing fist", + "category": "People & Body", + "aliases": ["fist_right"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👏", + "description": "clapping hands", + "category": "People & Body", + "aliases": ["clap"], + "tags": ["praise", "applause"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙌", + "description": "raising hands", + "category": "People & Body", + "aliases": ["raised_hands"], + "tags": ["hooray"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👐", + "description": "open hands", + "category": "People & Body", + "aliases": ["open_hands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤲", + "description": "palms up together", + "category": "People & Body", + "aliases": ["palms_up_together"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤝", + "description": "handshake", + "category": "People & Body", + "aliases": ["handshake"], + "tags": ["deal"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🙏", + "description": "folded hands", + "category": "People & Body", + "aliases": ["pray"], + "tags": ["please", "hope", "wish"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "✍️", + "description": "writing hand", + "category": "People & Body", + "aliases": ["writing_hand"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "💅", + "description": "nail polish", + "category": "People & Body", + "aliases": ["nail_care"], + "tags": ["beauty", "manicure"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤳", + "description": "selfie", + "category": "People & Body", + "aliases": ["selfie"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "💪", + "description": "flexed biceps", + "category": "People & Body", + "aliases": ["muscle"], + "tags": ["flex", "bicep", "strong", "workout"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🦾", + "description": "mechanical arm", + "category": "People & Body", + "aliases": ["mechanical_arm"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦿", + "description": "mechanical leg", + "category": "People & Body", + "aliases": ["mechanical_leg"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦵", + "description": "leg", + "category": "People & Body", + "aliases": ["leg"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🦶", + "description": "foot", + "category": "People & Body", + "aliases": ["foot"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👂", + "description": "ear", + "category": "People & Body", + "aliases": ["ear"], + "tags": ["hear", "sound", "listen"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🦻", + "description": "ear with hearing aid", + "category": "People & Body", + "aliases": ["ear_with_hearing_aid"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "👃", + "description": "nose", + "category": "People & Body", + "aliases": ["nose"], + "tags": ["smell"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🧠", + "description": "brain", + "category": "People & Body", + "aliases": ["brain"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🫀", + "description": "anatomical heart", + "category": "People & Body", + "aliases": ["anatomical_heart"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🫁", + "description": "lungs", + "category": "People & Body", + "aliases": ["lungs"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🦷", + "description": "tooth", + "category": "People & Body", + "aliases": ["tooth"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦴", + "description": "bone", + "category": "People & Body", + "aliases": ["bone"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "👀", + "description": "eyes", + "category": "People & Body", + "aliases": ["eyes"], + "tags": ["look", "see", "watch"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👁️", + "description": "eye", + "category": "People & Body", + "aliases": ["eye"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "👅", + "description": "tongue", + "category": "People & Body", + "aliases": ["tongue"], + "tags": ["taste"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👄", + "description": "mouth", + "category": "People & Body", + "aliases": ["lips"], + "tags": ["kiss"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👶", + "description": "baby", + "category": "People & Body", + "aliases": ["baby"], + "tags": ["child", "newborn"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🧒", + "description": "child", + "category": "People & Body", + "aliases": ["child"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👦", + "description": "boy", + "category": "People & Body", + "aliases": ["boy"], + "tags": ["child"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👧", + "description": "girl", + "category": "People & Body", + "aliases": ["girl"], + "tags": ["child"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🧑", + "description": "person", + "category": "People & Body", + "aliases": ["adult"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👱", + "description": "person: blond hair", + "category": "People & Body", + "aliases": ["blond_haired_person"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👨", + "description": "man", + "category": "People & Body", + "aliases": ["man"], + "tags": ["mustache", "father", "dad"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🧔", + "description": "person: beard", + "category": "People & Body", + "aliases": ["bearded_person"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧔‍♂️", + "description": "man: beard", + "category": "People & Body", + "aliases": ["man_beard"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "🧔‍♀️", + "description": "woman: beard", + "category": "People & Body", + "aliases": ["woman_beard"], + "tags": [], + "unicode_version": "13.1", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "👨‍🦰", + "description": "man: red hair", + "category": "People & Body", + "aliases": ["red_haired_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👨‍🦱", + "description": "man: curly hair", + "category": "People & Body", + "aliases": ["curly_haired_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👨‍🦳", + "description": "man: white hair", + "category": "People & Body", + "aliases": ["white_haired_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👨‍🦲", + "description": "man: bald", + "category": "People & Body", + "aliases": ["bald_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👩", + "description": "woman", + "category": "People & Body", + "aliases": ["woman"], + "tags": ["girls"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👩‍🦰", + "description": "woman: red hair", + "category": "People & Body", + "aliases": ["red_haired_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧑‍🦰", + "description": "person: red hair", + "category": "People & Body", + "aliases": ["person_red_hair"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👩‍🦱", + "description": "woman: curly hair", + "category": "People & Body", + "aliases": ["curly_haired_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧑‍🦱", + "description": "person: curly hair", + "category": "People & Body", + "aliases": ["person_curly_hair"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👩‍🦳", + "description": "woman: white hair", + "category": "People & Body", + "aliases": ["white_haired_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧑‍🦳", + "description": "person: white hair", + "category": "People & Body", + "aliases": ["person_white_hair"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👩‍🦲", + "description": "woman: bald", + "category": "People & Body", + "aliases": ["bald_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧑‍🦲", + "description": "person: bald", + "category": "People & Body", + "aliases": ["person_bald"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👱‍♀️", + "description": "woman: blond hair", + "category": "People & Body", + "aliases": ["blond_haired_woman", "blonde_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "👱‍♂️", + "description": "man: blond hair", + "category": "People & Body", + "aliases": ["blond_haired_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧓", + "description": "older person", + "category": "People & Body", + "aliases": ["older_adult"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👴", + "description": "old man", + "category": "People & Body", + "aliases": ["older_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👵", + "description": "old woman", + "category": "People & Body", + "aliases": ["older_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙍", + "description": "person frowning", + "category": "People & Body", + "aliases": ["frowning_person"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙍‍♂️", + "description": "man frowning", + "category": "People & Body", + "aliases": ["frowning_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🙍‍♀️", + "description": "woman frowning", + "category": "People & Body", + "aliases": ["frowning_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🙎", + "description": "person pouting", + "category": "People & Body", + "aliases": ["pouting_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙎‍♂️", + "description": "man pouting", + "category": "People & Body", + "aliases": ["pouting_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🙎‍♀️", + "description": "woman pouting", + "category": "People & Body", + "aliases": ["pouting_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🙅", + "description": "person gesturing NO", + "category": "People & Body", + "aliases": ["no_good"], + "tags": ["stop", "halt", "denied"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙅‍♂️", + "description": "man gesturing NO", + "category": "People & Body", + "aliases": ["no_good_man", "ng_man"], + "tags": ["stop", "halt", "denied"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🙅‍♀️", + "description": "woman gesturing NO", + "category": "People & Body", + "aliases": ["no_good_woman", "ng_woman"], + "tags": ["stop", "halt", "denied"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🙆", + "description": "person gesturing OK", + "category": "People & Body", + "aliases": ["ok_person"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙆‍♂️", + "description": "man gesturing OK", + "category": "People & Body", + "aliases": ["ok_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🙆‍♀️", + "description": "woman gesturing OK", + "category": "People & Body", + "aliases": ["ok_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "💁", + "description": "person tipping hand", + "category": "People & Body", + "aliases": ["tipping_hand_person", "information_desk_person"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "💁‍♂️", + "description": "man tipping hand", + "category": "People & Body", + "aliases": ["tipping_hand_man", "sassy_man"], + "tags": ["information"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "💁‍♀️", + "description": "woman tipping hand", + "category": "People & Body", + "aliases": ["tipping_hand_woman", "sassy_woman"], + "tags": ["information"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🙋", + "description": "person raising hand", + "category": "People & Body", + "aliases": ["raising_hand"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙋‍♂️", + "description": "man raising hand", + "category": "People & Body", + "aliases": ["raising_hand_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🙋‍♀️", + "description": "woman raising hand", + "category": "People & Body", + "aliases": ["raising_hand_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧏", + "description": "deaf person", + "category": "People & Body", + "aliases": ["deaf_person"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧏‍♂️", + "description": "deaf man", + "category": "People & Body", + "aliases": ["deaf_man"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧏‍♀️", + "description": "deaf woman", + "category": "People & Body", + "aliases": ["deaf_woman"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🙇", + "description": "person bowing", + "category": "People & Body", + "aliases": ["bow"], + "tags": ["respect", "thanks"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🙇‍♂️", + "description": "man bowing", + "category": "People & Body", + "aliases": ["bowing_man"], + "tags": ["respect", "thanks"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🙇‍♀️", + "description": "woman bowing", + "category": "People & Body", + "aliases": ["bowing_woman"], + "tags": ["respect", "thanks"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🤦", + "description": "person facepalming", + "category": "People & Body", + "aliases": ["facepalm"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤦‍♂️", + "description": "man facepalming", + "category": "People & Body", + "aliases": ["man_facepalming"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤦‍♀️", + "description": "woman facepalming", + "category": "People & Body", + "aliases": ["woman_facepalming"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤷", + "description": "person shrugging", + "category": "People & Body", + "aliases": ["shrug"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤷‍♂️", + "description": "man shrugging", + "category": "People & Body", + "aliases": ["man_shrugging"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤷‍♀️", + "description": "woman shrugging", + "category": "People & Body", + "aliases": ["woman_shrugging"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍⚕️", + "description": "health worker", + "category": "People & Body", + "aliases": ["health_worker"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍⚕️", + "description": "man health worker", + "category": "People & Body", + "aliases": ["man_health_worker"], + "tags": ["doctor", "nurse"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍⚕️", + "description": "woman health worker", + "category": "People & Body", + "aliases": ["woman_health_worker"], + "tags": ["doctor", "nurse"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🎓", + "description": "student", + "category": "People & Body", + "aliases": ["student"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🎓", + "description": "man student", + "category": "People & Body", + "aliases": ["man_student"], + "tags": ["graduation"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🎓", + "description": "woman student", + "category": "People & Body", + "aliases": ["woman_student"], + "tags": ["graduation"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🏫", + "description": "teacher", + "category": "People & Body", + "aliases": ["teacher"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🏫", + "description": "man teacher", + "category": "People & Body", + "aliases": ["man_teacher"], + "tags": ["school", "professor"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🏫", + "description": "woman teacher", + "category": "People & Body", + "aliases": ["woman_teacher"], + "tags": ["school", "professor"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍⚖️", + "description": "judge", + "category": "People & Body", + "aliases": ["judge"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍⚖️", + "description": "man judge", + "category": "People & Body", + "aliases": ["man_judge"], + "tags": ["justice"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍⚖️", + "description": "woman judge", + "category": "People & Body", + "aliases": ["woman_judge"], + "tags": ["justice"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🌾", + "description": "farmer", + "category": "People & Body", + "aliases": ["farmer"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🌾", + "description": "man farmer", + "category": "People & Body", + "aliases": ["man_farmer"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🌾", + "description": "woman farmer", + "category": "People & Body", + "aliases": ["woman_farmer"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🍳", + "description": "cook", + "category": "People & Body", + "aliases": ["cook"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🍳", + "description": "man cook", + "category": "People & Body", + "aliases": ["man_cook"], + "tags": ["chef"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🍳", + "description": "woman cook", + "category": "People & Body", + "aliases": ["woman_cook"], + "tags": ["chef"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🔧", + "description": "mechanic", + "category": "People & Body", + "aliases": ["mechanic"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🔧", + "description": "man mechanic", + "category": "People & Body", + "aliases": ["man_mechanic"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🔧", + "description": "woman mechanic", + "category": "People & Body", + "aliases": ["woman_mechanic"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🏭", + "description": "factory worker", + "category": "People & Body", + "aliases": ["factory_worker"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🏭", + "description": "man factory worker", + "category": "People & Body", + "aliases": ["man_factory_worker"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🏭", + "description": "woman factory worker", + "category": "People & Body", + "aliases": ["woman_factory_worker"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍💼", + "description": "office worker", + "category": "People & Body", + "aliases": ["office_worker"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍💼", + "description": "man office worker", + "category": "People & Body", + "aliases": ["man_office_worker"], + "tags": ["business"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍💼", + "description": "woman office worker", + "category": "People & Body", + "aliases": ["woman_office_worker"], + "tags": ["business"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🔬", + "description": "scientist", + "category": "People & Body", + "aliases": ["scientist"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🔬", + "description": "man scientist", + "category": "People & Body", + "aliases": ["man_scientist"], + "tags": ["research"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🔬", + "description": "woman scientist", + "category": "People & Body", + "aliases": ["woman_scientist"], + "tags": ["research"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍💻", + "description": "technologist", + "category": "People & Body", + "aliases": ["technologist"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍💻", + "description": "man technologist", + "category": "People & Body", + "aliases": ["man_technologist"], + "tags": ["coder"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍💻", + "description": "woman technologist", + "category": "People & Body", + "aliases": ["woman_technologist"], + "tags": ["coder"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🎤", + "description": "singer", + "category": "People & Body", + "aliases": ["singer"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🎤", + "description": "man singer", + "category": "People & Body", + "aliases": ["man_singer"], + "tags": ["rockstar"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🎤", + "description": "woman singer", + "category": "People & Body", + "aliases": ["woman_singer"], + "tags": ["rockstar"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🎨", + "description": "artist", + "category": "People & Body", + "aliases": ["artist"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🎨", + "description": "man artist", + "category": "People & Body", + "aliases": ["man_artist"], + "tags": ["painter"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🎨", + "description": "woman artist", + "category": "People & Body", + "aliases": ["woman_artist"], + "tags": ["painter"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍✈️", + "description": "pilot", + "category": "People & Body", + "aliases": ["pilot"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍✈️", + "description": "man pilot", + "category": "People & Body", + "aliases": ["man_pilot"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍✈️", + "description": "woman pilot", + "category": "People & Body", + "aliases": ["woman_pilot"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🚀", + "description": "astronaut", + "category": "People & Body", + "aliases": ["astronaut"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🚀", + "description": "man astronaut", + "category": "People & Body", + "aliases": ["man_astronaut"], + "tags": ["space"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🚀", + "description": "woman astronaut", + "category": "People & Body", + "aliases": ["woman_astronaut"], + "tags": ["space"], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🚒", + "description": "firefighter", + "category": "People & Body", + "aliases": ["firefighter"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🚒", + "description": "man firefighter", + "category": "People & Body", + "aliases": ["man_firefighter"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👩‍🚒", + "description": "woman firefighter", + "category": "People & Body", + "aliases": ["woman_firefighter"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👮", + "description": "police officer", + "category": "People & Body", + "aliases": ["police_officer", "cop"], + "tags": ["law"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👮‍♂️", + "description": "man police officer", + "category": "People & Body", + "aliases": ["policeman"], + "tags": ["law", "cop"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👮‍♀️", + "description": "woman police officer", + "category": "People & Body", + "aliases": ["policewoman"], + "tags": ["law", "cop"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🕵️", + "description": "detective", + "category": "People & Body", + "aliases": ["detective"], + "tags": ["sleuth"], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "🕵️‍♂️", + "description": "man detective", + "category": "People & Body", + "aliases": ["male_detective"], + "tags": ["sleuth"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🕵️‍♀️", + "description": "woman detective", + "category": "People & Body", + "aliases": ["female_detective"], + "tags": ["sleuth"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "💂", + "description": "guard", + "category": "People & Body", + "aliases": ["guard"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "💂‍♂️", + "description": "man guard", + "category": "People & Body", + "aliases": ["guardsman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "💂‍♀️", + "description": "woman guard", + "category": "People & Body", + "aliases": ["guardswoman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🥷", + "description": "ninja", + "category": "People & Body", + "aliases": ["ninja"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "👷", + "description": "construction worker", + "category": "People & Body", + "aliases": ["construction_worker"], + "tags": ["helmet"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👷‍♂️", + "description": "man construction worker", + "category": "People & Body", + "aliases": ["construction_worker_man"], + "tags": ["helmet"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👷‍♀️", + "description": "woman construction worker", + "category": "People & Body", + "aliases": ["construction_worker_woman"], + "tags": ["helmet"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🤴", + "description": "prince", + "category": "People & Body", + "aliases": ["prince"], + "tags": ["crown", "royal"], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "👸", + "description": "princess", + "category": "People & Body", + "aliases": ["princess"], + "tags": ["crown", "royal"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👳", + "description": "person wearing turban", + "category": "People & Body", + "aliases": ["person_with_turban"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👳‍♂️", + "description": "man wearing turban", + "category": "People & Body", + "aliases": ["man_with_turban"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👳‍♀️", + "description": "woman wearing turban", + "category": "People & Body", + "aliases": ["woman_with_turban"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "👲", + "description": "person with skullcap", + "category": "People & Body", + "aliases": ["man_with_gua_pi_mao"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🧕", + "description": "woman with headscarf", + "category": "People & Body", + "aliases": ["woman_with_headscarf"], + "tags": ["hijab"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤵", + "description": "person in tuxedo", + "category": "People & Body", + "aliases": ["person_in_tuxedo"], + "tags": ["groom", "marriage", "wedding"], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤵‍♂️", + "description": "man in tuxedo", + "category": "People & Body", + "aliases": ["man_in_tuxedo"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "🤵‍♀️", + "description": "woman in tuxedo", + "category": "People & Body", + "aliases": ["woman_in_tuxedo"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "👰", + "description": "person with veil", + "category": "People & Body", + "aliases": ["person_with_veil"], + "tags": ["marriage", "wedding"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👰‍♂️", + "description": "man with veil", + "category": "People & Body", + "aliases": ["man_with_veil"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "👰‍♀️", + "description": "woman with veil", + "category": "People & Body", + "aliases": ["woman_with_veil", "bride_with_veil"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "🤰", + "description": "pregnant woman", + "category": "People & Body", + "aliases": ["pregnant_woman"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤱", + "description": "breast-feeding", + "category": "People & Body", + "aliases": ["breast_feeding"], + "tags": ["nursing"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👩‍🍼", + "description": "woman feeding baby", + "category": "People & Body", + "aliases": ["woman_feeding_baby"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "👨‍🍼", + "description": "man feeding baby", + "category": "People & Body", + "aliases": ["man_feeding_baby"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "🧑‍🍼", + "description": "person feeding baby", + "category": "People & Body", + "aliases": ["person_feeding_baby"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "👼", + "description": "baby angel", + "category": "People & Body", + "aliases": ["angel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🎅", + "description": "Santa Claus", + "category": "People & Body", + "aliases": ["santa"], + "tags": ["christmas"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🤶", + "description": "Mrs. Claus", + "category": "People & Body", + "aliases": ["mrs_claus"], + "tags": ["santa"], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧑‍🎄", + "description": "mx claus", + "category": "People & Body", + "aliases": ["mx_claus"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0", + "skin_tones": true + }, + { + "emoji": "🦸", + "description": "superhero", + "category": "People & Body", + "aliases": ["superhero"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🦸‍♂️", + "description": "man superhero", + "category": "People & Body", + "aliases": ["superhero_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🦸‍♀️", + "description": "woman superhero", + "category": "People & Body", + "aliases": ["superhero_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🦹", + "description": "supervillain", + "category": "People & Body", + "aliases": ["supervillain"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🦹‍♂️", + "description": "man supervillain", + "category": "People & Body", + "aliases": ["supervillain_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🦹‍♀️", + "description": "woman supervillain", + "category": "People & Body", + "aliases": ["supervillain_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧙", + "description": "mage", + "category": "People & Body", + "aliases": ["mage"], + "tags": ["wizard"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧙‍♂️", + "description": "man mage", + "category": "People & Body", + "aliases": ["mage_man"], + "tags": ["wizard"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧙‍♀️", + "description": "woman mage", + "category": "People & Body", + "aliases": ["mage_woman"], + "tags": ["wizard"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧚", + "description": "fairy", + "category": "People & Body", + "aliases": ["fairy"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧚‍♂️", + "description": "man fairy", + "category": "People & Body", + "aliases": ["fairy_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧚‍♀️", + "description": "woman fairy", + "category": "People & Body", + "aliases": ["fairy_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧛", + "description": "vampire", + "category": "People & Body", + "aliases": ["vampire"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧛‍♂️", + "description": "man vampire", + "category": "People & Body", + "aliases": ["vampire_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧛‍♀️", + "description": "woman vampire", + "category": "People & Body", + "aliases": ["vampire_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧜", + "description": "merperson", + "category": "People & Body", + "aliases": ["merperson"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧜‍♂️", + "description": "merman", + "category": "People & Body", + "aliases": ["merman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧜‍♀️", + "description": "mermaid", + "category": "People & Body", + "aliases": ["mermaid"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧝", + "description": "elf", + "category": "People & Body", + "aliases": ["elf"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧝‍♂️", + "description": "man elf", + "category": "People & Body", + "aliases": ["elf_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧝‍♀️", + "description": "woman elf", + "category": "People & Body", + "aliases": ["elf_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧞", + "description": "genie", + "category": "People & Body", + "aliases": ["genie"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧞‍♂️", + "description": "man genie", + "category": "People & Body", + "aliases": ["genie_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧞‍♀️", + "description": "woman genie", + "category": "People & Body", + "aliases": ["genie_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧟", + "description": "zombie", + "category": "People & Body", + "aliases": ["zombie"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧟‍♂️", + "description": "man zombie", + "category": "People & Body", + "aliases": ["zombie_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧟‍♀️", + "description": "woman zombie", + "category": "People & Body", + "aliases": ["zombie_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "💆", + "description": "person getting massage", + "category": "People & Body", + "aliases": ["massage"], + "tags": ["spa"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "💆‍♂️", + "description": "man getting massage", + "category": "People & Body", + "aliases": ["massage_man"], + "tags": ["spa"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "💆‍♀️", + "description": "woman getting massage", + "category": "People & Body", + "aliases": ["massage_woman"], + "tags": ["spa"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "💇", + "description": "person getting haircut", + "category": "People & Body", + "aliases": ["haircut"], + "tags": ["beauty"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "💇‍♂️", + "description": "man getting haircut", + "category": "People & Body", + "aliases": ["haircut_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "💇‍♀️", + "description": "woman getting haircut", + "category": "People & Body", + "aliases": ["haircut_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🚶", + "description": "person walking", + "category": "People & Body", + "aliases": ["walking"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🚶‍♂️", + "description": "man walking", + "category": "People & Body", + "aliases": ["walking_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🚶‍♀️", + "description": "woman walking", + "category": "People & Body", + "aliases": ["walking_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🧍", + "description": "person standing", + "category": "People & Body", + "aliases": ["standing_person"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧍‍♂️", + "description": "man standing", + "category": "People & Body", + "aliases": ["standing_man"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧍‍♀️", + "description": "woman standing", + "category": "People & Body", + "aliases": ["standing_woman"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧎", + "description": "person kneeling", + "category": "People & Body", + "aliases": ["kneeling_person"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧎‍♂️", + "description": "man kneeling", + "category": "People & Body", + "aliases": ["kneeling_man"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧎‍♀️", + "description": "woman kneeling", + "category": "People & Body", + "aliases": ["kneeling_woman"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧑‍🦯", + "description": "person with white cane", + "category": "People & Body", + "aliases": ["person_with_probing_cane"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🦯", + "description": "man with white cane", + "category": "People & Body", + "aliases": ["man_with_probing_cane"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "👩‍🦯", + "description": "woman with white cane", + "category": "People & Body", + "aliases": ["woman_with_probing_cane"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧑‍🦼", + "description": "person in motorized wheelchair", + "category": "People & Body", + "aliases": ["person_in_motorized_wheelchair"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🦼", + "description": "man in motorized wheelchair", + "category": "People & Body", + "aliases": ["man_in_motorized_wheelchair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "👩‍🦼", + "description": "woman in motorized wheelchair", + "category": "People & Body", + "aliases": ["woman_in_motorized_wheelchair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🧑‍🦽", + "description": "person in manual wheelchair", + "category": "People & Body", + "aliases": ["person_in_manual_wheelchair"], + "tags": [], + "unicode_version": "12.1", + "ios_version": "13.2", + "skin_tones": true + }, + { + "emoji": "👨‍🦽", + "description": "man in manual wheelchair", + "category": "People & Body", + "aliases": ["man_in_manual_wheelchair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "👩‍🦽", + "description": "woman in manual wheelchair", + "category": "People & Body", + "aliases": ["woman_in_manual_wheelchair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "🏃", + "description": "person running", + "category": "People & Body", + "aliases": ["runner", "running"], + "tags": ["exercise", "workout", "marathon"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🏃‍♂️", + "description": "man running", + "category": "People & Body", + "aliases": ["running_man"], + "tags": ["exercise", "workout", "marathon"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🏃‍♀️", + "description": "woman running", + "category": "People & Body", + "aliases": ["running_woman"], + "tags": ["exercise", "workout", "marathon"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "💃", + "description": "woman dancing", + "category": "People & Body", + "aliases": ["woman_dancing", "dancer"], + "tags": ["dress"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🕺", + "description": "man dancing", + "category": "People & Body", + "aliases": ["man_dancing"], + "tags": ["dancer"], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🕴️", + "description": "person in suit levitating", + "category": "People & Body", + "aliases": ["business_suit_levitating"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "👯", + "description": "people with bunny ears", + "category": "People & Body", + "aliases": ["dancers"], + "tags": ["bunny"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👯‍♂️", + "description": "men with bunny ears", + "category": "People & Body", + "aliases": ["dancing_men"], + "tags": ["bunny"], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👯‍♀️", + "description": "women with bunny ears", + "category": "People & Body", + "aliases": ["dancing_women"], + "tags": ["bunny"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧖", + "description": "person in steamy room", + "category": "People & Body", + "aliases": ["sauna_person"], + "tags": ["steamy"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧖‍♂️", + "description": "man in steamy room", + "category": "People & Body", + "aliases": ["sauna_man"], + "tags": ["steamy"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧖‍♀️", + "description": "woman in steamy room", + "category": "People & Body", + "aliases": ["sauna_woman"], + "tags": ["steamy"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧗", + "description": "person climbing", + "category": "People & Body", + "aliases": ["climbing"], + "tags": ["bouldering"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧗‍♂️", + "description": "man climbing", + "category": "People & Body", + "aliases": ["climbing_man"], + "tags": ["bouldering"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧗‍♀️", + "description": "woman climbing", + "category": "People & Body", + "aliases": ["climbing_woman"], + "tags": ["bouldering"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤺", + "description": "person fencing", + "category": "People & Body", + "aliases": ["person_fencing"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🏇", + "description": "horse racing", + "category": "People & Body", + "aliases": ["horse_racing"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "⛷️", + "description": "skier", + "category": "People & Body", + "aliases": ["skier"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🏂", + "description": "snowboarder", + "category": "People & Body", + "aliases": ["snowboarder"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🏌️", + "description": "person golfing", + "category": "People & Body", + "aliases": ["golfing"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "🏌️‍♂️", + "description": "man golfing", + "category": "People & Body", + "aliases": ["golfing_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🏌️‍♀️", + "description": "woman golfing", + "category": "People & Body", + "aliases": ["golfing_woman"], + "tags": [], + "unicode_version": "", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🏄", + "description": "person surfing", + "category": "People & Body", + "aliases": ["surfer"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🏄‍♂️", + "description": "man surfing", + "category": "People & Body", + "aliases": ["surfing_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🏄‍♀️", + "description": "woman surfing", + "category": "People & Body", + "aliases": ["surfing_woman"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🚣", + "description": "person rowing boat", + "category": "People & Body", + "aliases": ["rowboat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🚣‍♂️", + "description": "man rowing boat", + "category": "People & Body", + "aliases": ["rowing_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🚣‍♀️", + "description": "woman rowing boat", + "category": "People & Body", + "aliases": ["rowing_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🏊", + "description": "person swimming", + "category": "People & Body", + "aliases": ["swimmer"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🏊‍♂️", + "description": "man swimming", + "category": "People & Body", + "aliases": ["swimming_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🏊‍♀️", + "description": "woman swimming", + "category": "People & Body", + "aliases": ["swimming_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "⛹️", + "description": "person bouncing ball", + "category": "People & Body", + "aliases": ["bouncing_ball_person"], + "tags": ["basketball"], + "unicode_version": "5.2", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "⛹️‍♂️", + "description": "man bouncing ball", + "category": "People & Body", + "aliases": ["bouncing_ball_man", "basketball_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "⛹️‍♀️", + "description": "woman bouncing ball", + "category": "People & Body", + "aliases": ["bouncing_ball_woman", "basketball_woman"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🏋️", + "description": "person lifting weights", + "category": "People & Body", + "aliases": ["weight_lifting"], + "tags": ["gym", "workout"], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "🏋️‍♂️", + "description": "man lifting weights", + "category": "People & Body", + "aliases": ["weight_lifting_man"], + "tags": ["gym", "workout"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🏋️‍♀️", + "description": "woman lifting weights", + "category": "People & Body", + "aliases": ["weight_lifting_woman"], + "tags": ["gym", "workout"], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🚴", + "description": "person biking", + "category": "People & Body", + "aliases": ["bicyclist"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🚴‍♂️", + "description": "man biking", + "category": "People & Body", + "aliases": ["biking_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🚴‍♀️", + "description": "woman biking", + "category": "People & Body", + "aliases": ["biking_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🚵", + "description": "person mountain biking", + "category": "People & Body", + "aliases": ["mountain_bicyclist"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🚵‍♂️", + "description": "man mountain biking", + "category": "People & Body", + "aliases": ["mountain_biking_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🚵‍♀️", + "description": "woman mountain biking", + "category": "People & Body", + "aliases": ["mountain_biking_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0", + "skin_tones": true + }, + { + "emoji": "🤸", + "description": "person cartwheeling", + "category": "People & Body", + "aliases": ["cartwheeling"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤸‍♂️", + "description": "man cartwheeling", + "category": "People & Body", + "aliases": ["man_cartwheeling"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤸‍♀️", + "description": "woman cartwheeling", + "category": "People & Body", + "aliases": ["woman_cartwheeling"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤼", + "description": "people wrestling", + "category": "People & Body", + "aliases": ["wrestling"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🤼‍♂️", + "description": "men wrestling", + "category": "People & Body", + "aliases": ["men_wrestling"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🤼‍♀️", + "description": "women wrestling", + "category": "People & Body", + "aliases": ["women_wrestling"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🤽", + "description": "person playing water polo", + "category": "People & Body", + "aliases": ["water_polo"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤽‍♂️", + "description": "man playing water polo", + "category": "People & Body", + "aliases": ["man_playing_water_polo"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤽‍♀️", + "description": "woman playing water polo", + "category": "People & Body", + "aliases": ["woman_playing_water_polo"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤾", + "description": "person playing handball", + "category": "People & Body", + "aliases": ["handball_person"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤾‍♂️", + "description": "man playing handball", + "category": "People & Body", + "aliases": ["man_playing_handball"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤾‍♀️", + "description": "woman playing handball", + "category": "People & Body", + "aliases": ["woman_playing_handball"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤹", + "description": "person juggling", + "category": "People & Body", + "aliases": ["juggling_person"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🤹‍♂️", + "description": "man juggling", + "category": "People & Body", + "aliases": ["man_juggling"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🤹‍♀️", + "description": "woman juggling", + "category": "People & Body", + "aliases": ["woman_juggling"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2", + "skin_tones": true + }, + { + "emoji": "🧘", + "description": "person in lotus position", + "category": "People & Body", + "aliases": ["lotus_position"], + "tags": ["meditation"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧘‍♂️", + "description": "man in lotus position", + "category": "People & Body", + "aliases": ["lotus_position_man"], + "tags": ["meditation"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🧘‍♀️", + "description": "woman in lotus position", + "category": "People & Body", + "aliases": ["lotus_position_woman"], + "tags": ["meditation"], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "🛀", + "description": "person taking bath", + "category": "People & Body", + "aliases": ["bath"], + "tags": ["shower"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "🛌", + "description": "person in bed", + "category": "People & Body", + "aliases": ["sleeping_bed"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1", + "skin_tones": true + }, + { + "emoji": "🧑‍🤝‍🧑", + "description": "people holding hands", + "category": "People & Body", + "aliases": ["people_holding_hands"], + "tags": ["couple", "date"], + "unicode_version": "12.0", + "ios_version": "13.0", + "skin_tones": true + }, + { + "emoji": "👭", + "description": "women holding hands", + "category": "People & Body", + "aliases": ["two_women_holding_hands"], + "tags": ["couple", "date"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👫", + "description": "woman and man holding hands", + "category": "People & Body", + "aliases": ["couple"], + "tags": ["date"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👬", + "description": "men holding hands", + "category": "People & Body", + "aliases": ["two_men_holding_hands"], + "tags": ["couple", "date"], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "💏", + "description": "kiss", + "category": "People & Body", + "aliases": ["couplekiss"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👩‍❤️‍💋‍👨", + "description": "kiss: woman, man", + "category": "People & Body", + "aliases": ["couplekiss_man_woman"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👨‍❤️‍💋‍👨", + "description": "kiss: man, man", + "category": "People & Body", + "aliases": ["couplekiss_man_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3", + "skin_tones": true + }, + { + "emoji": "👩‍❤️‍💋‍👩", + "description": "kiss: woman, woman", + "category": "People & Body", + "aliases": ["couplekiss_woman_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3", + "skin_tones": true + }, + { + "emoji": "💑", + "description": "couple with heart", + "category": "People & Body", + "aliases": ["couple_with_heart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0", + "skin_tones": true + }, + { + "emoji": "👩‍❤️‍👨", + "description": "couple with heart: woman, man", + "category": "People & Body", + "aliases": ["couple_with_heart_woman_man"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1", + "skin_tones": true + }, + { + "emoji": "👨‍❤️‍👨", + "description": "couple with heart: man, man", + "category": "People & Body", + "aliases": ["couple_with_heart_man_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3", + "skin_tones": true + }, + { + "emoji": "👩‍❤️‍👩", + "description": "couple with heart: woman, woman", + "category": "People & Body", + "aliases": ["couple_with_heart_woman_woman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3", + "skin_tones": true + }, + { + "emoji": "👪", + "description": "family", + "category": "People & Body", + "aliases": ["family"], + "tags": ["home", "parents", "child"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👨‍👩‍👦", + "description": "family: man, woman, boy", + "category": "People & Body", + "aliases": ["family_man_woman_boy"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "👨‍👩‍👧", + "description": "family: man, woman, girl", + "category": "People & Body", + "aliases": ["family_man_woman_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👩‍👧‍👦", + "description": "family: man, woman, girl, boy", + "category": "People & Body", + "aliases": ["family_man_woman_girl_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👩‍👦‍👦", + "description": "family: man, woman, boy, boy", + "category": "People & Body", + "aliases": ["family_man_woman_boy_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👩‍👧‍👧", + "description": "family: man, woman, girl, girl", + "category": "People & Body", + "aliases": ["family_man_woman_girl_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👨‍👦", + "description": "family: man, man, boy", + "category": "People & Body", + "aliases": ["family_man_man_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👨‍👧", + "description": "family: man, man, girl", + "category": "People & Body", + "aliases": ["family_man_man_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👨‍👧‍👦", + "description": "family: man, man, girl, boy", + "category": "People & Body", + "aliases": ["family_man_man_girl_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👨‍👦‍👦", + "description": "family: man, man, boy, boy", + "category": "People & Body", + "aliases": ["family_man_man_boy_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👨‍👧‍👧", + "description": "family: man, man, girl, girl", + "category": "People & Body", + "aliases": ["family_man_man_girl_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👩‍👩‍👦", + "description": "family: woman, woman, boy", + "category": "People & Body", + "aliases": ["family_woman_woman_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👩‍👩‍👧", + "description": "family: woman, woman, girl", + "category": "People & Body", + "aliases": ["family_woman_woman_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👩‍👩‍👧‍👦", + "description": "family: woman, woman, girl, boy", + "category": "People & Body", + "aliases": ["family_woman_woman_girl_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👩‍👩‍👦‍👦", + "description": "family: woman, woman, boy, boy", + "category": "People & Body", + "aliases": ["family_woman_woman_boy_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👩‍👩‍👧‍👧", + "description": "family: woman, woman, girl, girl", + "category": "People & Body", + "aliases": ["family_woman_woman_girl_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "👨‍👦", + "description": "family: man, boy", + "category": "People & Body", + "aliases": ["family_man_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👨‍👦‍👦", + "description": "family: man, boy, boy", + "category": "People & Body", + "aliases": ["family_man_boy_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👨‍👧", + "description": "family: man, girl", + "category": "People & Body", + "aliases": ["family_man_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👨‍👧‍👦", + "description": "family: man, girl, boy", + "category": "People & Body", + "aliases": ["family_man_girl_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👨‍👧‍👧", + "description": "family: man, girl, girl", + "category": "People & Body", + "aliases": ["family_man_girl_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👩‍👦", + "description": "family: woman, boy", + "category": "People & Body", + "aliases": ["family_woman_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👩‍👦‍👦", + "description": "family: woman, boy, boy", + "category": "People & Body", + "aliases": ["family_woman_boy_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👩‍👧", + "description": "family: woman, girl", + "category": "People & Body", + "aliases": ["family_woman_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👩‍👧‍👦", + "description": "family: woman, girl, boy", + "category": "People & Body", + "aliases": ["family_woman_girl_boy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "👩‍👧‍👧", + "description": "family: woman, girl, girl", + "category": "People & Body", + "aliases": ["family_woman_girl_girl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "🗣️", + "description": "speaking head", + "category": "People & Body", + "aliases": ["speaking_head"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "👤", + "description": "bust in silhouette", + "category": "People & Body", + "aliases": ["bust_in_silhouette"], + "tags": ["user"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👥", + "description": "busts in silhouette", + "category": "People & Body", + "aliases": ["busts_in_silhouette"], + "tags": ["users", "group", "team"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🫂", + "description": "people hugging", + "category": "People & Body", + "aliases": ["people_hugging"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "👣", + "description": "footprints", + "category": "People & Body", + "aliases": ["footprints"], + "tags": ["feet", "tracks"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐵", + "description": "monkey face", + "category": "Animals & Nature", + "aliases": ["monkey_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐒", + "description": "monkey", + "category": "Animals & Nature", + "aliases": ["monkey"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦍", + "description": "gorilla", + "category": "Animals & Nature", + "aliases": ["gorilla"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦧", + "description": "orangutan", + "category": "Animals & Nature", + "aliases": ["orangutan"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🐶", + "description": "dog face", + "category": "Animals & Nature", + "aliases": ["dog"], + "tags": ["pet"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐕", + "description": "dog", + "category": "Animals & Nature", + "aliases": ["dog2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦮", + "description": "guide dog", + "category": "Animals & Nature", + "aliases": ["guide_dog"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🐕‍🦺", + "description": "service dog", + "category": "Animals & Nature", + "aliases": ["service_dog"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🐩", + "description": "poodle", + "category": "Animals & Nature", + "aliases": ["poodle"], + "tags": ["dog"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐺", + "description": "wolf", + "category": "Animals & Nature", + "aliases": ["wolf"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦊", + "description": "fox", + "category": "Animals & Nature", + "aliases": ["fox_face"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦝", + "description": "raccoon", + "category": "Animals & Nature", + "aliases": ["raccoon"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🐱", + "description": "cat face", + "category": "Animals & Nature", + "aliases": ["cat"], + "tags": ["pet"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐈", + "description": "cat", + "category": "Animals & Nature", + "aliases": ["cat2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐈‍⬛", + "description": "black cat", + "category": "Animals & Nature", + "aliases": ["black_cat"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🦁", + "description": "lion", + "category": "Animals & Nature", + "aliases": ["lion"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🐯", + "description": "tiger face", + "category": "Animals & Nature", + "aliases": ["tiger"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐅", + "description": "tiger", + "category": "Animals & Nature", + "aliases": ["tiger2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐆", + "description": "leopard", + "category": "Animals & Nature", + "aliases": ["leopard"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐴", + "description": "horse face", + "category": "Animals & Nature", + "aliases": ["horse"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐎", + "description": "horse", + "category": "Animals & Nature", + "aliases": ["racehorse"], + "tags": ["speed"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦄", + "description": "unicorn", + "category": "Animals & Nature", + "aliases": ["unicorn"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🦓", + "description": "zebra", + "category": "Animals & Nature", + "aliases": ["zebra"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦌", + "description": "deer", + "category": "Animals & Nature", + "aliases": ["deer"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦬", + "description": "bison", + "category": "Animals & Nature", + "aliases": ["bison"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🐮", + "description": "cow face", + "category": "Animals & Nature", + "aliases": ["cow"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐂", + "description": "ox", + "category": "Animals & Nature", + "aliases": ["ox"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐃", + "description": "water buffalo", + "category": "Animals & Nature", + "aliases": ["water_buffalo"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐄", + "description": "cow", + "category": "Animals & Nature", + "aliases": ["cow2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐷", + "description": "pig face", + "category": "Animals & Nature", + "aliases": ["pig"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐖", + "description": "pig", + "category": "Animals & Nature", + "aliases": ["pig2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐗", + "description": "boar", + "category": "Animals & Nature", + "aliases": ["boar"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐽", + "description": "pig nose", + "category": "Animals & Nature", + "aliases": ["pig_nose"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐏", + "description": "ram", + "category": "Animals & Nature", + "aliases": ["ram"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐑", + "description": "ewe", + "category": "Animals & Nature", + "aliases": ["sheep"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐐", + "description": "goat", + "category": "Animals & Nature", + "aliases": ["goat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐪", + "description": "camel", + "category": "Animals & Nature", + "aliases": ["dromedary_camel"], + "tags": ["desert"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐫", + "description": "two-hump camel", + "category": "Animals & Nature", + "aliases": ["camel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦙", + "description": "llama", + "category": "Animals & Nature", + "aliases": ["llama"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦒", + "description": "giraffe", + "category": "Animals & Nature", + "aliases": ["giraffe"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🐘", + "description": "elephant", + "category": "Animals & Nature", + "aliases": ["elephant"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦣", + "description": "mammoth", + "category": "Animals & Nature", + "aliases": ["mammoth"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🦏", + "description": "rhinoceros", + "category": "Animals & Nature", + "aliases": ["rhinoceros"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦛", + "description": "hippopotamus", + "category": "Animals & Nature", + "aliases": ["hippopotamus"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🐭", + "description": "mouse face", + "category": "Animals & Nature", + "aliases": ["mouse"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐁", + "description": "mouse", + "category": "Animals & Nature", + "aliases": ["mouse2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐀", + "description": "rat", + "category": "Animals & Nature", + "aliases": ["rat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐹", + "description": "hamster", + "category": "Animals & Nature", + "aliases": ["hamster"], + "tags": ["pet"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐰", + "description": "rabbit face", + "category": "Animals & Nature", + "aliases": ["rabbit"], + "tags": ["bunny"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐇", + "description": "rabbit", + "category": "Animals & Nature", + "aliases": ["rabbit2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐿️", + "description": "chipmunk", + "category": "Animals & Nature", + "aliases": ["chipmunk"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🦫", + "description": "beaver", + "category": "Animals & Nature", + "aliases": ["beaver"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🦔", + "description": "hedgehog", + "category": "Animals & Nature", + "aliases": ["hedgehog"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦇", + "description": "bat", + "category": "Animals & Nature", + "aliases": ["bat"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🐻", + "description": "bear", + "category": "Animals & Nature", + "aliases": ["bear"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐻‍❄️", + "description": "polar bear", + "category": "Animals & Nature", + "aliases": ["polar_bear"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🐨", + "description": "koala", + "category": "Animals & Nature", + "aliases": ["koala"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐼", + "description": "panda", + "category": "Animals & Nature", + "aliases": ["panda_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦥", + "description": "sloth", + "category": "Animals & Nature", + "aliases": ["sloth"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦦", + "description": "otter", + "category": "Animals & Nature", + "aliases": ["otter"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦨", + "description": "skunk", + "category": "Animals & Nature", + "aliases": ["skunk"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦘", + "description": "kangaroo", + "category": "Animals & Nature", + "aliases": ["kangaroo"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦡", + "description": "badger", + "category": "Animals & Nature", + "aliases": ["badger"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🐾", + "description": "paw prints", + "category": "Animals & Nature", + "aliases": ["feet", "paw_prints"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦃", + "description": "turkey", + "category": "Animals & Nature", + "aliases": ["turkey"], + "tags": ["thanksgiving"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🐔", + "description": "chicken", + "category": "Animals & Nature", + "aliases": ["chicken"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐓", + "description": "rooster", + "category": "Animals & Nature", + "aliases": ["rooster"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐣", + "description": "hatching chick", + "category": "Animals & Nature", + "aliases": ["hatching_chick"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐤", + "description": "baby chick", + "category": "Animals & Nature", + "aliases": ["baby_chick"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐥", + "description": "front-facing baby chick", + "category": "Animals & Nature", + "aliases": ["hatched_chick"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐦", + "description": "bird", + "category": "Animals & Nature", + "aliases": ["bird"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐧", + "description": "penguin", + "category": "Animals & Nature", + "aliases": ["penguin"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕊️", + "description": "dove", + "category": "Animals & Nature", + "aliases": ["dove"], + "tags": ["peace"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🦅", + "description": "eagle", + "category": "Animals & Nature", + "aliases": ["eagle"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦆", + "description": "duck", + "category": "Animals & Nature", + "aliases": ["duck"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦢", + "description": "swan", + "category": "Animals & Nature", + "aliases": ["swan"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦉", + "description": "owl", + "category": "Animals & Nature", + "aliases": ["owl"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦤", + "description": "dodo", + "category": "Animals & Nature", + "aliases": ["dodo"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪶", + "description": "feather", + "category": "Animals & Nature", + "aliases": ["feather"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🦩", + "description": "flamingo", + "category": "Animals & Nature", + "aliases": ["flamingo"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦚", + "description": "peacock", + "category": "Animals & Nature", + "aliases": ["peacock"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦜", + "description": "parrot", + "category": "Animals & Nature", + "aliases": ["parrot"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🐸", + "description": "frog", + "category": "Animals & Nature", + "aliases": ["frog"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐊", + "description": "crocodile", + "category": "Animals & Nature", + "aliases": ["crocodile"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐢", + "description": "turtle", + "category": "Animals & Nature", + "aliases": ["turtle"], + "tags": ["slow"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦎", + "description": "lizard", + "category": "Animals & Nature", + "aliases": ["lizard"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🐍", + "description": "snake", + "category": "Animals & Nature", + "aliases": ["snake"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐲", + "description": "dragon face", + "category": "Animals & Nature", + "aliases": ["dragon_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐉", + "description": "dragon", + "category": "Animals & Nature", + "aliases": ["dragon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦕", + "description": "sauropod", + "category": "Animals & Nature", + "aliases": ["sauropod"], + "tags": ["dinosaur"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦖", + "description": "T-Rex", + "category": "Animals & Nature", + "aliases": ["t-rex"], + "tags": ["dinosaur"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🐳", + "description": "spouting whale", + "category": "Animals & Nature", + "aliases": ["whale"], + "tags": ["sea"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐋", + "description": "whale", + "category": "Animals & Nature", + "aliases": ["whale2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐬", + "description": "dolphin", + "category": "Animals & Nature", + "aliases": ["dolphin", "flipper"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦭", + "description": "seal", + "category": "Animals & Nature", + "aliases": ["seal"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🐟", + "description": "fish", + "category": "Animals & Nature", + "aliases": ["fish"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐠", + "description": "tropical fish", + "category": "Animals & Nature", + "aliases": ["tropical_fish"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐡", + "description": "blowfish", + "category": "Animals & Nature", + "aliases": ["blowfish"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦈", + "description": "shark", + "category": "Animals & Nature", + "aliases": ["shark"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🐙", + "description": "octopus", + "category": "Animals & Nature", + "aliases": ["octopus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐚", + "description": "spiral shell", + "category": "Animals & Nature", + "aliases": ["shell"], + "tags": ["sea", "beach"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐌", + "description": "snail", + "category": "Animals & Nature", + "aliases": ["snail"], + "tags": ["slow"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦋", + "description": "butterfly", + "category": "Animals & Nature", + "aliases": ["butterfly"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🐛", + "description": "bug", + "category": "Animals & Nature", + "aliases": ["bug"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐜", + "description": "ant", + "category": "Animals & Nature", + "aliases": ["ant"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🐝", + "description": "honeybee", + "category": "Animals & Nature", + "aliases": ["bee", "honeybee"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪲", + "description": "beetle", + "category": "Animals & Nature", + "aliases": ["beetle"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🐞", + "description": "lady beetle", + "category": "Animals & Nature", + "aliases": ["lady_beetle"], + "tags": ["bug"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🦗", + "description": "cricket", + "category": "Animals & Nature", + "aliases": ["cricket"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪳", + "description": "cockroach", + "category": "Animals & Nature", + "aliases": ["cockroach"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🕷️", + "description": "spider", + "category": "Animals & Nature", + "aliases": ["spider"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🕸️", + "description": "spider web", + "category": "Animals & Nature", + "aliases": ["spider_web"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🦂", + "description": "scorpion", + "category": "Animals & Nature", + "aliases": ["scorpion"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🦟", + "description": "mosquito", + "category": "Animals & Nature", + "aliases": ["mosquito"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪰", + "description": "fly", + "category": "Animals & Nature", + "aliases": ["fly"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪱", + "description": "worm", + "category": "Animals & Nature", + "aliases": ["worm"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🦠", + "description": "microbe", + "category": "Animals & Nature", + "aliases": ["microbe"], + "tags": ["germ"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "💐", + "description": "bouquet", + "category": "Animals & Nature", + "aliases": ["bouquet"], + "tags": ["flowers"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌸", + "description": "cherry blossom", + "category": "Animals & Nature", + "aliases": ["cherry_blossom"], + "tags": ["flower", "spring"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💮", + "description": "white flower", + "category": "Animals & Nature", + "aliases": ["white_flower"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏵️", + "description": "rosette", + "category": "Animals & Nature", + "aliases": ["rosette"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌹", + "description": "rose", + "category": "Animals & Nature", + "aliases": ["rose"], + "tags": ["flower"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥀", + "description": "wilted flower", + "category": "Animals & Nature", + "aliases": ["wilted_flower"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🌺", + "description": "hibiscus", + "category": "Animals & Nature", + "aliases": ["hibiscus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌻", + "description": "sunflower", + "category": "Animals & Nature", + "aliases": ["sunflower"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌼", + "description": "blossom", + "category": "Animals & Nature", + "aliases": ["blossom"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌷", + "description": "tulip", + "category": "Animals & Nature", + "aliases": ["tulip"], + "tags": ["flower"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌱", + "description": "seedling", + "category": "Animals & Nature", + "aliases": ["seedling"], + "tags": ["plant"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪴", + "description": "potted plant", + "category": "Animals & Nature", + "aliases": ["potted_plant"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🌲", + "description": "evergreen tree", + "category": "Animals & Nature", + "aliases": ["evergreen_tree"], + "tags": ["wood"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌳", + "description": "deciduous tree", + "category": "Animals & Nature", + "aliases": ["deciduous_tree"], + "tags": ["wood"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌴", + "description": "palm tree", + "category": "Animals & Nature", + "aliases": ["palm_tree"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌵", + "description": "cactus", + "category": "Animals & Nature", + "aliases": ["cactus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌾", + "description": "sheaf of rice", + "category": "Animals & Nature", + "aliases": ["ear_of_rice"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌿", + "description": "herb", + "category": "Animals & Nature", + "aliases": ["herb"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☘️", + "description": "shamrock", + "category": "Animals & Nature", + "aliases": ["shamrock"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🍀", + "description": "four leaf clover", + "category": "Animals & Nature", + "aliases": ["four_leaf_clover"], + "tags": ["luck"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍁", + "description": "maple leaf", + "category": "Animals & Nature", + "aliases": ["maple_leaf"], + "tags": ["canada"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍂", + "description": "fallen leaf", + "category": "Animals & Nature", + "aliases": ["fallen_leaf"], + "tags": ["autumn"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍃", + "description": "leaf fluttering in wind", + "category": "Animals & Nature", + "aliases": ["leaves"], + "tags": ["leaf"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍇", + "description": "grapes", + "category": "Food & Drink", + "aliases": ["grapes"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍈", + "description": "melon", + "category": "Food & Drink", + "aliases": ["melon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍉", + "description": "watermelon", + "category": "Food & Drink", + "aliases": ["watermelon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍊", + "description": "tangerine", + "category": "Food & Drink", + "aliases": ["tangerine", "orange", "mandarin"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍋", + "description": "lemon", + "category": "Food & Drink", + "aliases": ["lemon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍌", + "description": "banana", + "category": "Food & Drink", + "aliases": ["banana"], + "tags": ["fruit"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍍", + "description": "pineapple", + "category": "Food & Drink", + "aliases": ["pineapple"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥭", + "description": "mango", + "category": "Food & Drink", + "aliases": ["mango"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🍎", + "description": "red apple", + "category": "Food & Drink", + "aliases": ["apple"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍏", + "description": "green apple", + "category": "Food & Drink", + "aliases": ["green_apple"], + "tags": ["fruit"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍐", + "description": "pear", + "category": "Food & Drink", + "aliases": ["pear"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍑", + "description": "peach", + "category": "Food & Drink", + "aliases": ["peach"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍒", + "description": "cherries", + "category": "Food & Drink", + "aliases": ["cherries"], + "tags": ["fruit"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍓", + "description": "strawberry", + "category": "Food & Drink", + "aliases": ["strawberry"], + "tags": ["fruit"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🫐", + "description": "blueberries", + "category": "Food & Drink", + "aliases": ["blueberries"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🥝", + "description": "kiwi fruit", + "category": "Food & Drink", + "aliases": ["kiwi_fruit"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🍅", + "description": "tomato", + "category": "Food & Drink", + "aliases": ["tomato"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🫒", + "description": "olive", + "category": "Food & Drink", + "aliases": ["olive"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🥥", + "description": "coconut", + "category": "Food & Drink", + "aliases": ["coconut"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥑", + "description": "avocado", + "category": "Food & Drink", + "aliases": ["avocado"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🍆", + "description": "eggplant", + "category": "Food & Drink", + "aliases": ["eggplant"], + "tags": ["aubergine"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥔", + "description": "potato", + "category": "Food & Drink", + "aliases": ["potato"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥕", + "description": "carrot", + "category": "Food & Drink", + "aliases": ["carrot"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🌽", + "description": "ear of corn", + "category": "Food & Drink", + "aliases": ["corn"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌶️", + "description": "hot pepper", + "category": "Food & Drink", + "aliases": ["hot_pepper"], + "tags": ["spicy"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🫑", + "description": "bell pepper", + "category": "Food & Drink", + "aliases": ["bell_pepper"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🥒", + "description": "cucumber", + "category": "Food & Drink", + "aliases": ["cucumber"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥬", + "description": "leafy green", + "category": "Food & Drink", + "aliases": ["leafy_green"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥦", + "description": "broccoli", + "category": "Food & Drink", + "aliases": ["broccoli"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧄", + "description": "garlic", + "category": "Food & Drink", + "aliases": ["garlic"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🧅", + "description": "onion", + "category": "Food & Drink", + "aliases": ["onion"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🍄", + "description": "mushroom", + "category": "Food & Drink", + "aliases": ["mushroom"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥜", + "description": "peanuts", + "category": "Food & Drink", + "aliases": ["peanuts"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🌰", + "description": "chestnut", + "category": "Food & Drink", + "aliases": ["chestnut"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍞", + "description": "bread", + "category": "Food & Drink", + "aliases": ["bread"], + "tags": ["toast"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥐", + "description": "croissant", + "category": "Food & Drink", + "aliases": ["croissant"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥖", + "description": "baguette bread", + "category": "Food & Drink", + "aliases": ["baguette_bread"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🫓", + "description": "flatbread", + "category": "Food & Drink", + "aliases": ["flatbread"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🥨", + "description": "pretzel", + "category": "Food & Drink", + "aliases": ["pretzel"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥯", + "description": "bagel", + "category": "Food & Drink", + "aliases": ["bagel"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥞", + "description": "pancakes", + "category": "Food & Drink", + "aliases": ["pancakes"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🧇", + "description": "waffle", + "category": "Food & Drink", + "aliases": ["waffle"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🧀", + "description": "cheese wedge", + "category": "Food & Drink", + "aliases": ["cheese"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🍖", + "description": "meat on bone", + "category": "Food & Drink", + "aliases": ["meat_on_bone"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍗", + "description": "poultry leg", + "category": "Food & Drink", + "aliases": ["poultry_leg"], + "tags": ["meat", "chicken"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥩", + "description": "cut of meat", + "category": "Food & Drink", + "aliases": ["cut_of_meat"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥓", + "description": "bacon", + "category": "Food & Drink", + "aliases": ["bacon"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🍔", + "description": "hamburger", + "category": "Food & Drink", + "aliases": ["hamburger"], + "tags": ["burger"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍟", + "description": "french fries", + "category": "Food & Drink", + "aliases": ["fries"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍕", + "description": "pizza", + "category": "Food & Drink", + "aliases": ["pizza"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌭", + "description": "hot dog", + "category": "Food & Drink", + "aliases": ["hotdog"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🥪", + "description": "sandwich", + "category": "Food & Drink", + "aliases": ["sandwich"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🌮", + "description": "taco", + "category": "Food & Drink", + "aliases": ["taco"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🌯", + "description": "burrito", + "category": "Food & Drink", + "aliases": ["burrito"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🫔", + "description": "tamale", + "category": "Food & Drink", + "aliases": ["tamale"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🥙", + "description": "stuffed flatbread", + "category": "Food & Drink", + "aliases": ["stuffed_flatbread"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🧆", + "description": "falafel", + "category": "Food & Drink", + "aliases": ["falafel"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🥚", + "description": "egg", + "category": "Food & Drink", + "aliases": ["egg"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🍳", + "description": "cooking", + "category": "Food & Drink", + "aliases": ["fried_egg"], + "tags": ["breakfast"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥘", + "description": "shallow pan of food", + "category": "Food & Drink", + "aliases": ["shallow_pan_of_food"], + "tags": ["paella", "curry"], + "unicode_version": "", + "ios_version": "10.2" + }, + { + "emoji": "🍲", + "description": "pot of food", + "category": "Food & Drink", + "aliases": ["stew"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🫕", + "description": "fondue", + "category": "Food & Drink", + "aliases": ["fondue"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🥣", + "description": "bowl with spoon", + "category": "Food & Drink", + "aliases": ["bowl_with_spoon"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥗", + "description": "green salad", + "category": "Food & Drink", + "aliases": ["green_salad"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🍿", + "description": "popcorn", + "category": "Food & Drink", + "aliases": ["popcorn"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🧈", + "description": "butter", + "category": "Food & Drink", + "aliases": ["butter"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🧂", + "description": "salt", + "category": "Food & Drink", + "aliases": ["salt"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥫", + "description": "canned food", + "category": "Food & Drink", + "aliases": ["canned_food"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🍱", + "description": "bento box", + "category": "Food & Drink", + "aliases": ["bento"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍘", + "description": "rice cracker", + "category": "Food & Drink", + "aliases": ["rice_cracker"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍙", + "description": "rice ball", + "category": "Food & Drink", + "aliases": ["rice_ball"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍚", + "description": "cooked rice", + "category": "Food & Drink", + "aliases": ["rice"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍛", + "description": "curry rice", + "category": "Food & Drink", + "aliases": ["curry"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍜", + "description": "steaming bowl", + "category": "Food & Drink", + "aliases": ["ramen"], + "tags": ["noodle"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍝", + "description": "spaghetti", + "category": "Food & Drink", + "aliases": ["spaghetti"], + "tags": ["pasta"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍠", + "description": "roasted sweet potato", + "category": "Food & Drink", + "aliases": ["sweet_potato"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍢", + "description": "oden", + "category": "Food & Drink", + "aliases": ["oden"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍣", + "description": "sushi", + "category": "Food & Drink", + "aliases": ["sushi"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍤", + "description": "fried shrimp", + "category": "Food & Drink", + "aliases": ["fried_shrimp"], + "tags": ["tempura"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍥", + "description": "fish cake with swirl", + "category": "Food & Drink", + "aliases": ["fish_cake"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥮", + "description": "moon cake", + "category": "Food & Drink", + "aliases": ["moon_cake"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🍡", + "description": "dango", + "category": "Food & Drink", + "aliases": ["dango"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥟", + "description": "dumpling", + "category": "Food & Drink", + "aliases": ["dumpling"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥠", + "description": "fortune cookie", + "category": "Food & Drink", + "aliases": ["fortune_cookie"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥡", + "description": "takeout box", + "category": "Food & Drink", + "aliases": ["takeout_box"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦀", + "description": "crab", + "category": "Food & Drink", + "aliases": ["crab"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🦞", + "description": "lobster", + "category": "Food & Drink", + "aliases": ["lobster"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦐", + "description": "shrimp", + "category": "Food & Drink", + "aliases": ["shrimp"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦑", + "description": "squid", + "category": "Food & Drink", + "aliases": ["squid"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦪", + "description": "oyster", + "category": "Food & Drink", + "aliases": ["oyster"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🍦", + "description": "soft ice cream", + "category": "Food & Drink", + "aliases": ["icecream"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍧", + "description": "shaved ice", + "category": "Food & Drink", + "aliases": ["shaved_ice"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍨", + "description": "ice cream", + "category": "Food & Drink", + "aliases": ["ice_cream"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍩", + "description": "doughnut", + "category": "Food & Drink", + "aliases": ["doughnut"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍪", + "description": "cookie", + "category": "Food & Drink", + "aliases": ["cookie"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎂", + "description": "birthday cake", + "category": "Food & Drink", + "aliases": ["birthday"], + "tags": ["party"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍰", + "description": "shortcake", + "category": "Food & Drink", + "aliases": ["cake"], + "tags": ["dessert"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧁", + "description": "cupcake", + "category": "Food & Drink", + "aliases": ["cupcake"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥧", + "description": "pie", + "category": "Food & Drink", + "aliases": ["pie"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🍫", + "description": "chocolate bar", + "category": "Food & Drink", + "aliases": ["chocolate_bar"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍬", + "description": "candy", + "category": "Food & Drink", + "aliases": ["candy"], + "tags": ["sweet"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍭", + "description": "lollipop", + "category": "Food & Drink", + "aliases": ["lollipop"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍮", + "description": "custard", + "category": "Food & Drink", + "aliases": ["custard"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍯", + "description": "honey pot", + "category": "Food & Drink", + "aliases": ["honey_pot"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍼", + "description": "baby bottle", + "category": "Food & Drink", + "aliases": ["baby_bottle"], + "tags": ["milk"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥛", + "description": "glass of milk", + "category": "Food & Drink", + "aliases": ["milk_glass"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "☕", + "description": "hot beverage", + "category": "Food & Drink", + "aliases": ["coffee"], + "tags": ["cafe", "espresso"], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "🫖", + "description": "teapot", + "category": "Food & Drink", + "aliases": ["teapot"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🍵", + "description": "teacup without handle", + "category": "Food & Drink", + "aliases": ["tea"], + "tags": ["green", "breakfast"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍶", + "description": "sake", + "category": "Food & Drink", + "aliases": ["sake"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍾", + "description": "bottle with popping cork", + "category": "Food & Drink", + "aliases": ["champagne"], + "tags": ["bottle", "bubbly", "celebration"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🍷", + "description": "wine glass", + "category": "Food & Drink", + "aliases": ["wine_glass"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍸", + "description": "cocktail glass", + "category": "Food & Drink", + "aliases": ["cocktail"], + "tags": ["drink"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍹", + "description": "tropical drink", + "category": "Food & Drink", + "aliases": ["tropical_drink"], + "tags": ["summer", "vacation"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍺", + "description": "beer mug", + "category": "Food & Drink", + "aliases": ["beer"], + "tags": ["drink"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🍻", + "description": "clinking beer mugs", + "category": "Food & Drink", + "aliases": ["beers"], + "tags": ["drinks"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥂", + "description": "clinking glasses", + "category": "Food & Drink", + "aliases": ["clinking_glasses"], + "tags": ["cheers", "toast"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥃", + "description": "tumbler glass", + "category": "Food & Drink", + "aliases": ["tumbler_glass"], + "tags": ["whisky"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥤", + "description": "cup with straw", + "category": "Food & Drink", + "aliases": ["cup_with_straw"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧋", + "description": "bubble tea", + "category": "Food & Drink", + "aliases": ["bubble_tea"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🧃", + "description": "beverage box", + "category": "Food & Drink", + "aliases": ["beverage_box"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🧉", + "description": "mate", + "category": "Food & Drink", + "aliases": ["mate"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🧊", + "description": "ice", + "category": "Food & Drink", + "aliases": ["ice_cube"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🥢", + "description": "chopsticks", + "category": "Food & Drink", + "aliases": ["chopsticks"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🍽️", + "description": "fork and knife with plate", + "category": "Food & Drink", + "aliases": ["plate_with_cutlery"], + "tags": ["dining", "dinner"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🍴", + "description": "fork and knife", + "category": "Food & Drink", + "aliases": ["fork_and_knife"], + "tags": ["cutlery"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥄", + "description": "spoon", + "category": "Food & Drink", + "aliases": ["spoon"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🔪", + "description": "kitchen knife", + "category": "Food & Drink", + "aliases": ["hocho", "knife"], + "tags": ["cut", "chop"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏺", + "description": "amphora", + "category": "Food & Drink", + "aliases": ["amphora"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🌍", + "description": "globe showing Europe-Africa", + "category": "Travel & Places", + "aliases": ["earth_africa"], + "tags": ["globe", "world", "international"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌎", + "description": "globe showing Americas", + "category": "Travel & Places", + "aliases": ["earth_americas"], + "tags": ["globe", "world", "international"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌏", + "description": "globe showing Asia-Australia", + "category": "Travel & Places", + "aliases": ["earth_asia"], + "tags": ["globe", "world", "international"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌐", + "description": "globe with meridians", + "category": "Travel & Places", + "aliases": ["globe_with_meridians"], + "tags": ["world", "global", "international"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗺️", + "description": "world map", + "category": "Travel & Places", + "aliases": ["world_map"], + "tags": ["travel"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🗾", + "description": "map of Japan", + "category": "Travel & Places", + "aliases": ["japan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧭", + "description": "compass", + "category": "Travel & Places", + "aliases": ["compass"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🏔️", + "description": "snow-capped mountain", + "category": "Travel & Places", + "aliases": ["mountain_snow"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⛰️", + "description": "mountain", + "category": "Travel & Places", + "aliases": ["mountain"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🌋", + "description": "volcano", + "category": "Travel & Places", + "aliases": ["volcano"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗻", + "description": "mount fuji", + "category": "Travel & Places", + "aliases": ["mount_fuji"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏕️", + "description": "camping", + "category": "Travel & Places", + "aliases": ["camping"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏖️", + "description": "beach with umbrella", + "category": "Travel & Places", + "aliases": ["beach_umbrella"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏜️", + "description": "desert", + "category": "Travel & Places", + "aliases": ["desert"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏝️", + "description": "desert island", + "category": "Travel & Places", + "aliases": ["desert_island"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏞️", + "description": "national park", + "category": "Travel & Places", + "aliases": ["national_park"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏟️", + "description": "stadium", + "category": "Travel & Places", + "aliases": ["stadium"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏛️", + "description": "classical building", + "category": "Travel & Places", + "aliases": ["classical_building"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏗️", + "description": "building construction", + "category": "Travel & Places", + "aliases": ["building_construction"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🧱", + "description": "brick", + "category": "Travel & Places", + "aliases": ["bricks"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪨", + "description": "rock", + "category": "Travel & Places", + "aliases": ["rock"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪵", + "description": "wood", + "category": "Travel & Places", + "aliases": ["wood"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🛖", + "description": "hut", + "category": "Travel & Places", + "aliases": ["hut"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🏘️", + "description": "houses", + "category": "Travel & Places", + "aliases": ["houses"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏚️", + "description": "derelict house", + "category": "Travel & Places", + "aliases": ["derelict_house"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏠", + "description": "house", + "category": "Travel & Places", + "aliases": ["house"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏡", + "description": "house with garden", + "category": "Travel & Places", + "aliases": ["house_with_garden"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏢", + "description": "office building", + "category": "Travel & Places", + "aliases": ["office"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏣", + "description": "Japanese post office", + "category": "Travel & Places", + "aliases": ["post_office"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏤", + "description": "post office", + "category": "Travel & Places", + "aliases": ["european_post_office"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏥", + "description": "hospital", + "category": "Travel & Places", + "aliases": ["hospital"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏦", + "description": "bank", + "category": "Travel & Places", + "aliases": ["bank"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏨", + "description": "hotel", + "category": "Travel & Places", + "aliases": ["hotel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏩", + "description": "love hotel", + "category": "Travel & Places", + "aliases": ["love_hotel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏪", + "description": "convenience store", + "category": "Travel & Places", + "aliases": ["convenience_store"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏫", + "description": "school", + "category": "Travel & Places", + "aliases": ["school"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏬", + "description": "department store", + "category": "Travel & Places", + "aliases": ["department_store"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏭", + "description": "factory", + "category": "Travel & Places", + "aliases": ["factory"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏯", + "description": "Japanese castle", + "category": "Travel & Places", + "aliases": ["japanese_castle"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏰", + "description": "castle", + "category": "Travel & Places", + "aliases": ["european_castle"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💒", + "description": "wedding", + "category": "Travel & Places", + "aliases": ["wedding"], + "tags": ["marriage"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗼", + "description": "Tokyo tower", + "category": "Travel & Places", + "aliases": ["tokyo_tower"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗽", + "description": "Statue of Liberty", + "category": "Travel & Places", + "aliases": ["statue_of_liberty"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⛪", + "description": "church", + "category": "Travel & Places", + "aliases": ["church"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🕌", + "description": "mosque", + "category": "Travel & Places", + "aliases": ["mosque"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🛕", + "description": "hindu temple", + "category": "Travel & Places", + "aliases": ["hindu_temple"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🕍", + "description": "synagogue", + "category": "Travel & Places", + "aliases": ["synagogue"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "⛩️", + "description": "shinto shrine", + "category": "Travel & Places", + "aliases": ["shinto_shrine"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🕋", + "description": "kaaba", + "category": "Travel & Places", + "aliases": ["kaaba"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "⛲", + "description": "fountain", + "category": "Travel & Places", + "aliases": ["fountain"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "⛺", + "description": "tent", + "category": "Travel & Places", + "aliases": ["tent"], + "tags": ["camping"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🌁", + "description": "foggy", + "category": "Travel & Places", + "aliases": ["foggy"], + "tags": ["karl"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌃", + "description": "night with stars", + "category": "Travel & Places", + "aliases": ["night_with_stars"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏙️", + "description": "cityscape", + "category": "Travel & Places", + "aliases": ["cityscape"], + "tags": ["skyline"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌄", + "description": "sunrise over mountains", + "category": "Travel & Places", + "aliases": ["sunrise_over_mountains"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌅", + "description": "sunrise", + "category": "Travel & Places", + "aliases": ["sunrise"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌆", + "description": "cityscape at dusk", + "category": "Travel & Places", + "aliases": ["city_sunset"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌇", + "description": "sunset", + "category": "Travel & Places", + "aliases": ["city_sunrise"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌉", + "description": "bridge at night", + "category": "Travel & Places", + "aliases": ["bridge_at_night"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "♨️", + "description": "hot springs", + "category": "Travel & Places", + "aliases": ["hotsprings"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🎠", + "description": "carousel horse", + "category": "Travel & Places", + "aliases": ["carousel_horse"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎡", + "description": "ferris wheel", + "category": "Travel & Places", + "aliases": ["ferris_wheel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎢", + "description": "roller coaster", + "category": "Travel & Places", + "aliases": ["roller_coaster"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💈", + "description": "barber pole", + "category": "Travel & Places", + "aliases": ["barber"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎪", + "description": "circus tent", + "category": "Travel & Places", + "aliases": ["circus_tent"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚂", + "description": "locomotive", + "category": "Travel & Places", + "aliases": ["steam_locomotive"], + "tags": ["train"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚃", + "description": "railway car", + "category": "Travel & Places", + "aliases": ["railway_car"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚄", + "description": "high-speed train", + "category": "Travel & Places", + "aliases": ["bullettrain_side"], + "tags": ["train"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚅", + "description": "bullet train", + "category": "Travel & Places", + "aliases": ["bullettrain_front"], + "tags": ["train"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚆", + "description": "train", + "category": "Travel & Places", + "aliases": ["train2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚇", + "description": "metro", + "category": "Travel & Places", + "aliases": ["metro"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚈", + "description": "light rail", + "category": "Travel & Places", + "aliases": ["light_rail"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚉", + "description": "station", + "category": "Travel & Places", + "aliases": ["station"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚊", + "description": "tram", + "category": "Travel & Places", + "aliases": ["tram"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚝", + "description": "monorail", + "category": "Travel & Places", + "aliases": ["monorail"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚞", + "description": "mountain railway", + "category": "Travel & Places", + "aliases": ["mountain_railway"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚋", + "description": "tram car", + "category": "Travel & Places", + "aliases": ["train"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚌", + "description": "bus", + "category": "Travel & Places", + "aliases": ["bus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚍", + "description": "oncoming bus", + "category": "Travel & Places", + "aliases": ["oncoming_bus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚎", + "description": "trolleybus", + "category": "Travel & Places", + "aliases": ["trolleybus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚐", + "description": "minibus", + "category": "Travel & Places", + "aliases": ["minibus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚑", + "description": "ambulance", + "category": "Travel & Places", + "aliases": ["ambulance"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚒", + "description": "fire engine", + "category": "Travel & Places", + "aliases": ["fire_engine"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚓", + "description": "police car", + "category": "Travel & Places", + "aliases": ["police_car"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚔", + "description": "oncoming police car", + "category": "Travel & Places", + "aliases": ["oncoming_police_car"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚕", + "description": "taxi", + "category": "Travel & Places", + "aliases": ["taxi"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚖", + "description": "oncoming taxi", + "category": "Travel & Places", + "aliases": ["oncoming_taxi"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚗", + "description": "automobile", + "category": "Travel & Places", + "aliases": ["car", "red_car"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚘", + "description": "oncoming automobile", + "category": "Travel & Places", + "aliases": ["oncoming_automobile"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚙", + "description": "sport utility vehicle", + "category": "Travel & Places", + "aliases": ["blue_car"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛻", + "description": "pickup truck", + "category": "Travel & Places", + "aliases": ["pickup_truck"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🚚", + "description": "delivery truck", + "category": "Travel & Places", + "aliases": ["truck"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚛", + "description": "articulated lorry", + "category": "Travel & Places", + "aliases": ["articulated_lorry"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚜", + "description": "tractor", + "category": "Travel & Places", + "aliases": ["tractor"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏎️", + "description": "racing car", + "category": "Travel & Places", + "aliases": ["racing_car"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏍️", + "description": "motorcycle", + "category": "Travel & Places", + "aliases": ["motorcycle"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🛵", + "description": "motor scooter", + "category": "Travel & Places", + "aliases": ["motor_scooter"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🦽", + "description": "manual wheelchair", + "category": "Travel & Places", + "aliases": ["manual_wheelchair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🦼", + "description": "motorized wheelchair", + "category": "Travel & Places", + "aliases": ["motorized_wheelchair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🛺", + "description": "auto rickshaw", + "category": "Travel & Places", + "aliases": ["auto_rickshaw"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🚲", + "description": "bicycle", + "category": "Travel & Places", + "aliases": ["bike"], + "tags": ["bicycle"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛴", + "description": "kick scooter", + "category": "Travel & Places", + "aliases": ["kick_scooter"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🛹", + "description": "skateboard", + "category": "Travel & Places", + "aliases": ["skateboard"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🛼", + "description": "roller skate", + "category": "Travel & Places", + "aliases": ["roller_skate"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🚏", + "description": "bus stop", + "category": "Travel & Places", + "aliases": ["busstop"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛣️", + "description": "motorway", + "category": "Travel & Places", + "aliases": ["motorway"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🛤️", + "description": "railway track", + "category": "Travel & Places", + "aliases": ["railway_track"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🛢️", + "description": "oil drum", + "category": "Travel & Places", + "aliases": ["oil_drum"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⛽", + "description": "fuel pump", + "category": "Travel & Places", + "aliases": ["fuelpump"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🚨", + "description": "police car light", + "category": "Travel & Places", + "aliases": ["rotating_light"], + "tags": ["911", "emergency"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚥", + "description": "horizontal traffic light", + "category": "Travel & Places", + "aliases": ["traffic_light"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚦", + "description": "vertical traffic light", + "category": "Travel & Places", + "aliases": ["vertical_traffic_light"], + "tags": ["semaphore"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛑", + "description": "stop sign", + "category": "Travel & Places", + "aliases": ["stop_sign"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🚧", + "description": "construction", + "category": "Travel & Places", + "aliases": ["construction"], + "tags": ["wip"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⚓", + "description": "anchor", + "category": "Travel & Places", + "aliases": ["anchor"], + "tags": ["ship"], + "unicode_version": "4.1", + "ios_version": "6.0" + }, + { + "emoji": "⛵", + "description": "sailboat", + "category": "Travel & Places", + "aliases": ["boat", "sailboat"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🛶", + "description": "canoe", + "category": "Travel & Places", + "aliases": ["canoe"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🚤", + "description": "speedboat", + "category": "Travel & Places", + "aliases": ["speedboat"], + "tags": ["ship"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛳️", + "description": "passenger ship", + "category": "Travel & Places", + "aliases": ["passenger_ship"], + "tags": ["cruise"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⛴️", + "description": "ferry", + "category": "Travel & Places", + "aliases": ["ferry"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🛥️", + "description": "motor boat", + "category": "Travel & Places", + "aliases": ["motor_boat"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🚢", + "description": "ship", + "category": "Travel & Places", + "aliases": ["ship"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "✈️", + "description": "airplane", + "category": "Travel & Places", + "aliases": ["airplane"], + "tags": ["flight"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🛩️", + "description": "small airplane", + "category": "Travel & Places", + "aliases": ["small_airplane"], + "tags": ["flight"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🛫", + "description": "airplane departure", + "category": "Travel & Places", + "aliases": ["flight_departure"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🛬", + "description": "airplane arrival", + "category": "Travel & Places", + "aliases": ["flight_arrival"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🪂", + "description": "parachute", + "category": "Travel & Places", + "aliases": ["parachute"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "💺", + "description": "seat", + "category": "Travel & Places", + "aliases": ["seat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚁", + "description": "helicopter", + "category": "Travel & Places", + "aliases": ["helicopter"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚟", + "description": "suspension railway", + "category": "Travel & Places", + "aliases": ["suspension_railway"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚠", + "description": "mountain cableway", + "category": "Travel & Places", + "aliases": ["mountain_cableway"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚡", + "description": "aerial tramway", + "category": "Travel & Places", + "aliases": ["aerial_tramway"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛰️", + "description": "satellite", + "category": "Travel & Places", + "aliases": ["artificial_satellite"], + "tags": ["orbit", "space"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🚀", + "description": "rocket", + "category": "Travel & Places", + "aliases": ["rocket"], + "tags": ["ship", "launch"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛸", + "description": "flying saucer", + "category": "Travel & Places", + "aliases": ["flying_saucer"], + "tags": ["ufo"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🛎️", + "description": "bellhop bell", + "category": "Travel & Places", + "aliases": ["bellhop_bell"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🧳", + "description": "luggage", + "category": "Travel & Places", + "aliases": ["luggage"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "⌛", + "description": "hourglass done", + "category": "Travel & Places", + "aliases": ["hourglass"], + "tags": ["time"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⏳", + "description": "hourglass not done", + "category": "Travel & Places", + "aliases": ["hourglass_flowing_sand"], + "tags": ["time"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⌚", + "description": "watch", + "category": "Travel & Places", + "aliases": ["watch"], + "tags": ["time"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⏰", + "description": "alarm clock", + "category": "Travel & Places", + "aliases": ["alarm_clock"], + "tags": ["morning"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⏱️", + "description": "stopwatch", + "category": "Travel & Places", + "aliases": ["stopwatch"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.1" + }, + { + "emoji": "⏲️", + "description": "timer clock", + "category": "Travel & Places", + "aliases": ["timer_clock"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.1" + }, + { + "emoji": "🕰️", + "description": "mantelpiece clock", + "category": "Travel & Places", + "aliases": ["mantelpiece_clock"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🕛", + "description": "twelve o’clock", + "category": "Travel & Places", + "aliases": ["clock12"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕧", + "description": "twelve-thirty", + "category": "Travel & Places", + "aliases": ["clock1230"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕐", + "description": "one o’clock", + "category": "Travel & Places", + "aliases": ["clock1"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕜", + "description": "one-thirty", + "category": "Travel & Places", + "aliases": ["clock130"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕑", + "description": "two o’clock", + "category": "Travel & Places", + "aliases": ["clock2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕝", + "description": "two-thirty", + "category": "Travel & Places", + "aliases": ["clock230"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕒", + "description": "three o’clock", + "category": "Travel & Places", + "aliases": ["clock3"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕞", + "description": "three-thirty", + "category": "Travel & Places", + "aliases": ["clock330"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕓", + "description": "four o’clock", + "category": "Travel & Places", + "aliases": ["clock4"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕟", + "description": "four-thirty", + "category": "Travel & Places", + "aliases": ["clock430"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕔", + "description": "five o’clock", + "category": "Travel & Places", + "aliases": ["clock5"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕠", + "description": "five-thirty", + "category": "Travel & Places", + "aliases": ["clock530"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕕", + "description": "six o’clock", + "category": "Travel & Places", + "aliases": ["clock6"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕡", + "description": "six-thirty", + "category": "Travel & Places", + "aliases": ["clock630"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕖", + "description": "seven o’clock", + "category": "Travel & Places", + "aliases": ["clock7"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕢", + "description": "seven-thirty", + "category": "Travel & Places", + "aliases": ["clock730"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕗", + "description": "eight o’clock", + "category": "Travel & Places", + "aliases": ["clock8"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕣", + "description": "eight-thirty", + "category": "Travel & Places", + "aliases": ["clock830"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕘", + "description": "nine o’clock", + "category": "Travel & Places", + "aliases": ["clock9"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕤", + "description": "nine-thirty", + "category": "Travel & Places", + "aliases": ["clock930"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕙", + "description": "ten o’clock", + "category": "Travel & Places", + "aliases": ["clock10"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕥", + "description": "ten-thirty", + "category": "Travel & Places", + "aliases": ["clock1030"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕚", + "description": "eleven o’clock", + "category": "Travel & Places", + "aliases": ["clock11"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕦", + "description": "eleven-thirty", + "category": "Travel & Places", + "aliases": ["clock1130"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌑", + "description": "new moon", + "category": "Travel & Places", + "aliases": ["new_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌒", + "description": "waxing crescent moon", + "category": "Travel & Places", + "aliases": ["waxing_crescent_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌓", + "description": "first quarter moon", + "category": "Travel & Places", + "aliases": ["first_quarter_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌔", + "description": "waxing gibbous moon", + "category": "Travel & Places", + "aliases": ["moon", "waxing_gibbous_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌕", + "description": "full moon", + "category": "Travel & Places", + "aliases": ["full_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌖", + "description": "waning gibbous moon", + "category": "Travel & Places", + "aliases": ["waning_gibbous_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌗", + "description": "last quarter moon", + "category": "Travel & Places", + "aliases": ["last_quarter_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌘", + "description": "waning crescent moon", + "category": "Travel & Places", + "aliases": ["waning_crescent_moon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌙", + "description": "crescent moon", + "category": "Travel & Places", + "aliases": ["crescent_moon"], + "tags": ["night"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌚", + "description": "new moon face", + "category": "Travel & Places", + "aliases": ["new_moon_with_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌛", + "description": "first quarter moon face", + "category": "Travel & Places", + "aliases": ["first_quarter_moon_with_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌜", + "description": "last quarter moon face", + "category": "Travel & Places", + "aliases": ["last_quarter_moon_with_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌡️", + "description": "thermometer", + "category": "Travel & Places", + "aliases": ["thermometer"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "☀️", + "description": "sun", + "category": "Travel & Places", + "aliases": ["sunny"], + "tags": ["weather"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🌝", + "description": "full moon face", + "category": "Travel & Places", + "aliases": ["full_moon_with_face"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌞", + "description": "sun with face", + "category": "Travel & Places", + "aliases": ["sun_with_face"], + "tags": ["summer"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪐", + "description": "ringed planet", + "category": "Travel & Places", + "aliases": ["ringed_planet"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "⭐", + "description": "star", + "category": "Travel & Places", + "aliases": ["star"], + "tags": [], + "unicode_version": "5.1", + "ios_version": "6.0" + }, + { + "emoji": "🌟", + "description": "glowing star", + "category": "Travel & Places", + "aliases": ["star2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌠", + "description": "shooting star", + "category": "Travel & Places", + "aliases": ["stars"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌌", + "description": "milky way", + "category": "Travel & Places", + "aliases": ["milky_way"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☁️", + "description": "cloud", + "category": "Travel & Places", + "aliases": ["cloud"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⛅", + "description": "sun behind cloud", + "category": "Travel & Places", + "aliases": ["partly_sunny"], + "tags": ["weather", "cloud"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "⛈️", + "description": "cloud with lightning and rain", + "category": "Travel & Places", + "aliases": ["cloud_with_lightning_and_rain"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🌤️", + "description": "sun behind small cloud", + "category": "Travel & Places", + "aliases": ["sun_behind_small_cloud"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌥️", + "description": "sun behind large cloud", + "category": "Travel & Places", + "aliases": ["sun_behind_large_cloud"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌦️", + "description": "sun behind rain cloud", + "category": "Travel & Places", + "aliases": ["sun_behind_rain_cloud"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌧️", + "description": "cloud with rain", + "category": "Travel & Places", + "aliases": ["cloud_with_rain"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌨️", + "description": "cloud with snow", + "category": "Travel & Places", + "aliases": ["cloud_with_snow"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌩️", + "description": "cloud with lightning", + "category": "Travel & Places", + "aliases": ["cloud_with_lightning"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌪️", + "description": "tornado", + "category": "Travel & Places", + "aliases": ["tornado"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌫️", + "description": "fog", + "category": "Travel & Places", + "aliases": ["fog"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌬️", + "description": "wind face", + "category": "Travel & Places", + "aliases": ["wind_face"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🌀", + "description": "cyclone", + "category": "Travel & Places", + "aliases": ["cyclone"], + "tags": ["swirl"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌈", + "description": "rainbow", + "category": "Travel & Places", + "aliases": ["rainbow"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌂", + "description": "closed umbrella", + "category": "Travel & Places", + "aliases": ["closed_umbrella"], + "tags": ["weather", "rain"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☂️", + "description": "umbrella", + "category": "Travel & Places", + "aliases": ["open_umbrella"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☔", + "description": "umbrella with rain drops", + "category": "Travel & Places", + "aliases": ["umbrella"], + "tags": ["rain", "weather"], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "⛱️", + "description": "umbrella on ground", + "category": "Travel & Places", + "aliases": ["parasol_on_ground"], + "tags": ["beach_umbrella"], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "⚡", + "description": "high voltage", + "category": "Travel & Places", + "aliases": ["zap"], + "tags": ["lightning", "thunder"], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "❄️", + "description": "snowflake", + "category": "Travel & Places", + "aliases": ["snowflake"], + "tags": ["winter", "cold", "weather"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "☃️", + "description": "snowman", + "category": "Travel & Places", + "aliases": ["snowman_with_snow"], + "tags": ["winter", "christmas"], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "⛄", + "description": "snowman without snow", + "category": "Travel & Places", + "aliases": ["snowman"], + "tags": ["winter"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "☄️", + "description": "comet", + "category": "Travel & Places", + "aliases": ["comet"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "🔥", + "description": "fire", + "category": "Travel & Places", + "aliases": ["fire"], + "tags": ["burn"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💧", + "description": "droplet", + "category": "Travel & Places", + "aliases": ["droplet"], + "tags": ["water"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🌊", + "description": "water wave", + "category": "Travel & Places", + "aliases": ["ocean"], + "tags": ["sea"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎃", + "description": "jack-o-lantern", + "category": "Activities", + "aliases": ["jack_o_lantern"], + "tags": ["halloween"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎄", + "description": "Christmas tree", + "category": "Activities", + "aliases": ["christmas_tree"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎆", + "description": "fireworks", + "category": "Activities", + "aliases": ["fireworks"], + "tags": ["festival", "celebration"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎇", + "description": "sparkler", + "category": "Activities", + "aliases": ["sparkler"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧨", + "description": "firecracker", + "category": "Activities", + "aliases": ["firecracker"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "✨", + "description": "sparkles", + "category": "Activities", + "aliases": ["sparkles"], + "tags": ["shiny"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎈", + "description": "balloon", + "category": "Activities", + "aliases": ["balloon"], + "tags": ["party", "birthday"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎉", + "description": "party popper", + "category": "Activities", + "aliases": ["tada"], + "tags": ["hooray", "party"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎊", + "description": "confetti ball", + "category": "Activities", + "aliases": ["confetti_ball"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎋", + "description": "tanabata tree", + "category": "Activities", + "aliases": ["tanabata_tree"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎍", + "description": "pine decoration", + "category": "Activities", + "aliases": ["bamboo"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎎", + "description": "Japanese dolls", + "category": "Activities", + "aliases": ["dolls"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎏", + "description": "carp streamer", + "category": "Activities", + "aliases": ["flags"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎐", + "description": "wind chime", + "category": "Activities", + "aliases": ["wind_chime"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎑", + "description": "moon viewing ceremony", + "category": "Activities", + "aliases": ["rice_scene"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧧", + "description": "red envelope", + "category": "Activities", + "aliases": ["red_envelope"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🎀", + "description": "ribbon", + "category": "Activities", + "aliases": ["ribbon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎁", + "description": "wrapped gift", + "category": "Activities", + "aliases": ["gift"], + "tags": ["present", "birthday", "christmas"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎗️", + "description": "reminder ribbon", + "category": "Activities", + "aliases": ["reminder_ribbon"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎟️", + "description": "admission tickets", + "category": "Activities", + "aliases": ["tickets"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎫", + "description": "ticket", + "category": "Activities", + "aliases": ["ticket"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎖️", + "description": "military medal", + "category": "Activities", + "aliases": ["medal_military"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏆", + "description": "trophy", + "category": "Activities", + "aliases": ["trophy"], + "tags": ["award", "contest", "winner"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏅", + "description": "sports medal", + "category": "Activities", + "aliases": ["medal_sports"], + "tags": ["gold", "winner"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🥇", + "description": "1st place medal", + "category": "Activities", + "aliases": ["1st_place_medal"], + "tags": ["gold"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥈", + "description": "2nd place medal", + "category": "Activities", + "aliases": ["2nd_place_medal"], + "tags": ["silver"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥉", + "description": "3rd place medal", + "category": "Activities", + "aliases": ["3rd_place_medal"], + "tags": ["bronze"], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "⚽", + "description": "soccer ball", + "category": "Activities", + "aliases": ["soccer"], + "tags": ["sports"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "⚾", + "description": "baseball", + "category": "Activities", + "aliases": ["baseball"], + "tags": ["sports"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🥎", + "description": "softball", + "category": "Activities", + "aliases": ["softball"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🏀", + "description": "basketball", + "category": "Activities", + "aliases": ["basketball"], + "tags": ["sports"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏐", + "description": "volleyball", + "category": "Activities", + "aliases": ["volleyball"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🏈", + "description": "american football", + "category": "Activities", + "aliases": ["football"], + "tags": ["sports"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏉", + "description": "rugby football", + "category": "Activities", + "aliases": ["rugby_football"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎾", + "description": "tennis", + "category": "Activities", + "aliases": ["tennis"], + "tags": ["sports"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥏", + "description": "flying disc", + "category": "Activities", + "aliases": ["flying_disc"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🎳", + "description": "bowling", + "category": "Activities", + "aliases": ["bowling"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏏", + "description": "cricket game", + "category": "Activities", + "aliases": ["cricket_game"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🏑", + "description": "field hockey", + "category": "Activities", + "aliases": ["field_hockey"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🏒", + "description": "ice hockey", + "category": "Activities", + "aliases": ["ice_hockey"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🥍", + "description": "lacrosse", + "category": "Activities", + "aliases": ["lacrosse"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🏓", + "description": "ping pong", + "category": "Activities", + "aliases": ["ping_pong"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🏸", + "description": "badminton", + "category": "Activities", + "aliases": ["badminton"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🥊", + "description": "boxing glove", + "category": "Activities", + "aliases": ["boxing_glove"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥋", + "description": "martial arts uniform", + "category": "Activities", + "aliases": ["martial_arts_uniform"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🥅", + "description": "goal net", + "category": "Activities", + "aliases": ["goal_net"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "⛳", + "description": "flag in hole", + "category": "Activities", + "aliases": ["golf"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "⛸️", + "description": "ice skate", + "category": "Activities", + "aliases": ["ice_skate"], + "tags": ["skating"], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🎣", + "description": "fishing pole", + "category": "Activities", + "aliases": ["fishing_pole_and_fish"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🤿", + "description": "diving mask", + "category": "Activities", + "aliases": ["diving_mask"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🎽", + "description": "running shirt", + "category": "Activities", + "aliases": ["running_shirt_with_sash"], + "tags": ["marathon"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎿", + "description": "skis", + "category": "Activities", + "aliases": ["ski"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛷", + "description": "sled", + "category": "Activities", + "aliases": ["sled"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥌", + "description": "curling stone", + "category": "Activities", + "aliases": ["curling_stone"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🎯", + "description": "bullseye", + "category": "Activities", + "aliases": ["dart"], + "tags": ["target"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪀", + "description": "yo-yo", + "category": "Activities", + "aliases": ["yo_yo"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🪁", + "description": "kite", + "category": "Activities", + "aliases": ["kite"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🎱", + "description": "pool 8 ball", + "category": "Activities", + "aliases": ["8ball"], + "tags": ["pool", "billiards"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔮", + "description": "crystal ball", + "category": "Activities", + "aliases": ["crystal_ball"], + "tags": ["fortune"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪄", + "description": "magic wand", + "category": "Activities", + "aliases": ["magic_wand"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🧿", + "description": "nazar amulet", + "category": "Activities", + "aliases": ["nazar_amulet"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🎮", + "description": "video game", + "category": "Activities", + "aliases": ["video_game"], + "tags": ["play", "controller", "console"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕹️", + "description": "joystick", + "category": "Activities", + "aliases": ["joystick"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎰", + "description": "slot machine", + "category": "Activities", + "aliases": ["slot_machine"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎲", + "description": "game die", + "category": "Activities", + "aliases": ["game_die"], + "tags": ["dice", "gambling"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧩", + "description": "puzzle piece", + "category": "Activities", + "aliases": ["jigsaw"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧸", + "description": "teddy bear", + "category": "Activities", + "aliases": ["teddy_bear"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪅", + "description": "piñata", + "category": "Activities", + "aliases": ["pinata"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪆", + "description": "nesting dolls", + "category": "Activities", + "aliases": ["nesting_dolls"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "♠️", + "description": "spade suit", + "category": "Activities", + "aliases": ["spades"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♥️", + "description": "heart suit", + "category": "Activities", + "aliases": ["hearts"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♦️", + "description": "diamond suit", + "category": "Activities", + "aliases": ["diamonds"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♣️", + "description": "club suit", + "category": "Activities", + "aliases": ["clubs"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♟️", + "description": "chess pawn", + "category": "Activities", + "aliases": ["chess_pawn"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🃏", + "description": "joker", + "category": "Activities", + "aliases": ["black_joker"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🀄", + "description": "mahjong red dragon", + "category": "Activities", + "aliases": ["mahjong"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🎴", + "description": "flower playing cards", + "category": "Activities", + "aliases": ["flower_playing_cards"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎭", + "description": "performing arts", + "category": "Activities", + "aliases": ["performing_arts"], + "tags": ["theater", "drama"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🖼️", + "description": "framed picture", + "category": "Activities", + "aliases": ["framed_picture"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎨", + "description": "artist palette", + "category": "Activities", + "aliases": ["art"], + "tags": ["design", "paint"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧵", + "description": "thread", + "category": "Activities", + "aliases": ["thread"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪡", + "description": "sewing needle", + "category": "Activities", + "aliases": ["sewing_needle"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🧶", + "description": "yarn", + "category": "Activities", + "aliases": ["yarn"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪢", + "description": "knot", + "category": "Activities", + "aliases": ["knot"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "👓", + "description": "glasses", + "category": "Objects", + "aliases": ["eyeglasses"], + "tags": ["glasses"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕶️", + "description": "sunglasses", + "category": "Objects", + "aliases": ["dark_sunglasses"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🥽", + "description": "goggles", + "category": "Objects", + "aliases": ["goggles"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥼", + "description": "lab coat", + "category": "Objects", + "aliases": ["lab_coat"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🦺", + "description": "safety vest", + "category": "Objects", + "aliases": ["safety_vest"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "👔", + "description": "necktie", + "category": "Objects", + "aliases": ["necktie"], + "tags": ["shirt", "formal"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👕", + "description": "t-shirt", + "category": "Objects", + "aliases": ["shirt", "tshirt"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👖", + "description": "jeans", + "category": "Objects", + "aliases": ["jeans"], + "tags": ["pants"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧣", + "description": "scarf", + "category": "Objects", + "aliases": ["scarf"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧤", + "description": "gloves", + "category": "Objects", + "aliases": ["gloves"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧥", + "description": "coat", + "category": "Objects", + "aliases": ["coat"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧦", + "description": "socks", + "category": "Objects", + "aliases": ["socks"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "👗", + "description": "dress", + "category": "Objects", + "aliases": ["dress"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👘", + "description": "kimono", + "category": "Objects", + "aliases": ["kimono"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥻", + "description": "sari", + "category": "Objects", + "aliases": ["sari"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🩱", + "description": "one-piece swimsuit", + "category": "Objects", + "aliases": ["one_piece_swimsuit"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🩲", + "description": "briefs", + "category": "Objects", + "aliases": ["swim_brief"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🩳", + "description": "shorts", + "category": "Objects", + "aliases": ["shorts"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "👙", + "description": "bikini", + "category": "Objects", + "aliases": ["bikini"], + "tags": ["beach"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👚", + "description": "woman’s clothes", + "category": "Objects", + "aliases": ["womans_clothes"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👛", + "description": "purse", + "category": "Objects", + "aliases": ["purse"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👜", + "description": "handbag", + "category": "Objects", + "aliases": ["handbag"], + "tags": ["bag"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👝", + "description": "clutch bag", + "category": "Objects", + "aliases": ["pouch"], + "tags": ["bag"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛍️", + "description": "shopping bags", + "category": "Objects", + "aliases": ["shopping"], + "tags": ["bags"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎒", + "description": "backpack", + "category": "Objects", + "aliases": ["school_satchel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🩴", + "description": "thong sandal", + "category": "Objects", + "aliases": ["thong_sandal"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "👞", + "description": "man’s shoe", + "category": "Objects", + "aliases": ["mans_shoe", "shoe"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👟", + "description": "running shoe", + "category": "Objects", + "aliases": ["athletic_shoe"], + "tags": ["sneaker", "sport", "running"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🥾", + "description": "hiking boot", + "category": "Objects", + "aliases": ["hiking_boot"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🥿", + "description": "flat shoe", + "category": "Objects", + "aliases": ["flat_shoe"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "👠", + "description": "high-heeled shoe", + "category": "Objects", + "aliases": ["high_heel"], + "tags": ["shoe"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👡", + "description": "woman’s sandal", + "category": "Objects", + "aliases": ["sandal"], + "tags": ["shoe"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🩰", + "description": "ballet shoes", + "category": "Objects", + "aliases": ["ballet_shoes"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "👢", + "description": "woman’s boot", + "category": "Objects", + "aliases": ["boot"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👑", + "description": "crown", + "category": "Objects", + "aliases": ["crown"], + "tags": ["king", "queen", "royal"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "👒", + "description": "woman’s hat", + "category": "Objects", + "aliases": ["womans_hat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎩", + "description": "top hat", + "category": "Objects", + "aliases": ["tophat"], + "tags": ["hat", "classy"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎓", + "description": "graduation cap", + "category": "Objects", + "aliases": ["mortar_board"], + "tags": ["education", "college", "university", "graduation"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧢", + "description": "billed cap", + "category": "Objects", + "aliases": ["billed_cap"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪖", + "description": "military helmet", + "category": "Objects", + "aliases": ["military_helmet"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "⛑️", + "description": "rescue worker’s helmet", + "category": "Objects", + "aliases": ["rescue_worker_helmet"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "📿", + "description": "prayer beads", + "category": "Objects", + "aliases": ["prayer_beads"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "💄", + "description": "lipstick", + "category": "Objects", + "aliases": ["lipstick"], + "tags": ["makeup"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💍", + "description": "ring", + "category": "Objects", + "aliases": ["ring"], + "tags": ["wedding", "marriage", "engaged"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💎", + "description": "gem stone", + "category": "Objects", + "aliases": ["gem"], + "tags": ["diamond"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔇", + "description": "muted speaker", + "category": "Objects", + "aliases": ["mute"], + "tags": ["sound", "volume"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔈", + "description": "speaker low volume", + "category": "Objects", + "aliases": ["speaker"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔉", + "description": "speaker medium volume", + "category": "Objects", + "aliases": ["sound"], + "tags": ["volume"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔊", + "description": "speaker high volume", + "category": "Objects", + "aliases": ["loud_sound"], + "tags": ["volume"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📢", + "description": "loudspeaker", + "category": "Objects", + "aliases": ["loudspeaker"], + "tags": ["announcement"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📣", + "description": "megaphone", + "category": "Objects", + "aliases": ["mega"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📯", + "description": "postal horn", + "category": "Objects", + "aliases": ["postal_horn"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔔", + "description": "bell", + "category": "Objects", + "aliases": ["bell"], + "tags": ["sound", "notification"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔕", + "description": "bell with slash", + "category": "Objects", + "aliases": ["no_bell"], + "tags": ["volume", "off"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎼", + "description": "musical score", + "category": "Objects", + "aliases": ["musical_score"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎵", + "description": "musical note", + "category": "Objects", + "aliases": ["musical_note"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎶", + "description": "musical notes", + "category": "Objects", + "aliases": ["notes"], + "tags": ["music"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎙️", + "description": "studio microphone", + "category": "Objects", + "aliases": ["studio_microphone"], + "tags": ["podcast"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎚️", + "description": "level slider", + "category": "Objects", + "aliases": ["level_slider"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎛️", + "description": "control knobs", + "category": "Objects", + "aliases": ["control_knobs"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎤", + "description": "microphone", + "category": "Objects", + "aliases": ["microphone"], + "tags": ["sing"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎧", + "description": "headphone", + "category": "Objects", + "aliases": ["headphones"], + "tags": ["music", "earphones"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📻", + "description": "radio", + "category": "Objects", + "aliases": ["radio"], + "tags": ["podcast"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎷", + "description": "saxophone", + "category": "Objects", + "aliases": ["saxophone"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪗", + "description": "accordion", + "category": "Objects", + "aliases": ["accordion"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🎸", + "description": "guitar", + "category": "Objects", + "aliases": ["guitar"], + "tags": ["rock"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎹", + "description": "musical keyboard", + "category": "Objects", + "aliases": ["musical_keyboard"], + "tags": ["piano"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎺", + "description": "trumpet", + "category": "Objects", + "aliases": ["trumpet"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎻", + "description": "violin", + "category": "Objects", + "aliases": ["violin"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪕", + "description": "banjo", + "category": "Objects", + "aliases": ["banjo"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🥁", + "description": "drum", + "category": "Objects", + "aliases": ["drum"], + "tags": [], + "unicode_version": "", + "ios_version": "10.2" + }, + { + "emoji": "🪘", + "description": "long drum", + "category": "Objects", + "aliases": ["long_drum"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "📱", + "description": "mobile phone", + "category": "Objects", + "aliases": ["iphone"], + "tags": ["smartphone", "mobile"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📲", + "description": "mobile phone with arrow", + "category": "Objects", + "aliases": ["calling"], + "tags": ["call", "incoming"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☎️", + "description": "telephone", + "category": "Objects", + "aliases": ["phone", "telephone"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "📞", + "description": "telephone receiver", + "category": "Objects", + "aliases": ["telephone_receiver"], + "tags": ["phone", "call"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📟", + "description": "pager", + "category": "Objects", + "aliases": ["pager"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📠", + "description": "fax machine", + "category": "Objects", + "aliases": ["fax"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔋", + "description": "battery", + "category": "Objects", + "aliases": ["battery"], + "tags": ["power"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔌", + "description": "electric plug", + "category": "Objects", + "aliases": ["electric_plug"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💻", + "description": "laptop", + "category": "Objects", + "aliases": ["computer"], + "tags": ["desktop", "screen"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🖥️", + "description": "desktop computer", + "category": "Objects", + "aliases": ["desktop_computer"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🖨️", + "description": "printer", + "category": "Objects", + "aliases": ["printer"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⌨️", + "description": "keyboard", + "category": "Objects", + "aliases": ["keyboard"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "🖱️", + "description": "computer mouse", + "category": "Objects", + "aliases": ["computer_mouse"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🖲️", + "description": "trackball", + "category": "Objects", + "aliases": ["trackball"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "💽", + "description": "computer disk", + "category": "Objects", + "aliases": ["minidisc"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💾", + "description": "floppy disk", + "category": "Objects", + "aliases": ["floppy_disk"], + "tags": ["save"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💿", + "description": "optical disk", + "category": "Objects", + "aliases": ["cd"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📀", + "description": "dvd", + "category": "Objects", + "aliases": ["dvd"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧮", + "description": "abacus", + "category": "Objects", + "aliases": ["abacus"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🎥", + "description": "movie camera", + "category": "Objects", + "aliases": ["movie_camera"], + "tags": ["film", "video"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎞️", + "description": "film frames", + "category": "Objects", + "aliases": ["film_strip"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📽️", + "description": "film projector", + "category": "Objects", + "aliases": ["film_projector"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🎬", + "description": "clapper board", + "category": "Objects", + "aliases": ["clapper"], + "tags": ["film"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📺", + "description": "television", + "category": "Objects", + "aliases": ["tv"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📷", + "description": "camera", + "category": "Objects", + "aliases": ["camera"], + "tags": ["photo"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📸", + "description": "camera with flash", + "category": "Objects", + "aliases": ["camera_flash"], + "tags": ["photo"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📹", + "description": "video camera", + "category": "Objects", + "aliases": ["video_camera"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📼", + "description": "videocassette", + "category": "Objects", + "aliases": ["vhs"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔍", + "description": "magnifying glass tilted left", + "category": "Objects", + "aliases": ["mag"], + "tags": ["search", "zoom"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔎", + "description": "magnifying glass tilted right", + "category": "Objects", + "aliases": ["mag_right"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🕯️", + "description": "candle", + "category": "Objects", + "aliases": ["candle"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "💡", + "description": "light bulb", + "category": "Objects", + "aliases": ["bulb"], + "tags": ["idea", "light"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔦", + "description": "flashlight", + "category": "Objects", + "aliases": ["flashlight"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏮", + "description": "red paper lantern", + "category": "Objects", + "aliases": ["izakaya_lantern", "lantern"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪔", + "description": "diya lamp", + "category": "Objects", + "aliases": ["diya_lamp"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "📔", + "description": "notebook with decorative cover", + "category": "Objects", + "aliases": ["notebook_with_decorative_cover"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📕", + "description": "closed book", + "category": "Objects", + "aliases": ["closed_book"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📖", + "description": "open book", + "category": "Objects", + "aliases": ["book", "open_book"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📗", + "description": "green book", + "category": "Objects", + "aliases": ["green_book"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📘", + "description": "blue book", + "category": "Objects", + "aliases": ["blue_book"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📙", + "description": "orange book", + "category": "Objects", + "aliases": ["orange_book"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📚", + "description": "books", + "category": "Objects", + "aliases": ["books"], + "tags": ["library"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📓", + "description": "notebook", + "category": "Objects", + "aliases": ["notebook"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📒", + "description": "ledger", + "category": "Objects", + "aliases": ["ledger"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📃", + "description": "page with curl", + "category": "Objects", + "aliases": ["page_with_curl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📜", + "description": "scroll", + "category": "Objects", + "aliases": ["scroll"], + "tags": ["document"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📄", + "description": "page facing up", + "category": "Objects", + "aliases": ["page_facing_up"], + "tags": ["document"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📰", + "description": "newspaper", + "category": "Objects", + "aliases": ["newspaper"], + "tags": ["press"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗞️", + "description": "rolled-up newspaper", + "category": "Objects", + "aliases": ["newspaper_roll"], + "tags": ["press"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📑", + "description": "bookmark tabs", + "category": "Objects", + "aliases": ["bookmark_tabs"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔖", + "description": "bookmark", + "category": "Objects", + "aliases": ["bookmark"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏷️", + "description": "label", + "category": "Objects", + "aliases": ["label"], + "tags": ["tag"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "💰", + "description": "money bag", + "category": "Objects", + "aliases": ["moneybag"], + "tags": ["dollar", "cream"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪙", + "description": "coin", + "category": "Objects", + "aliases": ["coin"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "💴", + "description": "yen banknote", + "category": "Objects", + "aliases": ["yen"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💵", + "description": "dollar banknote", + "category": "Objects", + "aliases": ["dollar"], + "tags": ["money"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💶", + "description": "euro banknote", + "category": "Objects", + "aliases": ["euro"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💷", + "description": "pound banknote", + "category": "Objects", + "aliases": ["pound"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💸", + "description": "money with wings", + "category": "Objects", + "aliases": ["money_with_wings"], + "tags": ["dollar"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💳", + "description": "credit card", + "category": "Objects", + "aliases": ["credit_card"], + "tags": ["subscription"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🧾", + "description": "receipt", + "category": "Objects", + "aliases": ["receipt"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "💹", + "description": "chart increasing with yen", + "category": "Objects", + "aliases": ["chart"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "✉️", + "description": "envelope", + "category": "Objects", + "aliases": ["envelope"], + "tags": ["letter", "email"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "📧", + "description": "e-mail", + "category": "Objects", + "aliases": ["email", "e-mail"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📨", + "description": "incoming envelope", + "category": "Objects", + "aliases": ["incoming_envelope"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📩", + "description": "envelope with arrow", + "category": "Objects", + "aliases": ["envelope_with_arrow"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📤", + "description": "outbox tray", + "category": "Objects", + "aliases": ["outbox_tray"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📥", + "description": "inbox tray", + "category": "Objects", + "aliases": ["inbox_tray"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📦", + "description": "package", + "category": "Objects", + "aliases": ["package"], + "tags": ["shipping"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📫", + "description": "closed mailbox with raised flag", + "category": "Objects", + "aliases": ["mailbox"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📪", + "description": "closed mailbox with lowered flag", + "category": "Objects", + "aliases": ["mailbox_closed"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📬", + "description": "open mailbox with raised flag", + "category": "Objects", + "aliases": ["mailbox_with_mail"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📭", + "description": "open mailbox with lowered flag", + "category": "Objects", + "aliases": ["mailbox_with_no_mail"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📮", + "description": "postbox", + "category": "Objects", + "aliases": ["postbox"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗳️", + "description": "ballot box with ballot", + "category": "Objects", + "aliases": ["ballot_box"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "✏️", + "description": "pencil", + "category": "Objects", + "aliases": ["pencil2"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "✒️", + "description": "black nib", + "category": "Objects", + "aliases": ["black_nib"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🖋️", + "description": "fountain pen", + "category": "Objects", + "aliases": ["fountain_pen"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🖊️", + "description": "pen", + "category": "Objects", + "aliases": ["pen"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🖌️", + "description": "paintbrush", + "category": "Objects", + "aliases": ["paintbrush"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🖍️", + "description": "crayon", + "category": "Objects", + "aliases": ["crayon"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📝", + "description": "memo", + "category": "Objects", + "aliases": ["memo", "pencil"], + "tags": ["document", "note"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💼", + "description": "briefcase", + "category": "Objects", + "aliases": ["briefcase"], + "tags": ["business"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📁", + "description": "file folder", + "category": "Objects", + "aliases": ["file_folder"], + "tags": ["directory"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📂", + "description": "open file folder", + "category": "Objects", + "aliases": ["open_file_folder"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗂️", + "description": "card index dividers", + "category": "Objects", + "aliases": ["card_index_dividers"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📅", + "description": "calendar", + "category": "Objects", + "aliases": ["date"], + "tags": ["calendar", "schedule"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📆", + "description": "tear-off calendar", + "category": "Objects", + "aliases": ["calendar"], + "tags": ["schedule"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗒️", + "description": "spiral notepad", + "category": "Objects", + "aliases": ["spiral_notepad"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🗓️", + "description": "spiral calendar", + "category": "Objects", + "aliases": ["spiral_calendar"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📇", + "description": "card index", + "category": "Objects", + "aliases": ["card_index"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📈", + "description": "chart increasing", + "category": "Objects", + "aliases": ["chart_with_upwards_trend"], + "tags": ["graph", "metrics"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📉", + "description": "chart decreasing", + "category": "Objects", + "aliases": ["chart_with_downwards_trend"], + "tags": ["graph", "metrics"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📊", + "description": "bar chart", + "category": "Objects", + "aliases": ["bar_chart"], + "tags": ["stats", "metrics"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📋", + "description": "clipboard", + "category": "Objects", + "aliases": ["clipboard"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📌", + "description": "pushpin", + "category": "Objects", + "aliases": ["pushpin"], + "tags": ["location"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📍", + "description": "round pushpin", + "category": "Objects", + "aliases": ["round_pushpin"], + "tags": ["location"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📎", + "description": "paperclip", + "category": "Objects", + "aliases": ["paperclip"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🖇️", + "description": "linked paperclips", + "category": "Objects", + "aliases": ["paperclips"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "📏", + "description": "straight ruler", + "category": "Objects", + "aliases": ["straight_ruler"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📐", + "description": "triangular ruler", + "category": "Objects", + "aliases": ["triangular_ruler"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "✂️", + "description": "scissors", + "category": "Objects", + "aliases": ["scissors"], + "tags": ["cut"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🗃️", + "description": "card file box", + "category": "Objects", + "aliases": ["card_file_box"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🗄️", + "description": "file cabinet", + "category": "Objects", + "aliases": ["file_cabinet"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🗑️", + "description": "wastebasket", + "category": "Objects", + "aliases": ["wastebasket"], + "tags": ["trash"], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🔒", + "description": "locked", + "category": "Objects", + "aliases": ["lock"], + "tags": ["security", "private"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔓", + "description": "unlocked", + "category": "Objects", + "aliases": ["unlock"], + "tags": ["security"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔏", + "description": "locked with pen", + "category": "Objects", + "aliases": ["lock_with_ink_pen"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔐", + "description": "locked with key", + "category": "Objects", + "aliases": ["closed_lock_with_key"], + "tags": ["security"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔑", + "description": "key", + "category": "Objects", + "aliases": ["key"], + "tags": ["lock", "password"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🗝️", + "description": "old key", + "category": "Objects", + "aliases": ["old_key"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🔨", + "description": "hammer", + "category": "Objects", + "aliases": ["hammer"], + "tags": ["tool"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪓", + "description": "axe", + "category": "Objects", + "aliases": ["axe"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "⛏️", + "description": "pick", + "category": "Objects", + "aliases": ["pick"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "⚒️", + "description": "hammer and pick", + "category": "Objects", + "aliases": ["hammer_and_pick"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🛠️", + "description": "hammer and wrench", + "category": "Objects", + "aliases": ["hammer_and_wrench"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🗡️", + "description": "dagger", + "category": "Objects", + "aliases": ["dagger"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⚔️", + "description": "crossed swords", + "category": "Objects", + "aliases": ["crossed_swords"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🔫", + "description": "water pistol", + "category": "Objects", + "aliases": ["gun"], + "tags": ["shoot", "weapon"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪃", + "description": "boomerang", + "category": "Objects", + "aliases": ["boomerang"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🏹", + "description": "bow and arrow", + "category": "Objects", + "aliases": ["bow_and_arrow"], + "tags": ["archery"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🛡️", + "description": "shield", + "category": "Objects", + "aliases": ["shield"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🪚", + "description": "carpentry saw", + "category": "Objects", + "aliases": ["carpentry_saw"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🔧", + "description": "wrench", + "category": "Objects", + "aliases": ["wrench"], + "tags": ["tool"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪛", + "description": "screwdriver", + "category": "Objects", + "aliases": ["screwdriver"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🔩", + "description": "nut and bolt", + "category": "Objects", + "aliases": ["nut_and_bolt"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⚙️", + "description": "gear", + "category": "Objects", + "aliases": ["gear"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🗜️", + "description": "clamp", + "category": "Objects", + "aliases": ["clamp"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⚖️", + "description": "balance scale", + "category": "Objects", + "aliases": ["balance_scale"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🦯", + "description": "white cane", + "category": "Objects", + "aliases": ["probing_cane"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🔗", + "description": "link", + "category": "Objects", + "aliases": ["link"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⛓️", + "description": "chains", + "category": "Objects", + "aliases": ["chains"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "9.1" + }, + { + "emoji": "🪝", + "description": "hook", + "category": "Objects", + "aliases": ["hook"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🧰", + "description": "toolbox", + "category": "Objects", + "aliases": ["toolbox"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧲", + "description": "magnet", + "category": "Objects", + "aliases": ["magnet"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪜", + "description": "ladder", + "category": "Objects", + "aliases": ["ladder"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "⚗️", + "description": "alembic", + "category": "Objects", + "aliases": ["alembic"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🧪", + "description": "test tube", + "category": "Objects", + "aliases": ["test_tube"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧫", + "description": "petri dish", + "category": "Objects", + "aliases": ["petri_dish"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧬", + "description": "dna", + "category": "Objects", + "aliases": ["dna"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🔬", + "description": "microscope", + "category": "Objects", + "aliases": ["microscope"], + "tags": ["science", "laboratory", "investigate"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔭", + "description": "telescope", + "category": "Objects", + "aliases": ["telescope"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📡", + "description": "satellite antenna", + "category": "Objects", + "aliases": ["satellite"], + "tags": ["signal"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💉", + "description": "syringe", + "category": "Objects", + "aliases": ["syringe"], + "tags": ["health", "hospital", "needle"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🩸", + "description": "drop of blood", + "category": "Objects", + "aliases": ["drop_of_blood"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "💊", + "description": "pill", + "category": "Objects", + "aliases": ["pill"], + "tags": ["health", "medicine"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🩹", + "description": "adhesive bandage", + "category": "Objects", + "aliases": ["adhesive_bandage"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🩺", + "description": "stethoscope", + "category": "Objects", + "aliases": ["stethoscope"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🚪", + "description": "door", + "category": "Objects", + "aliases": ["door"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛗", + "description": "elevator", + "category": "Objects", + "aliases": ["elevator"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪞", + "description": "mirror", + "category": "Objects", + "aliases": ["mirror"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪟", + "description": "window", + "category": "Objects", + "aliases": ["window"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🛏️", + "description": "bed", + "category": "Objects", + "aliases": ["bed"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🛋️", + "description": "couch and lamp", + "category": "Objects", + "aliases": ["couch_and_lamp"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🪑", + "description": "chair", + "category": "Objects", + "aliases": ["chair"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🚽", + "description": "toilet", + "category": "Objects", + "aliases": ["toilet"], + "tags": ["wc"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪠", + "description": "plunger", + "category": "Objects", + "aliases": ["plunger"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🚿", + "description": "shower", + "category": "Objects", + "aliases": ["shower"], + "tags": ["bath"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛁", + "description": "bathtub", + "category": "Objects", + "aliases": ["bathtub"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪤", + "description": "mouse trap", + "category": "Objects", + "aliases": ["mouse_trap"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🪒", + "description": "razor", + "category": "Objects", + "aliases": ["razor"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🧴", + "description": "lotion bottle", + "category": "Objects", + "aliases": ["lotion_bottle"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧷", + "description": "safety pin", + "category": "Objects", + "aliases": ["safety_pin"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧹", + "description": "broom", + "category": "Objects", + "aliases": ["broom"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧺", + "description": "basket", + "category": "Objects", + "aliases": ["basket"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧻", + "description": "roll of paper", + "category": "Objects", + "aliases": ["roll_of_paper"], + "tags": ["toilet"], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪣", + "description": "bucket", + "category": "Objects", + "aliases": ["bucket"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🧼", + "description": "soap", + "category": "Objects", + "aliases": ["soap"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🪥", + "description": "toothbrush", + "category": "Objects", + "aliases": ["toothbrush"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🧽", + "description": "sponge", + "category": "Objects", + "aliases": ["sponge"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🧯", + "description": "fire extinguisher", + "category": "Objects", + "aliases": ["fire_extinguisher"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🛒", + "description": "shopping cart", + "category": "Objects", + "aliases": ["shopping_cart"], + "tags": [], + "unicode_version": "9.0", + "ios_version": "10.2" + }, + { + "emoji": "🚬", + "description": "cigarette", + "category": "Objects", + "aliases": ["smoking"], + "tags": ["cigarette"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⚰️", + "description": "coffin", + "category": "Objects", + "aliases": ["coffin"], + "tags": ["funeral"], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🪦", + "description": "headstone", + "category": "Objects", + "aliases": ["headstone"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "⚱️", + "description": "funeral urn", + "category": "Objects", + "aliases": ["funeral_urn"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🗿", + "description": "moai", + "category": "Objects", + "aliases": ["moyai"], + "tags": ["stone"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🪧", + "description": "placard", + "category": "Objects", + "aliases": ["placard"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🏧", + "description": "ATM sign", + "category": "Symbols", + "aliases": ["atm"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚮", + "description": "litter in bin sign", + "category": "Symbols", + "aliases": ["put_litter_in_its_place"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚰", + "description": "potable water", + "category": "Symbols", + "aliases": ["potable_water"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "♿", + "description": "wheelchair symbol", + "category": "Symbols", + "aliases": ["wheelchair"], + "tags": ["accessibility"], + "unicode_version": "4.1", + "ios_version": "6.0" + }, + { + "emoji": "🚹", + "description": "men’s room", + "category": "Symbols", + "aliases": ["mens"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚺", + "description": "women’s room", + "category": "Symbols", + "aliases": ["womens"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚻", + "description": "restroom", + "category": "Symbols", + "aliases": ["restroom"], + "tags": ["toilet"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚼", + "description": "baby symbol", + "category": "Symbols", + "aliases": ["baby_symbol"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚾", + "description": "water closet", + "category": "Symbols", + "aliases": ["wc"], + "tags": ["toilet", "restroom"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛂", + "description": "passport control", + "category": "Symbols", + "aliases": ["passport_control"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛃", + "description": "customs", + "category": "Symbols", + "aliases": ["customs"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛄", + "description": "baggage claim", + "category": "Symbols", + "aliases": ["baggage_claim"], + "tags": ["airport"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛅", + "description": "left luggage", + "category": "Symbols", + "aliases": ["left_luggage"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⚠️", + "description": "warning", + "category": "Symbols", + "aliases": ["warning"], + "tags": ["wip"], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "🚸", + "description": "children crossing", + "category": "Symbols", + "aliases": ["children_crossing"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⛔", + "description": "no entry", + "category": "Symbols", + "aliases": ["no_entry"], + "tags": ["limit"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🚫", + "description": "prohibited", + "category": "Symbols", + "aliases": ["no_entry_sign"], + "tags": ["block", "forbidden"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚳", + "description": "no bicycles", + "category": "Symbols", + "aliases": ["no_bicycles"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚭", + "description": "no smoking", + "category": "Symbols", + "aliases": ["no_smoking"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚯", + "description": "no littering", + "category": "Symbols", + "aliases": ["do_not_litter"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚱", + "description": "non-potable water", + "category": "Symbols", + "aliases": ["non-potable_water"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚷", + "description": "no pedestrians", + "category": "Symbols", + "aliases": ["no_pedestrians"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📵", + "description": "no mobile phones", + "category": "Symbols", + "aliases": ["no_mobile_phones"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔞", + "description": "no one under eighteen", + "category": "Symbols", + "aliases": ["underage"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☢️", + "description": "radioactive", + "category": "Symbols", + "aliases": ["radioactive"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☣️", + "description": "biohazard", + "category": "Symbols", + "aliases": ["biohazard"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "⬆️", + "description": "up arrow", + "category": "Symbols", + "aliases": ["arrow_up"], + "tags": [], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "↗️", + "description": "up-right arrow", + "category": "Symbols", + "aliases": ["arrow_upper_right"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "➡️", + "description": "right arrow", + "category": "Symbols", + "aliases": ["arrow_right"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "↘️", + "description": "down-right arrow", + "category": "Symbols", + "aliases": ["arrow_lower_right"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⬇️", + "description": "down arrow", + "category": "Symbols", + "aliases": ["arrow_down"], + "tags": [], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "↙️", + "description": "down-left arrow", + "category": "Symbols", + "aliases": ["arrow_lower_left"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⬅️", + "description": "left arrow", + "category": "Symbols", + "aliases": ["arrow_left"], + "tags": [], + "unicode_version": "4.0", + "ios_version": "6.0" + }, + { + "emoji": "↖️", + "description": "up-left arrow", + "category": "Symbols", + "aliases": ["arrow_upper_left"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "↕️", + "description": "up-down arrow", + "category": "Symbols", + "aliases": ["arrow_up_down"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "↔️", + "description": "left-right arrow", + "category": "Symbols", + "aliases": ["left_right_arrow"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "↩️", + "description": "right arrow curving left", + "category": "Symbols", + "aliases": ["leftwards_arrow_with_hook"], + "tags": ["return"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "↪️", + "description": "left arrow curving right", + "category": "Symbols", + "aliases": ["arrow_right_hook"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⤴️", + "description": "right arrow curving up", + "category": "Symbols", + "aliases": ["arrow_heading_up"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⤵️", + "description": "right arrow curving down", + "category": "Symbols", + "aliases": ["arrow_heading_down"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🔃", + "description": "clockwise vertical arrows", + "category": "Symbols", + "aliases": ["arrows_clockwise"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔄", + "description": "counterclockwise arrows button", + "category": "Symbols", + "aliases": ["arrows_counterclockwise"], + "tags": ["sync"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔙", + "description": "BACK arrow", + "category": "Symbols", + "aliases": ["back"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔚", + "description": "END arrow", + "category": "Symbols", + "aliases": ["end"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔛", + "description": "ON! arrow", + "category": "Symbols", + "aliases": ["on"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔜", + "description": "SOON arrow", + "category": "Symbols", + "aliases": ["soon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔝", + "description": "TOP arrow", + "category": "Symbols", + "aliases": ["top"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🛐", + "description": "place of worship", + "category": "Symbols", + "aliases": ["place_of_worship"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "⚛️", + "description": "atom symbol", + "category": "Symbols", + "aliases": ["atom_symbol"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🕉️", + "description": "om", + "category": "Symbols", + "aliases": ["om"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "✡️", + "description": "star of David", + "category": "Symbols", + "aliases": ["star_of_david"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☸️", + "description": "wheel of dharma", + "category": "Symbols", + "aliases": ["wheel_of_dharma"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☯️", + "description": "yin yang", + "category": "Symbols", + "aliases": ["yin_yang"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "✝️", + "description": "latin cross", + "category": "Symbols", + "aliases": ["latin_cross"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☦️", + "description": "orthodox cross", + "category": "Symbols", + "aliases": ["orthodox_cross"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☪️", + "description": "star and crescent", + "category": "Symbols", + "aliases": ["star_and_crescent"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "☮️", + "description": "peace symbol", + "category": "Symbols", + "aliases": ["peace_symbol"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "🕎", + "description": "menorah", + "category": "Symbols", + "aliases": ["menorah"], + "tags": [], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🔯", + "description": "dotted six-pointed star", + "category": "Symbols", + "aliases": ["six_pointed_star"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "♈", + "description": "Aries", + "category": "Symbols", + "aliases": ["aries"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♉", + "description": "Taurus", + "category": "Symbols", + "aliases": ["taurus"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♊", + "description": "Gemini", + "category": "Symbols", + "aliases": ["gemini"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♋", + "description": "Cancer", + "category": "Symbols", + "aliases": ["cancer"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♌", + "description": "Leo", + "category": "Symbols", + "aliases": ["leo"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♍", + "description": "Virgo", + "category": "Symbols", + "aliases": ["virgo"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♎", + "description": "Libra", + "category": "Symbols", + "aliases": ["libra"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♏", + "description": "Scorpio", + "category": "Symbols", + "aliases": ["scorpius"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♐", + "description": "Sagittarius", + "category": "Symbols", + "aliases": ["sagittarius"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♑", + "description": "Capricorn", + "category": "Symbols", + "aliases": ["capricorn"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♒", + "description": "Aquarius", + "category": "Symbols", + "aliases": ["aquarius"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "♓", + "description": "Pisces", + "category": "Symbols", + "aliases": ["pisces"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⛎", + "description": "Ophiuchus", + "category": "Symbols", + "aliases": ["ophiuchus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔀", + "description": "shuffle tracks button", + "category": "Symbols", + "aliases": ["twisted_rightwards_arrows"], + "tags": ["shuffle"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔁", + "description": "repeat button", + "category": "Symbols", + "aliases": ["repeat"], + "tags": ["loop"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔂", + "description": "repeat single button", + "category": "Symbols", + "aliases": ["repeat_one"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "▶️", + "description": "play button", + "category": "Symbols", + "aliases": ["arrow_forward"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⏩", + "description": "fast-forward button", + "category": "Symbols", + "aliases": ["fast_forward"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⏭️", + "description": "next track button", + "category": "Symbols", + "aliases": ["next_track_button"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.1" + }, + { + "emoji": "⏯️", + "description": "play or pause button", + "category": "Symbols", + "aliases": ["play_or_pause_button"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.1" + }, + { + "emoji": "◀️", + "description": "reverse button", + "category": "Symbols", + "aliases": ["arrow_backward"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⏪", + "description": "fast reverse button", + "category": "Symbols", + "aliases": ["rewind"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⏮️", + "description": "last track button", + "category": "Symbols", + "aliases": ["previous_track_button"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.1" + }, + { + "emoji": "🔼", + "description": "upwards button", + "category": "Symbols", + "aliases": ["arrow_up_small"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⏫", + "description": "fast up button", + "category": "Symbols", + "aliases": ["arrow_double_up"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔽", + "description": "downwards button", + "category": "Symbols", + "aliases": ["arrow_down_small"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⏬", + "description": "fast down button", + "category": "Symbols", + "aliases": ["arrow_double_down"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⏸️", + "description": "pause button", + "category": "Symbols", + "aliases": ["pause_button"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⏹️", + "description": "stop button", + "category": "Symbols", + "aliases": ["stop_button"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⏺️", + "description": "record button", + "category": "Symbols", + "aliases": ["record_button"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "⏏️", + "description": "eject button", + "category": "Symbols", + "aliases": ["eject_button"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🎦", + "description": "cinema", + "category": "Symbols", + "aliases": ["cinema"], + "tags": ["film", "movie"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔅", + "description": "dim button", + "category": "Symbols", + "aliases": ["low_brightness"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔆", + "description": "bright button", + "category": "Symbols", + "aliases": ["high_brightness"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📶", + "description": "antenna bars", + "category": "Symbols", + "aliases": ["signal_strength"], + "tags": ["wifi"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📳", + "description": "vibration mode", + "category": "Symbols", + "aliases": ["vibration_mode"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📴", + "description": "mobile phone off", + "category": "Symbols", + "aliases": ["mobile_phone_off"], + "tags": ["mute", "off"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "♀️", + "description": "female sign", + "category": "Symbols", + "aliases": ["female_sign"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "♂️", + "description": "male sign", + "category": "Symbols", + "aliases": ["male_sign"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "⚧️", + "description": "transgender symbol", + "category": "Symbols", + "aliases": ["transgender_symbol"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "✖️", + "description": "multiply", + "category": "Symbols", + "aliases": ["heavy_multiplication_x"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "➕", + "description": "plus", + "category": "Symbols", + "aliases": ["heavy_plus_sign"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "➖", + "description": "minus", + "category": "Symbols", + "aliases": ["heavy_minus_sign"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "➗", + "description": "divide", + "category": "Symbols", + "aliases": ["heavy_division_sign"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "♾️", + "description": "infinity", + "category": "Symbols", + "aliases": ["infinity"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "‼️", + "description": "double exclamation mark", + "category": "Symbols", + "aliases": ["bangbang"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "⁉️", + "description": "exclamation question mark", + "category": "Symbols", + "aliases": ["interrobang"], + "tags": [], + "unicode_version": "3.0", + "ios_version": "6.0" + }, + { + "emoji": "❓", + "description": "red question mark", + "category": "Symbols", + "aliases": ["question"], + "tags": ["confused"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "❔", + "description": "white question mark", + "category": "Symbols", + "aliases": ["grey_question"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "❕", + "description": "white exclamation mark", + "category": "Symbols", + "aliases": ["grey_exclamation"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "❗", + "description": "red exclamation mark", + "category": "Symbols", + "aliases": ["exclamation", "heavy_exclamation_mark"], + "tags": ["bang"], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "〰️", + "description": "wavy dash", + "category": "Symbols", + "aliases": ["wavy_dash"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "💱", + "description": "currency exchange", + "category": "Symbols", + "aliases": ["currency_exchange"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💲", + "description": "heavy dollar sign", + "category": "Symbols", + "aliases": ["heavy_dollar_sign"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⚕️", + "description": "medical symbol", + "category": "Symbols", + "aliases": ["medical_symbol"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "♻️", + "description": "recycling symbol", + "category": "Symbols", + "aliases": ["recycle"], + "tags": ["environment", "green"], + "unicode_version": "3.2", + "ios_version": "6.0" + }, + { + "emoji": "⚜️", + "description": "fleur-de-lis", + "category": "Symbols", + "aliases": ["fleur_de_lis"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "9.1" + }, + { + "emoji": "🔱", + "description": "trident emblem", + "category": "Symbols", + "aliases": ["trident"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "📛", + "description": "name badge", + "category": "Symbols", + "aliases": ["name_badge"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔰", + "description": "Japanese symbol for beginner", + "category": "Symbols", + "aliases": ["beginner"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "⭕", + "description": "hollow red circle", + "category": "Symbols", + "aliases": ["o"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "✅", + "description": "check mark button", + "category": "Symbols", + "aliases": ["white_check_mark"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "☑️", + "description": "check box with check", + "category": "Symbols", + "aliases": ["ballot_box_with_check"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "✔️", + "description": "check mark", + "category": "Symbols", + "aliases": ["heavy_check_mark"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "❌", + "description": "cross mark", + "category": "Symbols", + "aliases": ["x"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "❎", + "description": "cross mark button", + "category": "Symbols", + "aliases": ["negative_squared_cross_mark"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "➰", + "description": "curly loop", + "category": "Symbols", + "aliases": ["curly_loop"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "➿", + "description": "double curly loop", + "category": "Symbols", + "aliases": ["loop"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "〽️", + "description": "part alternation mark", + "category": "Symbols", + "aliases": ["part_alternation_mark"], + "tags": [], + "unicode_version": "3.2", + "ios_version": "6.0" + }, + { + "emoji": "✳️", + "description": "eight-spoked asterisk", + "category": "Symbols", + "aliases": ["eight_spoked_asterisk"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "✴️", + "description": "eight-pointed star", + "category": "Symbols", + "aliases": ["eight_pointed_black_star"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "❇️", + "description": "sparkle", + "category": "Symbols", + "aliases": ["sparkle"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "©️", + "description": "copyright", + "category": "Symbols", + "aliases": ["copyright"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "®️", + "description": "registered", + "category": "Symbols", + "aliases": ["registered"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "™️", + "description": "trade mark", + "category": "Symbols", + "aliases": ["tm"], + "tags": ["trademark"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "#️⃣", + "description": "keycap: #", + "category": "Symbols", + "aliases": ["hash"], + "tags": ["number"], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "*️⃣", + "description": "keycap: *", + "category": "Symbols", + "aliases": ["asterisk"], + "tags": [], + "unicode_version": "", + "ios_version": "9.1" + }, + { + "emoji": "0️⃣", + "description": "keycap: 0", + "category": "Symbols", + "aliases": ["zero"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "1️⃣", + "description": "keycap: 1", + "category": "Symbols", + "aliases": ["one"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "2️⃣", + "description": "keycap: 2", + "category": "Symbols", + "aliases": ["two"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "3️⃣", + "description": "keycap: 3", + "category": "Symbols", + "aliases": ["three"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "4️⃣", + "description": "keycap: 4", + "category": "Symbols", + "aliases": ["four"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "5️⃣", + "description": "keycap: 5", + "category": "Symbols", + "aliases": ["five"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "6️⃣", + "description": "keycap: 6", + "category": "Symbols", + "aliases": ["six"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "7️⃣", + "description": "keycap: 7", + "category": "Symbols", + "aliases": ["seven"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "8️⃣", + "description": "keycap: 8", + "category": "Symbols", + "aliases": ["eight"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "9️⃣", + "description": "keycap: 9", + "category": "Symbols", + "aliases": ["nine"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🔟", + "description": "keycap: 10", + "category": "Symbols", + "aliases": ["keycap_ten"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔠", + "description": "input latin uppercase", + "category": "Symbols", + "aliases": ["capital_abcd"], + "tags": ["letters"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔡", + "description": "input latin lowercase", + "category": "Symbols", + "aliases": ["abcd"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔢", + "description": "input numbers", + "category": "Symbols", + "aliases": ["1234"], + "tags": ["numbers"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔣", + "description": "input symbols", + "category": "Symbols", + "aliases": ["symbols"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔤", + "description": "input latin letters", + "category": "Symbols", + "aliases": ["abc"], + "tags": ["alphabet"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🅰️", + "description": "A button (blood type)", + "category": "Symbols", + "aliases": ["a"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆎", + "description": "AB button (blood type)", + "category": "Symbols", + "aliases": ["ab"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🅱️", + "description": "B button (blood type)", + "category": "Symbols", + "aliases": ["b"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆑", + "description": "CL button", + "category": "Symbols", + "aliases": ["cl"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆒", + "description": "COOL button", + "category": "Symbols", + "aliases": ["cool"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆓", + "description": "FREE button", + "category": "Symbols", + "aliases": ["free"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "ℹ️", + "description": "information", + "category": "Symbols", + "aliases": ["information_source"], + "tags": [], + "unicode_version": "3.0", + "ios_version": "6.0" + }, + { + "emoji": "🆔", + "description": "ID button", + "category": "Symbols", + "aliases": ["id"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "Ⓜ️", + "description": "circled M", + "category": "Symbols", + "aliases": ["m"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🆕", + "description": "NEW button", + "category": "Symbols", + "aliases": ["new"], + "tags": ["fresh"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆖", + "description": "NG button", + "category": "Symbols", + "aliases": ["ng"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🅾️", + "description": "O button (blood type)", + "category": "Symbols", + "aliases": ["o2"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆗", + "description": "OK button", + "category": "Symbols", + "aliases": ["ok"], + "tags": ["yes"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🅿️", + "description": "P button", + "category": "Symbols", + "aliases": ["parking"], + "tags": [], + "unicode_version": "5.2", + "ios_version": "6.0" + }, + { + "emoji": "🆘", + "description": "SOS button", + "category": "Symbols", + "aliases": ["sos"], + "tags": ["help", "emergency"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆙", + "description": "UP! button", + "category": "Symbols", + "aliases": ["up"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🆚", + "description": "VS button", + "category": "Symbols", + "aliases": ["vs"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈁", + "description": "Japanese “here” button", + "category": "Symbols", + "aliases": ["koko"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈂️", + "description": "Japanese “service charge” button", + "category": "Symbols", + "aliases": ["sa"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈷️", + "description": "Japanese “monthly amount” button", + "category": "Symbols", + "aliases": ["u6708"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈶", + "description": "Japanese “not free of charge” button", + "category": "Symbols", + "aliases": ["u6709"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈯", + "description": "Japanese “reserved” button", + "category": "Symbols", + "aliases": ["u6307"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🉐", + "description": "Japanese “bargain” button", + "category": "Symbols", + "aliases": ["ideograph_advantage"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈹", + "description": "Japanese “discount” button", + "category": "Symbols", + "aliases": ["u5272"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈚", + "description": "Japanese “free of charge” button", + "category": "Symbols", + "aliases": ["u7121"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🈲", + "description": "Japanese “prohibited” button", + "category": "Symbols", + "aliases": ["u7981"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🉑", + "description": "Japanese “acceptable” button", + "category": "Symbols", + "aliases": ["accept"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈸", + "description": "Japanese “application” button", + "category": "Symbols", + "aliases": ["u7533"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈴", + "description": "Japanese “passing grade” button", + "category": "Symbols", + "aliases": ["u5408"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈳", + "description": "Japanese “vacancy” button", + "category": "Symbols", + "aliases": ["u7a7a"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "㊗️", + "description": "Japanese “congratulations” button", + "category": "Symbols", + "aliases": ["congratulations"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "㊙️", + "description": "Japanese “secret” button", + "category": "Symbols", + "aliases": ["secret"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🈺", + "description": "Japanese “open for business” button", + "category": "Symbols", + "aliases": ["u55b6"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🈵", + "description": "Japanese “no vacancy” button", + "category": "Symbols", + "aliases": ["u6e80"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔴", + "description": "red circle", + "category": "Symbols", + "aliases": ["red_circle"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🟠", + "description": "orange circle", + "category": "Symbols", + "aliases": ["orange_circle"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟡", + "description": "yellow circle", + "category": "Symbols", + "aliases": ["yellow_circle"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟢", + "description": "green circle", + "category": "Symbols", + "aliases": ["green_circle"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🔵", + "description": "blue circle", + "category": "Symbols", + "aliases": ["large_blue_circle"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🟣", + "description": "purple circle", + "category": "Symbols", + "aliases": ["purple_circle"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟤", + "description": "brown circle", + "category": "Symbols", + "aliases": ["brown_circle"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "⚫", + "description": "black circle", + "category": "Symbols", + "aliases": ["black_circle"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "6.0" + }, + { + "emoji": "⚪", + "description": "white circle", + "category": "Symbols", + "aliases": ["white_circle"], + "tags": [], + "unicode_version": "4.1", + "ios_version": "6.0" + }, + { + "emoji": "🟥", + "description": "red square", + "category": "Symbols", + "aliases": ["red_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟧", + "description": "orange square", + "category": "Symbols", + "aliases": ["orange_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟨", + "description": "yellow square", + "category": "Symbols", + "aliases": ["yellow_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟩", + "description": "green square", + "category": "Symbols", + "aliases": ["green_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟦", + "description": "blue square", + "category": "Symbols", + "aliases": ["blue_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟪", + "description": "purple square", + "category": "Symbols", + "aliases": ["purple_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "🟫", + "description": "brown square", + "category": "Symbols", + "aliases": ["brown_square"], + "tags": [], + "unicode_version": "12.0", + "ios_version": "13.0" + }, + { + "emoji": "⬛", + "description": "black large square", + "category": "Symbols", + "aliases": ["black_large_square"], + "tags": [], + "unicode_version": "5.1", + "ios_version": "6.0" + }, + { + "emoji": "⬜", + "description": "white large square", + "category": "Symbols", + "aliases": ["white_large_square"], + "tags": [], + "unicode_version": "5.1", + "ios_version": "6.0" + }, + { + "emoji": "◼️", + "description": "black medium square", + "category": "Symbols", + "aliases": ["black_medium_square"], + "tags": [], + "unicode_version": "3.2", + "ios_version": "6.0" + }, + { + "emoji": "◻️", + "description": "white medium square", + "category": "Symbols", + "aliases": ["white_medium_square"], + "tags": [], + "unicode_version": "3.2", + "ios_version": "6.0" + }, + { + "emoji": "◾", + "description": "black medium-small square", + "category": "Symbols", + "aliases": ["black_medium_small_square"], + "tags": [], + "unicode_version": "3.2", + "ios_version": "6.0" + }, + { + "emoji": "◽", + "description": "white medium-small square", + "category": "Symbols", + "aliases": ["white_medium_small_square"], + "tags": [], + "unicode_version": "3.2", + "ios_version": "6.0" + }, + { + "emoji": "▪️", + "description": "black small square", + "category": "Symbols", + "aliases": ["black_small_square"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "▫️", + "description": "white small square", + "category": "Symbols", + "aliases": ["white_small_square"], + "tags": [], + "unicode_version": "", + "ios_version": "6.0" + }, + { + "emoji": "🔶", + "description": "large orange diamond", + "category": "Symbols", + "aliases": ["large_orange_diamond"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔷", + "description": "large blue diamond", + "category": "Symbols", + "aliases": ["large_blue_diamond"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔸", + "description": "small orange diamond", + "category": "Symbols", + "aliases": ["small_orange_diamond"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔹", + "description": "small blue diamond", + "category": "Symbols", + "aliases": ["small_blue_diamond"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔺", + "description": "red triangle pointed up", + "category": "Symbols", + "aliases": ["small_red_triangle"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔻", + "description": "red triangle pointed down", + "category": "Symbols", + "aliases": ["small_red_triangle_down"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "💠", + "description": "diamond with a dot", + "category": "Symbols", + "aliases": ["diamond_shape_with_a_dot_inside"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔘", + "description": "radio button", + "category": "Symbols", + "aliases": ["radio_button"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔳", + "description": "white square button", + "category": "Symbols", + "aliases": ["white_square_button"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🔲", + "description": "black square button", + "category": "Symbols", + "aliases": ["black_square_button"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏁", + "description": "chequered flag", + "category": "Flags", + "aliases": ["checkered_flag"], + "tags": ["milestone", "finish"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🚩", + "description": "triangular flag", + "category": "Flags", + "aliases": ["triangular_flag_on_post"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🎌", + "description": "crossed flags", + "category": "Flags", + "aliases": ["crossed_flags"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🏴", + "description": "black flag", + "category": "Flags", + "aliases": ["black_flag"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏳️", + "description": "white flag", + "category": "Flags", + "aliases": ["white_flag"], + "tags": [], + "unicode_version": "7.0", + "ios_version": "9.1" + }, + { + "emoji": "🏳️‍🌈", + "description": "rainbow flag", + "category": "Flags", + "aliases": ["rainbow_flag"], + "tags": ["pride"], + "unicode_version": "6.0", + "ios_version": "10.0" + }, + { + "emoji": "🏳️‍⚧️", + "description": "transgender flag", + "category": "Flags", + "aliases": ["transgender_flag"], + "tags": [], + "unicode_version": "13.0", + "ios_version": "14.0" + }, + { + "emoji": "🏴‍☠️", + "description": "pirate flag", + "category": "Flags", + "aliases": ["pirate_flag"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇦🇨", + "description": "flag: Ascension Island", + "category": "Flags", + "aliases": ["ascension_island"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇦🇩", + "description": "flag: Andorra", + "category": "Flags", + "aliases": ["andorra"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇪", + "description": "flag: United Arab Emirates", + "category": "Flags", + "aliases": ["united_arab_emirates"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇫", + "description": "flag: Afghanistan", + "category": "Flags", + "aliases": ["afghanistan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇬", + "description": "flag: Antigua & Barbuda", + "category": "Flags", + "aliases": ["antigua_barbuda"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇮", + "description": "flag: Anguilla", + "category": "Flags", + "aliases": ["anguilla"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇱", + "description": "flag: Albania", + "category": "Flags", + "aliases": ["albania"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇲", + "description": "flag: Armenia", + "category": "Flags", + "aliases": ["armenia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇴", + "description": "flag: Angola", + "category": "Flags", + "aliases": ["angola"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇶", + "description": "flag: Antarctica", + "category": "Flags", + "aliases": ["antarctica"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇦🇷", + "description": "flag: Argentina", + "category": "Flags", + "aliases": ["argentina"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇸", + "description": "flag: American Samoa", + "category": "Flags", + "aliases": ["american_samoa"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇹", + "description": "flag: Austria", + "category": "Flags", + "aliases": ["austria"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇺", + "description": "flag: Australia", + "category": "Flags", + "aliases": ["australia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇼", + "description": "flag: Aruba", + "category": "Flags", + "aliases": ["aruba"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇦🇽", + "description": "flag: Åland Islands", + "category": "Flags", + "aliases": ["aland_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇦🇿", + "description": "flag: Azerbaijan", + "category": "Flags", + "aliases": ["azerbaijan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇦", + "description": "flag: Bosnia & Herzegovina", + "category": "Flags", + "aliases": ["bosnia_herzegovina"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇧", + "description": "flag: Barbados", + "category": "Flags", + "aliases": ["barbados"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇩", + "description": "flag: Bangladesh", + "category": "Flags", + "aliases": ["bangladesh"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇪", + "description": "flag: Belgium", + "category": "Flags", + "aliases": ["belgium"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇫", + "description": "flag: Burkina Faso", + "category": "Flags", + "aliases": ["burkina_faso"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇬", + "description": "flag: Bulgaria", + "category": "Flags", + "aliases": ["bulgaria"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇭", + "description": "flag: Bahrain", + "category": "Flags", + "aliases": ["bahrain"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇮", + "description": "flag: Burundi", + "category": "Flags", + "aliases": ["burundi"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇯", + "description": "flag: Benin", + "category": "Flags", + "aliases": ["benin"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇱", + "description": "flag: St. Barthélemy", + "category": "Flags", + "aliases": ["st_barthelemy"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇧🇲", + "description": "flag: Bermuda", + "category": "Flags", + "aliases": ["bermuda"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇳", + "description": "flag: Brunei", + "category": "Flags", + "aliases": ["brunei"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇴", + "description": "flag: Bolivia", + "category": "Flags", + "aliases": ["bolivia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇶", + "description": "flag: Caribbean Netherlands", + "category": "Flags", + "aliases": ["caribbean_netherlands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇧🇷", + "description": "flag: Brazil", + "category": "Flags", + "aliases": ["brazil"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇸", + "description": "flag: Bahamas", + "category": "Flags", + "aliases": ["bahamas"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇹", + "description": "flag: Bhutan", + "category": "Flags", + "aliases": ["bhutan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇻", + "description": "flag: Bouvet Island", + "category": "Flags", + "aliases": ["bouvet_island"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇧🇼", + "description": "flag: Botswana", + "category": "Flags", + "aliases": ["botswana"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇾", + "description": "flag: Belarus", + "category": "Flags", + "aliases": ["belarus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇧🇿", + "description": "flag: Belize", + "category": "Flags", + "aliases": ["belize"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇦", + "description": "flag: Canada", + "category": "Flags", + "aliases": ["canada"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇨", + "description": "flag: Cocos (Keeling) Islands", + "category": "Flags", + "aliases": ["cocos_islands"], + "tags": ["keeling"], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇨🇩", + "description": "flag: Congo - Kinshasa", + "category": "Flags", + "aliases": ["congo_kinshasa"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇫", + "description": "flag: Central African Republic", + "category": "Flags", + "aliases": ["central_african_republic"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇬", + "description": "flag: Congo - Brazzaville", + "category": "Flags", + "aliases": ["congo_brazzaville"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇭", + "description": "flag: Switzerland", + "category": "Flags", + "aliases": ["switzerland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇮", + "description": "flag: Côte d’Ivoire", + "category": "Flags", + "aliases": ["cote_divoire"], + "tags": ["ivory"], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇰", + "description": "flag: Cook Islands", + "category": "Flags", + "aliases": ["cook_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇱", + "description": "flag: Chile", + "category": "Flags", + "aliases": ["chile"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇲", + "description": "flag: Cameroon", + "category": "Flags", + "aliases": ["cameroon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇳", + "description": "flag: China", + "category": "Flags", + "aliases": ["cn"], + "tags": ["china"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇨🇴", + "description": "flag: Colombia", + "category": "Flags", + "aliases": ["colombia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇵", + "description": "flag: Clipperton Island", + "category": "Flags", + "aliases": ["clipperton_island"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇨🇷", + "description": "flag: Costa Rica", + "category": "Flags", + "aliases": ["costa_rica"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇺", + "description": "flag: Cuba", + "category": "Flags", + "aliases": ["cuba"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇻", + "description": "flag: Cape Verde", + "category": "Flags", + "aliases": ["cape_verde"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇼", + "description": "flag: Curaçao", + "category": "Flags", + "aliases": ["curacao"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇽", + "description": "flag: Christmas Island", + "category": "Flags", + "aliases": ["christmas_island"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇨🇾", + "description": "flag: Cyprus", + "category": "Flags", + "aliases": ["cyprus"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇨🇿", + "description": "flag: Czechia", + "category": "Flags", + "aliases": ["czech_republic"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇩🇪", + "description": "flag: Germany", + "category": "Flags", + "aliases": ["de"], + "tags": ["flag", "germany"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇩🇬", + "description": "flag: Diego Garcia", + "category": "Flags", + "aliases": ["diego_garcia"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇩🇯", + "description": "flag: Djibouti", + "category": "Flags", + "aliases": ["djibouti"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇩🇰", + "description": "flag: Denmark", + "category": "Flags", + "aliases": ["denmark"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇩🇲", + "description": "flag: Dominica", + "category": "Flags", + "aliases": ["dominica"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇩🇴", + "description": "flag: Dominican Republic", + "category": "Flags", + "aliases": ["dominican_republic"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇩🇿", + "description": "flag: Algeria", + "category": "Flags", + "aliases": ["algeria"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇪🇦", + "description": "flag: Ceuta & Melilla", + "category": "Flags", + "aliases": ["ceuta_melilla"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇪🇨", + "description": "flag: Ecuador", + "category": "Flags", + "aliases": ["ecuador"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇪🇪", + "description": "flag: Estonia", + "category": "Flags", + "aliases": ["estonia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇪🇬", + "description": "flag: Egypt", + "category": "Flags", + "aliases": ["egypt"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇪🇭", + "description": "flag: Western Sahara", + "category": "Flags", + "aliases": ["western_sahara"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇪🇷", + "description": "flag: Eritrea", + "category": "Flags", + "aliases": ["eritrea"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇪🇸", + "description": "flag: Spain", + "category": "Flags", + "aliases": ["es"], + "tags": ["spain"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇪🇹", + "description": "flag: Ethiopia", + "category": "Flags", + "aliases": ["ethiopia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇪🇺", + "description": "flag: European Union", + "category": "Flags", + "aliases": ["eu", "european_union"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇫🇮", + "description": "flag: Finland", + "category": "Flags", + "aliases": ["finland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇫🇯", + "description": "flag: Fiji", + "category": "Flags", + "aliases": ["fiji"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇫🇰", + "description": "flag: Falkland Islands", + "category": "Flags", + "aliases": ["falkland_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇫🇲", + "description": "flag: Micronesia", + "category": "Flags", + "aliases": ["micronesia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇫🇴", + "description": "flag: Faroe Islands", + "category": "Flags", + "aliases": ["faroe_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇫🇷", + "description": "flag: France", + "category": "Flags", + "aliases": ["fr"], + "tags": ["france", "french"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇬🇦", + "description": "flag: Gabon", + "category": "Flags", + "aliases": ["gabon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇧", + "description": "flag: United Kingdom", + "category": "Flags", + "aliases": ["gb", "uk"], + "tags": ["flag", "british"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇬🇩", + "description": "flag: Grenada", + "category": "Flags", + "aliases": ["grenada"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇪", + "description": "flag: Georgia", + "category": "Flags", + "aliases": ["georgia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇫", + "description": "flag: French Guiana", + "category": "Flags", + "aliases": ["french_guiana"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇬", + "description": "flag: Guernsey", + "category": "Flags", + "aliases": ["guernsey"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇬🇭", + "description": "flag: Ghana", + "category": "Flags", + "aliases": ["ghana"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇮", + "description": "flag: Gibraltar", + "category": "Flags", + "aliases": ["gibraltar"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇱", + "description": "flag: Greenland", + "category": "Flags", + "aliases": ["greenland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇬🇲", + "description": "flag: Gambia", + "category": "Flags", + "aliases": ["gambia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇳", + "description": "flag: Guinea", + "category": "Flags", + "aliases": ["guinea"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇵", + "description": "flag: Guadeloupe", + "category": "Flags", + "aliases": ["guadeloupe"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇬🇶", + "description": "flag: Equatorial Guinea", + "category": "Flags", + "aliases": ["equatorial_guinea"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇷", + "description": "flag: Greece", + "category": "Flags", + "aliases": ["greece"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇸", + "description": "flag: South Georgia & South Sandwich Islands", + "category": "Flags", + "aliases": ["south_georgia_south_sandwich_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇬🇹", + "description": "flag: Guatemala", + "category": "Flags", + "aliases": ["guatemala"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇺", + "description": "flag: Guam", + "category": "Flags", + "aliases": ["guam"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇼", + "description": "flag: Guinea-Bissau", + "category": "Flags", + "aliases": ["guinea_bissau"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇬🇾", + "description": "flag: Guyana", + "category": "Flags", + "aliases": ["guyana"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇭🇰", + "description": "flag: Hong Kong SAR China", + "category": "Flags", + "aliases": ["hong_kong"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇭🇲", + "description": "flag: Heard & McDonald Islands", + "category": "Flags", + "aliases": ["heard_mcdonald_islands"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇭🇳", + "description": "flag: Honduras", + "category": "Flags", + "aliases": ["honduras"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇭🇷", + "description": "flag: Croatia", + "category": "Flags", + "aliases": ["croatia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇭🇹", + "description": "flag: Haiti", + "category": "Flags", + "aliases": ["haiti"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇭🇺", + "description": "flag: Hungary", + "category": "Flags", + "aliases": ["hungary"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇨", + "description": "flag: Canary Islands", + "category": "Flags", + "aliases": ["canary_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇮🇩", + "description": "flag: Indonesia", + "category": "Flags", + "aliases": ["indonesia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇪", + "description": "flag: Ireland", + "category": "Flags", + "aliases": ["ireland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇱", + "description": "flag: Israel", + "category": "Flags", + "aliases": ["israel"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇲", + "description": "flag: Isle of Man", + "category": "Flags", + "aliases": ["isle_of_man"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇮🇳", + "description": "flag: India", + "category": "Flags", + "aliases": ["india"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇴", + "description": "flag: British Indian Ocean Territory", + "category": "Flags", + "aliases": ["british_indian_ocean_territory"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇮🇶", + "description": "flag: Iraq", + "category": "Flags", + "aliases": ["iraq"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇷", + "description": "flag: Iran", + "category": "Flags", + "aliases": ["iran"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇸", + "description": "flag: Iceland", + "category": "Flags", + "aliases": ["iceland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇮🇹", + "description": "flag: Italy", + "category": "Flags", + "aliases": ["it"], + "tags": ["italy"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇯🇪", + "description": "flag: Jersey", + "category": "Flags", + "aliases": ["jersey"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇯🇲", + "description": "flag: Jamaica", + "category": "Flags", + "aliases": ["jamaica"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇯🇴", + "description": "flag: Jordan", + "category": "Flags", + "aliases": ["jordan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇯🇵", + "description": "flag: Japan", + "category": "Flags", + "aliases": ["jp"], + "tags": ["japan"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇰🇪", + "description": "flag: Kenya", + "category": "Flags", + "aliases": ["kenya"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇬", + "description": "flag: Kyrgyzstan", + "category": "Flags", + "aliases": ["kyrgyzstan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇭", + "description": "flag: Cambodia", + "category": "Flags", + "aliases": ["cambodia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇮", + "description": "flag: Kiribati", + "category": "Flags", + "aliases": ["kiribati"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇲", + "description": "flag: Comoros", + "category": "Flags", + "aliases": ["comoros"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇳", + "description": "flag: St. Kitts & Nevis", + "category": "Flags", + "aliases": ["st_kitts_nevis"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇵", + "description": "flag: North Korea", + "category": "Flags", + "aliases": ["north_korea"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇷", + "description": "flag: South Korea", + "category": "Flags", + "aliases": ["kr"], + "tags": ["korea"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇰🇼", + "description": "flag: Kuwait", + "category": "Flags", + "aliases": ["kuwait"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇾", + "description": "flag: Cayman Islands", + "category": "Flags", + "aliases": ["cayman_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇰🇿", + "description": "flag: Kazakhstan", + "category": "Flags", + "aliases": ["kazakhstan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇦", + "description": "flag: Laos", + "category": "Flags", + "aliases": ["laos"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇧", + "description": "flag: Lebanon", + "category": "Flags", + "aliases": ["lebanon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇨", + "description": "flag: St. Lucia", + "category": "Flags", + "aliases": ["st_lucia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇮", + "description": "flag: Liechtenstein", + "category": "Flags", + "aliases": ["liechtenstein"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇰", + "description": "flag: Sri Lanka", + "category": "Flags", + "aliases": ["sri_lanka"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇷", + "description": "flag: Liberia", + "category": "Flags", + "aliases": ["liberia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇸", + "description": "flag: Lesotho", + "category": "Flags", + "aliases": ["lesotho"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇹", + "description": "flag: Lithuania", + "category": "Flags", + "aliases": ["lithuania"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇺", + "description": "flag: Luxembourg", + "category": "Flags", + "aliases": ["luxembourg"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇻", + "description": "flag: Latvia", + "category": "Flags", + "aliases": ["latvia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇱🇾", + "description": "flag: Libya", + "category": "Flags", + "aliases": ["libya"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇦", + "description": "flag: Morocco", + "category": "Flags", + "aliases": ["morocco"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇨", + "description": "flag: Monaco", + "category": "Flags", + "aliases": ["monaco"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇲🇩", + "description": "flag: Moldova", + "category": "Flags", + "aliases": ["moldova"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇪", + "description": "flag: Montenegro", + "category": "Flags", + "aliases": ["montenegro"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇫", + "description": "flag: St. Martin", + "category": "Flags", + "aliases": ["st_martin"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇲🇬", + "description": "flag: Madagascar", + "category": "Flags", + "aliases": ["madagascar"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇭", + "description": "flag: Marshall Islands", + "category": "Flags", + "aliases": ["marshall_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇲🇰", + "description": "flag: North Macedonia", + "category": "Flags", + "aliases": ["macedonia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇱", + "description": "flag: Mali", + "category": "Flags", + "aliases": ["mali"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇲", + "description": "flag: Myanmar (Burma)", + "category": "Flags", + "aliases": ["myanmar"], + "tags": ["burma"], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇳", + "description": "flag: Mongolia", + "category": "Flags", + "aliases": ["mongolia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇴", + "description": "flag: Macao SAR China", + "category": "Flags", + "aliases": ["macau"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇵", + "description": "flag: Northern Mariana Islands", + "category": "Flags", + "aliases": ["northern_mariana_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇶", + "description": "flag: Martinique", + "category": "Flags", + "aliases": ["martinique"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇲🇷", + "description": "flag: Mauritania", + "category": "Flags", + "aliases": ["mauritania"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇸", + "description": "flag: Montserrat", + "category": "Flags", + "aliases": ["montserrat"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇹", + "description": "flag: Malta", + "category": "Flags", + "aliases": ["malta"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇺", + "description": "flag: Mauritius", + "category": "Flags", + "aliases": ["mauritius"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇲🇻", + "description": "flag: Maldives", + "category": "Flags", + "aliases": ["maldives"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇼", + "description": "flag: Malawi", + "category": "Flags", + "aliases": ["malawi"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇽", + "description": "flag: Mexico", + "category": "Flags", + "aliases": ["mexico"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇾", + "description": "flag: Malaysia", + "category": "Flags", + "aliases": ["malaysia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇲🇿", + "description": "flag: Mozambique", + "category": "Flags", + "aliases": ["mozambique"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇦", + "description": "flag: Namibia", + "category": "Flags", + "aliases": ["namibia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇨", + "description": "flag: New Caledonia", + "category": "Flags", + "aliases": ["new_caledonia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇪", + "description": "flag: Niger", + "category": "Flags", + "aliases": ["niger"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇫", + "description": "flag: Norfolk Island", + "category": "Flags", + "aliases": ["norfolk_island"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇳🇬", + "description": "flag: Nigeria", + "category": "Flags", + "aliases": ["nigeria"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇮", + "description": "flag: Nicaragua", + "category": "Flags", + "aliases": ["nicaragua"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇱", + "description": "flag: Netherlands", + "category": "Flags", + "aliases": ["netherlands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇴", + "description": "flag: Norway", + "category": "Flags", + "aliases": ["norway"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇵", + "description": "flag: Nepal", + "category": "Flags", + "aliases": ["nepal"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇷", + "description": "flag: Nauru", + "category": "Flags", + "aliases": ["nauru"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇳🇺", + "description": "flag: Niue", + "category": "Flags", + "aliases": ["niue"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇳🇿", + "description": "flag: New Zealand", + "category": "Flags", + "aliases": ["new_zealand"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇴🇲", + "description": "flag: Oman", + "category": "Flags", + "aliases": ["oman"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇦", + "description": "flag: Panama", + "category": "Flags", + "aliases": ["panama"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇪", + "description": "flag: Peru", + "category": "Flags", + "aliases": ["peru"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇫", + "description": "flag: French Polynesia", + "category": "Flags", + "aliases": ["french_polynesia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇵🇬", + "description": "flag: Papua New Guinea", + "category": "Flags", + "aliases": ["papua_new_guinea"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇭", + "description": "flag: Philippines", + "category": "Flags", + "aliases": ["philippines"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇰", + "description": "flag: Pakistan", + "category": "Flags", + "aliases": ["pakistan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇱", + "description": "flag: Poland", + "category": "Flags", + "aliases": ["poland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇲", + "description": "flag: St. Pierre & Miquelon", + "category": "Flags", + "aliases": ["st_pierre_miquelon"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇵🇳", + "description": "flag: Pitcairn Islands", + "category": "Flags", + "aliases": ["pitcairn_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇵🇷", + "description": "flag: Puerto Rico", + "category": "Flags", + "aliases": ["puerto_rico"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇸", + "description": "flag: Palestinian Territories", + "category": "Flags", + "aliases": ["palestinian_territories"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇹", + "description": "flag: Portugal", + "category": "Flags", + "aliases": ["portugal"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇼", + "description": "flag: Palau", + "category": "Flags", + "aliases": ["palau"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇵🇾", + "description": "flag: Paraguay", + "category": "Flags", + "aliases": ["paraguay"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇶🇦", + "description": "flag: Qatar", + "category": "Flags", + "aliases": ["qatar"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇷🇪", + "description": "flag: Réunion", + "category": "Flags", + "aliases": ["reunion"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇷🇴", + "description": "flag: Romania", + "category": "Flags", + "aliases": ["romania"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇷🇸", + "description": "flag: Serbia", + "category": "Flags", + "aliases": ["serbia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇷🇺", + "description": "flag: Russia", + "category": "Flags", + "aliases": ["ru"], + "tags": ["russia"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇷🇼", + "description": "flag: Rwanda", + "category": "Flags", + "aliases": ["rwanda"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇦", + "description": "flag: Saudi Arabia", + "category": "Flags", + "aliases": ["saudi_arabia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇧", + "description": "flag: Solomon Islands", + "category": "Flags", + "aliases": ["solomon_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇨", + "description": "flag: Seychelles", + "category": "Flags", + "aliases": ["seychelles"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇩", + "description": "flag: Sudan", + "category": "Flags", + "aliases": ["sudan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇪", + "description": "flag: Sweden", + "category": "Flags", + "aliases": ["sweden"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇬", + "description": "flag: Singapore", + "category": "Flags", + "aliases": ["singapore"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇭", + "description": "flag: St. Helena", + "category": "Flags", + "aliases": ["st_helena"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇸🇮", + "description": "flag: Slovenia", + "category": "Flags", + "aliases": ["slovenia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇯", + "description": "flag: Svalbard & Jan Mayen", + "category": "Flags", + "aliases": ["svalbard_jan_mayen"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇸🇰", + "description": "flag: Slovakia", + "category": "Flags", + "aliases": ["slovakia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇱", + "description": "flag: Sierra Leone", + "category": "Flags", + "aliases": ["sierra_leone"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇲", + "description": "flag: San Marino", + "category": "Flags", + "aliases": ["san_marino"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇳", + "description": "flag: Senegal", + "category": "Flags", + "aliases": ["senegal"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇴", + "description": "flag: Somalia", + "category": "Flags", + "aliases": ["somalia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇷", + "description": "flag: Suriname", + "category": "Flags", + "aliases": ["suriname"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇸", + "description": "flag: South Sudan", + "category": "Flags", + "aliases": ["south_sudan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇹", + "description": "flag: São Tomé & Príncipe", + "category": "Flags", + "aliases": ["sao_tome_principe"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇻", + "description": "flag: El Salvador", + "category": "Flags", + "aliases": ["el_salvador"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇽", + "description": "flag: Sint Maarten", + "category": "Flags", + "aliases": ["sint_maarten"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇾", + "description": "flag: Syria", + "category": "Flags", + "aliases": ["syria"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇸🇿", + "description": "flag: Eswatini", + "category": "Flags", + "aliases": ["swaziland"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇦", + "description": "flag: Tristan da Cunha", + "category": "Flags", + "aliases": ["tristan_da_cunha"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇹🇨", + "description": "flag: Turks & Caicos Islands", + "category": "Flags", + "aliases": ["turks_caicos_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇩", + "description": "flag: Chad", + "category": "Flags", + "aliases": ["chad"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇹🇫", + "description": "flag: French Southern Territories", + "category": "Flags", + "aliases": ["french_southern_territories"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇬", + "description": "flag: Togo", + "category": "Flags", + "aliases": ["togo"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇭", + "description": "flag: Thailand", + "category": "Flags", + "aliases": ["thailand"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇯", + "description": "flag: Tajikistan", + "category": "Flags", + "aliases": ["tajikistan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇰", + "description": "flag: Tokelau", + "category": "Flags", + "aliases": ["tokelau"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇹🇱", + "description": "flag: Timor-Leste", + "category": "Flags", + "aliases": ["timor_leste"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇲", + "description": "flag: Turkmenistan", + "category": "Flags", + "aliases": ["turkmenistan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇳", + "description": "flag: Tunisia", + "category": "Flags", + "aliases": ["tunisia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇴", + "description": "flag: Tonga", + "category": "Flags", + "aliases": ["tonga"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇷", + "description": "flag: Turkey", + "category": "Flags", + "aliases": ["tr"], + "tags": ["turkey"], + "unicode_version": "8.0", + "ios_version": "9.1" + }, + { + "emoji": "🇹🇹", + "description": "flag: Trinidad & Tobago", + "category": "Flags", + "aliases": ["trinidad_tobago"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇻", + "description": "flag: Tuvalu", + "category": "Flags", + "aliases": ["tuvalu"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇹🇼", + "description": "flag: Taiwan", + "category": "Flags", + "aliases": ["taiwan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇹🇿", + "description": "flag: Tanzania", + "category": "Flags", + "aliases": ["tanzania"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇺🇦", + "description": "flag: Ukraine", + "category": "Flags", + "aliases": ["ukraine"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇺🇬", + "description": "flag: Uganda", + "category": "Flags", + "aliases": ["uganda"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇺🇲", + "description": "flag: U.S. Outlying Islands", + "category": "Flags", + "aliases": ["us_outlying_islands"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇺🇳", + "description": "flag: United Nations", + "category": "Flags", + "aliases": ["united_nations"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🇺🇸", + "description": "flag: United States", + "category": "Flags", + "aliases": ["us"], + "tags": ["flag", "united", "america"], + "unicode_version": "6.0", + "ios_version": "6.0" + }, + { + "emoji": "🇺🇾", + "description": "flag: Uruguay", + "category": "Flags", + "aliases": ["uruguay"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇺🇿", + "description": "flag: Uzbekistan", + "category": "Flags", + "aliases": ["uzbekistan"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇻🇦", + "description": "flag: Vatican City", + "category": "Flags", + "aliases": ["vatican_city"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇻🇨", + "description": "flag: St. Vincent & Grenadines", + "category": "Flags", + "aliases": ["st_vincent_grenadines"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇻🇪", + "description": "flag: Venezuela", + "category": "Flags", + "aliases": ["venezuela"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇻🇬", + "description": "flag: British Virgin Islands", + "category": "Flags", + "aliases": ["british_virgin_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇻🇮", + "description": "flag: U.S. Virgin Islands", + "category": "Flags", + "aliases": ["us_virgin_islands"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇻🇳", + "description": "flag: Vietnam", + "category": "Flags", + "aliases": ["vietnam"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇻🇺", + "description": "flag: Vanuatu", + "category": "Flags", + "aliases": ["vanuatu"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇼🇫", + "description": "flag: Wallis & Futuna", + "category": "Flags", + "aliases": ["wallis_futuna"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇼🇸", + "description": "flag: Samoa", + "category": "Flags", + "aliases": ["samoa"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇽🇰", + "description": "flag: Kosovo", + "category": "Flags", + "aliases": ["kosovo"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇾🇪", + "description": "flag: Yemen", + "category": "Flags", + "aliases": ["yemen"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇾🇹", + "description": "flag: Mayotte", + "category": "Flags", + "aliases": ["mayotte"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "9.0" + }, + { + "emoji": "🇿🇦", + "description": "flag: South Africa", + "category": "Flags", + "aliases": ["south_africa"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇿🇲", + "description": "flag: Zambia", + "category": "Flags", + "aliases": ["zambia"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🇿🇼", + "description": "flag: Zimbabwe", + "category": "Flags", + "aliases": ["zimbabwe"], + "tags": [], + "unicode_version": "6.0", + "ios_version": "8.3" + }, + { + "emoji": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "description": "flag: England", + "category": "Flags", + "aliases": ["england"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "description": "flag: Scotland", + "category": "Flags", + "aliases": ["scotland"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" + }, + { + "emoji": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + "description": "flag: Wales", + "category": "Flags", + "aliases": ["wales"], + "tags": [], + "unicode_version": "11.0", + "ios_version": "12.1" } ] diff --git a/scripts/postrm.sh b/scripts/postrm.sh index 10b2fd95..7cb7d46d 100755 --- a/scripts/postrm.sh +++ b/scripts/postrm.sh @@ -7,4 +7,3 @@ if [ "$1" = "purge" ] || [ "$1" = "0" ]; then rm -f /etc/ntfy/server.yml /etc/ntfy/client.yml rmdir /etc/ntfy || true fi - diff --git a/server/actions.go b/server/actions.go index 80065873..0b06abad 100644 --- a/server/actions.go +++ b/server/actions.go @@ -4,10 +4,11 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/util" "regexp" "strings" "unicode/utf8" + + "heckel.io/ntfy/util" ) const ( diff --git a/server/actions_test.go b/server/actions_test.go index 2a6c4b15..d9af2e37 100644 --- a/server/actions_test.go +++ b/server/actions_test.go @@ -1,8 +1,9 @@ package server import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) func TestParseActions(t *testing.T) { diff --git a/server/config_test.go b/server/config_test.go index 14f028f1..d741c730 100644 --- a/server/config_test.go +++ b/server/config_test.go @@ -1,9 +1,10 @@ package server_test import ( + "testing" + "github.com/stretchr/testify/assert" "heckel.io/ntfy/server" - "testing" ) func TestConfig_New(t *testing.T) { diff --git a/server/file_cache.go b/server/file_cache.go index 88de935d..cfedcff6 100644 --- a/server/file_cache.go +++ b/server/file_cache.go @@ -3,13 +3,14 @@ package server import ( "errors" "fmt" - "heckel.io/ntfy/util" "io" "os" "path/filepath" "regexp" "sync" "time" + + "heckel.io/ntfy/util" ) var ( diff --git a/server/file_cache_test.go b/server/file_cache_test.go index 971cff1d..17337b40 100644 --- a/server/file_cache_test.go +++ b/server/file_cache_test.go @@ -3,12 +3,13 @@ package server import ( "bytes" "fmt" - "github.com/stretchr/testify/require" - "heckel.io/ntfy/util" "os" "strings" "testing" "time" + + "github.com/stretchr/testify/require" + "heckel.io/ntfy/util" ) var ( diff --git a/server/mailer_emoji.json b/server/mailer_emoji.json index 4d4c32fc..f4705ef5 100644 --- a/server/mailer_emoji.json +++ b/server/mailer_emoji.json @@ -1 +1,1817 @@ -[{"emoji":"😀","aliases":["grinning"]},{"emoji":"😃","aliases":["smiley"]},{"emoji":"😄","aliases":["smile"]},{"emoji":"😁","aliases":["grin"]},{"emoji":"😆","aliases":["laughing","satisfied"]},{"emoji":"😅","aliases":["sweat_smile"]},{"emoji":"🤣","aliases":["rofl"]},{"emoji":"😂","aliases":["joy"]},{"emoji":"🙂","aliases":["slightly_smiling_face"]},{"emoji":"🙃","aliases":["upside_down_face"]},{"emoji":"😉","aliases":["wink"]},{"emoji":"😊","aliases":["blush"]},{"emoji":"😇","aliases":["innocent"]},{"emoji":"🥰","aliases":["smiling_face_with_three_hearts"]},{"emoji":"😍","aliases":["heart_eyes"]},{"emoji":"🤩","aliases":["star_struck"]},{"emoji":"😘","aliases":["kissing_heart"]},{"emoji":"😗","aliases":["kissing"]},{"emoji":"☺️","aliases":["relaxed"]},{"emoji":"😚","aliases":["kissing_closed_eyes"]},{"emoji":"😙","aliases":["kissing_smiling_eyes"]},{"emoji":"🥲","aliases":["smiling_face_with_tear"]},{"emoji":"😋","aliases":["yum"]},{"emoji":"😛","aliases":["stuck_out_tongue"]},{"emoji":"😜","aliases":["stuck_out_tongue_winking_eye"]},{"emoji":"🤪","aliases":["zany_face"]},{"emoji":"😝","aliases":["stuck_out_tongue_closed_eyes"]},{"emoji":"🤑","aliases":["money_mouth_face"]},{"emoji":"🤗","aliases":["hugs"]},{"emoji":"🤭","aliases":["hand_over_mouth"]},{"emoji":"🤫","aliases":["shushing_face"]},{"emoji":"🤔","aliases":["thinking"]},{"emoji":"🤐","aliases":["zipper_mouth_face"]},{"emoji":"🤨","aliases":["raised_eyebrow"]},{"emoji":"😐","aliases":["neutral_face"]},{"emoji":"😑","aliases":["expressionless"]},{"emoji":"😶","aliases":["no_mouth"]},{"emoji":"😶‍🌫️","aliases":["face_in_clouds"]},{"emoji":"😏","aliases":["smirk"]},{"emoji":"😒","aliases":["unamused"]},{"emoji":"🙄","aliases":["roll_eyes"]},{"emoji":"😬","aliases":["grimacing"]},{"emoji":"😮‍💨","aliases":["face_exhaling"]},{"emoji":"🤥","aliases":["lying_face"]},{"emoji":"😌","aliases":["relieved"]},{"emoji":"😔","aliases":["pensive"]},{"emoji":"😪","aliases":["sleepy"]},{"emoji":"🤤","aliases":["drooling_face"]},{"emoji":"😴","aliases":["sleeping"]},{"emoji":"😷","aliases":["mask"]},{"emoji":"🤒","aliases":["face_with_thermometer"]},{"emoji":"🤕","aliases":["face_with_head_bandage"]},{"emoji":"🤢","aliases":["nauseated_face"]},{"emoji":"🤮","aliases":["vomiting_face"]},{"emoji":"🤧","aliases":["sneezing_face"]},{"emoji":"🥵","aliases":["hot_face"]},{"emoji":"🥶","aliases":["cold_face"]},{"emoji":"🥴","aliases":["woozy_face"]},{"emoji":"😵","aliases":["dizzy_face"]},{"emoji":"😵‍💫","aliases":["face_with_spiral_eyes"]},{"emoji":"🤯","aliases":["exploding_head"]},{"emoji":"🤠","aliases":["cowboy_hat_face"]},{"emoji":"🥳","aliases":["partying_face"]},{"emoji":"🥸","aliases":["disguised_face"]},{"emoji":"😎","aliases":["sunglasses"]},{"emoji":"🤓","aliases":["nerd_face"]},{"emoji":"🧐","aliases":["monocle_face"]},{"emoji":"😕","aliases":["confused"]},{"emoji":"😟","aliases":["worried"]},{"emoji":"🙁","aliases":["slightly_frowning_face"]},{"emoji":"☹️","aliases":["frowning_face"]},{"emoji":"😮","aliases":["open_mouth"]},{"emoji":"😯","aliases":["hushed"]},{"emoji":"😲","aliases":["astonished"]},{"emoji":"😳","aliases":["flushed"]},{"emoji":"🥺","aliases":["pleading_face"]},{"emoji":"😦","aliases":["frowning"]},{"emoji":"😧","aliases":["anguished"]},{"emoji":"😨","aliases":["fearful"]},{"emoji":"😰","aliases":["cold_sweat"]},{"emoji":"😥","aliases":["disappointed_relieved"]},{"emoji":"😢","aliases":["cry"]},{"emoji":"😭","aliases":["sob"]},{"emoji":"😱","aliases":["scream"]},{"emoji":"😖","aliases":["confounded"]},{"emoji":"😣","aliases":["persevere"]},{"emoji":"😞","aliases":["disappointed"]},{"emoji":"😓","aliases":["sweat"]},{"emoji":"😩","aliases":["weary"]},{"emoji":"😫","aliases":["tired_face"]},{"emoji":"🥱","aliases":["yawning_face"]},{"emoji":"😤","aliases":["triumph"]},{"emoji":"😡","aliases":["rage","pout"]},{"emoji":"😠","aliases":["angry"]},{"emoji":"🤬","aliases":["cursing_face"]},{"emoji":"😈","aliases":["smiling_imp"]},{"emoji":"👿","aliases":["imp"]},{"emoji":"💀","aliases":["skull"]},{"emoji":"☠️","aliases":["skull_and_crossbones"]},{"emoji":"💩","aliases":["hankey","poop","shit"]},{"emoji":"🤡","aliases":["clown_face"]},{"emoji":"👹","aliases":["japanese_ogre"]},{"emoji":"👺","aliases":["japanese_goblin"]},{"emoji":"👻","aliases":["ghost"]},{"emoji":"👽","aliases":["alien"]},{"emoji":"👾","aliases":["space_invader"]},{"emoji":"🤖","aliases":["robot"]},{"emoji":"😺","aliases":["smiley_cat"]},{"emoji":"😸","aliases":["smile_cat"]},{"emoji":"😹","aliases":["joy_cat"]},{"emoji":"😻","aliases":["heart_eyes_cat"]},{"emoji":"😼","aliases":["smirk_cat"]},{"emoji":"😽","aliases":["kissing_cat"]},{"emoji":"🙀","aliases":["scream_cat"]},{"emoji":"😿","aliases":["crying_cat_face"]},{"emoji":"😾","aliases":["pouting_cat"]},{"emoji":"🙈","aliases":["see_no_evil"]},{"emoji":"🙉","aliases":["hear_no_evil"]},{"emoji":"🙊","aliases":["speak_no_evil"]},{"emoji":"💋","aliases":["kiss"]},{"emoji":"💌","aliases":["love_letter"]},{"emoji":"💘","aliases":["cupid"]},{"emoji":"💝","aliases":["gift_heart"]},{"emoji":"💖","aliases":["sparkling_heart"]},{"emoji":"💗","aliases":["heartpulse"]},{"emoji":"💓","aliases":["heartbeat"]},{"emoji":"💞","aliases":["revolving_hearts"]},{"emoji":"💕","aliases":["two_hearts"]},{"emoji":"💟","aliases":["heart_decoration"]},{"emoji":"❣️","aliases":["heavy_heart_exclamation"]},{"emoji":"💔","aliases":["broken_heart"]},{"emoji":"❤️‍🔥","aliases":["heart_on_fire"]},{"emoji":"❤️‍🩹","aliases":["mending_heart"]},{"emoji":"❤️","aliases":["heart"]},{"emoji":"🧡","aliases":["orange_heart"]},{"emoji":"💛","aliases":["yellow_heart"]},{"emoji":"💚","aliases":["green_heart"]},{"emoji":"💙","aliases":["blue_heart"]},{"emoji":"💜","aliases":["purple_heart"]},{"emoji":"🤎","aliases":["brown_heart"]},{"emoji":"🖤","aliases":["black_heart"]},{"emoji":"🤍","aliases":["white_heart"]},{"emoji":"💯","aliases":["100"]},{"emoji":"💢","aliases":["anger"]},{"emoji":"💥","aliases":["boom","collision"]},{"emoji":"💫","aliases":["dizzy"]},{"emoji":"💦","aliases":["sweat_drops"]},{"emoji":"💨","aliases":["dash"]},{"emoji":"🕳️","aliases":["hole"]},{"emoji":"💣","aliases":["bomb"]},{"emoji":"💬","aliases":["speech_balloon"]},{"emoji":"👁️‍🗨️","aliases":["eye_speech_bubble"]},{"emoji":"🗨️","aliases":["left_speech_bubble"]},{"emoji":"🗯️","aliases":["right_anger_bubble"]},{"emoji":"💭","aliases":["thought_balloon"]},{"emoji":"💤","aliases":["zzz"]},{"emoji":"👋","aliases":["wave"]},{"emoji":"🤚","aliases":["raised_back_of_hand"]},{"emoji":"🖐️","aliases":["raised_hand_with_fingers_splayed"]},{"emoji":"✋","aliases":["hand","raised_hand"]},{"emoji":"🖖","aliases":["vulcan_salute"]},{"emoji":"👌","aliases":["ok_hand"]},{"emoji":"🤌","aliases":["pinched_fingers"]},{"emoji":"🤏","aliases":["pinching_hand"]},{"emoji":"✌️","aliases":["v"]},{"emoji":"🤞","aliases":["crossed_fingers"]},{"emoji":"🤟","aliases":["love_you_gesture"]},{"emoji":"🤘","aliases":["metal"]},{"emoji":"🤙","aliases":["call_me_hand"]},{"emoji":"👈","aliases":["point_left"]},{"emoji":"👉","aliases":["point_right"]},{"emoji":"👆","aliases":["point_up_2"]},{"emoji":"🖕","aliases":["middle_finger","fu"]},{"emoji":"👇","aliases":["point_down"]},{"emoji":"☝️","aliases":["point_up"]},{"emoji":"👍","aliases":["+1","thumbsup"]},{"emoji":"👎","aliases":["-1","thumbsdown"]},{"emoji":"✊","aliases":["fist_raised","fist"]},{"emoji":"👊","aliases":["fist_oncoming","facepunch","punch"]},{"emoji":"🤛","aliases":["fist_left"]},{"emoji":"🤜","aliases":["fist_right"]},{"emoji":"👏","aliases":["clap"]},{"emoji":"🙌","aliases":["raised_hands"]},{"emoji":"👐","aliases":["open_hands"]},{"emoji":"🤲","aliases":["palms_up_together"]},{"emoji":"🤝","aliases":["handshake"]},{"emoji":"🙏","aliases":["pray"]},{"emoji":"✍️","aliases":["writing_hand"]},{"emoji":"💅","aliases":["nail_care"]},{"emoji":"🤳","aliases":["selfie"]},{"emoji":"💪","aliases":["muscle"]},{"emoji":"🦾","aliases":["mechanical_arm"]},{"emoji":"🦿","aliases":["mechanical_leg"]},{"emoji":"🦵","aliases":["leg"]},{"emoji":"🦶","aliases":["foot"]},{"emoji":"👂","aliases":["ear"]},{"emoji":"🦻","aliases":["ear_with_hearing_aid"]},{"emoji":"👃","aliases":["nose"]},{"emoji":"🧠","aliases":["brain"]},{"emoji":"🫀","aliases":["anatomical_heart"]},{"emoji":"🫁","aliases":["lungs"]},{"emoji":"🦷","aliases":["tooth"]},{"emoji":"🦴","aliases":["bone"]},{"emoji":"👀","aliases":["eyes"]},{"emoji":"👁️","aliases":["eye"]},{"emoji":"👅","aliases":["tongue"]},{"emoji":"👄","aliases":["lips"]},{"emoji":"👶","aliases":["baby"]},{"emoji":"🧒","aliases":["child"]},{"emoji":"👦","aliases":["boy"]},{"emoji":"👧","aliases":["girl"]},{"emoji":"🧑","aliases":["adult"]},{"emoji":"👱","aliases":["blond_haired_person"]},{"emoji":"👨","aliases":["man"]},{"emoji":"🧔","aliases":["bearded_person"]},{"emoji":"🧔‍♂️","aliases":["man_beard"]},{"emoji":"🧔‍♀️","aliases":["woman_beard"]},{"emoji":"👨‍🦰","aliases":["red_haired_man"]},{"emoji":"👨‍🦱","aliases":["curly_haired_man"]},{"emoji":"👨‍🦳","aliases":["white_haired_man"]},{"emoji":"👨‍🦲","aliases":["bald_man"]},{"emoji":"👩","aliases":["woman"]},{"emoji":"👩‍🦰","aliases":["red_haired_woman"]},{"emoji":"🧑‍🦰","aliases":["person_red_hair"]},{"emoji":"👩‍🦱","aliases":["curly_haired_woman"]},{"emoji":"🧑‍🦱","aliases":["person_curly_hair"]},{"emoji":"👩‍🦳","aliases":["white_haired_woman"]},{"emoji":"🧑‍🦳","aliases":["person_white_hair"]},{"emoji":"👩‍🦲","aliases":["bald_woman"]},{"emoji":"🧑‍🦲","aliases":["person_bald"]},{"emoji":"👱‍♀️","aliases":["blond_haired_woman","blonde_woman"]},{"emoji":"👱‍♂️","aliases":["blond_haired_man"]},{"emoji":"🧓","aliases":["older_adult"]},{"emoji":"👴","aliases":["older_man"]},{"emoji":"👵","aliases":["older_woman"]},{"emoji":"🙍","aliases":["frowning_person"]},{"emoji":"🙍‍♂️","aliases":["frowning_man"]},{"emoji":"🙍‍♀️","aliases":["frowning_woman"]},{"emoji":"🙎","aliases":["pouting_face"]},{"emoji":"🙎‍♂️","aliases":["pouting_man"]},{"emoji":"🙎‍♀️","aliases":["pouting_woman"]},{"emoji":"🙅","aliases":["no_good"]},{"emoji":"🙅‍♂️","aliases":["no_good_man","ng_man"]},{"emoji":"🙅‍♀️","aliases":["no_good_woman","ng_woman"]},{"emoji":"🙆","aliases":["ok_person"]},{"emoji":"🙆‍♂️","aliases":["ok_man"]},{"emoji":"🙆‍♀️","aliases":["ok_woman"]},{"emoji":"💁","aliases":["tipping_hand_person","information_desk_person"]},{"emoji":"💁‍♂️","aliases":["tipping_hand_man","sassy_man"]},{"emoji":"💁‍♀️","aliases":["tipping_hand_woman","sassy_woman"]},{"emoji":"🙋","aliases":["raising_hand"]},{"emoji":"🙋‍♂️","aliases":["raising_hand_man"]},{"emoji":"🙋‍♀️","aliases":["raising_hand_woman"]},{"emoji":"🧏","aliases":["deaf_person"]},{"emoji":"🧏‍♂️","aliases":["deaf_man"]},{"emoji":"🧏‍♀️","aliases":["deaf_woman"]},{"emoji":"🙇","aliases":["bow"]},{"emoji":"🙇‍♂️","aliases":["bowing_man"]},{"emoji":"🙇‍♀️","aliases":["bowing_woman"]},{"emoji":"🤦","aliases":["facepalm"]},{"emoji":"🤦‍♂️","aliases":["man_facepalming"]},{"emoji":"🤦‍♀️","aliases":["woman_facepalming"]},{"emoji":"🤷","aliases":["shrug"]},{"emoji":"🤷‍♂️","aliases":["man_shrugging"]},{"emoji":"🤷‍♀️","aliases":["woman_shrugging"]},{"emoji":"🧑‍⚕️","aliases":["health_worker"]},{"emoji":"👨‍⚕️","aliases":["man_health_worker"]},{"emoji":"👩‍⚕️","aliases":["woman_health_worker"]},{"emoji":"🧑‍🎓","aliases":["student"]},{"emoji":"👨‍🎓","aliases":["man_student"]},{"emoji":"👩‍🎓","aliases":["woman_student"]},{"emoji":"🧑‍🏫","aliases":["teacher"]},{"emoji":"👨‍🏫","aliases":["man_teacher"]},{"emoji":"👩‍🏫","aliases":["woman_teacher"]},{"emoji":"🧑‍⚖️","aliases":["judge"]},{"emoji":"👨‍⚖️","aliases":["man_judge"]},{"emoji":"👩‍⚖️","aliases":["woman_judge"]},{"emoji":"🧑‍🌾","aliases":["farmer"]},{"emoji":"👨‍🌾","aliases":["man_farmer"]},{"emoji":"👩‍🌾","aliases":["woman_farmer"]},{"emoji":"🧑‍🍳","aliases":["cook"]},{"emoji":"👨‍🍳","aliases":["man_cook"]},{"emoji":"👩‍🍳","aliases":["woman_cook"]},{"emoji":"🧑‍🔧","aliases":["mechanic"]},{"emoji":"👨‍🔧","aliases":["man_mechanic"]},{"emoji":"👩‍🔧","aliases":["woman_mechanic"]},{"emoji":"🧑‍🏭","aliases":["factory_worker"]},{"emoji":"👨‍🏭","aliases":["man_factory_worker"]},{"emoji":"👩‍🏭","aliases":["woman_factory_worker"]},{"emoji":"🧑‍💼","aliases":["office_worker"]},{"emoji":"👨‍💼","aliases":["man_office_worker"]},{"emoji":"👩‍💼","aliases":["woman_office_worker"]},{"emoji":"🧑‍🔬","aliases":["scientist"]},{"emoji":"👨‍🔬","aliases":["man_scientist"]},{"emoji":"👩‍🔬","aliases":["woman_scientist"]},{"emoji":"🧑‍💻","aliases":["technologist"]},{"emoji":"👨‍💻","aliases":["man_technologist"]},{"emoji":"👩‍💻","aliases":["woman_technologist"]},{"emoji":"🧑‍🎤","aliases":["singer"]},{"emoji":"👨‍🎤","aliases":["man_singer"]},{"emoji":"👩‍🎤","aliases":["woman_singer"]},{"emoji":"🧑‍🎨","aliases":["artist"]},{"emoji":"👨‍🎨","aliases":["man_artist"]},{"emoji":"👩‍🎨","aliases":["woman_artist"]},{"emoji":"🧑‍✈️","aliases":["pilot"]},{"emoji":"👨‍✈️","aliases":["man_pilot"]},{"emoji":"👩‍✈️","aliases":["woman_pilot"]},{"emoji":"🧑‍🚀","aliases":["astronaut"]},{"emoji":"👨‍🚀","aliases":["man_astronaut"]},{"emoji":"👩‍🚀","aliases":["woman_astronaut"]},{"emoji":"🧑‍🚒","aliases":["firefighter"]},{"emoji":"👨‍🚒","aliases":["man_firefighter"]},{"emoji":"👩‍🚒","aliases":["woman_firefighter"]},{"emoji":"👮","aliases":["police_officer","cop"]},{"emoji":"👮‍♂️","aliases":["policeman"]},{"emoji":"👮‍♀️","aliases":["policewoman"]},{"emoji":"🕵️","aliases":["detective"]},{"emoji":"🕵️‍♂️","aliases":["male_detective"]},{"emoji":"🕵️‍♀️","aliases":["female_detective"]},{"emoji":"💂","aliases":["guard"]},{"emoji":"💂‍♂️","aliases":["guardsman"]},{"emoji":"💂‍♀️","aliases":["guardswoman"]},{"emoji":"🥷","aliases":["ninja"]},{"emoji":"👷","aliases":["construction_worker"]},{"emoji":"👷‍♂️","aliases":["construction_worker_man"]},{"emoji":"👷‍♀️","aliases":["construction_worker_woman"]},{"emoji":"🤴","aliases":["prince"]},{"emoji":"👸","aliases":["princess"]},{"emoji":"👳","aliases":["person_with_turban"]},{"emoji":"👳‍♂️","aliases":["man_with_turban"]},{"emoji":"👳‍♀️","aliases":["woman_with_turban"]},{"emoji":"👲","aliases":["man_with_gua_pi_mao"]},{"emoji":"🧕","aliases":["woman_with_headscarf"]},{"emoji":"🤵","aliases":["person_in_tuxedo"]},{"emoji":"🤵‍♂️","aliases":["man_in_tuxedo"]},{"emoji":"🤵‍♀️","aliases":["woman_in_tuxedo"]},{"emoji":"👰","aliases":["person_with_veil"]},{"emoji":"👰‍♂️","aliases":["man_with_veil"]},{"emoji":"👰‍♀️","aliases":["woman_with_veil","bride_with_veil"]},{"emoji":"🤰","aliases":["pregnant_woman"]},{"emoji":"🤱","aliases":["breast_feeding"]},{"emoji":"👩‍🍼","aliases":["woman_feeding_baby"]},{"emoji":"👨‍🍼","aliases":["man_feeding_baby"]},{"emoji":"🧑‍🍼","aliases":["person_feeding_baby"]},{"emoji":"👼","aliases":["angel"]},{"emoji":"🎅","aliases":["santa"]},{"emoji":"🤶","aliases":["mrs_claus"]},{"emoji":"🧑‍🎄","aliases":["mx_claus"]},{"emoji":"🦸","aliases":["superhero"]},{"emoji":"🦸‍♂️","aliases":["superhero_man"]},{"emoji":"🦸‍♀️","aliases":["superhero_woman"]},{"emoji":"🦹","aliases":["supervillain"]},{"emoji":"🦹‍♂️","aliases":["supervillain_man"]},{"emoji":"🦹‍♀️","aliases":["supervillain_woman"]},{"emoji":"🧙","aliases":["mage"]},{"emoji":"🧙‍♂️","aliases":["mage_man"]},{"emoji":"🧙‍♀️","aliases":["mage_woman"]},{"emoji":"🧚","aliases":["fairy"]},{"emoji":"🧚‍♂️","aliases":["fairy_man"]},{"emoji":"🧚‍♀️","aliases":["fairy_woman"]},{"emoji":"🧛","aliases":["vampire"]},{"emoji":"🧛‍♂️","aliases":["vampire_man"]},{"emoji":"🧛‍♀️","aliases":["vampire_woman"]},{"emoji":"🧜","aliases":["merperson"]},{"emoji":"🧜‍♂️","aliases":["merman"]},{"emoji":"🧜‍♀️","aliases":["mermaid"]},{"emoji":"🧝","aliases":["elf"]},{"emoji":"🧝‍♂️","aliases":["elf_man"]},{"emoji":"🧝‍♀️","aliases":["elf_woman"]},{"emoji":"🧞","aliases":["genie"]},{"emoji":"🧞‍♂️","aliases":["genie_man"]},{"emoji":"🧞‍♀️","aliases":["genie_woman"]},{"emoji":"🧟","aliases":["zombie"]},{"emoji":"🧟‍♂️","aliases":["zombie_man"]},{"emoji":"🧟‍♀️","aliases":["zombie_woman"]},{"emoji":"💆","aliases":["massage"]},{"emoji":"💆‍♂️","aliases":["massage_man"]},{"emoji":"💆‍♀️","aliases":["massage_woman"]},{"emoji":"💇","aliases":["haircut"]},{"emoji":"💇‍♂️","aliases":["haircut_man"]},{"emoji":"💇‍♀️","aliases":["haircut_woman"]},{"emoji":"🚶","aliases":["walking"]},{"emoji":"🚶‍♂️","aliases":["walking_man"]},{"emoji":"🚶‍♀️","aliases":["walking_woman"]},{"emoji":"🧍","aliases":["standing_person"]},{"emoji":"🧍‍♂️","aliases":["standing_man"]},{"emoji":"🧍‍♀️","aliases":["standing_woman"]},{"emoji":"🧎","aliases":["kneeling_person"]},{"emoji":"🧎‍♂️","aliases":["kneeling_man"]},{"emoji":"🧎‍♀️","aliases":["kneeling_woman"]},{"emoji":"🧑‍🦯","aliases":["person_with_probing_cane"]},{"emoji":"👨‍🦯","aliases":["man_with_probing_cane"]},{"emoji":"👩‍🦯","aliases":["woman_with_probing_cane"]},{"emoji":"🧑‍🦼","aliases":["person_in_motorized_wheelchair"]},{"emoji":"👨‍🦼","aliases":["man_in_motorized_wheelchair"]},{"emoji":"👩‍🦼","aliases":["woman_in_motorized_wheelchair"]},{"emoji":"🧑‍🦽","aliases":["person_in_manual_wheelchair"]},{"emoji":"👨‍🦽","aliases":["man_in_manual_wheelchair"]},{"emoji":"👩‍🦽","aliases":["woman_in_manual_wheelchair"]},{"emoji":"🏃","aliases":["runner","running"]},{"emoji":"🏃‍♂️","aliases":["running_man"]},{"emoji":"🏃‍♀️","aliases":["running_woman"]},{"emoji":"💃","aliases":["woman_dancing","dancer"]},{"emoji":"🕺","aliases":["man_dancing"]},{"emoji":"🕴️","aliases":["business_suit_levitating"]},{"emoji":"👯","aliases":["dancers"]},{"emoji":"👯‍♂️","aliases":["dancing_men"]},{"emoji":"👯‍♀️","aliases":["dancing_women"]},{"emoji":"🧖","aliases":["sauna_person"]},{"emoji":"🧖‍♂️","aliases":["sauna_man"]},{"emoji":"🧖‍♀️","aliases":["sauna_woman"]},{"emoji":"🧗","aliases":["climbing"]},{"emoji":"🧗‍♂️","aliases":["climbing_man"]},{"emoji":"🧗‍♀️","aliases":["climbing_woman"]},{"emoji":"🤺","aliases":["person_fencing"]},{"emoji":"🏇","aliases":["horse_racing"]},{"emoji":"⛷️","aliases":["skier"]},{"emoji":"🏂","aliases":["snowboarder"]},{"emoji":"🏌️","aliases":["golfing"]},{"emoji":"🏌️‍♂️","aliases":["golfing_man"]},{"emoji":"🏌️‍♀️","aliases":["golfing_woman"]},{"emoji":"🏄","aliases":["surfer"]},{"emoji":"🏄‍♂️","aliases":["surfing_man"]},{"emoji":"🏄‍♀️","aliases":["surfing_woman"]},{"emoji":"🚣","aliases":["rowboat"]},{"emoji":"🚣‍♂️","aliases":["rowing_man"]},{"emoji":"🚣‍♀️","aliases":["rowing_woman"]},{"emoji":"🏊","aliases":["swimmer"]},{"emoji":"🏊‍♂️","aliases":["swimming_man"]},{"emoji":"🏊‍♀️","aliases":["swimming_woman"]},{"emoji":"⛹️","aliases":["bouncing_ball_person"]},{"emoji":"⛹️‍♂️","aliases":["bouncing_ball_man","basketball_man"]},{"emoji":"⛹️‍♀️","aliases":["bouncing_ball_woman","basketball_woman"]},{"emoji":"🏋️","aliases":["weight_lifting"]},{"emoji":"🏋️‍♂️","aliases":["weight_lifting_man"]},{"emoji":"🏋️‍♀️","aliases":["weight_lifting_woman"]},{"emoji":"🚴","aliases":["bicyclist"]},{"emoji":"🚴‍♂️","aliases":["biking_man"]},{"emoji":"🚴‍♀️","aliases":["biking_woman"]},{"emoji":"🚵","aliases":["mountain_bicyclist"]},{"emoji":"🚵‍♂️","aliases":["mountain_biking_man"]},{"emoji":"🚵‍♀️","aliases":["mountain_biking_woman"]},{"emoji":"🤸","aliases":["cartwheeling"]},{"emoji":"🤸‍♂️","aliases":["man_cartwheeling"]},{"emoji":"🤸‍♀️","aliases":["woman_cartwheeling"]},{"emoji":"🤼","aliases":["wrestling"]},{"emoji":"🤼‍♂️","aliases":["men_wrestling"]},{"emoji":"🤼‍♀️","aliases":["women_wrestling"]},{"emoji":"🤽","aliases":["water_polo"]},{"emoji":"🤽‍♂️","aliases":["man_playing_water_polo"]},{"emoji":"🤽‍♀️","aliases":["woman_playing_water_polo"]},{"emoji":"🤾","aliases":["handball_person"]},{"emoji":"🤾‍♂️","aliases":["man_playing_handball"]},{"emoji":"🤾‍♀️","aliases":["woman_playing_handball"]},{"emoji":"🤹","aliases":["juggling_person"]},{"emoji":"🤹‍♂️","aliases":["man_juggling"]},{"emoji":"🤹‍♀️","aliases":["woman_juggling"]},{"emoji":"🧘","aliases":["lotus_position"]},{"emoji":"🧘‍♂️","aliases":["lotus_position_man"]},{"emoji":"🧘‍♀️","aliases":["lotus_position_woman"]},{"emoji":"🛀","aliases":["bath"]},{"emoji":"🛌","aliases":["sleeping_bed"]},{"emoji":"🧑‍🤝‍🧑","aliases":["people_holding_hands"]},{"emoji":"👭","aliases":["two_women_holding_hands"]},{"emoji":"👫","aliases":["couple"]},{"emoji":"👬","aliases":["two_men_holding_hands"]},{"emoji":"💏","aliases":["couplekiss"]},{"emoji":"👩‍❤️‍💋‍👨","aliases":["couplekiss_man_woman"]},{"emoji":"👨‍❤️‍💋‍👨","aliases":["couplekiss_man_man"]},{"emoji":"👩‍❤️‍💋‍👩","aliases":["couplekiss_woman_woman"]},{"emoji":"💑","aliases":["couple_with_heart"]},{"emoji":"👩‍❤️‍👨","aliases":["couple_with_heart_woman_man"]},{"emoji":"👨‍❤️‍👨","aliases":["couple_with_heart_man_man"]},{"emoji":"👩‍❤️‍👩","aliases":["couple_with_heart_woman_woman"]},{"emoji":"👪","aliases":["family"]},{"emoji":"👨‍👩‍👦","aliases":["family_man_woman_boy"]},{"emoji":"👨‍👩‍👧","aliases":["family_man_woman_girl"]},{"emoji":"👨‍👩‍👧‍👦","aliases":["family_man_woman_girl_boy"]},{"emoji":"👨‍👩‍👦‍👦","aliases":["family_man_woman_boy_boy"]},{"emoji":"👨‍👩‍👧‍👧","aliases":["family_man_woman_girl_girl"]},{"emoji":"👨‍👨‍👦","aliases":["family_man_man_boy"]},{"emoji":"👨‍👨‍👧","aliases":["family_man_man_girl"]},{"emoji":"👨‍👨‍👧‍👦","aliases":["family_man_man_girl_boy"]},{"emoji":"👨‍👨‍👦‍👦","aliases":["family_man_man_boy_boy"]},{"emoji":"👨‍👨‍👧‍👧","aliases":["family_man_man_girl_girl"]},{"emoji":"👩‍👩‍👦","aliases":["family_woman_woman_boy"]},{"emoji":"👩‍👩‍👧","aliases":["family_woman_woman_girl"]},{"emoji":"👩‍👩‍👧‍👦","aliases":["family_woman_woman_girl_boy"]},{"emoji":"👩‍👩‍👦‍👦","aliases":["family_woman_woman_boy_boy"]},{"emoji":"👩‍👩‍👧‍👧","aliases":["family_woman_woman_girl_girl"]},{"emoji":"👨‍👦","aliases":["family_man_boy"]},{"emoji":"👨‍👦‍👦","aliases":["family_man_boy_boy"]},{"emoji":"👨‍👧","aliases":["family_man_girl"]},{"emoji":"👨‍👧‍👦","aliases":["family_man_girl_boy"]},{"emoji":"👨‍👧‍👧","aliases":["family_man_girl_girl"]},{"emoji":"👩‍👦","aliases":["family_woman_boy"]},{"emoji":"👩‍👦‍👦","aliases":["family_woman_boy_boy"]},{"emoji":"👩‍👧","aliases":["family_woman_girl"]},{"emoji":"👩‍👧‍👦","aliases":["family_woman_girl_boy"]},{"emoji":"👩‍👧‍👧","aliases":["family_woman_girl_girl"]},{"emoji":"🗣️","aliases":["speaking_head"]},{"emoji":"👤","aliases":["bust_in_silhouette"]},{"emoji":"👥","aliases":["busts_in_silhouette"]},{"emoji":"🫂","aliases":["people_hugging"]},{"emoji":"👣","aliases":["footprints"]},{"emoji":"🐵","aliases":["monkey_face"]},{"emoji":"🐒","aliases":["monkey"]},{"emoji":"🦍","aliases":["gorilla"]},{"emoji":"🦧","aliases":["orangutan"]},{"emoji":"🐶","aliases":["dog"]},{"emoji":"🐕","aliases":["dog2"]},{"emoji":"🦮","aliases":["guide_dog"]},{"emoji":"🐕‍🦺","aliases":["service_dog"]},{"emoji":"🐩","aliases":["poodle"]},{"emoji":"🐺","aliases":["wolf"]},{"emoji":"🦊","aliases":["fox_face"]},{"emoji":"🦝","aliases":["raccoon"]},{"emoji":"🐱","aliases":["cat"]},{"emoji":"🐈","aliases":["cat2"]},{"emoji":"🐈‍⬛","aliases":["black_cat"]},{"emoji":"🦁","aliases":["lion"]},{"emoji":"🐯","aliases":["tiger"]},{"emoji":"🐅","aliases":["tiger2"]},{"emoji":"🐆","aliases":["leopard"]},{"emoji":"🐴","aliases":["horse"]},{"emoji":"🐎","aliases":["racehorse"]},{"emoji":"🦄","aliases":["unicorn"]},{"emoji":"🦓","aliases":["zebra"]},{"emoji":"🦌","aliases":["deer"]},{"emoji":"🦬","aliases":["bison"]},{"emoji":"🐮","aliases":["cow"]},{"emoji":"🐂","aliases":["ox"]},{"emoji":"🐃","aliases":["water_buffalo"]},{"emoji":"🐄","aliases":["cow2"]},{"emoji":"🐷","aliases":["pig"]},{"emoji":"🐖","aliases":["pig2"]},{"emoji":"🐗","aliases":["boar"]},{"emoji":"🐽","aliases":["pig_nose"]},{"emoji":"🐏","aliases":["ram"]},{"emoji":"🐑","aliases":["sheep"]},{"emoji":"🐐","aliases":["goat"]},{"emoji":"🐪","aliases":["dromedary_camel"]},{"emoji":"🐫","aliases":["camel"]},{"emoji":"🦙","aliases":["llama"]},{"emoji":"🦒","aliases":["giraffe"]},{"emoji":"🐘","aliases":["elephant"]},{"emoji":"🦣","aliases":["mammoth"]},{"emoji":"🦏","aliases":["rhinoceros"]},{"emoji":"🦛","aliases":["hippopotamus"]},{"emoji":"🐭","aliases":["mouse"]},{"emoji":"🐁","aliases":["mouse2"]},{"emoji":"🐀","aliases":["rat"]},{"emoji":"🐹","aliases":["hamster"]},{"emoji":"🐰","aliases":["rabbit"]},{"emoji":"🐇","aliases":["rabbit2"]},{"emoji":"🐿️","aliases":["chipmunk"]},{"emoji":"🦫","aliases":["beaver"]},{"emoji":"🦔","aliases":["hedgehog"]},{"emoji":"🦇","aliases":["bat"]},{"emoji":"🐻","aliases":["bear"]},{"emoji":"🐻‍❄️","aliases":["polar_bear"]},{"emoji":"🐨","aliases":["koala"]},{"emoji":"🐼","aliases":["panda_face"]},{"emoji":"🦥","aliases":["sloth"]},{"emoji":"🦦","aliases":["otter"]},{"emoji":"🦨","aliases":["skunk"]},{"emoji":"🦘","aliases":["kangaroo"]},{"emoji":"🦡","aliases":["badger"]},{"emoji":"🐾","aliases":["feet","paw_prints"]},{"emoji":"🦃","aliases":["turkey"]},{"emoji":"🐔","aliases":["chicken"]},{"emoji":"🐓","aliases":["rooster"]},{"emoji":"🐣","aliases":["hatching_chick"]},{"emoji":"🐤","aliases":["baby_chick"]},{"emoji":"🐥","aliases":["hatched_chick"]},{"emoji":"🐦","aliases":["bird"]},{"emoji":"🐧","aliases":["penguin"]},{"emoji":"🕊️","aliases":["dove"]},{"emoji":"🦅","aliases":["eagle"]},{"emoji":"🦆","aliases":["duck"]},{"emoji":"🦢","aliases":["swan"]},{"emoji":"🦉","aliases":["owl"]},{"emoji":"🦤","aliases":["dodo"]},{"emoji":"🪶","aliases":["feather"]},{"emoji":"🦩","aliases":["flamingo"]},{"emoji":"🦚","aliases":["peacock"]},{"emoji":"🦜","aliases":["parrot"]},{"emoji":"🐸","aliases":["frog"]},{"emoji":"🐊","aliases":["crocodile"]},{"emoji":"🐢","aliases":["turtle"]},{"emoji":"🦎","aliases":["lizard"]},{"emoji":"🐍","aliases":["snake"]},{"emoji":"🐲","aliases":["dragon_face"]},{"emoji":"🐉","aliases":["dragon"]},{"emoji":"🦕","aliases":["sauropod"]},{"emoji":"🦖","aliases":["t-rex"]},{"emoji":"🐳","aliases":["whale"]},{"emoji":"🐋","aliases":["whale2"]},{"emoji":"🐬","aliases":["dolphin","flipper"]},{"emoji":"🦭","aliases":["seal"]},{"emoji":"🐟","aliases":["fish"]},{"emoji":"🐠","aliases":["tropical_fish"]},{"emoji":"🐡","aliases":["blowfish"]},{"emoji":"🦈","aliases":["shark"]},{"emoji":"🐙","aliases":["octopus"]},{"emoji":"🐚","aliases":["shell"]},{"emoji":"🐌","aliases":["snail"]},{"emoji":"🦋","aliases":["butterfly"]},{"emoji":"🐛","aliases":["bug"]},{"emoji":"🐜","aliases":["ant"]},{"emoji":"🐝","aliases":["bee","honeybee"]},{"emoji":"🪲","aliases":["beetle"]},{"emoji":"🐞","aliases":["lady_beetle"]},{"emoji":"🦗","aliases":["cricket"]},{"emoji":"🪳","aliases":["cockroach"]},{"emoji":"🕷️","aliases":["spider"]},{"emoji":"🕸️","aliases":["spider_web"]},{"emoji":"🦂","aliases":["scorpion"]},{"emoji":"🦟","aliases":["mosquito"]},{"emoji":"🪰","aliases":["fly"]},{"emoji":"🪱","aliases":["worm"]},{"emoji":"🦠","aliases":["microbe"]},{"emoji":"💐","aliases":["bouquet"]},{"emoji":"🌸","aliases":["cherry_blossom"]},{"emoji":"💮","aliases":["white_flower"]},{"emoji":"🏵️","aliases":["rosette"]},{"emoji":"🌹","aliases":["rose"]},{"emoji":"🥀","aliases":["wilted_flower"]},{"emoji":"🌺","aliases":["hibiscus"]},{"emoji":"🌻","aliases":["sunflower"]},{"emoji":"🌼","aliases":["blossom"]},{"emoji":"🌷","aliases":["tulip"]},{"emoji":"🌱","aliases":["seedling"]},{"emoji":"🪴","aliases":["potted_plant"]},{"emoji":"🌲","aliases":["evergreen_tree"]},{"emoji":"🌳","aliases":["deciduous_tree"]},{"emoji":"🌴","aliases":["palm_tree"]},{"emoji":"🌵","aliases":["cactus"]},{"emoji":"🌾","aliases":["ear_of_rice"]},{"emoji":"🌿","aliases":["herb"]},{"emoji":"☘️","aliases":["shamrock"]},{"emoji":"🍀","aliases":["four_leaf_clover"]},{"emoji":"🍁","aliases":["maple_leaf"]},{"emoji":"🍂","aliases":["fallen_leaf"]},{"emoji":"🍃","aliases":["leaves"]},{"emoji":"🍇","aliases":["grapes"]},{"emoji":"🍈","aliases":["melon"]},{"emoji":"🍉","aliases":["watermelon"]},{"emoji":"🍊","aliases":["tangerine","orange","mandarin"]},{"emoji":"🍋","aliases":["lemon"]},{"emoji":"🍌","aliases":["banana"]},{"emoji":"🍍","aliases":["pineapple"]},{"emoji":"🥭","aliases":["mango"]},{"emoji":"🍎","aliases":["apple"]},{"emoji":"🍏","aliases":["green_apple"]},{"emoji":"🍐","aliases":["pear"]},{"emoji":"🍑","aliases":["peach"]},{"emoji":"🍒","aliases":["cherries"]},{"emoji":"🍓","aliases":["strawberry"]},{"emoji":"🫐","aliases":["blueberries"]},{"emoji":"🥝","aliases":["kiwi_fruit"]},{"emoji":"🍅","aliases":["tomato"]},{"emoji":"🫒","aliases":["olive"]},{"emoji":"🥥","aliases":["coconut"]},{"emoji":"🥑","aliases":["avocado"]},{"emoji":"🍆","aliases":["eggplant"]},{"emoji":"🥔","aliases":["potato"]},{"emoji":"🥕","aliases":["carrot"]},{"emoji":"🌽","aliases":["corn"]},{"emoji":"🌶️","aliases":["hot_pepper"]},{"emoji":"🫑","aliases":["bell_pepper"]},{"emoji":"🥒","aliases":["cucumber"]},{"emoji":"🥬","aliases":["leafy_green"]},{"emoji":"🥦","aliases":["broccoli"]},{"emoji":"🧄","aliases":["garlic"]},{"emoji":"🧅","aliases":["onion"]},{"emoji":"🍄","aliases":["mushroom"]},{"emoji":"🥜","aliases":["peanuts"]},{"emoji":"🌰","aliases":["chestnut"]},{"emoji":"🍞","aliases":["bread"]},{"emoji":"🥐","aliases":["croissant"]},{"emoji":"🥖","aliases":["baguette_bread"]},{"emoji":"🫓","aliases":["flatbread"]},{"emoji":"🥨","aliases":["pretzel"]},{"emoji":"🥯","aliases":["bagel"]},{"emoji":"🥞","aliases":["pancakes"]},{"emoji":"🧇","aliases":["waffle"]},{"emoji":"🧀","aliases":["cheese"]},{"emoji":"🍖","aliases":["meat_on_bone"]},{"emoji":"🍗","aliases":["poultry_leg"]},{"emoji":"🥩","aliases":["cut_of_meat"]},{"emoji":"🥓","aliases":["bacon"]},{"emoji":"🍔","aliases":["hamburger"]},{"emoji":"🍟","aliases":["fries"]},{"emoji":"🍕","aliases":["pizza"]},{"emoji":"🌭","aliases":["hotdog"]},{"emoji":"🥪","aliases":["sandwich"]},{"emoji":"🌮","aliases":["taco"]},{"emoji":"🌯","aliases":["burrito"]},{"emoji":"🫔","aliases":["tamale"]},{"emoji":"🥙","aliases":["stuffed_flatbread"]},{"emoji":"🧆","aliases":["falafel"]},{"emoji":"🥚","aliases":["egg"]},{"emoji":"🍳","aliases":["fried_egg"]},{"emoji":"🥘","aliases":["shallow_pan_of_food"]},{"emoji":"🍲","aliases":["stew"]},{"emoji":"🫕","aliases":["fondue"]},{"emoji":"🥣","aliases":["bowl_with_spoon"]},{"emoji":"🥗","aliases":["green_salad"]},{"emoji":"🍿","aliases":["popcorn"]},{"emoji":"🧈","aliases":["butter"]},{"emoji":"🧂","aliases":["salt"]},{"emoji":"🥫","aliases":["canned_food"]},{"emoji":"🍱","aliases":["bento"]},{"emoji":"🍘","aliases":["rice_cracker"]},{"emoji":"🍙","aliases":["rice_ball"]},{"emoji":"🍚","aliases":["rice"]},{"emoji":"🍛","aliases":["curry"]},{"emoji":"🍜","aliases":["ramen"]},{"emoji":"🍝","aliases":["spaghetti"]},{"emoji":"🍠","aliases":["sweet_potato"]},{"emoji":"🍢","aliases":["oden"]},{"emoji":"🍣","aliases":["sushi"]},{"emoji":"🍤","aliases":["fried_shrimp"]},{"emoji":"🍥","aliases":["fish_cake"]},{"emoji":"🥮","aliases":["moon_cake"]},{"emoji":"🍡","aliases":["dango"]},{"emoji":"🥟","aliases":["dumpling"]},{"emoji":"🥠","aliases":["fortune_cookie"]},{"emoji":"🥡","aliases":["takeout_box"]},{"emoji":"🦀","aliases":["crab"]},{"emoji":"🦞","aliases":["lobster"]},{"emoji":"🦐","aliases":["shrimp"]},{"emoji":"🦑","aliases":["squid"]},{"emoji":"🦪","aliases":["oyster"]},{"emoji":"🍦","aliases":["icecream"]},{"emoji":"🍧","aliases":["shaved_ice"]},{"emoji":"🍨","aliases":["ice_cream"]},{"emoji":"🍩","aliases":["doughnut"]},{"emoji":"🍪","aliases":["cookie"]},{"emoji":"🎂","aliases":["birthday"]},{"emoji":"🍰","aliases":["cake"]},{"emoji":"🧁","aliases":["cupcake"]},{"emoji":"🥧","aliases":["pie"]},{"emoji":"🍫","aliases":["chocolate_bar"]},{"emoji":"🍬","aliases":["candy"]},{"emoji":"🍭","aliases":["lollipop"]},{"emoji":"🍮","aliases":["custard"]},{"emoji":"🍯","aliases":["honey_pot"]},{"emoji":"🍼","aliases":["baby_bottle"]},{"emoji":"🥛","aliases":["milk_glass"]},{"emoji":"☕","aliases":["coffee"]},{"emoji":"🫖","aliases":["teapot"]},{"emoji":"🍵","aliases":["tea"]},{"emoji":"🍶","aliases":["sake"]},{"emoji":"🍾","aliases":["champagne"]},{"emoji":"🍷","aliases":["wine_glass"]},{"emoji":"🍸","aliases":["cocktail"]},{"emoji":"🍹","aliases":["tropical_drink"]},{"emoji":"🍺","aliases":["beer"]},{"emoji":"🍻","aliases":["beers"]},{"emoji":"🥂","aliases":["clinking_glasses"]},{"emoji":"🥃","aliases":["tumbler_glass"]},{"emoji":"🥤","aliases":["cup_with_straw"]},{"emoji":"🧋","aliases":["bubble_tea"]},{"emoji":"🧃","aliases":["beverage_box"]},{"emoji":"🧉","aliases":["mate"]},{"emoji":"🧊","aliases":["ice_cube"]},{"emoji":"🥢","aliases":["chopsticks"]},{"emoji":"🍽️","aliases":["plate_with_cutlery"]},{"emoji":"🍴","aliases":["fork_and_knife"]},{"emoji":"🥄","aliases":["spoon"]},{"emoji":"🔪","aliases":["hocho","knife"]},{"emoji":"🏺","aliases":["amphora"]},{"emoji":"🌍","aliases":["earth_africa"]},{"emoji":"🌎","aliases":["earth_americas"]},{"emoji":"🌏","aliases":["earth_asia"]},{"emoji":"🌐","aliases":["globe_with_meridians"]},{"emoji":"🗺️","aliases":["world_map"]},{"emoji":"🗾","aliases":["japan"]},{"emoji":"🧭","aliases":["compass"]},{"emoji":"🏔️","aliases":["mountain_snow"]},{"emoji":"⛰️","aliases":["mountain"]},{"emoji":"🌋","aliases":["volcano"]},{"emoji":"🗻","aliases":["mount_fuji"]},{"emoji":"🏕️","aliases":["camping"]},{"emoji":"🏖️","aliases":["beach_umbrella"]},{"emoji":"🏜️","aliases":["desert"]},{"emoji":"🏝️","aliases":["desert_island"]},{"emoji":"🏞️","aliases":["national_park"]},{"emoji":"🏟️","aliases":["stadium"]},{"emoji":"🏛️","aliases":["classical_building"]},{"emoji":"🏗️","aliases":["building_construction"]},{"emoji":"🧱","aliases":["bricks"]},{"emoji":"🪨","aliases":["rock"]},{"emoji":"🪵","aliases":["wood"]},{"emoji":"🛖","aliases":["hut"]},{"emoji":"🏘️","aliases":["houses"]},{"emoji":"🏚️","aliases":["derelict_house"]},{"emoji":"🏠","aliases":["house"]},{"emoji":"🏡","aliases":["house_with_garden"]},{"emoji":"🏢","aliases":["office"]},{"emoji":"🏣","aliases":["post_office"]},{"emoji":"🏤","aliases":["european_post_office"]},{"emoji":"🏥","aliases":["hospital"]},{"emoji":"🏦","aliases":["bank"]},{"emoji":"🏨","aliases":["hotel"]},{"emoji":"🏩","aliases":["love_hotel"]},{"emoji":"🏪","aliases":["convenience_store"]},{"emoji":"🏫","aliases":["school"]},{"emoji":"🏬","aliases":["department_store"]},{"emoji":"🏭","aliases":["factory"]},{"emoji":"🏯","aliases":["japanese_castle"]},{"emoji":"🏰","aliases":["european_castle"]},{"emoji":"💒","aliases":["wedding"]},{"emoji":"🗼","aliases":["tokyo_tower"]},{"emoji":"🗽","aliases":["statue_of_liberty"]},{"emoji":"⛪","aliases":["church"]},{"emoji":"🕌","aliases":["mosque"]},{"emoji":"🛕","aliases":["hindu_temple"]},{"emoji":"🕍","aliases":["synagogue"]},{"emoji":"⛩️","aliases":["shinto_shrine"]},{"emoji":"🕋","aliases":["kaaba"]},{"emoji":"⛲","aliases":["fountain"]},{"emoji":"⛺","aliases":["tent"]},{"emoji":"🌁","aliases":["foggy"]},{"emoji":"🌃","aliases":["night_with_stars"]},{"emoji":"🏙️","aliases":["cityscape"]},{"emoji":"🌄","aliases":["sunrise_over_mountains"]},{"emoji":"🌅","aliases":["sunrise"]},{"emoji":"🌆","aliases":["city_sunset"]},{"emoji":"🌇","aliases":["city_sunrise"]},{"emoji":"🌉","aliases":["bridge_at_night"]},{"emoji":"♨️","aliases":["hotsprings"]},{"emoji":"🎠","aliases":["carousel_horse"]},{"emoji":"🎡","aliases":["ferris_wheel"]},{"emoji":"🎢","aliases":["roller_coaster"]},{"emoji":"💈","aliases":["barber"]},{"emoji":"🎪","aliases":["circus_tent"]},{"emoji":"🚂","aliases":["steam_locomotive"]},{"emoji":"🚃","aliases":["railway_car"]},{"emoji":"🚄","aliases":["bullettrain_side"]},{"emoji":"🚅","aliases":["bullettrain_front"]},{"emoji":"🚆","aliases":["train2"]},{"emoji":"🚇","aliases":["metro"]},{"emoji":"🚈","aliases":["light_rail"]},{"emoji":"🚉","aliases":["station"]},{"emoji":"🚊","aliases":["tram"]},{"emoji":"🚝","aliases":["monorail"]},{"emoji":"🚞","aliases":["mountain_railway"]},{"emoji":"🚋","aliases":["train"]},{"emoji":"🚌","aliases":["bus"]},{"emoji":"🚍","aliases":["oncoming_bus"]},{"emoji":"🚎","aliases":["trolleybus"]},{"emoji":"🚐","aliases":["minibus"]},{"emoji":"🚑","aliases":["ambulance"]},{"emoji":"🚒","aliases":["fire_engine"]},{"emoji":"🚓","aliases":["police_car"]},{"emoji":"🚔","aliases":["oncoming_police_car"]},{"emoji":"🚕","aliases":["taxi"]},{"emoji":"🚖","aliases":["oncoming_taxi"]},{"emoji":"🚗","aliases":["car","red_car"]},{"emoji":"🚘","aliases":["oncoming_automobile"]},{"emoji":"🚙","aliases":["blue_car"]},{"emoji":"🛻","aliases":["pickup_truck"]},{"emoji":"🚚","aliases":["truck"]},{"emoji":"🚛","aliases":["articulated_lorry"]},{"emoji":"🚜","aliases":["tractor"]},{"emoji":"🏎️","aliases":["racing_car"]},{"emoji":"🏍️","aliases":["motorcycle"]},{"emoji":"🛵","aliases":["motor_scooter"]},{"emoji":"🦽","aliases":["manual_wheelchair"]},{"emoji":"🦼","aliases":["motorized_wheelchair"]},{"emoji":"🛺","aliases":["auto_rickshaw"]},{"emoji":"🚲","aliases":["bike"]},{"emoji":"🛴","aliases":["kick_scooter"]},{"emoji":"🛹","aliases":["skateboard"]},{"emoji":"🛼","aliases":["roller_skate"]},{"emoji":"🚏","aliases":["busstop"]},{"emoji":"🛣️","aliases":["motorway"]},{"emoji":"🛤️","aliases":["railway_track"]},{"emoji":"🛢️","aliases":["oil_drum"]},{"emoji":"⛽","aliases":["fuelpump"]},{"emoji":"🚨","aliases":["rotating_light"]},{"emoji":"🚥","aliases":["traffic_light"]},{"emoji":"🚦","aliases":["vertical_traffic_light"]},{"emoji":"🛑","aliases":["stop_sign"]},{"emoji":"🚧","aliases":["construction"]},{"emoji":"⚓","aliases":["anchor"]},{"emoji":"⛵","aliases":["boat","sailboat"]},{"emoji":"🛶","aliases":["canoe"]},{"emoji":"🚤","aliases":["speedboat"]},{"emoji":"🛳️","aliases":["passenger_ship"]},{"emoji":"⛴️","aliases":["ferry"]},{"emoji":"🛥️","aliases":["motor_boat"]},{"emoji":"🚢","aliases":["ship"]},{"emoji":"✈️","aliases":["airplane"]},{"emoji":"🛩️","aliases":["small_airplane"]},{"emoji":"🛫","aliases":["flight_departure"]},{"emoji":"🛬","aliases":["flight_arrival"]},{"emoji":"🪂","aliases":["parachute"]},{"emoji":"💺","aliases":["seat"]},{"emoji":"🚁","aliases":["helicopter"]},{"emoji":"🚟","aliases":["suspension_railway"]},{"emoji":"🚠","aliases":["mountain_cableway"]},{"emoji":"🚡","aliases":["aerial_tramway"]},{"emoji":"🛰️","aliases":["artificial_satellite"]},{"emoji":"🚀","aliases":["rocket"]},{"emoji":"🛸","aliases":["flying_saucer"]},{"emoji":"🛎️","aliases":["bellhop_bell"]},{"emoji":"🧳","aliases":["luggage"]},{"emoji":"⌛","aliases":["hourglass"]},{"emoji":"⏳","aliases":["hourglass_flowing_sand"]},{"emoji":"⌚","aliases":["watch"]},{"emoji":"⏰","aliases":["alarm_clock"]},{"emoji":"⏱️","aliases":["stopwatch"]},{"emoji":"⏲️","aliases":["timer_clock"]},{"emoji":"🕰️","aliases":["mantelpiece_clock"]},{"emoji":"🕛","aliases":["clock12"]},{"emoji":"🕧","aliases":["clock1230"]},{"emoji":"🕐","aliases":["clock1"]},{"emoji":"🕜","aliases":["clock130"]},{"emoji":"🕑","aliases":["clock2"]},{"emoji":"🕝","aliases":["clock230"]},{"emoji":"🕒","aliases":["clock3"]},{"emoji":"🕞","aliases":["clock330"]},{"emoji":"🕓","aliases":["clock4"]},{"emoji":"🕟","aliases":["clock430"]},{"emoji":"🕔","aliases":["clock5"]},{"emoji":"🕠","aliases":["clock530"]},{"emoji":"🕕","aliases":["clock6"]},{"emoji":"🕡","aliases":["clock630"]},{"emoji":"🕖","aliases":["clock7"]},{"emoji":"🕢","aliases":["clock730"]},{"emoji":"🕗","aliases":["clock8"]},{"emoji":"🕣","aliases":["clock830"]},{"emoji":"🕘","aliases":["clock9"]},{"emoji":"🕤","aliases":["clock930"]},{"emoji":"🕙","aliases":["clock10"]},{"emoji":"🕥","aliases":["clock1030"]},{"emoji":"🕚","aliases":["clock11"]},{"emoji":"🕦","aliases":["clock1130"]},{"emoji":"🌑","aliases":["new_moon"]},{"emoji":"🌒","aliases":["waxing_crescent_moon"]},{"emoji":"🌓","aliases":["first_quarter_moon"]},{"emoji":"🌔","aliases":["moon","waxing_gibbous_moon"]},{"emoji":"🌕","aliases":["full_moon"]},{"emoji":"🌖","aliases":["waning_gibbous_moon"]},{"emoji":"🌗","aliases":["last_quarter_moon"]},{"emoji":"🌘","aliases":["waning_crescent_moon"]},{"emoji":"🌙","aliases":["crescent_moon"]},{"emoji":"🌚","aliases":["new_moon_with_face"]},{"emoji":"🌛","aliases":["first_quarter_moon_with_face"]},{"emoji":"🌜","aliases":["last_quarter_moon_with_face"]},{"emoji":"🌡️","aliases":["thermometer"]},{"emoji":"☀️","aliases":["sunny"]},{"emoji":"🌝","aliases":["full_moon_with_face"]},{"emoji":"🌞","aliases":["sun_with_face"]},{"emoji":"🪐","aliases":["ringed_planet"]},{"emoji":"⭐","aliases":["star"]},{"emoji":"🌟","aliases":["star2"]},{"emoji":"🌠","aliases":["stars"]},{"emoji":"🌌","aliases":["milky_way"]},{"emoji":"☁️","aliases":["cloud"]},{"emoji":"⛅","aliases":["partly_sunny"]},{"emoji":"⛈️","aliases":["cloud_with_lightning_and_rain"]},{"emoji":"🌤️","aliases":["sun_behind_small_cloud"]},{"emoji":"🌥️","aliases":["sun_behind_large_cloud"]},{"emoji":"🌦️","aliases":["sun_behind_rain_cloud"]},{"emoji":"🌧️","aliases":["cloud_with_rain"]},{"emoji":"🌨️","aliases":["cloud_with_snow"]},{"emoji":"🌩️","aliases":["cloud_with_lightning"]},{"emoji":"🌪️","aliases":["tornado"]},{"emoji":"🌫️","aliases":["fog"]},{"emoji":"🌬️","aliases":["wind_face"]},{"emoji":"🌀","aliases":["cyclone"]},{"emoji":"🌈","aliases":["rainbow"]},{"emoji":"🌂","aliases":["closed_umbrella"]},{"emoji":"☂️","aliases":["open_umbrella"]},{"emoji":"☔","aliases":["umbrella"]},{"emoji":"⛱️","aliases":["parasol_on_ground"]},{"emoji":"⚡","aliases":["zap"]},{"emoji":"❄️","aliases":["snowflake"]},{"emoji":"☃️","aliases":["snowman_with_snow"]},{"emoji":"⛄","aliases":["snowman"]},{"emoji":"☄️","aliases":["comet"]},{"emoji":"🔥","aliases":["fire"]},{"emoji":"💧","aliases":["droplet"]},{"emoji":"🌊","aliases":["ocean"]},{"emoji":"🎃","aliases":["jack_o_lantern"]},{"emoji":"🎄","aliases":["christmas_tree"]},{"emoji":"🎆","aliases":["fireworks"]},{"emoji":"🎇","aliases":["sparkler"]},{"emoji":"🧨","aliases":["firecracker"]},{"emoji":"✨","aliases":["sparkles"]},{"emoji":"🎈","aliases":["balloon"]},{"emoji":"🎉","aliases":["tada"]},{"emoji":"🎊","aliases":["confetti_ball"]},{"emoji":"🎋","aliases":["tanabata_tree"]},{"emoji":"🎍","aliases":["bamboo"]},{"emoji":"🎎","aliases":["dolls"]},{"emoji":"🎏","aliases":["flags"]},{"emoji":"🎐","aliases":["wind_chime"]},{"emoji":"🎑","aliases":["rice_scene"]},{"emoji":"🧧","aliases":["red_envelope"]},{"emoji":"🎀","aliases":["ribbon"]},{"emoji":"🎁","aliases":["gift"]},{"emoji":"🎗️","aliases":["reminder_ribbon"]},{"emoji":"🎟️","aliases":["tickets"]},{"emoji":"🎫","aliases":["ticket"]},{"emoji":"🎖️","aliases":["medal_military"]},{"emoji":"🏆","aliases":["trophy"]},{"emoji":"🏅","aliases":["medal_sports"]},{"emoji":"🥇","aliases":["1st_place_medal"]},{"emoji":"🥈","aliases":["2nd_place_medal"]},{"emoji":"🥉","aliases":["3rd_place_medal"]},{"emoji":"⚽","aliases":["soccer"]},{"emoji":"⚾","aliases":["baseball"]},{"emoji":"🥎","aliases":["softball"]},{"emoji":"🏀","aliases":["basketball"]},{"emoji":"🏐","aliases":["volleyball"]},{"emoji":"🏈","aliases":["football"]},{"emoji":"🏉","aliases":["rugby_football"]},{"emoji":"🎾","aliases":["tennis"]},{"emoji":"🥏","aliases":["flying_disc"]},{"emoji":"🎳","aliases":["bowling"]},{"emoji":"🏏","aliases":["cricket_game"]},{"emoji":"🏑","aliases":["field_hockey"]},{"emoji":"🏒","aliases":["ice_hockey"]},{"emoji":"🥍","aliases":["lacrosse"]},{"emoji":"🏓","aliases":["ping_pong"]},{"emoji":"🏸","aliases":["badminton"]},{"emoji":"🥊","aliases":["boxing_glove"]},{"emoji":"🥋","aliases":["martial_arts_uniform"]},{"emoji":"🥅","aliases":["goal_net"]},{"emoji":"⛳","aliases":["golf"]},{"emoji":"⛸️","aliases":["ice_skate"]},{"emoji":"🎣","aliases":["fishing_pole_and_fish"]},{"emoji":"🤿","aliases":["diving_mask"]},{"emoji":"🎽","aliases":["running_shirt_with_sash"]},{"emoji":"🎿","aliases":["ski"]},{"emoji":"🛷","aliases":["sled"]},{"emoji":"🥌","aliases":["curling_stone"]},{"emoji":"🎯","aliases":["dart"]},{"emoji":"🪀","aliases":["yo_yo"]},{"emoji":"🪁","aliases":["kite"]},{"emoji":"🎱","aliases":["8ball"]},{"emoji":"🔮","aliases":["crystal_ball"]},{"emoji":"🪄","aliases":["magic_wand"]},{"emoji":"🧿","aliases":["nazar_amulet"]},{"emoji":"🎮","aliases":["video_game"]},{"emoji":"🕹️","aliases":["joystick"]},{"emoji":"🎰","aliases":["slot_machine"]},{"emoji":"🎲","aliases":["game_die"]},{"emoji":"🧩","aliases":["jigsaw"]},{"emoji":"🧸","aliases":["teddy_bear"]},{"emoji":"🪅","aliases":["pinata"]},{"emoji":"🪆","aliases":["nesting_dolls"]},{"emoji":"♠️","aliases":["spades"]},{"emoji":"♥️","aliases":["hearts"]},{"emoji":"♦️","aliases":["diamonds"]},{"emoji":"♣️","aliases":["clubs"]},{"emoji":"♟️","aliases":["chess_pawn"]},{"emoji":"🃏","aliases":["black_joker"]},{"emoji":"🀄","aliases":["mahjong"]},{"emoji":"🎴","aliases":["flower_playing_cards"]},{"emoji":"🎭","aliases":["performing_arts"]},{"emoji":"🖼️","aliases":["framed_picture"]},{"emoji":"🎨","aliases":["art"]},{"emoji":"🧵","aliases":["thread"]},{"emoji":"🪡","aliases":["sewing_needle"]},{"emoji":"🧶","aliases":["yarn"]},{"emoji":"🪢","aliases":["knot"]},{"emoji":"👓","aliases":["eyeglasses"]},{"emoji":"🕶️","aliases":["dark_sunglasses"]},{"emoji":"🥽","aliases":["goggles"]},{"emoji":"🥼","aliases":["lab_coat"]},{"emoji":"🦺","aliases":["safety_vest"]},{"emoji":"👔","aliases":["necktie"]},{"emoji":"👕","aliases":["shirt","tshirt"]},{"emoji":"👖","aliases":["jeans"]},{"emoji":"🧣","aliases":["scarf"]},{"emoji":"🧤","aliases":["gloves"]},{"emoji":"🧥","aliases":["coat"]},{"emoji":"🧦","aliases":["socks"]},{"emoji":"👗","aliases":["dress"]},{"emoji":"👘","aliases":["kimono"]},{"emoji":"🥻","aliases":["sari"]},{"emoji":"🩱","aliases":["one_piece_swimsuit"]},{"emoji":"🩲","aliases":["swim_brief"]},{"emoji":"🩳","aliases":["shorts"]},{"emoji":"👙","aliases":["bikini"]},{"emoji":"👚","aliases":["womans_clothes"]},{"emoji":"👛","aliases":["purse"]},{"emoji":"👜","aliases":["handbag"]},{"emoji":"👝","aliases":["pouch"]},{"emoji":"🛍️","aliases":["shopping"]},{"emoji":"🎒","aliases":["school_satchel"]},{"emoji":"🩴","aliases":["thong_sandal"]},{"emoji":"👞","aliases":["mans_shoe","shoe"]},{"emoji":"👟","aliases":["athletic_shoe"]},{"emoji":"🥾","aliases":["hiking_boot"]},{"emoji":"🥿","aliases":["flat_shoe"]},{"emoji":"👠","aliases":["high_heel"]},{"emoji":"👡","aliases":["sandal"]},{"emoji":"🩰","aliases":["ballet_shoes"]},{"emoji":"👢","aliases":["boot"]},{"emoji":"👑","aliases":["crown"]},{"emoji":"👒","aliases":["womans_hat"]},{"emoji":"🎩","aliases":["tophat"]},{"emoji":"🎓","aliases":["mortar_board"]},{"emoji":"🧢","aliases":["billed_cap"]},{"emoji":"🪖","aliases":["military_helmet"]},{"emoji":"⛑️","aliases":["rescue_worker_helmet"]},{"emoji":"📿","aliases":["prayer_beads"]},{"emoji":"💄","aliases":["lipstick"]},{"emoji":"💍","aliases":["ring"]},{"emoji":"💎","aliases":["gem"]},{"emoji":"🔇","aliases":["mute"]},{"emoji":"🔈","aliases":["speaker"]},{"emoji":"🔉","aliases":["sound"]},{"emoji":"🔊","aliases":["loud_sound"]},{"emoji":"📢","aliases":["loudspeaker"]},{"emoji":"📣","aliases":["mega"]},{"emoji":"📯","aliases":["postal_horn"]},{"emoji":"🔔","aliases":["bell"]},{"emoji":"🔕","aliases":["no_bell"]},{"emoji":"🎼","aliases":["musical_score"]},{"emoji":"🎵","aliases":["musical_note"]},{"emoji":"🎶","aliases":["notes"]},{"emoji":"🎙️","aliases":["studio_microphone"]},{"emoji":"🎚️","aliases":["level_slider"]},{"emoji":"🎛️","aliases":["control_knobs"]},{"emoji":"🎤","aliases":["microphone"]},{"emoji":"🎧","aliases":["headphones"]},{"emoji":"📻","aliases":["radio"]},{"emoji":"🎷","aliases":["saxophone"]},{"emoji":"🪗","aliases":["accordion"]},{"emoji":"🎸","aliases":["guitar"]},{"emoji":"🎹","aliases":["musical_keyboard"]},{"emoji":"🎺","aliases":["trumpet"]},{"emoji":"🎻","aliases":["violin"]},{"emoji":"🪕","aliases":["banjo"]},{"emoji":"🥁","aliases":["drum"]},{"emoji":"🪘","aliases":["long_drum"]},{"emoji":"📱","aliases":["iphone"]},{"emoji":"📲","aliases":["calling"]},{"emoji":"☎️","aliases":["phone","telephone"]},{"emoji":"📞","aliases":["telephone_receiver"]},{"emoji":"📟","aliases":["pager"]},{"emoji":"📠","aliases":["fax"]},{"emoji":"🔋","aliases":["battery"]},{"emoji":"🔌","aliases":["electric_plug"]},{"emoji":"💻","aliases":["computer"]},{"emoji":"🖥️","aliases":["desktop_computer"]},{"emoji":"🖨️","aliases":["printer"]},{"emoji":"⌨️","aliases":["keyboard"]},{"emoji":"🖱️","aliases":["computer_mouse"]},{"emoji":"🖲️","aliases":["trackball"]},{"emoji":"💽","aliases":["minidisc"]},{"emoji":"💾","aliases":["floppy_disk"]},{"emoji":"💿","aliases":["cd"]},{"emoji":"📀","aliases":["dvd"]},{"emoji":"🧮","aliases":["abacus"]},{"emoji":"🎥","aliases":["movie_camera"]},{"emoji":"🎞️","aliases":["film_strip"]},{"emoji":"📽️","aliases":["film_projector"]},{"emoji":"🎬","aliases":["clapper"]},{"emoji":"📺","aliases":["tv"]},{"emoji":"📷","aliases":["camera"]},{"emoji":"📸","aliases":["camera_flash"]},{"emoji":"📹","aliases":["video_camera"]},{"emoji":"📼","aliases":["vhs"]},{"emoji":"🔍","aliases":["mag"]},{"emoji":"🔎","aliases":["mag_right"]},{"emoji":"🕯️","aliases":["candle"]},{"emoji":"💡","aliases":["bulb"]},{"emoji":"🔦","aliases":["flashlight"]},{"emoji":"🏮","aliases":["izakaya_lantern","lantern"]},{"emoji":"🪔","aliases":["diya_lamp"]},{"emoji":"📔","aliases":["notebook_with_decorative_cover"]},{"emoji":"📕","aliases":["closed_book"]},{"emoji":"📖","aliases":["book","open_book"]},{"emoji":"📗","aliases":["green_book"]},{"emoji":"📘","aliases":["blue_book"]},{"emoji":"📙","aliases":["orange_book"]},{"emoji":"📚","aliases":["books"]},{"emoji":"📓","aliases":["notebook"]},{"emoji":"📒","aliases":["ledger"]},{"emoji":"📃","aliases":["page_with_curl"]},{"emoji":"📜","aliases":["scroll"]},{"emoji":"📄","aliases":["page_facing_up"]},{"emoji":"📰","aliases":["newspaper"]},{"emoji":"🗞️","aliases":["newspaper_roll"]},{"emoji":"📑","aliases":["bookmark_tabs"]},{"emoji":"🔖","aliases":["bookmark"]},{"emoji":"🏷️","aliases":["label"]},{"emoji":"💰","aliases":["moneybag"]},{"emoji":"🪙","aliases":["coin"]},{"emoji":"💴","aliases":["yen"]},{"emoji":"💵","aliases":["dollar"]},{"emoji":"💶","aliases":["euro"]},{"emoji":"💷","aliases":["pound"]},{"emoji":"💸","aliases":["money_with_wings"]},{"emoji":"💳","aliases":["credit_card"]},{"emoji":"🧾","aliases":["receipt"]},{"emoji":"💹","aliases":["chart"]},{"emoji":"✉️","aliases":["envelope"]},{"emoji":"📧","aliases":["email","e-mail"]},{"emoji":"📨","aliases":["incoming_envelope"]},{"emoji":"📩","aliases":["envelope_with_arrow"]},{"emoji":"📤","aliases":["outbox_tray"]},{"emoji":"📥","aliases":["inbox_tray"]},{"emoji":"📦","aliases":["package"]},{"emoji":"📫","aliases":["mailbox"]},{"emoji":"📪","aliases":["mailbox_closed"]},{"emoji":"📬","aliases":["mailbox_with_mail"]},{"emoji":"📭","aliases":["mailbox_with_no_mail"]},{"emoji":"📮","aliases":["postbox"]},{"emoji":"🗳️","aliases":["ballot_box"]},{"emoji":"✏️","aliases":["pencil2"]},{"emoji":"✒️","aliases":["black_nib"]},{"emoji":"🖋️","aliases":["fountain_pen"]},{"emoji":"🖊️","aliases":["pen"]},{"emoji":"🖌️","aliases":["paintbrush"]},{"emoji":"🖍️","aliases":["crayon"]},{"emoji":"📝","aliases":["memo","pencil"]},{"emoji":"💼","aliases":["briefcase"]},{"emoji":"📁","aliases":["file_folder"]},{"emoji":"📂","aliases":["open_file_folder"]},{"emoji":"🗂️","aliases":["card_index_dividers"]},{"emoji":"📅","aliases":["date"]},{"emoji":"📆","aliases":["calendar"]},{"emoji":"🗒️","aliases":["spiral_notepad"]},{"emoji":"🗓️","aliases":["spiral_calendar"]},{"emoji":"📇","aliases":["card_index"]},{"emoji":"📈","aliases":["chart_with_upwards_trend"]},{"emoji":"📉","aliases":["chart_with_downwards_trend"]},{"emoji":"📊","aliases":["bar_chart"]},{"emoji":"📋","aliases":["clipboard"]},{"emoji":"📌","aliases":["pushpin"]},{"emoji":"📍","aliases":["round_pushpin"]},{"emoji":"📎","aliases":["paperclip"]},{"emoji":"🖇️","aliases":["paperclips"]},{"emoji":"📏","aliases":["straight_ruler"]},{"emoji":"📐","aliases":["triangular_ruler"]},{"emoji":"✂️","aliases":["scissors"]},{"emoji":"🗃️","aliases":["card_file_box"]},{"emoji":"🗄️","aliases":["file_cabinet"]},{"emoji":"🗑️","aliases":["wastebasket"]},{"emoji":"🔒","aliases":["lock"]},{"emoji":"🔓","aliases":["unlock"]},{"emoji":"🔏","aliases":["lock_with_ink_pen"]},{"emoji":"🔐","aliases":["closed_lock_with_key"]},{"emoji":"🔑","aliases":["key"]},{"emoji":"🗝️","aliases":["old_key"]},{"emoji":"🔨","aliases":["hammer"]},{"emoji":"🪓","aliases":["axe"]},{"emoji":"⛏️","aliases":["pick"]},{"emoji":"⚒️","aliases":["hammer_and_pick"]},{"emoji":"🛠️","aliases":["hammer_and_wrench"]},{"emoji":"🗡️","aliases":["dagger"]},{"emoji":"⚔️","aliases":["crossed_swords"]},{"emoji":"🔫","aliases":["gun"]},{"emoji":"🪃","aliases":["boomerang"]},{"emoji":"🏹","aliases":["bow_and_arrow"]},{"emoji":"🛡️","aliases":["shield"]},{"emoji":"🪚","aliases":["carpentry_saw"]},{"emoji":"🔧","aliases":["wrench"]},{"emoji":"🪛","aliases":["screwdriver"]},{"emoji":"🔩","aliases":["nut_and_bolt"]},{"emoji":"⚙️","aliases":["gear"]},{"emoji":"🗜️","aliases":["clamp"]},{"emoji":"⚖️","aliases":["balance_scale"]},{"emoji":"🦯","aliases":["probing_cane"]},{"emoji":"🔗","aliases":["link"]},{"emoji":"⛓️","aliases":["chains"]},{"emoji":"🪝","aliases":["hook"]},{"emoji":"🧰","aliases":["toolbox"]},{"emoji":"🧲","aliases":["magnet"]},{"emoji":"🪜","aliases":["ladder"]},{"emoji":"⚗️","aliases":["alembic"]},{"emoji":"🧪","aliases":["test_tube"]},{"emoji":"🧫","aliases":["petri_dish"]},{"emoji":"🧬","aliases":["dna"]},{"emoji":"🔬","aliases":["microscope"]},{"emoji":"🔭","aliases":["telescope"]},{"emoji":"📡","aliases":["satellite"]},{"emoji":"💉","aliases":["syringe"]},{"emoji":"🩸","aliases":["drop_of_blood"]},{"emoji":"💊","aliases":["pill"]},{"emoji":"🩹","aliases":["adhesive_bandage"]},{"emoji":"🩺","aliases":["stethoscope"]},{"emoji":"🚪","aliases":["door"]},{"emoji":"🛗","aliases":["elevator"]},{"emoji":"🪞","aliases":["mirror"]},{"emoji":"🪟","aliases":["window"]},{"emoji":"🛏️","aliases":["bed"]},{"emoji":"🛋️","aliases":["couch_and_lamp"]},{"emoji":"🪑","aliases":["chair"]},{"emoji":"🚽","aliases":["toilet"]},{"emoji":"🪠","aliases":["plunger"]},{"emoji":"🚿","aliases":["shower"]},{"emoji":"🛁","aliases":["bathtub"]},{"emoji":"🪤","aliases":["mouse_trap"]},{"emoji":"🪒","aliases":["razor"]},{"emoji":"🧴","aliases":["lotion_bottle"]},{"emoji":"🧷","aliases":["safety_pin"]},{"emoji":"🧹","aliases":["broom"]},{"emoji":"🧺","aliases":["basket"]},{"emoji":"🧻","aliases":["roll_of_paper"]},{"emoji":"🪣","aliases":["bucket"]},{"emoji":"🧼","aliases":["soap"]},{"emoji":"🪥","aliases":["toothbrush"]},{"emoji":"🧽","aliases":["sponge"]},{"emoji":"🧯","aliases":["fire_extinguisher"]},{"emoji":"🛒","aliases":["shopping_cart"]},{"emoji":"🚬","aliases":["smoking"]},{"emoji":"⚰️","aliases":["coffin"]},{"emoji":"🪦","aliases":["headstone"]},{"emoji":"⚱️","aliases":["funeral_urn"]},{"emoji":"🗿","aliases":["moyai"]},{"emoji":"🪧","aliases":["placard"]},{"emoji":"🏧","aliases":["atm"]},{"emoji":"🚮","aliases":["put_litter_in_its_place"]},{"emoji":"🚰","aliases":["potable_water"]},{"emoji":"♿","aliases":["wheelchair"]},{"emoji":"🚹","aliases":["mens"]},{"emoji":"🚺","aliases":["womens"]},{"emoji":"🚻","aliases":["restroom"]},{"emoji":"🚼","aliases":["baby_symbol"]},{"emoji":"🚾","aliases":["wc"]},{"emoji":"🛂","aliases":["passport_control"]},{"emoji":"🛃","aliases":["customs"]},{"emoji":"🛄","aliases":["baggage_claim"]},{"emoji":"🛅","aliases":["left_luggage"]},{"emoji":"⚠️","aliases":["warning"]},{"emoji":"🚸","aliases":["children_crossing"]},{"emoji":"⛔","aliases":["no_entry"]},{"emoji":"🚫","aliases":["no_entry_sign"]},{"emoji":"🚳","aliases":["no_bicycles"]},{"emoji":"🚭","aliases":["no_smoking"]},{"emoji":"🚯","aliases":["do_not_litter"]},{"emoji":"🚱","aliases":["non-potable_water"]},{"emoji":"🚷","aliases":["no_pedestrians"]},{"emoji":"📵","aliases":["no_mobile_phones"]},{"emoji":"🔞","aliases":["underage"]},{"emoji":"☢️","aliases":["radioactive"]},{"emoji":"☣️","aliases":["biohazard"]},{"emoji":"⬆️","aliases":["arrow_up"]},{"emoji":"↗️","aliases":["arrow_upper_right"]},{"emoji":"➡️","aliases":["arrow_right"]},{"emoji":"↘️","aliases":["arrow_lower_right"]},{"emoji":"⬇️","aliases":["arrow_down"]},{"emoji":"↙️","aliases":["arrow_lower_left"]},{"emoji":"⬅️","aliases":["arrow_left"]},{"emoji":"↖️","aliases":["arrow_upper_left"]},{"emoji":"↕️","aliases":["arrow_up_down"]},{"emoji":"↔️","aliases":["left_right_arrow"]},{"emoji":"↩️","aliases":["leftwards_arrow_with_hook"]},{"emoji":"↪️","aliases":["arrow_right_hook"]},{"emoji":"⤴️","aliases":["arrow_heading_up"]},{"emoji":"⤵️","aliases":["arrow_heading_down"]},{"emoji":"🔃","aliases":["arrows_clockwise"]},{"emoji":"🔄","aliases":["arrows_counterclockwise"]},{"emoji":"🔙","aliases":["back"]},{"emoji":"🔚","aliases":["end"]},{"emoji":"🔛","aliases":["on"]},{"emoji":"🔜","aliases":["soon"]},{"emoji":"🔝","aliases":["top"]},{"emoji":"🛐","aliases":["place_of_worship"]},{"emoji":"⚛️","aliases":["atom_symbol"]},{"emoji":"🕉️","aliases":["om"]},{"emoji":"✡️","aliases":["star_of_david"]},{"emoji":"☸️","aliases":["wheel_of_dharma"]},{"emoji":"☯️","aliases":["yin_yang"]},{"emoji":"✝️","aliases":["latin_cross"]},{"emoji":"☦️","aliases":["orthodox_cross"]},{"emoji":"☪️","aliases":["star_and_crescent"]},{"emoji":"☮️","aliases":["peace_symbol"]},{"emoji":"🕎","aliases":["menorah"]},{"emoji":"🔯","aliases":["six_pointed_star"]},{"emoji":"♈","aliases":["aries"]},{"emoji":"♉","aliases":["taurus"]},{"emoji":"♊","aliases":["gemini"]},{"emoji":"♋","aliases":["cancer"]},{"emoji":"♌","aliases":["leo"]},{"emoji":"♍","aliases":["virgo"]},{"emoji":"♎","aliases":["libra"]},{"emoji":"♏","aliases":["scorpius"]},{"emoji":"♐","aliases":["sagittarius"]},{"emoji":"♑","aliases":["capricorn"]},{"emoji":"♒","aliases":["aquarius"]},{"emoji":"♓","aliases":["pisces"]},{"emoji":"⛎","aliases":["ophiuchus"]},{"emoji":"🔀","aliases":["twisted_rightwards_arrows"]},{"emoji":"🔁","aliases":["repeat"]},{"emoji":"🔂","aliases":["repeat_one"]},{"emoji":"▶️","aliases":["arrow_forward"]},{"emoji":"⏩","aliases":["fast_forward"]},{"emoji":"⏭️","aliases":["next_track_button"]},{"emoji":"⏯️","aliases":["play_or_pause_button"]},{"emoji":"◀️","aliases":["arrow_backward"]},{"emoji":"⏪","aliases":["rewind"]},{"emoji":"⏮️","aliases":["previous_track_button"]},{"emoji":"🔼","aliases":["arrow_up_small"]},{"emoji":"⏫","aliases":["arrow_double_up"]},{"emoji":"🔽","aliases":["arrow_down_small"]},{"emoji":"⏬","aliases":["arrow_double_down"]},{"emoji":"⏸️","aliases":["pause_button"]},{"emoji":"⏹️","aliases":["stop_button"]},{"emoji":"⏺️","aliases":["record_button"]},{"emoji":"⏏️","aliases":["eject_button"]},{"emoji":"🎦","aliases":["cinema"]},{"emoji":"🔅","aliases":["low_brightness"]},{"emoji":"🔆","aliases":["high_brightness"]},{"emoji":"📶","aliases":["signal_strength"]},{"emoji":"📳","aliases":["vibration_mode"]},{"emoji":"📴","aliases":["mobile_phone_off"]},{"emoji":"♀️","aliases":["female_sign"]},{"emoji":"♂️","aliases":["male_sign"]},{"emoji":"⚧️","aliases":["transgender_symbol"]},{"emoji":"✖️","aliases":["heavy_multiplication_x"]},{"emoji":"➕","aliases":["heavy_plus_sign"]},{"emoji":"➖","aliases":["heavy_minus_sign"]},{"emoji":"➗","aliases":["heavy_division_sign"]},{"emoji":"♾️","aliases":["infinity"]},{"emoji":"‼️","aliases":["bangbang"]},{"emoji":"⁉️","aliases":["interrobang"]},{"emoji":"❓","aliases":["question"]},{"emoji":"❔","aliases":["grey_question"]},{"emoji":"❕","aliases":["grey_exclamation"]},{"emoji":"❗","aliases":["exclamation","heavy_exclamation_mark"]},{"emoji":"〰️","aliases":["wavy_dash"]},{"emoji":"💱","aliases":["currency_exchange"]},{"emoji":"💲","aliases":["heavy_dollar_sign"]},{"emoji":"⚕️","aliases":["medical_symbol"]},{"emoji":"♻️","aliases":["recycle"]},{"emoji":"⚜️","aliases":["fleur_de_lis"]},{"emoji":"🔱","aliases":["trident"]},{"emoji":"📛","aliases":["name_badge"]},{"emoji":"🔰","aliases":["beginner"]},{"emoji":"⭕","aliases":["o"]},{"emoji":"✅","aliases":["white_check_mark"]},{"emoji":"☑️","aliases":["ballot_box_with_check"]},{"emoji":"✔️","aliases":["heavy_check_mark"]},{"emoji":"❌","aliases":["x"]},{"emoji":"❎","aliases":["negative_squared_cross_mark"]},{"emoji":"➰","aliases":["curly_loop"]},{"emoji":"➿","aliases":["loop"]},{"emoji":"〽️","aliases":["part_alternation_mark"]},{"emoji":"✳️","aliases":["eight_spoked_asterisk"]},{"emoji":"✴️","aliases":["eight_pointed_black_star"]},{"emoji":"❇️","aliases":["sparkle"]},{"emoji":"©️","aliases":["copyright"]},{"emoji":"®️","aliases":["registered"]},{"emoji":"™️","aliases":["tm"]},{"emoji":"#️⃣","aliases":["hash"]},{"emoji":"*️⃣","aliases":["asterisk"]},{"emoji":"0️⃣","aliases":["zero"]},{"emoji":"1️⃣","aliases":["one"]},{"emoji":"2️⃣","aliases":["two"]},{"emoji":"3️⃣","aliases":["three"]},{"emoji":"4️⃣","aliases":["four"]},{"emoji":"5️⃣","aliases":["five"]},{"emoji":"6️⃣","aliases":["six"]},{"emoji":"7️⃣","aliases":["seven"]},{"emoji":"8️⃣","aliases":["eight"]},{"emoji":"9️⃣","aliases":["nine"]},{"emoji":"🔟","aliases":["keycap_ten"]},{"emoji":"🔠","aliases":["capital_abcd"]},{"emoji":"🔡","aliases":["abcd"]},{"emoji":"🔢","aliases":["1234"]},{"emoji":"🔣","aliases":["symbols"]},{"emoji":"🔤","aliases":["abc"]},{"emoji":"🅰️","aliases":["a"]},{"emoji":"🆎","aliases":["ab"]},{"emoji":"🅱️","aliases":["b"]},{"emoji":"🆑","aliases":["cl"]},{"emoji":"🆒","aliases":["cool"]},{"emoji":"🆓","aliases":["free"]},{"emoji":"ℹ️","aliases":["information_source"]},{"emoji":"🆔","aliases":["id"]},{"emoji":"Ⓜ️","aliases":["m"]},{"emoji":"🆕","aliases":["new"]},{"emoji":"🆖","aliases":["ng"]},{"emoji":"🅾️","aliases":["o2"]},{"emoji":"🆗","aliases":["ok"]},{"emoji":"🅿️","aliases":["parking"]},{"emoji":"🆘","aliases":["sos"]},{"emoji":"🆙","aliases":["up"]},{"emoji":"🆚","aliases":["vs"]},{"emoji":"🈁","aliases":["koko"]},{"emoji":"🈂️","aliases":["sa"]},{"emoji":"🈷️","aliases":["u6708"]},{"emoji":"🈶","aliases":["u6709"]},{"emoji":"🈯","aliases":["u6307"]},{"emoji":"🉐","aliases":["ideograph_advantage"]},{"emoji":"🈹","aliases":["u5272"]},{"emoji":"🈚","aliases":["u7121"]},{"emoji":"🈲","aliases":["u7981"]},{"emoji":"🉑","aliases":["accept"]},{"emoji":"🈸","aliases":["u7533"]},{"emoji":"🈴","aliases":["u5408"]},{"emoji":"🈳","aliases":["u7a7a"]},{"emoji":"㊗️","aliases":["congratulations"]},{"emoji":"㊙️","aliases":["secret"]},{"emoji":"🈺","aliases":["u55b6"]},{"emoji":"🈵","aliases":["u6e80"]},{"emoji":"🔴","aliases":["red_circle"]},{"emoji":"🟠","aliases":["orange_circle"]},{"emoji":"🟡","aliases":["yellow_circle"]},{"emoji":"🟢","aliases":["green_circle"]},{"emoji":"🔵","aliases":["large_blue_circle"]},{"emoji":"🟣","aliases":["purple_circle"]},{"emoji":"🟤","aliases":["brown_circle"]},{"emoji":"⚫","aliases":["black_circle"]},{"emoji":"⚪","aliases":["white_circle"]},{"emoji":"🟥","aliases":["red_square"]},{"emoji":"🟧","aliases":["orange_square"]},{"emoji":"🟨","aliases":["yellow_square"]},{"emoji":"🟩","aliases":["green_square"]},{"emoji":"🟦","aliases":["blue_square"]},{"emoji":"🟪","aliases":["purple_square"]},{"emoji":"🟫","aliases":["brown_square"]},{"emoji":"⬛","aliases":["black_large_square"]},{"emoji":"⬜","aliases":["white_large_square"]},{"emoji":"◼️","aliases":["black_medium_square"]},{"emoji":"◻️","aliases":["white_medium_square"]},{"emoji":"◾","aliases":["black_medium_small_square"]},{"emoji":"◽","aliases":["white_medium_small_square"]},{"emoji":"▪️","aliases":["black_small_square"]},{"emoji":"▫️","aliases":["white_small_square"]},{"emoji":"🔶","aliases":["large_orange_diamond"]},{"emoji":"🔷","aliases":["large_blue_diamond"]},{"emoji":"🔸","aliases":["small_orange_diamond"]},{"emoji":"🔹","aliases":["small_blue_diamond"]},{"emoji":"🔺","aliases":["small_red_triangle"]},{"emoji":"🔻","aliases":["small_red_triangle_down"]},{"emoji":"💠","aliases":["diamond_shape_with_a_dot_inside"]},{"emoji":"🔘","aliases":["radio_button"]},{"emoji":"🔳","aliases":["white_square_button"]},{"emoji":"🔲","aliases":["black_square_button"]},{"emoji":"🏁","aliases":["checkered_flag"]},{"emoji":"🚩","aliases":["triangular_flag_on_post"]},{"emoji":"🎌","aliases":["crossed_flags"]},{"emoji":"🏴","aliases":["black_flag"]},{"emoji":"🏳️","aliases":["white_flag"]},{"emoji":"🏳️‍🌈","aliases":["rainbow_flag"]},{"emoji":"🏳️‍⚧️","aliases":["transgender_flag"]},{"emoji":"🏴‍☠️","aliases":["pirate_flag"]},{"emoji":"🇦🇨","aliases":["ascension_island"]},{"emoji":"🇦🇩","aliases":["andorra"]},{"emoji":"🇦🇪","aliases":["united_arab_emirates"]},{"emoji":"🇦🇫","aliases":["afghanistan"]},{"emoji":"🇦🇬","aliases":["antigua_barbuda"]},{"emoji":"🇦🇮","aliases":["anguilla"]},{"emoji":"🇦🇱","aliases":["albania"]},{"emoji":"🇦🇲","aliases":["armenia"]},{"emoji":"🇦🇴","aliases":["angola"]},{"emoji":"🇦🇶","aliases":["antarctica"]},{"emoji":"🇦🇷","aliases":["argentina"]},{"emoji":"🇦🇸","aliases":["american_samoa"]},{"emoji":"🇦🇹","aliases":["austria"]},{"emoji":"🇦🇺","aliases":["australia"]},{"emoji":"🇦🇼","aliases":["aruba"]},{"emoji":"🇦🇽","aliases":["aland_islands"]},{"emoji":"🇦🇿","aliases":["azerbaijan"]},{"emoji":"🇧🇦","aliases":["bosnia_herzegovina"]},{"emoji":"🇧🇧","aliases":["barbados"]},{"emoji":"🇧🇩","aliases":["bangladesh"]},{"emoji":"🇧🇪","aliases":["belgium"]},{"emoji":"🇧🇫","aliases":["burkina_faso"]},{"emoji":"🇧🇬","aliases":["bulgaria"]},{"emoji":"🇧🇭","aliases":["bahrain"]},{"emoji":"🇧🇮","aliases":["burundi"]},{"emoji":"🇧🇯","aliases":["benin"]},{"emoji":"🇧🇱","aliases":["st_barthelemy"]},{"emoji":"🇧🇲","aliases":["bermuda"]},{"emoji":"🇧🇳","aliases":["brunei"]},{"emoji":"🇧🇴","aliases":["bolivia"]},{"emoji":"🇧🇶","aliases":["caribbean_netherlands"]},{"emoji":"🇧🇷","aliases":["brazil"]},{"emoji":"🇧🇸","aliases":["bahamas"]},{"emoji":"🇧🇹","aliases":["bhutan"]},{"emoji":"🇧🇻","aliases":["bouvet_island"]},{"emoji":"🇧🇼","aliases":["botswana"]},{"emoji":"🇧🇾","aliases":["belarus"]},{"emoji":"🇧🇿","aliases":["belize"]},{"emoji":"🇨🇦","aliases":["canada"]},{"emoji":"🇨🇨","aliases":["cocos_islands"]},{"emoji":"🇨🇩","aliases":["congo_kinshasa"]},{"emoji":"🇨🇫","aliases":["central_african_republic"]},{"emoji":"🇨🇬","aliases":["congo_brazzaville"]},{"emoji":"🇨🇭","aliases":["switzerland"]},{"emoji":"🇨🇮","aliases":["cote_divoire"]},{"emoji":"🇨🇰","aliases":["cook_islands"]},{"emoji":"🇨🇱","aliases":["chile"]},{"emoji":"🇨🇲","aliases":["cameroon"]},{"emoji":"🇨🇳","aliases":["cn"]},{"emoji":"🇨🇴","aliases":["colombia"]},{"emoji":"🇨🇵","aliases":["clipperton_island"]},{"emoji":"🇨🇷","aliases":["costa_rica"]},{"emoji":"🇨🇺","aliases":["cuba"]},{"emoji":"🇨🇻","aliases":["cape_verde"]},{"emoji":"🇨🇼","aliases":["curacao"]},{"emoji":"🇨🇽","aliases":["christmas_island"]},{"emoji":"🇨🇾","aliases":["cyprus"]},{"emoji":"🇨🇿","aliases":["czech_republic"]},{"emoji":"🇩🇪","aliases":["de"]},{"emoji":"🇩🇬","aliases":["diego_garcia"]},{"emoji":"🇩🇯","aliases":["djibouti"]},{"emoji":"🇩🇰","aliases":["denmark"]},{"emoji":"🇩🇲","aliases":["dominica"]},{"emoji":"🇩🇴","aliases":["dominican_republic"]},{"emoji":"🇩🇿","aliases":["algeria"]},{"emoji":"🇪🇦","aliases":["ceuta_melilla"]},{"emoji":"🇪🇨","aliases":["ecuador"]},{"emoji":"🇪🇪","aliases":["estonia"]},{"emoji":"🇪🇬","aliases":["egypt"]},{"emoji":"🇪🇭","aliases":["western_sahara"]},{"emoji":"🇪🇷","aliases":["eritrea"]},{"emoji":"🇪🇸","aliases":["es"]},{"emoji":"🇪🇹","aliases":["ethiopia"]},{"emoji":"🇪🇺","aliases":["eu","european_union"]},{"emoji":"🇫🇮","aliases":["finland"]},{"emoji":"🇫🇯","aliases":["fiji"]},{"emoji":"🇫🇰","aliases":["falkland_islands"]},{"emoji":"🇫🇲","aliases":["micronesia"]},{"emoji":"🇫🇴","aliases":["faroe_islands"]},{"emoji":"🇫🇷","aliases":["fr"]},{"emoji":"🇬🇦","aliases":["gabon"]},{"emoji":"🇬🇧","aliases":["gb","uk"]},{"emoji":"🇬🇩","aliases":["grenada"]},{"emoji":"🇬🇪","aliases":["georgia"]},{"emoji":"🇬🇫","aliases":["french_guiana"]},{"emoji":"🇬🇬","aliases":["guernsey"]},{"emoji":"🇬🇭","aliases":["ghana"]},{"emoji":"🇬🇮","aliases":["gibraltar"]},{"emoji":"🇬🇱","aliases":["greenland"]},{"emoji":"🇬🇲","aliases":["gambia"]},{"emoji":"🇬🇳","aliases":["guinea"]},{"emoji":"🇬🇵","aliases":["guadeloupe"]},{"emoji":"🇬🇶","aliases":["equatorial_guinea"]},{"emoji":"🇬🇷","aliases":["greece"]},{"emoji":"🇬🇸","aliases":["south_georgia_south_sandwich_islands"]},{"emoji":"🇬🇹","aliases":["guatemala"]},{"emoji":"🇬🇺","aliases":["guam"]},{"emoji":"🇬🇼","aliases":["guinea_bissau"]},{"emoji":"🇬🇾","aliases":["guyana"]},{"emoji":"🇭🇰","aliases":["hong_kong"]},{"emoji":"🇭🇲","aliases":["heard_mcdonald_islands"]},{"emoji":"🇭🇳","aliases":["honduras"]},{"emoji":"🇭🇷","aliases":["croatia"]},{"emoji":"🇭🇹","aliases":["haiti"]},{"emoji":"🇭🇺","aliases":["hungary"]},{"emoji":"🇮🇨","aliases":["canary_islands"]},{"emoji":"🇮🇩","aliases":["indonesia"]},{"emoji":"🇮🇪","aliases":["ireland"]},{"emoji":"🇮🇱","aliases":["israel"]},{"emoji":"🇮🇲","aliases":["isle_of_man"]},{"emoji":"🇮🇳","aliases":["india"]},{"emoji":"🇮🇴","aliases":["british_indian_ocean_territory"]},{"emoji":"🇮🇶","aliases":["iraq"]},{"emoji":"🇮🇷","aliases":["iran"]},{"emoji":"🇮🇸","aliases":["iceland"]},{"emoji":"🇮🇹","aliases":["it"]},{"emoji":"🇯🇪","aliases":["jersey"]},{"emoji":"🇯🇲","aliases":["jamaica"]},{"emoji":"🇯🇴","aliases":["jordan"]},{"emoji":"🇯🇵","aliases":["jp"]},{"emoji":"🇰🇪","aliases":["kenya"]},{"emoji":"🇰🇬","aliases":["kyrgyzstan"]},{"emoji":"🇰🇭","aliases":["cambodia"]},{"emoji":"🇰🇮","aliases":["kiribati"]},{"emoji":"🇰🇲","aliases":["comoros"]},{"emoji":"🇰🇳","aliases":["st_kitts_nevis"]},{"emoji":"🇰🇵","aliases":["north_korea"]},{"emoji":"🇰🇷","aliases":["kr"]},{"emoji":"🇰🇼","aliases":["kuwait"]},{"emoji":"🇰🇾","aliases":["cayman_islands"]},{"emoji":"🇰🇿","aliases":["kazakhstan"]},{"emoji":"🇱🇦","aliases":["laos"]},{"emoji":"🇱🇧","aliases":["lebanon"]},{"emoji":"🇱🇨","aliases":["st_lucia"]},{"emoji":"🇱🇮","aliases":["liechtenstein"]},{"emoji":"🇱🇰","aliases":["sri_lanka"]},{"emoji":"🇱🇷","aliases":["liberia"]},{"emoji":"🇱🇸","aliases":["lesotho"]},{"emoji":"🇱🇹","aliases":["lithuania"]},{"emoji":"🇱🇺","aliases":["luxembourg"]},{"emoji":"🇱🇻","aliases":["latvia"]},{"emoji":"🇱🇾","aliases":["libya"]},{"emoji":"🇲🇦","aliases":["morocco"]},{"emoji":"🇲🇨","aliases":["monaco"]},{"emoji":"🇲🇩","aliases":["moldova"]},{"emoji":"🇲🇪","aliases":["montenegro"]},{"emoji":"🇲🇫","aliases":["st_martin"]},{"emoji":"🇲🇬","aliases":["madagascar"]},{"emoji":"🇲🇭","aliases":["marshall_islands"]},{"emoji":"🇲🇰","aliases":["macedonia"]},{"emoji":"🇲🇱","aliases":["mali"]},{"emoji":"🇲🇲","aliases":["myanmar"]},{"emoji":"🇲🇳","aliases":["mongolia"]},{"emoji":"🇲🇴","aliases":["macau"]},{"emoji":"🇲🇵","aliases":["northern_mariana_islands"]},{"emoji":"🇲🇶","aliases":["martinique"]},{"emoji":"🇲🇷","aliases":["mauritania"]},{"emoji":"🇲🇸","aliases":["montserrat"]},{"emoji":"🇲🇹","aliases":["malta"]},{"emoji":"🇲🇺","aliases":["mauritius"]},{"emoji":"🇲🇻","aliases":["maldives"]},{"emoji":"🇲🇼","aliases":["malawi"]},{"emoji":"🇲🇽","aliases":["mexico"]},{"emoji":"🇲🇾","aliases":["malaysia"]},{"emoji":"🇲🇿","aliases":["mozambique"]},{"emoji":"🇳🇦","aliases":["namibia"]},{"emoji":"🇳🇨","aliases":["new_caledonia"]},{"emoji":"🇳🇪","aliases":["niger"]},{"emoji":"🇳🇫","aliases":["norfolk_island"]},{"emoji":"🇳🇬","aliases":["nigeria"]},{"emoji":"🇳🇮","aliases":["nicaragua"]},{"emoji":"🇳🇱","aliases":["netherlands"]},{"emoji":"🇳🇴","aliases":["norway"]},{"emoji":"🇳🇵","aliases":["nepal"]},{"emoji":"🇳🇷","aliases":["nauru"]},{"emoji":"🇳🇺","aliases":["niue"]},{"emoji":"🇳🇿","aliases":["new_zealand"]},{"emoji":"🇴🇲","aliases":["oman"]},{"emoji":"🇵🇦","aliases":["panama"]},{"emoji":"🇵🇪","aliases":["peru"]},{"emoji":"🇵🇫","aliases":["french_polynesia"]},{"emoji":"🇵🇬","aliases":["papua_new_guinea"]},{"emoji":"🇵🇭","aliases":["philippines"]},{"emoji":"🇵🇰","aliases":["pakistan"]},{"emoji":"🇵🇱","aliases":["poland"]},{"emoji":"🇵🇲","aliases":["st_pierre_miquelon"]},{"emoji":"🇵🇳","aliases":["pitcairn_islands"]},{"emoji":"🇵🇷","aliases":["puerto_rico"]},{"emoji":"🇵🇸","aliases":["palestinian_territories"]},{"emoji":"🇵🇹","aliases":["portugal"]},{"emoji":"🇵🇼","aliases":["palau"]},{"emoji":"🇵🇾","aliases":["paraguay"]},{"emoji":"🇶🇦","aliases":["qatar"]},{"emoji":"🇷🇪","aliases":["reunion"]},{"emoji":"🇷🇴","aliases":["romania"]},{"emoji":"🇷🇸","aliases":["serbia"]},{"emoji":"🇷🇺","aliases":["ru"]},{"emoji":"🇷🇼","aliases":["rwanda"]},{"emoji":"🇸🇦","aliases":["saudi_arabia"]},{"emoji":"🇸🇧","aliases":["solomon_islands"]},{"emoji":"🇸🇨","aliases":["seychelles"]},{"emoji":"🇸🇩","aliases":["sudan"]},{"emoji":"🇸🇪","aliases":["sweden"]},{"emoji":"🇸🇬","aliases":["singapore"]},{"emoji":"🇸🇭","aliases":["st_helena"]},{"emoji":"🇸🇮","aliases":["slovenia"]},{"emoji":"🇸🇯","aliases":["svalbard_jan_mayen"]},{"emoji":"🇸🇰","aliases":["slovakia"]},{"emoji":"🇸🇱","aliases":["sierra_leone"]},{"emoji":"🇸🇲","aliases":["san_marino"]},{"emoji":"🇸🇳","aliases":["senegal"]},{"emoji":"🇸🇴","aliases":["somalia"]},{"emoji":"🇸🇷","aliases":["suriname"]},{"emoji":"🇸🇸","aliases":["south_sudan"]},{"emoji":"🇸🇹","aliases":["sao_tome_principe"]},{"emoji":"🇸🇻","aliases":["el_salvador"]},{"emoji":"🇸🇽","aliases":["sint_maarten"]},{"emoji":"🇸🇾","aliases":["syria"]},{"emoji":"🇸🇿","aliases":["swaziland"]},{"emoji":"🇹🇦","aliases":["tristan_da_cunha"]},{"emoji":"🇹🇨","aliases":["turks_caicos_islands"]},{"emoji":"🇹🇩","aliases":["chad"]},{"emoji":"🇹🇫","aliases":["french_southern_territories"]},{"emoji":"🇹🇬","aliases":["togo"]},{"emoji":"🇹🇭","aliases":["thailand"]},{"emoji":"🇹🇯","aliases":["tajikistan"]},{"emoji":"🇹🇰","aliases":["tokelau"]},{"emoji":"🇹🇱","aliases":["timor_leste"]},{"emoji":"🇹🇲","aliases":["turkmenistan"]},{"emoji":"🇹🇳","aliases":["tunisia"]},{"emoji":"🇹🇴","aliases":["tonga"]},{"emoji":"🇹🇷","aliases":["tr"]},{"emoji":"🇹🇹","aliases":["trinidad_tobago"]},{"emoji":"🇹🇻","aliases":["tuvalu"]},{"emoji":"🇹🇼","aliases":["taiwan"]},{"emoji":"🇹🇿","aliases":["tanzania"]},{"emoji":"🇺🇦","aliases":["ukraine"]},{"emoji":"🇺🇬","aliases":["uganda"]},{"emoji":"🇺🇲","aliases":["us_outlying_islands"]},{"emoji":"🇺🇳","aliases":["united_nations"]},{"emoji":"🇺🇸","aliases":["us"]},{"emoji":"🇺🇾","aliases":["uruguay"]},{"emoji":"🇺🇿","aliases":["uzbekistan"]},{"emoji":"🇻🇦","aliases":["vatican_city"]},{"emoji":"🇻🇨","aliases":["st_vincent_grenadines"]},{"emoji":"🇻🇪","aliases":["venezuela"]},{"emoji":"🇻🇬","aliases":["british_virgin_islands"]},{"emoji":"🇻🇮","aliases":["us_virgin_islands"]},{"emoji":"🇻🇳","aliases":["vietnam"]},{"emoji":"🇻🇺","aliases":["vanuatu"]},{"emoji":"🇼🇫","aliases":["wallis_futuna"]},{"emoji":"🇼🇸","aliases":["samoa"]},{"emoji":"🇽🇰","aliases":["kosovo"]},{"emoji":"🇾🇪","aliases":["yemen"]},{"emoji":"🇾🇹","aliases":["mayotte"]},{"emoji":"🇿🇦","aliases":["south_africa"]},{"emoji":"🇿🇲","aliases":["zambia"]},{"emoji":"🇿🇼","aliases":["zimbabwe"]},{"emoji":"🏴󠁧󠁢󠁥󠁮󠁧󠁿","aliases":["england"]},{"emoji":"🏴󠁧󠁢󠁳󠁣󠁴󠁿","aliases":["scotland"]},{"emoji":"🏴󠁧󠁢󠁷󠁬󠁳󠁿","aliases":["wales"]}] +[ + { "emoji": "😀", "aliases": ["grinning"] }, + { "emoji": "😃", "aliases": ["smiley"] }, + { "emoji": "😄", "aliases": ["smile"] }, + { "emoji": "😁", "aliases": ["grin"] }, + { "emoji": "😆", "aliases": ["laughing", "satisfied"] }, + { "emoji": "😅", "aliases": ["sweat_smile"] }, + { "emoji": "🤣", "aliases": ["rofl"] }, + { "emoji": "😂", "aliases": ["joy"] }, + { "emoji": "🙂", "aliases": ["slightly_smiling_face"] }, + { "emoji": "🙃", "aliases": ["upside_down_face"] }, + { "emoji": "😉", "aliases": ["wink"] }, + { "emoji": "😊", "aliases": ["blush"] }, + { "emoji": "😇", "aliases": ["innocent"] }, + { "emoji": "🥰", "aliases": ["smiling_face_with_three_hearts"] }, + { "emoji": "😍", "aliases": ["heart_eyes"] }, + { "emoji": "🤩", "aliases": ["star_struck"] }, + { "emoji": "😘", "aliases": ["kissing_heart"] }, + { "emoji": "😗", "aliases": ["kissing"] }, + { "emoji": "☺️", "aliases": ["relaxed"] }, + { "emoji": "😚", "aliases": ["kissing_closed_eyes"] }, + { "emoji": "😙", "aliases": ["kissing_smiling_eyes"] }, + { "emoji": "🥲", "aliases": ["smiling_face_with_tear"] }, + { "emoji": "😋", "aliases": ["yum"] }, + { "emoji": "😛", "aliases": ["stuck_out_tongue"] }, + { "emoji": "😜", "aliases": ["stuck_out_tongue_winking_eye"] }, + { "emoji": "🤪", "aliases": ["zany_face"] }, + { "emoji": "😝", "aliases": ["stuck_out_tongue_closed_eyes"] }, + { "emoji": "🤑", "aliases": ["money_mouth_face"] }, + { "emoji": "🤗", "aliases": ["hugs"] }, + { "emoji": "🤭", "aliases": ["hand_over_mouth"] }, + { "emoji": "🤫", "aliases": ["shushing_face"] }, + { "emoji": "🤔", "aliases": ["thinking"] }, + { "emoji": "🤐", "aliases": ["zipper_mouth_face"] }, + { "emoji": "🤨", "aliases": ["raised_eyebrow"] }, + { "emoji": "😐", "aliases": ["neutral_face"] }, + { "emoji": "😑", "aliases": ["expressionless"] }, + { "emoji": "😶", "aliases": ["no_mouth"] }, + { "emoji": "😶‍🌫️", "aliases": ["face_in_clouds"] }, + { "emoji": "😏", "aliases": ["smirk"] }, + { "emoji": "😒", "aliases": ["unamused"] }, + { "emoji": "🙄", "aliases": ["roll_eyes"] }, + { "emoji": "😬", "aliases": ["grimacing"] }, + { "emoji": "😮‍💨", "aliases": ["face_exhaling"] }, + { "emoji": "🤥", "aliases": ["lying_face"] }, + { "emoji": "😌", "aliases": ["relieved"] }, + { "emoji": "😔", "aliases": ["pensive"] }, + { "emoji": "😪", "aliases": ["sleepy"] }, + { "emoji": "🤤", "aliases": ["drooling_face"] }, + { "emoji": "😴", "aliases": ["sleeping"] }, + { "emoji": "😷", "aliases": ["mask"] }, + { "emoji": "🤒", "aliases": ["face_with_thermometer"] }, + { "emoji": "🤕", "aliases": ["face_with_head_bandage"] }, + { "emoji": "🤢", "aliases": ["nauseated_face"] }, + { "emoji": "🤮", "aliases": ["vomiting_face"] }, + { "emoji": "🤧", "aliases": ["sneezing_face"] }, + { "emoji": "🥵", "aliases": ["hot_face"] }, + { "emoji": "🥶", "aliases": ["cold_face"] }, + { "emoji": "🥴", "aliases": ["woozy_face"] }, + { "emoji": "😵", "aliases": ["dizzy_face"] }, + { "emoji": "😵‍💫", "aliases": ["face_with_spiral_eyes"] }, + { "emoji": "🤯", "aliases": ["exploding_head"] }, + { "emoji": "🤠", "aliases": ["cowboy_hat_face"] }, + { "emoji": "🥳", "aliases": ["partying_face"] }, + { "emoji": "🥸", "aliases": ["disguised_face"] }, + { "emoji": "😎", "aliases": ["sunglasses"] }, + { "emoji": "🤓", "aliases": ["nerd_face"] }, + { "emoji": "🧐", "aliases": ["monocle_face"] }, + { "emoji": "😕", "aliases": ["confused"] }, + { "emoji": "😟", "aliases": ["worried"] }, + { "emoji": "🙁", "aliases": ["slightly_frowning_face"] }, + { "emoji": "☹️", "aliases": ["frowning_face"] }, + { "emoji": "😮", "aliases": ["open_mouth"] }, + { "emoji": "😯", "aliases": ["hushed"] }, + { "emoji": "😲", "aliases": ["astonished"] }, + { "emoji": "😳", "aliases": ["flushed"] }, + { "emoji": "🥺", "aliases": ["pleading_face"] }, + { "emoji": "😦", "aliases": ["frowning"] }, + { "emoji": "😧", "aliases": ["anguished"] }, + { "emoji": "😨", "aliases": ["fearful"] }, + { "emoji": "😰", "aliases": ["cold_sweat"] }, + { "emoji": "😥", "aliases": ["disappointed_relieved"] }, + { "emoji": "😢", "aliases": ["cry"] }, + { "emoji": "😭", "aliases": ["sob"] }, + { "emoji": "😱", "aliases": ["scream"] }, + { "emoji": "😖", "aliases": ["confounded"] }, + { "emoji": "😣", "aliases": ["persevere"] }, + { "emoji": "😞", "aliases": ["disappointed"] }, + { "emoji": "😓", "aliases": ["sweat"] }, + { "emoji": "😩", "aliases": ["weary"] }, + { "emoji": "😫", "aliases": ["tired_face"] }, + { "emoji": "🥱", "aliases": ["yawning_face"] }, + { "emoji": "😤", "aliases": ["triumph"] }, + { "emoji": "😡", "aliases": ["rage", "pout"] }, + { "emoji": "😠", "aliases": ["angry"] }, + { "emoji": "🤬", "aliases": ["cursing_face"] }, + { "emoji": "😈", "aliases": ["smiling_imp"] }, + { "emoji": "👿", "aliases": ["imp"] }, + { "emoji": "💀", "aliases": ["skull"] }, + { "emoji": "☠️", "aliases": ["skull_and_crossbones"] }, + { "emoji": "💩", "aliases": ["hankey", "poop", "shit"] }, + { "emoji": "🤡", "aliases": ["clown_face"] }, + { "emoji": "👹", "aliases": ["japanese_ogre"] }, + { "emoji": "👺", "aliases": ["japanese_goblin"] }, + { "emoji": "👻", "aliases": ["ghost"] }, + { "emoji": "👽", "aliases": ["alien"] }, + { "emoji": "👾", "aliases": ["space_invader"] }, + { "emoji": "🤖", "aliases": ["robot"] }, + { "emoji": "😺", "aliases": ["smiley_cat"] }, + { "emoji": "😸", "aliases": ["smile_cat"] }, + { "emoji": "😹", "aliases": ["joy_cat"] }, + { "emoji": "😻", "aliases": ["heart_eyes_cat"] }, + { "emoji": "😼", "aliases": ["smirk_cat"] }, + { "emoji": "😽", "aliases": ["kissing_cat"] }, + { "emoji": "🙀", "aliases": ["scream_cat"] }, + { "emoji": "😿", "aliases": ["crying_cat_face"] }, + { "emoji": "😾", "aliases": ["pouting_cat"] }, + { "emoji": "🙈", "aliases": ["see_no_evil"] }, + { "emoji": "🙉", "aliases": ["hear_no_evil"] }, + { "emoji": "🙊", "aliases": ["speak_no_evil"] }, + { "emoji": "💋", "aliases": ["kiss"] }, + { "emoji": "💌", "aliases": ["love_letter"] }, + { "emoji": "💘", "aliases": ["cupid"] }, + { "emoji": "💝", "aliases": ["gift_heart"] }, + { "emoji": "💖", "aliases": ["sparkling_heart"] }, + { "emoji": "💗", "aliases": ["heartpulse"] }, + { "emoji": "💓", "aliases": ["heartbeat"] }, + { "emoji": "💞", "aliases": ["revolving_hearts"] }, + { "emoji": "💕", "aliases": ["two_hearts"] }, + { "emoji": "💟", "aliases": ["heart_decoration"] }, + { "emoji": "❣️", "aliases": ["heavy_heart_exclamation"] }, + { "emoji": "💔", "aliases": ["broken_heart"] }, + { "emoji": "❤️‍🔥", "aliases": ["heart_on_fire"] }, + { "emoji": "❤️‍🩹", "aliases": ["mending_heart"] }, + { "emoji": "❤️", "aliases": ["heart"] }, + { "emoji": "🧡", "aliases": ["orange_heart"] }, + { "emoji": "💛", "aliases": ["yellow_heart"] }, + { "emoji": "💚", "aliases": ["green_heart"] }, + { "emoji": "💙", "aliases": ["blue_heart"] }, + { "emoji": "💜", "aliases": ["purple_heart"] }, + { "emoji": "🤎", "aliases": ["brown_heart"] }, + { "emoji": "🖤", "aliases": ["black_heart"] }, + { "emoji": "🤍", "aliases": ["white_heart"] }, + { "emoji": "💯", "aliases": ["100"] }, + { "emoji": "💢", "aliases": ["anger"] }, + { "emoji": "💥", "aliases": ["boom", "collision"] }, + { "emoji": "💫", "aliases": ["dizzy"] }, + { "emoji": "💦", "aliases": ["sweat_drops"] }, + { "emoji": "💨", "aliases": ["dash"] }, + { "emoji": "🕳️", "aliases": ["hole"] }, + { "emoji": "💣", "aliases": ["bomb"] }, + { "emoji": "💬", "aliases": ["speech_balloon"] }, + { "emoji": "👁️‍🗨️", "aliases": ["eye_speech_bubble"] }, + { "emoji": "🗨️", "aliases": ["left_speech_bubble"] }, + { "emoji": "🗯️", "aliases": ["right_anger_bubble"] }, + { "emoji": "💭", "aliases": ["thought_balloon"] }, + { "emoji": "💤", "aliases": ["zzz"] }, + { "emoji": "👋", "aliases": ["wave"] }, + { "emoji": "🤚", "aliases": ["raised_back_of_hand"] }, + { "emoji": "🖐️", "aliases": ["raised_hand_with_fingers_splayed"] }, + { "emoji": "✋", "aliases": ["hand", "raised_hand"] }, + { "emoji": "🖖", "aliases": ["vulcan_salute"] }, + { "emoji": "👌", "aliases": ["ok_hand"] }, + { "emoji": "🤌", "aliases": ["pinched_fingers"] }, + { "emoji": "🤏", "aliases": ["pinching_hand"] }, + { "emoji": "✌️", "aliases": ["v"] }, + { "emoji": "🤞", "aliases": ["crossed_fingers"] }, + { "emoji": "🤟", "aliases": ["love_you_gesture"] }, + { "emoji": "🤘", "aliases": ["metal"] }, + { "emoji": "🤙", "aliases": ["call_me_hand"] }, + { "emoji": "👈", "aliases": ["point_left"] }, + { "emoji": "👉", "aliases": ["point_right"] }, + { "emoji": "👆", "aliases": ["point_up_2"] }, + { "emoji": "🖕", "aliases": ["middle_finger", "fu"] }, + { "emoji": "👇", "aliases": ["point_down"] }, + { "emoji": "☝️", "aliases": ["point_up"] }, + { "emoji": "👍", "aliases": ["+1", "thumbsup"] }, + { "emoji": "👎", "aliases": ["-1", "thumbsdown"] }, + { "emoji": "✊", "aliases": ["fist_raised", "fist"] }, + { "emoji": "👊", "aliases": ["fist_oncoming", "facepunch", "punch"] }, + { "emoji": "🤛", "aliases": ["fist_left"] }, + { "emoji": "🤜", "aliases": ["fist_right"] }, + { "emoji": "👏", "aliases": ["clap"] }, + { "emoji": "🙌", "aliases": ["raised_hands"] }, + { "emoji": "👐", "aliases": ["open_hands"] }, + { "emoji": "🤲", "aliases": ["palms_up_together"] }, + { "emoji": "🤝", "aliases": ["handshake"] }, + { "emoji": "🙏", "aliases": ["pray"] }, + { "emoji": "✍️", "aliases": ["writing_hand"] }, + { "emoji": "💅", "aliases": ["nail_care"] }, + { "emoji": "🤳", "aliases": ["selfie"] }, + { "emoji": "💪", "aliases": ["muscle"] }, + { "emoji": "🦾", "aliases": ["mechanical_arm"] }, + { "emoji": "🦿", "aliases": ["mechanical_leg"] }, + { "emoji": "🦵", "aliases": ["leg"] }, + { "emoji": "🦶", "aliases": ["foot"] }, + { "emoji": "👂", "aliases": ["ear"] }, + { "emoji": "🦻", "aliases": ["ear_with_hearing_aid"] }, + { "emoji": "👃", "aliases": ["nose"] }, + { "emoji": "🧠", "aliases": ["brain"] }, + { "emoji": "🫀", "aliases": ["anatomical_heart"] }, + { "emoji": "🫁", "aliases": ["lungs"] }, + { "emoji": "🦷", "aliases": ["tooth"] }, + { "emoji": "🦴", "aliases": ["bone"] }, + { "emoji": "👀", "aliases": ["eyes"] }, + { "emoji": "👁️", "aliases": ["eye"] }, + { "emoji": "👅", "aliases": ["tongue"] }, + { "emoji": "👄", "aliases": ["lips"] }, + { "emoji": "👶", "aliases": ["baby"] }, + { "emoji": "🧒", "aliases": ["child"] }, + { "emoji": "👦", "aliases": ["boy"] }, + { "emoji": "👧", "aliases": ["girl"] }, + { "emoji": "🧑", "aliases": ["adult"] }, + { "emoji": "👱", "aliases": ["blond_haired_person"] }, + { "emoji": "👨", "aliases": ["man"] }, + { "emoji": "🧔", "aliases": ["bearded_person"] }, + { "emoji": "🧔‍♂️", "aliases": ["man_beard"] }, + { "emoji": "🧔‍♀️", "aliases": ["woman_beard"] }, + { "emoji": "👨‍🦰", "aliases": ["red_haired_man"] }, + { "emoji": "👨‍🦱", "aliases": ["curly_haired_man"] }, + { "emoji": "👨‍🦳", "aliases": ["white_haired_man"] }, + { "emoji": "👨‍🦲", "aliases": ["bald_man"] }, + { "emoji": "👩", "aliases": ["woman"] }, + { "emoji": "👩‍🦰", "aliases": ["red_haired_woman"] }, + { "emoji": "🧑‍🦰", "aliases": ["person_red_hair"] }, + { "emoji": "👩‍🦱", "aliases": ["curly_haired_woman"] }, + { "emoji": "🧑‍🦱", "aliases": ["person_curly_hair"] }, + { "emoji": "👩‍🦳", "aliases": ["white_haired_woman"] }, + { "emoji": "🧑‍🦳", "aliases": ["person_white_hair"] }, + { "emoji": "👩‍🦲", "aliases": ["bald_woman"] }, + { "emoji": "🧑‍🦲", "aliases": ["person_bald"] }, + { "emoji": "👱‍♀️", "aliases": ["blond_haired_woman", "blonde_woman"] }, + { "emoji": "👱‍♂️", "aliases": ["blond_haired_man"] }, + { "emoji": "🧓", "aliases": ["older_adult"] }, + { "emoji": "👴", "aliases": ["older_man"] }, + { "emoji": "👵", "aliases": ["older_woman"] }, + { "emoji": "🙍", "aliases": ["frowning_person"] }, + { "emoji": "🙍‍♂️", "aliases": ["frowning_man"] }, + { "emoji": "🙍‍♀️", "aliases": ["frowning_woman"] }, + { "emoji": "🙎", "aliases": ["pouting_face"] }, + { "emoji": "🙎‍♂️", "aliases": ["pouting_man"] }, + { "emoji": "🙎‍♀️", "aliases": ["pouting_woman"] }, + { "emoji": "🙅", "aliases": ["no_good"] }, + { "emoji": "🙅‍♂️", "aliases": ["no_good_man", "ng_man"] }, + { "emoji": "🙅‍♀️", "aliases": ["no_good_woman", "ng_woman"] }, + { "emoji": "🙆", "aliases": ["ok_person"] }, + { "emoji": "🙆‍♂️", "aliases": ["ok_man"] }, + { "emoji": "🙆‍♀️", "aliases": ["ok_woman"] }, + { + "emoji": "💁", + "aliases": ["tipping_hand_person", "information_desk_person"] + }, + { "emoji": "💁‍♂️", "aliases": ["tipping_hand_man", "sassy_man"] }, + { "emoji": "💁‍♀️", "aliases": ["tipping_hand_woman", "sassy_woman"] }, + { "emoji": "🙋", "aliases": ["raising_hand"] }, + { "emoji": "🙋‍♂️", "aliases": ["raising_hand_man"] }, + { "emoji": "🙋‍♀️", "aliases": ["raising_hand_woman"] }, + { "emoji": "🧏", "aliases": ["deaf_person"] }, + { "emoji": "🧏‍♂️", "aliases": ["deaf_man"] }, + { "emoji": "🧏‍♀️", "aliases": ["deaf_woman"] }, + { "emoji": "🙇", "aliases": ["bow"] }, + { "emoji": "🙇‍♂️", "aliases": ["bowing_man"] }, + { "emoji": "🙇‍♀️", "aliases": ["bowing_woman"] }, + { "emoji": "🤦", "aliases": ["facepalm"] }, + { "emoji": "🤦‍♂️", "aliases": ["man_facepalming"] }, + { "emoji": "🤦‍♀️", "aliases": ["woman_facepalming"] }, + { "emoji": "🤷", "aliases": ["shrug"] }, + { "emoji": "🤷‍♂️", "aliases": ["man_shrugging"] }, + { "emoji": "🤷‍♀️", "aliases": ["woman_shrugging"] }, + { "emoji": "🧑‍⚕️", "aliases": ["health_worker"] }, + { "emoji": "👨‍⚕️", "aliases": ["man_health_worker"] }, + { "emoji": "👩‍⚕️", "aliases": ["woman_health_worker"] }, + { "emoji": "🧑‍🎓", "aliases": ["student"] }, + { "emoji": "👨‍🎓", "aliases": ["man_student"] }, + { "emoji": "👩‍🎓", "aliases": ["woman_student"] }, + { "emoji": "🧑‍🏫", "aliases": ["teacher"] }, + { "emoji": "👨‍🏫", "aliases": ["man_teacher"] }, + { "emoji": "👩‍🏫", "aliases": ["woman_teacher"] }, + { "emoji": "🧑‍⚖️", "aliases": ["judge"] }, + { "emoji": "👨‍⚖️", "aliases": ["man_judge"] }, + { "emoji": "👩‍⚖️", "aliases": ["woman_judge"] }, + { "emoji": "🧑‍🌾", "aliases": ["farmer"] }, + { "emoji": "👨‍🌾", "aliases": ["man_farmer"] }, + { "emoji": "👩‍🌾", "aliases": ["woman_farmer"] }, + { "emoji": "🧑‍🍳", "aliases": ["cook"] }, + { "emoji": "👨‍🍳", "aliases": ["man_cook"] }, + { "emoji": "👩‍🍳", "aliases": ["woman_cook"] }, + { "emoji": "🧑‍🔧", "aliases": ["mechanic"] }, + { "emoji": "👨‍🔧", "aliases": ["man_mechanic"] }, + { "emoji": "👩‍🔧", "aliases": ["woman_mechanic"] }, + { "emoji": "🧑‍🏭", "aliases": ["factory_worker"] }, + { "emoji": "👨‍🏭", "aliases": ["man_factory_worker"] }, + { "emoji": "👩‍🏭", "aliases": ["woman_factory_worker"] }, + { "emoji": "🧑‍💼", "aliases": ["office_worker"] }, + { "emoji": "👨‍💼", "aliases": ["man_office_worker"] }, + { "emoji": "👩‍💼", "aliases": ["woman_office_worker"] }, + { "emoji": "🧑‍🔬", "aliases": ["scientist"] }, + { "emoji": "👨‍🔬", "aliases": ["man_scientist"] }, + { "emoji": "👩‍🔬", "aliases": ["woman_scientist"] }, + { "emoji": "🧑‍💻", "aliases": ["technologist"] }, + { "emoji": "👨‍💻", "aliases": ["man_technologist"] }, + { "emoji": "👩‍💻", "aliases": ["woman_technologist"] }, + { "emoji": "🧑‍🎤", "aliases": ["singer"] }, + { "emoji": "👨‍🎤", "aliases": ["man_singer"] }, + { "emoji": "👩‍🎤", "aliases": ["woman_singer"] }, + { "emoji": "🧑‍🎨", "aliases": ["artist"] }, + { "emoji": "👨‍🎨", "aliases": ["man_artist"] }, + { "emoji": "👩‍🎨", "aliases": ["woman_artist"] }, + { "emoji": "🧑‍✈️", "aliases": ["pilot"] }, + { "emoji": "👨‍✈️", "aliases": ["man_pilot"] }, + { "emoji": "👩‍✈️", "aliases": ["woman_pilot"] }, + { "emoji": "🧑‍🚀", "aliases": ["astronaut"] }, + { "emoji": "👨‍🚀", "aliases": ["man_astronaut"] }, + { "emoji": "👩‍🚀", "aliases": ["woman_astronaut"] }, + { "emoji": "🧑‍🚒", "aliases": ["firefighter"] }, + { "emoji": "👨‍🚒", "aliases": ["man_firefighter"] }, + { "emoji": "👩‍🚒", "aliases": ["woman_firefighter"] }, + { "emoji": "👮", "aliases": ["police_officer", "cop"] }, + { "emoji": "👮‍♂️", "aliases": ["policeman"] }, + { "emoji": "👮‍♀️", "aliases": ["policewoman"] }, + { "emoji": "🕵️", "aliases": ["detective"] }, + { "emoji": "🕵️‍♂️", "aliases": ["male_detective"] }, + { "emoji": "🕵️‍♀️", "aliases": ["female_detective"] }, + { "emoji": "💂", "aliases": ["guard"] }, + { "emoji": "💂‍♂️", "aliases": ["guardsman"] }, + { "emoji": "💂‍♀️", "aliases": ["guardswoman"] }, + { "emoji": "🥷", "aliases": ["ninja"] }, + { "emoji": "👷", "aliases": ["construction_worker"] }, + { "emoji": "👷‍♂️", "aliases": ["construction_worker_man"] }, + { "emoji": "👷‍♀️", "aliases": ["construction_worker_woman"] }, + { "emoji": "🤴", "aliases": ["prince"] }, + { "emoji": "👸", "aliases": ["princess"] }, + { "emoji": "👳", "aliases": ["person_with_turban"] }, + { "emoji": "👳‍♂️", "aliases": ["man_with_turban"] }, + { "emoji": "👳‍♀️", "aliases": ["woman_with_turban"] }, + { "emoji": "👲", "aliases": ["man_with_gua_pi_mao"] }, + { "emoji": "🧕", "aliases": ["woman_with_headscarf"] }, + { "emoji": "🤵", "aliases": ["person_in_tuxedo"] }, + { "emoji": "🤵‍♂️", "aliases": ["man_in_tuxedo"] }, + { "emoji": "🤵‍♀️", "aliases": ["woman_in_tuxedo"] }, + { "emoji": "👰", "aliases": ["person_with_veil"] }, + { "emoji": "👰‍♂️", "aliases": ["man_with_veil"] }, + { "emoji": "👰‍♀️", "aliases": ["woman_with_veil", "bride_with_veil"] }, + { "emoji": "🤰", "aliases": ["pregnant_woman"] }, + { "emoji": "🤱", "aliases": ["breast_feeding"] }, + { "emoji": "👩‍🍼", "aliases": ["woman_feeding_baby"] }, + { "emoji": "👨‍🍼", "aliases": ["man_feeding_baby"] }, + { "emoji": "🧑‍🍼", "aliases": ["person_feeding_baby"] }, + { "emoji": "👼", "aliases": ["angel"] }, + { "emoji": "🎅", "aliases": ["santa"] }, + { "emoji": "🤶", "aliases": ["mrs_claus"] }, + { "emoji": "🧑‍🎄", "aliases": ["mx_claus"] }, + { "emoji": "🦸", "aliases": ["superhero"] }, + { "emoji": "🦸‍♂️", "aliases": ["superhero_man"] }, + { "emoji": "🦸‍♀️", "aliases": ["superhero_woman"] }, + { "emoji": "🦹", "aliases": ["supervillain"] }, + { "emoji": "🦹‍♂️", "aliases": ["supervillain_man"] }, + { "emoji": "🦹‍♀️", "aliases": ["supervillain_woman"] }, + { "emoji": "🧙", "aliases": ["mage"] }, + { "emoji": "🧙‍♂️", "aliases": ["mage_man"] }, + { "emoji": "🧙‍♀️", "aliases": ["mage_woman"] }, + { "emoji": "🧚", "aliases": ["fairy"] }, + { "emoji": "🧚‍♂️", "aliases": ["fairy_man"] }, + { "emoji": "🧚‍♀️", "aliases": ["fairy_woman"] }, + { "emoji": "🧛", "aliases": ["vampire"] }, + { "emoji": "🧛‍♂️", "aliases": ["vampire_man"] }, + { "emoji": "🧛‍♀️", "aliases": ["vampire_woman"] }, + { "emoji": "🧜", "aliases": ["merperson"] }, + { "emoji": "🧜‍♂️", "aliases": ["merman"] }, + { "emoji": "🧜‍♀️", "aliases": ["mermaid"] }, + { "emoji": "🧝", "aliases": ["elf"] }, + { "emoji": "🧝‍♂️", "aliases": ["elf_man"] }, + { "emoji": "🧝‍♀️", "aliases": ["elf_woman"] }, + { "emoji": "🧞", "aliases": ["genie"] }, + { "emoji": "🧞‍♂️", "aliases": ["genie_man"] }, + { "emoji": "🧞‍♀️", "aliases": ["genie_woman"] }, + { "emoji": "🧟", "aliases": ["zombie"] }, + { "emoji": "🧟‍♂️", "aliases": ["zombie_man"] }, + { "emoji": "🧟‍♀️", "aliases": ["zombie_woman"] }, + { "emoji": "💆", "aliases": ["massage"] }, + { "emoji": "💆‍♂️", "aliases": ["massage_man"] }, + { "emoji": "💆‍♀️", "aliases": ["massage_woman"] }, + { "emoji": "💇", "aliases": ["haircut"] }, + { "emoji": "💇‍♂️", "aliases": ["haircut_man"] }, + { "emoji": "💇‍♀️", "aliases": ["haircut_woman"] }, + { "emoji": "🚶", "aliases": ["walking"] }, + { "emoji": "🚶‍♂️", "aliases": ["walking_man"] }, + { "emoji": "🚶‍♀️", "aliases": ["walking_woman"] }, + { "emoji": "🧍", "aliases": ["standing_person"] }, + { "emoji": "🧍‍♂️", "aliases": ["standing_man"] }, + { "emoji": "🧍‍♀️", "aliases": ["standing_woman"] }, + { "emoji": "🧎", "aliases": ["kneeling_person"] }, + { "emoji": "🧎‍♂️", "aliases": ["kneeling_man"] }, + { "emoji": "🧎‍♀️", "aliases": ["kneeling_woman"] }, + { "emoji": "🧑‍🦯", "aliases": ["person_with_probing_cane"] }, + { "emoji": "👨‍🦯", "aliases": ["man_with_probing_cane"] }, + { "emoji": "👩‍🦯", "aliases": ["woman_with_probing_cane"] }, + { "emoji": "🧑‍🦼", "aliases": ["person_in_motorized_wheelchair"] }, + { "emoji": "👨‍🦼", "aliases": ["man_in_motorized_wheelchair"] }, + { "emoji": "👩‍🦼", "aliases": ["woman_in_motorized_wheelchair"] }, + { "emoji": "🧑‍🦽", "aliases": ["person_in_manual_wheelchair"] }, + { "emoji": "👨‍🦽", "aliases": ["man_in_manual_wheelchair"] }, + { "emoji": "👩‍🦽", "aliases": ["woman_in_manual_wheelchair"] }, + { "emoji": "🏃", "aliases": ["runner", "running"] }, + { "emoji": "🏃‍♂️", "aliases": ["running_man"] }, + { "emoji": "🏃‍♀️", "aliases": ["running_woman"] }, + { "emoji": "💃", "aliases": ["woman_dancing", "dancer"] }, + { "emoji": "🕺", "aliases": ["man_dancing"] }, + { "emoji": "🕴️", "aliases": ["business_suit_levitating"] }, + { "emoji": "👯", "aliases": ["dancers"] }, + { "emoji": "👯‍♂️", "aliases": ["dancing_men"] }, + { "emoji": "👯‍♀️", "aliases": ["dancing_women"] }, + { "emoji": "🧖", "aliases": ["sauna_person"] }, + { "emoji": "🧖‍♂️", "aliases": ["sauna_man"] }, + { "emoji": "🧖‍♀️", "aliases": ["sauna_woman"] }, + { "emoji": "🧗", "aliases": ["climbing"] }, + { "emoji": "🧗‍♂️", "aliases": ["climbing_man"] }, + { "emoji": "🧗‍♀️", "aliases": ["climbing_woman"] }, + { "emoji": "🤺", "aliases": ["person_fencing"] }, + { "emoji": "🏇", "aliases": ["horse_racing"] }, + { "emoji": "⛷️", "aliases": ["skier"] }, + { "emoji": "🏂", "aliases": ["snowboarder"] }, + { "emoji": "🏌️", "aliases": ["golfing"] }, + { "emoji": "🏌️‍♂️", "aliases": ["golfing_man"] }, + { "emoji": "🏌️‍♀️", "aliases": ["golfing_woman"] }, + { "emoji": "🏄", "aliases": ["surfer"] }, + { "emoji": "🏄‍♂️", "aliases": ["surfing_man"] }, + { "emoji": "🏄‍♀️", "aliases": ["surfing_woman"] }, + { "emoji": "🚣", "aliases": ["rowboat"] }, + { "emoji": "🚣‍♂️", "aliases": ["rowing_man"] }, + { "emoji": "🚣‍♀️", "aliases": ["rowing_woman"] }, + { "emoji": "🏊", "aliases": ["swimmer"] }, + { "emoji": "🏊‍♂️", "aliases": ["swimming_man"] }, + { "emoji": "🏊‍♀️", "aliases": ["swimming_woman"] }, + { "emoji": "⛹️", "aliases": ["bouncing_ball_person"] }, + { "emoji": "⛹️‍♂️", "aliases": ["bouncing_ball_man", "basketball_man"] }, + { "emoji": "⛹️‍♀️", "aliases": ["bouncing_ball_woman", "basketball_woman"] }, + { "emoji": "🏋️", "aliases": ["weight_lifting"] }, + { "emoji": "🏋️‍♂️", "aliases": ["weight_lifting_man"] }, + { "emoji": "🏋️‍♀️", "aliases": ["weight_lifting_woman"] }, + { "emoji": "🚴", "aliases": ["bicyclist"] }, + { "emoji": "🚴‍♂️", "aliases": ["biking_man"] }, + { "emoji": "🚴‍♀️", "aliases": ["biking_woman"] }, + { "emoji": "🚵", "aliases": ["mountain_bicyclist"] }, + { "emoji": "🚵‍♂️", "aliases": ["mountain_biking_man"] }, + { "emoji": "🚵‍♀️", "aliases": ["mountain_biking_woman"] }, + { "emoji": "🤸", "aliases": ["cartwheeling"] }, + { "emoji": "🤸‍♂️", "aliases": ["man_cartwheeling"] }, + { "emoji": "🤸‍♀️", "aliases": ["woman_cartwheeling"] }, + { "emoji": "🤼", "aliases": ["wrestling"] }, + { "emoji": "🤼‍♂️", "aliases": ["men_wrestling"] }, + { "emoji": "🤼‍♀️", "aliases": ["women_wrestling"] }, + { "emoji": "🤽", "aliases": ["water_polo"] }, + { "emoji": "🤽‍♂️", "aliases": ["man_playing_water_polo"] }, + { "emoji": "🤽‍♀️", "aliases": ["woman_playing_water_polo"] }, + { "emoji": "🤾", "aliases": ["handball_person"] }, + { "emoji": "🤾‍♂️", "aliases": ["man_playing_handball"] }, + { "emoji": "🤾‍♀️", "aliases": ["woman_playing_handball"] }, + { "emoji": "🤹", "aliases": ["juggling_person"] }, + { "emoji": "🤹‍♂️", "aliases": ["man_juggling"] }, + { "emoji": "🤹‍♀️", "aliases": ["woman_juggling"] }, + { "emoji": "🧘", "aliases": ["lotus_position"] }, + { "emoji": "🧘‍♂️", "aliases": ["lotus_position_man"] }, + { "emoji": "🧘‍♀️", "aliases": ["lotus_position_woman"] }, + { "emoji": "🛀", "aliases": ["bath"] }, + { "emoji": "🛌", "aliases": ["sleeping_bed"] }, + { "emoji": "🧑‍🤝‍🧑", "aliases": ["people_holding_hands"] }, + { "emoji": "👭", "aliases": ["two_women_holding_hands"] }, + { "emoji": "👫", "aliases": ["couple"] }, + { "emoji": "👬", "aliases": ["two_men_holding_hands"] }, + { "emoji": "💏", "aliases": ["couplekiss"] }, + { "emoji": "👩‍❤️‍💋‍👨", "aliases": ["couplekiss_man_woman"] }, + { "emoji": "👨‍❤️‍💋‍👨", "aliases": ["couplekiss_man_man"] }, + { "emoji": "👩‍❤️‍💋‍👩", "aliases": ["couplekiss_woman_woman"] }, + { "emoji": "💑", "aliases": ["couple_with_heart"] }, + { "emoji": "👩‍❤️‍👨", "aliases": ["couple_with_heart_woman_man"] }, + { "emoji": "👨‍❤️‍👨", "aliases": ["couple_with_heart_man_man"] }, + { "emoji": "👩‍❤️‍👩", "aliases": ["couple_with_heart_woman_woman"] }, + { "emoji": "👪", "aliases": ["family"] }, + { "emoji": "👨‍👩‍👦", "aliases": ["family_man_woman_boy"] }, + { "emoji": "👨‍👩‍👧", "aliases": ["family_man_woman_girl"] }, + { "emoji": "👨‍👩‍👧‍👦", "aliases": ["family_man_woman_girl_boy"] }, + { "emoji": "👨‍👩‍👦‍👦", "aliases": ["family_man_woman_boy_boy"] }, + { "emoji": "👨‍👩‍👧‍👧", "aliases": ["family_man_woman_girl_girl"] }, + { "emoji": "👨‍👨‍👦", "aliases": ["family_man_man_boy"] }, + { "emoji": "👨‍👨‍👧", "aliases": ["family_man_man_girl"] }, + { "emoji": "👨‍👨‍👧‍👦", "aliases": ["family_man_man_girl_boy"] }, + { "emoji": "👨‍👨‍👦‍👦", "aliases": ["family_man_man_boy_boy"] }, + { "emoji": "👨‍👨‍👧‍👧", "aliases": ["family_man_man_girl_girl"] }, + { "emoji": "👩‍👩‍👦", "aliases": ["family_woman_woman_boy"] }, + { "emoji": "👩‍👩‍👧", "aliases": ["family_woman_woman_girl"] }, + { "emoji": "👩‍👩‍👧‍👦", "aliases": ["family_woman_woman_girl_boy"] }, + { "emoji": "👩‍👩‍👦‍👦", "aliases": ["family_woman_woman_boy_boy"] }, + { "emoji": "👩‍👩‍👧‍👧", "aliases": ["family_woman_woman_girl_girl"] }, + { "emoji": "👨‍👦", "aliases": ["family_man_boy"] }, + { "emoji": "👨‍👦‍👦", "aliases": ["family_man_boy_boy"] }, + { "emoji": "👨‍👧", "aliases": ["family_man_girl"] }, + { "emoji": "👨‍👧‍👦", "aliases": ["family_man_girl_boy"] }, + { "emoji": "👨‍👧‍👧", "aliases": ["family_man_girl_girl"] }, + { "emoji": "👩‍👦", "aliases": ["family_woman_boy"] }, + { "emoji": "👩‍👦‍👦", "aliases": ["family_woman_boy_boy"] }, + { "emoji": "👩‍👧", "aliases": ["family_woman_girl"] }, + { "emoji": "👩‍👧‍👦", "aliases": ["family_woman_girl_boy"] }, + { "emoji": "👩‍👧‍👧", "aliases": ["family_woman_girl_girl"] }, + { "emoji": "🗣️", "aliases": ["speaking_head"] }, + { "emoji": "👤", "aliases": ["bust_in_silhouette"] }, + { "emoji": "👥", "aliases": ["busts_in_silhouette"] }, + { "emoji": "🫂", "aliases": ["people_hugging"] }, + { "emoji": "👣", "aliases": ["footprints"] }, + { "emoji": "🐵", "aliases": ["monkey_face"] }, + { "emoji": "🐒", "aliases": ["monkey"] }, + { "emoji": "🦍", "aliases": ["gorilla"] }, + { "emoji": "🦧", "aliases": ["orangutan"] }, + { "emoji": "🐶", "aliases": ["dog"] }, + { "emoji": "🐕", "aliases": ["dog2"] }, + { "emoji": "🦮", "aliases": ["guide_dog"] }, + { "emoji": "🐕‍🦺", "aliases": ["service_dog"] }, + { "emoji": "🐩", "aliases": ["poodle"] }, + { "emoji": "🐺", "aliases": ["wolf"] }, + { "emoji": "🦊", "aliases": ["fox_face"] }, + { "emoji": "🦝", "aliases": ["raccoon"] }, + { "emoji": "🐱", "aliases": ["cat"] }, + { "emoji": "🐈", "aliases": ["cat2"] }, + { "emoji": "🐈‍⬛", "aliases": ["black_cat"] }, + { "emoji": "🦁", "aliases": ["lion"] }, + { "emoji": "🐯", "aliases": ["tiger"] }, + { "emoji": "🐅", "aliases": ["tiger2"] }, + { "emoji": "🐆", "aliases": ["leopard"] }, + { "emoji": "🐴", "aliases": ["horse"] }, + { "emoji": "🐎", "aliases": ["racehorse"] }, + { "emoji": "🦄", "aliases": ["unicorn"] }, + { "emoji": "🦓", "aliases": ["zebra"] }, + { "emoji": "🦌", "aliases": ["deer"] }, + { "emoji": "🦬", "aliases": ["bison"] }, + { "emoji": "🐮", "aliases": ["cow"] }, + { "emoji": "🐂", "aliases": ["ox"] }, + { "emoji": "🐃", "aliases": ["water_buffalo"] }, + { "emoji": "🐄", "aliases": ["cow2"] }, + { "emoji": "🐷", "aliases": ["pig"] }, + { "emoji": "🐖", "aliases": ["pig2"] }, + { "emoji": "🐗", "aliases": ["boar"] }, + { "emoji": "🐽", "aliases": ["pig_nose"] }, + { "emoji": "🐏", "aliases": ["ram"] }, + { "emoji": "🐑", "aliases": ["sheep"] }, + { "emoji": "🐐", "aliases": ["goat"] }, + { "emoji": "🐪", "aliases": ["dromedary_camel"] }, + { "emoji": "🐫", "aliases": ["camel"] }, + { "emoji": "🦙", "aliases": ["llama"] }, + { "emoji": "🦒", "aliases": ["giraffe"] }, + { "emoji": "🐘", "aliases": ["elephant"] }, + { "emoji": "🦣", "aliases": ["mammoth"] }, + { "emoji": "🦏", "aliases": ["rhinoceros"] }, + { "emoji": "🦛", "aliases": ["hippopotamus"] }, + { "emoji": "🐭", "aliases": ["mouse"] }, + { "emoji": "🐁", "aliases": ["mouse2"] }, + { "emoji": "🐀", "aliases": ["rat"] }, + { "emoji": "🐹", "aliases": ["hamster"] }, + { "emoji": "🐰", "aliases": ["rabbit"] }, + { "emoji": "🐇", "aliases": ["rabbit2"] }, + { "emoji": "🐿️", "aliases": ["chipmunk"] }, + { "emoji": "🦫", "aliases": ["beaver"] }, + { "emoji": "🦔", "aliases": ["hedgehog"] }, + { "emoji": "🦇", "aliases": ["bat"] }, + { "emoji": "🐻", "aliases": ["bear"] }, + { "emoji": "🐻‍❄️", "aliases": ["polar_bear"] }, + { "emoji": "🐨", "aliases": ["koala"] }, + { "emoji": "🐼", "aliases": ["panda_face"] }, + { "emoji": "🦥", "aliases": ["sloth"] }, + { "emoji": "🦦", "aliases": ["otter"] }, + { "emoji": "🦨", "aliases": ["skunk"] }, + { "emoji": "🦘", "aliases": ["kangaroo"] }, + { "emoji": "🦡", "aliases": ["badger"] }, + { "emoji": "🐾", "aliases": ["feet", "paw_prints"] }, + { "emoji": "🦃", "aliases": ["turkey"] }, + { "emoji": "🐔", "aliases": ["chicken"] }, + { "emoji": "🐓", "aliases": ["rooster"] }, + { "emoji": "🐣", "aliases": ["hatching_chick"] }, + { "emoji": "🐤", "aliases": ["baby_chick"] }, + { "emoji": "🐥", "aliases": ["hatched_chick"] }, + { "emoji": "🐦", "aliases": ["bird"] }, + { "emoji": "🐧", "aliases": ["penguin"] }, + { "emoji": "🕊️", "aliases": ["dove"] }, + { "emoji": "🦅", "aliases": ["eagle"] }, + { "emoji": "🦆", "aliases": ["duck"] }, + { "emoji": "🦢", "aliases": ["swan"] }, + { "emoji": "🦉", "aliases": ["owl"] }, + { "emoji": "🦤", "aliases": ["dodo"] }, + { "emoji": "🪶", "aliases": ["feather"] }, + { "emoji": "🦩", "aliases": ["flamingo"] }, + { "emoji": "🦚", "aliases": ["peacock"] }, + { "emoji": "🦜", "aliases": ["parrot"] }, + { "emoji": "🐸", "aliases": ["frog"] }, + { "emoji": "🐊", "aliases": ["crocodile"] }, + { "emoji": "🐢", "aliases": ["turtle"] }, + { "emoji": "🦎", "aliases": ["lizard"] }, + { "emoji": "🐍", "aliases": ["snake"] }, + { "emoji": "🐲", "aliases": ["dragon_face"] }, + { "emoji": "🐉", "aliases": ["dragon"] }, + { "emoji": "🦕", "aliases": ["sauropod"] }, + { "emoji": "🦖", "aliases": ["t-rex"] }, + { "emoji": "🐳", "aliases": ["whale"] }, + { "emoji": "🐋", "aliases": ["whale2"] }, + { "emoji": "🐬", "aliases": ["dolphin", "flipper"] }, + { "emoji": "🦭", "aliases": ["seal"] }, + { "emoji": "🐟", "aliases": ["fish"] }, + { "emoji": "🐠", "aliases": ["tropical_fish"] }, + { "emoji": "🐡", "aliases": ["blowfish"] }, + { "emoji": "🦈", "aliases": ["shark"] }, + { "emoji": "🐙", "aliases": ["octopus"] }, + { "emoji": "🐚", "aliases": ["shell"] }, + { "emoji": "🐌", "aliases": ["snail"] }, + { "emoji": "🦋", "aliases": ["butterfly"] }, + { "emoji": "🐛", "aliases": ["bug"] }, + { "emoji": "🐜", "aliases": ["ant"] }, + { "emoji": "🐝", "aliases": ["bee", "honeybee"] }, + { "emoji": "🪲", "aliases": ["beetle"] }, + { "emoji": "🐞", "aliases": ["lady_beetle"] }, + { "emoji": "🦗", "aliases": ["cricket"] }, + { "emoji": "🪳", "aliases": ["cockroach"] }, + { "emoji": "🕷️", "aliases": ["spider"] }, + { "emoji": "🕸️", "aliases": ["spider_web"] }, + { "emoji": "🦂", "aliases": ["scorpion"] }, + { "emoji": "🦟", "aliases": ["mosquito"] }, + { "emoji": "🪰", "aliases": ["fly"] }, + { "emoji": "🪱", "aliases": ["worm"] }, + { "emoji": "🦠", "aliases": ["microbe"] }, + { "emoji": "💐", "aliases": ["bouquet"] }, + { "emoji": "🌸", "aliases": ["cherry_blossom"] }, + { "emoji": "💮", "aliases": ["white_flower"] }, + { "emoji": "🏵️", "aliases": ["rosette"] }, + { "emoji": "🌹", "aliases": ["rose"] }, + { "emoji": "🥀", "aliases": ["wilted_flower"] }, + { "emoji": "🌺", "aliases": ["hibiscus"] }, + { "emoji": "🌻", "aliases": ["sunflower"] }, + { "emoji": "🌼", "aliases": ["blossom"] }, + { "emoji": "🌷", "aliases": ["tulip"] }, + { "emoji": "🌱", "aliases": ["seedling"] }, + { "emoji": "🪴", "aliases": ["potted_plant"] }, + { "emoji": "🌲", "aliases": ["evergreen_tree"] }, + { "emoji": "🌳", "aliases": ["deciduous_tree"] }, + { "emoji": "🌴", "aliases": ["palm_tree"] }, + { "emoji": "🌵", "aliases": ["cactus"] }, + { "emoji": "🌾", "aliases": ["ear_of_rice"] }, + { "emoji": "🌿", "aliases": ["herb"] }, + { "emoji": "☘️", "aliases": ["shamrock"] }, + { "emoji": "🍀", "aliases": ["four_leaf_clover"] }, + { "emoji": "🍁", "aliases": ["maple_leaf"] }, + { "emoji": "🍂", "aliases": ["fallen_leaf"] }, + { "emoji": "🍃", "aliases": ["leaves"] }, + { "emoji": "🍇", "aliases": ["grapes"] }, + { "emoji": "🍈", "aliases": ["melon"] }, + { "emoji": "🍉", "aliases": ["watermelon"] }, + { "emoji": "🍊", "aliases": ["tangerine", "orange", "mandarin"] }, + { "emoji": "🍋", "aliases": ["lemon"] }, + { "emoji": "🍌", "aliases": ["banana"] }, + { "emoji": "🍍", "aliases": ["pineapple"] }, + { "emoji": "🥭", "aliases": ["mango"] }, + { "emoji": "🍎", "aliases": ["apple"] }, + { "emoji": "🍏", "aliases": ["green_apple"] }, + { "emoji": "🍐", "aliases": ["pear"] }, + { "emoji": "🍑", "aliases": ["peach"] }, + { "emoji": "🍒", "aliases": ["cherries"] }, + { "emoji": "🍓", "aliases": ["strawberry"] }, + { "emoji": "🫐", "aliases": ["blueberries"] }, + { "emoji": "🥝", "aliases": ["kiwi_fruit"] }, + { "emoji": "🍅", "aliases": ["tomato"] }, + { "emoji": "🫒", "aliases": ["olive"] }, + { "emoji": "🥥", "aliases": ["coconut"] }, + { "emoji": "🥑", "aliases": ["avocado"] }, + { "emoji": "🍆", "aliases": ["eggplant"] }, + { "emoji": "🥔", "aliases": ["potato"] }, + { "emoji": "🥕", "aliases": ["carrot"] }, + { "emoji": "🌽", "aliases": ["corn"] }, + { "emoji": "🌶️", "aliases": ["hot_pepper"] }, + { "emoji": "🫑", "aliases": ["bell_pepper"] }, + { "emoji": "🥒", "aliases": ["cucumber"] }, + { "emoji": "🥬", "aliases": ["leafy_green"] }, + { "emoji": "🥦", "aliases": ["broccoli"] }, + { "emoji": "🧄", "aliases": ["garlic"] }, + { "emoji": "🧅", "aliases": ["onion"] }, + { "emoji": "🍄", "aliases": ["mushroom"] }, + { "emoji": "🥜", "aliases": ["peanuts"] }, + { "emoji": "🌰", "aliases": ["chestnut"] }, + { "emoji": "🍞", "aliases": ["bread"] }, + { "emoji": "🥐", "aliases": ["croissant"] }, + { "emoji": "🥖", "aliases": ["baguette_bread"] }, + { "emoji": "🫓", "aliases": ["flatbread"] }, + { "emoji": "🥨", "aliases": ["pretzel"] }, + { "emoji": "🥯", "aliases": ["bagel"] }, + { "emoji": "🥞", "aliases": ["pancakes"] }, + { "emoji": "🧇", "aliases": ["waffle"] }, + { "emoji": "🧀", "aliases": ["cheese"] }, + { "emoji": "🍖", "aliases": ["meat_on_bone"] }, + { "emoji": "🍗", "aliases": ["poultry_leg"] }, + { "emoji": "🥩", "aliases": ["cut_of_meat"] }, + { "emoji": "🥓", "aliases": ["bacon"] }, + { "emoji": "🍔", "aliases": ["hamburger"] }, + { "emoji": "🍟", "aliases": ["fries"] }, + { "emoji": "🍕", "aliases": ["pizza"] }, + { "emoji": "🌭", "aliases": ["hotdog"] }, + { "emoji": "🥪", "aliases": ["sandwich"] }, + { "emoji": "🌮", "aliases": ["taco"] }, + { "emoji": "🌯", "aliases": ["burrito"] }, + { "emoji": "🫔", "aliases": ["tamale"] }, + { "emoji": "🥙", "aliases": ["stuffed_flatbread"] }, + { "emoji": "🧆", "aliases": ["falafel"] }, + { "emoji": "🥚", "aliases": ["egg"] }, + { "emoji": "🍳", "aliases": ["fried_egg"] }, + { "emoji": "🥘", "aliases": ["shallow_pan_of_food"] }, + { "emoji": "🍲", "aliases": ["stew"] }, + { "emoji": "🫕", "aliases": ["fondue"] }, + { "emoji": "🥣", "aliases": ["bowl_with_spoon"] }, + { "emoji": "🥗", "aliases": ["green_salad"] }, + { "emoji": "🍿", "aliases": ["popcorn"] }, + { "emoji": "🧈", "aliases": ["butter"] }, + { "emoji": "🧂", "aliases": ["salt"] }, + { "emoji": "🥫", "aliases": ["canned_food"] }, + { "emoji": "🍱", "aliases": ["bento"] }, + { "emoji": "🍘", "aliases": ["rice_cracker"] }, + { "emoji": "🍙", "aliases": ["rice_ball"] }, + { "emoji": "🍚", "aliases": ["rice"] }, + { "emoji": "🍛", "aliases": ["curry"] }, + { "emoji": "🍜", "aliases": ["ramen"] }, + { "emoji": "🍝", "aliases": ["spaghetti"] }, + { "emoji": "🍠", "aliases": ["sweet_potato"] }, + { "emoji": "🍢", "aliases": ["oden"] }, + { "emoji": "🍣", "aliases": ["sushi"] }, + { "emoji": "🍤", "aliases": ["fried_shrimp"] }, + { "emoji": "🍥", "aliases": ["fish_cake"] }, + { "emoji": "🥮", "aliases": ["moon_cake"] }, + { "emoji": "🍡", "aliases": ["dango"] }, + { "emoji": "🥟", "aliases": ["dumpling"] }, + { "emoji": "🥠", "aliases": ["fortune_cookie"] }, + { "emoji": "🥡", "aliases": ["takeout_box"] }, + { "emoji": "🦀", "aliases": ["crab"] }, + { "emoji": "🦞", "aliases": ["lobster"] }, + { "emoji": "🦐", "aliases": ["shrimp"] }, + { "emoji": "🦑", "aliases": ["squid"] }, + { "emoji": "🦪", "aliases": ["oyster"] }, + { "emoji": "🍦", "aliases": ["icecream"] }, + { "emoji": "🍧", "aliases": ["shaved_ice"] }, + { "emoji": "🍨", "aliases": ["ice_cream"] }, + { "emoji": "🍩", "aliases": ["doughnut"] }, + { "emoji": "🍪", "aliases": ["cookie"] }, + { "emoji": "🎂", "aliases": ["birthday"] }, + { "emoji": "🍰", "aliases": ["cake"] }, + { "emoji": "🧁", "aliases": ["cupcake"] }, + { "emoji": "🥧", "aliases": ["pie"] }, + { "emoji": "🍫", "aliases": ["chocolate_bar"] }, + { "emoji": "🍬", "aliases": ["candy"] }, + { "emoji": "🍭", "aliases": ["lollipop"] }, + { "emoji": "🍮", "aliases": ["custard"] }, + { "emoji": "🍯", "aliases": ["honey_pot"] }, + { "emoji": "🍼", "aliases": ["baby_bottle"] }, + { "emoji": "🥛", "aliases": ["milk_glass"] }, + { "emoji": "☕", "aliases": ["coffee"] }, + { "emoji": "🫖", "aliases": ["teapot"] }, + { "emoji": "🍵", "aliases": ["tea"] }, + { "emoji": "🍶", "aliases": ["sake"] }, + { "emoji": "🍾", "aliases": ["champagne"] }, + { "emoji": "🍷", "aliases": ["wine_glass"] }, + { "emoji": "🍸", "aliases": ["cocktail"] }, + { "emoji": "🍹", "aliases": ["tropical_drink"] }, + { "emoji": "🍺", "aliases": ["beer"] }, + { "emoji": "🍻", "aliases": ["beers"] }, + { "emoji": "🥂", "aliases": ["clinking_glasses"] }, + { "emoji": "🥃", "aliases": ["tumbler_glass"] }, + { "emoji": "🥤", "aliases": ["cup_with_straw"] }, + { "emoji": "🧋", "aliases": ["bubble_tea"] }, + { "emoji": "🧃", "aliases": ["beverage_box"] }, + { "emoji": "🧉", "aliases": ["mate"] }, + { "emoji": "🧊", "aliases": ["ice_cube"] }, + { "emoji": "🥢", "aliases": ["chopsticks"] }, + { "emoji": "🍽️", "aliases": ["plate_with_cutlery"] }, + { "emoji": "🍴", "aliases": ["fork_and_knife"] }, + { "emoji": "🥄", "aliases": ["spoon"] }, + { "emoji": "🔪", "aliases": ["hocho", "knife"] }, + { "emoji": "🏺", "aliases": ["amphora"] }, + { "emoji": "🌍", "aliases": ["earth_africa"] }, + { "emoji": "🌎", "aliases": ["earth_americas"] }, + { "emoji": "🌏", "aliases": ["earth_asia"] }, + { "emoji": "🌐", "aliases": ["globe_with_meridians"] }, + { "emoji": "🗺️", "aliases": ["world_map"] }, + { "emoji": "🗾", "aliases": ["japan"] }, + { "emoji": "🧭", "aliases": ["compass"] }, + { "emoji": "🏔️", "aliases": ["mountain_snow"] }, + { "emoji": "⛰️", "aliases": ["mountain"] }, + { "emoji": "🌋", "aliases": ["volcano"] }, + { "emoji": "🗻", "aliases": ["mount_fuji"] }, + { "emoji": "🏕️", "aliases": ["camping"] }, + { "emoji": "🏖️", "aliases": ["beach_umbrella"] }, + { "emoji": "🏜️", "aliases": ["desert"] }, + { "emoji": "🏝️", "aliases": ["desert_island"] }, + { "emoji": "🏞️", "aliases": ["national_park"] }, + { "emoji": "🏟️", "aliases": ["stadium"] }, + { "emoji": "🏛️", "aliases": ["classical_building"] }, + { "emoji": "🏗️", "aliases": ["building_construction"] }, + { "emoji": "🧱", "aliases": ["bricks"] }, + { "emoji": "🪨", "aliases": ["rock"] }, + { "emoji": "🪵", "aliases": ["wood"] }, + { "emoji": "🛖", "aliases": ["hut"] }, + { "emoji": "🏘️", "aliases": ["houses"] }, + { "emoji": "🏚️", "aliases": ["derelict_house"] }, + { "emoji": "🏠", "aliases": ["house"] }, + { "emoji": "🏡", "aliases": ["house_with_garden"] }, + { "emoji": "🏢", "aliases": ["office"] }, + { "emoji": "🏣", "aliases": ["post_office"] }, + { "emoji": "🏤", "aliases": ["european_post_office"] }, + { "emoji": "🏥", "aliases": ["hospital"] }, + { "emoji": "🏦", "aliases": ["bank"] }, + { "emoji": "🏨", "aliases": ["hotel"] }, + { "emoji": "🏩", "aliases": ["love_hotel"] }, + { "emoji": "🏪", "aliases": ["convenience_store"] }, + { "emoji": "🏫", "aliases": ["school"] }, + { "emoji": "🏬", "aliases": ["department_store"] }, + { "emoji": "🏭", "aliases": ["factory"] }, + { "emoji": "🏯", "aliases": ["japanese_castle"] }, + { "emoji": "🏰", "aliases": ["european_castle"] }, + { "emoji": "💒", "aliases": ["wedding"] }, + { "emoji": "🗼", "aliases": ["tokyo_tower"] }, + { "emoji": "🗽", "aliases": ["statue_of_liberty"] }, + { "emoji": "⛪", "aliases": ["church"] }, + { "emoji": "🕌", "aliases": ["mosque"] }, + { "emoji": "🛕", "aliases": ["hindu_temple"] }, + { "emoji": "🕍", "aliases": ["synagogue"] }, + { "emoji": "⛩️", "aliases": ["shinto_shrine"] }, + { "emoji": "🕋", "aliases": ["kaaba"] }, + { "emoji": "⛲", "aliases": ["fountain"] }, + { "emoji": "⛺", "aliases": ["tent"] }, + { "emoji": "🌁", "aliases": ["foggy"] }, + { "emoji": "🌃", "aliases": ["night_with_stars"] }, + { "emoji": "🏙️", "aliases": ["cityscape"] }, + { "emoji": "🌄", "aliases": ["sunrise_over_mountains"] }, + { "emoji": "🌅", "aliases": ["sunrise"] }, + { "emoji": "🌆", "aliases": ["city_sunset"] }, + { "emoji": "🌇", "aliases": ["city_sunrise"] }, + { "emoji": "🌉", "aliases": ["bridge_at_night"] }, + { "emoji": "♨️", "aliases": ["hotsprings"] }, + { "emoji": "🎠", "aliases": ["carousel_horse"] }, + { "emoji": "🎡", "aliases": ["ferris_wheel"] }, + { "emoji": "🎢", "aliases": ["roller_coaster"] }, + { "emoji": "💈", "aliases": ["barber"] }, + { "emoji": "🎪", "aliases": ["circus_tent"] }, + { "emoji": "🚂", "aliases": ["steam_locomotive"] }, + { "emoji": "🚃", "aliases": ["railway_car"] }, + { "emoji": "🚄", "aliases": ["bullettrain_side"] }, + { "emoji": "🚅", "aliases": ["bullettrain_front"] }, + { "emoji": "🚆", "aliases": ["train2"] }, + { "emoji": "🚇", "aliases": ["metro"] }, + { "emoji": "🚈", "aliases": ["light_rail"] }, + { "emoji": "🚉", "aliases": ["station"] }, + { "emoji": "🚊", "aliases": ["tram"] }, + { "emoji": "🚝", "aliases": ["monorail"] }, + { "emoji": "🚞", "aliases": ["mountain_railway"] }, + { "emoji": "🚋", "aliases": ["train"] }, + { "emoji": "🚌", "aliases": ["bus"] }, + { "emoji": "🚍", "aliases": ["oncoming_bus"] }, + { "emoji": "🚎", "aliases": ["trolleybus"] }, + { "emoji": "🚐", "aliases": ["minibus"] }, + { "emoji": "🚑", "aliases": ["ambulance"] }, + { "emoji": "🚒", "aliases": ["fire_engine"] }, + { "emoji": "🚓", "aliases": ["police_car"] }, + { "emoji": "🚔", "aliases": ["oncoming_police_car"] }, + { "emoji": "🚕", "aliases": ["taxi"] }, + { "emoji": "🚖", "aliases": ["oncoming_taxi"] }, + { "emoji": "🚗", "aliases": ["car", "red_car"] }, + { "emoji": "🚘", "aliases": ["oncoming_automobile"] }, + { "emoji": "🚙", "aliases": ["blue_car"] }, + { "emoji": "🛻", "aliases": ["pickup_truck"] }, + { "emoji": "🚚", "aliases": ["truck"] }, + { "emoji": "🚛", "aliases": ["articulated_lorry"] }, + { "emoji": "🚜", "aliases": ["tractor"] }, + { "emoji": "🏎️", "aliases": ["racing_car"] }, + { "emoji": "🏍️", "aliases": ["motorcycle"] }, + { "emoji": "🛵", "aliases": ["motor_scooter"] }, + { "emoji": "🦽", "aliases": ["manual_wheelchair"] }, + { "emoji": "🦼", "aliases": ["motorized_wheelchair"] }, + { "emoji": "🛺", "aliases": ["auto_rickshaw"] }, + { "emoji": "🚲", "aliases": ["bike"] }, + { "emoji": "🛴", "aliases": ["kick_scooter"] }, + { "emoji": "🛹", "aliases": ["skateboard"] }, + { "emoji": "🛼", "aliases": ["roller_skate"] }, + { "emoji": "🚏", "aliases": ["busstop"] }, + { "emoji": "🛣️", "aliases": ["motorway"] }, + { "emoji": "🛤️", "aliases": ["railway_track"] }, + { "emoji": "🛢️", "aliases": ["oil_drum"] }, + { "emoji": "⛽", "aliases": ["fuelpump"] }, + { "emoji": "🚨", "aliases": ["rotating_light"] }, + { "emoji": "🚥", "aliases": ["traffic_light"] }, + { "emoji": "🚦", "aliases": ["vertical_traffic_light"] }, + { "emoji": "🛑", "aliases": ["stop_sign"] }, + { "emoji": "🚧", "aliases": ["construction"] }, + { "emoji": "⚓", "aliases": ["anchor"] }, + { "emoji": "⛵", "aliases": ["boat", "sailboat"] }, + { "emoji": "🛶", "aliases": ["canoe"] }, + { "emoji": "🚤", "aliases": ["speedboat"] }, + { "emoji": "🛳️", "aliases": ["passenger_ship"] }, + { "emoji": "⛴️", "aliases": ["ferry"] }, + { "emoji": "🛥️", "aliases": ["motor_boat"] }, + { "emoji": "🚢", "aliases": ["ship"] }, + { "emoji": "✈️", "aliases": ["airplane"] }, + { "emoji": "🛩️", "aliases": ["small_airplane"] }, + { "emoji": "🛫", "aliases": ["flight_departure"] }, + { "emoji": "🛬", "aliases": ["flight_arrival"] }, + { "emoji": "🪂", "aliases": ["parachute"] }, + { "emoji": "💺", "aliases": ["seat"] }, + { "emoji": "🚁", "aliases": ["helicopter"] }, + { "emoji": "🚟", "aliases": ["suspension_railway"] }, + { "emoji": "🚠", "aliases": ["mountain_cableway"] }, + { "emoji": "🚡", "aliases": ["aerial_tramway"] }, + { "emoji": "🛰️", "aliases": ["artificial_satellite"] }, + { "emoji": "🚀", "aliases": ["rocket"] }, + { "emoji": "🛸", "aliases": ["flying_saucer"] }, + { "emoji": "🛎️", "aliases": ["bellhop_bell"] }, + { "emoji": "🧳", "aliases": ["luggage"] }, + { "emoji": "⌛", "aliases": ["hourglass"] }, + { "emoji": "⏳", "aliases": ["hourglass_flowing_sand"] }, + { "emoji": "⌚", "aliases": ["watch"] }, + { "emoji": "⏰", "aliases": ["alarm_clock"] }, + { "emoji": "⏱️", "aliases": ["stopwatch"] }, + { "emoji": "⏲️", "aliases": ["timer_clock"] }, + { "emoji": "🕰️", "aliases": ["mantelpiece_clock"] }, + { "emoji": "🕛", "aliases": ["clock12"] }, + { "emoji": "🕧", "aliases": ["clock1230"] }, + { "emoji": "🕐", "aliases": ["clock1"] }, + { "emoji": "🕜", "aliases": ["clock130"] }, + { "emoji": "🕑", "aliases": ["clock2"] }, + { "emoji": "🕝", "aliases": ["clock230"] }, + { "emoji": "🕒", "aliases": ["clock3"] }, + { "emoji": "🕞", "aliases": ["clock330"] }, + { "emoji": "🕓", "aliases": ["clock4"] }, + { "emoji": "🕟", "aliases": ["clock430"] }, + { "emoji": "🕔", "aliases": ["clock5"] }, + { "emoji": "🕠", "aliases": ["clock530"] }, + { "emoji": "🕕", "aliases": ["clock6"] }, + { "emoji": "🕡", "aliases": ["clock630"] }, + { "emoji": "🕖", "aliases": ["clock7"] }, + { "emoji": "🕢", "aliases": ["clock730"] }, + { "emoji": "🕗", "aliases": ["clock8"] }, + { "emoji": "🕣", "aliases": ["clock830"] }, + { "emoji": "🕘", "aliases": ["clock9"] }, + { "emoji": "🕤", "aliases": ["clock930"] }, + { "emoji": "🕙", "aliases": ["clock10"] }, + { "emoji": "🕥", "aliases": ["clock1030"] }, + { "emoji": "🕚", "aliases": ["clock11"] }, + { "emoji": "🕦", "aliases": ["clock1130"] }, + { "emoji": "🌑", "aliases": ["new_moon"] }, + { "emoji": "🌒", "aliases": ["waxing_crescent_moon"] }, + { "emoji": "🌓", "aliases": ["first_quarter_moon"] }, + { "emoji": "🌔", "aliases": ["moon", "waxing_gibbous_moon"] }, + { "emoji": "🌕", "aliases": ["full_moon"] }, + { "emoji": "🌖", "aliases": ["waning_gibbous_moon"] }, + { "emoji": "🌗", "aliases": ["last_quarter_moon"] }, + { "emoji": "🌘", "aliases": ["waning_crescent_moon"] }, + { "emoji": "🌙", "aliases": ["crescent_moon"] }, + { "emoji": "🌚", "aliases": ["new_moon_with_face"] }, + { "emoji": "🌛", "aliases": ["first_quarter_moon_with_face"] }, + { "emoji": "🌜", "aliases": ["last_quarter_moon_with_face"] }, + { "emoji": "🌡️", "aliases": ["thermometer"] }, + { "emoji": "☀️", "aliases": ["sunny"] }, + { "emoji": "🌝", "aliases": ["full_moon_with_face"] }, + { "emoji": "🌞", "aliases": ["sun_with_face"] }, + { "emoji": "🪐", "aliases": ["ringed_planet"] }, + { "emoji": "⭐", "aliases": ["star"] }, + { "emoji": "🌟", "aliases": ["star2"] }, + { "emoji": "🌠", "aliases": ["stars"] }, + { "emoji": "🌌", "aliases": ["milky_way"] }, + { "emoji": "☁️", "aliases": ["cloud"] }, + { "emoji": "⛅", "aliases": ["partly_sunny"] }, + { "emoji": "⛈️", "aliases": ["cloud_with_lightning_and_rain"] }, + { "emoji": "🌤️", "aliases": ["sun_behind_small_cloud"] }, + { "emoji": "🌥️", "aliases": ["sun_behind_large_cloud"] }, + { "emoji": "🌦️", "aliases": ["sun_behind_rain_cloud"] }, + { "emoji": "🌧️", "aliases": ["cloud_with_rain"] }, + { "emoji": "🌨️", "aliases": ["cloud_with_snow"] }, + { "emoji": "🌩️", "aliases": ["cloud_with_lightning"] }, + { "emoji": "🌪️", "aliases": ["tornado"] }, + { "emoji": "🌫️", "aliases": ["fog"] }, + { "emoji": "🌬️", "aliases": ["wind_face"] }, + { "emoji": "🌀", "aliases": ["cyclone"] }, + { "emoji": "🌈", "aliases": ["rainbow"] }, + { "emoji": "🌂", "aliases": ["closed_umbrella"] }, + { "emoji": "☂️", "aliases": ["open_umbrella"] }, + { "emoji": "☔", "aliases": ["umbrella"] }, + { "emoji": "⛱️", "aliases": ["parasol_on_ground"] }, + { "emoji": "⚡", "aliases": ["zap"] }, + { "emoji": "❄️", "aliases": ["snowflake"] }, + { "emoji": "☃️", "aliases": ["snowman_with_snow"] }, + { "emoji": "⛄", "aliases": ["snowman"] }, + { "emoji": "☄️", "aliases": ["comet"] }, + { "emoji": "🔥", "aliases": ["fire"] }, + { "emoji": "💧", "aliases": ["droplet"] }, + { "emoji": "🌊", "aliases": ["ocean"] }, + { "emoji": "🎃", "aliases": ["jack_o_lantern"] }, + { "emoji": "🎄", "aliases": ["christmas_tree"] }, + { "emoji": "🎆", "aliases": ["fireworks"] }, + { "emoji": "🎇", "aliases": ["sparkler"] }, + { "emoji": "🧨", "aliases": ["firecracker"] }, + { "emoji": "✨", "aliases": ["sparkles"] }, + { "emoji": "🎈", "aliases": ["balloon"] }, + { "emoji": "🎉", "aliases": ["tada"] }, + { "emoji": "🎊", "aliases": ["confetti_ball"] }, + { "emoji": "🎋", "aliases": ["tanabata_tree"] }, + { "emoji": "🎍", "aliases": ["bamboo"] }, + { "emoji": "🎎", "aliases": ["dolls"] }, + { "emoji": "🎏", "aliases": ["flags"] }, + { "emoji": "🎐", "aliases": ["wind_chime"] }, + { "emoji": "🎑", "aliases": ["rice_scene"] }, + { "emoji": "🧧", "aliases": ["red_envelope"] }, + { "emoji": "🎀", "aliases": ["ribbon"] }, + { "emoji": "🎁", "aliases": ["gift"] }, + { "emoji": "🎗️", "aliases": ["reminder_ribbon"] }, + { "emoji": "🎟️", "aliases": ["tickets"] }, + { "emoji": "🎫", "aliases": ["ticket"] }, + { "emoji": "🎖️", "aliases": ["medal_military"] }, + { "emoji": "🏆", "aliases": ["trophy"] }, + { "emoji": "🏅", "aliases": ["medal_sports"] }, + { "emoji": "🥇", "aliases": ["1st_place_medal"] }, + { "emoji": "🥈", "aliases": ["2nd_place_medal"] }, + { "emoji": "🥉", "aliases": ["3rd_place_medal"] }, + { "emoji": "⚽", "aliases": ["soccer"] }, + { "emoji": "⚾", "aliases": ["baseball"] }, + { "emoji": "🥎", "aliases": ["softball"] }, + { "emoji": "🏀", "aliases": ["basketball"] }, + { "emoji": "🏐", "aliases": ["volleyball"] }, + { "emoji": "🏈", "aliases": ["football"] }, + { "emoji": "🏉", "aliases": ["rugby_football"] }, + { "emoji": "🎾", "aliases": ["tennis"] }, + { "emoji": "🥏", "aliases": ["flying_disc"] }, + { "emoji": "🎳", "aliases": ["bowling"] }, + { "emoji": "🏏", "aliases": ["cricket_game"] }, + { "emoji": "🏑", "aliases": ["field_hockey"] }, + { "emoji": "🏒", "aliases": ["ice_hockey"] }, + { "emoji": "🥍", "aliases": ["lacrosse"] }, + { "emoji": "🏓", "aliases": ["ping_pong"] }, + { "emoji": "🏸", "aliases": ["badminton"] }, + { "emoji": "🥊", "aliases": ["boxing_glove"] }, + { "emoji": "🥋", "aliases": ["martial_arts_uniform"] }, + { "emoji": "🥅", "aliases": ["goal_net"] }, + { "emoji": "⛳", "aliases": ["golf"] }, + { "emoji": "⛸️", "aliases": ["ice_skate"] }, + { "emoji": "🎣", "aliases": ["fishing_pole_and_fish"] }, + { "emoji": "🤿", "aliases": ["diving_mask"] }, + { "emoji": "🎽", "aliases": ["running_shirt_with_sash"] }, + { "emoji": "🎿", "aliases": ["ski"] }, + { "emoji": "🛷", "aliases": ["sled"] }, + { "emoji": "🥌", "aliases": ["curling_stone"] }, + { "emoji": "🎯", "aliases": ["dart"] }, + { "emoji": "🪀", "aliases": ["yo_yo"] }, + { "emoji": "🪁", "aliases": ["kite"] }, + { "emoji": "🎱", "aliases": ["8ball"] }, + { "emoji": "🔮", "aliases": ["crystal_ball"] }, + { "emoji": "🪄", "aliases": ["magic_wand"] }, + { "emoji": "🧿", "aliases": ["nazar_amulet"] }, + { "emoji": "🎮", "aliases": ["video_game"] }, + { "emoji": "🕹️", "aliases": ["joystick"] }, + { "emoji": "🎰", "aliases": ["slot_machine"] }, + { "emoji": "🎲", "aliases": ["game_die"] }, + { "emoji": "🧩", "aliases": ["jigsaw"] }, + { "emoji": "🧸", "aliases": ["teddy_bear"] }, + { "emoji": "🪅", "aliases": ["pinata"] }, + { "emoji": "🪆", "aliases": ["nesting_dolls"] }, + { "emoji": "♠️", "aliases": ["spades"] }, + { "emoji": "♥️", "aliases": ["hearts"] }, + { "emoji": "♦️", "aliases": ["diamonds"] }, + { "emoji": "♣️", "aliases": ["clubs"] }, + { "emoji": "♟️", "aliases": ["chess_pawn"] }, + { "emoji": "🃏", "aliases": ["black_joker"] }, + { "emoji": "🀄", "aliases": ["mahjong"] }, + { "emoji": "🎴", "aliases": ["flower_playing_cards"] }, + { "emoji": "🎭", "aliases": ["performing_arts"] }, + { "emoji": "🖼️", "aliases": ["framed_picture"] }, + { "emoji": "🎨", "aliases": ["art"] }, + { "emoji": "🧵", "aliases": ["thread"] }, + { "emoji": "🪡", "aliases": ["sewing_needle"] }, + { "emoji": "🧶", "aliases": ["yarn"] }, + { "emoji": "🪢", "aliases": ["knot"] }, + { "emoji": "👓", "aliases": ["eyeglasses"] }, + { "emoji": "🕶️", "aliases": ["dark_sunglasses"] }, + { "emoji": "🥽", "aliases": ["goggles"] }, + { "emoji": "🥼", "aliases": ["lab_coat"] }, + { "emoji": "🦺", "aliases": ["safety_vest"] }, + { "emoji": "👔", "aliases": ["necktie"] }, + { "emoji": "👕", "aliases": ["shirt", "tshirt"] }, + { "emoji": "👖", "aliases": ["jeans"] }, + { "emoji": "🧣", "aliases": ["scarf"] }, + { "emoji": "🧤", "aliases": ["gloves"] }, + { "emoji": "🧥", "aliases": ["coat"] }, + { "emoji": "🧦", "aliases": ["socks"] }, + { "emoji": "👗", "aliases": ["dress"] }, + { "emoji": "👘", "aliases": ["kimono"] }, + { "emoji": "🥻", "aliases": ["sari"] }, + { "emoji": "🩱", "aliases": ["one_piece_swimsuit"] }, + { "emoji": "🩲", "aliases": ["swim_brief"] }, + { "emoji": "🩳", "aliases": ["shorts"] }, + { "emoji": "👙", "aliases": ["bikini"] }, + { "emoji": "👚", "aliases": ["womans_clothes"] }, + { "emoji": "👛", "aliases": ["purse"] }, + { "emoji": "👜", "aliases": ["handbag"] }, + { "emoji": "👝", "aliases": ["pouch"] }, + { "emoji": "🛍️", "aliases": ["shopping"] }, + { "emoji": "🎒", "aliases": ["school_satchel"] }, + { "emoji": "🩴", "aliases": ["thong_sandal"] }, + { "emoji": "👞", "aliases": ["mans_shoe", "shoe"] }, + { "emoji": "👟", "aliases": ["athletic_shoe"] }, + { "emoji": "🥾", "aliases": ["hiking_boot"] }, + { "emoji": "🥿", "aliases": ["flat_shoe"] }, + { "emoji": "👠", "aliases": ["high_heel"] }, + { "emoji": "👡", "aliases": ["sandal"] }, + { "emoji": "🩰", "aliases": ["ballet_shoes"] }, + { "emoji": "👢", "aliases": ["boot"] }, + { "emoji": "👑", "aliases": ["crown"] }, + { "emoji": "👒", "aliases": ["womans_hat"] }, + { "emoji": "🎩", "aliases": ["tophat"] }, + { "emoji": "🎓", "aliases": ["mortar_board"] }, + { "emoji": "🧢", "aliases": ["billed_cap"] }, + { "emoji": "🪖", "aliases": ["military_helmet"] }, + { "emoji": "⛑️", "aliases": ["rescue_worker_helmet"] }, + { "emoji": "📿", "aliases": ["prayer_beads"] }, + { "emoji": "💄", "aliases": ["lipstick"] }, + { "emoji": "💍", "aliases": ["ring"] }, + { "emoji": "💎", "aliases": ["gem"] }, + { "emoji": "🔇", "aliases": ["mute"] }, + { "emoji": "🔈", "aliases": ["speaker"] }, + { "emoji": "🔉", "aliases": ["sound"] }, + { "emoji": "🔊", "aliases": ["loud_sound"] }, + { "emoji": "📢", "aliases": ["loudspeaker"] }, + { "emoji": "📣", "aliases": ["mega"] }, + { "emoji": "📯", "aliases": ["postal_horn"] }, + { "emoji": "🔔", "aliases": ["bell"] }, + { "emoji": "🔕", "aliases": ["no_bell"] }, + { "emoji": "🎼", "aliases": ["musical_score"] }, + { "emoji": "🎵", "aliases": ["musical_note"] }, + { "emoji": "🎶", "aliases": ["notes"] }, + { "emoji": "🎙️", "aliases": ["studio_microphone"] }, + { "emoji": "🎚️", "aliases": ["level_slider"] }, + { "emoji": "🎛️", "aliases": ["control_knobs"] }, + { "emoji": "🎤", "aliases": ["microphone"] }, + { "emoji": "🎧", "aliases": ["headphones"] }, + { "emoji": "📻", "aliases": ["radio"] }, + { "emoji": "🎷", "aliases": ["saxophone"] }, + { "emoji": "🪗", "aliases": ["accordion"] }, + { "emoji": "🎸", "aliases": ["guitar"] }, + { "emoji": "🎹", "aliases": ["musical_keyboard"] }, + { "emoji": "🎺", "aliases": ["trumpet"] }, + { "emoji": "🎻", "aliases": ["violin"] }, + { "emoji": "🪕", "aliases": ["banjo"] }, + { "emoji": "🥁", "aliases": ["drum"] }, + { "emoji": "🪘", "aliases": ["long_drum"] }, + { "emoji": "📱", "aliases": ["iphone"] }, + { "emoji": "📲", "aliases": ["calling"] }, + { "emoji": "☎️", "aliases": ["phone", "telephone"] }, + { "emoji": "📞", "aliases": ["telephone_receiver"] }, + { "emoji": "📟", "aliases": ["pager"] }, + { "emoji": "📠", "aliases": ["fax"] }, + { "emoji": "🔋", "aliases": ["battery"] }, + { "emoji": "🔌", "aliases": ["electric_plug"] }, + { "emoji": "💻", "aliases": ["computer"] }, + { "emoji": "🖥️", "aliases": ["desktop_computer"] }, + { "emoji": "🖨️", "aliases": ["printer"] }, + { "emoji": "⌨️", "aliases": ["keyboard"] }, + { "emoji": "🖱️", "aliases": ["computer_mouse"] }, + { "emoji": "🖲️", "aliases": ["trackball"] }, + { "emoji": "💽", "aliases": ["minidisc"] }, + { "emoji": "💾", "aliases": ["floppy_disk"] }, + { "emoji": "💿", "aliases": ["cd"] }, + { "emoji": "📀", "aliases": ["dvd"] }, + { "emoji": "🧮", "aliases": ["abacus"] }, + { "emoji": "🎥", "aliases": ["movie_camera"] }, + { "emoji": "🎞️", "aliases": ["film_strip"] }, + { "emoji": "📽️", "aliases": ["film_projector"] }, + { "emoji": "🎬", "aliases": ["clapper"] }, + { "emoji": "📺", "aliases": ["tv"] }, + { "emoji": "📷", "aliases": ["camera"] }, + { "emoji": "📸", "aliases": ["camera_flash"] }, + { "emoji": "📹", "aliases": ["video_camera"] }, + { "emoji": "📼", "aliases": ["vhs"] }, + { "emoji": "🔍", "aliases": ["mag"] }, + { "emoji": "🔎", "aliases": ["mag_right"] }, + { "emoji": "🕯️", "aliases": ["candle"] }, + { "emoji": "💡", "aliases": ["bulb"] }, + { "emoji": "🔦", "aliases": ["flashlight"] }, + { "emoji": "🏮", "aliases": ["izakaya_lantern", "lantern"] }, + { "emoji": "🪔", "aliases": ["diya_lamp"] }, + { "emoji": "📔", "aliases": ["notebook_with_decorative_cover"] }, + { "emoji": "📕", "aliases": ["closed_book"] }, + { "emoji": "📖", "aliases": ["book", "open_book"] }, + { "emoji": "📗", "aliases": ["green_book"] }, + { "emoji": "📘", "aliases": ["blue_book"] }, + { "emoji": "📙", "aliases": ["orange_book"] }, + { "emoji": "📚", "aliases": ["books"] }, + { "emoji": "📓", "aliases": ["notebook"] }, + { "emoji": "📒", "aliases": ["ledger"] }, + { "emoji": "📃", "aliases": ["page_with_curl"] }, + { "emoji": "📜", "aliases": ["scroll"] }, + { "emoji": "📄", "aliases": ["page_facing_up"] }, + { "emoji": "📰", "aliases": ["newspaper"] }, + { "emoji": "🗞️", "aliases": ["newspaper_roll"] }, + { "emoji": "📑", "aliases": ["bookmark_tabs"] }, + { "emoji": "🔖", "aliases": ["bookmark"] }, + { "emoji": "🏷️", "aliases": ["label"] }, + { "emoji": "💰", "aliases": ["moneybag"] }, + { "emoji": "🪙", "aliases": ["coin"] }, + { "emoji": "💴", "aliases": ["yen"] }, + { "emoji": "💵", "aliases": ["dollar"] }, + { "emoji": "💶", "aliases": ["euro"] }, + { "emoji": "💷", "aliases": ["pound"] }, + { "emoji": "💸", "aliases": ["money_with_wings"] }, + { "emoji": "💳", "aliases": ["credit_card"] }, + { "emoji": "🧾", "aliases": ["receipt"] }, + { "emoji": "💹", "aliases": ["chart"] }, + { "emoji": "✉️", "aliases": ["envelope"] }, + { "emoji": "📧", "aliases": ["email", "e-mail"] }, + { "emoji": "📨", "aliases": ["incoming_envelope"] }, + { "emoji": "📩", "aliases": ["envelope_with_arrow"] }, + { "emoji": "📤", "aliases": ["outbox_tray"] }, + { "emoji": "📥", "aliases": ["inbox_tray"] }, + { "emoji": "📦", "aliases": ["package"] }, + { "emoji": "📫", "aliases": ["mailbox"] }, + { "emoji": "📪", "aliases": ["mailbox_closed"] }, + { "emoji": "📬", "aliases": ["mailbox_with_mail"] }, + { "emoji": "📭", "aliases": ["mailbox_with_no_mail"] }, + { "emoji": "📮", "aliases": ["postbox"] }, + { "emoji": "🗳️", "aliases": ["ballot_box"] }, + { "emoji": "✏️", "aliases": ["pencil2"] }, + { "emoji": "✒️", "aliases": ["black_nib"] }, + { "emoji": "🖋️", "aliases": ["fountain_pen"] }, + { "emoji": "🖊️", "aliases": ["pen"] }, + { "emoji": "🖌️", "aliases": ["paintbrush"] }, + { "emoji": "🖍️", "aliases": ["crayon"] }, + { "emoji": "📝", "aliases": ["memo", "pencil"] }, + { "emoji": "💼", "aliases": ["briefcase"] }, + { "emoji": "📁", "aliases": ["file_folder"] }, + { "emoji": "📂", "aliases": ["open_file_folder"] }, + { "emoji": "🗂️", "aliases": ["card_index_dividers"] }, + { "emoji": "📅", "aliases": ["date"] }, + { "emoji": "📆", "aliases": ["calendar"] }, + { "emoji": "🗒️", "aliases": ["spiral_notepad"] }, + { "emoji": "🗓️", "aliases": ["spiral_calendar"] }, + { "emoji": "📇", "aliases": ["card_index"] }, + { "emoji": "📈", "aliases": ["chart_with_upwards_trend"] }, + { "emoji": "📉", "aliases": ["chart_with_downwards_trend"] }, + { "emoji": "📊", "aliases": ["bar_chart"] }, + { "emoji": "📋", "aliases": ["clipboard"] }, + { "emoji": "📌", "aliases": ["pushpin"] }, + { "emoji": "📍", "aliases": ["round_pushpin"] }, + { "emoji": "📎", "aliases": ["paperclip"] }, + { "emoji": "🖇️", "aliases": ["paperclips"] }, + { "emoji": "📏", "aliases": ["straight_ruler"] }, + { "emoji": "📐", "aliases": ["triangular_ruler"] }, + { "emoji": "✂️", "aliases": ["scissors"] }, + { "emoji": "🗃️", "aliases": ["card_file_box"] }, + { "emoji": "🗄️", "aliases": ["file_cabinet"] }, + { "emoji": "🗑️", "aliases": ["wastebasket"] }, + { "emoji": "🔒", "aliases": ["lock"] }, + { "emoji": "🔓", "aliases": ["unlock"] }, + { "emoji": "🔏", "aliases": ["lock_with_ink_pen"] }, + { "emoji": "🔐", "aliases": ["closed_lock_with_key"] }, + { "emoji": "🔑", "aliases": ["key"] }, + { "emoji": "🗝️", "aliases": ["old_key"] }, + { "emoji": "🔨", "aliases": ["hammer"] }, + { "emoji": "🪓", "aliases": ["axe"] }, + { "emoji": "⛏️", "aliases": ["pick"] }, + { "emoji": "⚒️", "aliases": ["hammer_and_pick"] }, + { "emoji": "🛠️", "aliases": ["hammer_and_wrench"] }, + { "emoji": "🗡️", "aliases": ["dagger"] }, + { "emoji": "⚔️", "aliases": ["crossed_swords"] }, + { "emoji": "🔫", "aliases": ["gun"] }, + { "emoji": "🪃", "aliases": ["boomerang"] }, + { "emoji": "🏹", "aliases": ["bow_and_arrow"] }, + { "emoji": "🛡️", "aliases": ["shield"] }, + { "emoji": "🪚", "aliases": ["carpentry_saw"] }, + { "emoji": "🔧", "aliases": ["wrench"] }, + { "emoji": "🪛", "aliases": ["screwdriver"] }, + { "emoji": "🔩", "aliases": ["nut_and_bolt"] }, + { "emoji": "⚙️", "aliases": ["gear"] }, + { "emoji": "🗜️", "aliases": ["clamp"] }, + { "emoji": "⚖️", "aliases": ["balance_scale"] }, + { "emoji": "🦯", "aliases": ["probing_cane"] }, + { "emoji": "🔗", "aliases": ["link"] }, + { "emoji": "⛓️", "aliases": ["chains"] }, + { "emoji": "🪝", "aliases": ["hook"] }, + { "emoji": "🧰", "aliases": ["toolbox"] }, + { "emoji": "🧲", "aliases": ["magnet"] }, + { "emoji": "🪜", "aliases": ["ladder"] }, + { "emoji": "⚗️", "aliases": ["alembic"] }, + { "emoji": "🧪", "aliases": ["test_tube"] }, + { "emoji": "🧫", "aliases": ["petri_dish"] }, + { "emoji": "🧬", "aliases": ["dna"] }, + { "emoji": "🔬", "aliases": ["microscope"] }, + { "emoji": "🔭", "aliases": ["telescope"] }, + { "emoji": "📡", "aliases": ["satellite"] }, + { "emoji": "💉", "aliases": ["syringe"] }, + { "emoji": "🩸", "aliases": ["drop_of_blood"] }, + { "emoji": "💊", "aliases": ["pill"] }, + { "emoji": "🩹", "aliases": ["adhesive_bandage"] }, + { "emoji": "🩺", "aliases": ["stethoscope"] }, + { "emoji": "🚪", "aliases": ["door"] }, + { "emoji": "🛗", "aliases": ["elevator"] }, + { "emoji": "🪞", "aliases": ["mirror"] }, + { "emoji": "🪟", "aliases": ["window"] }, + { "emoji": "🛏️", "aliases": ["bed"] }, + { "emoji": "🛋️", "aliases": ["couch_and_lamp"] }, + { "emoji": "🪑", "aliases": ["chair"] }, + { "emoji": "🚽", "aliases": ["toilet"] }, + { "emoji": "🪠", "aliases": ["plunger"] }, + { "emoji": "🚿", "aliases": ["shower"] }, + { "emoji": "🛁", "aliases": ["bathtub"] }, + { "emoji": "🪤", "aliases": ["mouse_trap"] }, + { "emoji": "🪒", "aliases": ["razor"] }, + { "emoji": "🧴", "aliases": ["lotion_bottle"] }, + { "emoji": "🧷", "aliases": ["safety_pin"] }, + { "emoji": "🧹", "aliases": ["broom"] }, + { "emoji": "🧺", "aliases": ["basket"] }, + { "emoji": "🧻", "aliases": ["roll_of_paper"] }, + { "emoji": "🪣", "aliases": ["bucket"] }, + { "emoji": "🧼", "aliases": ["soap"] }, + { "emoji": "🪥", "aliases": ["toothbrush"] }, + { "emoji": "🧽", "aliases": ["sponge"] }, + { "emoji": "🧯", "aliases": ["fire_extinguisher"] }, + { "emoji": "🛒", "aliases": ["shopping_cart"] }, + { "emoji": "🚬", "aliases": ["smoking"] }, + { "emoji": "⚰️", "aliases": ["coffin"] }, + { "emoji": "🪦", "aliases": ["headstone"] }, + { "emoji": "⚱️", "aliases": ["funeral_urn"] }, + { "emoji": "🗿", "aliases": ["moyai"] }, + { "emoji": "🪧", "aliases": ["placard"] }, + { "emoji": "🏧", "aliases": ["atm"] }, + { "emoji": "🚮", "aliases": ["put_litter_in_its_place"] }, + { "emoji": "🚰", "aliases": ["potable_water"] }, + { "emoji": "♿", "aliases": ["wheelchair"] }, + { "emoji": "🚹", "aliases": ["mens"] }, + { "emoji": "🚺", "aliases": ["womens"] }, + { "emoji": "🚻", "aliases": ["restroom"] }, + { "emoji": "🚼", "aliases": ["baby_symbol"] }, + { "emoji": "🚾", "aliases": ["wc"] }, + { "emoji": "🛂", "aliases": ["passport_control"] }, + { "emoji": "🛃", "aliases": ["customs"] }, + { "emoji": "🛄", "aliases": ["baggage_claim"] }, + { "emoji": "🛅", "aliases": ["left_luggage"] }, + { "emoji": "⚠️", "aliases": ["warning"] }, + { "emoji": "🚸", "aliases": ["children_crossing"] }, + { "emoji": "⛔", "aliases": ["no_entry"] }, + { "emoji": "🚫", "aliases": ["no_entry_sign"] }, + { "emoji": "🚳", "aliases": ["no_bicycles"] }, + { "emoji": "🚭", "aliases": ["no_smoking"] }, + { "emoji": "🚯", "aliases": ["do_not_litter"] }, + { "emoji": "🚱", "aliases": ["non-potable_water"] }, + { "emoji": "🚷", "aliases": ["no_pedestrians"] }, + { "emoji": "📵", "aliases": ["no_mobile_phones"] }, + { "emoji": "🔞", "aliases": ["underage"] }, + { "emoji": "☢️", "aliases": ["radioactive"] }, + { "emoji": "☣️", "aliases": ["biohazard"] }, + { "emoji": "⬆️", "aliases": ["arrow_up"] }, + { "emoji": "↗️", "aliases": ["arrow_upper_right"] }, + { "emoji": "➡️", "aliases": ["arrow_right"] }, + { "emoji": "↘️", "aliases": ["arrow_lower_right"] }, + { "emoji": "⬇️", "aliases": ["arrow_down"] }, + { "emoji": "↙️", "aliases": ["arrow_lower_left"] }, + { "emoji": "⬅️", "aliases": ["arrow_left"] }, + { "emoji": "↖️", "aliases": ["arrow_upper_left"] }, + { "emoji": "↕️", "aliases": ["arrow_up_down"] }, + { "emoji": "↔️", "aliases": ["left_right_arrow"] }, + { "emoji": "↩️", "aliases": ["leftwards_arrow_with_hook"] }, + { "emoji": "↪️", "aliases": ["arrow_right_hook"] }, + { "emoji": "⤴️", "aliases": ["arrow_heading_up"] }, + { "emoji": "⤵️", "aliases": ["arrow_heading_down"] }, + { "emoji": "🔃", "aliases": ["arrows_clockwise"] }, + { "emoji": "🔄", "aliases": ["arrows_counterclockwise"] }, + { "emoji": "🔙", "aliases": ["back"] }, + { "emoji": "🔚", "aliases": ["end"] }, + { "emoji": "🔛", "aliases": ["on"] }, + { "emoji": "🔜", "aliases": ["soon"] }, + { "emoji": "🔝", "aliases": ["top"] }, + { "emoji": "🛐", "aliases": ["place_of_worship"] }, + { "emoji": "⚛️", "aliases": ["atom_symbol"] }, + { "emoji": "🕉️", "aliases": ["om"] }, + { "emoji": "✡️", "aliases": ["star_of_david"] }, + { "emoji": "☸️", "aliases": ["wheel_of_dharma"] }, + { "emoji": "☯️", "aliases": ["yin_yang"] }, + { "emoji": "✝️", "aliases": ["latin_cross"] }, + { "emoji": "☦️", "aliases": ["orthodox_cross"] }, + { "emoji": "☪️", "aliases": ["star_and_crescent"] }, + { "emoji": "☮️", "aliases": ["peace_symbol"] }, + { "emoji": "🕎", "aliases": ["menorah"] }, + { "emoji": "🔯", "aliases": ["six_pointed_star"] }, + { "emoji": "♈", "aliases": ["aries"] }, + { "emoji": "♉", "aliases": ["taurus"] }, + { "emoji": "♊", "aliases": ["gemini"] }, + { "emoji": "♋", "aliases": ["cancer"] }, + { "emoji": "♌", "aliases": ["leo"] }, + { "emoji": "♍", "aliases": ["virgo"] }, + { "emoji": "♎", "aliases": ["libra"] }, + { "emoji": "♏", "aliases": ["scorpius"] }, + { "emoji": "♐", "aliases": ["sagittarius"] }, + { "emoji": "♑", "aliases": ["capricorn"] }, + { "emoji": "♒", "aliases": ["aquarius"] }, + { "emoji": "♓", "aliases": ["pisces"] }, + { "emoji": "⛎", "aliases": ["ophiuchus"] }, + { "emoji": "🔀", "aliases": ["twisted_rightwards_arrows"] }, + { "emoji": "🔁", "aliases": ["repeat"] }, + { "emoji": "🔂", "aliases": ["repeat_one"] }, + { "emoji": "▶️", "aliases": ["arrow_forward"] }, + { "emoji": "⏩", "aliases": ["fast_forward"] }, + { "emoji": "⏭️", "aliases": ["next_track_button"] }, + { "emoji": "⏯️", "aliases": ["play_or_pause_button"] }, + { "emoji": "◀️", "aliases": ["arrow_backward"] }, + { "emoji": "⏪", "aliases": ["rewind"] }, + { "emoji": "⏮️", "aliases": ["previous_track_button"] }, + { "emoji": "🔼", "aliases": ["arrow_up_small"] }, + { "emoji": "⏫", "aliases": ["arrow_double_up"] }, + { "emoji": "🔽", "aliases": ["arrow_down_small"] }, + { "emoji": "⏬", "aliases": ["arrow_double_down"] }, + { "emoji": "⏸️", "aliases": ["pause_button"] }, + { "emoji": "⏹️", "aliases": ["stop_button"] }, + { "emoji": "⏺️", "aliases": ["record_button"] }, + { "emoji": "⏏️", "aliases": ["eject_button"] }, + { "emoji": "🎦", "aliases": ["cinema"] }, + { "emoji": "🔅", "aliases": ["low_brightness"] }, + { "emoji": "🔆", "aliases": ["high_brightness"] }, + { "emoji": "📶", "aliases": ["signal_strength"] }, + { "emoji": "📳", "aliases": ["vibration_mode"] }, + { "emoji": "📴", "aliases": ["mobile_phone_off"] }, + { "emoji": "♀️", "aliases": ["female_sign"] }, + { "emoji": "♂️", "aliases": ["male_sign"] }, + { "emoji": "⚧️", "aliases": ["transgender_symbol"] }, + { "emoji": "✖️", "aliases": ["heavy_multiplication_x"] }, + { "emoji": "➕", "aliases": ["heavy_plus_sign"] }, + { "emoji": "➖", "aliases": ["heavy_minus_sign"] }, + { "emoji": "➗", "aliases": ["heavy_division_sign"] }, + { "emoji": "♾️", "aliases": ["infinity"] }, + { "emoji": "‼️", "aliases": ["bangbang"] }, + { "emoji": "⁉️", "aliases": ["interrobang"] }, + { "emoji": "❓", "aliases": ["question"] }, + { "emoji": "❔", "aliases": ["grey_question"] }, + { "emoji": "❕", "aliases": ["grey_exclamation"] }, + { "emoji": "❗", "aliases": ["exclamation", "heavy_exclamation_mark"] }, + { "emoji": "〰️", "aliases": ["wavy_dash"] }, + { "emoji": "💱", "aliases": ["currency_exchange"] }, + { "emoji": "💲", "aliases": ["heavy_dollar_sign"] }, + { "emoji": "⚕️", "aliases": ["medical_symbol"] }, + { "emoji": "♻️", "aliases": ["recycle"] }, + { "emoji": "⚜️", "aliases": ["fleur_de_lis"] }, + { "emoji": "🔱", "aliases": ["trident"] }, + { "emoji": "📛", "aliases": ["name_badge"] }, + { "emoji": "🔰", "aliases": ["beginner"] }, + { "emoji": "⭕", "aliases": ["o"] }, + { "emoji": "✅", "aliases": ["white_check_mark"] }, + { "emoji": "☑️", "aliases": ["ballot_box_with_check"] }, + { "emoji": "✔️", "aliases": ["heavy_check_mark"] }, + { "emoji": "❌", "aliases": ["x"] }, + { "emoji": "❎", "aliases": ["negative_squared_cross_mark"] }, + { "emoji": "➰", "aliases": ["curly_loop"] }, + { "emoji": "➿", "aliases": ["loop"] }, + { "emoji": "〽️", "aliases": ["part_alternation_mark"] }, + { "emoji": "✳️", "aliases": ["eight_spoked_asterisk"] }, + { "emoji": "✴️", "aliases": ["eight_pointed_black_star"] }, + { "emoji": "❇️", "aliases": ["sparkle"] }, + { "emoji": "©️", "aliases": ["copyright"] }, + { "emoji": "®️", "aliases": ["registered"] }, + { "emoji": "™️", "aliases": ["tm"] }, + { "emoji": "#️⃣", "aliases": ["hash"] }, + { "emoji": "*️⃣", "aliases": ["asterisk"] }, + { "emoji": "0️⃣", "aliases": ["zero"] }, + { "emoji": "1️⃣", "aliases": ["one"] }, + { "emoji": "2️⃣", "aliases": ["two"] }, + { "emoji": "3️⃣", "aliases": ["three"] }, + { "emoji": "4️⃣", "aliases": ["four"] }, + { "emoji": "5️⃣", "aliases": ["five"] }, + { "emoji": "6️⃣", "aliases": ["six"] }, + { "emoji": "7️⃣", "aliases": ["seven"] }, + { "emoji": "8️⃣", "aliases": ["eight"] }, + { "emoji": "9️⃣", "aliases": ["nine"] }, + { "emoji": "🔟", "aliases": ["keycap_ten"] }, + { "emoji": "🔠", "aliases": ["capital_abcd"] }, + { "emoji": "🔡", "aliases": ["abcd"] }, + { "emoji": "🔢", "aliases": ["1234"] }, + { "emoji": "🔣", "aliases": ["symbols"] }, + { "emoji": "🔤", "aliases": ["abc"] }, + { "emoji": "🅰️", "aliases": ["a"] }, + { "emoji": "🆎", "aliases": ["ab"] }, + { "emoji": "🅱️", "aliases": ["b"] }, + { "emoji": "🆑", "aliases": ["cl"] }, + { "emoji": "🆒", "aliases": ["cool"] }, + { "emoji": "🆓", "aliases": ["free"] }, + { "emoji": "ℹ️", "aliases": ["information_source"] }, + { "emoji": "🆔", "aliases": ["id"] }, + { "emoji": "Ⓜ️", "aliases": ["m"] }, + { "emoji": "🆕", "aliases": ["new"] }, + { "emoji": "🆖", "aliases": ["ng"] }, + { "emoji": "🅾️", "aliases": ["o2"] }, + { "emoji": "🆗", "aliases": ["ok"] }, + { "emoji": "🅿️", "aliases": ["parking"] }, + { "emoji": "🆘", "aliases": ["sos"] }, + { "emoji": "🆙", "aliases": ["up"] }, + { "emoji": "🆚", "aliases": ["vs"] }, + { "emoji": "🈁", "aliases": ["koko"] }, + { "emoji": "🈂️", "aliases": ["sa"] }, + { "emoji": "🈷️", "aliases": ["u6708"] }, + { "emoji": "🈶", "aliases": ["u6709"] }, + { "emoji": "🈯", "aliases": ["u6307"] }, + { "emoji": "🉐", "aliases": ["ideograph_advantage"] }, + { "emoji": "🈹", "aliases": ["u5272"] }, + { "emoji": "🈚", "aliases": ["u7121"] }, + { "emoji": "🈲", "aliases": ["u7981"] }, + { "emoji": "🉑", "aliases": ["accept"] }, + { "emoji": "🈸", "aliases": ["u7533"] }, + { "emoji": "🈴", "aliases": ["u5408"] }, + { "emoji": "🈳", "aliases": ["u7a7a"] }, + { "emoji": "㊗️", "aliases": ["congratulations"] }, + { "emoji": "㊙️", "aliases": ["secret"] }, + { "emoji": "🈺", "aliases": ["u55b6"] }, + { "emoji": "🈵", "aliases": ["u6e80"] }, + { "emoji": "🔴", "aliases": ["red_circle"] }, + { "emoji": "🟠", "aliases": ["orange_circle"] }, + { "emoji": "🟡", "aliases": ["yellow_circle"] }, + { "emoji": "🟢", "aliases": ["green_circle"] }, + { "emoji": "🔵", "aliases": ["large_blue_circle"] }, + { "emoji": "🟣", "aliases": ["purple_circle"] }, + { "emoji": "🟤", "aliases": ["brown_circle"] }, + { "emoji": "⚫", "aliases": ["black_circle"] }, + { "emoji": "⚪", "aliases": ["white_circle"] }, + { "emoji": "🟥", "aliases": ["red_square"] }, + { "emoji": "🟧", "aliases": ["orange_square"] }, + { "emoji": "🟨", "aliases": ["yellow_square"] }, + { "emoji": "🟩", "aliases": ["green_square"] }, + { "emoji": "🟦", "aliases": ["blue_square"] }, + { "emoji": "🟪", "aliases": ["purple_square"] }, + { "emoji": "🟫", "aliases": ["brown_square"] }, + { "emoji": "⬛", "aliases": ["black_large_square"] }, + { "emoji": "⬜", "aliases": ["white_large_square"] }, + { "emoji": "◼️", "aliases": ["black_medium_square"] }, + { "emoji": "◻️", "aliases": ["white_medium_square"] }, + { "emoji": "◾", "aliases": ["black_medium_small_square"] }, + { "emoji": "◽", "aliases": ["white_medium_small_square"] }, + { "emoji": "▪️", "aliases": ["black_small_square"] }, + { "emoji": "▫️", "aliases": ["white_small_square"] }, + { "emoji": "🔶", "aliases": ["large_orange_diamond"] }, + { "emoji": "🔷", "aliases": ["large_blue_diamond"] }, + { "emoji": "🔸", "aliases": ["small_orange_diamond"] }, + { "emoji": "🔹", "aliases": ["small_blue_diamond"] }, + { "emoji": "🔺", "aliases": ["small_red_triangle"] }, + { "emoji": "🔻", "aliases": ["small_red_triangle_down"] }, + { "emoji": "💠", "aliases": ["diamond_shape_with_a_dot_inside"] }, + { "emoji": "🔘", "aliases": ["radio_button"] }, + { "emoji": "🔳", "aliases": ["white_square_button"] }, + { "emoji": "🔲", "aliases": ["black_square_button"] }, + { "emoji": "🏁", "aliases": ["checkered_flag"] }, + { "emoji": "🚩", "aliases": ["triangular_flag_on_post"] }, + { "emoji": "🎌", "aliases": ["crossed_flags"] }, + { "emoji": "🏴", "aliases": ["black_flag"] }, + { "emoji": "🏳️", "aliases": ["white_flag"] }, + { "emoji": "🏳️‍🌈", "aliases": ["rainbow_flag"] }, + { "emoji": "🏳️‍⚧️", "aliases": ["transgender_flag"] }, + { "emoji": "🏴‍☠️", "aliases": ["pirate_flag"] }, + { "emoji": "🇦🇨", "aliases": ["ascension_island"] }, + { "emoji": "🇦🇩", "aliases": ["andorra"] }, + { "emoji": "🇦🇪", "aliases": ["united_arab_emirates"] }, + { "emoji": "🇦🇫", "aliases": ["afghanistan"] }, + { "emoji": "🇦🇬", "aliases": ["antigua_barbuda"] }, + { "emoji": "🇦🇮", "aliases": ["anguilla"] }, + { "emoji": "🇦🇱", "aliases": ["albania"] }, + { "emoji": "🇦🇲", "aliases": ["armenia"] }, + { "emoji": "🇦🇴", "aliases": ["angola"] }, + { "emoji": "🇦🇶", "aliases": ["antarctica"] }, + { "emoji": "🇦🇷", "aliases": ["argentina"] }, + { "emoji": "🇦🇸", "aliases": ["american_samoa"] }, + { "emoji": "🇦🇹", "aliases": ["austria"] }, + { "emoji": "🇦🇺", "aliases": ["australia"] }, + { "emoji": "🇦🇼", "aliases": ["aruba"] }, + { "emoji": "🇦🇽", "aliases": ["aland_islands"] }, + { "emoji": "🇦🇿", "aliases": ["azerbaijan"] }, + { "emoji": "🇧🇦", "aliases": ["bosnia_herzegovina"] }, + { "emoji": "🇧🇧", "aliases": ["barbados"] }, + { "emoji": "🇧🇩", "aliases": ["bangladesh"] }, + { "emoji": "🇧🇪", "aliases": ["belgium"] }, + { "emoji": "🇧🇫", "aliases": ["burkina_faso"] }, + { "emoji": "🇧🇬", "aliases": ["bulgaria"] }, + { "emoji": "🇧🇭", "aliases": ["bahrain"] }, + { "emoji": "🇧🇮", "aliases": ["burundi"] }, + { "emoji": "🇧🇯", "aliases": ["benin"] }, + { "emoji": "🇧🇱", "aliases": ["st_barthelemy"] }, + { "emoji": "🇧🇲", "aliases": ["bermuda"] }, + { "emoji": "🇧🇳", "aliases": ["brunei"] }, + { "emoji": "🇧🇴", "aliases": ["bolivia"] }, + { "emoji": "🇧🇶", "aliases": ["caribbean_netherlands"] }, + { "emoji": "🇧🇷", "aliases": ["brazil"] }, + { "emoji": "🇧🇸", "aliases": ["bahamas"] }, + { "emoji": "🇧🇹", "aliases": ["bhutan"] }, + { "emoji": "🇧🇻", "aliases": ["bouvet_island"] }, + { "emoji": "🇧🇼", "aliases": ["botswana"] }, + { "emoji": "🇧🇾", "aliases": ["belarus"] }, + { "emoji": "🇧🇿", "aliases": ["belize"] }, + { "emoji": "🇨🇦", "aliases": ["canada"] }, + { "emoji": "🇨🇨", "aliases": ["cocos_islands"] }, + { "emoji": "🇨🇩", "aliases": ["congo_kinshasa"] }, + { "emoji": "🇨🇫", "aliases": ["central_african_republic"] }, + { "emoji": "🇨🇬", "aliases": ["congo_brazzaville"] }, + { "emoji": "🇨🇭", "aliases": ["switzerland"] }, + { "emoji": "🇨🇮", "aliases": ["cote_divoire"] }, + { "emoji": "🇨🇰", "aliases": ["cook_islands"] }, + { "emoji": "🇨🇱", "aliases": ["chile"] }, + { "emoji": "🇨🇲", "aliases": ["cameroon"] }, + { "emoji": "🇨🇳", "aliases": ["cn"] }, + { "emoji": "🇨🇴", "aliases": ["colombia"] }, + { "emoji": "🇨🇵", "aliases": ["clipperton_island"] }, + { "emoji": "🇨🇷", "aliases": ["costa_rica"] }, + { "emoji": "🇨🇺", "aliases": ["cuba"] }, + { "emoji": "🇨🇻", "aliases": ["cape_verde"] }, + { "emoji": "🇨🇼", "aliases": ["curacao"] }, + { "emoji": "🇨🇽", "aliases": ["christmas_island"] }, + { "emoji": "🇨🇾", "aliases": ["cyprus"] }, + { "emoji": "🇨🇿", "aliases": ["czech_republic"] }, + { "emoji": "🇩🇪", "aliases": ["de"] }, + { "emoji": "🇩🇬", "aliases": ["diego_garcia"] }, + { "emoji": "🇩🇯", "aliases": ["djibouti"] }, + { "emoji": "🇩🇰", "aliases": ["denmark"] }, + { "emoji": "🇩🇲", "aliases": ["dominica"] }, + { "emoji": "🇩🇴", "aliases": ["dominican_republic"] }, + { "emoji": "🇩🇿", "aliases": ["algeria"] }, + { "emoji": "🇪🇦", "aliases": ["ceuta_melilla"] }, + { "emoji": "🇪🇨", "aliases": ["ecuador"] }, + { "emoji": "🇪🇪", "aliases": ["estonia"] }, + { "emoji": "🇪🇬", "aliases": ["egypt"] }, + { "emoji": "🇪🇭", "aliases": ["western_sahara"] }, + { "emoji": "🇪🇷", "aliases": ["eritrea"] }, + { "emoji": "🇪🇸", "aliases": ["es"] }, + { "emoji": "🇪🇹", "aliases": ["ethiopia"] }, + { "emoji": "🇪🇺", "aliases": ["eu", "european_union"] }, + { "emoji": "🇫🇮", "aliases": ["finland"] }, + { "emoji": "🇫🇯", "aliases": ["fiji"] }, + { "emoji": "🇫🇰", "aliases": ["falkland_islands"] }, + { "emoji": "🇫🇲", "aliases": ["micronesia"] }, + { "emoji": "🇫🇴", "aliases": ["faroe_islands"] }, + { "emoji": "🇫🇷", "aliases": ["fr"] }, + { "emoji": "🇬🇦", "aliases": ["gabon"] }, + { "emoji": "🇬🇧", "aliases": ["gb", "uk"] }, + { "emoji": "🇬🇩", "aliases": ["grenada"] }, + { "emoji": "🇬🇪", "aliases": ["georgia"] }, + { "emoji": "🇬🇫", "aliases": ["french_guiana"] }, + { "emoji": "🇬🇬", "aliases": ["guernsey"] }, + { "emoji": "🇬🇭", "aliases": ["ghana"] }, + { "emoji": "🇬🇮", "aliases": ["gibraltar"] }, + { "emoji": "🇬🇱", "aliases": ["greenland"] }, + { "emoji": "🇬🇲", "aliases": ["gambia"] }, + { "emoji": "🇬🇳", "aliases": ["guinea"] }, + { "emoji": "🇬🇵", "aliases": ["guadeloupe"] }, + { "emoji": "🇬🇶", "aliases": ["equatorial_guinea"] }, + { "emoji": "🇬🇷", "aliases": ["greece"] }, + { "emoji": "🇬🇸", "aliases": ["south_georgia_south_sandwich_islands"] }, + { "emoji": "🇬🇹", "aliases": ["guatemala"] }, + { "emoji": "🇬🇺", "aliases": ["guam"] }, + { "emoji": "🇬🇼", "aliases": ["guinea_bissau"] }, + { "emoji": "🇬🇾", "aliases": ["guyana"] }, + { "emoji": "🇭🇰", "aliases": ["hong_kong"] }, + { "emoji": "🇭🇲", "aliases": ["heard_mcdonald_islands"] }, + { "emoji": "🇭🇳", "aliases": ["honduras"] }, + { "emoji": "🇭🇷", "aliases": ["croatia"] }, + { "emoji": "🇭🇹", "aliases": ["haiti"] }, + { "emoji": "🇭🇺", "aliases": ["hungary"] }, + { "emoji": "🇮🇨", "aliases": ["canary_islands"] }, + { "emoji": "🇮🇩", "aliases": ["indonesia"] }, + { "emoji": "🇮🇪", "aliases": ["ireland"] }, + { "emoji": "🇮🇱", "aliases": ["israel"] }, + { "emoji": "🇮🇲", "aliases": ["isle_of_man"] }, + { "emoji": "🇮🇳", "aliases": ["india"] }, + { "emoji": "🇮🇴", "aliases": ["british_indian_ocean_territory"] }, + { "emoji": "🇮🇶", "aliases": ["iraq"] }, + { "emoji": "🇮🇷", "aliases": ["iran"] }, + { "emoji": "🇮🇸", "aliases": ["iceland"] }, + { "emoji": "🇮🇹", "aliases": ["it"] }, + { "emoji": "🇯🇪", "aliases": ["jersey"] }, + { "emoji": "🇯🇲", "aliases": ["jamaica"] }, + { "emoji": "🇯🇴", "aliases": ["jordan"] }, + { "emoji": "🇯🇵", "aliases": ["jp"] }, + { "emoji": "🇰🇪", "aliases": ["kenya"] }, + { "emoji": "🇰🇬", "aliases": ["kyrgyzstan"] }, + { "emoji": "🇰🇭", "aliases": ["cambodia"] }, + { "emoji": "🇰🇮", "aliases": ["kiribati"] }, + { "emoji": "🇰🇲", "aliases": ["comoros"] }, + { "emoji": "🇰🇳", "aliases": ["st_kitts_nevis"] }, + { "emoji": "🇰🇵", "aliases": ["north_korea"] }, + { "emoji": "🇰🇷", "aliases": ["kr"] }, + { "emoji": "🇰🇼", "aliases": ["kuwait"] }, + { "emoji": "🇰🇾", "aliases": ["cayman_islands"] }, + { "emoji": "🇰🇿", "aliases": ["kazakhstan"] }, + { "emoji": "🇱🇦", "aliases": ["laos"] }, + { "emoji": "🇱🇧", "aliases": ["lebanon"] }, + { "emoji": "🇱🇨", "aliases": ["st_lucia"] }, + { "emoji": "🇱🇮", "aliases": ["liechtenstein"] }, + { "emoji": "🇱🇰", "aliases": ["sri_lanka"] }, + { "emoji": "🇱🇷", "aliases": ["liberia"] }, + { "emoji": "🇱🇸", "aliases": ["lesotho"] }, + { "emoji": "🇱🇹", "aliases": ["lithuania"] }, + { "emoji": "🇱🇺", "aliases": ["luxembourg"] }, + { "emoji": "🇱🇻", "aliases": ["latvia"] }, + { "emoji": "🇱🇾", "aliases": ["libya"] }, + { "emoji": "🇲🇦", "aliases": ["morocco"] }, + { "emoji": "🇲🇨", "aliases": ["monaco"] }, + { "emoji": "🇲🇩", "aliases": ["moldova"] }, + { "emoji": "🇲🇪", "aliases": ["montenegro"] }, + { "emoji": "🇲🇫", "aliases": ["st_martin"] }, + { "emoji": "🇲🇬", "aliases": ["madagascar"] }, + { "emoji": "🇲🇭", "aliases": ["marshall_islands"] }, + { "emoji": "🇲🇰", "aliases": ["macedonia"] }, + { "emoji": "🇲🇱", "aliases": ["mali"] }, + { "emoji": "🇲🇲", "aliases": ["myanmar"] }, + { "emoji": "🇲🇳", "aliases": ["mongolia"] }, + { "emoji": "🇲🇴", "aliases": ["macau"] }, + { "emoji": "🇲🇵", "aliases": ["northern_mariana_islands"] }, + { "emoji": "🇲🇶", "aliases": ["martinique"] }, + { "emoji": "🇲🇷", "aliases": ["mauritania"] }, + { "emoji": "🇲🇸", "aliases": ["montserrat"] }, + { "emoji": "🇲🇹", "aliases": ["malta"] }, + { "emoji": "🇲🇺", "aliases": ["mauritius"] }, + { "emoji": "🇲🇻", "aliases": ["maldives"] }, + { "emoji": "🇲🇼", "aliases": ["malawi"] }, + { "emoji": "🇲🇽", "aliases": ["mexico"] }, + { "emoji": "🇲🇾", "aliases": ["malaysia"] }, + { "emoji": "🇲🇿", "aliases": ["mozambique"] }, + { "emoji": "🇳🇦", "aliases": ["namibia"] }, + { "emoji": "🇳🇨", "aliases": ["new_caledonia"] }, + { "emoji": "🇳🇪", "aliases": ["niger"] }, + { "emoji": "🇳🇫", "aliases": ["norfolk_island"] }, + { "emoji": "🇳🇬", "aliases": ["nigeria"] }, + { "emoji": "🇳🇮", "aliases": ["nicaragua"] }, + { "emoji": "🇳🇱", "aliases": ["netherlands"] }, + { "emoji": "🇳🇴", "aliases": ["norway"] }, + { "emoji": "🇳🇵", "aliases": ["nepal"] }, + { "emoji": "🇳🇷", "aliases": ["nauru"] }, + { "emoji": "🇳🇺", "aliases": ["niue"] }, + { "emoji": "🇳🇿", "aliases": ["new_zealand"] }, + { "emoji": "🇴🇲", "aliases": ["oman"] }, + { "emoji": "🇵🇦", "aliases": ["panama"] }, + { "emoji": "🇵🇪", "aliases": ["peru"] }, + { "emoji": "🇵🇫", "aliases": ["french_polynesia"] }, + { "emoji": "🇵🇬", "aliases": ["papua_new_guinea"] }, + { "emoji": "🇵🇭", "aliases": ["philippines"] }, + { "emoji": "🇵🇰", "aliases": ["pakistan"] }, + { "emoji": "🇵🇱", "aliases": ["poland"] }, + { "emoji": "🇵🇲", "aliases": ["st_pierre_miquelon"] }, + { "emoji": "🇵🇳", "aliases": ["pitcairn_islands"] }, + { "emoji": "🇵🇷", "aliases": ["puerto_rico"] }, + { "emoji": "🇵🇸", "aliases": ["palestinian_territories"] }, + { "emoji": "🇵🇹", "aliases": ["portugal"] }, + { "emoji": "🇵🇼", "aliases": ["palau"] }, + { "emoji": "🇵🇾", "aliases": ["paraguay"] }, + { "emoji": "🇶🇦", "aliases": ["qatar"] }, + { "emoji": "🇷🇪", "aliases": ["reunion"] }, + { "emoji": "🇷🇴", "aliases": ["romania"] }, + { "emoji": "🇷🇸", "aliases": ["serbia"] }, + { "emoji": "🇷🇺", "aliases": ["ru"] }, + { "emoji": "🇷🇼", "aliases": ["rwanda"] }, + { "emoji": "🇸🇦", "aliases": ["saudi_arabia"] }, + { "emoji": "🇸🇧", "aliases": ["solomon_islands"] }, + { "emoji": "🇸🇨", "aliases": ["seychelles"] }, + { "emoji": "🇸🇩", "aliases": ["sudan"] }, + { "emoji": "🇸🇪", "aliases": ["sweden"] }, + { "emoji": "🇸🇬", "aliases": ["singapore"] }, + { "emoji": "🇸🇭", "aliases": ["st_helena"] }, + { "emoji": "🇸🇮", "aliases": ["slovenia"] }, + { "emoji": "🇸🇯", "aliases": ["svalbard_jan_mayen"] }, + { "emoji": "🇸🇰", "aliases": ["slovakia"] }, + { "emoji": "🇸🇱", "aliases": ["sierra_leone"] }, + { "emoji": "🇸🇲", "aliases": ["san_marino"] }, + { "emoji": "🇸🇳", "aliases": ["senegal"] }, + { "emoji": "🇸🇴", "aliases": ["somalia"] }, + { "emoji": "🇸🇷", "aliases": ["suriname"] }, + { "emoji": "🇸🇸", "aliases": ["south_sudan"] }, + { "emoji": "🇸🇹", "aliases": ["sao_tome_principe"] }, + { "emoji": "🇸🇻", "aliases": ["el_salvador"] }, + { "emoji": "🇸🇽", "aliases": ["sint_maarten"] }, + { "emoji": "🇸🇾", "aliases": ["syria"] }, + { "emoji": "🇸🇿", "aliases": ["swaziland"] }, + { "emoji": "🇹🇦", "aliases": ["tristan_da_cunha"] }, + { "emoji": "🇹🇨", "aliases": ["turks_caicos_islands"] }, + { "emoji": "🇹🇩", "aliases": ["chad"] }, + { "emoji": "🇹🇫", "aliases": ["french_southern_territories"] }, + { "emoji": "🇹🇬", "aliases": ["togo"] }, + { "emoji": "🇹🇭", "aliases": ["thailand"] }, + { "emoji": "🇹🇯", "aliases": ["tajikistan"] }, + { "emoji": "🇹🇰", "aliases": ["tokelau"] }, + { "emoji": "🇹🇱", "aliases": ["timor_leste"] }, + { "emoji": "🇹🇲", "aliases": ["turkmenistan"] }, + { "emoji": "🇹🇳", "aliases": ["tunisia"] }, + { "emoji": "🇹🇴", "aliases": ["tonga"] }, + { "emoji": "🇹🇷", "aliases": ["tr"] }, + { "emoji": "🇹🇹", "aliases": ["trinidad_tobago"] }, + { "emoji": "🇹🇻", "aliases": ["tuvalu"] }, + { "emoji": "🇹🇼", "aliases": ["taiwan"] }, + { "emoji": "🇹🇿", "aliases": ["tanzania"] }, + { "emoji": "🇺🇦", "aliases": ["ukraine"] }, + { "emoji": "🇺🇬", "aliases": ["uganda"] }, + { "emoji": "🇺🇲", "aliases": ["us_outlying_islands"] }, + { "emoji": "🇺🇳", "aliases": ["united_nations"] }, + { "emoji": "🇺🇸", "aliases": ["us"] }, + { "emoji": "🇺🇾", "aliases": ["uruguay"] }, + { "emoji": "🇺🇿", "aliases": ["uzbekistan"] }, + { "emoji": "🇻🇦", "aliases": ["vatican_city"] }, + { "emoji": "🇻🇨", "aliases": ["st_vincent_grenadines"] }, + { "emoji": "🇻🇪", "aliases": ["venezuela"] }, + { "emoji": "🇻🇬", "aliases": ["british_virgin_islands"] }, + { "emoji": "🇻🇮", "aliases": ["us_virgin_islands"] }, + { "emoji": "🇻🇳", "aliases": ["vietnam"] }, + { "emoji": "🇻🇺", "aliases": ["vanuatu"] }, + { "emoji": "🇼🇫", "aliases": ["wallis_futuna"] }, + { "emoji": "🇼🇸", "aliases": ["samoa"] }, + { "emoji": "🇽🇰", "aliases": ["kosovo"] }, + { "emoji": "🇾🇪", "aliases": ["yemen"] }, + { "emoji": "🇾🇹", "aliases": ["mayotte"] }, + { "emoji": "🇿🇦", "aliases": ["south_africa"] }, + { "emoji": "🇿🇲", "aliases": ["zambia"] }, + { "emoji": "🇿🇼", "aliases": ["zimbabwe"] }, + { "emoji": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "aliases": ["england"] }, + { "emoji": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "aliases": ["scotland"] }, + { "emoji": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", "aliases": ["wales"] } +] diff --git a/server/message_cache.go b/server/message_cache.go index 376c7611..b583e1bf 100644 --- a/server/message_cache.go +++ b/server/message_cache.go @@ -32,7 +32,7 @@ const ( priority INT NOT NULL, tags TEXT NOT NULL, click TEXT NOT NULL, - icon TEXT NOT NULL, + icon TEXT NOT NULL, actions TEXT NOT NULL, attachment_name TEXT NOT NULL, attachment_type TEXT NOT NULL, @@ -56,31 +56,31 @@ const ( selectRowIDFromMessageID = `SELECT id FROM messages WHERE mid = ?` // Do not include topic, see #336 and TestServer_PollSinceID_MultipleTopics selectMessagesSinceTimeQuery = ` SELECT mid, time, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding - FROM messages + FROM messages WHERE topic = ? AND time >= ? AND published = 1 ORDER BY time, id ` selectMessagesSinceTimeIncludeScheduledQuery = ` SELECT mid, time, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding - FROM messages + FROM messages WHERE topic = ? AND time >= ? ORDER BY time, id ` selectMessagesSinceIDQuery = ` SELECT mid, time, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding - FROM messages - WHERE topic = ? AND id > ? AND published = 1 + FROM messages + WHERE topic = ? AND id > ? AND published = 1 ORDER BY time, id ` selectMessagesSinceIDIncludeScheduledQuery = ` SELECT mid, time, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding - FROM messages + FROM messages WHERE topic = ? AND (id > ? OR published = 0) ORDER BY time, id ` selectMessagesDueQuery = ` SELECT mid, time, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, encoding - FROM messages + FROM messages WHERE time <= ? AND published = 0 ORDER BY time, id ` @@ -159,12 +159,12 @@ const ( ); CREATE INDEX IF NOT EXISTS idx_mid ON messages_new (mid); CREATE INDEX IF NOT EXISTS idx_topic ON messages_new (topic); - INSERT + INSERT INTO messages_new ( - mid, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, + mid, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, encoding, published) SELECT - id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, + id, time, topic, message, title, priority, tags, click, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, attachment_owner, encoding, published FROM messages; DROP TABLE messages; @@ -189,7 +189,7 @@ const ( // 8 -> 9 migrate8To9AlterMessagesTableQuery = ` - CREATE INDEX IF NOT EXISTS idx_time ON messages (time); + CREATE INDEX IF NOT EXISTS idx_time ON messages (time); ` ) diff --git a/server/message_cache_test.go b/server/message_cache_test.go index 2dcd7b3e..4b0d7aec 100644 --- a/server/message_cache_test.go +++ b/server/message_cache_test.go @@ -412,7 +412,7 @@ func TestSqliteCache_Migration_From1(t *testing.T) { CREATE TABLE IF NOT EXISTS schemaVersion ( id INT PRIMARY KEY, version INT NOT NULL - ); + ); INSERT INTO schemaVersion (id, version) VALUES (1, 1); `) require.Nil(t, err) @@ -447,8 +447,8 @@ func TestSqliteCache_Migration_From1(t *testing.T) { func TestSqliteCache_StartupQueries_WAL(t *testing.T) { filename := newSqliteTestCacheFile(t) - startupQueries := `pragma journal_mode = WAL; -pragma synchronous = normal; + startupQueries := `pragma journal_mode = WAL; +pragma synchronous = normal; pragma temp_store = memory;` db, err := newSqliteCache(filename, startupQueries, 0, 0, false) require.Nil(t, err) diff --git a/server/server_firebase.go b/server/server_firebase.go index ab9d7fad..d2e49a33 100644 --- a/server/server_firebase.go +++ b/server/server_firebase.go @@ -4,14 +4,15 @@ import ( "context" "encoding/json" "errors" + "fmt" + "strings" + firebase "firebase.google.com/go/v4" "firebase.google.com/go/v4/messaging" - "fmt" "google.golang.org/api/option" "heckel.io/ntfy/auth" "heckel.io/ntfy/log" "heckel.io/ntfy/util" - "strings" ) const ( diff --git a/server/server_matrix.go b/server/server_matrix.go index 5c985f04..f143c1af 100644 --- a/server/server_matrix.go +++ b/server/server_matrix.go @@ -4,11 +4,12 @@ import ( "bytes" "encoding/json" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" "io" "net/http" "strings" + + "heckel.io/ntfy/log" + "heckel.io/ntfy/util" ) // Matrix Push Gateway / UnifiedPush / ntfy integration: diff --git a/server/server_test.go b/server/server_test.go index e328cb1b..af74ffe7 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -172,7 +172,7 @@ func TestServer_StaticSites(t *testing.T) { rr = request(t, s, "GET", "/static/css/home.css", "", nil) require.Equal(t, 200, rr.Code) - require.Contains(t, rr.Body.String(), `html, body {`) + require.Contains(t, rr.Body.String(), "html,\nbody {") rr = request(t, s, "GET", "/docs", "", nil) require.Equal(t, 301, rr.Code) diff --git a/server/smtp_sender.go b/server/smtp_sender.go index 7d6b7519..644a6c97 100644 --- a/server/smtp_sender.go +++ b/server/smtp_sender.go @@ -4,14 +4,15 @@ import ( _ "embed" // required by go:embed "encoding/json" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" "mime" "net" "net/smtp" "strings" "sync" "time" + + "heckel.io/ntfy/log" + "heckel.io/ntfy/util" ) type mailer interface { diff --git a/server/smtp_sender_test.go b/server/smtp_sender_test.go index 363881a2..ad35848a 100644 --- a/server/smtp_sender_test.go +++ b/server/smtp_sender_test.go @@ -1,8 +1,9 @@ package server import ( - "github.com/stretchr/testify/require" "testing" + + "github.com/stretchr/testify/require" ) func TestFormatMail_Basic(t *testing.T) { diff --git a/server/smtp_server.go b/server/smtp_server.go index 3f4b9b68..694efca3 100644 --- a/server/smtp_server.go +++ b/server/smtp_server.go @@ -4,8 +4,6 @@ import ( "bytes" "errors" "fmt" - "github.com/emersion/go-smtp" - "heckel.io/ntfy/log" "io" "mime" "mime/multipart" @@ -15,6 +13,9 @@ import ( "net/mail" "strings" "sync" + + "github.com/emersion/go-smtp" + "heckel.io/ntfy/log" ) var ( diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index c0de7079..a1992f22 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -1,12 +1,13 @@ package server import ( - "github.com/emersion/go-smtp" - "github.com/stretchr/testify/require" "net" "net/http" "strings" "testing" + + "github.com/emersion/go-smtp" + "github.com/stretchr/testify/require" ) func TestSmtpBackend_Multipart(t *testing.T) { diff --git a/server/topic.go b/server/topic.go index 3bc74736..68cc0d8f 100644 --- a/server/topic.go +++ b/server/topic.go @@ -1,9 +1,10 @@ package server import ( - "heckel.io/ntfy/log" "math/rand" "sync" + + "heckel.io/ntfy/log" ) // topic represents a channel to which subscribers can subscribe, and publishers diff --git a/server/util.go b/server/util.go index 269a9d59..0089e70f 100644 --- a/server/util.go +++ b/server/util.go @@ -2,11 +2,12 @@ package server import ( "fmt" - "github.com/emersion/go-smtp" - "heckel.io/ntfy/util" "net/http" "strings" "unicode/utf8" + + "github.com/emersion/go-smtp" + "heckel.io/ntfy/util" ) func readBoolParam(r *http.Request, defaultValue bool, names ...string) bool { diff --git a/server/util_test.go b/server/util_test.go index 3d062b4d..f027132a 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -3,11 +3,12 @@ package server import ( "bytes" "fmt" - "github.com/stretchr/testify/require" "math/rand" "net/http" "strings" "testing" + + "github.com/stretchr/testify/require" ) func TestReadBoolParam(t *testing.T) { diff --git a/test/server.go b/test/server.go index 0b9200a6..2a7faa8b 100644 --- a/test/server.go +++ b/test/server.go @@ -2,12 +2,13 @@ package test import ( "fmt" - "heckel.io/ntfy/server" "math/rand" "net/http" "path/filepath" "testing" "time" + + "heckel.io/ntfy/server" ) func init() { diff --git a/tools/fbsend/main.go b/tools/fbsend/main.go index 832aeb79..abe8b0e4 100644 --- a/tools/fbsend/main.go +++ b/tools/fbsend/main.go @@ -2,13 +2,14 @@ package main import ( "context" - firebase "firebase.google.com/go/v4" - "firebase.google.com/go/v4/messaging" "flag" "fmt" - "google.golang.org/api/option" "os" "strings" + + firebase "firebase.google.com/go/v4" + "firebase.google.com/go/v4/messaging" + "google.golang.org/api/option" ) func main() { diff --git a/util/batching_queue_test.go b/util/batching_queue_test.go index b3c41a4c..4919f924 100644 --- a/util/batching_queue_test.go +++ b/util/batching_queue_test.go @@ -1,12 +1,13 @@ package util_test import ( - "github.com/stretchr/testify/require" - "heckel.io/ntfy/util" "math/rand" "sync" "testing" "time" + + "github.com/stretchr/testify/require" + "heckel.io/ntfy/util" ) func TestBatchingQueue_InfTimeout(t *testing.T) { diff --git a/util/content_type_writer_test.go b/util/content_type_writer_test.go index e30e821b..3d47effa 100644 --- a/util/content_type_writer_test.go +++ b/util/content_type_writer_test.go @@ -2,9 +2,10 @@ package util import ( "crypto/rand" - "github.com/stretchr/testify/require" "net/http/httptest" "testing" + + "github.com/stretchr/testify/require" ) func TestSniffWriter_WriteHTML(t *testing.T) { diff --git a/util/embedfs_test.go b/util/embedfs_test.go index 35e5d57a..314c40d2 100644 --- a/util/embedfs_test.go +++ b/util/embedfs_test.go @@ -2,11 +2,12 @@ package util import ( "embed" - "github.com/stretchr/testify/require" "net/http" "net/http/httptest" "testing" "time" + + "github.com/stretchr/testify/require" ) var ( diff --git a/util/gzip_handler_test.go b/util/gzip_handler_test.go index 21b2358b..29ed8f91 100644 --- a/util/gzip_handler_test.go +++ b/util/gzip_handler_test.go @@ -2,11 +2,12 @@ package util import ( "compress/gzip" - "github.com/stretchr/testify/require" "io" "net/http" "net/http/httptest" "testing" + + "github.com/stretchr/testify/require" ) func TestGzipHandler(t *testing.T) { diff --git a/util/limit.go b/util/limit.go index 8df768ad..2b6f2a5d 100644 --- a/util/limit.go +++ b/util/limit.go @@ -2,10 +2,11 @@ package util import ( "errors" - "golang.org/x/time/rate" "io" "sync" "time" + + "golang.org/x/time/rate" ) // ErrLimitReached is the error returned by the Limiter and LimitWriter when the predefined limit has been reached diff --git a/util/limit_test.go b/util/limit_test.go index 53e10b78..0625326e 100644 --- a/util/limit_test.go +++ b/util/limit_test.go @@ -2,9 +2,10 @@ package util import ( "bytes" - "github.com/stretchr/testify/require" "testing" "time" + + "github.com/stretchr/testify/require" ) func TestFixedLimiter_Add(t *testing.T) { diff --git a/util/peek_test.go b/util/peek_test.go index e076394c..c0f29c50 100644 --- a/util/peek_test.go +++ b/util/peek_test.go @@ -1,10 +1,11 @@ package util import ( - "github.com/stretchr/testify/require" "io" "strings" "testing" + + "github.com/stretchr/testify/require" ) func TestPeak_LimitReached(t *testing.T) { diff --git a/util/time.go b/util/time.go index 70501210..935cbffc 100644 --- a/util/time.go +++ b/util/time.go @@ -2,11 +2,12 @@ package util import ( "errors" - "github.com/olebedev/when" "regexp" "strconv" "strings" "time" + + "github.com/olebedev/when" ) var ( diff --git a/util/time_test.go b/util/time_test.go index 9cab5046..ec801dac 100644 --- a/util/time_test.go +++ b/util/time_test.go @@ -1,9 +1,10 @@ package util import ( - "github.com/stretchr/testify/require" "testing" "time" + + "github.com/stretchr/testify/require" ) var ( diff --git a/web/public/config.js b/web/public/config.js index cd5fbf05..c24fe765 100644 --- a/web/public/config.js +++ b/web/public/config.js @@ -4,6 +4,6 @@ // The actual config is dynamically generated server-side. var config = { - appRoot: "/", - disallowedTopics: ["docs", "static", "file", "app", "settings"] + appRoot: "/", + disallowedTopics: ["docs", "static", "file", "app", "settings"], }; diff --git a/web/public/home.html b/web/public/home.html index 43007ca3..cadbc2e2 100644 --- a/web/public/home.html +++ b/web/public/home.html @@ -1,182 +1,266 @@ - + - - + + ntfy.sh | Send push notifications to your phone via PUT/POST - + - - - + + + - - - + + + - + - - + + - - - - - +
+

Send push notifications to your phone or desktop via PUT/POST

+

+ ntfy (pronounce: notify) is a simple HTTP-based + pub-sub + notification service. It allows you to send notifications to your phone + or desktop via scripts from any computer, entirely + without signup, cost or setup. It's also + open source if you + want to run your own. +

+
+ + - - - + + + -
+
-

Publishing messages

-

- Publishing messages can be done via PUT or POST. Topics are created on the fly by subscribing or publishing to them. - Because there is no sign-up, the topic is essentially a password, so pick something that's not easily guessable. -

-

- Here's an example showing how to publish a message using a POST request (via curl -d): -

- - curl -d "Backup successful 😀" ntfy.sh/mytopic - -

- There are more features related to publishing messages: You can set a - notification priority, a title, - and tag messages. - Here's an example using some of them together: -

- - curl \
-   -H "Title: Unauthorized access detected" \
-   -H "Priority: urgent" \
-   -H "Tags: warning,skull" \
-   -d "Remote access to $(hostname) detected. Act right away." \
+

Publishing messages

+

+ Publishing messages can be done via PUT or + POST. Topics are created on the fly by subscribing or publishing to + them. Because there is no sign-up, + the topic is essentially a password, so pick something that's not + easily guessable. +

+

+ Here's an example showing how to publish a message using a POST request + (via curl -d): +

+ + curl -d "Backup successful 😀" + ntfy.sh/mytopic + +

+ There are more features related to + publishing messages: You can set a + notification priority, a + title, and + tag messages. Here's an example + using some of them together: +

+ + curl \
+   -H "Title: Unauthorized access detected" \
+   -H "Priority: urgent" \
+   -H "Tags: warning,skull" \
+   -d "Remote access to $(hostname) detected. Act right away." + \
  ntfy.sh/mytopic -
-

- Here's what that looks like in the Android app: -

-
- + +

+ Here's what that looks like in the + Android app: +

+
+
Urgent notification with pop-over
-
+
-

Subscribe to a topic

-

- You can create and subscribe to a topic either using your phone, - in this web UI, or in your own app by subscribing via the API. -

+

Subscribe to a topic

+

+ You can create and subscribe to a topic either + using your phone, in + this web UI, or in your own app by + subscribing via the API. +

-

Subscribe from your phone

-

- Simply get the app and start publishing messages. To learn more about the app, - check out the documentation. -

-

- - - -

-

- Here's a video showing the app in action: -

-
- -
Sending push notifications to your Android phone
-
+

Subscribe from your phone

+

+ Simply get the app and start + publishing messages. To learn more about the + app, check out the documentation. +

+

+ + + +

+

Here's a video showing the app in action:

+
+ +
+ Sending push notifications to your Android phone +
+
-

Subscribe via web app

-

- Subscribe to topics in the web app and receive messages as desktop notification. - It is available at ntfy.sh/app. -

-
- -
ntfy web app, available at ntfy.sh/app
-
+

Subscribe via web app

+

+ Subscribe to topics in the web app and receive + messages as desktop notification. It is available at + ntfy.sh/app. +

+
+ +
+ ntfy web app, available at + ntfy.sh/app +
+
-

Subscribe using the API

-

- There's a super simple API that you can use to integrate your own app. You can consume - a JSON stream, - an SSE/EventSource stream, - a plain text stream, - or via WebSockets. -

-

- Here's an example for JSON. The connection stays open, so you can retrieve messages as they come in: -

- - $ curl -s ntfy.sh/mytopic/json
- {"id":"SLiKI64DOt","time":1635528757,"event":"open","topic":"mytopic"}
- {"id":"hwQ2YpKdmg","time":1635528741,"event":"message","topic":"mytopic","message":"Hi!"}
- {"id":"DGUDShMCsc","time":1635528787,"event":"keepalive","topic":"mytopic"}
+

Subscribe using the API

+

+ There's a super simple API that you can use to integrate your own app. + You can consume a + JSON stream, + an + SSE/EventSource stream, a + plain text stream, or via WebSockets. +

+

+ Here's an example for JSON. The connection stays open, so you can + retrieve messages as they come in: +

+ + $ curl -s ntfy.sh/mytopic/json
+ {"id":"SLiKI64DOt","time":1635528757,"event":"open","topic":"mytopic"}
+ {"id":"hwQ2YpKdmg","time":1635528741,"event":"message","topic":"mytopic","message":"Hi!"}
+ {"id":"DGUDShMCsc","time":1635528787,"event":"keepalive","topic":"mytopic"}
... -
-

- Here's a short video demonstrating it in action: -

-
- -
Subscribing to the JSON stream with curl
-
+
+

Here's a short video demonstrating it in action:

+
+ +
+ Subscribing to the JSON stream with curl +
+
-

Check out the docs!

-

- ntfy has so many more features and you can learn about all of them in the documentation - (I tried my very best to make it the best docs ever 😉, not sure if I succeeded, hehe). -

-
- +

Check out the docs!

+

+ ntfy has so many more features and you can learn about all of them + in the documentation + (I tried my very best to make it the best docs ever 😉, not sure if I + succeeded, hehe). +

+
+
Check out the documentation
-
+
-

100% open source & forever free

-

- I love free software, and I'm doing this because it's fun. I have no bad intentions, and I will - never monetize or sell your information. This service will always stay - free and open. - You can read more in the FAQs and in the privacy policy. -

+

+ 100% open source & forever free +

+

+ I love free software, and I'm doing this because it's fun. I have no bad + intentions, and I will never monetize or sell your information. This + service will always stay + free and open. You + can read more in the FAQs and in the + privacy policy. +

-
Made with ❤️ by Philipp C. Heckel
- - - - +
+ Made with ❤️ by Philipp C. Heckel +
+ + + + diff --git a/web/public/index.html b/web/public/index.html index 2c9751f3..78428b7a 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -1,43 +1,59 @@ - + - - - ntfy web + + + ntfy web - - - - + + + + - - - - + + + + - - + + - - - - - - - - + + + + + + + + - - + + - - - - - -
- - + + + + + +
+ + diff --git a/web/public/static/css/fonts.css b/web/public/static/css/fonts.css index d14bad03..365c16c5 100644 --- a/web/public/static/css/fonts.css +++ b/web/public/static/css/fonts.css @@ -2,40 +2,40 @@ /* roboto-300 - latin */ @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local(''), - url('../fonts/roboto-v29-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/roboto-v29-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-family: "Roboto"; + font-style: normal; + font-weight: 300; + src: local(""), url("../fonts/roboto-v29-latin-300.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ + url("../fonts/roboto-v29-latin-300.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-regular - latin */ @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local(''), - url('../fonts/roboto-v29-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/roboto-v29-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-family: "Roboto"; + font-style: normal; + font-weight: 400; + src: local(""), url("../fonts/roboto-v29-latin-regular.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ + url("../fonts/roboto-v29-latin-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-500 - latin */ @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local(''), - url('../fonts/roboto-v29-latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/roboto-v29-latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-family: "Roboto"; + font-style: normal; + font-weight: 500; + src: local(""), url("../fonts/roboto-v29-latin-500.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ + url("../fonts/roboto-v29-latin-500.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-700 - latin */ @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local(''), - url('../fonts/roboto-v29-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/roboto-v29-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + font-family: "Roboto"; + font-style: normal; + font-weight: 700; + src: local(""), url("../fonts/roboto-v29-latin-700.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ + url("../fonts/roboto-v29-latin-700.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } diff --git a/web/public/static/css/home.css b/web/public/static/css/home.css index feeaa7ee..47f8ee26 100644 --- a/web/public/static/css/home.css +++ b/web/public/static/css/home.css @@ -1,280 +1,283 @@ /* general styling */ -html, body { - font-family: 'Roboto', sans-serif; - font-weight: 400; - font-size: 1.1em; - color: #444; - margin: 0; - padding: 0; +html, +body { + font-family: "Roboto", sans-serif; + font-weight: 400; + font-size: 1.1em; + color: #444; + margin: 0; + padding: 0; } html { - /* prevent scrollbar from repositioning website: + /* prevent scrollbar from repositioning website: * https://www.w3docs.com/snippets/css/how-to-prevent-scrollbar-from-repositioning-web-page.html */ - overflow-y: scroll; + overflow-y: scroll; } -a, a:visited { - color: #338574; +a, +a:visited { + color: #338574; } a:hover { - text-decoration: none; - color: #317f6f; + text-decoration: none; + color: #317f6f; } h1 { - margin-top: 35px; - margin-bottom: 30px; - font-size: 2.5em; - word-wrap: break-word; /* For very long topics */ - padding-right: 40px; /* For the X on the detail page */ - font-weight: 300; - color: #666; + margin-top: 35px; + margin-bottom: 30px; + font-size: 2.5em; + word-wrap: break-word; /* For very long topics */ + padding-right: 40px; /* For the X on the detail page */ + font-weight: 300; + color: #666; } h2 { - margin-top: 30px; - margin-bottom: 5px; - font-size: 1.8em; - font-weight: 300; - color: #333; + margin-top: 30px; + margin-bottom: 5px; + font-size: 1.8em; + font-weight: 300; + color: #333; } h3 { - margin-top: 25px; - margin-bottom: 5px; - font-size: 1.3em; - font-weight: 300; - color: #333; + margin-top: 25px; + margin-bottom: 5px; + font-size: 1.3em; + font-weight: 300; + color: #333; } p { - margin-top: 10px; - margin-bottom: 20px; - line-height: 160%; - font-weight: 400; + margin-top: 10px; + margin-bottom: 20px; + line-height: 160%; + font-weight: 400; } p.smallMarginBottom { - margin-bottom: 10px; + margin-bottom: 10px; } b { - font-weight: 500; + font-weight: 500; } tt { - background: #eee; - padding: 2px 7px; - border-radius: 3px; + background: #eee; + padding: 2px 7px; + border-radius: 3px; } code { - display: block; - background: #eee; - font-family: monospace; - padding: 20px; - border-radius: 3px; - margin-top: 10px; - margin-bottom: 20px; - overflow-x: auto; - white-space: nowrap; + display: block; + background: #eee; + font-family: monospace; + padding: 20px; + border-radius: 3px; + margin-top: 10px; + margin-bottom: 20px; + overflow-x: auto; + white-space: nowrap; } /* Main page */ #main { - max-width: 900px; - margin: 0 auto 50px auto; - padding: 0 10px; + max-width: 900px; + margin: 0 auto 50px auto; + padding: 0 10px; } #error { - color: darkred; - font-style: italic; + color: darkred; + font-style: italic; } #ironicCenterTagDontFreakOut { - color: #666; + color: #666; } /* Anchors */ .anchor .anchorLink { - color: #ccc; - text-decoration: none; - padding: 0 5px; - visibility: hidden; + color: #ccc; + text-decoration: none; + padding: 0 5px; + visibility: hidden; } .anchor:hover .anchorLink { - visibility: visible; + visibility: visible; } .anchor .anchorLink:hover { - color: #338574; - visibility: visible; + color: #338574; + visibility: visible; } /* Figures */ figure { - text-align: center; + text-align: center; } -figure img, figure video { - filter: drop-shadow(3px 3px 3px #ccc); - border-radius: 7px; - max-width: 100%; +figure img, +figure video { + filter: drop-shadow(3px 3px 3px #ccc); + border-radius: 7px; + max-width: 100%; } figure video { - width: 100%; - max-height: 450px; + width: 100%; + max-height: 450px; } figcaption { - text-align: center; - font-style: italic; - padding-top: 10px; + text-align: center; + font-style: italic; + padding-top: 10px; } /* Screenshots */ #screenshots { - text-align: center; + text-align: center; } #screenshots img { - height: 190px; - margin: 3px; - border-radius: 5px; - filter: drop-shadow(2px 2px 2px #ddd); + height: 190px; + margin: 3px; + border-radius: 5px; + filter: drop-shadow(2px 2px 2px #ddd); } #screenshots .nowrap { - white-space: nowrap; + white-space: nowrap; } /* Lightbox; thanks to https://yossiabramov.com/blog/vanilla-js-lightbox */ .lightbox { - opacity: 0; - visibility: hidden; - position: fixed; - left:0; - right: 0; - top: 0; - bottom: 0; - z-index: -1; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.15s ease-in; + opacity: 0; + visibility: hidden; + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: -1; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.15s ease-in; } .lightbox.show { - background-color: rgba(0,0,0, 0.75); - opacity: 1; - visibility: visible; - z-index: 1000; + background-color: rgba(0, 0, 0, 0.75); + opacity: 1; + visibility: visible; + z-index: 1000; } .lightbox img { - max-width: 90%; - max-height: 90%; - filter: drop-shadow(5px 5px 10px #222); - border-radius: 5px; + max-width: 90%; + max-height: 90%; + filter: drop-shadow(5px 5px 10px #222); + border-radius: 5px; } .lightbox .close-lightbox { - cursor: pointer; - position: absolute; - top: 30px; - right: 30px; - width: 20px; - height: 20px; + cursor: pointer; + position: absolute; + top: 30px; + right: 30px; + width: 20px; + height: 20px; } .lightbox .close-lightbox::after, .lightbox .close-lightbox::before { - content: ''; - width: 3px; - height: 20px; - background-color: #ddd; - position: absolute; - border-radius: 5px; - transform: rotate(45deg); + content: ""; + width: 3px; + height: 20px; + background-color: #ddd; + position: absolute; + border-radius: 5px; + transform: rotate(45deg); } .lightbox .close-lightbox::before { - transform: rotate(-45deg); + transform: rotate(-45deg); } .lightbox .close-lightbox:hover::after, .lightbox .close-lightbox:hover::before { - background-color: #fff; + background-color: #fff; } /* Header */ #header { - background: #338574; - height: 130px; + background: #338574; + height: 130px; } #header #headerBox { - max-width: 900px; - margin: 0 auto; - padding: 0 10px; + max-width: 900px; + margin: 0 auto; + padding: 0 10px; } #header #logo { - margin-top: 23px; - float: left; + margin-top: 23px; + float: left; } #header #name { - float: left; - color: white; - font-size: 2.6em; - font-weight: 300; - margin: 35px 0 0 20px; + float: left; + color: white; + font-size: 2.6em; + font-weight: 300; + margin: 35px 0 0 20px; } #header ol { - list-style-type: none; - float: right; - margin-top: 80px; + list-style-type: none; + float: right; + margin-top: 80px; } #header ol li { - display: inline-block; - margin: 0 10px; - font-weight: 400; + display: inline-block; + margin: 0 10px; + font-weight: 400; } -#header ol li a, nav ol li a:visited { - color: white; - text-decoration: none; +#header ol li a, +nav ol li a:visited { + color: white; + text-decoration: none; } #header ol li a:hover { - text-decoration: underline; + text-decoration: underline; } li { - padding: 4px 0; - margin: 4px 0; - font-size: 0.9em; + padding: 4px 0; + margin: 4px 0; + font-size: 0.9em; } - /* Hide top menu SMALL SCREEN */ @media only screen and (max-width: 780px) { - #header ol { - display: none; - } + #header ol { + display: none; + } } diff --git a/web/public/static/js/home.js b/web/public/static/js/home.js index 80b14055..a4bdd248 100644 --- a/web/public/static/js/home.js +++ b/web/public/static/js/home.js @@ -1,84 +1,88 @@ - /* All the things */ let currentUrl = window.location.hostname; if (window.location.port) { - currentUrl += ':' + window.location.port + currentUrl += ":" + window.location.port; } /* Screenshots */ const lightbox = document.getElementById("lightbox"); const showScreenshotOverlay = (e, el, index) => { - lightbox.classList.add('show'); - document.addEventListener('keydown', nextScreenshotKeyboardListener); - return showScreenshot(e, index); + lightbox.classList.add("show"); + document.addEventListener("keydown", nextScreenshotKeyboardListener); + return showScreenshot(e, index); }; const showScreenshot = (e, index) => { - const actualIndex = resolveScreenshotIndex(index); - lightbox.innerHTML = '
' + screenshots[actualIndex].innerHTML; - lightbox.querySelector('img').onclick = (e) => { return showScreenshot(e,actualIndex+1); }; - currentScreenshotIndex = actualIndex; - e.stopPropagation(); - return false; + const actualIndex = resolveScreenshotIndex(index); + lightbox.innerHTML = + '
' + screenshots[actualIndex].innerHTML; + lightbox.querySelector("img").onclick = (e) => { + return showScreenshot(e, actualIndex + 1); + }; + currentScreenshotIndex = actualIndex; + e.stopPropagation(); + return false; }; const nextScreenshot = (e) => { - return showScreenshot(e, currentScreenshotIndex+1); + return showScreenshot(e, currentScreenshotIndex + 1); }; const previousScreenshot = (e) => { - return showScreenshot(e, currentScreenshotIndex-1); + return showScreenshot(e, currentScreenshotIndex - 1); }; const resolveScreenshotIndex = (index) => { - if (index < 0) { - return screenshots.length - 1; - } else if (index > screenshots.length - 1) { - return 0; - } - return index; + if (index < 0) { + return screenshots.length - 1; + } else if (index > screenshots.length - 1) { + return 0; + } + return index; }; const hideScreenshotOverlay = (e) => { - lightbox.classList.remove('show'); - document.removeEventListener('keydown', nextScreenshotKeyboardListener); + lightbox.classList.remove("show"); + document.removeEventListener("keydown", nextScreenshotKeyboardListener); }; const nextScreenshotKeyboardListener = (e) => { - switch (e.keyCode) { - case 37: - previousScreenshot(e); - break; - case 39: - nextScreenshot(e); - break; - } + switch (e.keyCode) { + case 37: + previousScreenshot(e); + break; + case 39: + nextScreenshot(e); + break; + } }; let currentScreenshotIndex = 0; const screenshots = [...document.querySelectorAll("#screenshots a")]; screenshots.forEach((el, index) => { - el.onclick = (e) => { return showScreenshotOverlay(e, el, index); }; + el.onclick = (e) => { + return showScreenshotOverlay(e, el, index); + }; }); lightbox.onclick = hideScreenshotOverlay; // Add anchor links -document.querySelectorAll('.anchor').forEach((el) => { - if (el.hasAttribute('id')) { - const id = el.getAttribute('id'); - const anchor = document.createElement('a'); - anchor.innerHTML = `#`; - el.appendChild(anchor); - } +document.querySelectorAll(".anchor").forEach((el) => { + if (el.hasAttribute("id")) { + const id = el.getAttribute("id"); + const anchor = document.createElement("a"); + anchor.innerHTML = `#`; + el.appendChild(anchor); + } }); // Change ntfy.sh url and protocol to match self-hosted one -document.querySelectorAll('.ntfyUrl').forEach((el) => { - el.innerHTML = currentUrl; +document.querySelectorAll(".ntfyUrl").forEach((el) => { + el.innerHTML = currentUrl; }); -document.querySelectorAll('.ntfyProtocol').forEach((el) => { - el.innerHTML = window.location.protocol + "//"; +document.querySelectorAll(".ntfyProtocol").forEach((el) => { + el.innerHTML = window.location.protocol + "//"; }); diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index 0c0017dc..dcae77ce 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -1,191 +1,191 @@ { - "action_bar_clear_notifications": "Премахване на известия", - "alert_grant_description": "Разрешете на мрежовия четец да показва известия.", - "notifications_attachment_copy_url_title": "Копиране на адреса на прикачения файл", - "notifications_example": "Пример", - "notifications_no_subscriptions_title": "Липсват абонаменти", - "nav_topics_title": "Абонаменти", - "action_bar_send_test_notification": "Пробно известие", - "action_bar_unsubscribe": "Отписване", - "nav_button_all_notifications": "Всички известия", - "action_bar_settings": "Настройки", - "publish_dialog_title_topic": "Публикуване в темата {{topic}}", - "publish_dialog_title_no_topic": "Изпращане", - "publish_dialog_progress_uploading": "Изпращане…", - "publish_dialog_progress_uploading_detail": "Изпращане {{loaded}}/{{total}} ({{percent}}%)…", - "publish_dialog_message_published": "Известието е публикувано", - "publish_dialog_attachment_limits_file_and_quota_reached": "надвишава ограничението от {{fileSizeLimit}} за размер на файл и квотата, остават {{remainingBytes}}", - "publish_dialog_message_label": "Съобщение", - "publish_dialog_message_placeholder": "Въведете съобщение", - "publish_dialog_other_features": "Други възможности:", - "publish_dialog_chip_click_label": "Адрес", - "publish_dialog_chip_email_label": "Препращане към ел. поща", - "publish_dialog_chip_attach_url_label": "Прикачване на файл от адрес", - "publish_dialog_chip_attach_file_label": "Прикачване местен файл", - "publish_dialog_chip_delay_label": "Забавяне на изпращането", - "publish_dialog_chip_topic_label": "Промяна на темата", - "publish_dialog_button_cancel_sending": "Отменяне на изпращането", - "publish_dialog_button_cancel": "Отказ", - "subscribe_dialog_error_user_anonymous": "анонимен", - "prefs_notifications_title": "Известия", - "prefs_notifications_sound_title": "Звук при получаване", - "prefs_notifications_sound_no_sound": "Без звук", - "prefs_notifications_min_priority_title": "Най-нисък приоритет", - "prefs_notifications_min_priority_any": "Всички", - "prefs_notifications_min_priority_low_and_higher": "Нисък приоритет и по-висок", - "prefs_notifications_min_priority_default_and_higher": "Подразбиран приоритет и по-висок", - "prefs_notifications_min_priority_high_and_higher": "Висок приоритет и по-висок", - "prefs_notifications_min_priority_max_only": "Само най-висок приоритет", - "prefs_notifications_delete_after_never": "Никога", - "prefs_users_add_button": "Добавяне", - "prefs_users_dialog_password_label": "Парола", - "alert_not_supported_description": "Мрежовият четец не поддържа известия.", - "message_bar_type_message": "Въведете съобщение", - "message_bar_error_publishing": "Грешка при изпращане на известието", - "notifications_copied_to_clipboard": "Копирано в междинната памет", - "notifications_attachment_link_expired": "препратката за изтегляне е с изтекла давност", - "nav_button_settings": "Настройки", - "nav_button_documentation": "Ръководство", - "nav_button_subscribe": "Абониране за тема", - "alert_grant_title": "Известията са изключени", - "alert_grant_button": "Разрешаване", - "notifications_tags": "Етикети", - "nav_button_publish_message": "Изпращане", - "alert_not_supported_title": "Не се поддържат известия", - "notifications_attachment_open_title": "Към {{url}}", - "notifications_attachment_copy_url_button": "Копиране на адреса", - "notifications_attachment_open_button": "Отваряне на прикачения файл", - "notifications_attachment_link_expires": "препратката изтича на {{date}}", - "notifications_actions_open_url_title": "Към {{url}}", - "notifications_click_copy_url_button": "Копиране на препратка", - "notifications_click_open_button": "Отваряне", - "notifications_click_copy_url_title": "Копиране на препратката в междинната памет", - "notifications_none_for_topic_title": "Липсват известия в темата", - "notifications_none_for_any_title": "Липсват известия", - "notifications_none_for_topic_description": "За да изпратите известия в тази тема направете заявка чрез методите PUT или POST към адреса й.", - "notifications_none_for_any_description": "За да изпратите известия в тема направете заявка чрез методите PUT или POST към адреса ѝ. Ето пример с една от вашите теми.", - "notifications_no_subscriptions_description": "Щракнете върху „{{linktext}}“, за да създадете тема или да се абонирате. След това като направите заявка чрез методите PUT или POST ще ги получите тук.", - "notifications_more_details": "За допълнителна информация посетете страницата или документацията.", - "publish_dialog_priority_min": "Най-нисък приоритет", - "publish_dialog_attachment_limits_file_reached": "надвишава ограничението от {{fileSizeLimit}} за размер на файл", - "publish_dialog_base_url_label": "Адрес на услугата", - "publish_dialog_base_url_placeholder": "Адрес на услугата, напр. https://example.com", - "publish_dialog_topic_placeholder": "Име на темата, напр. phils_alerts", - "publish_dialog_priority_low": "Нисък приоритет", - "publish_dialog_attachment_limits_quota_reached": "надвишава квотата, остават {{remainingBytes}}", - "publish_dialog_priority_high": "Висок приоритет", - "publish_dialog_priority_default": "Подразбиран приоритет", - "publish_dialog_title_placeholder": "Заглавие на известието, напр. Предупреждение за диска", - "publish_dialog_tags_label": "Етикети", - "publish_dialog_email_label": "Адрес на електронна поща", - "publish_dialog_priority_max": "Най-висок приоритет", - "publish_dialog_tags_placeholder": "Разделени със запетая етикети, напр. warning, srv1-backup", - "publish_dialog_click_label": "Адрес", - "publish_dialog_topic_label": "Име на темата", - "publish_dialog_title_label": "Заглавие", - "publish_dialog_priority_label": "Приоритет", - "publish_dialog_click_placeholder": "Адрес, който се отваря при щракване върху известието", - "publish_dialog_email_placeholder": "Поща, на която да се препрати известието, напр. phil@example.com", - "publish_dialog_attach_label": "Адрес на прикачения файл", - "publish_dialog_filename_placeholder": "Име на прикачения файл", - "publish_dialog_attach_placeholder": "Прикачете файл от адрес, напр. https://f-droid.org/F-Droid.apk", - "prefs_notifications_delete_after_three_hours": "След три часа", - "publish_dialog_filename_label": "Име на файла", - "publish_dialog_delay_label": "Забавяне", - "publish_dialog_details_examples_description": "За примери и подробно описание на всички възможности при изпращане, вижте документацията.", - "publish_dialog_button_send": "Изпращане", - "publish_dialog_checkbox_publish_another": "Изпращане на повече", - "publish_dialog_attached_file_title": "Прикачен файл:", - "publish_dialog_attached_file_filename_placeholder": "Име на прикачения файл", - "publish_dialog_drop_file_here": "Пуснете файла тук", - "subscribe_dialog_subscribe_description": "Възможно е темите да не са защитени с парола, затова изберете име, което е трудно за отгатване. След като се абонирате, можете да изпращате известия чрез методите PUT или POST.", - "emoji_picker_search_placeholder": "Търсете емоция", - "subscribe_dialog_subscribe_title": "Абониране за тема", - "subscribe_dialog_subscribe_topic_placeholder": "Име на темата, напр. phils_alerts", - "subscribe_dialog_subscribe_use_another_label": "Използване на друг сървър", - "subscribe_dialog_login_username_label": "Потребител, напр. phil", - "subscribe_dialog_login_button_back": "Назад", - "subscribe_dialog_subscribe_button_cancel": "Отказ", - "subscribe_dialog_login_description": "Темата е защитена. За да се абонирате въведете потребител и парола.", - "subscribe_dialog_subscribe_button_subscribe": "Абониране", - "subscribe_dialog_login_title": "Изисква се вход", - "prefs_notifications_delete_after_title": "Автоматично премахване", - "prefs_notifications_delete_after_one_day": "След един ден", - "prefs_users_table_user_header": "Потребител", - "prefs_users_dialog_title_edit": "Промяна на потребител", - "prefs_users_dialog_base_url_label": "Адрес на услугата, e.g. https://ntfy.sh", - "prefs_users_dialog_button_cancel": "Отказ", - "prefs_users_dialog_button_save": "Запазване", - "prefs_appearance_language_title": "Език", - "subscribe_dialog_login_password_label": "Парола", - "subscribe_dialog_login_button_login": "Вход", - "subscribe_dialog_error_user_not_authorized": "Потребителят {{username}} няма достъп", - "prefs_appearance_title": "Външен вид", - "publish_dialog_delay_placeholder": "Забавяне на изпращането, {{unixTimestamp}}, {{relativeTime}} или „{{naturalLanguage}}“ (на английски)", - "prefs_notifications_delete_after_one_week": "След една седмица", - "prefs_users_title": "Управление на потребители", - "prefs_users_table_base_url_header": "Адрес на услугата", - "prefs_users_dialog_title_add": "Добавяне на потребител", - "prefs_notifications_delete_after_one_month": "След един месец", - "prefs_users_dialog_username_label": "Потребител, напр. phil", - "prefs_users_dialog_button_add": "Добавяне", - "error_boundary_title": "О, не, ntfy се срина", - "error_boundary_description": "Това очевидно не трябва да се случва. Много съжаляваме!
Ако имате минута, докладвайте в GitHub или ни уведомете в Discord или Matrix.", - "error_boundary_stack_trace": "Следа от стека", - "error_boundary_gathering_info": "Събиране на допълнителна информация…", - "notifications_loading": "Зареждане на известия…", - "error_boundary_button_copy_stack_trace": "Копиране на следата от стека", - "prefs_users_description": "Добавяйте и премахвайте потребители за защитените теми. Имайте предвид, че потребителското име и паролата се съхраняват в местната памет на мрежовия четец.", - "prefs_notifications_sound_description_none": "Известията не са съпроводени със звук", - "prefs_notifications_sound_description_some": "При пристигане известията са съпроводени от звука „{{sound}}“", - "prefs_notifications_delete_after_never_description": "Известията никога не се премахват автоматично", - "prefs_notifications_delete_after_three_hours_description": "Известията се премахват автоматично след три часа", - "priority_min": "най-нисък", - "priority_low": "нисък", - "priority_high": "висок", - "priority_max": "най-висок", - "priority_default": "подразбиран", - "prefs_notifications_delete_after_one_week_description": "Известията се премахват автоматично след една седмица", - "prefs_notifications_delete_after_one_day_description": "Известията се премахват автоматично след един ден", - "prefs_notifications_min_priority_description_max": "Показват се известията с приоритет 5 (най-висок)", - "prefs_notifications_delete_after_one_month_description": "Известията се премахват автоматично след един месец", - "prefs_notifications_min_priority_description_any": "Показват се всички известия, независимо от приоритета", - "prefs_notifications_min_priority_description_x_or_higher": "Показват се известията с приоритет {{number}} ({{name}}) или по-висок", - "notifications_actions_http_request_title": "Изпращане на HTTP {{method}} до {{url}}", - "notifications_actions_not_supported": "Действието не се поддържа от приложението за интернет", - "action_bar_show_menu": "Показване на менюто", - "action_bar_logo_alt": "Логотип на ntfy", - "action_bar_toggle_mute": "Заглушаване или пускне на известията", - "action_bar_toggle_action_menu": "Отваряне или затваряне на менюто с действията", - "nav_button_muted": "Известията са заглушени", - "notifications_list": "Списък с известия", - "notifications_list_item": "Известие", - "notifications_delete": "Премахване", - "notifications_mark_read": "Отбелязване като прочетено", - "nav_button_connecting": "свързване", - "message_bar_show_dialog": "Показване на диалога за публикуване", - "message_bar_publish": "Публикуване на съобщение", - "notifications_priority_x": "Приоритет {{priority}}", - "notifications_new_indicator": "Ново известие", - "notifications_attachment_image": "Прикачено изображение", - "notifications_attachment_file_image": "файл на изображение", - "notifications_attachment_file_video": "видео", - "notifications_attachment_file_audio": "аудио", - "notifications_attachment_file_app": "инсталационен файл на приложение за Android", - "notifications_attachment_file_document": "друг документ", - "publish_dialog_emoji_picker_show": "Избор на емоция", - "publish_dialog_topic_reset": "Нулиране на тема", - "publish_dialog_click_reset": "Премахване на адрес", - "publish_dialog_email_reset": "Премахване на препращането към ел. поща", - "publish_dialog_delay_reset": "Премахва забавянето на изпращането", - "publish_dialog_attached_file_remove": "Премахване на прикачения файл", - "emoji_picker_search_clear": "Изчистване на търсенето", - "subscribe_dialog_subscribe_base_url_label": "Адрес на услугата", - "prefs_notifications_sound_play": "Възпроизвеждане на избрания звук", - "publish_dialog_attach_reset": "Премахване на адреса на файла за прикачане", - "prefs_users_delete_button": "Премахване", - "prefs_users_table": "Таблица с потребители", - "prefs_users_edit_button": "Промяна на потребител", - "error_boundary_unsupported_indexeddb_title": "Поверително разглеждане не се поддържа", - "error_boundary_unsupported_indexeddb_description": "За да работи интернет-приложението ntfy се нуждае от IndexedDB, а мрежовият четец не поддържа IndexedDB в режим на поверително разглеждане.

Въпреки това, няма смисъл да използвате интернет-приложението ntfy в режим на поверително разглеждане, тъй като всичко се пази в хранилището на четеца. Можете да прочетете повече по проблема в GitHub или да се свържете с нас в Discord или Matrix." + "action_bar_clear_notifications": "Премахване на известия", + "alert_grant_description": "Разрешете на мрежовия четец да показва известия.", + "notifications_attachment_copy_url_title": "Копиране на адреса на прикачения файл", + "notifications_example": "Пример", + "notifications_no_subscriptions_title": "Липсват абонаменти", + "nav_topics_title": "Абонаменти", + "action_bar_send_test_notification": "Пробно известие", + "action_bar_unsubscribe": "Отписване", + "nav_button_all_notifications": "Всички известия", + "action_bar_settings": "Настройки", + "publish_dialog_title_topic": "Публикуване в темата {{topic}}", + "publish_dialog_title_no_topic": "Изпращане", + "publish_dialog_progress_uploading": "Изпращане…", + "publish_dialog_progress_uploading_detail": "Изпращане {{loaded}}/{{total}} ({{percent}}%)…", + "publish_dialog_message_published": "Известието е публикувано", + "publish_dialog_attachment_limits_file_and_quota_reached": "надвишава ограничението от {{fileSizeLimit}} за размер на файл и квотата, остават {{remainingBytes}}", + "publish_dialog_message_label": "Съобщение", + "publish_dialog_message_placeholder": "Въведете съобщение", + "publish_dialog_other_features": "Други възможности:", + "publish_dialog_chip_click_label": "Адрес", + "publish_dialog_chip_email_label": "Препращане към ел. поща", + "publish_dialog_chip_attach_url_label": "Прикачване на файл от адрес", + "publish_dialog_chip_attach_file_label": "Прикачване местен файл", + "publish_dialog_chip_delay_label": "Забавяне на изпращането", + "publish_dialog_chip_topic_label": "Промяна на темата", + "publish_dialog_button_cancel_sending": "Отменяне на изпращането", + "publish_dialog_button_cancel": "Отказ", + "subscribe_dialog_error_user_anonymous": "анонимен", + "prefs_notifications_title": "Известия", + "prefs_notifications_sound_title": "Звук при получаване", + "prefs_notifications_sound_no_sound": "Без звук", + "prefs_notifications_min_priority_title": "Най-нисък приоритет", + "prefs_notifications_min_priority_any": "Всички", + "prefs_notifications_min_priority_low_and_higher": "Нисък приоритет и по-висок", + "prefs_notifications_min_priority_default_and_higher": "Подразбиран приоритет и по-висок", + "prefs_notifications_min_priority_high_and_higher": "Висок приоритет и по-висок", + "prefs_notifications_min_priority_max_only": "Само най-висок приоритет", + "prefs_notifications_delete_after_never": "Никога", + "prefs_users_add_button": "Добавяне", + "prefs_users_dialog_password_label": "Парола", + "alert_not_supported_description": "Мрежовият четец не поддържа известия.", + "message_bar_type_message": "Въведете съобщение", + "message_bar_error_publishing": "Грешка при изпращане на известието", + "notifications_copied_to_clipboard": "Копирано в междинната памет", + "notifications_attachment_link_expired": "препратката за изтегляне е с изтекла давност", + "nav_button_settings": "Настройки", + "nav_button_documentation": "Ръководство", + "nav_button_subscribe": "Абониране за тема", + "alert_grant_title": "Известията са изключени", + "alert_grant_button": "Разрешаване", + "notifications_tags": "Етикети", + "nav_button_publish_message": "Изпращане", + "alert_not_supported_title": "Не се поддържат известия", + "notifications_attachment_open_title": "Към {{url}}", + "notifications_attachment_copy_url_button": "Копиране на адреса", + "notifications_attachment_open_button": "Отваряне на прикачения файл", + "notifications_attachment_link_expires": "препратката изтича на {{date}}", + "notifications_actions_open_url_title": "Към {{url}}", + "notifications_click_copy_url_button": "Копиране на препратка", + "notifications_click_open_button": "Отваряне", + "notifications_click_copy_url_title": "Копиране на препратката в междинната памет", + "notifications_none_for_topic_title": "Липсват известия в темата", + "notifications_none_for_any_title": "Липсват известия", + "notifications_none_for_topic_description": "За да изпратите известия в тази тема направете заявка чрез методите PUT или POST към адреса й.", + "notifications_none_for_any_description": "За да изпратите известия в тема направете заявка чрез методите PUT или POST към адреса ѝ. Ето пример с една от вашите теми.", + "notifications_no_subscriptions_description": "Щракнете върху „{{linktext}}“, за да създадете тема или да се абонирате. След това като направите заявка чрез методите PUT или POST ще ги получите тук.", + "notifications_more_details": "За допълнителна информация посетете страницата или документацията.", + "publish_dialog_priority_min": "Най-нисък приоритет", + "publish_dialog_attachment_limits_file_reached": "надвишава ограничението от {{fileSizeLimit}} за размер на файл", + "publish_dialog_base_url_label": "Адрес на услугата", + "publish_dialog_base_url_placeholder": "Адрес на услугата, напр. https://example.com", + "publish_dialog_topic_placeholder": "Име на темата, напр. phils_alerts", + "publish_dialog_priority_low": "Нисък приоритет", + "publish_dialog_attachment_limits_quota_reached": "надвишава квотата, остават {{remainingBytes}}", + "publish_dialog_priority_high": "Висок приоритет", + "publish_dialog_priority_default": "Подразбиран приоритет", + "publish_dialog_title_placeholder": "Заглавие на известието, напр. Предупреждение за диска", + "publish_dialog_tags_label": "Етикети", + "publish_dialog_email_label": "Адрес на електронна поща", + "publish_dialog_priority_max": "Най-висок приоритет", + "publish_dialog_tags_placeholder": "Разделени със запетая етикети, напр. warning, srv1-backup", + "publish_dialog_click_label": "Адрес", + "publish_dialog_topic_label": "Име на темата", + "publish_dialog_title_label": "Заглавие", + "publish_dialog_priority_label": "Приоритет", + "publish_dialog_click_placeholder": "Адрес, който се отваря при щракване върху известието", + "publish_dialog_email_placeholder": "Поща, на която да се препрати известието, напр. phil@example.com", + "publish_dialog_attach_label": "Адрес на прикачения файл", + "publish_dialog_filename_placeholder": "Име на прикачения файл", + "publish_dialog_attach_placeholder": "Прикачете файл от адрес, напр. https://f-droid.org/F-Droid.apk", + "prefs_notifications_delete_after_three_hours": "След три часа", + "publish_dialog_filename_label": "Име на файла", + "publish_dialog_delay_label": "Забавяне", + "publish_dialog_details_examples_description": "За примери и подробно описание на всички възможности при изпращане, вижте документацията.", + "publish_dialog_button_send": "Изпращане", + "publish_dialog_checkbox_publish_another": "Изпращане на повече", + "publish_dialog_attached_file_title": "Прикачен файл:", + "publish_dialog_attached_file_filename_placeholder": "Име на прикачения файл", + "publish_dialog_drop_file_here": "Пуснете файла тук", + "subscribe_dialog_subscribe_description": "Възможно е темите да не са защитени с парола, затова изберете име, което е трудно за отгатване. След като се абонирате, можете да изпращате известия чрез методите PUT или POST.", + "emoji_picker_search_placeholder": "Търсете емоция", + "subscribe_dialog_subscribe_title": "Абониране за тема", + "subscribe_dialog_subscribe_topic_placeholder": "Име на темата, напр. phils_alerts", + "subscribe_dialog_subscribe_use_another_label": "Използване на друг сървър", + "subscribe_dialog_login_username_label": "Потребител, напр. phil", + "subscribe_dialog_login_button_back": "Назад", + "subscribe_dialog_subscribe_button_cancel": "Отказ", + "subscribe_dialog_login_description": "Темата е защитена. За да се абонирате въведете потребител и парола.", + "subscribe_dialog_subscribe_button_subscribe": "Абониране", + "subscribe_dialog_login_title": "Изисква се вход", + "prefs_notifications_delete_after_title": "Автоматично премахване", + "prefs_notifications_delete_after_one_day": "След един ден", + "prefs_users_table_user_header": "Потребител", + "prefs_users_dialog_title_edit": "Промяна на потребител", + "prefs_users_dialog_base_url_label": "Адрес на услугата, e.g. https://ntfy.sh", + "prefs_users_dialog_button_cancel": "Отказ", + "prefs_users_dialog_button_save": "Запазване", + "prefs_appearance_language_title": "Език", + "subscribe_dialog_login_password_label": "Парола", + "subscribe_dialog_login_button_login": "Вход", + "subscribe_dialog_error_user_not_authorized": "Потребителят {{username}} няма достъп", + "prefs_appearance_title": "Външен вид", + "publish_dialog_delay_placeholder": "Забавяне на изпращането, {{unixTimestamp}}, {{relativeTime}} или „{{naturalLanguage}}“ (на английски)", + "prefs_notifications_delete_after_one_week": "След една седмица", + "prefs_users_title": "Управление на потребители", + "prefs_users_table_base_url_header": "Адрес на услугата", + "prefs_users_dialog_title_add": "Добавяне на потребител", + "prefs_notifications_delete_after_one_month": "След един месец", + "prefs_users_dialog_username_label": "Потребител, напр. phil", + "prefs_users_dialog_button_add": "Добавяне", + "error_boundary_title": "О, не, ntfy се срина", + "error_boundary_description": "Това очевидно не трябва да се случва. Много съжаляваме!
Ако имате минута, докладвайте в GitHub или ни уведомете в Discord или Matrix.", + "error_boundary_stack_trace": "Следа от стека", + "error_boundary_gathering_info": "Събиране на допълнителна информация…", + "notifications_loading": "Зареждане на известия…", + "error_boundary_button_copy_stack_trace": "Копиране на следата от стека", + "prefs_users_description": "Добавяйте и премахвайте потребители за защитените теми. Имайте предвид, че потребителското име и паролата се съхраняват в местната памет на мрежовия четец.", + "prefs_notifications_sound_description_none": "Известията не са съпроводени със звук", + "prefs_notifications_sound_description_some": "При пристигане известията са съпроводени от звука „{{sound}}“", + "prefs_notifications_delete_after_never_description": "Известията никога не се премахват автоматично", + "prefs_notifications_delete_after_three_hours_description": "Известията се премахват автоматично след три часа", + "priority_min": "най-нисък", + "priority_low": "нисък", + "priority_high": "висок", + "priority_max": "най-висок", + "priority_default": "подразбиран", + "prefs_notifications_delete_after_one_week_description": "Известията се премахват автоматично след една седмица", + "prefs_notifications_delete_after_one_day_description": "Известията се премахват автоматично след един ден", + "prefs_notifications_min_priority_description_max": "Показват се известията с приоритет 5 (най-висок)", + "prefs_notifications_delete_after_one_month_description": "Известията се премахват автоматично след един месец", + "prefs_notifications_min_priority_description_any": "Показват се всички известия, независимо от приоритета", + "prefs_notifications_min_priority_description_x_or_higher": "Показват се известията с приоритет {{number}} ({{name}}) или по-висок", + "notifications_actions_http_request_title": "Изпращане на HTTP {{method}} до {{url}}", + "notifications_actions_not_supported": "Действието не се поддържа от приложението за интернет", + "action_bar_show_menu": "Показване на менюто", + "action_bar_logo_alt": "Логотип на ntfy", + "action_bar_toggle_mute": "Заглушаване или пускне на известията", + "action_bar_toggle_action_menu": "Отваряне или затваряне на менюто с действията", + "nav_button_muted": "Известията са заглушени", + "notifications_list": "Списък с известия", + "notifications_list_item": "Известие", + "notifications_delete": "Премахване", + "notifications_mark_read": "Отбелязване като прочетено", + "nav_button_connecting": "свързване", + "message_bar_show_dialog": "Показване на диалога за публикуване", + "message_bar_publish": "Публикуване на съобщение", + "notifications_priority_x": "Приоритет {{priority}}", + "notifications_new_indicator": "Ново известие", + "notifications_attachment_image": "Прикачено изображение", + "notifications_attachment_file_image": "файл на изображение", + "notifications_attachment_file_video": "видео", + "notifications_attachment_file_audio": "аудио", + "notifications_attachment_file_app": "инсталационен файл на приложение за Android", + "notifications_attachment_file_document": "друг документ", + "publish_dialog_emoji_picker_show": "Избор на емоция", + "publish_dialog_topic_reset": "Нулиране на тема", + "publish_dialog_click_reset": "Премахване на адрес", + "publish_dialog_email_reset": "Премахване на препращането към ел. поща", + "publish_dialog_delay_reset": "Премахва забавянето на изпращането", + "publish_dialog_attached_file_remove": "Премахване на прикачения файл", + "emoji_picker_search_clear": "Изчистване на търсенето", + "subscribe_dialog_subscribe_base_url_label": "Адрес на услугата", + "prefs_notifications_sound_play": "Възпроизвеждане на избрания звук", + "publish_dialog_attach_reset": "Премахване на адреса на файла за прикачане", + "prefs_users_delete_button": "Премахване", + "prefs_users_table": "Таблица с потребители", + "prefs_users_edit_button": "Промяна на потребител", + "error_boundary_unsupported_indexeddb_title": "Поверително разглеждане не се поддържа", + "error_boundary_unsupported_indexeddb_description": "За да работи интернет-приложението ntfy се нуждае от IndexedDB, а мрежовият четец не поддържа IndexedDB в режим на поверително разглеждане.

Въпреки това, няма смисъл да използвате интернет-приложението ntfy в режим на поверително разглеждане, тъй като всичко се пази в хранилището на четеца. Можете да прочетете повече по проблема в GitHub или да се свържете с нас в Discord или Matrix." } diff --git a/web/public/static/langs/cs.json b/web/public/static/langs/cs.json index afdf92a7..d792a94a 100644 --- a/web/public/static/langs/cs.json +++ b/web/public/static/langs/cs.json @@ -1,191 +1,191 @@ { - "action_bar_settings": "Nastavení", - "action_bar_send_test_notification": "Odeslání testovacího oznámení", - "action_bar_clear_notifications": "Vymazat všechna oznámení", - "action_bar_unsubscribe": "Odhlásit odběr", - "message_bar_type_message": "Zde napište zprávu", - "message_bar_error_publishing": "Chyba při odesílání oznámení", - "nav_topics_title": "Odebíraná témata", - "nav_button_all_notifications": "Všechna oznámení", - "nav_button_settings": "Nastavení", - "nav_button_documentation": "Dokumentace", - "nav_button_publish_message": "Odeslat oznámení", - "nav_button_subscribe": "Přihlásit se k odběru tématu", - "alert_grant_title": "Oznámení jsou zakázána", - "alert_grant_description": "Udělte prohlížeči oprávnění k zobrazování oznámení na ploše.", - "alert_grant_button": "Udělit nyní", - "alert_not_supported_title": "Oznámení nejsou podporována", - "alert_not_supported_description": "Oznámení nejsou ve vašem prohlížeči podporována.", - "notifications_copied_to_clipboard": "Zkopírováno do schránky", - "notifications_tags": "Značky", - "notifications_attachment_copy_url_title": "Kopírovat URL přílohy do schránky", - "notifications_attachment_copy_url_button": "Kopírovat URL", - "notifications_attachment_open_title": "Přejít na {{url}}", - "notifications_attachment_open_button": "Otevřít přílohu", - "notifications_attachment_link_expires": "platnost odkazu končí {{date}}", - "notifications_attachment_link_expired": "platnost odkazu ke stažení vypršela", - "notifications_click_copy_url_title": "Kopírovat URL odkazu do schránky", - "notifications_click_copy_url_button": "Kopírovat odkaz", - "notifications_click_open_button": "Otevřít odkaz", - "notifications_none_for_topic_title": "K tomuto tématu jste zatím neobdrželi žádné oznámení.", - "notifications_none_for_topic_description": "Pro odeslání oznámení k tomuto tématu, odešlete PUT nebo POST požadavek na URL tématu.", - "notifications_example": "Příklad", - "publish_dialog_base_url_placeholder": "URL služby, např. https://example.com", - "publish_dialog_topic_label": "Název tématu", - "publish_dialog_topic_placeholder": "Název tématu, např. phil_alerts", - "publish_dialog_priority_default": "Výchozí priorita", - "publish_dialog_priority_high": "Vysoká priorita", - "publish_dialog_priority_max": "Nevyšší priorita", - "publish_dialog_base_url_label": "URL služby", - "prefs_users_dialog_password_label": "Heslo", - "prefs_users_dialog_title_add": "Přidat uživatele", - "prefs_users_dialog_title_edit": "Upravit uživatele", - "prefs_users_dialog_base_url_label": "URL služby, např. https://ntfy.sh", - "prefs_users_dialog_username_label": "Uživatelské jméno, např. phil", - "notifications_actions_open_url_title": "Přejít na {{url}}", - "notifications_none_for_any_title": "Neobdrželi jste žádná oznámení.", - "notifications_none_for_any_description": "Pro odeslání oznámení k tématu stačí na URL tématu odeslat PUT nebo POST požadavek. Zde je příklad s použitím jednoho z vašich témat.", - "notifications_no_subscriptions_description": "Kliknutím na \"{{linktext}}\" vytvoříte téma nebo se k němu přihlásíte. Poté můžete odesílat zprávy prostřednictvím PUT nebo POST požadavků a zde budete dostávat oznámení.", - "notifications_more_details": "Další informace naleznete na webových stránkách nebo v dokumentaci.", - "publish_dialog_title_topic": "Odeslat do {{téma}}", - "publish_dialog_title_no_topic": "Odeslat oznámení", - "publish_dialog_progress_uploading": "Nahrávání …", - "publish_dialog_message_published": "Oznámení odesláno", - "publish_dialog_attachment_limits_file_and_quota_reached": "překračuje {{fileSizeLimit}} limit souboru a kvótu, {{remainingBytes}} zbývá", - "publish_dialog_attachment_limits_quota_reached": "překračuje kvótu, {{remainingBytes}} zbývá", - "publish_dialog_priority_min": "Nejnižší priorita", - "publish_dialog_title_label": "Název", - "publish_dialog_title_placeholder": "Název oznámení, např. Upozornění na volné místo na disku", - "publish_dialog_message_placeholder": "Zde napište zprávu", - "publish_dialog_tags_label": "Značky", - "publish_dialog_priority_label": "Priorita", - "publish_dialog_click_label": "Klikněte na URL", - "publish_dialog_click_placeholder": "Adresa URL, která se otevře po kliknutí na oznámení", - "publish_dialog_email_label": "E-mail", - "publish_dialog_email_placeholder": "Adresa pro odeslání oznámení, např. phil@example.com", - "publish_dialog_attach_label": "URL přílohy", - "publish_dialog_filename_label": "Název souboru", - "publish_dialog_filename_placeholder": "Název souboru přílohy", - "publish_dialog_delay_label": "Zpoždění", - "publish_dialog_delay_placeholder": "Zpožděné doručení, např. {{unixTimestamp}}, {{relativeTime}} nebo \"{{naturalLanguage}}\". (pouze v angličtině)", - "publish_dialog_chip_click_label": "Klikněte na URL", - "publish_dialog_chip_email_label": "Přeposlat na e-mail", - "publish_dialog_chip_delay_label": "Zpožděné doručení", - "publish_dialog_chip_topic_label": "Změnit téma", - "publish_dialog_details_examples_description": "Příklady a podrobný popis všech funkcí odesílání naleznete v dokumentaci.", - "publish_dialog_chip_attach_url_label": "Připojit soubor pomocí URL", - "publish_dialog_chip_attach_file_label": "Připojit místní soubor", - "publish_dialog_button_send": "Odeslat", - "publish_dialog_checkbox_publish_another": "Odeslat další", - "publish_dialog_attached_file_title": "Přiložený soubor:", - "publish_dialog_attached_file_filename_placeholder": "Název souboru přílohy", - "publish_dialog_drop_file_here": "Přetáhněte soubor sem", - "emoji_picker_search_placeholder": "Hledat emodži", - "subscribe_dialog_subscribe_title": "Přihlásit odběr tématu", - "subscribe_dialog_subscribe_description": "Témata nemusí být chráněna heslem, proto zvolte název, který není snadné uhodnout. Jakmile se přihlásíte k odběru, můžete odesílat oznámení pomocí PUT/POST požadavků.", - "subscribe_dialog_subscribe_topic_placeholder": "Název tématu, např. phil_alerts", - "subscribe_dialog_subscribe_use_another_label": "Použít jiný server", - "subscribe_dialog_login_title": "Vyžadováno přihlášení", - "subscribe_dialog_login_description": "Toto téma je chráněno heslem. Pro přihlášení k odběru zadejte prosím uživatelské jméno a heslo.", - "subscribe_dialog_subscribe_button_cancel": "Zrušit", - "subscribe_dialog_subscribe_button_subscribe": "Přihlásit odběr", - "subscribe_dialog_login_username_label": "Uživatelské jméno, např. phil", - "subscribe_dialog_login_password_label": "Heslo", - "subscribe_dialog_login_button_back": "Zpět", - "subscribe_dialog_login_button_login": "Přihlásit se", - "subscribe_dialog_error_user_not_authorized": "Uživatel {{username}} není autorizován", - "subscribe_dialog_error_user_anonymous": "anonymně", - "prefs_notifications_title": "Oznámení", - "prefs_notifications_sound_description_some": "Oznámení přehrají při doručení zvuk {{sound}}", - "prefs_notifications_min_priority_description_x_or_higher": "Zobrazit oznámení, pokud je priorita {{number}} ({{name}}) nebo vyšší", - "prefs_notifications_min_priority_description_max": "Zobrazit oznámení, pokud je priorita 5 (nejvyšší)", - "prefs_notifications_min_priority_any": "Jakákoli priorita", - "prefs_notifications_min_priority_low_and_higher": "Nízká priorita a vyšší", - "prefs_notifications_min_priority_default_and_higher": "Výchozí priorita a vyšší", - "prefs_notifications_min_priority_high_and_higher": "Vysoká priorita a vyšší", - "prefs_notifications_delete_after_three_hours": "Po třech hodinách", - "prefs_notifications_delete_after_one_day": "Po jednom dni", - "prefs_notifications_delete_after_one_week": "Po jednom týdnu", - "prefs_notifications_delete_after_one_month": "Po jednom měsíci", - "prefs_notifications_delete_after_never_description": "Oznámení nejsou nikdy automaticky mazána", - "prefs_notifications_delete_after_three_hours_description": "Oznámení se automaticky odstraní po třech hodinách", - "prefs_notifications_delete_after_one_day_description": "Oznámení se automaticky odstraní po jednom dni", - "prefs_notifications_delete_after_one_week_description": "Oznámení se automaticky odstraní po jednom týdnu", - "prefs_notifications_delete_after_one_month_description": "Oznámení se automaticky odstraní po jednom měsíci", - "prefs_users_title": "Správa uživatelů", - "prefs_users_add_button": "Přidat uživatele", - "prefs_users_table_user_header": "Uživatel", - "prefs_users_table_base_url_header": "URL služby", - "prefs_users_dialog_button_cancel": "Zrušit", - "prefs_users_dialog_button_add": "Přidat", - "prefs_users_dialog_button_save": "Uložit", - "priority_min": "nejnižší", - "priority_low": "nízká", - "priority_default": "výchozí", - "priority_high": "vysoká", - "priority_max": "nejvyšší", - "error_boundary_title": "Ale ne, ntfy havaroval", - "error_boundary_description": "K tomu by samozřejmě nemělo docházet. Velmi se za to omlouváme.
Pokud máte chvilku, nahlaste to prosím na GitHubu nebo nám dejte vědět prostřednictvím Discordu nebo Matrixu.", - "error_boundary_button_copy_stack_trace": "Kopírovat výpis zásobníku", - "error_boundary_stack_trace": "Výpis zásobníku", - "publish_dialog_tags_placeholder": "Seznam značek oddělených čárkou, např. warning, srv1-backup", - "notifications_actions_not_supported": "Akce není podporována ve webové aplikaci", - "notifications_actions_http_request_title": "Odeslat HTTP {{metoda}} na {{url}}", - "notifications_no_subscriptions_title": "Vypadá to, že ještě nemáte žádné odběry.", - "prefs_notifications_min_priority_description_any": "Zobrazit všechna oznámení bez ohledu na prioritu", - "publish_dialog_priority_low": "Nízká priorita", - "publish_dialog_message_label": "Zpráva", - "publish_dialog_button_cancel": "Zrušit", - "notifications_loading": "Načítání oznámení …", - "publish_dialog_progress_uploading_detail": "Nahrávání {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_attachment_limits_file_reached": "překračuje {{fileSizeLimit}} limit souboru", - "publish_dialog_attach_placeholder": "Připojit soubor pomocí URL, např. https://f-droid.org/F-Droid.apk", - "publish_dialog_button_cancel_sending": "Zrušit odesílání", - "publish_dialog_other_features": "Další funkce:", - "prefs_notifications_sound_title": "Zvuk oznámení", - "prefs_notifications_min_priority_max_only": "Pouze nejvyšší priorita", - "prefs_notifications_min_priority_title": "Nejnižší priorita", - "prefs_notifications_delete_after_title": "Odstranit oznámení", - "prefs_notifications_delete_after_never": "Nikdy", - "prefs_notifications_sound_no_sound": "Žádný zvuk", - "prefs_notifications_sound_description_none": "Oznámení nepřehrají při doručení žádný zvuk", - "prefs_users_description": "Zde můžete přidávat/odebírat uživatele pro chráněná témata. Upozorňujeme, že uživatelské jméno a heslo jsou uloženy v místním úložišti prohlížeče.", - "error_boundary_gathering_info": "Získejte více informací …", - "prefs_appearance_language_title": "Jazyk", - "prefs_appearance_title": "Vzhled", - "action_bar_show_menu": "Zobrazit nabídku", - "action_bar_logo_alt": "logo ntfy", - "action_bar_toggle_mute": "Ztlumení/zrušení ztlumení oznámení", - "action_bar_toggle_action_menu": "Otevřít/zavřít nabídku akcí", - "message_bar_show_dialog": "Zobrazit okno pro odesílání oznámení", - "message_bar_publish": "Odeslat zprávu", - "nav_button_muted": "Oznámení ztlumena", - "nav_button_connecting": "připojování", - "notifications_list": "Seznam oznámení", - "notifications_list_item": "Oznámení", - "notifications_mark_read": "Označit jako přečtené", - "notifications_delete": "Smazat", - "notifications_new_indicator": "Nové oznámení", - "notifications_attachment_image": "Obrázek přílohy", - "notifications_attachment_file_image": "soubor s obrázkem", - "notifications_attachment_file_video": "video soubor", - "notifications_attachment_file_audio": "zvukový soubor", - "notifications_attachment_file_app": "Soubor s aplikací pro Android", - "publish_dialog_emoji_picker_show": "Vybrat emoji", - "publish_dialog_topic_reset": "Obnovení tématu", - "publish_dialog_click_reset": "Odebrat URL kliknutím", - "publish_dialog_email_reset": "Odebrat přeposlání e-mailu", - "publish_dialog_attach_reset": "Odebrat URL přílohy", - "publish_dialog_attached_file_remove": "Odebrat přiložený soubor", - "emoji_picker_search_clear": "Vyčistit vyhledávání", - "prefs_users_edit_button": "Upravit uživatele", - "prefs_users_delete_button": "Odstranit uživatele", - "error_boundary_unsupported_indexeddb_title": "Soukromé prohlížení není podporováno", - "error_boundary_unsupported_indexeddb_description": "Webová aplikace ntfy potřebuje ke svému fungování databázi IndexedDB a váš prohlížeč v režimu soukromého prohlížení databázi IndexedDB nepodporuje.

To je sice nepříjemné, ale používat webovou aplikaci ntfy v režimu soukromého prohlížení stejně nemá smysl, protože vše je uloženo v úložišti prohlížeče. Více se o tom můžete dočíst v tomto tématu na GitHubu, nebo se na nás obrátit pomocí služeb Discord nebo Matrix.", - "notifications_priority_x": "Priorita {{priority}}", - "subscribe_dialog_subscribe_base_url_label": "URL služby", - "prefs_notifications_sound_play": "Přehrát vybraný zvuk", - "prefs_users_table": "Tabulka uživatelů", - "notifications_attachment_file_document": "jiný dokument", - "publish_dialog_delay_reset": "Odebrat odložené doručení" + "action_bar_settings": "Nastavení", + "action_bar_send_test_notification": "Odeslání testovacího oznámení", + "action_bar_clear_notifications": "Vymazat všechna oznámení", + "action_bar_unsubscribe": "Odhlásit odběr", + "message_bar_type_message": "Zde napište zprávu", + "message_bar_error_publishing": "Chyba při odesílání oznámení", + "nav_topics_title": "Odebíraná témata", + "nav_button_all_notifications": "Všechna oznámení", + "nav_button_settings": "Nastavení", + "nav_button_documentation": "Dokumentace", + "nav_button_publish_message": "Odeslat oznámení", + "nav_button_subscribe": "Přihlásit se k odběru tématu", + "alert_grant_title": "Oznámení jsou zakázána", + "alert_grant_description": "Udělte prohlížeči oprávnění k zobrazování oznámení na ploše.", + "alert_grant_button": "Udělit nyní", + "alert_not_supported_title": "Oznámení nejsou podporována", + "alert_not_supported_description": "Oznámení nejsou ve vašem prohlížeči podporována.", + "notifications_copied_to_clipboard": "Zkopírováno do schránky", + "notifications_tags": "Značky", + "notifications_attachment_copy_url_title": "Kopírovat URL přílohy do schránky", + "notifications_attachment_copy_url_button": "Kopírovat URL", + "notifications_attachment_open_title": "Přejít na {{url}}", + "notifications_attachment_open_button": "Otevřít přílohu", + "notifications_attachment_link_expires": "platnost odkazu končí {{date}}", + "notifications_attachment_link_expired": "platnost odkazu ke stažení vypršela", + "notifications_click_copy_url_title": "Kopírovat URL odkazu do schránky", + "notifications_click_copy_url_button": "Kopírovat odkaz", + "notifications_click_open_button": "Otevřít odkaz", + "notifications_none_for_topic_title": "K tomuto tématu jste zatím neobdrželi žádné oznámení.", + "notifications_none_for_topic_description": "Pro odeslání oznámení k tomuto tématu, odešlete PUT nebo POST požadavek na URL tématu.", + "notifications_example": "Příklad", + "publish_dialog_base_url_placeholder": "URL služby, např. https://example.com", + "publish_dialog_topic_label": "Název tématu", + "publish_dialog_topic_placeholder": "Název tématu, např. phil_alerts", + "publish_dialog_priority_default": "Výchozí priorita", + "publish_dialog_priority_high": "Vysoká priorita", + "publish_dialog_priority_max": "Nevyšší priorita", + "publish_dialog_base_url_label": "URL služby", + "prefs_users_dialog_password_label": "Heslo", + "prefs_users_dialog_title_add": "Přidat uživatele", + "prefs_users_dialog_title_edit": "Upravit uživatele", + "prefs_users_dialog_base_url_label": "URL služby, např. https://ntfy.sh", + "prefs_users_dialog_username_label": "Uživatelské jméno, např. phil", + "notifications_actions_open_url_title": "Přejít na {{url}}", + "notifications_none_for_any_title": "Neobdrželi jste žádná oznámení.", + "notifications_none_for_any_description": "Pro odeslání oznámení k tématu stačí na URL tématu odeslat PUT nebo POST požadavek. Zde je příklad s použitím jednoho z vašich témat.", + "notifications_no_subscriptions_description": "Kliknutím na \"{{linktext}}\" vytvoříte téma nebo se k němu přihlásíte. Poté můžete odesílat zprávy prostřednictvím PUT nebo POST požadavků a zde budete dostávat oznámení.", + "notifications_more_details": "Další informace naleznete na webových stránkách nebo v dokumentaci.", + "publish_dialog_title_topic": "Odeslat do {{téma}}", + "publish_dialog_title_no_topic": "Odeslat oznámení", + "publish_dialog_progress_uploading": "Nahrávání …", + "publish_dialog_message_published": "Oznámení odesláno", + "publish_dialog_attachment_limits_file_and_quota_reached": "překračuje {{fileSizeLimit}} limit souboru a kvótu, {{remainingBytes}} zbývá", + "publish_dialog_attachment_limits_quota_reached": "překračuje kvótu, {{remainingBytes}} zbývá", + "publish_dialog_priority_min": "Nejnižší priorita", + "publish_dialog_title_label": "Název", + "publish_dialog_title_placeholder": "Název oznámení, např. Upozornění na volné místo na disku", + "publish_dialog_message_placeholder": "Zde napište zprávu", + "publish_dialog_tags_label": "Značky", + "publish_dialog_priority_label": "Priorita", + "publish_dialog_click_label": "Klikněte na URL", + "publish_dialog_click_placeholder": "Adresa URL, která se otevře po kliknutí na oznámení", + "publish_dialog_email_label": "E-mail", + "publish_dialog_email_placeholder": "Adresa pro odeslání oznámení, např. phil@example.com", + "publish_dialog_attach_label": "URL přílohy", + "publish_dialog_filename_label": "Název souboru", + "publish_dialog_filename_placeholder": "Název souboru přílohy", + "publish_dialog_delay_label": "Zpoždění", + "publish_dialog_delay_placeholder": "Zpožděné doručení, např. {{unixTimestamp}}, {{relativeTime}} nebo \"{{naturalLanguage}}\". (pouze v angličtině)", + "publish_dialog_chip_click_label": "Klikněte na URL", + "publish_dialog_chip_email_label": "Přeposlat na e-mail", + "publish_dialog_chip_delay_label": "Zpožděné doručení", + "publish_dialog_chip_topic_label": "Změnit téma", + "publish_dialog_details_examples_description": "Příklady a podrobný popis všech funkcí odesílání naleznete v dokumentaci.", + "publish_dialog_chip_attach_url_label": "Připojit soubor pomocí URL", + "publish_dialog_chip_attach_file_label": "Připojit místní soubor", + "publish_dialog_button_send": "Odeslat", + "publish_dialog_checkbox_publish_another": "Odeslat další", + "publish_dialog_attached_file_title": "Přiložený soubor:", + "publish_dialog_attached_file_filename_placeholder": "Název souboru přílohy", + "publish_dialog_drop_file_here": "Přetáhněte soubor sem", + "emoji_picker_search_placeholder": "Hledat emodži", + "subscribe_dialog_subscribe_title": "Přihlásit odběr tématu", + "subscribe_dialog_subscribe_description": "Témata nemusí být chráněna heslem, proto zvolte název, který není snadné uhodnout. Jakmile se přihlásíte k odběru, můžete odesílat oznámení pomocí PUT/POST požadavků.", + "subscribe_dialog_subscribe_topic_placeholder": "Název tématu, např. phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "Použít jiný server", + "subscribe_dialog_login_title": "Vyžadováno přihlášení", + "subscribe_dialog_login_description": "Toto téma je chráněno heslem. Pro přihlášení k odběru zadejte prosím uživatelské jméno a heslo.", + "subscribe_dialog_subscribe_button_cancel": "Zrušit", + "subscribe_dialog_subscribe_button_subscribe": "Přihlásit odběr", + "subscribe_dialog_login_username_label": "Uživatelské jméno, např. phil", + "subscribe_dialog_login_password_label": "Heslo", + "subscribe_dialog_login_button_back": "Zpět", + "subscribe_dialog_login_button_login": "Přihlásit se", + "subscribe_dialog_error_user_not_authorized": "Uživatel {{username}} není autorizován", + "subscribe_dialog_error_user_anonymous": "anonymně", + "prefs_notifications_title": "Oznámení", + "prefs_notifications_sound_description_some": "Oznámení přehrají při doručení zvuk {{sound}}", + "prefs_notifications_min_priority_description_x_or_higher": "Zobrazit oznámení, pokud je priorita {{number}} ({{name}}) nebo vyšší", + "prefs_notifications_min_priority_description_max": "Zobrazit oznámení, pokud je priorita 5 (nejvyšší)", + "prefs_notifications_min_priority_any": "Jakákoli priorita", + "prefs_notifications_min_priority_low_and_higher": "Nízká priorita a vyšší", + "prefs_notifications_min_priority_default_and_higher": "Výchozí priorita a vyšší", + "prefs_notifications_min_priority_high_and_higher": "Vysoká priorita a vyšší", + "prefs_notifications_delete_after_three_hours": "Po třech hodinách", + "prefs_notifications_delete_after_one_day": "Po jednom dni", + "prefs_notifications_delete_after_one_week": "Po jednom týdnu", + "prefs_notifications_delete_after_one_month": "Po jednom měsíci", + "prefs_notifications_delete_after_never_description": "Oznámení nejsou nikdy automaticky mazána", + "prefs_notifications_delete_after_three_hours_description": "Oznámení se automaticky odstraní po třech hodinách", + "prefs_notifications_delete_after_one_day_description": "Oznámení se automaticky odstraní po jednom dni", + "prefs_notifications_delete_after_one_week_description": "Oznámení se automaticky odstraní po jednom týdnu", + "prefs_notifications_delete_after_one_month_description": "Oznámení se automaticky odstraní po jednom měsíci", + "prefs_users_title": "Správa uživatelů", + "prefs_users_add_button": "Přidat uživatele", + "prefs_users_table_user_header": "Uživatel", + "prefs_users_table_base_url_header": "URL služby", + "prefs_users_dialog_button_cancel": "Zrušit", + "prefs_users_dialog_button_add": "Přidat", + "prefs_users_dialog_button_save": "Uložit", + "priority_min": "nejnižší", + "priority_low": "nízká", + "priority_default": "výchozí", + "priority_high": "vysoká", + "priority_max": "nejvyšší", + "error_boundary_title": "Ale ne, ntfy havaroval", + "error_boundary_description": "K tomu by samozřejmě nemělo docházet. Velmi se za to omlouváme.
Pokud máte chvilku, nahlaste to prosím na GitHubu nebo nám dejte vědět prostřednictvím Discordu nebo Matrixu.", + "error_boundary_button_copy_stack_trace": "Kopírovat výpis zásobníku", + "error_boundary_stack_trace": "Výpis zásobníku", + "publish_dialog_tags_placeholder": "Seznam značek oddělených čárkou, např. warning, srv1-backup", + "notifications_actions_not_supported": "Akce není podporována ve webové aplikaci", + "notifications_actions_http_request_title": "Odeslat HTTP {{metoda}} na {{url}}", + "notifications_no_subscriptions_title": "Vypadá to, že ještě nemáte žádné odběry.", + "prefs_notifications_min_priority_description_any": "Zobrazit všechna oznámení bez ohledu na prioritu", + "publish_dialog_priority_low": "Nízká priorita", + "publish_dialog_message_label": "Zpráva", + "publish_dialog_button_cancel": "Zrušit", + "notifications_loading": "Načítání oznámení …", + "publish_dialog_progress_uploading_detail": "Nahrávání {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_attachment_limits_file_reached": "překračuje {{fileSizeLimit}} limit souboru", + "publish_dialog_attach_placeholder": "Připojit soubor pomocí URL, např. https://f-droid.org/F-Droid.apk", + "publish_dialog_button_cancel_sending": "Zrušit odesílání", + "publish_dialog_other_features": "Další funkce:", + "prefs_notifications_sound_title": "Zvuk oznámení", + "prefs_notifications_min_priority_max_only": "Pouze nejvyšší priorita", + "prefs_notifications_min_priority_title": "Nejnižší priorita", + "prefs_notifications_delete_after_title": "Odstranit oznámení", + "prefs_notifications_delete_after_never": "Nikdy", + "prefs_notifications_sound_no_sound": "Žádný zvuk", + "prefs_notifications_sound_description_none": "Oznámení nepřehrají při doručení žádný zvuk", + "prefs_users_description": "Zde můžete přidávat/odebírat uživatele pro chráněná témata. Upozorňujeme, že uživatelské jméno a heslo jsou uloženy v místním úložišti prohlížeče.", + "error_boundary_gathering_info": "Získejte více informací …", + "prefs_appearance_language_title": "Jazyk", + "prefs_appearance_title": "Vzhled", + "action_bar_show_menu": "Zobrazit nabídku", + "action_bar_logo_alt": "logo ntfy", + "action_bar_toggle_mute": "Ztlumení/zrušení ztlumení oznámení", + "action_bar_toggle_action_menu": "Otevřít/zavřít nabídku akcí", + "message_bar_show_dialog": "Zobrazit okno pro odesílání oznámení", + "message_bar_publish": "Odeslat zprávu", + "nav_button_muted": "Oznámení ztlumena", + "nav_button_connecting": "připojování", + "notifications_list": "Seznam oznámení", + "notifications_list_item": "Oznámení", + "notifications_mark_read": "Označit jako přečtené", + "notifications_delete": "Smazat", + "notifications_new_indicator": "Nové oznámení", + "notifications_attachment_image": "Obrázek přílohy", + "notifications_attachment_file_image": "soubor s obrázkem", + "notifications_attachment_file_video": "video soubor", + "notifications_attachment_file_audio": "zvukový soubor", + "notifications_attachment_file_app": "Soubor s aplikací pro Android", + "publish_dialog_emoji_picker_show": "Vybrat emoji", + "publish_dialog_topic_reset": "Obnovení tématu", + "publish_dialog_click_reset": "Odebrat URL kliknutím", + "publish_dialog_email_reset": "Odebrat přeposlání e-mailu", + "publish_dialog_attach_reset": "Odebrat URL přílohy", + "publish_dialog_attached_file_remove": "Odebrat přiložený soubor", + "emoji_picker_search_clear": "Vyčistit vyhledávání", + "prefs_users_edit_button": "Upravit uživatele", + "prefs_users_delete_button": "Odstranit uživatele", + "error_boundary_unsupported_indexeddb_title": "Soukromé prohlížení není podporováno", + "error_boundary_unsupported_indexeddb_description": "Webová aplikace ntfy potřebuje ke svému fungování databázi IndexedDB a váš prohlížeč v režimu soukromého prohlížení databázi IndexedDB nepodporuje.

To je sice nepříjemné, ale používat webovou aplikaci ntfy v režimu soukromého prohlížení stejně nemá smysl, protože vše je uloženo v úložišti prohlížeče. Více se o tom můžete dočíst v tomto tématu na GitHubu, nebo se na nás obrátit pomocí služeb Discord nebo Matrix.", + "notifications_priority_x": "Priorita {{priority}}", + "subscribe_dialog_subscribe_base_url_label": "URL služby", + "prefs_notifications_sound_play": "Přehrát vybraný zvuk", + "prefs_users_table": "Tabulka uživatelů", + "notifications_attachment_file_document": "jiný dokument", + "publish_dialog_delay_reset": "Odebrat odložené doručení" } diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index be3b9a26..aad6f87d 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -1,191 +1,191 @@ { - "nav_topics_title": "Abonnierte Themen", - "nav_button_all_notifications": "Alle Benachrichtigungen", - "nav_button_settings": "Einstellungen", - "nav_button_documentation": "Dokumentation", - "nav_button_publish_message": "Benachrichtigung senden", - "nav_button_subscribe": "Thema abonnieren", - "alert_grant_title": "Benachrichtigungen sind deaktiviert", - "publish_dialog_base_url_label": "Service-URL", - "publish_dialog_details_examples_description": "Beispiele und ausführliche Informationen zu allen Optionen findest Du in der Dokumentation.", - "publish_dialog_attached_file_filename_placeholder": "Dateiname des Anhangs", - "subscribe_dialog_login_description": "Dieses Thema benötigt eine Anmeldung. Bitte gib Benutzernamen und Kennwort ein.", - "prefs_notifications_title": "Benachrichtigungen", - "prefs_notifications_sound_title": "Benachrichtigungston", - "prefs_notifications_min_priority_max_only": "Nur höchste Priorität", - "prefs_notifications_delete_after_never": "Nie", - "prefs_users_dialog_password_label": "Kennwort", - "prefs_users_dialog_button_cancel": "Abbrechen", - "prefs_users_dialog_button_add": "Hinzufügen", - "prefs_users_dialog_button_save": "Speichern", - "prefs_appearance_language_title": "Sprache", - "notifications_none_for_any_description": "Um Benachrichtigungen an ein Thema zu senden, schicke einen PUT/POST-Request an die Themen-URL. Hier ist ein Beispiel mit einem Deiner Themen.", - "publish_dialog_message_placeholder": "Gib hier eine Nachricht ein", - "notifications_attachment_link_expires": "Link läuft ab am/um {{date}}", - "notifications_click_copy_url_title": "Link-URL in Zwischenablage kopieren", - "publish_dialog_priority_low": "Niedrige Priorität", - "publish_dialog_message_label": "Nachricht", - "action_bar_unsubscribe": "Von Thema abmelden", - "notifications_copied_to_clipboard": "In Zwischenablage kopiert", - "notifications_loading": "Benachrichtigungen werden geladen …", - "notifications_attachment_open_title": "Gehe zu {{url}}", - "notifications_none_for_any_title": "Du hast keine Benachrichtigungen empfangen.", - "action_bar_send_test_notification": "Test-Benachrichtigung senden", - "alert_grant_description": "Dem Browser erlauben, Desktop-Benachrichtigungen anzuzeigen.", - "notifications_tags": "Tags", - "message_bar_type_message": "Gib hier eine Nachricht ein", - "message_bar_error_publishing": "Fehler beim Senden der Benachrichtigung", - "alert_not_supported_title": "Benachrichtigungen werden nicht unterstützt", - "alert_not_supported_description": "Benachrichtigungen werden von Deinem Browser nicht unterstützt.", - "action_bar_settings": "Einstellungen", - "action_bar_clear_notifications": "Alle Benachrichtigungen löschen", - "alert_grant_button": "Jetzt erlauben", - "notifications_none_for_topic_title": "Du hast für dieses Thema noch keine Benachrichtigungen empfangen.", - "notifications_click_open_button": "Link öffnen", - "notifications_more_details": "Ausführlichere Informationen findest Du auf der Website und in der Dokumentation.", - "notifications_attachment_copy_url_title": "URL des Anhangs in Zwischenablage kopieren", - "notifications_attachment_copy_url_button": "URL kopieren", - "notifications_attachment_open_button": "Anhang öffnen", - "notifications_attachment_link_expired": "Download-Link ist abgelaufen", - "notifications_click_copy_url_button": "Link kopieren", - "notifications_actions_open_url_title": "Gehe zu {{url}}", - "publish_dialog_other_features": "Andere Optionen:", - "notifications_none_for_topic_description": "Um Benachrichtigungen an dieses Thema zu senden, PUTe/POSTe an die Themen-URL.", - "notifications_no_subscriptions_title": "Anscheinend hast Du noch keine Themen abonniert.", - "notifications_no_subscriptions_description": "Klicke den „{{linktext}}“-Link um ein Thema zu erstellen oder zu abonnieren. Danach kannst Du Nachrichten per PUT oder POST senden und erhältst hier die Benachrichtigungen.", - "notifications_example": "Beispiel", - "publish_dialog_progress_uploading": "Wird hochgeladen …", - "publish_dialog_title_topic": "Senden an {{topic}}", - "publish_dialog_title_no_topic": "Benachrichtigung senden", - "publish_dialog_message_published": "Benachrichtigung gesendet", - "publish_dialog_attachment_limits_file_and_quota_reached": "überschreitet das Dateigrößen-Limit {{fileSizeLimit}} und die Quota, {{remainingBytes}} übrig", - "publish_dialog_progress_uploading_detail": "Hochladen {{loaded}}/{{total}} ({{percent}} %) …", - "publish_dialog_priority_max": "Max. Priorität", - "publish_dialog_topic_placeholder": "Thema, z.B. phil_alerts", - "publish_dialog_attachment_limits_file_reached": "überschreitet das Dateigrößen-Limit {{filesizeLimit}}", - "publish_dialog_topic_label": "Thema", - "publish_dialog_priority_default": "Standard-Priorität", - "publish_dialog_base_url_placeholder": "Service-URL, z.B. https://example.com", - "publish_dialog_attachment_limits_quota_reached": "überschreitet die Quota, {{remainingBytes}} übrig", - "publish_dialog_priority_min": "Min. Priorität", - "publish_dialog_priority_high": "Hohe Priorität", - "publish_dialog_title_label": "Titel", - "publish_dialog_tags_placeholder": "Komma-getrennte Liste von Tags, z.B. Warnung, srv1-Backup", - "publish_dialog_priority_label": "Priorität", - "publish_dialog_filename_label": "Dateiname", - "publish_dialog_title_placeholder": "Benachrichtigungs-Titel, z.B. CPU-Last-Warnung", - "publish_dialog_tags_label": "Tags", - "publish_dialog_click_label": "Klick-URL", - "publish_dialog_click_placeholder": "URL die geöffnet werden soll, wenn die Benachrichtigung angeklickt wird", - "publish_dialog_email_label": "E-Mail", - "publish_dialog_attach_label": "URL des Anhangs", - "publish_dialog_attach_placeholder": "Datei von URL anhängen, z.B. https://f-droid.org/F-Droid.apk", - "publish_dialog_filename_placeholder": "Dateiname des Anhangs", - "publish_dialog_delay_label": "Verzögerung", - "publish_dialog_email_placeholder": "E-Mail-Adresse, an die die Benachrichtigung gesendet werden soll, z.B. phil@example.com", - "publish_dialog_chip_click_label": "Klick-URL", - "publish_dialog_button_cancel_sending": "Senden abbrechen", - "publish_dialog_drop_file_here": "Datei hierher ziehen", - "publish_dialog_chip_email_label": "An E-Mail weiterleiten", - "publish_dialog_button_cancel": "Abbrechen", - "publish_dialog_chip_attach_file_label": "Lokale Datei anhängen", - "prefs_notifications_min_priority_title": "Minimale Priorität", - "prefs_users_add_button": "Benutzer hinzufügen", - "publish_dialog_delay_placeholder": "Auslieferung verzögern, z.B. {{unixTimestamp}}, {{relativeTime}}, oder \"{{naturalLanguage}}\" (nur Englisch)", - "prefs_appearance_title": "Darstellung", - "subscribe_dialog_login_password_label": "Kennwort", - "subscribe_dialog_login_button_back": "Zurück", - "publish_dialog_chip_attach_url_label": "Datei von URL anhängen", - "publish_dialog_chip_delay_label": "Auslieferung verzögern", - "publish_dialog_chip_topic_label": "Thema ändern", - "subscribe_dialog_subscribe_title": "Thema abonnieren", - "subscribe_dialog_login_username_label": "Benutzername, z.B. phil", - "subscribe_dialog_login_button_login": "Anmelden", - "prefs_notifications_sound_no_sound": "Kein Ton", - "prefs_notifications_min_priority_default_and_higher": "Standard-Priorität und höher", - "subscribe_dialog_subscribe_topic_placeholder": "Thema, z.B. phil_alerts", - "publish_dialog_button_send": "Senden", - "publish_dialog_checkbox_publish_another": "Weitere Nachricht senden", - "publish_dialog_attached_file_title": "Dateianhang:", - "emoji_picker_search_placeholder": "Emoji suchen", - "subscribe_dialog_subscribe_description": "Themen sind evtl. nicht kennwort-geschützt, also wähle einen schwer zu erratenden Namen. Nach dem Abonnieren kannst Du Benachrichtigungen per POST/PUT senden.", - "subscribe_dialog_subscribe_use_another_label": "Anderen Server verwenden", - "subscribe_dialog_subscribe_button_cancel": "Abbrechen", - "subscribe_dialog_subscribe_button_subscribe": "Abonnieren", - "subscribe_dialog_login_title": "Anmeldung erforderlich", - "subscribe_dialog_error_user_anonymous": "anonym", - "subscribe_dialog_error_user_not_authorized": "Benutzer {{username}} hat keine Berechtigung", - "prefs_notifications_min_priority_any": "Alle Prioritäten", - "prefs_notifications_min_priority_low_and_higher": "Niedrige Priorität und höher", - "prefs_notifications_min_priority_high_and_higher": "Hohe Priorität und höher", - "prefs_notifications_delete_after_title": "Benachrichtigungen löschen", - "prefs_notifications_delete_after_three_hours": "Nach drei Stunden", - "prefs_users_dialog_title_edit": "Benutzer bearbeiten", - "prefs_notifications_delete_after_one_day": "Nach einem Tag", - "prefs_notifications_delete_after_one_week": "Nach einer Woche", - "prefs_notifications_delete_after_one_month": "Nach einem Monat", - "prefs_users_title": "Benutzer verwalten", - "prefs_users_table_user_header": "Benutzer", - "prefs_users_table_base_url_header": "Service-URL", - "prefs_users_dialog_base_url_label": "Service-URL, z.B. https://ntfy.sh", - "prefs_users_dialog_username_label": "Benutzername, z.B. phil", - "prefs_users_description": "Benutzer für kennwort-geschützte Themen hinzufügen/löschen. Achtung: Benutzername und Kennwort werden im lokalen Browser-Speicher abgelegt.", - "prefs_users_dialog_title_add": "Benutzer hinzufügen", - "error_boundary_title": "Oh nein, ntfy ist abgestürzt", - "error_boundary_description": "Das sollte offensichtlich nicht passieren. Sorry.
Wenn möglich, melde den Fehler auf GitHub oder schreibe uns auf Discord oder Matrix.", - "error_boundary_stack_trace": "Stacktrace", - "error_boundary_gathering_info": "Weitere Informationen sammeln …", - "error_boundary_button_copy_stack_trace": "Stacktrace kopieren", - "prefs_notifications_delete_after_never_description": "Benachrichtigungen werden nie automatisch gelöscht", - "prefs_notifications_delete_after_one_month_description": "Benachrichtigungen werden nach einem Monat automatisch gelöscht", - "prefs_notifications_min_priority_description_any": "Alle Benachrichtigungen (aller Prioritäten) anzeigen", - "prefs_notifications_min_priority_description_max": "Zeige Benachrichtigungen wenn ihre Priorität5 (max) ist", - "priority_low": "niedrig", - "priority_default": "Standard", - "priority_high": "hoch", - "priority_max": "max", - "prefs_notifications_sound_description_none": "Kein Ton beim Empfang einer Benachrichtigung", - "prefs_notifications_sound_description_some": "Sound {{sound}} beim Eintreffen einer Benachrichtigung abspielen", - "prefs_notifications_min_priority_description_x_or_higher": "Zeige Benachrichtigungen wenn ihre Priorität {{number}} ({{name}}) oder höher ist", - "prefs_notifications_delete_after_three_hours_description": "Benachrichtigungen werden nach drei Stunden automatisch gelöscht", - "prefs_notifications_delete_after_one_day_description": "Benachrichtigungen werden nach einem Tag automatisch gelöscht", - "prefs_notifications_delete_after_one_week_description": "Benachrichtigungen werden nach einer Woche automatisch gelöscht", - "priority_min": "min", - "notifications_actions_not_supported": "Diese Aktion wird in der Web-App nicht unterstützt", - "notifications_actions_http_request_title": "Sende HTTP {{method}} an {{url}}", - "action_bar_show_menu": "Menü anzeigen", - "action_bar_toggle_mute": "Stummschaltung der Benachrichtigungen an/aus", - "message_bar_show_dialog": "Dialog zur Veröffentlichung anzeigen", - "message_bar_publish": "Benachrichtigung veröffentlichen", - "nav_button_connecting": "verbinde", - "notifications_list": "Benachrichtigungsliste", - "notifications_mark_read": "Als gelesen markieren", - "notifications_delete": "Löschen", - "notifications_priority_x": "Priorität {{priority}}", - "notifications_attachment_file_image": "Bilddatei", - "notifications_attachment_image": "Bild des Anhangs", - "notifications_attachment_file_video": "Videodatei", - "notifications_attachment_file_audio": "Audiodatei", - "notifications_attachment_file_app": "Android App-Datei", - "notifications_attachment_file_document": "anderes Dokument", - "publish_dialog_attached_file_remove": "Angehängte Datei entfernen", - "emoji_picker_search_clear": "Suche leeren", - "subscribe_dialog_subscribe_base_url_label": "Service URL", - "prefs_notifications_sound_play": "Gewählten Sound abspielen", - "prefs_users_table": "Benutzertabelle", - "prefs_users_edit_button": "Benutzer bearbeiten", - "prefs_users_delete_button": "Benutzer löschen", - "error_boundary_unsupported_indexeddb_title": "Private Browser-Tabs werden nicht unterstützt", - "publish_dialog_delay_reset": "Verzögerte Zustellung entfernen", - "error_boundary_unsupported_indexeddb_description": "Die ntfy Web-App benötigt eine IndexedDB für eine korrekte Funktion, und Dein Browser unterstützt in privaten Tabs keinen IndexedDB.

Das ist zwar ärgerlich, eine Nutzung von ntfy in einem privaten Tab macht aber auch wenig Sinn da alle Daten im Browser gespeichert werden. Weitere Informationen gibt es in diesem GitHub-Issue, oder im Chat bei Discord oder Matrix.", - "action_bar_toggle_action_menu": "Aktionsmenü öffnen/schließen", - "notifications_new_indicator": "Neue Benachrichtigung", - "publish_dialog_email_reset": "Email-Weiterleitung entfernen", - "action_bar_logo_alt": "ntfy Logo", - "nav_button_muted": "Benachrichtigungen stummgeschaltet", - "notifications_list_item": "Benachrichtigung", - "publish_dialog_emoji_picker_show": "Emoji wählen", - "publish_dialog_topic_reset": "Thema zurücksetzen", - "publish_dialog_attach_reset": "angehängte URL entfernen", - "publish_dialog_click_reset": "Klick-URL entfernen" + "nav_topics_title": "Abonnierte Themen", + "nav_button_all_notifications": "Alle Benachrichtigungen", + "nav_button_settings": "Einstellungen", + "nav_button_documentation": "Dokumentation", + "nav_button_publish_message": "Benachrichtigung senden", + "nav_button_subscribe": "Thema abonnieren", + "alert_grant_title": "Benachrichtigungen sind deaktiviert", + "publish_dialog_base_url_label": "Service-URL", + "publish_dialog_details_examples_description": "Beispiele und ausführliche Informationen zu allen Optionen findest Du in der Dokumentation.", + "publish_dialog_attached_file_filename_placeholder": "Dateiname des Anhangs", + "subscribe_dialog_login_description": "Dieses Thema benötigt eine Anmeldung. Bitte gib Benutzernamen und Kennwort ein.", + "prefs_notifications_title": "Benachrichtigungen", + "prefs_notifications_sound_title": "Benachrichtigungston", + "prefs_notifications_min_priority_max_only": "Nur höchste Priorität", + "prefs_notifications_delete_after_never": "Nie", + "prefs_users_dialog_password_label": "Kennwort", + "prefs_users_dialog_button_cancel": "Abbrechen", + "prefs_users_dialog_button_add": "Hinzufügen", + "prefs_users_dialog_button_save": "Speichern", + "prefs_appearance_language_title": "Sprache", + "notifications_none_for_any_description": "Um Benachrichtigungen an ein Thema zu senden, schicke einen PUT/POST-Request an die Themen-URL. Hier ist ein Beispiel mit einem Deiner Themen.", + "publish_dialog_message_placeholder": "Gib hier eine Nachricht ein", + "notifications_attachment_link_expires": "Link läuft ab am/um {{date}}", + "notifications_click_copy_url_title": "Link-URL in Zwischenablage kopieren", + "publish_dialog_priority_low": "Niedrige Priorität", + "publish_dialog_message_label": "Nachricht", + "action_bar_unsubscribe": "Von Thema abmelden", + "notifications_copied_to_clipboard": "In Zwischenablage kopiert", + "notifications_loading": "Benachrichtigungen werden geladen …", + "notifications_attachment_open_title": "Gehe zu {{url}}", + "notifications_none_for_any_title": "Du hast keine Benachrichtigungen empfangen.", + "action_bar_send_test_notification": "Test-Benachrichtigung senden", + "alert_grant_description": "Dem Browser erlauben, Desktop-Benachrichtigungen anzuzeigen.", + "notifications_tags": "Tags", + "message_bar_type_message": "Gib hier eine Nachricht ein", + "message_bar_error_publishing": "Fehler beim Senden der Benachrichtigung", + "alert_not_supported_title": "Benachrichtigungen werden nicht unterstützt", + "alert_not_supported_description": "Benachrichtigungen werden von Deinem Browser nicht unterstützt.", + "action_bar_settings": "Einstellungen", + "action_bar_clear_notifications": "Alle Benachrichtigungen löschen", + "alert_grant_button": "Jetzt erlauben", + "notifications_none_for_topic_title": "Du hast für dieses Thema noch keine Benachrichtigungen empfangen.", + "notifications_click_open_button": "Link öffnen", + "notifications_more_details": "Ausführlichere Informationen findest Du auf der Website und in der Dokumentation.", + "notifications_attachment_copy_url_title": "URL des Anhangs in Zwischenablage kopieren", + "notifications_attachment_copy_url_button": "URL kopieren", + "notifications_attachment_open_button": "Anhang öffnen", + "notifications_attachment_link_expired": "Download-Link ist abgelaufen", + "notifications_click_copy_url_button": "Link kopieren", + "notifications_actions_open_url_title": "Gehe zu {{url}}", + "publish_dialog_other_features": "Andere Optionen:", + "notifications_none_for_topic_description": "Um Benachrichtigungen an dieses Thema zu senden, PUTe/POSTe an die Themen-URL.", + "notifications_no_subscriptions_title": "Anscheinend hast Du noch keine Themen abonniert.", + "notifications_no_subscriptions_description": "Klicke den „{{linktext}}“-Link um ein Thema zu erstellen oder zu abonnieren. Danach kannst Du Nachrichten per PUT oder POST senden und erhältst hier die Benachrichtigungen.", + "notifications_example": "Beispiel", + "publish_dialog_progress_uploading": "Wird hochgeladen …", + "publish_dialog_title_topic": "Senden an {{topic}}", + "publish_dialog_title_no_topic": "Benachrichtigung senden", + "publish_dialog_message_published": "Benachrichtigung gesendet", + "publish_dialog_attachment_limits_file_and_quota_reached": "überschreitet das Dateigrößen-Limit {{fileSizeLimit}} und die Quota, {{remainingBytes}} übrig", + "publish_dialog_progress_uploading_detail": "Hochladen {{loaded}}/{{total}} ({{percent}} %) …", + "publish_dialog_priority_max": "Max. Priorität", + "publish_dialog_topic_placeholder": "Thema, z.B. phil_alerts", + "publish_dialog_attachment_limits_file_reached": "überschreitet das Dateigrößen-Limit {{filesizeLimit}}", + "publish_dialog_topic_label": "Thema", + "publish_dialog_priority_default": "Standard-Priorität", + "publish_dialog_base_url_placeholder": "Service-URL, z.B. https://example.com", + "publish_dialog_attachment_limits_quota_reached": "überschreitet die Quota, {{remainingBytes}} übrig", + "publish_dialog_priority_min": "Min. Priorität", + "publish_dialog_priority_high": "Hohe Priorität", + "publish_dialog_title_label": "Titel", + "publish_dialog_tags_placeholder": "Komma-getrennte Liste von Tags, z.B. Warnung, srv1-Backup", + "publish_dialog_priority_label": "Priorität", + "publish_dialog_filename_label": "Dateiname", + "publish_dialog_title_placeholder": "Benachrichtigungs-Titel, z.B. CPU-Last-Warnung", + "publish_dialog_tags_label": "Tags", + "publish_dialog_click_label": "Klick-URL", + "publish_dialog_click_placeholder": "URL die geöffnet werden soll, wenn die Benachrichtigung angeklickt wird", + "publish_dialog_email_label": "E-Mail", + "publish_dialog_attach_label": "URL des Anhangs", + "publish_dialog_attach_placeholder": "Datei von URL anhängen, z.B. https://f-droid.org/F-Droid.apk", + "publish_dialog_filename_placeholder": "Dateiname des Anhangs", + "publish_dialog_delay_label": "Verzögerung", + "publish_dialog_email_placeholder": "E-Mail-Adresse, an die die Benachrichtigung gesendet werden soll, z.B. phil@example.com", + "publish_dialog_chip_click_label": "Klick-URL", + "publish_dialog_button_cancel_sending": "Senden abbrechen", + "publish_dialog_drop_file_here": "Datei hierher ziehen", + "publish_dialog_chip_email_label": "An E-Mail weiterleiten", + "publish_dialog_button_cancel": "Abbrechen", + "publish_dialog_chip_attach_file_label": "Lokale Datei anhängen", + "prefs_notifications_min_priority_title": "Minimale Priorität", + "prefs_users_add_button": "Benutzer hinzufügen", + "publish_dialog_delay_placeholder": "Auslieferung verzögern, z.B. {{unixTimestamp}}, {{relativeTime}}, oder \"{{naturalLanguage}}\" (nur Englisch)", + "prefs_appearance_title": "Darstellung", + "subscribe_dialog_login_password_label": "Kennwort", + "subscribe_dialog_login_button_back": "Zurück", + "publish_dialog_chip_attach_url_label": "Datei von URL anhängen", + "publish_dialog_chip_delay_label": "Auslieferung verzögern", + "publish_dialog_chip_topic_label": "Thema ändern", + "subscribe_dialog_subscribe_title": "Thema abonnieren", + "subscribe_dialog_login_username_label": "Benutzername, z.B. phil", + "subscribe_dialog_login_button_login": "Anmelden", + "prefs_notifications_sound_no_sound": "Kein Ton", + "prefs_notifications_min_priority_default_and_higher": "Standard-Priorität und höher", + "subscribe_dialog_subscribe_topic_placeholder": "Thema, z.B. phil_alerts", + "publish_dialog_button_send": "Senden", + "publish_dialog_checkbox_publish_another": "Weitere Nachricht senden", + "publish_dialog_attached_file_title": "Dateianhang:", + "emoji_picker_search_placeholder": "Emoji suchen", + "subscribe_dialog_subscribe_description": "Themen sind evtl. nicht kennwort-geschützt, also wähle einen schwer zu erratenden Namen. Nach dem Abonnieren kannst Du Benachrichtigungen per POST/PUT senden.", + "subscribe_dialog_subscribe_use_another_label": "Anderen Server verwenden", + "subscribe_dialog_subscribe_button_cancel": "Abbrechen", + "subscribe_dialog_subscribe_button_subscribe": "Abonnieren", + "subscribe_dialog_login_title": "Anmeldung erforderlich", + "subscribe_dialog_error_user_anonymous": "anonym", + "subscribe_dialog_error_user_not_authorized": "Benutzer {{username}} hat keine Berechtigung", + "prefs_notifications_min_priority_any": "Alle Prioritäten", + "prefs_notifications_min_priority_low_and_higher": "Niedrige Priorität und höher", + "prefs_notifications_min_priority_high_and_higher": "Hohe Priorität und höher", + "prefs_notifications_delete_after_title": "Benachrichtigungen löschen", + "prefs_notifications_delete_after_three_hours": "Nach drei Stunden", + "prefs_users_dialog_title_edit": "Benutzer bearbeiten", + "prefs_notifications_delete_after_one_day": "Nach einem Tag", + "prefs_notifications_delete_after_one_week": "Nach einer Woche", + "prefs_notifications_delete_after_one_month": "Nach einem Monat", + "prefs_users_title": "Benutzer verwalten", + "prefs_users_table_user_header": "Benutzer", + "prefs_users_table_base_url_header": "Service-URL", + "prefs_users_dialog_base_url_label": "Service-URL, z.B. https://ntfy.sh", + "prefs_users_dialog_username_label": "Benutzername, z.B. phil", + "prefs_users_description": "Benutzer für kennwort-geschützte Themen hinzufügen/löschen. Achtung: Benutzername und Kennwort werden im lokalen Browser-Speicher abgelegt.", + "prefs_users_dialog_title_add": "Benutzer hinzufügen", + "error_boundary_title": "Oh nein, ntfy ist abgestürzt", + "error_boundary_description": "Das sollte offensichtlich nicht passieren. Sorry.
Wenn möglich, melde den Fehler auf GitHub oder schreibe uns auf Discord oder Matrix.", + "error_boundary_stack_trace": "Stacktrace", + "error_boundary_gathering_info": "Weitere Informationen sammeln …", + "error_boundary_button_copy_stack_trace": "Stacktrace kopieren", + "prefs_notifications_delete_after_never_description": "Benachrichtigungen werden nie automatisch gelöscht", + "prefs_notifications_delete_after_one_month_description": "Benachrichtigungen werden nach einem Monat automatisch gelöscht", + "prefs_notifications_min_priority_description_any": "Alle Benachrichtigungen (aller Prioritäten) anzeigen", + "prefs_notifications_min_priority_description_max": "Zeige Benachrichtigungen wenn ihre Priorität5 (max) ist", + "priority_low": "niedrig", + "priority_default": "Standard", + "priority_high": "hoch", + "priority_max": "max", + "prefs_notifications_sound_description_none": "Kein Ton beim Empfang einer Benachrichtigung", + "prefs_notifications_sound_description_some": "Sound {{sound}} beim Eintreffen einer Benachrichtigung abspielen", + "prefs_notifications_min_priority_description_x_or_higher": "Zeige Benachrichtigungen wenn ihre Priorität {{number}} ({{name}}) oder höher ist", + "prefs_notifications_delete_after_three_hours_description": "Benachrichtigungen werden nach drei Stunden automatisch gelöscht", + "prefs_notifications_delete_after_one_day_description": "Benachrichtigungen werden nach einem Tag automatisch gelöscht", + "prefs_notifications_delete_after_one_week_description": "Benachrichtigungen werden nach einer Woche automatisch gelöscht", + "priority_min": "min", + "notifications_actions_not_supported": "Diese Aktion wird in der Web-App nicht unterstützt", + "notifications_actions_http_request_title": "Sende HTTP {{method}} an {{url}}", + "action_bar_show_menu": "Menü anzeigen", + "action_bar_toggle_mute": "Stummschaltung der Benachrichtigungen an/aus", + "message_bar_show_dialog": "Dialog zur Veröffentlichung anzeigen", + "message_bar_publish": "Benachrichtigung veröffentlichen", + "nav_button_connecting": "verbinde", + "notifications_list": "Benachrichtigungsliste", + "notifications_mark_read": "Als gelesen markieren", + "notifications_delete": "Löschen", + "notifications_priority_x": "Priorität {{priority}}", + "notifications_attachment_file_image": "Bilddatei", + "notifications_attachment_image": "Bild des Anhangs", + "notifications_attachment_file_video": "Videodatei", + "notifications_attachment_file_audio": "Audiodatei", + "notifications_attachment_file_app": "Android App-Datei", + "notifications_attachment_file_document": "anderes Dokument", + "publish_dialog_attached_file_remove": "Angehängte Datei entfernen", + "emoji_picker_search_clear": "Suche leeren", + "subscribe_dialog_subscribe_base_url_label": "Service URL", + "prefs_notifications_sound_play": "Gewählten Sound abspielen", + "prefs_users_table": "Benutzertabelle", + "prefs_users_edit_button": "Benutzer bearbeiten", + "prefs_users_delete_button": "Benutzer löschen", + "error_boundary_unsupported_indexeddb_title": "Private Browser-Tabs werden nicht unterstützt", + "publish_dialog_delay_reset": "Verzögerte Zustellung entfernen", + "error_boundary_unsupported_indexeddb_description": "Die ntfy Web-App benötigt eine IndexedDB für eine korrekte Funktion, und Dein Browser unterstützt in privaten Tabs keinen IndexedDB.

Das ist zwar ärgerlich, eine Nutzung von ntfy in einem privaten Tab macht aber auch wenig Sinn da alle Daten im Browser gespeichert werden. Weitere Informationen gibt es in diesem GitHub-Issue, oder im Chat bei Discord oder Matrix.", + "action_bar_toggle_action_menu": "Aktionsmenü öffnen/schließen", + "notifications_new_indicator": "Neue Benachrichtigung", + "publish_dialog_email_reset": "Email-Weiterleitung entfernen", + "action_bar_logo_alt": "ntfy Logo", + "nav_button_muted": "Benachrichtigungen stummgeschaltet", + "notifications_list_item": "Benachrichtigung", + "publish_dialog_emoji_picker_show": "Emoji wählen", + "publish_dialog_topic_reset": "Thema zurücksetzen", + "publish_dialog_attach_reset": "angehängte URL entfernen", + "publish_dialog_click_reset": "Klick-URL entfernen" } diff --git a/web/public/static/langs/es.json b/web/public/static/langs/es.json index 4fa30ca3..a807f80a 100644 --- a/web/public/static/langs/es.json +++ b/web/public/static/langs/es.json @@ -1,191 +1,191 @@ { - "action_bar_settings": "Configuración", - "action_bar_send_test_notification": "Enviar notificación de prueba", - "action_bar_clear_notifications": "Borrar todas las notificaciones", - "nav_topics_title": "Tópicos suscritos", - "alert_grant_button": "Conceder ahora", - "action_bar_unsubscribe": "Cancelar la suscripción", - "message_bar_type_message": "Escriba un mensaje aquí", - "message_bar_error_publishing": "Error al publicar la notificación", - "alert_grant_title": "Las notificaciones están deshabilitadas", - "alert_grant_description": "Concede a tu navegador permiso para mostrar notificaciones en el escritorio.", - "nav_button_all_notifications": "Todas las notificaciones", - "nav_button_settings": "Ajustes", - "nav_button_subscribe": "Suscribirse al tópico", - "nav_button_documentation": "Documentación", - "nav_button_publish_message": "Publicar notificación", - "notifications_copied_to_clipboard": "Copiado al portapapeles", - "alert_not_supported_title": "Notificaciones no soportadas", - "alert_not_supported_description": "Las notificaciones no están soportadas por tu navegador.", - "notifications_tags": "Etiquetas", - "notifications_attachment_copy_url_title": "Copiar la URL del archivo adjunto en el portapapeles", - "notifications_attachment_copy_url_button": "Copiar URL", - "notifications_attachment_open_title": "Ir a {{url}}", - "notifications_attachment_open_button": "Abrir archivo adjunto", - "notifications_attachment_link_expires": "el enlace expira el día {{fecha}}", - "notifications_attachment_link_expired": "el enlace de descarga ha expirado", - "notifications_click_copy_url_title": "Copiar la URL del enlace en el portapapeles", - "notifications_click_copy_url_button": "Copiar enlace", - "notifications_actions_open_url_title": "Ir a {{url}}", - "notifications_click_open_button": "Abrir enlace", - "notifications_none_for_topic_title": "Aún no has recibido ninguna notificación en este tópico.", - "notifications_none_for_topic_description": "Para enviar notificaciones a este tópico, simplemente realice un PUT o POST a la URL del tópico.", - "notifications_none_for_any_title": "No ha recibido ninguna notificación.", - "notifications_no_subscriptions_title": "Parece que aún no tiene ninguna suscripción.", - "notifications_no_subscriptions_description": "Haga clic en el enlace \"{{linktext}}\" para crear o suscribirse a un tópico. Después, puede enviar mensajes a través de un PUT o POST y recibirá notificaciones aquí.", - "notifications_more_details": "Para más información, consulta la página web o la documentación.", - "notifications_loading": "Cargando notificaciones …", - "publish_dialog_title_topic": "Publicar en {{topic}}", - "publish_dialog_title_no_topic": "Publicar notificación", - "publish_dialog_progress_uploading": "Cargando …", - "publish_dialog_progress_uploading_detail": "Cargando {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "Notificación publicada", - "publish_dialog_attachment_limits_file_and_quota_reached": "supera el límite y la cuota de archivos de {{fileSizeLimit}}, restan {{remainingBytes}}", - "publish_dialog_attachment_limits_file_reached": "supera el límite de archivos de {{fileSizeLimit}}", - "publish_dialog_attachment_limits_quota_reached": "supera la cuota, restan {{remainingBytes}}", - "publish_dialog_priority_min": "Prioridad mínima", - "publish_dialog_priority_default": "Prioridad predeterminada", - "publish_dialog_priority_max": "Prioridad máxima", - "publish_dialog_base_url_label": "URL del servicio", - "publish_dialog_base_url_placeholder": "URL del servicio, por ejemplo, https://example.com", - "publish_dialog_topic_label": "Nombre del tópico", - "publish_dialog_topic_placeholder": "Nombre del tópico, ej. phil_alerts", - "publish_dialog_title_label": "Título", - "publish_dialog_message_label": "Mensaje", - "publish_dialog_tags_placeholder": "Lista de etiquetas separadas por comas, por ejemplo: warning, srv1-backup", - "publish_dialog_click_label": "Click URL", - "publish_dialog_click_placeholder": "URL que se abre cuando se hace click en la notificación", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Dirección a la que se reenviará la notificación, por ejemplo, phil@example.com", - "publish_dialog_attach_label": "URL del archivo adjunto", - "publish_dialog_filename_label": "Nombre del archivo", - "publish_dialog_delay_placeholder": "Retraso en la entrega, por ejemplo, {{unixTimestamp}}, {{relativeTime}}, o \"{{naturalLanguage}}\" (sólo en inglés)", - "publish_dialog_other_features": "Otras características:", - "publish_dialog_chip_click_label": "Click URL", - "publish_dialog_chip_email_label": "Reenviar al email", - "publish_dialog_chip_attach_url_label": "Adjuntar un archivo por URL", - "publish_dialog_chip_attach_file_label": "Adjuntar archivo local", - "publish_dialog_chip_topic_label": "Cambiar de tópico", - "publish_dialog_button_cancel_sending": "Cancelar el envío", - "publish_dialog_button_cancel": "Cancelar", - "publish_dialog_checkbox_publish_another": "Publicar otro", - "publish_dialog_attached_file_title": "Archivo adjunto:", - "publish_dialog_attached_file_filename_placeholder": "Nombre del archivo adjunto", - "publish_dialog_drop_file_here": "Suelta el archivo aquí", - "emoji_picker_search_placeholder": "Buscar emojis", - "subscribe_dialog_subscribe_title": "Suscribirse al tópico", - "subscribe_dialog_subscribe_description": "Los tópicos pueden no estar protegidos por contraseña, así que elija un nombre que no sea fácil de adivinar. Una vez suscrito, puede hacer PUT/POST de notificaciones.", - "subscribe_dialog_subscribe_topic_placeholder": "Nombre del tópico, ej. phil_alerts", - "subscribe_dialog_subscribe_use_another_label": "Usar otro servidor", - "subscribe_dialog_login_title": "Es necesario iniciar sesión", - "subscribe_dialog_login_description": "Este tópico está protegido por contraseña. Por favor, introduzca su nombre de usuario y contraseña para suscribirse.", - "subscribe_dialog_login_username_label": "Nombre de usuario, ej. phil", - "subscribe_dialog_login_password_label": "Contraseña", - "subscribe_dialog_login_button_back": "Volver", - "subscribe_dialog_login_button_login": "Iniciar sesión", - "subscribe_dialog_error_user_not_authorized": "Usuario {{username}} no autorizado", - "subscribe_dialog_error_user_anonymous": "anónimo", - "prefs_notifications_title": "Notificaciones", - "prefs_notifications_sound_title": "Sonido de notificación", - "prefs_notifications_min_priority_any": "Cualquier prioridad", - "prefs_notifications_min_priority_low_and_higher": "Prioridad baja y superior", - "prefs_notifications_min_priority_max_only": "Solo prioridad máxima", - "prefs_notifications_delete_after_title": "Eliminar notificaciones", - "prefs_notifications_delete_after_never": "Nunca", - "prefs_notifications_delete_after_three_hours": "Después de tres horas", - "prefs_notifications_delete_after_one_day": "Después de un día", - "prefs_notifications_delete_after_one_week": "Después de una semana", - "prefs_notifications_delete_after_one_month": "Después de un mes", - "prefs_users_title": "Administrar usuarios", - "prefs_users_description": "Añada/elimine usuarios para sus tópicos protegidos aquí. Tenga en cuenta que el nombre de usuario y la contraseña se guardan en el almacenamiento local del navegador.", - "prefs_users_add_button": "Añadir usuario", - "prefs_users_dialog_title_edit": "Editar usuario", - "prefs_users_dialog_base_url_label": "URL del servicio, ej. https://ntfy.sh", - "prefs_users_dialog_button_add": "Añadir", - "prefs_users_dialog_button_save": "Guardar", - "prefs_appearance_title": "Apariencia", - "prefs_appearance_language_title": "Idioma", - "error_boundary_title": "Oh no, ntfy tuvo un error", - "error_boundary_button_copy_stack_trace": "Copiar el stack trace", - "error_boundary_stack_trace": "Stack trace", - "error_boundary_gathering_info": "Reunir más información …", - "notifications_example": "Ejemplo", - "prefs_notifications_min_priority_title": "Prioridad mínima", - "notifications_none_for_any_description": "Para enviar notificaciones a un tópico, simplemente realice un PUT o POST a la URL del tópico. Aquí hay un ejemplo usando uno de sus tópicos.", - "subscribe_dialog_subscribe_button_cancel": "Cancelar", - "subscribe_dialog_subscribe_button_subscribe": "Suscribir", - "publish_dialog_message_placeholder": "Escriba un mensaje aquí", - "publish_dialog_tags_label": "Etiquetas", - "publish_dialog_priority_label": "Prioridad", - "publish_dialog_priority_low": "Prioridad baja", - "publish_dialog_priority_high": "Prioridad alta", - "publish_dialog_delay_label": "Retraso", - "publish_dialog_title_placeholder": "Título de la notificación, por ejemplo, Alerta de espacio en disco", - "publish_dialog_details_examples_description": "Para ver ejemplos y una descripción detallada de todas las funciones de envío, consulte la documentación.", - "publish_dialog_attach_placeholder": "Adjuntar un archivo por URL, por ejemplo, https://f-droid.org/F-Droid.apk", - "publish_dialog_filename_placeholder": "Nombre del archivo adjunto", - "publish_dialog_chip_delay_label": "Retraso en la entrega", - "prefs_notifications_min_priority_default_and_higher": "Prioridad predeterminada y superior", - "prefs_notifications_min_priority_high_and_higher": "Prioridad alta y superior", - "prefs_users_table_user_header": "Usuario", - "prefs_users_table_base_url_header": "URL del servicio", - "publish_dialog_button_send": "Enviar", - "prefs_notifications_sound_no_sound": "Sin sonido", - "prefs_users_dialog_password_label": "Contraseña", - "error_boundary_description": "Obviamente, esto no debería ocurrir. Lo sentimos mucho.
Si tienes un minuto, por favor informa de esto en GitHub, o avísanos vía Discord o Matrix.", - "prefs_users_dialog_title_add": "Añadir usuario", - "prefs_users_dialog_button_cancel": "Cancelar", - "prefs_users_dialog_username_label": "Nombre de usuario, ej. phil", - "priority_max": "máx", - "priority_high": "alta", - "prefs_notifications_delete_after_one_month_description": "Las notificaciones se eliminan automáticamente después de un mes", - "priority_min": "mín", - "prefs_notifications_delete_after_three_hours_description": "Las notificaciones se eliminan automáticamente después de tres horas", - "prefs_notifications_sound_description_none": "Las notificaciones no reproducen ningún sonido cuando llegan", - "prefs_notifications_min_priority_description_x_or_higher": "Mostrar notificaciones si la prioridad es {{number}} ({{name}}) o superior", - "prefs_notifications_min_priority_description_max": "Mostrar notificaciones si la prioridad es 5 (máxima)", - "prefs_notifications_sound_description_some": "Las notificaciones reproducen el sonido {{sound}} cuando llegan", - "prefs_notifications_min_priority_description_any": "Mostrando todas las notificaciones, independientemente de su prioridad", - "prefs_notifications_delete_after_never_description": "Las notificaciones nunca se borran automáticamente", - "priority_default": "predeterminada", - "prefs_notifications_delete_after_one_day_description": "Las notificaciones se eliminan automáticamente después de un día", - "prefs_notifications_delete_after_one_week_description": "Las notificaciones se eliminan automáticamente después de una semana", - "priority_low": "baja", - "notifications_actions_not_supported": "Acción no soportada en la aplicación web", - "notifications_actions_http_request_title": "Enviar HTTP {{method}} a {{url}}", - "error_boundary_unsupported_indexeddb_description": "La aplicación web ntfy necesita IndexedDB para funcionar y su navegador no soporta IndexedDB en modo de navegación privada.

Si bien esto es desafortunado, tampoco tiene mucho sentido usar la aplicación web ntfy en modo de navegación privada de todos modos, porque todo está almacenado en el almacenamiento del navegador. Puede leer más sobre esto en este issue de GitHub, o hablar con nosotros en Discord o Matrix.", - "action_bar_show_menu": "Mostrar menú", - "action_bar_logo_alt": "logo de ntfy", - "action_bar_toggle_action_menu": "Abrir/cerrar el menú de acción", - "message_bar_show_dialog": "Mostrar diálogo de publicación", - "message_bar_publish": "Publicar mensaje", - "nav_button_muted": "Notificaciones silenciadas", - "nav_button_connecting": "conectando", - "notifications_list": "Lista de notificaciones", - "notifications_list_item": "Notificación", - "notifications_mark_read": "Marcar como leído", - "notifications_delete": "Eliminar", - "notifications_priority_x": "Prioridad {{priority}}", - "notifications_new_indicator": "Nueva notificación", - "notifications_attachment_image": "Imagen adjunta", - "notifications_attachment_file_image": "archivo de imagen", - "notifications_attachment_file_video": "archivo de video", - "notifications_attachment_file_audio": "archivo de audio", - "notifications_attachment_file_app": "Archivo de aplicación de Android", - "notifications_attachment_file_document": "otro documento", - "action_bar_toggle_mute": "Silenciar/reactivar notificaciones", - "publish_dialog_emoji_picker_show": "Elige un emoji", - "publish_dialog_topic_reset": "Restablecer tópico", - "publish_dialog_click_reset": "Eliminar URL de clic", - "publish_dialog_email_reset": "Eliminar el reenvío de correo electrónico", - "publish_dialog_attach_reset": "Eliminar la URL del archivo adjunto", - "publish_dialog_delay_reset": "Eliminar entrega retrasada", - "publish_dialog_attached_file_remove": "Eliminar el archivo adjunto", - "emoji_picker_search_clear": "Limpiar búsqueda", - "subscribe_dialog_subscribe_base_url_label": "URL del servicio", - "prefs_notifications_sound_play": "Reproducir el sonido seleccionado", - "prefs_users_table": "Tabla de usuarios", - "prefs_users_edit_button": "Editar usuario", - "prefs_users_delete_button": "Eliminar usuario", - "error_boundary_unsupported_indexeddb_title": "Navegación privada no soportada" + "action_bar_settings": "Configuración", + "action_bar_send_test_notification": "Enviar notificación de prueba", + "action_bar_clear_notifications": "Borrar todas las notificaciones", + "nav_topics_title": "Tópicos suscritos", + "alert_grant_button": "Conceder ahora", + "action_bar_unsubscribe": "Cancelar la suscripción", + "message_bar_type_message": "Escriba un mensaje aquí", + "message_bar_error_publishing": "Error al publicar la notificación", + "alert_grant_title": "Las notificaciones están deshabilitadas", + "alert_grant_description": "Concede a tu navegador permiso para mostrar notificaciones en el escritorio.", + "nav_button_all_notifications": "Todas las notificaciones", + "nav_button_settings": "Ajustes", + "nav_button_subscribe": "Suscribirse al tópico", + "nav_button_documentation": "Documentación", + "nav_button_publish_message": "Publicar notificación", + "notifications_copied_to_clipboard": "Copiado al portapapeles", + "alert_not_supported_title": "Notificaciones no soportadas", + "alert_not_supported_description": "Las notificaciones no están soportadas por tu navegador.", + "notifications_tags": "Etiquetas", + "notifications_attachment_copy_url_title": "Copiar la URL del archivo adjunto en el portapapeles", + "notifications_attachment_copy_url_button": "Copiar URL", + "notifications_attachment_open_title": "Ir a {{url}}", + "notifications_attachment_open_button": "Abrir archivo adjunto", + "notifications_attachment_link_expires": "el enlace expira el día {{fecha}}", + "notifications_attachment_link_expired": "el enlace de descarga ha expirado", + "notifications_click_copy_url_title": "Copiar la URL del enlace en el portapapeles", + "notifications_click_copy_url_button": "Copiar enlace", + "notifications_actions_open_url_title": "Ir a {{url}}", + "notifications_click_open_button": "Abrir enlace", + "notifications_none_for_topic_title": "Aún no has recibido ninguna notificación en este tópico.", + "notifications_none_for_topic_description": "Para enviar notificaciones a este tópico, simplemente realice un PUT o POST a la URL del tópico.", + "notifications_none_for_any_title": "No ha recibido ninguna notificación.", + "notifications_no_subscriptions_title": "Parece que aún no tiene ninguna suscripción.", + "notifications_no_subscriptions_description": "Haga clic en el enlace \"{{linktext}}\" para crear o suscribirse a un tópico. Después, puede enviar mensajes a través de un PUT o POST y recibirá notificaciones aquí.", + "notifications_more_details": "Para más información, consulta la página web o la documentación.", + "notifications_loading": "Cargando notificaciones …", + "publish_dialog_title_topic": "Publicar en {{topic}}", + "publish_dialog_title_no_topic": "Publicar notificación", + "publish_dialog_progress_uploading": "Cargando …", + "publish_dialog_progress_uploading_detail": "Cargando {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Notificación publicada", + "publish_dialog_attachment_limits_file_and_quota_reached": "supera el límite y la cuota de archivos de {{fileSizeLimit}}, restan {{remainingBytes}}", + "publish_dialog_attachment_limits_file_reached": "supera el límite de archivos de {{fileSizeLimit}}", + "publish_dialog_attachment_limits_quota_reached": "supera la cuota, restan {{remainingBytes}}", + "publish_dialog_priority_min": "Prioridad mínima", + "publish_dialog_priority_default": "Prioridad predeterminada", + "publish_dialog_priority_max": "Prioridad máxima", + "publish_dialog_base_url_label": "URL del servicio", + "publish_dialog_base_url_placeholder": "URL del servicio, por ejemplo, https://example.com", + "publish_dialog_topic_label": "Nombre del tópico", + "publish_dialog_topic_placeholder": "Nombre del tópico, ej. phil_alerts", + "publish_dialog_title_label": "Título", + "publish_dialog_message_label": "Mensaje", + "publish_dialog_tags_placeholder": "Lista de etiquetas separadas por comas, por ejemplo: warning, srv1-backup", + "publish_dialog_click_label": "Click URL", + "publish_dialog_click_placeholder": "URL que se abre cuando se hace click en la notificación", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Dirección a la que se reenviará la notificación, por ejemplo, phil@example.com", + "publish_dialog_attach_label": "URL del archivo adjunto", + "publish_dialog_filename_label": "Nombre del archivo", + "publish_dialog_delay_placeholder": "Retraso en la entrega, por ejemplo, {{unixTimestamp}}, {{relativeTime}}, o \"{{naturalLanguage}}\" (sólo en inglés)", + "publish_dialog_other_features": "Otras características:", + "publish_dialog_chip_click_label": "Click URL", + "publish_dialog_chip_email_label": "Reenviar al email", + "publish_dialog_chip_attach_url_label": "Adjuntar un archivo por URL", + "publish_dialog_chip_attach_file_label": "Adjuntar archivo local", + "publish_dialog_chip_topic_label": "Cambiar de tópico", + "publish_dialog_button_cancel_sending": "Cancelar el envío", + "publish_dialog_button_cancel": "Cancelar", + "publish_dialog_checkbox_publish_another": "Publicar otro", + "publish_dialog_attached_file_title": "Archivo adjunto:", + "publish_dialog_attached_file_filename_placeholder": "Nombre del archivo adjunto", + "publish_dialog_drop_file_here": "Suelta el archivo aquí", + "emoji_picker_search_placeholder": "Buscar emojis", + "subscribe_dialog_subscribe_title": "Suscribirse al tópico", + "subscribe_dialog_subscribe_description": "Los tópicos pueden no estar protegidos por contraseña, así que elija un nombre que no sea fácil de adivinar. Una vez suscrito, puede hacer PUT/POST de notificaciones.", + "subscribe_dialog_subscribe_topic_placeholder": "Nombre del tópico, ej. phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "Usar otro servidor", + "subscribe_dialog_login_title": "Es necesario iniciar sesión", + "subscribe_dialog_login_description": "Este tópico está protegido por contraseña. Por favor, introduzca su nombre de usuario y contraseña para suscribirse.", + "subscribe_dialog_login_username_label": "Nombre de usuario, ej. phil", + "subscribe_dialog_login_password_label": "Contraseña", + "subscribe_dialog_login_button_back": "Volver", + "subscribe_dialog_login_button_login": "Iniciar sesión", + "subscribe_dialog_error_user_not_authorized": "Usuario {{username}} no autorizado", + "subscribe_dialog_error_user_anonymous": "anónimo", + "prefs_notifications_title": "Notificaciones", + "prefs_notifications_sound_title": "Sonido de notificación", + "prefs_notifications_min_priority_any": "Cualquier prioridad", + "prefs_notifications_min_priority_low_and_higher": "Prioridad baja y superior", + "prefs_notifications_min_priority_max_only": "Solo prioridad máxima", + "prefs_notifications_delete_after_title": "Eliminar notificaciones", + "prefs_notifications_delete_after_never": "Nunca", + "prefs_notifications_delete_after_three_hours": "Después de tres horas", + "prefs_notifications_delete_after_one_day": "Después de un día", + "prefs_notifications_delete_after_one_week": "Después de una semana", + "prefs_notifications_delete_after_one_month": "Después de un mes", + "prefs_users_title": "Administrar usuarios", + "prefs_users_description": "Añada/elimine usuarios para sus tópicos protegidos aquí. Tenga en cuenta que el nombre de usuario y la contraseña se guardan en el almacenamiento local del navegador.", + "prefs_users_add_button": "Añadir usuario", + "prefs_users_dialog_title_edit": "Editar usuario", + "prefs_users_dialog_base_url_label": "URL del servicio, ej. https://ntfy.sh", + "prefs_users_dialog_button_add": "Añadir", + "prefs_users_dialog_button_save": "Guardar", + "prefs_appearance_title": "Apariencia", + "prefs_appearance_language_title": "Idioma", + "error_boundary_title": "Oh no, ntfy tuvo un error", + "error_boundary_button_copy_stack_trace": "Copiar el stack trace", + "error_boundary_stack_trace": "Stack trace", + "error_boundary_gathering_info": "Reunir más información …", + "notifications_example": "Ejemplo", + "prefs_notifications_min_priority_title": "Prioridad mínima", + "notifications_none_for_any_description": "Para enviar notificaciones a un tópico, simplemente realice un PUT o POST a la URL del tópico. Aquí hay un ejemplo usando uno de sus tópicos.", + "subscribe_dialog_subscribe_button_cancel": "Cancelar", + "subscribe_dialog_subscribe_button_subscribe": "Suscribir", + "publish_dialog_message_placeholder": "Escriba un mensaje aquí", + "publish_dialog_tags_label": "Etiquetas", + "publish_dialog_priority_label": "Prioridad", + "publish_dialog_priority_low": "Prioridad baja", + "publish_dialog_priority_high": "Prioridad alta", + "publish_dialog_delay_label": "Retraso", + "publish_dialog_title_placeholder": "Título de la notificación, por ejemplo, Alerta de espacio en disco", + "publish_dialog_details_examples_description": "Para ver ejemplos y una descripción detallada de todas las funciones de envío, consulte la documentación.", + "publish_dialog_attach_placeholder": "Adjuntar un archivo por URL, por ejemplo, https://f-droid.org/F-Droid.apk", + "publish_dialog_filename_placeholder": "Nombre del archivo adjunto", + "publish_dialog_chip_delay_label": "Retraso en la entrega", + "prefs_notifications_min_priority_default_and_higher": "Prioridad predeterminada y superior", + "prefs_notifications_min_priority_high_and_higher": "Prioridad alta y superior", + "prefs_users_table_user_header": "Usuario", + "prefs_users_table_base_url_header": "URL del servicio", + "publish_dialog_button_send": "Enviar", + "prefs_notifications_sound_no_sound": "Sin sonido", + "prefs_users_dialog_password_label": "Contraseña", + "error_boundary_description": "Obviamente, esto no debería ocurrir. Lo sentimos mucho.
Si tienes un minuto, por favor informa de esto en GitHub, o avísanos vía Discord o Matrix.", + "prefs_users_dialog_title_add": "Añadir usuario", + "prefs_users_dialog_button_cancel": "Cancelar", + "prefs_users_dialog_username_label": "Nombre de usuario, ej. phil", + "priority_max": "máx", + "priority_high": "alta", + "prefs_notifications_delete_after_one_month_description": "Las notificaciones se eliminan automáticamente después de un mes", + "priority_min": "mín", + "prefs_notifications_delete_after_three_hours_description": "Las notificaciones se eliminan automáticamente después de tres horas", + "prefs_notifications_sound_description_none": "Las notificaciones no reproducen ningún sonido cuando llegan", + "prefs_notifications_min_priority_description_x_or_higher": "Mostrar notificaciones si la prioridad es {{number}} ({{name}}) o superior", + "prefs_notifications_min_priority_description_max": "Mostrar notificaciones si la prioridad es 5 (máxima)", + "prefs_notifications_sound_description_some": "Las notificaciones reproducen el sonido {{sound}} cuando llegan", + "prefs_notifications_min_priority_description_any": "Mostrando todas las notificaciones, independientemente de su prioridad", + "prefs_notifications_delete_after_never_description": "Las notificaciones nunca se borran automáticamente", + "priority_default": "predeterminada", + "prefs_notifications_delete_after_one_day_description": "Las notificaciones se eliminan automáticamente después de un día", + "prefs_notifications_delete_after_one_week_description": "Las notificaciones se eliminan automáticamente después de una semana", + "priority_low": "baja", + "notifications_actions_not_supported": "Acción no soportada en la aplicación web", + "notifications_actions_http_request_title": "Enviar HTTP {{method}} a {{url}}", + "error_boundary_unsupported_indexeddb_description": "La aplicación web ntfy necesita IndexedDB para funcionar y su navegador no soporta IndexedDB en modo de navegación privada.

Si bien esto es desafortunado, tampoco tiene mucho sentido usar la aplicación web ntfy en modo de navegación privada de todos modos, porque todo está almacenado en el almacenamiento del navegador. Puede leer más sobre esto en este issue de GitHub, o hablar con nosotros en Discord o Matrix.", + "action_bar_show_menu": "Mostrar menú", + "action_bar_logo_alt": "logo de ntfy", + "action_bar_toggle_action_menu": "Abrir/cerrar el menú de acción", + "message_bar_show_dialog": "Mostrar diálogo de publicación", + "message_bar_publish": "Publicar mensaje", + "nav_button_muted": "Notificaciones silenciadas", + "nav_button_connecting": "conectando", + "notifications_list": "Lista de notificaciones", + "notifications_list_item": "Notificación", + "notifications_mark_read": "Marcar como leído", + "notifications_delete": "Eliminar", + "notifications_priority_x": "Prioridad {{priority}}", + "notifications_new_indicator": "Nueva notificación", + "notifications_attachment_image": "Imagen adjunta", + "notifications_attachment_file_image": "archivo de imagen", + "notifications_attachment_file_video": "archivo de video", + "notifications_attachment_file_audio": "archivo de audio", + "notifications_attachment_file_app": "Archivo de aplicación de Android", + "notifications_attachment_file_document": "otro documento", + "action_bar_toggle_mute": "Silenciar/reactivar notificaciones", + "publish_dialog_emoji_picker_show": "Elige un emoji", + "publish_dialog_topic_reset": "Restablecer tópico", + "publish_dialog_click_reset": "Eliminar URL de clic", + "publish_dialog_email_reset": "Eliminar el reenvío de correo electrónico", + "publish_dialog_attach_reset": "Eliminar la URL del archivo adjunto", + "publish_dialog_delay_reset": "Eliminar entrega retrasada", + "publish_dialog_attached_file_remove": "Eliminar el archivo adjunto", + "emoji_picker_search_clear": "Limpiar búsqueda", + "subscribe_dialog_subscribe_base_url_label": "URL del servicio", + "prefs_notifications_sound_play": "Reproducir el sonido seleccionado", + "prefs_users_table": "Tabla de usuarios", + "prefs_users_edit_button": "Editar usuario", + "prefs_users_delete_button": "Eliminar usuario", + "error_boundary_unsupported_indexeddb_title": "Navegación privada no soportada" } diff --git a/web/public/static/langs/fr.json b/web/public/static/langs/fr.json index e5e4402c..adc3f1c3 100644 --- a/web/public/static/langs/fr.json +++ b/web/public/static/langs/fr.json @@ -1,191 +1,191 @@ { - "nav_topics_title": "Sujets souscrits", - "action_bar_settings": "Paramètres", - "action_bar_send_test_notification": "Envoyer une notification de test", - "action_bar_clear_notifications": "Effacer toutes les notifications", - "action_bar_unsubscribe": "Se désabonner", - "message_bar_type_message": "Tapez un message ici", - "notifications_attachment_open_button": "Ouvrir la pièce jointe", - "notifications_attachment_link_expires": "le lien expire {{date}}", - "message_bar_error_publishing": "Notification d'erreur de publication", - "nav_button_all_notifications": "Toutes les notifications", - "nav_button_settings": "Paramètres", - "nav_button_documentation": "Documentation", - "alert_not_supported_description": "Les notifications ne sont pas prises en charge par votre navigateur.", - "notifications_attachment_copy_url_title": "Copier l'URL de la pièce jointe dans le presse-papiers", - "notifications_attachment_open_title": "Aller à {{url}}", - "notifications_attachment_link_expired": "lien de téléchargement expiré", - "nav_button_publish_message": "Publier la notification", - "notifications_copied_to_clipboard": "Copié dans le presse-papiers", - "alert_not_supported_title": "Notifications non prises en charge", - "notifications_tags": "Étiquettes", - "notifications_attachment_copy_url_button": "Copier l'URL", - "notifications_click_copy_url_title": "Copier l'URL du lien dans le presse-papiers", - "notifications_click_copy_url_button": "Copier le lien", - "notifications_click_open_button": "Ouvrir le lien", - "notifications_none_for_topic_title": "Vous n'avez pas encore reçu de notifications pour ce sujet.", - "notifications_actions_open_url_title": "Aller à {{url}}", - "notifications_example": "Exemple", - "notifications_loading": "Chargement des notifications…", - "publish_dialog_progress_uploading": "Téléversement…", - "publish_dialog_priority_min": "Priorité minimum", - "publish_dialog_priority_low": "Basse priorité", - "publish_dialog_priority_default": "Priorité par défaut", - "publish_dialog_base_url_label": "URL du service", - "publish_dialog_base_url_placeholder": "URL du service, par ex. https://exemple.com", - "publish_dialog_title_label": "Titre", - "publish_dialog_message_label": "Message", - "publish_dialog_topic_label": "Nom du sujet", - "publish_dialog_message_placeholder": "Tapez un message ici", - "publish_dialog_tags_label": "Étiquettes", - "publish_dialog_email_label": "Courriel", - "publish_dialog_email_placeholder": "Adresse à laquelle transmettre la notification, par exemple phil@exemple.com", - "publish_dialog_chip_email_label": "Transférer vers le courriel", - "notifications_no_subscriptions_title": "Il semble que vous n’ayez pas encore d’abonnements.", - "publish_dialog_progress_uploading_detail": "Téléversement {{loaded}}/{{total}} ({{percent}} %) …", - "publish_dialog_message_published": "Notification publiée", - "publish_dialog_attachment_limits_file_and_quota_reached": "dépasse la limite et le quota du fichier {{fileSizeLimit}}, {{remainingBytes}} restant", - "publish_dialog_priority_high": "Haute priorité", - "publish_dialog_priority_max": "Priorité maximum", - "publish_dialog_attachment_limits_file_reached": "Dépasse la limite du fichier {{fileSizeLimit}}", - "nav_button_subscribe": "S'abonner au sujet", - "notifications_no_subscriptions_description": "Cliquez sur le lien « {{linktext}} » pour créer ou vous abonner à un sujet. Après cela, vous pouvez envoyer des messages via PUT ou POST et vous recevrez des notifications ici.", - "alert_grant_title": "Les notifications sont désactivées", - "alert_grant_description": "Autorisez votre navigateur à afficher les notifications du bureau.", - "alert_grant_button": "Accorder maintenant", - "notifications_none_for_any_title": "Vous n'avez reçu aucune notification.", - "publish_dialog_title_topic": "Publier vers {{topic}}", - "publish_dialog_title_no_topic": "Publier la notification", - "notifications_more_details": "Pour plus d'information, visitez le site web ou la documentation.", - "publish_dialog_title_placeholder": "Titre de la notification, par ex. Alerte d'espace disque", - "publish_dialog_topic_placeholder": "Nom du sujet, par ex. phil_alerts", - "publish_dialog_delay_placeholder": "Délai de réception, par ex. {{unixTimestamp}}, {{relativeTime}}, ou « {{naturalLanguage}} » (en anglais seulement)", - "publish_dialog_other_features": "Autres fonctionnalités :", - "notifications_actions_not_supported": "Cette action n'est pas supportée dans l'application web", - "notifications_actions_http_request_title": "Envoyer une requête HTTP {{method}} à {{url}}", - "publish_dialog_attachment_limits_quota_reached": "quota dépassé, {{remainingBytes}} restants", - "publish_dialog_tags_placeholder": "Liste séparée par des virgules d'étiquettes, par ex. avertissement,backup-srv1", - "publish_dialog_priority_label": "Priorité", - "publish_dialog_click_label": "URL du clic", - "publish_dialog_click_placeholder": "URL ouverte lors d'un clic sur la notification", - "publish_dialog_attach_label": "URL de la pièce jointe", - "publish_dialog_attach_placeholder": "Attachez un fichier par une URL, par ex. https://f-droid.org/F-Droid.apk", - "publish_dialog_filename_label": "Nom du fichier", - "notifications_none_for_topic_description": "Pour envoyer des notifications à ce sujet, faites simplement une requête PUT ou POST à l'URL du sujet.", - "notifications_none_for_any_description": "Pour envoyer des notifications à un sujet, faites simplement une requête PUT ou POST à l'URL du sujet. Voici un exemple utilisant un de vos sujets.", - "publish_dialog_filename_placeholder": "Nom du fichier joint", - "publish_dialog_delay_label": "Délai", - "publish_dialog_chip_click_label": "Cliquez sur l'URL", - "subscribe_dialog_subscribe_title": "S'abonner au sujet", - "subscribe_dialog_login_title": "Connexion nécessaire", - "prefs_notifications_min_priority_low_and_higher": "Priorité basse et au-dessus", - "prefs_users_dialog_button_cancel": "Annuler", - "error_boundary_button_copy_stack_trace": "Copier la stack strace", - "publish_dialog_attached_file_title": "Fichier joint :", - "publish_dialog_checkbox_publish_another": "Publier un autre", - "publish_dialog_attached_file_filename_placeholder": "Nom du fichier joint", - "subscribe_dialog_subscribe_use_another_label": "Utiliser un autre serveur", - "subscribe_dialog_subscribe_button_cancel": "Annuler", - "prefs_notifications_sound_description_none": "Les notifications ne font aucun son quand elles arrivent", - "prefs_notifications_sound_description_some": "Les notifications jouent le son {{sound}} quand elles arrivent", - "prefs_notifications_min_priority_description_x_or_higher": "Montrer les notifications si leur priorité est {{number}} ({{name}}) ou plus", - "publish_dialog_button_cancel": "Annuler", - "publish_dialog_button_send": "Envoyer", - "publish_dialog_drop_file_here": "Déposez un fichier ici", - "emoji_picker_search_placeholder": "Chercher un émoji", - "subscribe_dialog_subscribe_description": "Le sujet n'est peut-être pas protégé par un mot de passe, choisissez un nom de sujet difficile à deviner. Une fois abonné, vous pouvez PUT/POST des notifications.", - "subscribe_dialog_subscribe_topic_placeholder": "Nom de sujet, par ex. alertes_de_phil", - "subscribe_dialog_subscribe_button_subscribe": "S'abonner", - "subscribe_dialog_login_description": "Ce sujet est protégé par un mot de passe. Veuillez entrer le nom d'utilisateur et le mot de passe pour vous abonner.", - "subscribe_dialog_login_username_label": "Nom d'utilisateur, par ex. phil", - "subscribe_dialog_login_button_login": "Connexion", - "prefs_notifications_sound_title": "Son de notification", - "prefs_notifications_delete_after_never": "Jamais", - "prefs_users_table_base_url_header": "URL de service", - "subscribe_dialog_login_password_label": "Mot de passe", - "prefs_notifications_title": "Notifications", - "prefs_notifications_delete_after_title": "Supprimer les notifications", - "prefs_users_add_button": "Ajouter un utilisateur", - "subscribe_dialog_login_button_back": "Retour", - "subscribe_dialog_error_user_anonymous": "anonyme", - "prefs_notifications_sound_no_sound": "Aucun son", - "prefs_notifications_min_priority_title": "Priorité minimum", - "prefs_notifications_min_priority_description_any": "Montrer toutes les notifications, quelque soit leur priorité", - "prefs_notifications_min_priority_description_max": "Montrer les notifications si la priorité est 5 (max)", - "prefs_notifications_min_priority_default_and_higher": "Priorité par défaut et au-dessus", - "prefs_notifications_min_priority_max_only": "Seulement la priorité maximale", - "prefs_notifications_delete_after_three_hours": "Après trois heures", - "prefs_notifications_delete_after_one_day": "Après un jour", - "subscribe_dialog_error_user_not_authorized": "L'utilisateur {{username}} n'est pas autorisé", - "prefs_notifications_min_priority_any": "N'importe quelle priorité", - "prefs_notifications_min_priority_high_and_higher": "Priorité haute et au-dessus", - "prefs_users_dialog_base_url_label": "URL du service, par ex. https://ntfy.sh", - "prefs_notifications_delete_after_one_week_description": "Les notifications sont supprimées automatiquement après une semaine", - "prefs_users_dialog_username_label": "Nom d'utilisateur, par ex. phil", - "prefs_users_dialog_password_label": "Mot de passe", - "prefs_notifications_delete_after_one_month_description": "Les notifications sont supprimées automatiquement après un mois", - "prefs_users_title": "Gérer les utilisateurs", - "prefs_users_description": "Ajoutez/supprimez des utilisateurs pour vos sujets protégés ici. Notez que cet utilisateur et ce mot de passe sont stockés dans le stockage local du navigateur.", - "prefs_users_table_user_header": "Utilisateur", - "prefs_users_dialog_title_edit": "Éditer l'utilisateur", - "prefs_users_dialog_button_add": "Ajouter", - "error_boundary_description": "Ceci ne devrait évidemment pas arriver. Désolé pour ça.
Si vous avez une minute, merci de signaler ceci sur GitHub, ou faites-le nous savoir par Discord ou Matric.", - "prefs_users_dialog_title_add": "Ajouter un utilisateur", - "error_boundary_stack_trace": "Trace de pile d'appels", - "error_boundary_gathering_info": "Récupérer plus d'information…", - "prefs_notifications_delete_after_one_week": "Après une semaine", - "prefs_notifications_delete_after_one_month": "Après un mois", - "prefs_notifications_delete_after_never_description": "Les notifications ne sont jamais supprimées automatiquement", - "prefs_notifications_delete_after_three_hours_description": "Les notifications sont supprimées automatiquement après trois heures", - "prefs_notifications_delete_after_one_day_description": "Les notifications sont supprimées automatiquement après un jour", - "prefs_appearance_title": "Apparence", - "prefs_appearance_language_title": "Langue", - "priority_min": "min", - "priority_low": "basse", - "priority_default": "défault", - "priority_high": "haute", - "priority_max": "max", - "error_boundary_title": "Oh non, ntfy a planté", - "publish_dialog_chip_attach_url_label": "Joindre un fichier par URL", - "publish_dialog_chip_attach_file_label": "Joindre un fichier local", - "publish_dialog_chip_delay_label": "Délayer l'envoi", - "publish_dialog_chip_topic_label": "Changer de sujet", - "publish_dialog_details_examples_description": "Pour des exemples et une description détaillée des fonctionnalités d'envoi, voir la documentation.", - "publish_dialog_button_cancel_sending": "Annuler l'envoi", - "prefs_users_dialog_button_save": "Enregistrer", - "notifications_new_indicator": "Nouvelle notification", - "publish_dialog_delay_reset": "Retirer le délai de réception", - "notifications_list_item": "Notification", - "notifications_priority_x": "Priorité {{priority}}", - "notifications_mark_read": "Marquer comme lu", - "notifications_attachment_image": "Image jointe", - "notifications_delete": "Supprimer", - "notifications_attachment_file_video": "fichier vidéo", - "notifications_attachment_file_audio": "fichier audio", - "prefs_users_table": "Liste des utilisateurs", - "notifications_attachment_file_image": "fichier image", - "notifications_attachment_file_app": "fichier d'application Android", - "notifications_attachment_file_document": "autre document", - "prefs_notifications_sound_play": "Jouer le son sélectionné", - "error_boundary_unsupported_indexeddb_description": "L'application web ntfy a besoin d'IndexedDB pour fonctionner, mais votre navigateur ne supporte pas IndexedDB en navigation privée.

Bien que cela soit regrettable, il serait peu utile d'utiliser l'application web ntfy en navigation privée, car tout est stocké par votre navigateur. Vous pouvez vous renseigner plus amplement à ce propos dans ce ticket GitHub, ou en parler avec nous sur Discord ou Matrix.", - "action_bar_show_menu": "Montrer le menu", - "action_bar_toggle_mute": "Mettre en sourdine/réactiver les notifications", - "action_bar_toggle_action_menu": "Ouvrir/fermer le menu d'actions", - "publish_dialog_emoji_picker_show": "Choisir un emoji", - "publish_dialog_topic_reset": "Réinitialiser le sujet", - "message_bar_publish": "Publier le message", - "nav_button_muted": "Notifications en sourdine", - "nav_button_connecting": "connexion en cours", - "notifications_list": "Liste des notifications", - "message_bar_show_dialog": "Montrer le formulaire de publication", - "action_bar_logo_alt": "Logo de ntfy", - "publish_dialog_click_reset": "Retirer l'URL du clic", - "publish_dialog_email_reset": "Retirer le transfert par courriel", - "publish_dialog_attach_reset": "Retirer l'URL de la pièce jointe", - "emoji_picker_search_clear": "Effacer la recherche", - "subscribe_dialog_subscribe_base_url_label": "URL du service", - "prefs_users_edit_button": "Éditer l'utilisateur", - "prefs_users_delete_button": "Supprimer l'utilisateur", - "error_boundary_unsupported_indexeddb_title": "Navigation privée non prise en charge", - "publish_dialog_attached_file_remove": "Retirer le fichier joint" + "nav_topics_title": "Sujets souscrits", + "action_bar_settings": "Paramètres", + "action_bar_send_test_notification": "Envoyer une notification de test", + "action_bar_clear_notifications": "Effacer toutes les notifications", + "action_bar_unsubscribe": "Se désabonner", + "message_bar_type_message": "Tapez un message ici", + "notifications_attachment_open_button": "Ouvrir la pièce jointe", + "notifications_attachment_link_expires": "le lien expire {{date}}", + "message_bar_error_publishing": "Notification d'erreur de publication", + "nav_button_all_notifications": "Toutes les notifications", + "nav_button_settings": "Paramètres", + "nav_button_documentation": "Documentation", + "alert_not_supported_description": "Les notifications ne sont pas prises en charge par votre navigateur.", + "notifications_attachment_copy_url_title": "Copier l'URL de la pièce jointe dans le presse-papiers", + "notifications_attachment_open_title": "Aller à {{url}}", + "notifications_attachment_link_expired": "lien de téléchargement expiré", + "nav_button_publish_message": "Publier la notification", + "notifications_copied_to_clipboard": "Copié dans le presse-papiers", + "alert_not_supported_title": "Notifications non prises en charge", + "notifications_tags": "Étiquettes", + "notifications_attachment_copy_url_button": "Copier l'URL", + "notifications_click_copy_url_title": "Copier l'URL du lien dans le presse-papiers", + "notifications_click_copy_url_button": "Copier le lien", + "notifications_click_open_button": "Ouvrir le lien", + "notifications_none_for_topic_title": "Vous n'avez pas encore reçu de notifications pour ce sujet.", + "notifications_actions_open_url_title": "Aller à {{url}}", + "notifications_example": "Exemple", + "notifications_loading": "Chargement des notifications…", + "publish_dialog_progress_uploading": "Téléversement…", + "publish_dialog_priority_min": "Priorité minimum", + "publish_dialog_priority_low": "Basse priorité", + "publish_dialog_priority_default": "Priorité par défaut", + "publish_dialog_base_url_label": "URL du service", + "publish_dialog_base_url_placeholder": "URL du service, par ex. https://exemple.com", + "publish_dialog_title_label": "Titre", + "publish_dialog_message_label": "Message", + "publish_dialog_topic_label": "Nom du sujet", + "publish_dialog_message_placeholder": "Tapez un message ici", + "publish_dialog_tags_label": "Étiquettes", + "publish_dialog_email_label": "Courriel", + "publish_dialog_email_placeholder": "Adresse à laquelle transmettre la notification, par exemple phil@exemple.com", + "publish_dialog_chip_email_label": "Transférer vers le courriel", + "notifications_no_subscriptions_title": "Il semble que vous n’ayez pas encore d’abonnements.", + "publish_dialog_progress_uploading_detail": "Téléversement {{loaded}}/{{total}} ({{percent}} %) …", + "publish_dialog_message_published": "Notification publiée", + "publish_dialog_attachment_limits_file_and_quota_reached": "dépasse la limite et le quota du fichier {{fileSizeLimit}}, {{remainingBytes}} restant", + "publish_dialog_priority_high": "Haute priorité", + "publish_dialog_priority_max": "Priorité maximum", + "publish_dialog_attachment_limits_file_reached": "Dépasse la limite du fichier {{fileSizeLimit}}", + "nav_button_subscribe": "S'abonner au sujet", + "notifications_no_subscriptions_description": "Cliquez sur le lien « {{linktext}} » pour créer ou vous abonner à un sujet. Après cela, vous pouvez envoyer des messages via PUT ou POST et vous recevrez des notifications ici.", + "alert_grant_title": "Les notifications sont désactivées", + "alert_grant_description": "Autorisez votre navigateur à afficher les notifications du bureau.", + "alert_grant_button": "Accorder maintenant", + "notifications_none_for_any_title": "Vous n'avez reçu aucune notification.", + "publish_dialog_title_topic": "Publier vers {{topic}}", + "publish_dialog_title_no_topic": "Publier la notification", + "notifications_more_details": "Pour plus d'information, visitez le site web ou la documentation.", + "publish_dialog_title_placeholder": "Titre de la notification, par ex. Alerte d'espace disque", + "publish_dialog_topic_placeholder": "Nom du sujet, par ex. phil_alerts", + "publish_dialog_delay_placeholder": "Délai de réception, par ex. {{unixTimestamp}}, {{relativeTime}}, ou « {{naturalLanguage}} » (en anglais seulement)", + "publish_dialog_other_features": "Autres fonctionnalités :", + "notifications_actions_not_supported": "Cette action n'est pas supportée dans l'application web", + "notifications_actions_http_request_title": "Envoyer une requête HTTP {{method}} à {{url}}", + "publish_dialog_attachment_limits_quota_reached": "quota dépassé, {{remainingBytes}} restants", + "publish_dialog_tags_placeholder": "Liste séparée par des virgules d'étiquettes, par ex. avertissement,backup-srv1", + "publish_dialog_priority_label": "Priorité", + "publish_dialog_click_label": "URL du clic", + "publish_dialog_click_placeholder": "URL ouverte lors d'un clic sur la notification", + "publish_dialog_attach_label": "URL de la pièce jointe", + "publish_dialog_attach_placeholder": "Attachez un fichier par une URL, par ex. https://f-droid.org/F-Droid.apk", + "publish_dialog_filename_label": "Nom du fichier", + "notifications_none_for_topic_description": "Pour envoyer des notifications à ce sujet, faites simplement une requête PUT ou POST à l'URL du sujet.", + "notifications_none_for_any_description": "Pour envoyer des notifications à un sujet, faites simplement une requête PUT ou POST à l'URL du sujet. Voici un exemple utilisant un de vos sujets.", + "publish_dialog_filename_placeholder": "Nom du fichier joint", + "publish_dialog_delay_label": "Délai", + "publish_dialog_chip_click_label": "Cliquez sur l'URL", + "subscribe_dialog_subscribe_title": "S'abonner au sujet", + "subscribe_dialog_login_title": "Connexion nécessaire", + "prefs_notifications_min_priority_low_and_higher": "Priorité basse et au-dessus", + "prefs_users_dialog_button_cancel": "Annuler", + "error_boundary_button_copy_stack_trace": "Copier la stack strace", + "publish_dialog_attached_file_title": "Fichier joint :", + "publish_dialog_checkbox_publish_another": "Publier un autre", + "publish_dialog_attached_file_filename_placeholder": "Nom du fichier joint", + "subscribe_dialog_subscribe_use_another_label": "Utiliser un autre serveur", + "subscribe_dialog_subscribe_button_cancel": "Annuler", + "prefs_notifications_sound_description_none": "Les notifications ne font aucun son quand elles arrivent", + "prefs_notifications_sound_description_some": "Les notifications jouent le son {{sound}} quand elles arrivent", + "prefs_notifications_min_priority_description_x_or_higher": "Montrer les notifications si leur priorité est {{number}} ({{name}}) ou plus", + "publish_dialog_button_cancel": "Annuler", + "publish_dialog_button_send": "Envoyer", + "publish_dialog_drop_file_here": "Déposez un fichier ici", + "emoji_picker_search_placeholder": "Chercher un émoji", + "subscribe_dialog_subscribe_description": "Le sujet n'est peut-être pas protégé par un mot de passe, choisissez un nom de sujet difficile à deviner. Une fois abonné, vous pouvez PUT/POST des notifications.", + "subscribe_dialog_subscribe_topic_placeholder": "Nom de sujet, par ex. alertes_de_phil", + "subscribe_dialog_subscribe_button_subscribe": "S'abonner", + "subscribe_dialog_login_description": "Ce sujet est protégé par un mot de passe. Veuillez entrer le nom d'utilisateur et le mot de passe pour vous abonner.", + "subscribe_dialog_login_username_label": "Nom d'utilisateur, par ex. phil", + "subscribe_dialog_login_button_login": "Connexion", + "prefs_notifications_sound_title": "Son de notification", + "prefs_notifications_delete_after_never": "Jamais", + "prefs_users_table_base_url_header": "URL de service", + "subscribe_dialog_login_password_label": "Mot de passe", + "prefs_notifications_title": "Notifications", + "prefs_notifications_delete_after_title": "Supprimer les notifications", + "prefs_users_add_button": "Ajouter un utilisateur", + "subscribe_dialog_login_button_back": "Retour", + "subscribe_dialog_error_user_anonymous": "anonyme", + "prefs_notifications_sound_no_sound": "Aucun son", + "prefs_notifications_min_priority_title": "Priorité minimum", + "prefs_notifications_min_priority_description_any": "Montrer toutes les notifications, quelque soit leur priorité", + "prefs_notifications_min_priority_description_max": "Montrer les notifications si la priorité est 5 (max)", + "prefs_notifications_min_priority_default_and_higher": "Priorité par défaut et au-dessus", + "prefs_notifications_min_priority_max_only": "Seulement la priorité maximale", + "prefs_notifications_delete_after_three_hours": "Après trois heures", + "prefs_notifications_delete_after_one_day": "Après un jour", + "subscribe_dialog_error_user_not_authorized": "L'utilisateur {{username}} n'est pas autorisé", + "prefs_notifications_min_priority_any": "N'importe quelle priorité", + "prefs_notifications_min_priority_high_and_higher": "Priorité haute et au-dessus", + "prefs_users_dialog_base_url_label": "URL du service, par ex. https://ntfy.sh", + "prefs_notifications_delete_after_one_week_description": "Les notifications sont supprimées automatiquement après une semaine", + "prefs_users_dialog_username_label": "Nom d'utilisateur, par ex. phil", + "prefs_users_dialog_password_label": "Mot de passe", + "prefs_notifications_delete_after_one_month_description": "Les notifications sont supprimées automatiquement après un mois", + "prefs_users_title": "Gérer les utilisateurs", + "prefs_users_description": "Ajoutez/supprimez des utilisateurs pour vos sujets protégés ici. Notez que cet utilisateur et ce mot de passe sont stockés dans le stockage local du navigateur.", + "prefs_users_table_user_header": "Utilisateur", + "prefs_users_dialog_title_edit": "Éditer l'utilisateur", + "prefs_users_dialog_button_add": "Ajouter", + "error_boundary_description": "Ceci ne devrait évidemment pas arriver. Désolé pour ça.
Si vous avez une minute, merci de signaler ceci sur GitHub, ou faites-le nous savoir par Discord ou Matric.", + "prefs_users_dialog_title_add": "Ajouter un utilisateur", + "error_boundary_stack_trace": "Trace de pile d'appels", + "error_boundary_gathering_info": "Récupérer plus d'information…", + "prefs_notifications_delete_after_one_week": "Après une semaine", + "prefs_notifications_delete_after_one_month": "Après un mois", + "prefs_notifications_delete_after_never_description": "Les notifications ne sont jamais supprimées automatiquement", + "prefs_notifications_delete_after_three_hours_description": "Les notifications sont supprimées automatiquement après trois heures", + "prefs_notifications_delete_after_one_day_description": "Les notifications sont supprimées automatiquement après un jour", + "prefs_appearance_title": "Apparence", + "prefs_appearance_language_title": "Langue", + "priority_min": "min", + "priority_low": "basse", + "priority_default": "défault", + "priority_high": "haute", + "priority_max": "max", + "error_boundary_title": "Oh non, ntfy a planté", + "publish_dialog_chip_attach_url_label": "Joindre un fichier par URL", + "publish_dialog_chip_attach_file_label": "Joindre un fichier local", + "publish_dialog_chip_delay_label": "Délayer l'envoi", + "publish_dialog_chip_topic_label": "Changer de sujet", + "publish_dialog_details_examples_description": "Pour des exemples et une description détaillée des fonctionnalités d'envoi, voir la documentation.", + "publish_dialog_button_cancel_sending": "Annuler l'envoi", + "prefs_users_dialog_button_save": "Enregistrer", + "notifications_new_indicator": "Nouvelle notification", + "publish_dialog_delay_reset": "Retirer le délai de réception", + "notifications_list_item": "Notification", + "notifications_priority_x": "Priorité {{priority}}", + "notifications_mark_read": "Marquer comme lu", + "notifications_attachment_image": "Image jointe", + "notifications_delete": "Supprimer", + "notifications_attachment_file_video": "fichier vidéo", + "notifications_attachment_file_audio": "fichier audio", + "prefs_users_table": "Liste des utilisateurs", + "notifications_attachment_file_image": "fichier image", + "notifications_attachment_file_app": "fichier d'application Android", + "notifications_attachment_file_document": "autre document", + "prefs_notifications_sound_play": "Jouer le son sélectionné", + "error_boundary_unsupported_indexeddb_description": "L'application web ntfy a besoin d'IndexedDB pour fonctionner, mais votre navigateur ne supporte pas IndexedDB en navigation privée.

Bien que cela soit regrettable, il serait peu utile d'utiliser l'application web ntfy en navigation privée, car tout est stocké par votre navigateur. Vous pouvez vous renseigner plus amplement à ce propos dans ce ticket GitHub, ou en parler avec nous sur Discord ou Matrix.", + "action_bar_show_menu": "Montrer le menu", + "action_bar_toggle_mute": "Mettre en sourdine/réactiver les notifications", + "action_bar_toggle_action_menu": "Ouvrir/fermer le menu d'actions", + "publish_dialog_emoji_picker_show": "Choisir un emoji", + "publish_dialog_topic_reset": "Réinitialiser le sujet", + "message_bar_publish": "Publier le message", + "nav_button_muted": "Notifications en sourdine", + "nav_button_connecting": "connexion en cours", + "notifications_list": "Liste des notifications", + "message_bar_show_dialog": "Montrer le formulaire de publication", + "action_bar_logo_alt": "Logo de ntfy", + "publish_dialog_click_reset": "Retirer l'URL du clic", + "publish_dialog_email_reset": "Retirer le transfert par courriel", + "publish_dialog_attach_reset": "Retirer l'URL de la pièce jointe", + "emoji_picker_search_clear": "Effacer la recherche", + "subscribe_dialog_subscribe_base_url_label": "URL du service", + "prefs_users_edit_button": "Éditer l'utilisateur", + "prefs_users_delete_button": "Supprimer l'utilisateur", + "error_boundary_unsupported_indexeddb_title": "Navigation privée non prise en charge", + "publish_dialog_attached_file_remove": "Retirer le fichier joint" } diff --git a/web/public/static/langs/hu.json b/web/public/static/langs/hu.json index e9b9e198..d7d1a876 100644 --- a/web/public/static/langs/hu.json +++ b/web/public/static/langs/hu.json @@ -1,191 +1,191 @@ { - "action_bar_send_test_notification": "Teszt értesítés küldése", - "action_bar_clear_notifications": "Összes értesítés törlése", - "alert_not_supported_description": "A böngésző nem támogatja az értesítések fogadását.", - "action_bar_settings": "Beállítások", - "action_bar_unsubscribe": "Leiratkozás", - "message_bar_type_message": "Írd ide az üzenetet", - "message_bar_error_publishing": "Hiba történt az értesítés elküldése közben", - "nav_button_all_notifications": "Összes értesítés", - "nav_topics_title": "Feliratkozott témák", - "alert_grant_title": "Az értesítések le vannak tiltva", - "alert_grant_description": "Engedélyezd a böngészőnek, hogy asztali értesítéseket jeleníttessen meg.", - "nav_button_settings": "Beállítások", - "nav_button_documentation": "Dokumentáció", - "nav_button_publish_message": "Értesítés küldése", - "alert_grant_button": "Engedélyezés", - "alert_not_supported_title": "Nem támogatott funkció", - "notifications_copied_to_clipboard": "Másolva a vágólapra", - "notifications_tags": "Címkék", - "notifications_attachment_copy_url_title": "Másolja vágólapra a csatolmány URL-ét", - "notifications_attachment_copy_url_button": "URL másolása", - "notifications_attachment_open_title": "Menjen a(z) {{url}} címre", - "notifications_attachment_open_button": "Csatolmány megnyitása", - "notifications_attachment_link_expired": "A letöltési hivatkozás lejárt", - "notifications_attachment_link_expires": "A hivatkozás {{date}}-kor jár le", - "nav_button_subscribe": "Feliratkozás témára", - "notifications_click_copy_url_title": "Másolja vágólapra a hivatkozás URL-ét", - "notifications_actions_open_url_title": "Menjen a(z) {{url}} címre", - "notifications_actions_not_supported": "A művelet nem támogatott a webes alkalmazásban", - "notifications_actions_http_request_title": "Küldjön HTTP {{method}} kérést a(z) {{url}} címre", - "notifications_none_for_topic_title": "Még nem érkezett értesítés erre a témára.", - "notifications_none_for_any_title": "Még nem érkezett egy értesítés sem.", - "notifications_none_for_any_description": "Értesítés beküldéséhez csak küldj egy PUT, vagy POST kérést a téma URL-ére. Itt egy példa az egyik témádhoz.", - "notifications_no_subscriptions_title": "Úgy tűnik, még nem iratkoztál fel egy témára sem.", - "publish_dialog_message_published": "Értesítés elküldve", - "notifications_example": "Példa", - "notifications_no_subscriptions_description": "Kattints a \"{{linktext}}\" linkre egy téma létrehozásához, vagy rá feliratkozáshoz. Ezután PUT, vagy POST kéréssel fogsz tudni értesítéseket küldeni rá, amik utána meg fognak itt jelenni.", - "publish_dialog_priority_low": "Alacsony prioritás", - "publish_dialog_priority_default": "Közepes prioritás", - "publish_dialog_priority_high": "Magas prioritás", - "notifications_more_details": "További információkért keresd fel a weboldalunkat vagy olvasd el a dokumentációt.", - "publish_dialog_title_no_topic": "Értesítés küldése", - "publish_dialog_attachment_limits_file_and_quota_reached": "túllépi a fájlméret korlátot ({{fileSizeLimit}}) és a kvótát is ({{remainingBytes}} maradt)", - "publish_dialog_attachment_limits_quota_reached": "túllépi a kvótát, {{remainingBytes}} maradt", - "publish_dialog_priority_min": "Legkisebb prioritás", - "publish_dialog_base_url_label": "A szolgáltatás URL-e", - "publish_dialog_base_url_placeholder": "A szolgáltatás URL-e, pl: https://example.com", - "publish_dialog_topic_label": "Téma neve", - "publish_dialog_priority_max": "Legmagasabb prioritás", - "publish_dialog_topic_placeholder": "Téma neve, pl: jozsi_riasztasai", - "publish_dialog_title_label": "Cím", - "publish_dialog_title_placeholder": "Értesítés címe, pl: Fogy a szabad hely", - "publish_dialog_message_label": "Üzenet", - "publish_dialog_message_placeholder": "Írj ide egy üzenetet", - "publish_dialog_tags_label": "Címkék", - "publish_dialog_tags_placeholder": "Címkék vesszővel elválasztva, pl: fontos,srv1-backup", - "publish_dialog_priority_label": "Prioritás", - "publish_dialog_click_label": "URL", - "publish_dialog_click_placeholder": "Webcím, ami megnyílik, ha az értesítésre kattintanak", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Email cím, amire továbbítjuk az értesítést, pl: jozsi@example.com", - "publish_dialog_attach_label": "Csatolmány URL-e", - "publish_dialog_filename_label": "Fájlnév", - "publish_dialog_filename_placeholder": "Csatolmány fájlneve", - "publish_dialog_delay_label": "Késleltetés", - "publish_dialog_delay_placeholder": "Késleltetett küldés, pl: {{unixTimestamp}}, {{relativeTime}}, vagy \"{{naturalLanguage}}\" (Csak angolul)", - "publish_dialog_other_features": "Egyéb lehetőségek:", - "publish_dialog_chip_click_label": "Kattintási URL", - "publish_dialog_chip_attach_file_label": "Helyi fájl csatolása", - "publish_dialog_chip_delay_label": "Késleltetett kézbesítés", - "publish_dialog_chip_topic_label": "Téma megváltoztatása", - "publish_dialog_button_cancel_sending": "Küldés megállítása", - "publish_dialog_button_cancel": "Mégsem", - "publish_dialog_checkbox_publish_another": "Küldök még egyet", - "publish_dialog_attached_file_title": "Csatolt fájl:", - "publish_dialog_attached_file_filename_placeholder": "Csatolmány fájlneve", - "publish_dialog_drop_file_here": "Ejtsd ide a fájlt", - "emoji_picker_search_placeholder": "Emoji keresése", - "publish_dialog_details_examples_description": "Példákért és az összes küldési képesség részletes leírásához olvasd el a dokumentációt.", - "subscribe_dialog_subscribe_use_another_label": "Használjon másik szervert", - "subscribe_dialog_subscribe_button_subscribe": "Feliratkozás", - "subscribe_dialog_login_title": "Be kell jelentkezni", - "subscribe_dialog_subscribe_description": "A témák nem mindig vannak jelszóval védve, ezért olyan nevet válassz, ami nehezen található ki. Miután feliratkoztál, küldhetsz értesítéseket.", - "subscribe_dialog_login_description": "Ez a téma jelszóval védett. Jelentkezz be a feliratkozáshoz.", - "subscribe_dialog_login_username_label": "Felhasználónév, pl: jozsi", - "subscribe_dialog_login_password_label": "Jelszó", - "subscribe_dialog_login_button_back": "Vissza", - "subscribe_dialog_login_button_login": "Belépés", - "subscribe_dialog_error_user_anonymous": "névtelen", - "subscribe_dialog_error_user_not_authorized": "A(z) {{username}} felhasználónak nincs hozzáférése", - "prefs_notifications_min_priority_description_any": "Minden értesítést mutat, prioritástól függetlenül", - "prefs_notifications_min_priority_description_max": "Csak az 5-ös (legmagasabb) prioritású értesítések jelennek meg", - "prefs_notifications_min_priority_any": "Bármilyen prioritás", - "prefs_notifications_min_priority_low_and_higher": "Alacsony prioritás, vagy magasabb", - "prefs_notifications_min_priority_high_and_higher": "Magas, vagy legmagasabb prioritás", - "prefs_notifications_min_priority_max_only": "Csak a legmagasabb prioritás", - "prefs_notifications_sound_title": "Értesítés hangja", - "prefs_notifications_sound_description_none": "Az értesítések nem fognak hangot adni, amikor megérkeznek", - "prefs_notifications_sound_no_sound": "Hang nélkül", - "prefs_notifications_delete_after_one_week": "1 hét után", - "prefs_notifications_delete_after_one_month": "1 hónap után", - "prefs_notifications_delete_after_never_description": "Az értesítések soha nem lesznek automatikusan törölve", - "prefs_notifications_delete_after_three_hours_description": "A 3 óránál régebbi értesítések automatikus törlése", - "prefs_notifications_delete_after_one_day_description": "Az egy napnál régebbi értesítések automatikus törlése", - "prefs_users_description": "Itt tudsz hozzáadni/eltávolítani felhasználókat a védett témákról. Fontos, hogy a felhasználónevet és a jelszót a böngésző helyi tárolójába fogjuk menteni.", - "prefs_users_table_user_header": "Felhasználó", - "prefs_users_table_base_url_header": "Szerver címe", - "prefs_users_dialog_title_edit": "Felhasználó szerkesztése", - "prefs_users_dialog_username_label": "Felhasználónév, pl: jozsi", - "prefs_users_dialog_password_label": "Jelszó", - "prefs_users_dialog_button_add": "Hozzáadás", - "prefs_users_dialog_base_url_label": "Szerver címe, pl: https://ntfy.sh", - "notifications_loading": "Értesítések betöltése …", - "publish_dialog_progress_uploading": "Feltöltés …", - "notifications_click_copy_url_button": "Hivatkozás másolása", - "notifications_click_open_button": "Hivatkozás megnyitása", - "publish_dialog_progress_uploading_detail": "Feltöltés folyamatban: {{loaded}}/{{total}} ({{percent}}%) …", - "notifications_none_for_topic_description": "Értesítés beküldéséhez csak küldj egy PUT, vagy POST kérést a téma URL-ére.", - "prefs_notifications_delete_after_one_day": "1 nap után", - "publish_dialog_attach_placeholder": "Csatolandó fájl címe, pl: https://f-droid.org/F-Droid.apk", - "publish_dialog_chip_email_label": "Továbbítás email-ben", - "publish_dialog_chip_attach_url_label": "Fájl csatolása URL-lel", - "publish_dialog_button_send": "Küldés", - "subscribe_dialog_subscribe_title": "Feliratkozás témára", - "subscribe_dialog_subscribe_button_cancel": "Mégsem", - "prefs_notifications_min_priority_title": "Legkisebb megjelenítendő prioritás", - "prefs_notifications_min_priority_description_x_or_higher": "Csak akkor jelenik meg egy értesítés, ha a prioritása {{number}} ({{name}}), vagy fontosabb", - "prefs_notifications_min_priority_default_and_higher": "Közepes prioritás, vagy magasabb", - "prefs_notifications_delete_after_one_week_description": "Az egy hétnél régebbi értesítések automatikus törlése", - "prefs_users_add_button": "Felhasználó hozzáadása", - "subscribe_dialog_subscribe_topic_placeholder": "Téma neve, pl: jozsi_riasztasai", - "prefs_notifications_title": "Értesítések", - "error_boundary_button_copy_stack_trace": "Verem nyomkövetés másolása", - "prefs_notifications_delete_after_title": "Régi értesítések törlése", - "prefs_notifications_delete_after_three_hours": "3 óra után", - "error_boundary_title": "Jaj ne, az ntfy összeomlott", - "prefs_notifications_delete_after_never": "Soha", - "prefs_notifications_delete_after_one_month_description": "Az egy hónapnál régebbi értesítések automatikus törlése", - "prefs_appearance_title": "Megjelenés", - "priority_default": "közepes", - "priority_high": "magas", - "priority_max": "legmagasabb", - "priority_min": "legkisebb", - "error_boundary_gathering_info": "Több információ…", - "publish_dialog_attachment_limits_file_reached": "túllépi a fájlméret korlátot ({{fileSizeLimit}})", - "prefs_users_title": "Felhasználók kezelése", - "prefs_users_dialog_button_cancel": "Mégsem", - "prefs_users_dialog_button_save": "Mentés", - "prefs_users_dialog_title_add": "Felhasználó hozzáadása", - "prefs_appearance_language_title": "Nyelv", - "priority_low": "alacsony", - "error_boundary_stack_trace": "Verem nyomkövetés", - "publish_dialog_title_topic": "A {{topic}} téma értesítése", - "prefs_notifications_sound_description_some": "Az értesítéseket a(z) {{sound}} hang fogja jelezni", - "error_boundary_description": "Ennek nem szabadott volna megtörténnie. Nagyon sajnáljuk.
Ha van egy perced, jelentsd be GitHubon, vagy tudasd velünk Discordon, vagy Matrixon.", - "action_bar_show_menu": "Menü mutatása", - "action_bar_toggle_mute": "Üzenetek némítása/bekapcsolása", - "notifications_list_item": "Értesítés", - "error_boundary_unsupported_indexeddb_description": "A ntfy web alkalmazás működéséhez szükséges az IndexedDB funkció, az ön böngészője nem támogatja az IndexedDB használatát privát böngészés közben.

Miközben privát mód sajnos nem lehetséges, szeretnénk értesíteni hogy magabiztosan használhatja normál módban mert a böngésző minden adatot az ön gépén tárol. Tovább tájékozódhat ezen a Github oldalon, vagy beszéljen velünk Discord-on vagy Matrix-on.", - "notifications_priority_x": "Prioritás {{prioritás}}", - "message_bar_show_dialog": "Küldött üzenetek megjelenítése", - "action_bar_logo_alt": "ntfy logó", - "action_bar_toggle_action_menu": "Tevékenységkezelő nyitása/zárása", - "message_bar_publish": "Üzenet küldése", - "nav_button_muted": "Értesítések némítva", - "nav_button_connecting": "csatlakozás", - "notifications_list": "Értesítés lista", - "notifications_mark_read": "Jelölés olvasottként", - "notifications_delete": "Törlés", - "notifications_new_indicator": "Új értesítés", - "notifications_attachment_image": "Csatolt kép", - "notifications_attachment_file_image": "Kép fájl", - "notifications_attachment_file_video": "Videó fájl", - "notifications_attachment_file_audio": "Hang fájl", - "notifications_attachment_file_app": "Android alkalmazás fájl", - "notifications_attachment_file_document": "egyéb dokumentum", - "publish_dialog_emoji_picker_show": "Emoji kiválasztása", - "publish_dialog_topic_reset": "Téma visszaállítása", - "publish_dialog_click_reset": "URL kattintás törlése", - "publish_dialog_email_reset": "Email továbbítás törlése", - "publish_dialog_attach_reset": "Csatolt URL törlése", - "publish_dialog_delay_reset": "Késleltetett kézbesítés törlése", - "publish_dialog_attached_file_remove": "Csatolt fájl törlése", - "emoji_picker_search_clear": "Keresés törlése", - "prefs_notifications_sound_play": "Kijelölt hang lejátszása", - "prefs_users_table": "Felhasználó táblázat", - "prefs_users_edit_button": "Felhasználó szerkesztése", - "prefs_users_delete_button": "Felhasználó törlése", - "error_boundary_unsupported_indexeddb_title": "Privát böngészés nem támogatott", - "subscribe_dialog_subscribe_base_url_label": "Szolgáltató URL" + "action_bar_send_test_notification": "Teszt értesítés küldése", + "action_bar_clear_notifications": "Összes értesítés törlése", + "alert_not_supported_description": "A böngésző nem támogatja az értesítések fogadását.", + "action_bar_settings": "Beállítások", + "action_bar_unsubscribe": "Leiratkozás", + "message_bar_type_message": "Írd ide az üzenetet", + "message_bar_error_publishing": "Hiba történt az értesítés elküldése közben", + "nav_button_all_notifications": "Összes értesítés", + "nav_topics_title": "Feliratkozott témák", + "alert_grant_title": "Az értesítések le vannak tiltva", + "alert_grant_description": "Engedélyezd a böngészőnek, hogy asztali értesítéseket jeleníttessen meg.", + "nav_button_settings": "Beállítások", + "nav_button_documentation": "Dokumentáció", + "nav_button_publish_message": "Értesítés küldése", + "alert_grant_button": "Engedélyezés", + "alert_not_supported_title": "Nem támogatott funkció", + "notifications_copied_to_clipboard": "Másolva a vágólapra", + "notifications_tags": "Címkék", + "notifications_attachment_copy_url_title": "Másolja vágólapra a csatolmány URL-ét", + "notifications_attachment_copy_url_button": "URL másolása", + "notifications_attachment_open_title": "Menjen a(z) {{url}} címre", + "notifications_attachment_open_button": "Csatolmány megnyitása", + "notifications_attachment_link_expired": "A letöltési hivatkozás lejárt", + "notifications_attachment_link_expires": "A hivatkozás {{date}}-kor jár le", + "nav_button_subscribe": "Feliratkozás témára", + "notifications_click_copy_url_title": "Másolja vágólapra a hivatkozás URL-ét", + "notifications_actions_open_url_title": "Menjen a(z) {{url}} címre", + "notifications_actions_not_supported": "A művelet nem támogatott a webes alkalmazásban", + "notifications_actions_http_request_title": "Küldjön HTTP {{method}} kérést a(z) {{url}} címre", + "notifications_none_for_topic_title": "Még nem érkezett értesítés erre a témára.", + "notifications_none_for_any_title": "Még nem érkezett egy értesítés sem.", + "notifications_none_for_any_description": "Értesítés beküldéséhez csak küldj egy PUT, vagy POST kérést a téma URL-ére. Itt egy példa az egyik témádhoz.", + "notifications_no_subscriptions_title": "Úgy tűnik, még nem iratkoztál fel egy témára sem.", + "publish_dialog_message_published": "Értesítés elküldve", + "notifications_example": "Példa", + "notifications_no_subscriptions_description": "Kattints a \"{{linktext}}\" linkre egy téma létrehozásához, vagy rá feliratkozáshoz. Ezután PUT, vagy POST kéréssel fogsz tudni értesítéseket küldeni rá, amik utána meg fognak itt jelenni.", + "publish_dialog_priority_low": "Alacsony prioritás", + "publish_dialog_priority_default": "Közepes prioritás", + "publish_dialog_priority_high": "Magas prioritás", + "notifications_more_details": "További információkért keresd fel a weboldalunkat vagy olvasd el a dokumentációt.", + "publish_dialog_title_no_topic": "Értesítés küldése", + "publish_dialog_attachment_limits_file_and_quota_reached": "túllépi a fájlméret korlátot ({{fileSizeLimit}}) és a kvótát is ({{remainingBytes}} maradt)", + "publish_dialog_attachment_limits_quota_reached": "túllépi a kvótát, {{remainingBytes}} maradt", + "publish_dialog_priority_min": "Legkisebb prioritás", + "publish_dialog_base_url_label": "A szolgáltatás URL-e", + "publish_dialog_base_url_placeholder": "A szolgáltatás URL-e, pl: https://example.com", + "publish_dialog_topic_label": "Téma neve", + "publish_dialog_priority_max": "Legmagasabb prioritás", + "publish_dialog_topic_placeholder": "Téma neve, pl: jozsi_riasztasai", + "publish_dialog_title_label": "Cím", + "publish_dialog_title_placeholder": "Értesítés címe, pl: Fogy a szabad hely", + "publish_dialog_message_label": "Üzenet", + "publish_dialog_message_placeholder": "Írj ide egy üzenetet", + "publish_dialog_tags_label": "Címkék", + "publish_dialog_tags_placeholder": "Címkék vesszővel elválasztva, pl: fontos,srv1-backup", + "publish_dialog_priority_label": "Prioritás", + "publish_dialog_click_label": "URL", + "publish_dialog_click_placeholder": "Webcím, ami megnyílik, ha az értesítésre kattintanak", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Email cím, amire továbbítjuk az értesítést, pl: jozsi@example.com", + "publish_dialog_attach_label": "Csatolmány URL-e", + "publish_dialog_filename_label": "Fájlnév", + "publish_dialog_filename_placeholder": "Csatolmány fájlneve", + "publish_dialog_delay_label": "Késleltetés", + "publish_dialog_delay_placeholder": "Késleltetett küldés, pl: {{unixTimestamp}}, {{relativeTime}}, vagy \"{{naturalLanguage}}\" (Csak angolul)", + "publish_dialog_other_features": "Egyéb lehetőségek:", + "publish_dialog_chip_click_label": "Kattintási URL", + "publish_dialog_chip_attach_file_label": "Helyi fájl csatolása", + "publish_dialog_chip_delay_label": "Késleltetett kézbesítés", + "publish_dialog_chip_topic_label": "Téma megváltoztatása", + "publish_dialog_button_cancel_sending": "Küldés megállítása", + "publish_dialog_button_cancel": "Mégsem", + "publish_dialog_checkbox_publish_another": "Küldök még egyet", + "publish_dialog_attached_file_title": "Csatolt fájl:", + "publish_dialog_attached_file_filename_placeholder": "Csatolmány fájlneve", + "publish_dialog_drop_file_here": "Ejtsd ide a fájlt", + "emoji_picker_search_placeholder": "Emoji keresése", + "publish_dialog_details_examples_description": "Példákért és az összes küldési képesség részletes leírásához olvasd el a dokumentációt.", + "subscribe_dialog_subscribe_use_another_label": "Használjon másik szervert", + "subscribe_dialog_subscribe_button_subscribe": "Feliratkozás", + "subscribe_dialog_login_title": "Be kell jelentkezni", + "subscribe_dialog_subscribe_description": "A témák nem mindig vannak jelszóval védve, ezért olyan nevet válassz, ami nehezen található ki. Miután feliratkoztál, küldhetsz értesítéseket.", + "subscribe_dialog_login_description": "Ez a téma jelszóval védett. Jelentkezz be a feliratkozáshoz.", + "subscribe_dialog_login_username_label": "Felhasználónév, pl: jozsi", + "subscribe_dialog_login_password_label": "Jelszó", + "subscribe_dialog_login_button_back": "Vissza", + "subscribe_dialog_login_button_login": "Belépés", + "subscribe_dialog_error_user_anonymous": "névtelen", + "subscribe_dialog_error_user_not_authorized": "A(z) {{username}} felhasználónak nincs hozzáférése", + "prefs_notifications_min_priority_description_any": "Minden értesítést mutat, prioritástól függetlenül", + "prefs_notifications_min_priority_description_max": "Csak az 5-ös (legmagasabb) prioritású értesítések jelennek meg", + "prefs_notifications_min_priority_any": "Bármilyen prioritás", + "prefs_notifications_min_priority_low_and_higher": "Alacsony prioritás, vagy magasabb", + "prefs_notifications_min_priority_high_and_higher": "Magas, vagy legmagasabb prioritás", + "prefs_notifications_min_priority_max_only": "Csak a legmagasabb prioritás", + "prefs_notifications_sound_title": "Értesítés hangja", + "prefs_notifications_sound_description_none": "Az értesítések nem fognak hangot adni, amikor megérkeznek", + "prefs_notifications_sound_no_sound": "Hang nélkül", + "prefs_notifications_delete_after_one_week": "1 hét után", + "prefs_notifications_delete_after_one_month": "1 hónap után", + "prefs_notifications_delete_after_never_description": "Az értesítések soha nem lesznek automatikusan törölve", + "prefs_notifications_delete_after_three_hours_description": "A 3 óránál régebbi értesítések automatikus törlése", + "prefs_notifications_delete_after_one_day_description": "Az egy napnál régebbi értesítések automatikus törlése", + "prefs_users_description": "Itt tudsz hozzáadni/eltávolítani felhasználókat a védett témákról. Fontos, hogy a felhasználónevet és a jelszót a böngésző helyi tárolójába fogjuk menteni.", + "prefs_users_table_user_header": "Felhasználó", + "prefs_users_table_base_url_header": "Szerver címe", + "prefs_users_dialog_title_edit": "Felhasználó szerkesztése", + "prefs_users_dialog_username_label": "Felhasználónév, pl: jozsi", + "prefs_users_dialog_password_label": "Jelszó", + "prefs_users_dialog_button_add": "Hozzáadás", + "prefs_users_dialog_base_url_label": "Szerver címe, pl: https://ntfy.sh", + "notifications_loading": "Értesítések betöltése …", + "publish_dialog_progress_uploading": "Feltöltés …", + "notifications_click_copy_url_button": "Hivatkozás másolása", + "notifications_click_open_button": "Hivatkozás megnyitása", + "publish_dialog_progress_uploading_detail": "Feltöltés folyamatban: {{loaded}}/{{total}} ({{percent}}%) …", + "notifications_none_for_topic_description": "Értesítés beküldéséhez csak küldj egy PUT, vagy POST kérést a téma URL-ére.", + "prefs_notifications_delete_after_one_day": "1 nap után", + "publish_dialog_attach_placeholder": "Csatolandó fájl címe, pl: https://f-droid.org/F-Droid.apk", + "publish_dialog_chip_email_label": "Továbbítás email-ben", + "publish_dialog_chip_attach_url_label": "Fájl csatolása URL-lel", + "publish_dialog_button_send": "Küldés", + "subscribe_dialog_subscribe_title": "Feliratkozás témára", + "subscribe_dialog_subscribe_button_cancel": "Mégsem", + "prefs_notifications_min_priority_title": "Legkisebb megjelenítendő prioritás", + "prefs_notifications_min_priority_description_x_or_higher": "Csak akkor jelenik meg egy értesítés, ha a prioritása {{number}} ({{name}}), vagy fontosabb", + "prefs_notifications_min_priority_default_and_higher": "Közepes prioritás, vagy magasabb", + "prefs_notifications_delete_after_one_week_description": "Az egy hétnél régebbi értesítések automatikus törlése", + "prefs_users_add_button": "Felhasználó hozzáadása", + "subscribe_dialog_subscribe_topic_placeholder": "Téma neve, pl: jozsi_riasztasai", + "prefs_notifications_title": "Értesítések", + "error_boundary_button_copy_stack_trace": "Verem nyomkövetés másolása", + "prefs_notifications_delete_after_title": "Régi értesítések törlése", + "prefs_notifications_delete_after_three_hours": "3 óra után", + "error_boundary_title": "Jaj ne, az ntfy összeomlott", + "prefs_notifications_delete_after_never": "Soha", + "prefs_notifications_delete_after_one_month_description": "Az egy hónapnál régebbi értesítések automatikus törlése", + "prefs_appearance_title": "Megjelenés", + "priority_default": "közepes", + "priority_high": "magas", + "priority_max": "legmagasabb", + "priority_min": "legkisebb", + "error_boundary_gathering_info": "Több információ…", + "publish_dialog_attachment_limits_file_reached": "túllépi a fájlméret korlátot ({{fileSizeLimit}})", + "prefs_users_title": "Felhasználók kezelése", + "prefs_users_dialog_button_cancel": "Mégsem", + "prefs_users_dialog_button_save": "Mentés", + "prefs_users_dialog_title_add": "Felhasználó hozzáadása", + "prefs_appearance_language_title": "Nyelv", + "priority_low": "alacsony", + "error_boundary_stack_trace": "Verem nyomkövetés", + "publish_dialog_title_topic": "A {{topic}} téma értesítése", + "prefs_notifications_sound_description_some": "Az értesítéseket a(z) {{sound}} hang fogja jelezni", + "error_boundary_description": "Ennek nem szabadott volna megtörténnie. Nagyon sajnáljuk.
Ha van egy perced, jelentsd be GitHubon, vagy tudasd velünk Discordon, vagy Matrixon.", + "action_bar_show_menu": "Menü mutatása", + "action_bar_toggle_mute": "Üzenetek némítása/bekapcsolása", + "notifications_list_item": "Értesítés", + "error_boundary_unsupported_indexeddb_description": "A ntfy web alkalmazás működéséhez szükséges az IndexedDB funkció, az ön böngészője nem támogatja az IndexedDB használatát privát böngészés közben.

Miközben privát mód sajnos nem lehetséges, szeretnénk értesíteni hogy magabiztosan használhatja normál módban mert a böngésző minden adatot az ön gépén tárol. Tovább tájékozódhat ezen a Github oldalon, vagy beszéljen velünk Discord-on vagy Matrix-on.", + "notifications_priority_x": "Prioritás {{prioritás}}", + "message_bar_show_dialog": "Küldött üzenetek megjelenítése", + "action_bar_logo_alt": "ntfy logó", + "action_bar_toggle_action_menu": "Tevékenységkezelő nyitása/zárása", + "message_bar_publish": "Üzenet küldése", + "nav_button_muted": "Értesítések némítva", + "nav_button_connecting": "csatlakozás", + "notifications_list": "Értesítés lista", + "notifications_mark_read": "Jelölés olvasottként", + "notifications_delete": "Törlés", + "notifications_new_indicator": "Új értesítés", + "notifications_attachment_image": "Csatolt kép", + "notifications_attachment_file_image": "Kép fájl", + "notifications_attachment_file_video": "Videó fájl", + "notifications_attachment_file_audio": "Hang fájl", + "notifications_attachment_file_app": "Android alkalmazás fájl", + "notifications_attachment_file_document": "egyéb dokumentum", + "publish_dialog_emoji_picker_show": "Emoji kiválasztása", + "publish_dialog_topic_reset": "Téma visszaállítása", + "publish_dialog_click_reset": "URL kattintás törlése", + "publish_dialog_email_reset": "Email továbbítás törlése", + "publish_dialog_attach_reset": "Csatolt URL törlése", + "publish_dialog_delay_reset": "Késleltetett kézbesítés törlése", + "publish_dialog_attached_file_remove": "Csatolt fájl törlése", + "emoji_picker_search_clear": "Keresés törlése", + "prefs_notifications_sound_play": "Kijelölt hang lejátszása", + "prefs_users_table": "Felhasználó táblázat", + "prefs_users_edit_button": "Felhasználó szerkesztése", + "prefs_users_delete_button": "Felhasználó törlése", + "error_boundary_unsupported_indexeddb_title": "Privát böngészés nem támogatott", + "subscribe_dialog_subscribe_base_url_label": "Szolgáltató URL" } diff --git a/web/public/static/langs/id.json b/web/public/static/langs/id.json index 307bd17f..fa47bb30 100644 --- a/web/public/static/langs/id.json +++ b/web/public/static/langs/id.json @@ -1,191 +1,191 @@ { - "notifications_click_copy_url_title": "Salin URL tautan ke papan klip", - "alert_not_supported_title": "Notifikasi tidak didukung", - "notifications_click_copy_url_button": "Salin tautan", - "notifications_no_subscriptions_description": "Klik pada tautan \"{{linktext}}\" untuk membuat atau berlangganan ke sebuah topik. Setelah itu, Anda dapat mengirim pesan via PUT atau POST dan Anda akan menerima notifikasi di sini.", - "notifications_example": "Contoh", - "subscribe_dialog_subscribe_description": "Topik mungkin tidak dilindungi oleh kata sandi, jadi pilih sebuah nama yang tidak mudah untuk ditebak. Setelah berlangganan, Anda dapat PUT/POST notifikasi.", - "subscribe_dialog_login_title": "Login dibutuhkan", - "prefs_appearance_language_title": "Bahasa", - "nav_button_all_notifications": "Semua notifikasi", - "notifications_none_for_any_title": "Anda belum menerima notifikasi apa pun.", - "action_bar_settings": "Pengaturan", - "action_bar_send_test_notification": "Kirim notifikasi uji coba", - "action_bar_clear_notifications": "Hapus semua notifikasi", - "action_bar_unsubscribe": "Batalkan langganan", - "message_bar_type_message": "Ketika sebuah pesan di sini", - "message_bar_error_publishing": "Terjadi kesalahan mempublikasikan notifikasi", - "publish_dialog_title_label": "Judul", - "publish_dialog_message_label": "Pesan", - "nav_button_settings": "Pengaturan", - "nav_button_documentation": "Dokumentasi", - "prefs_users_dialog_button_add": "Tambahkan", - "nav_topics_title": "Topik yang dilanggani", - "nav_button_subscribe": "Berlangganan ke topik", - "alert_grant_title": "Notifikasi dinonaktifkan", - "alert_grant_description": "Berikan izin ke peramban untuk menampilkan notifikasi desktop.", - "alert_not_supported_description": "Notifikasi tidak didukung dalam peramban Anda.", - "notifications_attachment_open_title": "Pergi ke {{url}}", - "notifications_attachment_open_button": "Buka lampiran", - "notifications_attachment_link_expires": "tautan kadaluwarsa {{date}}", - "notifications_attachment_link_expired": "tautan unduhan kadaluwarsa", - "notifications_actions_open_url_title": "Pergi ke {{url}}", - "notifications_click_open_button": "Buka tautan", - "publish_dialog_topic_placeholder": "Nama topik, mis. pemberitahuan_andi", - "nav_button_publish_message": "Publikasikan notifikasi", - "alert_grant_button": "Berikan sekarang", - "notifications_copied_to_clipboard": "Disalin ke papan klip", - "notifications_tags": "Tanda", - "notifications_attachment_copy_url_title": "Salin URL lampiran ke papan klip", - "notifications_attachment_copy_url_button": "Salin URL", - "notifications_none_for_topic_title": "Anda belum menerima notifikasi apa pun untuk topik ini.", - "notifications_none_for_topic_description": "Untuk mengirimkan notifikasi ke topik ini, tinggal PUT atau POST ke URL topik.", - "notifications_none_for_any_description": "Untuk mengirimkan notifikasi ke sebuah topik, tinggal PUT atau POST ke URL topik. Ini adalah contoh menggunakan salah satu topik Anda.", - "notifications_no_subscriptions_title": "Sepertinya Anda belum memiliki langganan apa pun.", - "publish_dialog_title_topic": "Publikasikan ke {{topic}}", - "subscribe_dialog_login_description": "Topik ini dilindungi oleh kata sandi. Mohon masukkan nama pengguna dan kata sandi untuk berlangganan.", - "prefs_notifications_min_priority_title": "Prioritas minimum", - "error_boundary_gathering_info": "Dapatkan info lanjut …", - "publish_dialog_title_no_topic": "Publikasikan notifikasi", - "publish_dialog_progress_uploading": "Mengunggah …", - "notifications_more_details": "Untuk informasi lanjut, lihat situs web atau dokumentasi.", - "publish_dialog_progress_uploading_detail": "Mengunggah {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "Notifikasi terpublikasi", - "notifications_loading": "Memuat notifikasi …", - "publish_dialog_base_url_label": "URL Layanan", - "publish_dialog_title_placeholder": "Judul notifikasi, mis. Peringatan ruang disk", - "publish_dialog_tags_label": "Tanda", - "publish_dialog_priority_label": "Prioritas", - "publish_dialog_base_url_placeholder": "URL Layanan, mis. https://contoh.com", - "publish_dialog_attach_placeholder": "Lampirkan file dengan URL, mis. https://f-droid.org/F-Droid.apk", - "publish_dialog_delay_label": "Jeda", - "publish_dialog_chip_topic_label": "Ubah topik", - "publish_dialog_button_cancel_sending": "Batalkan pengiriman", - "publish_dialog_button_send": "Kirim", - "publish_dialog_attachment_limits_file_reached": "melebihi batasan file {{fileSizeLimit}", - "publish_dialog_attachment_limits_file_and_quota_reached": "melebihi batasan file dan kuota {{fileSizeLimit}}, hanya {{remainingBytes}}", - "publish_dialog_attachment_limits_quota_reached": "melebihi kuota, hanya {{remainingBytes}}", - "publish_dialog_priority_min": "Prioritas min.", - "publish_dialog_priority_low": "Prioritas rendah", - "publish_dialog_priority_default": "Prioritas bawaan", - "publish_dialog_priority_high": "Prioritas tinggi", - "publish_dialog_priority_max": "Prioritas maks.", - "publish_dialog_topic_label": "Nama topik", - "publish_dialog_message_placeholder": "Ketik sebuah pesan di sini", - "publish_dialog_click_label": "Klik URL", - "publish_dialog_tags_placeholder": "Daftar tanda yang dipisah dengan koma, mis. peringatan, cadangan-srv1", - "publish_dialog_click_placeholder": "URL yang dibuka ketika notifikasi diklik", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Alamat untuk meneruskan notifikasi, mis. andi@contoh.com", - "publish_dialog_attach_label": "URL Lampiran", - "publish_dialog_filename_label": "Nama File", - "publish_dialog_filename_placeholder": "Nama file lampiran", - "publish_dialog_delay_placeholder": "Penjedaan pengiriman, mis. {{unixTimestamp}}, {{relativeTime}}, atau \"{{naturalLanguage}}\" (hanya Inggris)", - "publish_dialog_other_features": "Fitur lainnya:", - "publish_dialog_chip_click_label": "Klik URL", - "publish_dialog_chip_email_label": "Teruskan ke email", - "publish_dialog_chip_attach_url_label": "Lampirkan file dengan URL", - "publish_dialog_chip_attach_file_label": "Lampirkan file lokal", - "publish_dialog_chip_delay_label": "Jeda pengiriman", - "publish_dialog_button_cancel": "Batal", - "publish_dialog_details_examples_description": "Untuk contoh dan deskripsi yang rinci oleh semua fitur pengiriman, lihat dokumentasi.", - "publish_dialog_checkbox_publish_another": "Publikasi yang lain", - "publish_dialog_attached_file_title": "File yang dilampirkan:", - "publish_dialog_attached_file_filename_placeholder": "Nama file lampiran", - "publish_dialog_drop_file_here": "Lepaskan file di sini", - "emoji_picker_search_placeholder": "Cari emoji", - "subscribe_dialog_subscribe_button_cancel": "Batal", - "subscribe_dialog_subscribe_button_subscribe": "Berlangganan", - "subscribe_dialog_error_user_anonymous": "anonim", - "prefs_notifications_min_priority_any": "Prioritas apa saja", - "prefs_notifications_delete_after_title": "Hapus notifikasi", - "prefs_notifications_delete_after_three_hours": "Setelah tiga jam", - "prefs_notifications_delete_after_one_day": "Setelah satu hari", - "prefs_users_add_button": "Tambahkan pengguna", - "prefs_users_dialog_username_label": "Nama pengguna, mis. andi", - "subscribe_dialog_subscribe_title": "Berlangganan ke topik", - "subscribe_dialog_subscribe_topic_placeholder": "Nama topik, mis. pemberitahuan_andi", - "subscribe_dialog_subscribe_use_another_label": "Gunakan server lain", - "subscribe_dialog_login_username_label": "Nama pengguna, mis. Andi", - "subscribe_dialog_login_button_login": "Masuk", - "subscribe_dialog_error_user_not_authorized": "Pengguna {{username}} tidak diizinkan", - "prefs_notifications_title": "Notifikasi", - "prefs_notifications_sound_no_sound": "Tidak ada suara", - "prefs_users_table_user_header": "Pengguna", - "prefs_users_dialog_base_url_label": "URL Layanan, mis. https://ntfy.sh", - "prefs_users_dialog_button_save": "Simpan", - "prefs_appearance_title": "Tampilan", - "subscribe_dialog_login_password_label": "Kata sandi", - "subscribe_dialog_login_button_back": "Kembali", - "prefs_notifications_sound_title": "Suara notifikasi", - "prefs_notifications_min_priority_low_and_higher": "Prioritas rendah dan lebih tinggi", - "prefs_notifications_min_priority_default_and_higher": "Prioritas bawaan dan lebih tinggi", - "prefs_notifications_min_priority_high_and_higher": "Prioritas tinggi dan lebih tinggi", - "prefs_notifications_min_priority_max_only": "Hanya prioritas maks", - "prefs_notifications_delete_after_never": "Tidak pernah", - "prefs_notifications_delete_after_one_week": "Setelah satu minggu", - "prefs_notifications_delete_after_one_month": "Setelah satu bulan", - "prefs_users_title": "Kelola pengguna", - "prefs_users_description": "Tambahkan/hapus pengguna untuk topik yang dilindungi di sini. Dicatat bahwa nama pengguna dan kata sandi disimpan dalam penyimpanan lokal peramban.", - "prefs_users_table_base_url_header": "URL Layanan", - "prefs_users_dialog_title_add": "Tambahkan pengguna", - "prefs_users_dialog_title_edit": "Edit pengguna", - "prefs_users_dialog_password_label": "Kata sandi", - "prefs_users_dialog_button_cancel": "Batal", - "error_boundary_title": "Aduh, ntfy mogok", - "error_boundary_description": "Seharusnya ini tidak terjadi. Maaf sekali tentang hal ini.
Jika Anda punya beberapa menit, silakan laporkan ini di GitHub, atau beritahu kami melalui Discord atau Matrix.", - "error_boundary_stack_trace": "Jejak tumpukan", - "error_boundary_button_copy_stack_trace": "Salin jejak tumpukan", - "prefs_notifications_sound_description_some": "Notifikasi memainkan suara {{sound}} ketika diterima", - "prefs_notifications_min_priority_description_any": "Menampilkan semua notifikasi, apa pun prioritasnya", - "prefs_notifications_min_priority_description_max": "Tampilkan notifikasi jika prioritas adalah 5 (maks)", - "prefs_notifications_delete_after_three_hours_description": "Notifikasi dihapus secara otomatis setelah tiga jam", - "prefs_notifications_delete_after_one_week_description": "Notifikasi dihapus secara otomatis setelah satu minggu", - "prefs_notifications_delete_after_one_month_description": "Notifikasi dihapus secara otomatis setelah satu bulan", - "priority_low": "rendah", - "priority_high": "tinggi", - "priority_max": "maks", - "prefs_notifications_min_priority_description_x_or_higher": "Tampilkan notifikasi jika prioritas {{number}} ({{name}}) atau lebih", - "prefs_notifications_sound_description_none": "Notifikasi tidak boleh memainkan suara apa pun ketika diterima", - "prefs_notifications_delete_after_never_description": "Notifikasi tidak pernah dihapus secara otomatis", - "prefs_notifications_delete_after_one_day_description": "Notifikasi dihapus secara otomatis setelah satu hari", - "priority_default": "bawaan", - "priority_min": "min", - "notifications_actions_not_supported": "Tindakan tidak didukung di aplikasi web", - "notifications_actions_http_request_title": "Kirim {{method}} HTTP ke {{url}}", - "action_bar_show_menu": "Tampilkan menu", - "action_bar_logo_alt": "logo ntfy", - "action_bar_toggle_mute": "Bisu/suarakan notifikasi", - "action_bar_toggle_action_menu": "Buka/tutup menu tindakan", - "message_bar_show_dialog": "Tampilkan dialog publikasi", - "message_bar_publish": "Publikasikan pesan", - "nav_button_muted": "Notifikasi dibisukan", - "nav_button_connecting": "menghubungkan", - "notifications_list": "Daftar notifikasi", - "notifications_list_item": "Notifikasi", - "notifications_mark_read": "Tandai sebagai dibaca", - "notifications_delete": "Hapus", - "notifications_priority_x": "Prioritas {{priority}}", - "notifications_new_indicator": "Notifikasi baru", - "notifications_attachment_image": "Lampiran gambar", - "notifications_attachment_file_image": "file gambar", - "notifications_attachment_file_video": "file", - "notifications_attachment_file_audio": "file audio", - "notifications_attachment_file_app": "file aplikasi Android", - "notifications_attachment_file_document": "dokumen lainnya", - "publish_dialog_emoji_picker_show": "Pilih emoji", - "publish_dialog_topic_reset": "Atur ulang topik", - "publish_dialog_click_reset": "Hapus URL klik", - "publish_dialog_email_reset": "Hapus terusan email", - "publish_dialog_attach_reset": "Hapus URL lampiran", - "publish_dialog_delay_reset": "Hapus pengiriman telat", - "publish_dialog_attached_file_remove": "Hapus file yang dilampirkan", - "emoji_picker_search_clear": "Hapus pencarian", - "subscribe_dialog_subscribe_base_url_label": "URL layanan", - "prefs_notifications_sound_play": "Mainkan suara yang dipilih", - "prefs_users_table": "Tabel pengguna", - "prefs_users_edit_button": "Edit pengguna", - "prefs_users_delete_button": "Hapus pengguna", - "error_boundary_unsupported_indexeddb_description": "Aplikasi web ntfy membutuhkan IndexedDB untuk berfungsi, dan peramban Anda tidak mendukung IndexedDB dalam mode penjelajahan pribadi.

Meskipun ini disayangkan, penggunaan aplikasi web ntfy juga tidak masuk akal di mode penjelajahan pribadi, karena semuanya disimpan di penyimpanan peramban. Anda dapat membaca lebih lanjut tentangnya di masalah GitHub ini, atau berbicara dengan kami di Discord atau Matrix.", - "error_boundary_unsupported_indexeddb_title": "Penjelajahan privat tidak didukung" + "notifications_click_copy_url_title": "Salin URL tautan ke papan klip", + "alert_not_supported_title": "Notifikasi tidak didukung", + "notifications_click_copy_url_button": "Salin tautan", + "notifications_no_subscriptions_description": "Klik pada tautan \"{{linktext}}\" untuk membuat atau berlangganan ke sebuah topik. Setelah itu, Anda dapat mengirim pesan via PUT atau POST dan Anda akan menerima notifikasi di sini.", + "notifications_example": "Contoh", + "subscribe_dialog_subscribe_description": "Topik mungkin tidak dilindungi oleh kata sandi, jadi pilih sebuah nama yang tidak mudah untuk ditebak. Setelah berlangganan, Anda dapat PUT/POST notifikasi.", + "subscribe_dialog_login_title": "Login dibutuhkan", + "prefs_appearance_language_title": "Bahasa", + "nav_button_all_notifications": "Semua notifikasi", + "notifications_none_for_any_title": "Anda belum menerima notifikasi apa pun.", + "action_bar_settings": "Pengaturan", + "action_bar_send_test_notification": "Kirim notifikasi uji coba", + "action_bar_clear_notifications": "Hapus semua notifikasi", + "action_bar_unsubscribe": "Batalkan langganan", + "message_bar_type_message": "Ketika sebuah pesan di sini", + "message_bar_error_publishing": "Terjadi kesalahan mempublikasikan notifikasi", + "publish_dialog_title_label": "Judul", + "publish_dialog_message_label": "Pesan", + "nav_button_settings": "Pengaturan", + "nav_button_documentation": "Dokumentasi", + "prefs_users_dialog_button_add": "Tambahkan", + "nav_topics_title": "Topik yang dilanggani", + "nav_button_subscribe": "Berlangganan ke topik", + "alert_grant_title": "Notifikasi dinonaktifkan", + "alert_grant_description": "Berikan izin ke peramban untuk menampilkan notifikasi desktop.", + "alert_not_supported_description": "Notifikasi tidak didukung dalam peramban Anda.", + "notifications_attachment_open_title": "Pergi ke {{url}}", + "notifications_attachment_open_button": "Buka lampiran", + "notifications_attachment_link_expires": "tautan kadaluwarsa {{date}}", + "notifications_attachment_link_expired": "tautan unduhan kadaluwarsa", + "notifications_actions_open_url_title": "Pergi ke {{url}}", + "notifications_click_open_button": "Buka tautan", + "publish_dialog_topic_placeholder": "Nama topik, mis. pemberitahuan_andi", + "nav_button_publish_message": "Publikasikan notifikasi", + "alert_grant_button": "Berikan sekarang", + "notifications_copied_to_clipboard": "Disalin ke papan klip", + "notifications_tags": "Tanda", + "notifications_attachment_copy_url_title": "Salin URL lampiran ke papan klip", + "notifications_attachment_copy_url_button": "Salin URL", + "notifications_none_for_topic_title": "Anda belum menerima notifikasi apa pun untuk topik ini.", + "notifications_none_for_topic_description": "Untuk mengirimkan notifikasi ke topik ini, tinggal PUT atau POST ke URL topik.", + "notifications_none_for_any_description": "Untuk mengirimkan notifikasi ke sebuah topik, tinggal PUT atau POST ke URL topik. Ini adalah contoh menggunakan salah satu topik Anda.", + "notifications_no_subscriptions_title": "Sepertinya Anda belum memiliki langganan apa pun.", + "publish_dialog_title_topic": "Publikasikan ke {{topic}}", + "subscribe_dialog_login_description": "Topik ini dilindungi oleh kata sandi. Mohon masukkan nama pengguna dan kata sandi untuk berlangganan.", + "prefs_notifications_min_priority_title": "Prioritas minimum", + "error_boundary_gathering_info": "Dapatkan info lanjut …", + "publish_dialog_title_no_topic": "Publikasikan notifikasi", + "publish_dialog_progress_uploading": "Mengunggah …", + "notifications_more_details": "Untuk informasi lanjut, lihat situs web atau dokumentasi.", + "publish_dialog_progress_uploading_detail": "Mengunggah {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Notifikasi terpublikasi", + "notifications_loading": "Memuat notifikasi …", + "publish_dialog_base_url_label": "URL Layanan", + "publish_dialog_title_placeholder": "Judul notifikasi, mis. Peringatan ruang disk", + "publish_dialog_tags_label": "Tanda", + "publish_dialog_priority_label": "Prioritas", + "publish_dialog_base_url_placeholder": "URL Layanan, mis. https://contoh.com", + "publish_dialog_attach_placeholder": "Lampirkan file dengan URL, mis. https://f-droid.org/F-Droid.apk", + "publish_dialog_delay_label": "Jeda", + "publish_dialog_chip_topic_label": "Ubah topik", + "publish_dialog_button_cancel_sending": "Batalkan pengiriman", + "publish_dialog_button_send": "Kirim", + "publish_dialog_attachment_limits_file_reached": "melebihi batasan file {{fileSizeLimit}", + "publish_dialog_attachment_limits_file_and_quota_reached": "melebihi batasan file dan kuota {{fileSizeLimit}}, hanya {{remainingBytes}}", + "publish_dialog_attachment_limits_quota_reached": "melebihi kuota, hanya {{remainingBytes}}", + "publish_dialog_priority_min": "Prioritas min.", + "publish_dialog_priority_low": "Prioritas rendah", + "publish_dialog_priority_default": "Prioritas bawaan", + "publish_dialog_priority_high": "Prioritas tinggi", + "publish_dialog_priority_max": "Prioritas maks.", + "publish_dialog_topic_label": "Nama topik", + "publish_dialog_message_placeholder": "Ketik sebuah pesan di sini", + "publish_dialog_click_label": "Klik URL", + "publish_dialog_tags_placeholder": "Daftar tanda yang dipisah dengan koma, mis. peringatan, cadangan-srv1", + "publish_dialog_click_placeholder": "URL yang dibuka ketika notifikasi diklik", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Alamat untuk meneruskan notifikasi, mis. andi@contoh.com", + "publish_dialog_attach_label": "URL Lampiran", + "publish_dialog_filename_label": "Nama File", + "publish_dialog_filename_placeholder": "Nama file lampiran", + "publish_dialog_delay_placeholder": "Penjedaan pengiriman, mis. {{unixTimestamp}}, {{relativeTime}}, atau \"{{naturalLanguage}}\" (hanya Inggris)", + "publish_dialog_other_features": "Fitur lainnya:", + "publish_dialog_chip_click_label": "Klik URL", + "publish_dialog_chip_email_label": "Teruskan ke email", + "publish_dialog_chip_attach_url_label": "Lampirkan file dengan URL", + "publish_dialog_chip_attach_file_label": "Lampirkan file lokal", + "publish_dialog_chip_delay_label": "Jeda pengiriman", + "publish_dialog_button_cancel": "Batal", + "publish_dialog_details_examples_description": "Untuk contoh dan deskripsi yang rinci oleh semua fitur pengiriman, lihat dokumentasi.", + "publish_dialog_checkbox_publish_another": "Publikasi yang lain", + "publish_dialog_attached_file_title": "File yang dilampirkan:", + "publish_dialog_attached_file_filename_placeholder": "Nama file lampiran", + "publish_dialog_drop_file_here": "Lepaskan file di sini", + "emoji_picker_search_placeholder": "Cari emoji", + "subscribe_dialog_subscribe_button_cancel": "Batal", + "subscribe_dialog_subscribe_button_subscribe": "Berlangganan", + "subscribe_dialog_error_user_anonymous": "anonim", + "prefs_notifications_min_priority_any": "Prioritas apa saja", + "prefs_notifications_delete_after_title": "Hapus notifikasi", + "prefs_notifications_delete_after_three_hours": "Setelah tiga jam", + "prefs_notifications_delete_after_one_day": "Setelah satu hari", + "prefs_users_add_button": "Tambahkan pengguna", + "prefs_users_dialog_username_label": "Nama pengguna, mis. andi", + "subscribe_dialog_subscribe_title": "Berlangganan ke topik", + "subscribe_dialog_subscribe_topic_placeholder": "Nama topik, mis. pemberitahuan_andi", + "subscribe_dialog_subscribe_use_another_label": "Gunakan server lain", + "subscribe_dialog_login_username_label": "Nama pengguna, mis. Andi", + "subscribe_dialog_login_button_login": "Masuk", + "subscribe_dialog_error_user_not_authorized": "Pengguna {{username}} tidak diizinkan", + "prefs_notifications_title": "Notifikasi", + "prefs_notifications_sound_no_sound": "Tidak ada suara", + "prefs_users_table_user_header": "Pengguna", + "prefs_users_dialog_base_url_label": "URL Layanan, mis. https://ntfy.sh", + "prefs_users_dialog_button_save": "Simpan", + "prefs_appearance_title": "Tampilan", + "subscribe_dialog_login_password_label": "Kata sandi", + "subscribe_dialog_login_button_back": "Kembali", + "prefs_notifications_sound_title": "Suara notifikasi", + "prefs_notifications_min_priority_low_and_higher": "Prioritas rendah dan lebih tinggi", + "prefs_notifications_min_priority_default_and_higher": "Prioritas bawaan dan lebih tinggi", + "prefs_notifications_min_priority_high_and_higher": "Prioritas tinggi dan lebih tinggi", + "prefs_notifications_min_priority_max_only": "Hanya prioritas maks", + "prefs_notifications_delete_after_never": "Tidak pernah", + "prefs_notifications_delete_after_one_week": "Setelah satu minggu", + "prefs_notifications_delete_after_one_month": "Setelah satu bulan", + "prefs_users_title": "Kelola pengguna", + "prefs_users_description": "Tambahkan/hapus pengguna untuk topik yang dilindungi di sini. Dicatat bahwa nama pengguna dan kata sandi disimpan dalam penyimpanan lokal peramban.", + "prefs_users_table_base_url_header": "URL Layanan", + "prefs_users_dialog_title_add": "Tambahkan pengguna", + "prefs_users_dialog_title_edit": "Edit pengguna", + "prefs_users_dialog_password_label": "Kata sandi", + "prefs_users_dialog_button_cancel": "Batal", + "error_boundary_title": "Aduh, ntfy mogok", + "error_boundary_description": "Seharusnya ini tidak terjadi. Maaf sekali tentang hal ini.
Jika Anda punya beberapa menit, silakan laporkan ini di GitHub, atau beritahu kami melalui Discord atau Matrix.", + "error_boundary_stack_trace": "Jejak tumpukan", + "error_boundary_button_copy_stack_trace": "Salin jejak tumpukan", + "prefs_notifications_sound_description_some": "Notifikasi memainkan suara {{sound}} ketika diterima", + "prefs_notifications_min_priority_description_any": "Menampilkan semua notifikasi, apa pun prioritasnya", + "prefs_notifications_min_priority_description_max": "Tampilkan notifikasi jika prioritas adalah 5 (maks)", + "prefs_notifications_delete_after_three_hours_description": "Notifikasi dihapus secara otomatis setelah tiga jam", + "prefs_notifications_delete_after_one_week_description": "Notifikasi dihapus secara otomatis setelah satu minggu", + "prefs_notifications_delete_after_one_month_description": "Notifikasi dihapus secara otomatis setelah satu bulan", + "priority_low": "rendah", + "priority_high": "tinggi", + "priority_max": "maks", + "prefs_notifications_min_priority_description_x_or_higher": "Tampilkan notifikasi jika prioritas {{number}} ({{name}}) atau lebih", + "prefs_notifications_sound_description_none": "Notifikasi tidak boleh memainkan suara apa pun ketika diterima", + "prefs_notifications_delete_after_never_description": "Notifikasi tidak pernah dihapus secara otomatis", + "prefs_notifications_delete_after_one_day_description": "Notifikasi dihapus secara otomatis setelah satu hari", + "priority_default": "bawaan", + "priority_min": "min", + "notifications_actions_not_supported": "Tindakan tidak didukung di aplikasi web", + "notifications_actions_http_request_title": "Kirim {{method}} HTTP ke {{url}}", + "action_bar_show_menu": "Tampilkan menu", + "action_bar_logo_alt": "logo ntfy", + "action_bar_toggle_mute": "Bisu/suarakan notifikasi", + "action_bar_toggle_action_menu": "Buka/tutup menu tindakan", + "message_bar_show_dialog": "Tampilkan dialog publikasi", + "message_bar_publish": "Publikasikan pesan", + "nav_button_muted": "Notifikasi dibisukan", + "nav_button_connecting": "menghubungkan", + "notifications_list": "Daftar notifikasi", + "notifications_list_item": "Notifikasi", + "notifications_mark_read": "Tandai sebagai dibaca", + "notifications_delete": "Hapus", + "notifications_priority_x": "Prioritas {{priority}}", + "notifications_new_indicator": "Notifikasi baru", + "notifications_attachment_image": "Lampiran gambar", + "notifications_attachment_file_image": "file gambar", + "notifications_attachment_file_video": "file", + "notifications_attachment_file_audio": "file audio", + "notifications_attachment_file_app": "file aplikasi Android", + "notifications_attachment_file_document": "dokumen lainnya", + "publish_dialog_emoji_picker_show": "Pilih emoji", + "publish_dialog_topic_reset": "Atur ulang topik", + "publish_dialog_click_reset": "Hapus URL klik", + "publish_dialog_email_reset": "Hapus terusan email", + "publish_dialog_attach_reset": "Hapus URL lampiran", + "publish_dialog_delay_reset": "Hapus pengiriman telat", + "publish_dialog_attached_file_remove": "Hapus file yang dilampirkan", + "emoji_picker_search_clear": "Hapus pencarian", + "subscribe_dialog_subscribe_base_url_label": "URL layanan", + "prefs_notifications_sound_play": "Mainkan suara yang dipilih", + "prefs_users_table": "Tabel pengguna", + "prefs_users_edit_button": "Edit pengguna", + "prefs_users_delete_button": "Hapus pengguna", + "error_boundary_unsupported_indexeddb_description": "Aplikasi web ntfy membutuhkan IndexedDB untuk berfungsi, dan peramban Anda tidak mendukung IndexedDB dalam mode penjelajahan pribadi.

Meskipun ini disayangkan, penggunaan aplikasi web ntfy juga tidak masuk akal di mode penjelajahan pribadi, karena semuanya disimpan di penyimpanan peramban. Anda dapat membaca lebih lanjut tentangnya di masalah GitHub ini, atau berbicara dengan kami di Discord atau Matrix.", + "error_boundary_unsupported_indexeddb_title": "Penjelajahan privat tidak didukung" } diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 0c26ac98..b9a67cc6 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -1,191 +1,191 @@ { - "action_bar_logo_alt": "logo ntfy", - "action_bar_settings": "Impostazioni", - "action_bar_clear_notifications": "Cancella tutte le notifiche", - "action_bar_unsubscribe": "Annulla l'iscrizione", - "action_bar_toggle_action_menu": "Apri/chiudi il menu delle azioni", - "message_bar_type_message": "Digita un messaggio qui", - "message_bar_error_publishing": "Errore durante la pubblicazione della notifica", - "message_bar_show_dialog": "Mostra la finestra di dialogo di pubblicazione", - "message_bar_publish": "Pubblica messaggio", - "nav_topics_title": "Topic a cui si è iscritti", - "nav_button_all_notifications": "Tutte le notifiche", - "nav_button_settings": "Impostazioni", - "nav_button_publish_message": "Pubblica notifica", - "nav_button_subscribe": "Iscriviti al topic", - "nav_button_muted": "Notifiche disattivate", - "nav_button_connecting": "connessione", - "alert_grant_title": "Le notifiche sono disabilitate", - "alert_grant_button": "Concedi ora", - "notifications_list": "Elenco notifiche", - "notifications_list_item": "Notifiche", - "notifications_mark_read": "Segna come letto", - "notifications_delete": "Elimina", - "notifications_copied_to_clipboard": "Copiato negli appunti", - "notifications_tags": "Tags", - "notifications_priority_x": "Priorità {{priority}}", - "notifications_new_indicator": "Nuova notifica", - "notifications_attachment_image": "Immagine allegata", - "notifications_attachment_copy_url_title": "Copia l'URL dell'allegato negli appunti", - "notifications_attachment_copy_url_button": "Copia URL", - "notifications_attachment_open_title": "Vai a {{url}}", - "notifications_attachment_open_button": "Apri allegato", - "notifications_attachment_link_expires": "Il collegamento scade il {{date}}", - "notifications_attachment_link_expired": "link per il download scaduto", - "notifications_attachment_file_image": "file immagine", - "notifications_attachment_file_video": "file video", - "action_bar_toggle_mute": "Abilita/disabilita le notifiche", - "notifications_attachment_file_document": "altro documento", - "notifications_click_copy_url_button": "Copia link", - "notifications_click_open_button": "Apri link", - "notifications_actions_open_url_title": "Vai a {{url}}", - "notifications_actions_not_supported": "Azione non supportata nell'app Web", - "notifications_none_for_topic_title": "Non hai ancora ricevuto alcuna notifica per questo topic.", - "notifications_none_for_topic_description": "Per inviare notifiche a questo argomento, è sufficiente PUT o POST all'URL del topic.", - "notifications_none_for_any_title": "Non hai ricevuto alcuna notifica.", - "notifications_no_subscriptions_title": "Sembra che tu non abbia ancora abbonamenti.", - "notifications_example": "Esempio", - "notifications_more_details": "Per ulteriori informazioni, consulta il sito web o documentazione.", - "notifications_loading": "Caricamento notifiche in corso…", - "publish_dialog_title_topic": "Pubblica su {{topic}}", - "publish_dialog_title_no_topic": "Pubblica notifica", - "publish_dialog_progress_uploading": "Caricamento in corso…", - "publish_dialog_progress_uploading_detail": "Caricamento {{loaded}}/{{total}} ({{percent}}%)…", - "publish_dialog_message_published": "Notifica pubblicata", - "publish_dialog_attachment_limits_file_and_quota_reached": "supera {{fileSizeLimit}} limite di file e quota, {{remainingBytes}} rimanenti", - "publish_dialog_attachment_limits_file_reached": "supera di {{fileSizeLimit}} il limite dei file", - "publish_dialog_attachment_limits_quota_reached": "supera la quota, {{remainingBytes}} rimanenti", - "publish_dialog_emoji_picker_show": "Scegli emoji", - "publish_dialog_priority_min": "Min. priorità", - "publish_dialog_priority_low": "Bassa priorità", - "publish_dialog_priority_default": "Priorità predefinita", - "publish_dialog_priority_high": "Priorità alta", - "publish_dialog_priority_max": "Max. priorità", - "publish_dialog_base_url_label": "URL del servizio", - "publish_dialog_base_url_placeholder": "URL del servizio, ad es. https://esempio.com", - "publish_dialog_topic_label": "Nome topic", - "publish_dialog_topic_placeholder": "Nome topic, ad es. avvisi_di_phil", - "publish_dialog_topic_reset": "Reset topic", - "publish_dialog_title_label": "Titolo", - "publish_dialog_title_placeholder": "Titolo della notifica, ad es. Avviso di spazio su disco", - "publish_dialog_message_label": "Messaggio", - "publish_dialog_message_placeholder": "Digita un messaggio qui", - "publish_dialog_tags_label": "Tags", - "publish_dialog_priority_label": "Priorità", - "publish_dialog_click_label": "Clicca URL", - "publish_dialog_click_reset": "Rimuovi l'URL del clic", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Indirizzo a cui inoltrare la notifica, ad es. phil@example.com", - "publish_dialog_email_reset": "Rimuovi inoltro email", - "publish_dialog_attach_label": "URL Allegato", - "publish_dialog_attach_reset": "Rimuovi l'URL dell'allegato", - "publish_dialog_filename_label": "Nome del file", - "publish_dialog_filename_placeholder": "Nome file allegato", - "publish_dialog_delay_placeholder": "Consegna ritardata, ad es. {{unixTimestamp}}, {{relativeTime}} o \"{{naturalLanguage}}\" (solo in inglese)", - "publish_dialog_delay_reset": "Rimuovere la consegna ritardata", - "publish_dialog_other_features": "Altre funzionalità:", - "publish_dialog_chip_click_label": "Fare clic su URL", - "publish_dialog_chip_email_label": "Inoltra a e-mail", - "publish_dialog_chip_attach_url_label": "Allega il file tramite URL", - "publish_dialog_chip_attach_file_label": "Allega file locale", - "publish_dialog_chip_delay_label": "Ritardo nella consegna", - "publish_dialog_button_cancel_sending": "Annulla l'invio", - "publish_dialog_button_cancel": "Annulla", - "publish_dialog_button_send": "Invia", - "publish_dialog_checkbox_publish_another": "Pubblica un altro", - "publish_dialog_attached_file_title": "File allegato:", - "publish_dialog_attached_file_remove": "Rimuovi il file allegato", - "publish_dialog_drop_file_here": "Trascina il file qui", - "emoji_picker_search_clear": "Cancella ricerca", - "subscribe_dialog_subscribe_title": "Iscriviti al topic", - "subscribe_dialog_subscribe_topic_placeholder": "Nome dell'argomento, ad es. avvisi_di_phil", - "subscribe_dialog_subscribe_base_url_label": "URL del servizio", - "subscribe_dialog_subscribe_button_cancel": "Annulla", - "subscribe_dialog_login_title": "Accesso richiesto", - "subscribe_dialog_login_username_label": "Nome utente, ad es. phil", - "subscribe_dialog_login_button_login": "Login", - "subscribe_dialog_error_user_anonymous": "anonimo", - "prefs_notifications_sound_title": "Suono di notifica", - "prefs_notifications_sound_description_some": "Le notifiche riproducono il suono {{sound}} quando arrivano", - "prefs_notifications_sound_no_sound": "Nessun suono", - "prefs_notifications_min_priority_description_any": "Visualizzazione di tutte le notifiche, indipendentemente dalla priorità", - "prefs_notifications_min_priority_description_max": "Mostra notifiche se la priorità è 5 (max)", - "prefs_notifications_min_priority_any": "Qualsiasi priorità", - "prefs_notifications_min_priority_low_and_higher": "Priorità bassa e superiore", - "prefs_notifications_min_priority_high_and_higher": "Priorità alta e superiore", - "prefs_notifications_min_priority_max_only": "Solo priorità massima", - "prefs_notifications_delete_after_never": "Mai", - "prefs_notifications_delete_after_three_hours": "Dopo tre ore", - "prefs_notifications_delete_after_one_day": "Dopo un giorno", - "prefs_notifications_delete_after_never_description": "Le notifiche non vengono mai eliminate automaticamente", - "prefs_notifications_delete_after_one_day_description": "Le notifiche vengono eliminate automaticamente dopo un giorno", - "prefs_notifications_delete_after_one_week_description": "Le notifiche vengono eliminate automaticamente dopo una settimana", - "prefs_notifications_delete_after_one_month_description": "Le notifiche vengono eliminate automaticamente dopo un mese", - "prefs_users_title": "Gestisci gli utenti", - "prefs_users_description": "Aggiungi/rimuovi utenti per i tuoi topic protetti qui. Tieni presente che nome utente e password sono memorizzati nella memoria locale del browser.", - "prefs_users_table": "Tabella utenti", - "prefs_users_add_button": "Aggiungi utente", - "prefs_users_edit_button": "Modifica utente", - "prefs_users_delete_button": "Elimina utente", - "prefs_users_table_user_header": "Utente", - "prefs_users_table_base_url_header": "URL del servizio", - "prefs_users_dialog_title_add": "Aggiungi utente", - "prefs_users_dialog_title_edit": "Modifica utente", - "prefs_users_dialog_base_url_label": "URL del servizio, ad es. https://ntfy.sh", - "prefs_users_dialog_username_label": "Nome utente, ad es. phil", - "prefs_users_dialog_password_label": "Password", - "prefs_users_dialog_button_cancel": "Annulla", - "prefs_users_dialog_button_add": "Aggiungere", - "prefs_users_dialog_button_save": "Salva", - "prefs_appearance_title": "Aspetto", - "prefs_appearance_language_title": "Lingua", - "priority_min": "min", - "priority_low": "basso", - "priority_default": "predefinito", - "priority_high": "alto", - "priority_max": "max", - "error_boundary_title": "Oh no, ntfy è andato in crash", - "error_boundary_description": "Questo ovviamente non dovrebbe accadere. Mi dispiace molto per questo.
Se hai un minuto, per favore segnala su GitHub, o faccelo sapere tramite Discord o Matrix .", - "error_boundary_button_copy_stack_trace": "Copia traccia dello stack", - "error_boundary_stack_trace": "Traccia dello stack", - "error_boundary_gathering_info": "Raccogli più informazioni…", - "error_boundary_unsupported_indexeddb_title": "Navigazione privata non supportata", - "action_bar_show_menu": "Mostra menu", - "action_bar_send_test_notification": "Inviare una notifica di prova", - "alert_not_supported_description": "Le notifiche non sono supportate nel tuo browser.", - "nav_button_documentation": "Documentazione", - "notifications_actions_http_request_title": "Invia HTTP {{method}} a {{url}}", - "alert_grant_description": "Concedi al tuo browser l'autorizzazione a visualizzare le notifiche sul desktop.", - "alert_not_supported_title": "Notifiche non supportate", - "notifications_attachment_file_app": "file app Android", - "notifications_no_subscriptions_description": "Fai clic sul link \"{{linktext}}\" per creare o iscriverti a un topic. Successivamente, puoi inviare messaggi tramite PUT o POST e riceverai le notifiche qui.", - "notifications_attachment_file_audio": "file audio", - "notifications_none_for_any_description": "Per inviare notifiche a un topic, è sufficiente PUT o POST all'URL del topic. Ecco un esempio utilizzando uno dei tuoi topic.", - "notifications_click_copy_url_title": "Copia l'URL del collegamento negli appunti", - "prefs_notifications_sound_description_none": "Le notifiche non emettono alcun suono quando arrivano", - "publish_dialog_delay_label": "Ritardo", - "publish_dialog_tags_placeholder": "Elenco di tag separato da virgole, ad es. avviso, backup-srv1", - "publish_dialog_click_placeholder": "URL che viene aperto quando si fa clic sulla notifica", - "publish_dialog_attach_placeholder": "Allega file tramite URL, ad es. https://f-droid.org/F-Droid.apk", - "publish_dialog_chip_topic_label": "Cambia topic", - "publish_dialog_details_examples_description": "Per esempi e una descrizione dettagliata di tutte le funzioni di invio, fare riferimento alla documentazione.", - "publish_dialog_attached_file_filename_placeholder": "Nome file allegato", - "emoji_picker_search_placeholder": "Cerca emoji", - "subscribe_dialog_subscribe_description": "Gli argomenti potrebbero non essere protetti da password, quindi scegli un nome che non sia facile da indovinare. Una volta iscritto, puoi inviare le notifiche tramite PUT/POST.", - "subscribe_dialog_subscribe_use_another_label": "Usa un altro server", - "subscribe_dialog_login_password_label": "Password", - "subscribe_dialog_subscribe_button_subscribe": "Iscriviti", - "prefs_notifications_sound_play": "Riproduci il suono selezionato", - "prefs_notifications_min_priority_title": "Priorità minima", - "subscribe_dialog_login_description": "Questo argomento è protetto da password. Per favore inserisci username e password per iscriverti.", - "subscribe_dialog_login_button_back": "Indietro", - "subscribe_dialog_error_user_not_authorized": "Utente {{username}} non autorizzato", - "prefs_notifications_title": "Notifiche", - "prefs_notifications_delete_after_title": "Elimina le notifiche", - "prefs_notifications_min_priority_default_and_higher": "Priorità predefinita e superiore", - "prefs_notifications_min_priority_description_x_or_higher": "Mostra le notifiche se la priorità è {{number}} ({{name}}) o superiore", - "prefs_notifications_delete_after_one_week": "Dopo una settimana", - "prefs_notifications_delete_after_one_month": "Dopo un mese", - "prefs_notifications_delete_after_three_hours_description": "Le notifiche vengono eliminate automaticamente dopo tre ore", - "error_boundary_unsupported_indexeddb_description": "L'app web ntfy ha bisogno di IndexedDB per funzionare e il tuo browser non supporta IndexedDB in modalità di navigazione privata.

Anche se questo è un peccato, non ha molto senso usare il web ntfy app in modalità di navigazione privata comunque, perché tutto è archiviato nella memoria del browser. Puoi leggere di più a riguardo in questo numero di GitHub o parlarci su Discord o Matrix." + "action_bar_logo_alt": "logo ntfy", + "action_bar_settings": "Impostazioni", + "action_bar_clear_notifications": "Cancella tutte le notifiche", + "action_bar_unsubscribe": "Annulla l'iscrizione", + "action_bar_toggle_action_menu": "Apri/chiudi il menu delle azioni", + "message_bar_type_message": "Digita un messaggio qui", + "message_bar_error_publishing": "Errore durante la pubblicazione della notifica", + "message_bar_show_dialog": "Mostra la finestra di dialogo di pubblicazione", + "message_bar_publish": "Pubblica messaggio", + "nav_topics_title": "Topic a cui si è iscritti", + "nav_button_all_notifications": "Tutte le notifiche", + "nav_button_settings": "Impostazioni", + "nav_button_publish_message": "Pubblica notifica", + "nav_button_subscribe": "Iscriviti al topic", + "nav_button_muted": "Notifiche disattivate", + "nav_button_connecting": "connessione", + "alert_grant_title": "Le notifiche sono disabilitate", + "alert_grant_button": "Concedi ora", + "notifications_list": "Elenco notifiche", + "notifications_list_item": "Notifiche", + "notifications_mark_read": "Segna come letto", + "notifications_delete": "Elimina", + "notifications_copied_to_clipboard": "Copiato negli appunti", + "notifications_tags": "Tags", + "notifications_priority_x": "Priorità {{priority}}", + "notifications_new_indicator": "Nuova notifica", + "notifications_attachment_image": "Immagine allegata", + "notifications_attachment_copy_url_title": "Copia l'URL dell'allegato negli appunti", + "notifications_attachment_copy_url_button": "Copia URL", + "notifications_attachment_open_title": "Vai a {{url}}", + "notifications_attachment_open_button": "Apri allegato", + "notifications_attachment_link_expires": "Il collegamento scade il {{date}}", + "notifications_attachment_link_expired": "link per il download scaduto", + "notifications_attachment_file_image": "file immagine", + "notifications_attachment_file_video": "file video", + "action_bar_toggle_mute": "Abilita/disabilita le notifiche", + "notifications_attachment_file_document": "altro documento", + "notifications_click_copy_url_button": "Copia link", + "notifications_click_open_button": "Apri link", + "notifications_actions_open_url_title": "Vai a {{url}}", + "notifications_actions_not_supported": "Azione non supportata nell'app Web", + "notifications_none_for_topic_title": "Non hai ancora ricevuto alcuna notifica per questo topic.", + "notifications_none_for_topic_description": "Per inviare notifiche a questo argomento, è sufficiente PUT o POST all'URL del topic.", + "notifications_none_for_any_title": "Non hai ricevuto alcuna notifica.", + "notifications_no_subscriptions_title": "Sembra che tu non abbia ancora abbonamenti.", + "notifications_example": "Esempio", + "notifications_more_details": "Per ulteriori informazioni, consulta il sito web o documentazione.", + "notifications_loading": "Caricamento notifiche in corso…", + "publish_dialog_title_topic": "Pubblica su {{topic}}", + "publish_dialog_title_no_topic": "Pubblica notifica", + "publish_dialog_progress_uploading": "Caricamento in corso…", + "publish_dialog_progress_uploading_detail": "Caricamento {{loaded}}/{{total}} ({{percent}}%)…", + "publish_dialog_message_published": "Notifica pubblicata", + "publish_dialog_attachment_limits_file_and_quota_reached": "supera {{fileSizeLimit}} limite di file e quota, {{remainingBytes}} rimanenti", + "publish_dialog_attachment_limits_file_reached": "supera di {{fileSizeLimit}} il limite dei file", + "publish_dialog_attachment_limits_quota_reached": "supera la quota, {{remainingBytes}} rimanenti", + "publish_dialog_emoji_picker_show": "Scegli emoji", + "publish_dialog_priority_min": "Min. priorità", + "publish_dialog_priority_low": "Bassa priorità", + "publish_dialog_priority_default": "Priorità predefinita", + "publish_dialog_priority_high": "Priorità alta", + "publish_dialog_priority_max": "Max. priorità", + "publish_dialog_base_url_label": "URL del servizio", + "publish_dialog_base_url_placeholder": "URL del servizio, ad es. https://esempio.com", + "publish_dialog_topic_label": "Nome topic", + "publish_dialog_topic_placeholder": "Nome topic, ad es. avvisi_di_phil", + "publish_dialog_topic_reset": "Reset topic", + "publish_dialog_title_label": "Titolo", + "publish_dialog_title_placeholder": "Titolo della notifica, ad es. Avviso di spazio su disco", + "publish_dialog_message_label": "Messaggio", + "publish_dialog_message_placeholder": "Digita un messaggio qui", + "publish_dialog_tags_label": "Tags", + "publish_dialog_priority_label": "Priorità", + "publish_dialog_click_label": "Clicca URL", + "publish_dialog_click_reset": "Rimuovi l'URL del clic", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Indirizzo a cui inoltrare la notifica, ad es. phil@example.com", + "publish_dialog_email_reset": "Rimuovi inoltro email", + "publish_dialog_attach_label": "URL Allegato", + "publish_dialog_attach_reset": "Rimuovi l'URL dell'allegato", + "publish_dialog_filename_label": "Nome del file", + "publish_dialog_filename_placeholder": "Nome file allegato", + "publish_dialog_delay_placeholder": "Consegna ritardata, ad es. {{unixTimestamp}}, {{relativeTime}} o \"{{naturalLanguage}}\" (solo in inglese)", + "publish_dialog_delay_reset": "Rimuovere la consegna ritardata", + "publish_dialog_other_features": "Altre funzionalità:", + "publish_dialog_chip_click_label": "Fare clic su URL", + "publish_dialog_chip_email_label": "Inoltra a e-mail", + "publish_dialog_chip_attach_url_label": "Allega il file tramite URL", + "publish_dialog_chip_attach_file_label": "Allega file locale", + "publish_dialog_chip_delay_label": "Ritardo nella consegna", + "publish_dialog_button_cancel_sending": "Annulla l'invio", + "publish_dialog_button_cancel": "Annulla", + "publish_dialog_button_send": "Invia", + "publish_dialog_checkbox_publish_another": "Pubblica un altro", + "publish_dialog_attached_file_title": "File allegato:", + "publish_dialog_attached_file_remove": "Rimuovi il file allegato", + "publish_dialog_drop_file_here": "Trascina il file qui", + "emoji_picker_search_clear": "Cancella ricerca", + "subscribe_dialog_subscribe_title": "Iscriviti al topic", + "subscribe_dialog_subscribe_topic_placeholder": "Nome dell'argomento, ad es. avvisi_di_phil", + "subscribe_dialog_subscribe_base_url_label": "URL del servizio", + "subscribe_dialog_subscribe_button_cancel": "Annulla", + "subscribe_dialog_login_title": "Accesso richiesto", + "subscribe_dialog_login_username_label": "Nome utente, ad es. phil", + "subscribe_dialog_login_button_login": "Login", + "subscribe_dialog_error_user_anonymous": "anonimo", + "prefs_notifications_sound_title": "Suono di notifica", + "prefs_notifications_sound_description_some": "Le notifiche riproducono il suono {{sound}} quando arrivano", + "prefs_notifications_sound_no_sound": "Nessun suono", + "prefs_notifications_min_priority_description_any": "Visualizzazione di tutte le notifiche, indipendentemente dalla priorità", + "prefs_notifications_min_priority_description_max": "Mostra notifiche se la priorità è 5 (max)", + "prefs_notifications_min_priority_any": "Qualsiasi priorità", + "prefs_notifications_min_priority_low_and_higher": "Priorità bassa e superiore", + "prefs_notifications_min_priority_high_and_higher": "Priorità alta e superiore", + "prefs_notifications_min_priority_max_only": "Solo priorità massima", + "prefs_notifications_delete_after_never": "Mai", + "prefs_notifications_delete_after_three_hours": "Dopo tre ore", + "prefs_notifications_delete_after_one_day": "Dopo un giorno", + "prefs_notifications_delete_after_never_description": "Le notifiche non vengono mai eliminate automaticamente", + "prefs_notifications_delete_after_one_day_description": "Le notifiche vengono eliminate automaticamente dopo un giorno", + "prefs_notifications_delete_after_one_week_description": "Le notifiche vengono eliminate automaticamente dopo una settimana", + "prefs_notifications_delete_after_one_month_description": "Le notifiche vengono eliminate automaticamente dopo un mese", + "prefs_users_title": "Gestisci gli utenti", + "prefs_users_description": "Aggiungi/rimuovi utenti per i tuoi topic protetti qui. Tieni presente che nome utente e password sono memorizzati nella memoria locale del browser.", + "prefs_users_table": "Tabella utenti", + "prefs_users_add_button": "Aggiungi utente", + "prefs_users_edit_button": "Modifica utente", + "prefs_users_delete_button": "Elimina utente", + "prefs_users_table_user_header": "Utente", + "prefs_users_table_base_url_header": "URL del servizio", + "prefs_users_dialog_title_add": "Aggiungi utente", + "prefs_users_dialog_title_edit": "Modifica utente", + "prefs_users_dialog_base_url_label": "URL del servizio, ad es. https://ntfy.sh", + "prefs_users_dialog_username_label": "Nome utente, ad es. phil", + "prefs_users_dialog_password_label": "Password", + "prefs_users_dialog_button_cancel": "Annulla", + "prefs_users_dialog_button_add": "Aggiungere", + "prefs_users_dialog_button_save": "Salva", + "prefs_appearance_title": "Aspetto", + "prefs_appearance_language_title": "Lingua", + "priority_min": "min", + "priority_low": "basso", + "priority_default": "predefinito", + "priority_high": "alto", + "priority_max": "max", + "error_boundary_title": "Oh no, ntfy è andato in crash", + "error_boundary_description": "Questo ovviamente non dovrebbe accadere. Mi dispiace molto per questo.
Se hai un minuto, per favore segnala su GitHub, o faccelo sapere tramite Discord o Matrix .", + "error_boundary_button_copy_stack_trace": "Copia traccia dello stack", + "error_boundary_stack_trace": "Traccia dello stack", + "error_boundary_gathering_info": "Raccogli più informazioni…", + "error_boundary_unsupported_indexeddb_title": "Navigazione privata non supportata", + "action_bar_show_menu": "Mostra menu", + "action_bar_send_test_notification": "Inviare una notifica di prova", + "alert_not_supported_description": "Le notifiche non sono supportate nel tuo browser.", + "nav_button_documentation": "Documentazione", + "notifications_actions_http_request_title": "Invia HTTP {{method}} a {{url}}", + "alert_grant_description": "Concedi al tuo browser l'autorizzazione a visualizzare le notifiche sul desktop.", + "alert_not_supported_title": "Notifiche non supportate", + "notifications_attachment_file_app": "file app Android", + "notifications_no_subscriptions_description": "Fai clic sul link \"{{linktext}}\" per creare o iscriverti a un topic. Successivamente, puoi inviare messaggi tramite PUT o POST e riceverai le notifiche qui.", + "notifications_attachment_file_audio": "file audio", + "notifications_none_for_any_description": "Per inviare notifiche a un topic, è sufficiente PUT o POST all'URL del topic. Ecco un esempio utilizzando uno dei tuoi topic.", + "notifications_click_copy_url_title": "Copia l'URL del collegamento negli appunti", + "prefs_notifications_sound_description_none": "Le notifiche non emettono alcun suono quando arrivano", + "publish_dialog_delay_label": "Ritardo", + "publish_dialog_tags_placeholder": "Elenco di tag separato da virgole, ad es. avviso, backup-srv1", + "publish_dialog_click_placeholder": "URL che viene aperto quando si fa clic sulla notifica", + "publish_dialog_attach_placeholder": "Allega file tramite URL, ad es. https://f-droid.org/F-Droid.apk", + "publish_dialog_chip_topic_label": "Cambia topic", + "publish_dialog_details_examples_description": "Per esempi e una descrizione dettagliata di tutte le funzioni di invio, fare riferimento alla documentazione.", + "publish_dialog_attached_file_filename_placeholder": "Nome file allegato", + "emoji_picker_search_placeholder": "Cerca emoji", + "subscribe_dialog_subscribe_description": "Gli argomenti potrebbero non essere protetti da password, quindi scegli un nome che non sia facile da indovinare. Una volta iscritto, puoi inviare le notifiche tramite PUT/POST.", + "subscribe_dialog_subscribe_use_another_label": "Usa un altro server", + "subscribe_dialog_login_password_label": "Password", + "subscribe_dialog_subscribe_button_subscribe": "Iscriviti", + "prefs_notifications_sound_play": "Riproduci il suono selezionato", + "prefs_notifications_min_priority_title": "Priorità minima", + "subscribe_dialog_login_description": "Questo argomento è protetto da password. Per favore inserisci username e password per iscriverti.", + "subscribe_dialog_login_button_back": "Indietro", + "subscribe_dialog_error_user_not_authorized": "Utente {{username}} non autorizzato", + "prefs_notifications_title": "Notifiche", + "prefs_notifications_delete_after_title": "Elimina le notifiche", + "prefs_notifications_min_priority_default_and_higher": "Priorità predefinita e superiore", + "prefs_notifications_min_priority_description_x_or_higher": "Mostra le notifiche se la priorità è {{number}} ({{name}}) o superiore", + "prefs_notifications_delete_after_one_week": "Dopo una settimana", + "prefs_notifications_delete_after_one_month": "Dopo un mese", + "prefs_notifications_delete_after_three_hours_description": "Le notifiche vengono eliminate automaticamente dopo tre ore", + "error_boundary_unsupported_indexeddb_description": "L'app web ntfy ha bisogno di IndexedDB per funzionare e il tuo browser non supporta IndexedDB in modalità di navigazione privata.

Anche se questo è un peccato, non ha molto senso usare il web ntfy app in modalità di navigazione privata comunque, perché tutto è archiviato nella memoria del browser. Puoi leggere di più a riguardo in questo numero di GitHub o parlarci su Discord o Matrix." } diff --git a/web/public/static/langs/ja.json b/web/public/static/langs/ja.json index f1d0ccc0..95bc3ec0 100644 --- a/web/public/static/langs/ja.json +++ b/web/public/static/langs/ja.json @@ -1,191 +1,191 @@ { - "message_bar_error_publishing": "通知送信エラー", - "nav_button_all_notifications": "全ての通知", - "nav_button_settings": "設定", - "notifications_click_open_button": "リンクを開く", - "action_bar_send_test_notification": "テスト通知を送信", - "action_bar_clear_notifications": "全ての通知を消去", - "action_bar_unsubscribe": "購読解除", - "nav_button_documentation": "ドキュメント", - "alert_not_supported_description": "通知機能はこのブラウザではサポートされていません。", - "notifications_copied_to_clipboard": "クリップボードにコピーしました", - "notifications_example": "例", - "publish_dialog_title_topic": "{{topic}}に送信", - "publish_dialog_title_no_topic": "通知を送信", - "publish_dialog_progress_uploading": "アップロード中…", - "publish_dialog_progress_uploading_detail": "アップロード中 {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "通知を送信しました", - "publish_dialog_title_label": "タイトル", - "publish_dialog_filename_label": "ファイル名", - "subscribe_dialog_login_description": "このトピックはログインする必要があります。ユーザー名とパスワードを入力してください。", - "subscribe_dialog_login_username_label": "ユーザー名, 例) phil", - "subscribe_dialog_login_password_label": "パスワード", - "subscribe_dialog_login_button_back": "戻る", - "subscribe_dialog_login_button_login": "ログイン", - "prefs_notifications_min_priority_high_and_higher": "優先度高 およびそれ以上", - "prefs_notifications_min_priority_max_only": "優先度最高のみ", - "action_bar_settings": "設定", - "message_bar_type_message": "メッセージを入力してください", - "nav_topics_title": "購読しているトピック", - "nav_button_subscribe": "トピックを購読", - "alert_grant_description": "ブラウザのデスクトップ通知を許可してください。", - "alert_grant_button": "許可する", - "notifications_attachment_link_expires": "リンクは {{date}} に失効します", - "notifications_click_copy_url_button": "リンクをコピー", - "notifications_none_for_topic_description": "トピックに通知を送信するには、トピックのURLにPUTかPOSTしてください。", - "nav_button_publish_message": "通知を送信", - "alert_grant_title": "通知は無効化されています", - "alert_not_supported_title": "通知機能はサポートされていません", - "notifications_tags": "タグ", - "notifications_attachment_copy_url_button": "URLをコピー", - "notifications_attachment_open_title": "{{url}} に移動", - "notifications_attachment_link_expired": "ダウンロードリンクは失効しました", - "notifications_actions_open_url_title": "{{url}} に移動", - "notifications_attachment_copy_url_title": "添付URLをクリップボードにコピー", - "notifications_attachment_open_button": "添付ファイルを開く", - "notifications_click_copy_url_title": "リンクURLをクリップボードにコピー", - "notifications_none_for_topic_title": "このトピックではまだ通知を受信していません。", - "notifications_no_subscriptions_description": "「{{linktext}}」リンクをクリックしてトピックを作成または購読してください。その後、メッセージをPUTまたはPOSTで送信すると通知が受信できます。", - "publish_dialog_message_label": "メッセージ", - "publish_dialog_email_label": "メール", - "notifications_none_for_any_title": "まだ通知を受信していません。", - "publish_dialog_priority_max": "優先度 最高", - "publish_dialog_button_cancel_sending": "送信をキャンセル", - "publish_dialog_attach_label": "添付URL", - "notifications_none_for_any_description": "トピックに通知を送信するには、トピックURLにPUTまたはPOSTしてください。トピックのひとつを利用した例を示します。", - "notifications_no_subscriptions_title": "まだ何も購読していないようです。", - "publish_dialog_attachment_limits_file_and_quota_reached": "ファイル制限とクォータ {{fileSizeLimit}} を超えました、残り {{remainingBytes}}", - "publish_dialog_priority_label": "優先度", - "publish_dialog_click_label": "クリックURL", - "publish_dialog_email_placeholder": "通知を転送するアドレス, 例) phil@example.com", - "notifications_more_details": "詳しい情報は、ウェブサイト または ドキュメント を参照してください。", - "publish_dialog_attachment_limits_file_reached": "ファイルサイズ制限 {{fileSizeLimit}} を超えました", - "publish_dialog_priority_min": "優先度 最低", - "publish_dialog_priority_low": "優先度 低", - "publish_dialog_priority_default": "優先度 通常", - "publish_dialog_base_url_label": "サービスURL", - "publish_dialog_other_features": "他の機能:", - "notifications_loading": "通知を読み込み中…", - "publish_dialog_attachment_limits_quota_reached": "クォータを超過しました、残り{{remainingBytes}}", - "publish_dialog_priority_high": "優先度 高", - "publish_dialog_topic_placeholder": "トピック名の例 phil_alerts", - "publish_dialog_title_placeholder": "通知タイトル 例: ディスクスペース警告", - "publish_dialog_message_placeholder": "メッセージ本文を入力してください", - "publish_dialog_tags_label": "タグ", - "publish_dialog_tags_placeholder": "コンマ区切りでタグを列挙してください 例: warning, srv1-backup", - "publish_dialog_topic_label": "トピック名", - "publish_dialog_delay_label": "遅延", - "publish_dialog_click_placeholder": "通知をクリックしたときに開くURL", - "publish_dialog_filename_placeholder": "添付ファイルの名称", - "publish_dialog_button_send": "送信", - "publish_dialog_chip_click_label": "Click URL", - "publish_dialog_chip_email_label": "メールに転送", - "publish_dialog_details_examples_description": "送信機能の例や詳細な説明については、ドキュメントを参照してください。", - "error_boundary_description": "明らかに起きてはならないことです。本当に申し訳ありません。
もし時間があれば、GitHubにこれを報告するか、DiscordまたはMatrixで我々に知らせて下さい。", - "publish_dialog_chip_attach_url_label": "URLでファイルを添付", - "publish_dialog_chip_attach_file_label": "ローカルファイルを添付", - "publish_dialog_chip_topic_label": "トピックを変更", - "publish_dialog_chip_delay_label": "配信を遅延させる", - "publish_dialog_attached_file_title": "添付ファイル:", - "publish_dialog_button_cancel": "キャンセル", - "publish_dialog_checkbox_publish_another": "送信後開いたままにする", - "publish_dialog_attached_file_filename_placeholder": "添付ファイル名", - "emoji_picker_search_placeholder": "絵文字を検索", - "subscribe_dialog_subscribe_title": "トピックを購読", - "prefs_users_title": "ユーザー管理", - "publish_dialog_drop_file_here": "ここにファイルをドロップしてください", - "subscribe_dialog_subscribe_topic_placeholder": "トピック名 例: phils_alerts", - "prefs_notifications_min_priority_any": "全ての優先度", - "prefs_notifications_delete_after_three_hours": "3時間後", - "prefs_users_description": "保護トピックのユーザーを追加/削除できます。ユーザー名とパスワードはブラウザのローカルストレージに保存されることに留意してください。", - "prefs_users_add_button": "ユーザー追加", - "prefs_users_dialog_button_add": "追加", - "subscribe_dialog_subscribe_use_another_label": "他のサーバーを使用", - "subscribe_dialog_error_user_not_authorized": "ユーザー名 {{username}} は許可されていません", - "prefs_notifications_delete_after_one_week": "1週間後", - "prefs_notifications_delete_after_one_month": "1か月後", - "subscribe_dialog_subscribe_description": "トピックはパスワード保護されないので、推測されにくい名前にしてください。購読した後、PUT/POSTで通知を送信できます。", - "subscribe_dialog_subscribe_button_cancel": "キャンセル", - "subscribe_dialog_subscribe_button_subscribe": "購読", - "subscribe_dialog_login_title": "ログインが必要です", - "subscribe_dialog_error_user_anonymous": "匿名", - "prefs_notifications_title": "通知", - "prefs_notifications_min_priority_low_and_higher": "優先度低 およびそれ以上", - "prefs_notifications_delete_after_never": "削除しない", - "prefs_notifications_delete_after_one_day": "1日後", - "prefs_notifications_sound_title": "通知音", - "prefs_notifications_sound_no_sound": "サウンドなし", - "prefs_notifications_min_priority_title": "表示する優先度", - "prefs_notifications_min_priority_default_and_higher": "優先度通常 およびそれ以上", - "prefs_notifications_delete_after_title": "通知を削除", - "prefs_users_dialog_button_cancel": "キャンセル", - "prefs_users_dialog_button_save": "保存", - "prefs_users_table_user_header": "ユーザー名", - "prefs_users_dialog_title_add": "ユーザー追加", - "prefs_users_dialog_title_edit": "ユーザー編集", - "prefs_users_dialog_base_url_label": "サービスURL, 例) https://ntfy.sh", - "prefs_appearance_title": "外観", - "prefs_appearance_language_title": "言語", - "prefs_users_table_base_url_header": "サービスURL", - "prefs_users_dialog_username_label": "ユーザー名, 例) phil", - "prefs_users_dialog_password_label": "パスワード", - "error_boundary_title": "おっと、ntfyがクラッシュしました", - "error_boundary_button_copy_stack_trace": "スタックトレースをコピー", - "error_boundary_stack_trace": "スタックトレース", - "error_boundary_gathering_info": "更に情報を集める…", - "publish_dialog_base_url_placeholder": "サービスURL, 例) https://example.com", - "publish_dialog_attach_placeholder": "添付ファイルをURLで指定, 例) https://f-droid.org/F-Droid.apk", - "publish_dialog_delay_placeholder": "遅延時間, 例) {{unixTimestamp}}, {{relativeTime}}, or \"{{naturalLanguage}}\" (English only)", - "prefs_notifications_sound_description_none": "通知受信時に音を鳴らしません", - "prefs_notifications_sound_description_some": "通知受信時に {{sound}} を鳴らします", - "prefs_notifications_min_priority_description_any": "優先度に関係なく全ての通知を表示します", - "prefs_notifications_min_priority_description_x_or_higher": "優先度が {{number}} ({{name}}) 以上の時に通知を表示します", - "prefs_notifications_delete_after_never_description": "通知は自動的に削除されません", - "prefs_notifications_delete_after_one_day_description": "通知は1日後に自動的に削除されます", - "prefs_notifications_delete_after_one_week_description": "通知は1週間後に自動的に削除されます", - "prefs_notifications_delete_after_one_month_description": "通知は1か月後に自動的に削除されます", - "priority_high": "高", - "priority_max": "最高", - "prefs_notifications_min_priority_description_max": "優先度が 5 (最高) の時にのみ通知を表示します", - "priority_default": "通常", - "prefs_notifications_delete_after_three_hours_description": "通知は3時間後に自動的に削除されます", - "priority_low": "低", - "priority_min": "最低", - "notifications_actions_not_supported": "このアクションはWebアプリではサポートされていません", - "notifications_actions_http_request_title": "{{url}}にHTTP {{method}}を送信", - "prefs_users_edit_button": "ユーザーを編集", - "publish_dialog_attached_file_remove": "添付ファイルを削除", - "error_boundary_unsupported_indexeddb_description": "nfty webアプリは動作にIndexedDBを使用しますが、あなたのブラウザはプライベートブラウジングモード時にIndexedDBをサポートしていません。

これは残念なことですが、ntfy webアプリは全ての情報をブラウザストレージに保存して動作するため、プライベートブラウジングモードで利用するのはあまり意味がないかも知れません。詳細については GitHub issueを参照するか、DiscordMatrixの議論に参加してください。", - "action_bar_show_menu": "メニューを表示", - "action_bar_logo_alt": "ntfyロゴ", - "action_bar_toggle_mute": "通知をミュート/解除", - "action_bar_toggle_action_menu": "動作メニューを開く/閉じる", - "message_bar_show_dialog": "送信ダイアログを表示", - "message_bar_publish": "メッセージを送信", - "nav_button_muted": "ミュートされた通知", - "nav_button_connecting": "接続中", - "notifications_list": "通知一覧", - "notifications_new_indicator": "新しい通知", - "notifications_list_item": "通知", - "notifications_mark_read": "既読にする", - "notifications_delete": "削除", - "notifications_priority_x": "優先度 {{priority}}", - "notifications_attachment_image": "添付画像", - "notifications_attachment_file_image": "画像ファイル", - "notifications_attachment_file_video": "動画ファイル", - "notifications_attachment_file_audio": "音声ファイル", - "notifications_attachment_file_app": "Androidアプリファイル", - "notifications_attachment_file_document": "その他文書", - "publish_dialog_emoji_picker_show": "絵文字", - "publish_dialog_topic_reset": "トピックをリセット", - "publish_dialog_click_reset": "クリックURLを削除", - "publish_dialog_email_reset": "メール転送を削除", - "publish_dialog_attach_reset": "添付URLを削除", - "publish_dialog_delay_reset": "配信遅延を削除", - "emoji_picker_search_clear": "検索をクリア", - "subscribe_dialog_subscribe_base_url_label": "サーバーURL", - "prefs_notifications_sound_play": "選択されたサウンドを再生", - "prefs_users_table": "ユーザー一覧", - "prefs_users_delete_button": "ユーザーを削除", - "error_boundary_unsupported_indexeddb_title": "プライベートブラウジングはサポートされていません" + "message_bar_error_publishing": "通知送信エラー", + "nav_button_all_notifications": "全ての通知", + "nav_button_settings": "設定", + "notifications_click_open_button": "リンクを開く", + "action_bar_send_test_notification": "テスト通知を送信", + "action_bar_clear_notifications": "全ての通知を消去", + "action_bar_unsubscribe": "購読解除", + "nav_button_documentation": "ドキュメント", + "alert_not_supported_description": "通知機能はこのブラウザではサポートされていません。", + "notifications_copied_to_clipboard": "クリップボードにコピーしました", + "notifications_example": "例", + "publish_dialog_title_topic": "{{topic}}に送信", + "publish_dialog_title_no_topic": "通知を送信", + "publish_dialog_progress_uploading": "アップロード中…", + "publish_dialog_progress_uploading_detail": "アップロード中 {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "通知を送信しました", + "publish_dialog_title_label": "タイトル", + "publish_dialog_filename_label": "ファイル名", + "subscribe_dialog_login_description": "このトピックはログインする必要があります。ユーザー名とパスワードを入力してください。", + "subscribe_dialog_login_username_label": "ユーザー名, 例) phil", + "subscribe_dialog_login_password_label": "パスワード", + "subscribe_dialog_login_button_back": "戻る", + "subscribe_dialog_login_button_login": "ログイン", + "prefs_notifications_min_priority_high_and_higher": "優先度高 およびそれ以上", + "prefs_notifications_min_priority_max_only": "優先度最高のみ", + "action_bar_settings": "設定", + "message_bar_type_message": "メッセージを入力してください", + "nav_topics_title": "購読しているトピック", + "nav_button_subscribe": "トピックを購読", + "alert_grant_description": "ブラウザのデスクトップ通知を許可してください。", + "alert_grant_button": "許可する", + "notifications_attachment_link_expires": "リンクは {{date}} に失効します", + "notifications_click_copy_url_button": "リンクをコピー", + "notifications_none_for_topic_description": "トピックに通知を送信するには、トピックのURLにPUTかPOSTしてください。", + "nav_button_publish_message": "通知を送信", + "alert_grant_title": "通知は無効化されています", + "alert_not_supported_title": "通知機能はサポートされていません", + "notifications_tags": "タグ", + "notifications_attachment_copy_url_button": "URLをコピー", + "notifications_attachment_open_title": "{{url}} に移動", + "notifications_attachment_link_expired": "ダウンロードリンクは失効しました", + "notifications_actions_open_url_title": "{{url}} に移動", + "notifications_attachment_copy_url_title": "添付URLをクリップボードにコピー", + "notifications_attachment_open_button": "添付ファイルを開く", + "notifications_click_copy_url_title": "リンクURLをクリップボードにコピー", + "notifications_none_for_topic_title": "このトピックではまだ通知を受信していません。", + "notifications_no_subscriptions_description": "「{{linktext}}」リンクをクリックしてトピックを作成または購読してください。その後、メッセージをPUTまたはPOSTで送信すると通知が受信できます。", + "publish_dialog_message_label": "メッセージ", + "publish_dialog_email_label": "メール", + "notifications_none_for_any_title": "まだ通知を受信していません。", + "publish_dialog_priority_max": "優先度 最高", + "publish_dialog_button_cancel_sending": "送信をキャンセル", + "publish_dialog_attach_label": "添付URL", + "notifications_none_for_any_description": "トピックに通知を送信するには、トピックURLにPUTまたはPOSTしてください。トピックのひとつを利用した例を示します。", + "notifications_no_subscriptions_title": "まだ何も購読していないようです。", + "publish_dialog_attachment_limits_file_and_quota_reached": "ファイル制限とクォータ {{fileSizeLimit}} を超えました、残り {{remainingBytes}}", + "publish_dialog_priority_label": "優先度", + "publish_dialog_click_label": "クリックURL", + "publish_dialog_email_placeholder": "通知を転送するアドレス, 例) phil@example.com", + "notifications_more_details": "詳しい情報は、ウェブサイト または ドキュメント を参照してください。", + "publish_dialog_attachment_limits_file_reached": "ファイルサイズ制限 {{fileSizeLimit}} を超えました", + "publish_dialog_priority_min": "優先度 最低", + "publish_dialog_priority_low": "優先度 低", + "publish_dialog_priority_default": "優先度 通常", + "publish_dialog_base_url_label": "サービスURL", + "publish_dialog_other_features": "他の機能:", + "notifications_loading": "通知を読み込み中…", + "publish_dialog_attachment_limits_quota_reached": "クォータを超過しました、残り{{remainingBytes}}", + "publish_dialog_priority_high": "優先度 高", + "publish_dialog_topic_placeholder": "トピック名の例 phil_alerts", + "publish_dialog_title_placeholder": "通知タイトル 例: ディスクスペース警告", + "publish_dialog_message_placeholder": "メッセージ本文を入力してください", + "publish_dialog_tags_label": "タグ", + "publish_dialog_tags_placeholder": "コンマ区切りでタグを列挙してください 例: warning, srv1-backup", + "publish_dialog_topic_label": "トピック名", + "publish_dialog_delay_label": "遅延", + "publish_dialog_click_placeholder": "通知をクリックしたときに開くURL", + "publish_dialog_filename_placeholder": "添付ファイルの名称", + "publish_dialog_button_send": "送信", + "publish_dialog_chip_click_label": "Click URL", + "publish_dialog_chip_email_label": "メールに転送", + "publish_dialog_details_examples_description": "送信機能の例や詳細な説明については、ドキュメントを参照してください。", + "error_boundary_description": "明らかに起きてはならないことです。本当に申し訳ありません。
もし時間があれば、GitHubにこれを報告するか、DiscordまたはMatrixで我々に知らせて下さい。", + "publish_dialog_chip_attach_url_label": "URLでファイルを添付", + "publish_dialog_chip_attach_file_label": "ローカルファイルを添付", + "publish_dialog_chip_topic_label": "トピックを変更", + "publish_dialog_chip_delay_label": "配信を遅延させる", + "publish_dialog_attached_file_title": "添付ファイル:", + "publish_dialog_button_cancel": "キャンセル", + "publish_dialog_checkbox_publish_another": "送信後開いたままにする", + "publish_dialog_attached_file_filename_placeholder": "添付ファイル名", + "emoji_picker_search_placeholder": "絵文字を検索", + "subscribe_dialog_subscribe_title": "トピックを購読", + "prefs_users_title": "ユーザー管理", + "publish_dialog_drop_file_here": "ここにファイルをドロップしてください", + "subscribe_dialog_subscribe_topic_placeholder": "トピック名 例: phils_alerts", + "prefs_notifications_min_priority_any": "全ての優先度", + "prefs_notifications_delete_after_three_hours": "3時間後", + "prefs_users_description": "保護トピックのユーザーを追加/削除できます。ユーザー名とパスワードはブラウザのローカルストレージに保存されることに留意してください。", + "prefs_users_add_button": "ユーザー追加", + "prefs_users_dialog_button_add": "追加", + "subscribe_dialog_subscribe_use_another_label": "他のサーバーを使用", + "subscribe_dialog_error_user_not_authorized": "ユーザー名 {{username}} は許可されていません", + "prefs_notifications_delete_after_one_week": "1週間後", + "prefs_notifications_delete_after_one_month": "1か月後", + "subscribe_dialog_subscribe_description": "トピックはパスワード保護されないので、推測されにくい名前にしてください。購読した後、PUT/POSTで通知を送信できます。", + "subscribe_dialog_subscribe_button_cancel": "キャンセル", + "subscribe_dialog_subscribe_button_subscribe": "購読", + "subscribe_dialog_login_title": "ログインが必要です", + "subscribe_dialog_error_user_anonymous": "匿名", + "prefs_notifications_title": "通知", + "prefs_notifications_min_priority_low_and_higher": "優先度低 およびそれ以上", + "prefs_notifications_delete_after_never": "削除しない", + "prefs_notifications_delete_after_one_day": "1日後", + "prefs_notifications_sound_title": "通知音", + "prefs_notifications_sound_no_sound": "サウンドなし", + "prefs_notifications_min_priority_title": "表示する優先度", + "prefs_notifications_min_priority_default_and_higher": "優先度通常 およびそれ以上", + "prefs_notifications_delete_after_title": "通知を削除", + "prefs_users_dialog_button_cancel": "キャンセル", + "prefs_users_dialog_button_save": "保存", + "prefs_users_table_user_header": "ユーザー名", + "prefs_users_dialog_title_add": "ユーザー追加", + "prefs_users_dialog_title_edit": "ユーザー編集", + "prefs_users_dialog_base_url_label": "サービスURL, 例) https://ntfy.sh", + "prefs_appearance_title": "外観", + "prefs_appearance_language_title": "言語", + "prefs_users_table_base_url_header": "サービスURL", + "prefs_users_dialog_username_label": "ユーザー名, 例) phil", + "prefs_users_dialog_password_label": "パスワード", + "error_boundary_title": "おっと、ntfyがクラッシュしました", + "error_boundary_button_copy_stack_trace": "スタックトレースをコピー", + "error_boundary_stack_trace": "スタックトレース", + "error_boundary_gathering_info": "更に情報を集める…", + "publish_dialog_base_url_placeholder": "サービスURL, 例) https://example.com", + "publish_dialog_attach_placeholder": "添付ファイルをURLで指定, 例) https://f-droid.org/F-Droid.apk", + "publish_dialog_delay_placeholder": "遅延時間, 例) {{unixTimestamp}}, {{relativeTime}}, or \"{{naturalLanguage}}\" (English only)", + "prefs_notifications_sound_description_none": "通知受信時に音を鳴らしません", + "prefs_notifications_sound_description_some": "通知受信時に {{sound}} を鳴らします", + "prefs_notifications_min_priority_description_any": "優先度に関係なく全ての通知を表示します", + "prefs_notifications_min_priority_description_x_or_higher": "優先度が {{number}} ({{name}}) 以上の時に通知を表示します", + "prefs_notifications_delete_after_never_description": "通知は自動的に削除されません", + "prefs_notifications_delete_after_one_day_description": "通知は1日後に自動的に削除されます", + "prefs_notifications_delete_after_one_week_description": "通知は1週間後に自動的に削除されます", + "prefs_notifications_delete_after_one_month_description": "通知は1か月後に自動的に削除されます", + "priority_high": "高", + "priority_max": "最高", + "prefs_notifications_min_priority_description_max": "優先度が 5 (最高) の時にのみ通知を表示します", + "priority_default": "通常", + "prefs_notifications_delete_after_three_hours_description": "通知は3時間後に自動的に削除されます", + "priority_low": "低", + "priority_min": "最低", + "notifications_actions_not_supported": "このアクションはWebアプリではサポートされていません", + "notifications_actions_http_request_title": "{{url}}にHTTP {{method}}を送信", + "prefs_users_edit_button": "ユーザーを編集", + "publish_dialog_attached_file_remove": "添付ファイルを削除", + "error_boundary_unsupported_indexeddb_description": "nfty webアプリは動作にIndexedDBを使用しますが、あなたのブラウザはプライベートブラウジングモード時にIndexedDBをサポートしていません。

これは残念なことですが、ntfy webアプリは全ての情報をブラウザストレージに保存して動作するため、プライベートブラウジングモードで利用するのはあまり意味がないかも知れません。詳細については GitHub issueを参照するか、DiscordMatrixの議論に参加してください。", + "action_bar_show_menu": "メニューを表示", + "action_bar_logo_alt": "ntfyロゴ", + "action_bar_toggle_mute": "通知をミュート/解除", + "action_bar_toggle_action_menu": "動作メニューを開く/閉じる", + "message_bar_show_dialog": "送信ダイアログを表示", + "message_bar_publish": "メッセージを送信", + "nav_button_muted": "ミュートされた通知", + "nav_button_connecting": "接続中", + "notifications_list": "通知一覧", + "notifications_new_indicator": "新しい通知", + "notifications_list_item": "通知", + "notifications_mark_read": "既読にする", + "notifications_delete": "削除", + "notifications_priority_x": "優先度 {{priority}}", + "notifications_attachment_image": "添付画像", + "notifications_attachment_file_image": "画像ファイル", + "notifications_attachment_file_video": "動画ファイル", + "notifications_attachment_file_audio": "音声ファイル", + "notifications_attachment_file_app": "Androidアプリファイル", + "notifications_attachment_file_document": "その他文書", + "publish_dialog_emoji_picker_show": "絵文字", + "publish_dialog_topic_reset": "トピックをリセット", + "publish_dialog_click_reset": "クリックURLを削除", + "publish_dialog_email_reset": "メール転送を削除", + "publish_dialog_attach_reset": "添付URLを削除", + "publish_dialog_delay_reset": "配信遅延を削除", + "emoji_picker_search_clear": "検索をクリア", + "subscribe_dialog_subscribe_base_url_label": "サーバーURL", + "prefs_notifications_sound_play": "選択されたサウンドを再生", + "prefs_users_table": "ユーザー一覧", + "prefs_users_delete_button": "ユーザーを削除", + "error_boundary_unsupported_indexeddb_title": "プライベートブラウジングはサポートされていません" } diff --git a/web/public/static/langs/ko.json b/web/public/static/langs/ko.json index 87be722f..d50838e5 100644 --- a/web/public/static/langs/ko.json +++ b/web/public/static/langs/ko.json @@ -1,191 +1,191 @@ { - "action_bar_show_menu": "메뉴 표시", - "action_bar_logo_alt": "ntfy 로고", - "action_bar_settings": "설정", - "action_bar_send_test_notification": "시험용 알림 발송", - "action_bar_clear_notifications": "모든 알림 초기화", - "action_bar_unsubscribe": "구독 해제", - "action_bar_toggle_mute": "알림 음소거/해제", - "action_bar_toggle_action_menu": "액션 메뉴 열기/닫기", - "message_bar_type_message": "여기에 메세지를 입력하세요", - "message_bar_error_publishing": "메세지 발송 오류", - "message_bar_show_dialog": "발송 창 표시", - "message_bar_publish": "메세지 발송", - "nav_topics_title": "구독한 주제", - "nav_button_all_notifications": "모든 알림", - "nav_button_publish_message": "알림 보내기", - "nav_button_subscribe": "주제 구독하기", - "nav_button_muted": "알림 음소거됨", - "nav_button_connecting": "연결중", - "alert_grant_title": "알림이 비활성화되어 있습니다", - "alert_grant_description": "데스크톱 알림을 받기 위해서는 브라우저에서 권한을 부여해야 합니다.", - "alert_grant_button": "권한 부여하기", - "alert_not_supported_title": "알림이 지원되지 않습니다", - "notifications_list_item": "알림", - "notifications_mark_read": "읽음으로 표시", - "notifications_delete": "삭제", - "notifications_copied_to_clipboard": "클립보드에 복사됨", - "notifications_tags": "태그", - "notifications_priority_x": "우선순위 {{priority}}", - "notifications_new_indicator": "새 알림", - "notifications_attachment_image": "첨부 이미지", - "notifications_attachment_copy_url_title": "첨부 주소를 클립보드에 복사", - "notifications_attachment_copy_url_button": "URL 복사", - "notifications_attachment_open_title": "{{url}}로 가기", - "publish_dialog_attachment_limits_file_and_quota_reached": "첨부파일 크기 제한({{fileSizeLimit}}) 초과 및 할당량 초과({{remainingBytes}} 남음)", - "publish_dialog_attachment_limits_file_reached": "첨부파일 크기 제한({{fileSizeLimit}}) 초과", - "publish_dialog_attachment_limits_quota_reached": "할당량 초과({{remainingBytes}} 남음)", - "publish_dialog_emoji_picker_show": "이모지 선택", - "publish_dialog_priority_min": "우선순위 최소", - "publish_dialog_priority_low": "우선순위 낮음", - "publish_dialog_priority_default": "우선순위 기본", - "publish_dialog_priority_high": "우선순위 높음", - "publish_dialog_priority_max": "우선순위 최상", - "publish_dialog_base_url_label": "서비스 URL", - "publish_dialog_base_url_placeholder": "서비스 URL, 예를 들면 https://example.com", - "publish_dialog_topic_label": "주제 이름", - "publish_dialog_topic_placeholder": "주제 이름, 예를 들면 phil_alerts", - "publish_dialog_topic_reset": "주제 초기화", - "publish_dialog_title_label": "제목", - "publish_dialog_title_placeholder": "알림 제목, 예를 들면 디스크 공간 경고", - "publish_dialog_message_label": "메세지", - "publish_dialog_message_placeholder": "메세지를 여기에 입력하세요", - "publish_dialog_tags_label": "태그", - "publish_dialog_tags_placeholder": "반점으로 구분된 태그 목록, 예를 들면 warning, srv1-backup", - "publish_dialog_priority_label": "우선순위", - "publish_dialog_click_label": "클릭 URL", - "publish_dialog_click_placeholder": "알림이 클릭되었을때 이동할 URL", - "publish_dialog_click_reset": "클릭 URL 제거", - "publish_dialog_email_label": "이메일", - "publish_dialog_email_placeholder": "알림을 전달할 이메일 주소, 예를 들면 phil@example.com", - "publish_dialog_email_reset": "이메일 전달 삭제", - "publish_dialog_attach_label": "첨부 파일 URL", - "publish_dialog_attach_placeholder": "파일을 URL로 첨부하기, 예를 들면 https://f-droid.org/F-Droid.apk", - "publish_dialog_attach_reset": "첨부 파일 URL 삭제", - "publish_dialog_filename_label": "파일 이름", - "publish_dialog_filename_placeholder": "첨부 파일 이름", - "publish_dialog_delay_label": "지연", - "publish_dialog_chip_email_label": "이메일로 전달", - "publish_dialog_chip_attach_url_label": "URL로 파일 첨부", - "publish_dialog_chip_attach_file_label": "로컬 파일 첨부", - "publish_dialog_chip_delay_label": "발송 지연", - "publish_dialog_chip_topic_label": "주제 변경", - "publish_dialog_details_examples_description": "예제와 모든 전송 기능의 자세한 설명은 문서를 참고해주세요.", - "publish_dialog_button_cancel": "취소", - "publish_dialog_button_send": "보내기", - "publish_dialog_button_cancel_sending": "보내기 취소", - "publish_dialog_checkbox_publish_another": "다른 메세지 보내기", - "publish_dialog_attached_file_title": "첨부된 파일:", - "publish_dialog_attached_file_filename_placeholder": "첨부 파일 이름", - "publish_dialog_attached_file_remove": "첨부 파일 삭제", - "publish_dialog_drop_file_here": "여기에 파일을 끌어다 놓으세요", - "emoji_picker_search_placeholder": "이모지 검색", - "emoji_picker_search_clear": "검색 초기화", - "subscribe_dialog_subscribe_title": "주제 구독하기", - "subscribe_dialog_subscribe_description": "주제는 비밀번호로 보호되지 않을 수 있으니 추측하기 어려운 이름을 사용하십시오. 구독한 뒤 PUT/POST 알림을 보낼 수 있습니다.", - "subscribe_dialog_subscribe_topic_placeholder": "주제 이름, 예를 들면 phil_alerts", - "subscribe_dialog_subscribe_use_another_label": "다른 서버 사용", - "subscribe_dialog_subscribe_base_url_label": "서비스 URL", - "subscribe_dialog_subscribe_button_cancel": "취소", - "subscribe_dialog_subscribe_button_subscribe": "구독하기", - "subscribe_dialog_login_title": "로그인 필요함", - "subscribe_dialog_error_user_anonymous": "익명", - "subscribe_dialog_error_user_not_authorized": "사용자 {{username}} 은(는) 인증되지 않았습니다", - "subscribe_dialog_login_username_label": "사용자 이름, 예를 들면 phil", - "subscribe_dialog_login_password_label": "비밀번호", - "subscribe_dialog_login_button_back": "뒤로가기", - "subscribe_dialog_login_button_login": "로그인", - "prefs_notifications_title": "알림", - "prefs_notifications_sound_title": "알림 효과음", - "prefs_notifications_sound_description_none": "알림 도착시 효과음을 재생하지 않습니다", - "prefs_notifications_sound_description_some": "알림 도착시 {{sound}} 효과음이 재생됩니다", - "prefs_notifications_sound_no_sound": "효과음 없음", - "prefs_notifications_sound_play": "선택한 효과음 재생", - "prefs_notifications_min_priority_title": "우선순위 최소", - "prefs_notifications_min_priority_description_x_or_higher": "우선순위가 {{number}} ({{name}}) 이상인 알림만 보기", - "prefs_notifications_min_priority_description_max": "우선순위가 5 (최상)인 알림만 보기", - "prefs_notifications_min_priority_any": "아무 우선순위", - "prefs_notifications_min_priority_default_and_higher": "우선순위 기본 이상", - "prefs_notifications_min_priority_low_and_higher": "우선순위 낮음 이상", - "prefs_notifications_delete_after_three_hours": "3시간 뒤", - "prefs_notifications_delete_after_one_day": "1일 뒤", - "prefs_notifications_delete_after_one_week": "1주 뒤", - "prefs_notifications_delete_after_one_month": "1달 뒤", - "prefs_notifications_delete_after_never_description": "알림이 자동으로 삭제되지 않습니다", - "prefs_notifications_delete_after_three_hours_description": "알림이 3시간 뒤 자동으로 삭제됩니다", - "prefs_notifications_delete_after_one_day_description": "알림이 1일 뒤 자동으로 삭제됩니다", - "prefs_notifications_delete_after_one_week_description": "알림이 1주 뒤 자동으로 삭제됩니다", - "prefs_notifications_delete_after_one_month_description": "알림이 1달 뒤 자동으로 삭제됩니다", - "prefs_users_title": "사용자 관리", - "prefs_users_description": "이곳에서 보호된 주제를 위한 사용자를 추가하거나 삭제할 수 있습니다. 사용자 이름과 비밀번호는 브라우저의 로컬 저장소에 보관됩니다.", - "prefs_users_add_button": "사용자 추가", - "prefs_users_edit_button": "사용자 편집", - "prefs_users_delete_button": "사용자 삭제", - "prefs_users_table_user_header": "사용자", - "prefs_users_table_base_url_header": "서비스 URL", - "prefs_users_dialog_title_add": "사용자 추가", - "prefs_users_dialog_title_edit": "사용자 편집", - "prefs_users_dialog_base_url_label": "서비스 URL, 예를 들면 https://ntfy.sh", - "prefs_users_dialog_button_cancel": "취소", - "prefs_users_dialog_button_save": "저장", - "prefs_appearance_title": "표시 설정", - "prefs_users_dialog_button_add": "추가", - "prefs_appearance_language_title": "언어", - "priority_min": "최하", - "priority_low": "낮음", - "priority_default": "기본", - "priority_high": "높음", - "error_boundary_title": "이런, ntfy가 충돌했습니다", - "error_boundary_button_copy_stack_trace": "스택 트레이스 복사", - "error_boundary_stack_trace": "스택 트레이스", - "error_boundary_gathering_info": "더 많은 정보 모으기 …", - "error_boundary_unsupported_indexeddb_title": "시크릿 모드는 지원되지 않습니다", - "notifications_click_copy_url_button": "링크 복사", - "notifications_click_copy_url_title": "링크 URL을 클립보드에 복사", - "notifications_attachment_file_video": "동영상 파일", - "notifications_attachment_file_app": "안드로이드 앱 파일", - "notifications_attachment_file_document": "다른 문서", - "notifications_click_open_button": "링크 열기", - "notifications_actions_not_supported": "웹앱에서 지원되지 않는 동작입니다", - "publish_dialog_title_topic": "{{topic}}에 발송", - "alert_not_supported_description": "사용중인 브라우저에서 알림 기능을 지원하지 않습니다.", - "notifications_example": "예제", - "notifications_more_details": "더 많은 정보가 필요하시다면 웹사이트문서를 참고하세요.", - "notifications_list": "알림 목록", - "notifications_attachment_open_button": "첨부 파일 열기", - "notifications_no_subscriptions_title": "아직 아무런 구독을 추가하지 않으신 것 같습니다.", - "nav_button_settings": "설정", - "nav_button_documentation": "문서", - "notifications_attachment_link_expires": "링크가 {{date}}에 만료됨", - "notifications_attachment_link_expired": "다운로드 링크 만료됨", - "notifications_attachment_file_audio": "음성 파일", - "notifications_attachment_file_image": "사진 파일", - "notifications_actions_open_url_title": "{{url}]로 가기", - "notifications_actions_http_request_title": "HTTP {{method}}를 {{url}}에 보내기", - "notifications_none_for_topic_title": "아직 이 주제 관련 알림을 받지 않았습니다.", - "notifications_none_for_any_title": "아직 어떤 알림도 받지 않았습니다.", - "notifications_none_for_any_description": "알림을 받으려면 아래 주소로 PUT이나 POST 요청을 보내세요. 구독중이신 주제 중 하나로 예를 들자면 다음과 같습니다.", - "notifications_loading": "알림 불러오는중 …", - "publish_dialog_message_published": "알림 발송됨", - "notifications_none_for_topic_description": "알림을 받으려면 아래 주소로 PUT이나 POST 요청을 보내세요.", - "notifications_no_subscriptions_description": "\"{{linktext}}\" 링크를 눌러서 주제를 생성하거나 구독하세요. 그 다음, 메세지를 PUT이나 POST로 보내면 여기에서 알림을 받으실 수 있습니다.", - "publish_dialog_progress_uploading": "업로드중 …", - "publish_dialog_title_no_topic": "알림 발송", - "publish_dialog_progress_uploading_detail": "업로드중 {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_delay_placeholder": "알림 발송 지연, 예를 들면 {{unixTimestamp}}, {{relativeTime}} 또는 \"{{naturalLanguage}}\" (영어로 입력)", - "publish_dialog_delay_reset": "발송 지연 삭제", - "publish_dialog_chip_click_label": "클릭 URL", - "subscribe_dialog_login_description": "이 주제는 비밀번호로 보호되어 있습니다. 구독하시려면 사용자 이름과 비밀번호를 입력해주세요.", - "prefs_notifications_min_priority_max_only": "우선순위 최상만", - "publish_dialog_other_features": "다른 기능:", - "prefs_notifications_min_priority_description_any": "우선순위 무관 모든 알림 보기", - "prefs_notifications_min_priority_high_and_higher": "우선순위 높음 이상", - "error_boundary_unsupported_indexeddb_description": "ntfy 웹 앱은 동작하기 위해서 IndexedDB가 필요하지만 사용중이신 브라우저는 IndexedDB를 시크릿 모드에서 지원하지 않습니다.

안타깝지만 모든 정보는 브라우저에만 저장되므로 ntfy 웹앱을 시크릿 모드에서 사용할 이유는 존재하지 않습니다. 이 깃허브 이슈를 참고해 보시거나, 디스코드 서버Matrix에서 저희와 이야기를 나눌 수 있습니다.", - "prefs_notifications_delete_after_title": "알림 삭제", - "prefs_notifications_delete_after_never": "삭제하지 않음", - "prefs_users_table": "사용자 테이블", - "prefs_users_dialog_username_label": "사용자 이름, 예를 들면 phil", - "prefs_users_dialog_password_label": "비밀번호", - "priority_max": "최상", - "error_boundary_description": "이것은 당연히 발생되어서는 안됩니다. 굉장히 죄송합니다.
가능하시다면 이 문제를 깃허브에 제보해 주시거나, 디스코드 서버Matrix를 통해 알려주세요." + "action_bar_show_menu": "메뉴 표시", + "action_bar_logo_alt": "ntfy 로고", + "action_bar_settings": "설정", + "action_bar_send_test_notification": "시험용 알림 발송", + "action_bar_clear_notifications": "모든 알림 초기화", + "action_bar_unsubscribe": "구독 해제", + "action_bar_toggle_mute": "알림 음소거/해제", + "action_bar_toggle_action_menu": "액션 메뉴 열기/닫기", + "message_bar_type_message": "여기에 메세지를 입력하세요", + "message_bar_error_publishing": "메세지 발송 오류", + "message_bar_show_dialog": "발송 창 표시", + "message_bar_publish": "메세지 발송", + "nav_topics_title": "구독한 주제", + "nav_button_all_notifications": "모든 알림", + "nav_button_publish_message": "알림 보내기", + "nav_button_subscribe": "주제 구독하기", + "nav_button_muted": "알림 음소거됨", + "nav_button_connecting": "연결중", + "alert_grant_title": "알림이 비활성화되어 있습니다", + "alert_grant_description": "데스크톱 알림을 받기 위해서는 브라우저에서 권한을 부여해야 합니다.", + "alert_grant_button": "권한 부여하기", + "alert_not_supported_title": "알림이 지원되지 않습니다", + "notifications_list_item": "알림", + "notifications_mark_read": "읽음으로 표시", + "notifications_delete": "삭제", + "notifications_copied_to_clipboard": "클립보드에 복사됨", + "notifications_tags": "태그", + "notifications_priority_x": "우선순위 {{priority}}", + "notifications_new_indicator": "새 알림", + "notifications_attachment_image": "첨부 이미지", + "notifications_attachment_copy_url_title": "첨부 주소를 클립보드에 복사", + "notifications_attachment_copy_url_button": "URL 복사", + "notifications_attachment_open_title": "{{url}}로 가기", + "publish_dialog_attachment_limits_file_and_quota_reached": "첨부파일 크기 제한({{fileSizeLimit}}) 초과 및 할당량 초과({{remainingBytes}} 남음)", + "publish_dialog_attachment_limits_file_reached": "첨부파일 크기 제한({{fileSizeLimit}}) 초과", + "publish_dialog_attachment_limits_quota_reached": "할당량 초과({{remainingBytes}} 남음)", + "publish_dialog_emoji_picker_show": "이모지 선택", + "publish_dialog_priority_min": "우선순위 최소", + "publish_dialog_priority_low": "우선순위 낮음", + "publish_dialog_priority_default": "우선순위 기본", + "publish_dialog_priority_high": "우선순위 높음", + "publish_dialog_priority_max": "우선순위 최상", + "publish_dialog_base_url_label": "서비스 URL", + "publish_dialog_base_url_placeholder": "서비스 URL, 예를 들면 https://example.com", + "publish_dialog_topic_label": "주제 이름", + "publish_dialog_topic_placeholder": "주제 이름, 예를 들면 phil_alerts", + "publish_dialog_topic_reset": "주제 초기화", + "publish_dialog_title_label": "제목", + "publish_dialog_title_placeholder": "알림 제목, 예를 들면 디스크 공간 경고", + "publish_dialog_message_label": "메세지", + "publish_dialog_message_placeholder": "메세지를 여기에 입력하세요", + "publish_dialog_tags_label": "태그", + "publish_dialog_tags_placeholder": "반점으로 구분된 태그 목록, 예를 들면 warning, srv1-backup", + "publish_dialog_priority_label": "우선순위", + "publish_dialog_click_label": "클릭 URL", + "publish_dialog_click_placeholder": "알림이 클릭되었을때 이동할 URL", + "publish_dialog_click_reset": "클릭 URL 제거", + "publish_dialog_email_label": "이메일", + "publish_dialog_email_placeholder": "알림을 전달할 이메일 주소, 예를 들면 phil@example.com", + "publish_dialog_email_reset": "이메일 전달 삭제", + "publish_dialog_attach_label": "첨부 파일 URL", + "publish_dialog_attach_placeholder": "파일을 URL로 첨부하기, 예를 들면 https://f-droid.org/F-Droid.apk", + "publish_dialog_attach_reset": "첨부 파일 URL 삭제", + "publish_dialog_filename_label": "파일 이름", + "publish_dialog_filename_placeholder": "첨부 파일 이름", + "publish_dialog_delay_label": "지연", + "publish_dialog_chip_email_label": "이메일로 전달", + "publish_dialog_chip_attach_url_label": "URL로 파일 첨부", + "publish_dialog_chip_attach_file_label": "로컬 파일 첨부", + "publish_dialog_chip_delay_label": "발송 지연", + "publish_dialog_chip_topic_label": "주제 변경", + "publish_dialog_details_examples_description": "예제와 모든 전송 기능의 자세한 설명은 문서를 참고해주세요.", + "publish_dialog_button_cancel": "취소", + "publish_dialog_button_send": "보내기", + "publish_dialog_button_cancel_sending": "보내기 취소", + "publish_dialog_checkbox_publish_another": "다른 메세지 보내기", + "publish_dialog_attached_file_title": "첨부된 파일:", + "publish_dialog_attached_file_filename_placeholder": "첨부 파일 이름", + "publish_dialog_attached_file_remove": "첨부 파일 삭제", + "publish_dialog_drop_file_here": "여기에 파일을 끌어다 놓으세요", + "emoji_picker_search_placeholder": "이모지 검색", + "emoji_picker_search_clear": "검색 초기화", + "subscribe_dialog_subscribe_title": "주제 구독하기", + "subscribe_dialog_subscribe_description": "주제는 비밀번호로 보호되지 않을 수 있으니 추측하기 어려운 이름을 사용하십시오. 구독한 뒤 PUT/POST 알림을 보낼 수 있습니다.", + "subscribe_dialog_subscribe_topic_placeholder": "주제 이름, 예를 들면 phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "다른 서버 사용", + "subscribe_dialog_subscribe_base_url_label": "서비스 URL", + "subscribe_dialog_subscribe_button_cancel": "취소", + "subscribe_dialog_subscribe_button_subscribe": "구독하기", + "subscribe_dialog_login_title": "로그인 필요함", + "subscribe_dialog_error_user_anonymous": "익명", + "subscribe_dialog_error_user_not_authorized": "사용자 {{username}} 은(는) 인증되지 않았습니다", + "subscribe_dialog_login_username_label": "사용자 이름, 예를 들면 phil", + "subscribe_dialog_login_password_label": "비밀번호", + "subscribe_dialog_login_button_back": "뒤로가기", + "subscribe_dialog_login_button_login": "로그인", + "prefs_notifications_title": "알림", + "prefs_notifications_sound_title": "알림 효과음", + "prefs_notifications_sound_description_none": "알림 도착시 효과음을 재생하지 않습니다", + "prefs_notifications_sound_description_some": "알림 도착시 {{sound}} 효과음이 재생됩니다", + "prefs_notifications_sound_no_sound": "효과음 없음", + "prefs_notifications_sound_play": "선택한 효과음 재생", + "prefs_notifications_min_priority_title": "우선순위 최소", + "prefs_notifications_min_priority_description_x_or_higher": "우선순위가 {{number}} ({{name}}) 이상인 알림만 보기", + "prefs_notifications_min_priority_description_max": "우선순위가 5 (최상)인 알림만 보기", + "prefs_notifications_min_priority_any": "아무 우선순위", + "prefs_notifications_min_priority_default_and_higher": "우선순위 기본 이상", + "prefs_notifications_min_priority_low_and_higher": "우선순위 낮음 이상", + "prefs_notifications_delete_after_three_hours": "3시간 뒤", + "prefs_notifications_delete_after_one_day": "1일 뒤", + "prefs_notifications_delete_after_one_week": "1주 뒤", + "prefs_notifications_delete_after_one_month": "1달 뒤", + "prefs_notifications_delete_after_never_description": "알림이 자동으로 삭제되지 않습니다", + "prefs_notifications_delete_after_three_hours_description": "알림이 3시간 뒤 자동으로 삭제됩니다", + "prefs_notifications_delete_after_one_day_description": "알림이 1일 뒤 자동으로 삭제됩니다", + "prefs_notifications_delete_after_one_week_description": "알림이 1주 뒤 자동으로 삭제됩니다", + "prefs_notifications_delete_after_one_month_description": "알림이 1달 뒤 자동으로 삭제됩니다", + "prefs_users_title": "사용자 관리", + "prefs_users_description": "이곳에서 보호된 주제를 위한 사용자를 추가하거나 삭제할 수 있습니다. 사용자 이름과 비밀번호는 브라우저의 로컬 저장소에 보관됩니다.", + "prefs_users_add_button": "사용자 추가", + "prefs_users_edit_button": "사용자 편집", + "prefs_users_delete_button": "사용자 삭제", + "prefs_users_table_user_header": "사용자", + "prefs_users_table_base_url_header": "서비스 URL", + "prefs_users_dialog_title_add": "사용자 추가", + "prefs_users_dialog_title_edit": "사용자 편집", + "prefs_users_dialog_base_url_label": "서비스 URL, 예를 들면 https://ntfy.sh", + "prefs_users_dialog_button_cancel": "취소", + "prefs_users_dialog_button_save": "저장", + "prefs_appearance_title": "표시 설정", + "prefs_users_dialog_button_add": "추가", + "prefs_appearance_language_title": "언어", + "priority_min": "최하", + "priority_low": "낮음", + "priority_default": "기본", + "priority_high": "높음", + "error_boundary_title": "이런, ntfy가 충돌했습니다", + "error_boundary_button_copy_stack_trace": "스택 트레이스 복사", + "error_boundary_stack_trace": "스택 트레이스", + "error_boundary_gathering_info": "더 많은 정보 모으기 …", + "error_boundary_unsupported_indexeddb_title": "시크릿 모드는 지원되지 않습니다", + "notifications_click_copy_url_button": "링크 복사", + "notifications_click_copy_url_title": "링크 URL을 클립보드에 복사", + "notifications_attachment_file_video": "동영상 파일", + "notifications_attachment_file_app": "안드로이드 앱 파일", + "notifications_attachment_file_document": "다른 문서", + "notifications_click_open_button": "링크 열기", + "notifications_actions_not_supported": "웹앱에서 지원되지 않는 동작입니다", + "publish_dialog_title_topic": "{{topic}}에 발송", + "alert_not_supported_description": "사용중인 브라우저에서 알림 기능을 지원하지 않습니다.", + "notifications_example": "예제", + "notifications_more_details": "더 많은 정보가 필요하시다면 웹사이트문서를 참고하세요.", + "notifications_list": "알림 목록", + "notifications_attachment_open_button": "첨부 파일 열기", + "notifications_no_subscriptions_title": "아직 아무런 구독을 추가하지 않으신 것 같습니다.", + "nav_button_settings": "설정", + "nav_button_documentation": "문서", + "notifications_attachment_link_expires": "링크가 {{date}}에 만료됨", + "notifications_attachment_link_expired": "다운로드 링크 만료됨", + "notifications_attachment_file_audio": "음성 파일", + "notifications_attachment_file_image": "사진 파일", + "notifications_actions_open_url_title": "{{url}]로 가기", + "notifications_actions_http_request_title": "HTTP {{method}}를 {{url}}에 보내기", + "notifications_none_for_topic_title": "아직 이 주제 관련 알림을 받지 않았습니다.", + "notifications_none_for_any_title": "아직 어떤 알림도 받지 않았습니다.", + "notifications_none_for_any_description": "알림을 받으려면 아래 주소로 PUT이나 POST 요청을 보내세요. 구독중이신 주제 중 하나로 예를 들자면 다음과 같습니다.", + "notifications_loading": "알림 불러오는중 …", + "publish_dialog_message_published": "알림 발송됨", + "notifications_none_for_topic_description": "알림을 받으려면 아래 주소로 PUT이나 POST 요청을 보내세요.", + "notifications_no_subscriptions_description": "\"{{linktext}}\" 링크를 눌러서 주제를 생성하거나 구독하세요. 그 다음, 메세지를 PUT이나 POST로 보내면 여기에서 알림을 받으실 수 있습니다.", + "publish_dialog_progress_uploading": "업로드중 …", + "publish_dialog_title_no_topic": "알림 발송", + "publish_dialog_progress_uploading_detail": "업로드중 {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_delay_placeholder": "알림 발송 지연, 예를 들면 {{unixTimestamp}}, {{relativeTime}} 또는 \"{{naturalLanguage}}\" (영어로 입력)", + "publish_dialog_delay_reset": "발송 지연 삭제", + "publish_dialog_chip_click_label": "클릭 URL", + "subscribe_dialog_login_description": "이 주제는 비밀번호로 보호되어 있습니다. 구독하시려면 사용자 이름과 비밀번호를 입력해주세요.", + "prefs_notifications_min_priority_max_only": "우선순위 최상만", + "publish_dialog_other_features": "다른 기능:", + "prefs_notifications_min_priority_description_any": "우선순위 무관 모든 알림 보기", + "prefs_notifications_min_priority_high_and_higher": "우선순위 높음 이상", + "error_boundary_unsupported_indexeddb_description": "ntfy 웹 앱은 동작하기 위해서 IndexedDB가 필요하지만 사용중이신 브라우저는 IndexedDB를 시크릿 모드에서 지원하지 않습니다.

안타깝지만 모든 정보는 브라우저에만 저장되므로 ntfy 웹앱을 시크릿 모드에서 사용할 이유는 존재하지 않습니다. 이 깃허브 이슈를 참고해 보시거나, 디스코드 서버Matrix에서 저희와 이야기를 나눌 수 있습니다.", + "prefs_notifications_delete_after_title": "알림 삭제", + "prefs_notifications_delete_after_never": "삭제하지 않음", + "prefs_users_table": "사용자 테이블", + "prefs_users_dialog_username_label": "사용자 이름, 예를 들면 phil", + "prefs_users_dialog_password_label": "비밀번호", + "priority_max": "최상", + "error_boundary_description": "이것은 당연히 발생되어서는 안됩니다. 굉장히 죄송합니다.
가능하시다면 이 문제를 깃허브에 제보해 주시거나, 디스코드 서버Matrix를 통해 알려주세요." } diff --git a/web/public/static/langs/nb_NO.json b/web/public/static/langs/nb_NO.json index 1dab51b3..6b69c9a9 100644 --- a/web/public/static/langs/nb_NO.json +++ b/web/public/static/langs/nb_NO.json @@ -1,126 +1,126 @@ { - "nav_button_subscribe": "Abonner på emne", - "action_bar_settings": "Innstillinger", - "action_bar_send_test_notification": "Send testmerknad", - "action_bar_clear_notifications": "Tøm alle merknader", - "action_bar_unsubscribe": "Opphev abonnement", - "message_bar_type_message": "Skriv en melding her", - "nav_button_all_notifications": "Alle merknader", - "nav_button_settings": "Innstillinger", - "nav_button_documentation": "Dokumentasjon", - "nav_topics_title": "Abonnerte emner", - "alert_grant_title": "Merknader er avskrudd", - "alert_not_supported_title": "Merknader støttes ikke", - "notifications_copied_to_clipboard": "Kopiert til utklippstavlen", - "notifications_attachment_copy_url_title": "Kopier vedleggsnettadresse til utklippstavlen", - "notifications_attachment_copy_url_button": "Kopier nettadresse", - "notifications_attachment_open_button": "Åpne vedlegg", - "notifications_attachment_open_title": "Gå til {{url}}", - "notifications_attachment_link_expires": "lenken utløper {{date}}", - "notifications_click_copy_url_title": "Kopier lenke-nettadresse til utklippstavlen", - "notifications_actions_open_url_title": "Gå til {{url}}", - "notifications_tags": "Etiketter", - "notifications_attachment_link_expired": "nedlastingslenken har utløpt", - "notifications_none_for_any_title": "Du har ikke mottatt noen merknader.", - "notifications_click_open_button": "Åpne lenke", - "notifications_none_for_topic_title": "Du har ikke mottatt noen merknader for dette emnet enda.", - "notifications_example": "Eksempel", - "publish_dialog_title_topic": "Publiser til {{topic}}", - "publish_dialog_priority_min": "Min. prioritet", - "publish_dialog_priority_low": "Lav prioritet", - "publish_dialog_priority_default": "Forvalgt prioritet", - "publish_dialog_priority_high": "Høy prioritet", - "publish_dialog_priority_max": "Maks. prioritet", - "publish_dialog_base_url_label": "Tjeneste-nettadresse", - "publish_dialog_message_label": "Melding", - "publish_dialog_priority_label": "Prioritet", - "publish_dialog_tags_label": "Etiketter", - "publish_dialog_click_placeholder": "Nettadresse som åpnes når merknaden klikkes", - "publish_dialog_attach_label": "Vedleggs-nettadresse", - "publish_dialog_attach_placeholder": "Legg ved fil per nettadresse, f.eks. https://f-droid.org/F-Droid.apk", - "publish_dialog_filename_label": "Filnavn", - "publish_dialog_delay_label": "Forsinkelse", - "publish_dialog_filename_placeholder": "Vedleggets filnavn", - "publish_dialog_other_features": "Andre funksjoner:", - "publish_dialog_chip_email_label": "Videresend til e-post", - "publish_dialog_chip_topic_label": "Endre emne", - "publish_dialog_button_cancel_sending": "Avbryt forsendelse", - "publish_dialog_chip_attach_file_label": "Legg ved lokal fil", - "publish_dialog_attached_file_title": "Vedlagt fil:", - "publish_dialog_attached_file_filename_placeholder": "Vedleggsfilnavn", - "subscribe_dialog_subscribe_use_another_label": "Bruk en annen tjener", - "subscribe_dialog_subscribe_button_cancel": "Avbryt", - "publish_dialog_drop_file_here": "Slipp filen her", - "subscribe_dialog_subscribe_title": "Abonner på emne", - "emoji_picker_search_placeholder": "Søk etter emoji", - "subscribe_dialog_login_button_login": "Logg inn", - "subscribe_dialog_subscribe_button_subscribe": "Abonner", - "subscribe_dialog_login_title": "Innlogging kreves", - "subscribe_dialog_login_username_label": "Brukernavn, f.eks. phil", - "subscribe_dialog_login_password_label": "Passord", - "prefs_notifications_title": "Merknader", - "prefs_notifications_sound_title": "Merknadslyd", - "prefs_notifications_sound_no_sound": "Ingen lyd", - "subscribe_dialog_error_user_anonymous": "anonym", - "error_boundary_stack_trace": "Stabelspor", - "error_boundary_button_copy_stack_trace": "Kopier stabelspor", - "message_bar_error_publishing": "Kunne ikke publisere merknader", - "nav_button_publish_message": "Publiser merknad", - "publish_dialog_title_no_topic": "Publiser merknad", - "publish_dialog_progress_uploading": "Laster opp …", - "publish_dialog_progress_uploading_detail": "Laster opp {{loaded}}/{{total}} ({{percent}}%) …", - "notifications_loading": "Laster inn merknader …", - "publish_dialog_message_published": "Merknad publisert", - "publish_dialog_email_placeholder": "Adresse å videresende merknaden til, f.eks. phil@example.com", - "error_boundary_gathering_info": "Hent mer info …", - "prefs_notifications_sound_description_some": "Merknader spiller {{sound}}-lyd når de mottas", - "prefs_notifications_min_priority_description_any": "Viser aller merknader, uavhengig av prioritet", - "prefs_notifications_min_priority_description_x_or_higher": "Vis merknader hvis prioritet er {{number}} ({{name}}) eller høyere", - "prefs_notifications_min_priority_high_and_higher": "Høy prioritet og høyere", - "prefs_notifications_min_priority_max_only": "Kun maks. prioritet", - "prefs_notifications_delete_after_one_day": "Etter én dag", - "prefs_notifications_delete_after_one_week": "Etter én uke", - "prefs_notifications_delete_after_one_month": "Etter én måned", - "prefs_notifications_delete_after_never_description": "Merknader blir aldri slettet automatisk", - "prefs_notifications_delete_after_three_hours_description": "Merknader slettes automatisk etter tre timer", - "prefs_users_title": "Håndter brukere", - "prefs_users_add_button": "Legg til bruker", - "prefs_users_table_user_header": "Bruker", - "prefs_users_dialog_title_add": "Legg til bruker", - "prefs_users_dialog_title_edit": "Rediger bruker", - "prefs_users_dialog_base_url_label": "Tjeneste-nettadresse, f.eks. https://ntfy.sh", - "prefs_users_dialog_password_label": "Passord", - "prefs_users_dialog_button_save": "Lagre", - "prefs_appearance_title": "Utseende", - "prefs_appearance_language_title": "Språk", - "prefs_users_dialog_username_label": "Brukernavn, f.eks. phil", - "priority_low": "lav", - "priority_default": "forvalg", - "priority_high": "høy", - "priority_max": "maks.", - "alert_grant_button": "Innvilg nå", - "publish_dialog_topic_label": "Emnenavn", - "prefs_notifications_delete_after_one_day_description": "Merknader slettes automatisk etter én dag", - "notifications_click_copy_url_button": "Kopier lenke", - "error_boundary_title": "Oida. Ntfy krasjet.", - "publish_dialog_message_placeholder": "Skriv en melding her", - "publish_dialog_button_cancel": "Avbryt", - "prefs_notifications_min_priority_title": "Minimumsprioritet", - "prefs_notifications_delete_after_title": "Slett merknader", - "prefs_notifications_delete_after_never": "Aldri", - "publish_dialog_email_label": "E-post", - "publish_dialog_button_send": "Send", - "prefs_notifications_delete_after_one_week_description": "Merknader slettes automatisk etter én uke", - "prefs_notifications_delete_after_one_month_description": "Merknader slettes automatisk etter én måned", - "priority_min": "min.", - "subscribe_dialog_login_button_back": "Tilbake", - "prefs_notifications_delete_after_three_hours": "Etter tre timer", - "prefs_users_table_base_url_header": "Tjeneste-nettadresse", - "prefs_users_dialog_button_cancel": "Avbryt", - "prefs_users_dialog_button_add": "Legg til", - "publish_dialog_chip_attach_url_label": "Legg ved fil per nettadresse", - "publish_dialog_tags_placeholder": "Kommainndelt liste over etiketter, f.eks. advarsel, srv1-sikkerhetskopi", - "prefs_notifications_sound_description_none": "Merknader er lydløse når de mottas", - "subscribe_dialog_subscribe_topic_placeholder": "Emnenavn, f.eks. phil_varsler", - "prefs_notifications_min_priority_default_and_higher": "Forvalgt prioritet og høyere" + "nav_button_subscribe": "Abonner på emne", + "action_bar_settings": "Innstillinger", + "action_bar_send_test_notification": "Send testmerknad", + "action_bar_clear_notifications": "Tøm alle merknader", + "action_bar_unsubscribe": "Opphev abonnement", + "message_bar_type_message": "Skriv en melding her", + "nav_button_all_notifications": "Alle merknader", + "nav_button_settings": "Innstillinger", + "nav_button_documentation": "Dokumentasjon", + "nav_topics_title": "Abonnerte emner", + "alert_grant_title": "Merknader er avskrudd", + "alert_not_supported_title": "Merknader støttes ikke", + "notifications_copied_to_clipboard": "Kopiert til utklippstavlen", + "notifications_attachment_copy_url_title": "Kopier vedleggsnettadresse til utklippstavlen", + "notifications_attachment_copy_url_button": "Kopier nettadresse", + "notifications_attachment_open_button": "Åpne vedlegg", + "notifications_attachment_open_title": "Gå til {{url}}", + "notifications_attachment_link_expires": "lenken utløper {{date}}", + "notifications_click_copy_url_title": "Kopier lenke-nettadresse til utklippstavlen", + "notifications_actions_open_url_title": "Gå til {{url}}", + "notifications_tags": "Etiketter", + "notifications_attachment_link_expired": "nedlastingslenken har utløpt", + "notifications_none_for_any_title": "Du har ikke mottatt noen merknader.", + "notifications_click_open_button": "Åpne lenke", + "notifications_none_for_topic_title": "Du har ikke mottatt noen merknader for dette emnet enda.", + "notifications_example": "Eksempel", + "publish_dialog_title_topic": "Publiser til {{topic}}", + "publish_dialog_priority_min": "Min. prioritet", + "publish_dialog_priority_low": "Lav prioritet", + "publish_dialog_priority_default": "Forvalgt prioritet", + "publish_dialog_priority_high": "Høy prioritet", + "publish_dialog_priority_max": "Maks. prioritet", + "publish_dialog_base_url_label": "Tjeneste-nettadresse", + "publish_dialog_message_label": "Melding", + "publish_dialog_priority_label": "Prioritet", + "publish_dialog_tags_label": "Etiketter", + "publish_dialog_click_placeholder": "Nettadresse som åpnes når merknaden klikkes", + "publish_dialog_attach_label": "Vedleggs-nettadresse", + "publish_dialog_attach_placeholder": "Legg ved fil per nettadresse, f.eks. https://f-droid.org/F-Droid.apk", + "publish_dialog_filename_label": "Filnavn", + "publish_dialog_delay_label": "Forsinkelse", + "publish_dialog_filename_placeholder": "Vedleggets filnavn", + "publish_dialog_other_features": "Andre funksjoner:", + "publish_dialog_chip_email_label": "Videresend til e-post", + "publish_dialog_chip_topic_label": "Endre emne", + "publish_dialog_button_cancel_sending": "Avbryt forsendelse", + "publish_dialog_chip_attach_file_label": "Legg ved lokal fil", + "publish_dialog_attached_file_title": "Vedlagt fil:", + "publish_dialog_attached_file_filename_placeholder": "Vedleggsfilnavn", + "subscribe_dialog_subscribe_use_another_label": "Bruk en annen tjener", + "subscribe_dialog_subscribe_button_cancel": "Avbryt", + "publish_dialog_drop_file_here": "Slipp filen her", + "subscribe_dialog_subscribe_title": "Abonner på emne", + "emoji_picker_search_placeholder": "Søk etter emoji", + "subscribe_dialog_login_button_login": "Logg inn", + "subscribe_dialog_subscribe_button_subscribe": "Abonner", + "subscribe_dialog_login_title": "Innlogging kreves", + "subscribe_dialog_login_username_label": "Brukernavn, f.eks. phil", + "subscribe_dialog_login_password_label": "Passord", + "prefs_notifications_title": "Merknader", + "prefs_notifications_sound_title": "Merknadslyd", + "prefs_notifications_sound_no_sound": "Ingen lyd", + "subscribe_dialog_error_user_anonymous": "anonym", + "error_boundary_stack_trace": "Stabelspor", + "error_boundary_button_copy_stack_trace": "Kopier stabelspor", + "message_bar_error_publishing": "Kunne ikke publisere merknader", + "nav_button_publish_message": "Publiser merknad", + "publish_dialog_title_no_topic": "Publiser merknad", + "publish_dialog_progress_uploading": "Laster opp …", + "publish_dialog_progress_uploading_detail": "Laster opp {{loaded}}/{{total}} ({{percent}}%) …", + "notifications_loading": "Laster inn merknader …", + "publish_dialog_message_published": "Merknad publisert", + "publish_dialog_email_placeholder": "Adresse å videresende merknaden til, f.eks. phil@example.com", + "error_boundary_gathering_info": "Hent mer info …", + "prefs_notifications_sound_description_some": "Merknader spiller {{sound}}-lyd når de mottas", + "prefs_notifications_min_priority_description_any": "Viser aller merknader, uavhengig av prioritet", + "prefs_notifications_min_priority_description_x_or_higher": "Vis merknader hvis prioritet er {{number}} ({{name}}) eller høyere", + "prefs_notifications_min_priority_high_and_higher": "Høy prioritet og høyere", + "prefs_notifications_min_priority_max_only": "Kun maks. prioritet", + "prefs_notifications_delete_after_one_day": "Etter én dag", + "prefs_notifications_delete_after_one_week": "Etter én uke", + "prefs_notifications_delete_after_one_month": "Etter én måned", + "prefs_notifications_delete_after_never_description": "Merknader blir aldri slettet automatisk", + "prefs_notifications_delete_after_three_hours_description": "Merknader slettes automatisk etter tre timer", + "prefs_users_title": "Håndter brukere", + "prefs_users_add_button": "Legg til bruker", + "prefs_users_table_user_header": "Bruker", + "prefs_users_dialog_title_add": "Legg til bruker", + "prefs_users_dialog_title_edit": "Rediger bruker", + "prefs_users_dialog_base_url_label": "Tjeneste-nettadresse, f.eks. https://ntfy.sh", + "prefs_users_dialog_password_label": "Passord", + "prefs_users_dialog_button_save": "Lagre", + "prefs_appearance_title": "Utseende", + "prefs_appearance_language_title": "Språk", + "prefs_users_dialog_username_label": "Brukernavn, f.eks. phil", + "priority_low": "lav", + "priority_default": "forvalg", + "priority_high": "høy", + "priority_max": "maks.", + "alert_grant_button": "Innvilg nå", + "publish_dialog_topic_label": "Emnenavn", + "prefs_notifications_delete_after_one_day_description": "Merknader slettes automatisk etter én dag", + "notifications_click_copy_url_button": "Kopier lenke", + "error_boundary_title": "Oida. Ntfy krasjet.", + "publish_dialog_message_placeholder": "Skriv en melding her", + "publish_dialog_button_cancel": "Avbryt", + "prefs_notifications_min_priority_title": "Minimumsprioritet", + "prefs_notifications_delete_after_title": "Slett merknader", + "prefs_notifications_delete_after_never": "Aldri", + "publish_dialog_email_label": "E-post", + "publish_dialog_button_send": "Send", + "prefs_notifications_delete_after_one_week_description": "Merknader slettes automatisk etter én uke", + "prefs_notifications_delete_after_one_month_description": "Merknader slettes automatisk etter én måned", + "priority_min": "min.", + "subscribe_dialog_login_button_back": "Tilbake", + "prefs_notifications_delete_after_three_hours": "Etter tre timer", + "prefs_users_table_base_url_header": "Tjeneste-nettadresse", + "prefs_users_dialog_button_cancel": "Avbryt", + "prefs_users_dialog_button_add": "Legg til", + "publish_dialog_chip_attach_url_label": "Legg ved fil per nettadresse", + "publish_dialog_tags_placeholder": "Kommainndelt liste over etiketter, f.eks. advarsel, srv1-sikkerhetskopi", + "prefs_notifications_sound_description_none": "Merknader er lydløse når de mottas", + "subscribe_dialog_subscribe_topic_placeholder": "Emnenavn, f.eks. phil_varsler", + "prefs_notifications_min_priority_default_and_higher": "Forvalgt prioritet og høyere" } diff --git a/web/public/static/langs/nl.json b/web/public/static/langs/nl.json index 2b7990ec..176a8f49 100644 --- a/web/public/static/langs/nl.json +++ b/web/public/static/langs/nl.json @@ -1,191 +1,191 @@ { - "action_bar_settings": "Instellingen", - "action_bar_send_test_notification": "Stuur test notificatie", - "action_bar_clear_notifications": "Wis alle notificaties", - "message_bar_type_message": "Typ hier een bericht", - "action_bar_unsubscribe": "Afmelden", - "message_bar_error_publishing": "Fout bij publiceren notificatie", - "nav_topics_title": "Geabonneerde onderwerpen", - "nav_button_settings": "Instellingen", - "alert_not_supported_description": "Notificaties worden niet ondersteund in je browser.", - "notifications_none_for_any_title": "Je hebt nog geen notificaties ontvangen.", - "publish_dialog_tags_label": "Tags", - "publish_dialog_chip_attach_file_label": "Lokaal bestand bijvoegen", - "prefs_users_dialog_title_edit": "Gebruiker bewerken", - "error_boundary_title": "Oh nee, ntfy is vastgelopen", - "error_boundary_description": "Dit hoort natuurlijk niet te gebeuren. Onze excuses.
Wanneer het mogelijk is, meld deze fout op GitHub, of laat het ons weten via Discord of Matrix.", - "error_boundary_button_copy_stack_trace": "Stack trace kopiëren", - "error_boundary_stack_trace": "Stacktrace", - "error_boundary_gathering_info": "Meer informatie verzamelen …", - "prefs_users_delete_button": "Gebruiker verwijderen", - "prefs_notifications_delete_after_one_week": "Na één week", - "prefs_notifications_delete_after_one_month": "Na één maand", - "prefs_users_dialog_title_add": "Gebruiker toevoegen", - "prefs_users_dialog_password_label": "Wachtwoord", - "error_boundary_unsupported_indexeddb_description": "De ntfy web applicatie heeft IndexedDB nodig om correct te kunnen functioneren, helaas ondersteund jouw browser IndexedDB niet in privé / incognito modus.

Dit is jammer maar het is ook onlogisch om de ntfy web applicatie in privé / incognito modus te gebruiken want alle gegevens worden bewaard in de browser zijn lokale opslag. Je kan hier meer over lezen in deze GitHub issue, of praat met ons op Discord of Matrix.", - "action_bar_show_menu": "Toon menu", - "action_bar_logo_alt": "ntfy logo", - "action_bar_toggle_mute": "Notificaties dempen/opheffen", - "action_bar_toggle_action_menu": "Actie menu openen/sluiten", - "message_bar_show_dialog": "Toon publicatie venster", - "message_bar_publish": "Bericht publiceren", - "nav_button_all_notifications": "Alle notificaties", - "nav_button_documentation": "Documentatie", - "nav_button_publish_message": "Notificatie publiceren", - "nav_button_subscribe": "Onderwerp abonneren", - "nav_button_muted": "Notificaties gedempt", - "nav_button_connecting": "verbinden", - "alert_grant_title": "Notificaties zijn uitgeschakeld", - "alert_grant_description": "Geef je browser toestemming om meldingen weer te geven.", - "alert_grant_button": "Nu toestaan", - "alert_not_supported_title": "Notificaties zijn niet ondersteund", - "notifications_list": "Notificaties lijst", - "notifications_list_item": "Notificatie", - "notifications_mark_read": "Markeer als gelezen", - "notifications_delete": "Verwijder", - "notifications_copied_to_clipboard": "Gekopieerd naar klembord", - "notifications_tags": "Tags", - "notifications_priority_x": "Prioriteit {{priority}}", - "notifications_new_indicator": "Nieuwe notificatie", - "notifications_attachment_image": "Afbeelding bijlage", - "notifications_attachment_copy_url_title": "Kopieer URL van bijlage naar klembord", - "notifications_attachment_copy_url_button": "URL kopiëren", - "notifications_attachment_open_title": "Ga naar {{url}}", - "notifications_attachment_open_button": "Bijlage openen", - "notifications_attachment_link_expires": "link vervalt op {{date}}", - "notifications_attachment_link_expired": "download link is verlopen", - "notifications_attachment_file_image": "afbeeldingsbestand", - "notifications_attachment_file_video": "videobestand", - "notifications_attachment_file_audio": "audiobestand", - "notifications_attachment_file_app": "Android app bestand", - "notifications_attachment_file_document": "overig document", - "notifications_click_copy_url_title": "URL naar klembord kopiëren", - "notifications_click_copy_url_button": "Link kopiëren", - "notifications_click_open_button": "Link openen", - "notifications_none_for_topic_description": "Om notificaties naar dit onderwerp te sturen, doe een PUT of POST naar de URL van het onderwerp.", - "notifications_none_for_any_description": "Om notificaties naar dit onderwerp te sturen, doe een PUT of POST naar de URL van het onderwerp. Hier is een voorbeeld met één van je onderwerpen.", - "notifications_no_subscriptions_title": "Het lijkt erop dat je nog op geen onderwerpen geabonneerd bent.", - "notifications_no_subscriptions_description": "Klik op de \"{{linktext}}\" link om een onderwerp te maken of erop te abonneren. Daarna kan je berichten sturen via PUT of POST and ontvang je hier notificaties.", - "notifications_example": "Voorbeeld", - "notifications_more_details": "Voor meer informatie, bezoek de website of documentatie.", - "notifications_loading": "Notificaties laden …", - "publish_dialog_title_topic": "Publiceren naar {{topic}}", - "publish_dialog_title_no_topic": "Notificatie publiceren", - "publish_dialog_progress_uploading": "Uploaden …", - "notifications_actions_open_url_title": "Ga naar {{url}}", - "notifications_actions_not_supported": "Deze actie is niet ondersteund in de web applicatie", - "notifications_actions_http_request_title": "Stuur HTTP {{method}} naar {{url}}", - "notifications_none_for_topic_title": "Je hebt nog geen notificaties ontvangen voor dit onderwerp.", - "publish_dialog_priority_low": "Lage prioriteit", - "publish_dialog_progress_uploading_detail": "Uploaden {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "Notificatie gepubliceerd", - "publish_dialog_attachment_limits_file_and_quota_reached": "overschrijd {{fileSizeLimit}} bestandslimiet en quotum, {{remainingBytes}} resterend", - "publish_dialog_attachment_limits_file_reached": "overschrijd {{fileSizeLimit}} bestandslimiet", - "publish_dialog_priority_default": "Standaard prioriteit", - "publish_dialog_attachment_limits_quota_reached": "overschrijd quotum, {{remainingBytes}} resterend", - "publish_dialog_emoji_picker_show": "Kies een emoji", - "publish_dialog_priority_high": "Hoge prioriteit", - "publish_dialog_priority_max": "Maximale prioriteit", - "publish_dialog_priority_min": "Minimale prioriteit", - "publish_dialog_base_url_label": "Service URL", - "publish_dialog_base_url_placeholder": "Service URL, bijvoorbeeld: https://voorbeeld.com", - "publish_dialog_topic_label": "Onderwerp", - "publish_dialog_topic_placeholder": "Onderwerp, bijv. phil_alerts", - "publish_dialog_topic_reset": "Onderwerp resetten", - "publish_dialog_title_label": "Titel", - "publish_dialog_title_placeholder": "Notificatie titel , bijv. Schijfruimte alarm", - "publish_dialog_message_label": "Bericht", - "publish_dialog_message_placeholder": "Typ hier een bericht", - "publish_dialog_tags_placeholder": "Komma gescheiden lijst met tags, bijv. waarschuwing, srv1-backup", - "publish_dialog_priority_label": "Prioriteit", - "publish_dialog_click_label": "Klik URL", - "publish_dialog_click_reset": "Verwijder klik URL", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Adres om de notificatie naar door te sturen, bijv. phil@voorbeeld.com", - "publish_dialog_email_reset": "Email doorsturen verwijderen", - "publish_dialog_attach_label": "URL van bijlage", - "publish_dialog_click_placeholder": "URL die geopend zal worden wanneer op de notificatie geklikt wordt", - "publish_dialog_attach_placeholder": "Bestand bijvoegen via URL, bijv. https://f-droid.org/F-Droid.apk", - "publish_dialog_attach_reset": "Bijlage URL verwijderen", - "publish_dialog_filename_label": "Bestandsnaam", - "publish_dialog_filename_placeholder": "Bestandsnaam van bijlage", - "publish_dialog_delay_label": "Uitstellen", - "publish_dialog_delay_placeholder": "Bezorging uitstellen, bijv. {{unixTimestamp}}, {{relativeTime}}, of \"{{naturalLanguage}}\" (alleen Engels)", - "publish_dialog_delay_reset": "Verwijder uitgestelde bezorging", - "publish_dialog_other_features": "Andere functionaliteiten:", - "publish_dialog_chip_click_label": "Klik URL", - "publish_dialog_chip_email_label": "Doorsturen naar email", - "publish_dialog_chip_attach_url_label": "Bestand bijvoegen via URL", - "publish_dialog_chip_delay_label": "Uitgestelde bezorging", - "publish_dialog_chip_topic_label": "Onderwerp veranderen", - "publish_dialog_details_examples_description": "Voor meer voorbeelden en gedetailleerde beschrijvingen van alle functionaliteiten, bekijk de documentatie.", - "publish_dialog_button_cancel_sending": "Versturen annuleren", - "publish_dialog_button_cancel": "Annuleer", - "publish_dialog_button_send": "Verstuur", - "publish_dialog_checkbox_publish_another": "Nog een bericht versturen", - "publish_dialog_attached_file_title": "Bijgevoegd bestand:", - "publish_dialog_attached_file_filename_placeholder": "Bijlage bestandsnaam", - "publish_dialog_attached_file_remove": "Verwijder bijgevoegd bestand", - "publish_dialog_drop_file_here": "Bestand hier slepen", - "emoji_picker_search_placeholder": "Emoji zoeken", - "emoji_picker_search_clear": "Zoeken leegmaken", - "subscribe_dialog_subscribe_topic_placeholder": "Onderwerp naam, bijv. phils_waarschuwingen", - "subscribe_dialog_subscribe_use_another_label": "Gebruik een andere server", - "subscribe_dialog_subscribe_base_url_label": "Service URL", - "subscribe_dialog_subscribe_button_cancel": "Annuleren", - "subscribe_dialog_subscribe_button_subscribe": "Abonneren", - "subscribe_dialog_login_title": "Aanmelding vereist", - "subscribe_dialog_login_description": "Dit onderwerp is beveiligd met een wachtwoord. Geef een gebruikersnaam en wachtwoord op om te abonneren.", - "subscribe_dialog_login_username_label": "Gebruikersnaam, bijv. phil", - "subscribe_dialog_subscribe_title": "Onderwerp abonneren", - "subscribe_dialog_subscribe_description": "Onderwerpen zijn mogelijk niet beschermd met een wachtwoord, kies daarom een moeilijk te raden naam. Na abonneren kun je notificaties via PUT/POST sturen.", - "subscribe_dialog_login_password_label": "Wachtwoord", - "subscribe_dialog_login_button_back": "Terug", - "subscribe_dialog_login_button_login": "Aanmelden", - "subscribe_dialog_error_user_not_authorized": "Gebruiker {{username}} heeft geen toegang", - "subscribe_dialog_error_user_anonymous": "anoniem", - "prefs_notifications_title": "Notificaties", - "prefs_notifications_sound_title": "Meldingsgeluid", - "prefs_notifications_sound_description_none": "Notificaties zullen geen geluid geven", - "prefs_notifications_sound_play": "Geselecteerd geluid afspelen", - "prefs_notifications_sound_description_some": "Inkomende notificaties zullen het {{sound}} geluid afspelen", - "prefs_notifications_sound_no_sound": "Geen geluid", - "prefs_notifications_min_priority_title": "Minimale prioriteit", - "prefs_notifications_min_priority_description_any": "Toon alle notificaties, ongeacht prioriteit", - "prefs_notifications_min_priority_description_x_or_higher": "Toon notificaties als prioriteit {{number}} ({{name}}) is of hoger", - "prefs_notifications_min_priority_description_max": "Toon notificaties als prioriteit 5 (maximaal) is", - "prefs_notifications_min_priority_any": "Elke prioriteit", - "prefs_notifications_min_priority_low_and_higher": "Lage prioriteit en hoger", - "prefs_notifications_min_priority_default_and_higher": "Standaard prioriteit en hoger", - "prefs_notifications_min_priority_high_and_higher": "Hoge prioriteit en hoger", - "prefs_notifications_min_priority_max_only": "Alleen maximale prioriteit", - "prefs_notifications_delete_after_title": "Notificaties verwijderen", - "prefs_notifications_delete_after_never": "Nooit", - "prefs_notifications_delete_after_three_hours": "Na drie uur", - "prefs_notifications_delete_after_one_day": "Na één dag", - "prefs_notifications_delete_after_never_description": "Notificaties worden nooit automatisch verwijderd", - "prefs_notifications_delete_after_three_hours_description": "Notificaties worden na drie uur automatisch verwijderd", - "prefs_notifications_delete_after_one_day_description": "Notificaties worden na één dag automatisch verwijderd", - "prefs_notifications_delete_after_one_week_description": "Notificaties worden na één week automatisch verwijderd", - "prefs_notifications_delete_after_one_month_description": "Notificaties worden na één maand automatisch verwijderd", - "prefs_users_title": "Gebruikers beheren", - "prefs_users_description": "Gebruikers voor beveiligde onderwerpen kunnen hier toegevoegd of verwijderd worden. Let op: gebruikersnaam en wachtwoord worden opgeslagen in lokale browser opslag.", - "prefs_users_table": "Gebruikerstabel", - "prefs_users_add_button": "Gebruiker toevoegen", - "prefs_users_edit_button": "Gebruiker bewerken", - "prefs_users_table_user_header": "Gebruiker", - "prefs_users_table_base_url_header": "Service URL", - "prefs_users_dialog_base_url_label": "Service URL, bijv. https://ntfy.sh", - "prefs_users_dialog_username_label": "Gebruikersnaam, bijv. phil", - "prefs_users_dialog_button_cancel": "Annuleren", - "prefs_users_dialog_button_add": "Toevoegen", - "prefs_users_dialog_button_save": "Bewaren", - "prefs_appearance_title": "Weergave", - "prefs_appearance_language_title": "Taal", - "priority_min": "min", - "priority_low": "laag", - "priority_default": "standaard", - "priority_high": "hoog", - "priority_max": "max", - "error_boundary_unsupported_indexeddb_title": "Privé / incognito browservensters worden niet ondersteund" + "action_bar_settings": "Instellingen", + "action_bar_send_test_notification": "Stuur test notificatie", + "action_bar_clear_notifications": "Wis alle notificaties", + "message_bar_type_message": "Typ hier een bericht", + "action_bar_unsubscribe": "Afmelden", + "message_bar_error_publishing": "Fout bij publiceren notificatie", + "nav_topics_title": "Geabonneerde onderwerpen", + "nav_button_settings": "Instellingen", + "alert_not_supported_description": "Notificaties worden niet ondersteund in je browser.", + "notifications_none_for_any_title": "Je hebt nog geen notificaties ontvangen.", + "publish_dialog_tags_label": "Tags", + "publish_dialog_chip_attach_file_label": "Lokaal bestand bijvoegen", + "prefs_users_dialog_title_edit": "Gebruiker bewerken", + "error_boundary_title": "Oh nee, ntfy is vastgelopen", + "error_boundary_description": "Dit hoort natuurlijk niet te gebeuren. Onze excuses.
Wanneer het mogelijk is, meld deze fout op GitHub, of laat het ons weten via Discord of Matrix.", + "error_boundary_button_copy_stack_trace": "Stack trace kopiëren", + "error_boundary_stack_trace": "Stacktrace", + "error_boundary_gathering_info": "Meer informatie verzamelen …", + "prefs_users_delete_button": "Gebruiker verwijderen", + "prefs_notifications_delete_after_one_week": "Na één week", + "prefs_notifications_delete_after_one_month": "Na één maand", + "prefs_users_dialog_title_add": "Gebruiker toevoegen", + "prefs_users_dialog_password_label": "Wachtwoord", + "error_boundary_unsupported_indexeddb_description": "De ntfy web applicatie heeft IndexedDB nodig om correct te kunnen functioneren, helaas ondersteund jouw browser IndexedDB niet in privé / incognito modus.

Dit is jammer maar het is ook onlogisch om de ntfy web applicatie in privé / incognito modus te gebruiken want alle gegevens worden bewaard in de browser zijn lokale opslag. Je kan hier meer over lezen in deze GitHub issue, of praat met ons op Discord of Matrix.", + "action_bar_show_menu": "Toon menu", + "action_bar_logo_alt": "ntfy logo", + "action_bar_toggle_mute": "Notificaties dempen/opheffen", + "action_bar_toggle_action_menu": "Actie menu openen/sluiten", + "message_bar_show_dialog": "Toon publicatie venster", + "message_bar_publish": "Bericht publiceren", + "nav_button_all_notifications": "Alle notificaties", + "nav_button_documentation": "Documentatie", + "nav_button_publish_message": "Notificatie publiceren", + "nav_button_subscribe": "Onderwerp abonneren", + "nav_button_muted": "Notificaties gedempt", + "nav_button_connecting": "verbinden", + "alert_grant_title": "Notificaties zijn uitgeschakeld", + "alert_grant_description": "Geef je browser toestemming om meldingen weer te geven.", + "alert_grant_button": "Nu toestaan", + "alert_not_supported_title": "Notificaties zijn niet ondersteund", + "notifications_list": "Notificaties lijst", + "notifications_list_item": "Notificatie", + "notifications_mark_read": "Markeer als gelezen", + "notifications_delete": "Verwijder", + "notifications_copied_to_clipboard": "Gekopieerd naar klembord", + "notifications_tags": "Tags", + "notifications_priority_x": "Prioriteit {{priority}}", + "notifications_new_indicator": "Nieuwe notificatie", + "notifications_attachment_image": "Afbeelding bijlage", + "notifications_attachment_copy_url_title": "Kopieer URL van bijlage naar klembord", + "notifications_attachment_copy_url_button": "URL kopiëren", + "notifications_attachment_open_title": "Ga naar {{url}}", + "notifications_attachment_open_button": "Bijlage openen", + "notifications_attachment_link_expires": "link vervalt op {{date}}", + "notifications_attachment_link_expired": "download link is verlopen", + "notifications_attachment_file_image": "afbeeldingsbestand", + "notifications_attachment_file_video": "videobestand", + "notifications_attachment_file_audio": "audiobestand", + "notifications_attachment_file_app": "Android app bestand", + "notifications_attachment_file_document": "overig document", + "notifications_click_copy_url_title": "URL naar klembord kopiëren", + "notifications_click_copy_url_button": "Link kopiëren", + "notifications_click_open_button": "Link openen", + "notifications_none_for_topic_description": "Om notificaties naar dit onderwerp te sturen, doe een PUT of POST naar de URL van het onderwerp.", + "notifications_none_for_any_description": "Om notificaties naar dit onderwerp te sturen, doe een PUT of POST naar de URL van het onderwerp. Hier is een voorbeeld met één van je onderwerpen.", + "notifications_no_subscriptions_title": "Het lijkt erop dat je nog op geen onderwerpen geabonneerd bent.", + "notifications_no_subscriptions_description": "Klik op de \"{{linktext}}\" link om een onderwerp te maken of erop te abonneren. Daarna kan je berichten sturen via PUT of POST and ontvang je hier notificaties.", + "notifications_example": "Voorbeeld", + "notifications_more_details": "Voor meer informatie, bezoek de website of documentatie.", + "notifications_loading": "Notificaties laden …", + "publish_dialog_title_topic": "Publiceren naar {{topic}}", + "publish_dialog_title_no_topic": "Notificatie publiceren", + "publish_dialog_progress_uploading": "Uploaden …", + "notifications_actions_open_url_title": "Ga naar {{url}}", + "notifications_actions_not_supported": "Deze actie is niet ondersteund in de web applicatie", + "notifications_actions_http_request_title": "Stuur HTTP {{method}} naar {{url}}", + "notifications_none_for_topic_title": "Je hebt nog geen notificaties ontvangen voor dit onderwerp.", + "publish_dialog_priority_low": "Lage prioriteit", + "publish_dialog_progress_uploading_detail": "Uploaden {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Notificatie gepubliceerd", + "publish_dialog_attachment_limits_file_and_quota_reached": "overschrijd {{fileSizeLimit}} bestandslimiet en quotum, {{remainingBytes}} resterend", + "publish_dialog_attachment_limits_file_reached": "overschrijd {{fileSizeLimit}} bestandslimiet", + "publish_dialog_priority_default": "Standaard prioriteit", + "publish_dialog_attachment_limits_quota_reached": "overschrijd quotum, {{remainingBytes}} resterend", + "publish_dialog_emoji_picker_show": "Kies een emoji", + "publish_dialog_priority_high": "Hoge prioriteit", + "publish_dialog_priority_max": "Maximale prioriteit", + "publish_dialog_priority_min": "Minimale prioriteit", + "publish_dialog_base_url_label": "Service URL", + "publish_dialog_base_url_placeholder": "Service URL, bijvoorbeeld: https://voorbeeld.com", + "publish_dialog_topic_label": "Onderwerp", + "publish_dialog_topic_placeholder": "Onderwerp, bijv. phil_alerts", + "publish_dialog_topic_reset": "Onderwerp resetten", + "publish_dialog_title_label": "Titel", + "publish_dialog_title_placeholder": "Notificatie titel , bijv. Schijfruimte alarm", + "publish_dialog_message_label": "Bericht", + "publish_dialog_message_placeholder": "Typ hier een bericht", + "publish_dialog_tags_placeholder": "Komma gescheiden lijst met tags, bijv. waarschuwing, srv1-backup", + "publish_dialog_priority_label": "Prioriteit", + "publish_dialog_click_label": "Klik URL", + "publish_dialog_click_reset": "Verwijder klik URL", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Adres om de notificatie naar door te sturen, bijv. phil@voorbeeld.com", + "publish_dialog_email_reset": "Email doorsturen verwijderen", + "publish_dialog_attach_label": "URL van bijlage", + "publish_dialog_click_placeholder": "URL die geopend zal worden wanneer op de notificatie geklikt wordt", + "publish_dialog_attach_placeholder": "Bestand bijvoegen via URL, bijv. https://f-droid.org/F-Droid.apk", + "publish_dialog_attach_reset": "Bijlage URL verwijderen", + "publish_dialog_filename_label": "Bestandsnaam", + "publish_dialog_filename_placeholder": "Bestandsnaam van bijlage", + "publish_dialog_delay_label": "Uitstellen", + "publish_dialog_delay_placeholder": "Bezorging uitstellen, bijv. {{unixTimestamp}}, {{relativeTime}}, of \"{{naturalLanguage}}\" (alleen Engels)", + "publish_dialog_delay_reset": "Verwijder uitgestelde bezorging", + "publish_dialog_other_features": "Andere functionaliteiten:", + "publish_dialog_chip_click_label": "Klik URL", + "publish_dialog_chip_email_label": "Doorsturen naar email", + "publish_dialog_chip_attach_url_label": "Bestand bijvoegen via URL", + "publish_dialog_chip_delay_label": "Uitgestelde bezorging", + "publish_dialog_chip_topic_label": "Onderwerp veranderen", + "publish_dialog_details_examples_description": "Voor meer voorbeelden en gedetailleerde beschrijvingen van alle functionaliteiten, bekijk de documentatie.", + "publish_dialog_button_cancel_sending": "Versturen annuleren", + "publish_dialog_button_cancel": "Annuleer", + "publish_dialog_button_send": "Verstuur", + "publish_dialog_checkbox_publish_another": "Nog een bericht versturen", + "publish_dialog_attached_file_title": "Bijgevoegd bestand:", + "publish_dialog_attached_file_filename_placeholder": "Bijlage bestandsnaam", + "publish_dialog_attached_file_remove": "Verwijder bijgevoegd bestand", + "publish_dialog_drop_file_here": "Bestand hier slepen", + "emoji_picker_search_placeholder": "Emoji zoeken", + "emoji_picker_search_clear": "Zoeken leegmaken", + "subscribe_dialog_subscribe_topic_placeholder": "Onderwerp naam, bijv. phils_waarschuwingen", + "subscribe_dialog_subscribe_use_another_label": "Gebruik een andere server", + "subscribe_dialog_subscribe_base_url_label": "Service URL", + "subscribe_dialog_subscribe_button_cancel": "Annuleren", + "subscribe_dialog_subscribe_button_subscribe": "Abonneren", + "subscribe_dialog_login_title": "Aanmelding vereist", + "subscribe_dialog_login_description": "Dit onderwerp is beveiligd met een wachtwoord. Geef een gebruikersnaam en wachtwoord op om te abonneren.", + "subscribe_dialog_login_username_label": "Gebruikersnaam, bijv. phil", + "subscribe_dialog_subscribe_title": "Onderwerp abonneren", + "subscribe_dialog_subscribe_description": "Onderwerpen zijn mogelijk niet beschermd met een wachtwoord, kies daarom een moeilijk te raden naam. Na abonneren kun je notificaties via PUT/POST sturen.", + "subscribe_dialog_login_password_label": "Wachtwoord", + "subscribe_dialog_login_button_back": "Terug", + "subscribe_dialog_login_button_login": "Aanmelden", + "subscribe_dialog_error_user_not_authorized": "Gebruiker {{username}} heeft geen toegang", + "subscribe_dialog_error_user_anonymous": "anoniem", + "prefs_notifications_title": "Notificaties", + "prefs_notifications_sound_title": "Meldingsgeluid", + "prefs_notifications_sound_description_none": "Notificaties zullen geen geluid geven", + "prefs_notifications_sound_play": "Geselecteerd geluid afspelen", + "prefs_notifications_sound_description_some": "Inkomende notificaties zullen het {{sound}} geluid afspelen", + "prefs_notifications_sound_no_sound": "Geen geluid", + "prefs_notifications_min_priority_title": "Minimale prioriteit", + "prefs_notifications_min_priority_description_any": "Toon alle notificaties, ongeacht prioriteit", + "prefs_notifications_min_priority_description_x_or_higher": "Toon notificaties als prioriteit {{number}} ({{name}}) is of hoger", + "prefs_notifications_min_priority_description_max": "Toon notificaties als prioriteit 5 (maximaal) is", + "prefs_notifications_min_priority_any": "Elke prioriteit", + "prefs_notifications_min_priority_low_and_higher": "Lage prioriteit en hoger", + "prefs_notifications_min_priority_default_and_higher": "Standaard prioriteit en hoger", + "prefs_notifications_min_priority_high_and_higher": "Hoge prioriteit en hoger", + "prefs_notifications_min_priority_max_only": "Alleen maximale prioriteit", + "prefs_notifications_delete_after_title": "Notificaties verwijderen", + "prefs_notifications_delete_after_never": "Nooit", + "prefs_notifications_delete_after_three_hours": "Na drie uur", + "prefs_notifications_delete_after_one_day": "Na één dag", + "prefs_notifications_delete_after_never_description": "Notificaties worden nooit automatisch verwijderd", + "prefs_notifications_delete_after_three_hours_description": "Notificaties worden na drie uur automatisch verwijderd", + "prefs_notifications_delete_after_one_day_description": "Notificaties worden na één dag automatisch verwijderd", + "prefs_notifications_delete_after_one_week_description": "Notificaties worden na één week automatisch verwijderd", + "prefs_notifications_delete_after_one_month_description": "Notificaties worden na één maand automatisch verwijderd", + "prefs_users_title": "Gebruikers beheren", + "prefs_users_description": "Gebruikers voor beveiligde onderwerpen kunnen hier toegevoegd of verwijderd worden. Let op: gebruikersnaam en wachtwoord worden opgeslagen in lokale browser opslag.", + "prefs_users_table": "Gebruikerstabel", + "prefs_users_add_button": "Gebruiker toevoegen", + "prefs_users_edit_button": "Gebruiker bewerken", + "prefs_users_table_user_header": "Gebruiker", + "prefs_users_table_base_url_header": "Service URL", + "prefs_users_dialog_base_url_label": "Service URL, bijv. https://ntfy.sh", + "prefs_users_dialog_username_label": "Gebruikersnaam, bijv. phil", + "prefs_users_dialog_button_cancel": "Annuleren", + "prefs_users_dialog_button_add": "Toevoegen", + "prefs_users_dialog_button_save": "Bewaren", + "prefs_appearance_title": "Weergave", + "prefs_appearance_language_title": "Taal", + "priority_min": "min", + "priority_low": "laag", + "priority_default": "standaard", + "priority_high": "hoog", + "priority_max": "max", + "error_boundary_unsupported_indexeddb_title": "Privé / incognito browservensters worden niet ondersteund" } diff --git a/web/public/static/langs/pl.json b/web/public/static/langs/pl.json index 697de556..189e2305 100644 --- a/web/public/static/langs/pl.json +++ b/web/public/static/langs/pl.json @@ -1,191 +1,191 @@ { - "action_bar_send_test_notification": "Wyślij powiadomienie testowe", - "action_bar_clear_notifications": "Wyczyść powiadomienia", - "action_bar_toggle_mute": "Włączanie/wyłączanie wyciszania powiadomień", - "action_bar_toggle_action_menu": "Otwórz/zamknij menu działań", - "message_bar_type_message": "Wpisz wiadomość tutaj", - "message_bar_error_publishing": "Błąd przy wysyłaniu powiadomienia", - "message_bar_show_dialog": "Pokaż okno dialogowe publikacji", - "nav_button_all_notifications": "Wszystkie powiadomienia", - "nav_button_documentation": "Dokumentacja", - "nav_button_muted": "Powiadomienia wyciszone", - "alert_grant_title": "Powiadomienia są wyłączone", - "alert_grant_description": "Udziel przeglądarce pozwolenia na wyświetlanie powiadomień na pulpicie.", - "alert_grant_button": "Pozwól teraz", - "alert_not_supported_title": "Powiadomienia nie są obsługiwane", - "alert_not_supported_description": "Powiadomienia nie są obsługiwane przez Twoją przeglądarkę.", - "notifications_list": "Lista powiadomień", - "notifications_list_item": "Powiadomienie", - "notifications_mark_read": "Oznacz jako przeczytane", - "notifications_delete": "Usuń", - "notifications_copied_to_clipboard": "Skopiowano do schowka", - "notifications_tags": "Tagi", - "message_bar_publish": "Opublikuj powiadomienie", - "nav_topics_title": "Subskrybowane tematy", - "nav_button_settings": "Ustawienia", - "nav_button_publish_message": "Opublikuj powiadomienie", - "nav_button_subscribe": "Zasubskrybuj temat", - "nav_button_connecting": "łączenie", - "notifications_attachment_image": "Obraz załącznika", - "notifications_attachment_copy_url_button": "Kopiuj Adres URL", - "notifications_attachment_link_expires": "Łącze wygasa w dniu {{date}}", - "notifications_attachment_link_expired": "Łącze do pobrania wygasło", - "notifications_attachment_file_image": "plik graficzny", - "notifications_attachment_file_video": "plik wideo", - "notifications_attachment_file_audio": "plik audio", - "notifications_attachment_file_app": "plik aplikacji Android", - "notifications_attachment_file_document": "inny dokument", - "notifications_click_copy_url_title": "Skopiuj adres URL do schowka", - "notifications_click_open_button": "Otwórz łącze", - "notifications_actions_open_url_title": "Przejdź do {{url}}", - "notifications_actions_not_supported": "Ta akcja nie jest obsługiwana w aplikacji internetowej", - "notifications_actions_http_request_title": "Wyślij HTTP {{method}} do {{url}}", - "notifications_none_for_topic_title": "Nie otrzymałeś jeszcze żadnych powiadomień dla tego tematu.", - "notifications_none_for_any_description": "Aby wysłać powiadomienia do tematu, wyślij PUT/POST do adresu URL tematu. Oto przykład z jednym z twoich tematów.", - "notifications_no_subscriptions_title": "Wygląda na to, że nie masz jeszcze żadnych subskrypcji.", - "notifications_no_subscriptions_description": "Kliknij łącze \"{{linktext}}\", aby stworzyć lub zasubskrybować temat. Następnie możesz wysyłać wiadomości za pomocą PUT lub POST i otrzymywać powiadomienia tutaj.", - "notifications_example": "Przykład", - "notifications_loading": "Ładowanie powiadomień …", - "publish_dialog_title_topic": "Opublikuj do {{topic}}", - "publish_dialog_title_no_topic": "Opublikuj powiadomienie", - "publish_dialog_progress_uploading": "Przesyłanie …", - "publish_dialog_progress_uploading_detail": "Przesyłanie {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "Powiadomienie wysłane", - "publish_dialog_attachment_limits_file_and_quota_reached": "przekracza limit rozmiaru pliku {{fileSizeLimit}}, pozostaje {{remainingBytes}}", - "publish_dialog_attachment_limits_file_reached": "przekracza limit rozmiaru pliku {{filesizeLimit}}", - "publish_dialog_attachment_limits_quota_reached": "przekracza limit, {{remainingBytes}} pozostało", - "publish_dialog_emoji_picker_show": "Wybierz emotkę", - "publish_dialog_priority_min": "Min. priorytet", - "publish_dialog_priority_low": "Niski priorytet", - "publish_dialog_base_url_label": "Adres URL usługi", - "publish_dialog_base_url_placeholder": "Adres URL usługi, np. https://example.com", - "publish_dialog_topic_label": "Nazwa tematu", - "publish_dialog_topic_placeholder": "Nazwa tematu, np. moje_alerty", - "publish_dialog_topic_reset": "Resetuj temat", - "publish_dialog_title_label": "Tytuł", - "publish_dialog_title_placeholder": "Tytuł notyfikacji, np. Niski poziom baterrii", - "publish_dialog_message_label": "Wiadomość", - "publish_dialog_message_placeholder": "Wpisz wiadomość tutaj", - "publish_dialog_tags_label": "Tagi", - "publish_dialog_tags_placeholder": "Lista tagów oddzielona przecinkami, np. ostrzeżenie, srv1-backup", - "publish_dialog_priority_label": "Priorytet", - "publish_dialog_click_label": "Kliknij Adres URL", - "publish_dialog_click_placeholder": "Adres URL, który ma być otwarty po kliknięciu na powiadomienie", - "publish_dialog_click_reset": "Usuń adres URL kliknięcia", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Adres, na który ma być wysłane powiadomienie, np. phil@example.com", - "publish_dialog_email_reset": "Usuń przekazywanie wiadomości email", - "publish_dialog_attach_label": "Adres URL załącznika", - "publish_dialog_attach_placeholder": "Dołączenie pliku z adresu URL, np. https://f-droid.org/F-Droid.apk", - "publish_dialog_attach_reset": "Usuń adres URL załącznika", - "publish_dialog_filename_label": "Nazwa pliku", - "publish_dialog_filename_placeholder": "Nazwa pliku załącznika", - "publish_dialog_delay_label": "Opóźnienie", - "publish_dialog_delay_reset": "Usuń opóźnione dostarczenie", - "publish_dialog_other_features": "Inne funkcje:", - "publish_dialog_chip_click_label": "Adres URL kliknięcia", - "publish_dialog_chip_email_label": "Przekaż na email", - "publish_dialog_chip_attach_url_label": "Dołącz plik z adresu URL", - "publish_dialog_chip_attach_file_label": "Dołącz plik lokalny", - "publish_dialog_chip_delay_label": "Opóźnienie dostawy", - "publish_dialog_chip_topic_label": "Zmień temat", - "publish_dialog_details_examples_description": "Przykłady i szczegółowe informacje na temat wszystkich opcji można znaleźć w dokumentacji.", - "publish_dialog_button_cancel_sending": "Anuluj wysyłanie", - "publish_dialog_button_send": "Wyślij", - "publish_dialog_checkbox_publish_another": "Wyślij kolejną wiadomość", - "publish_dialog_attached_file_title": "Załączony plik:", - "publish_dialog_attached_file_filename_placeholder": "Nazwa pliku załącznika", - "publish_dialog_drop_file_here": "Upuść plik tutaj", - "emoji_picker_search_placeholder": "Szukaj emotki", - "emoji_picker_search_clear": "Wyczyść wyszukiwanie", - "subscribe_dialog_subscribe_title": "Zasubskrybuj temat", - "subscribe_dialog_subscribe_topic_placeholder": "Nazwa tematu, np. moje_alerty", - "subscribe_dialog_subscribe_use_another_label": "Użyj innego serwera", - "subscribe_dialog_subscribe_base_url_label": "Adres URL usługi", - "subscribe_dialog_subscribe_button_cancel": "Anuluj", - "subscribe_dialog_login_description": "Ten temat jest chroniony hasłem. Proszę podać nazwę użytkownika i hasło, aby zasubskrybować.", - "subscribe_dialog_login_username_label": "Nazwa użytkownika, np. phil", - "subscribe_dialog_login_password_label": "Hasło", - "publish_dialog_button_cancel": "Anuluj", - "subscribe_dialog_login_button_back": "Powrót", - "subscribe_dialog_login_button_login": "Zaloguj się", - "subscribe_dialog_error_user_not_authorized": "Użytkownik {{username}} nie ma uprawnień", - "subscribe_dialog_error_user_anonymous": "anonim", - "prefs_notifications_title": "Powiadomienia", - "prefs_notifications_sound_title": "Dźwięk powiadomienia", - "prefs_notifications_sound_description_none": "Brak dźwięku po otrzymaniu powiadomienia", - "prefs_notifications_sound_description_some": "Odtwarzaj dźwięk {{sound}}, gdy nadejdzie powiadomienie", - "prefs_notifications_sound_play": "Odtwórz wybrany dźwięk", - "prefs_notifications_min_priority_title": "Minimalny priorytet", - "prefs_notifications_min_priority_description_any": "Pokaż wszystkie powiadomienia, niezależnie od priorytetu", - "prefs_notifications_min_priority_description_x_or_higher": "Pokazuj powiadomienia, gdy ich priorytet to {{number}} ({{name}}) lub wyższy", - "prefs_notifications_min_priority_description_max": "Pokaż powiadomienia, jeśli priorytet wynosi 5 (max)", - "prefs_notifications_min_priority_any": "Dowolny priorytet", - "prefs_notifications_min_priority_low_and_higher": "Niski priorytet i wyższy", - "prefs_notifications_min_priority_default_and_higher": "Priorytet standardowy i wyższy", - "prefs_notifications_min_priority_high_and_higher": "Wysoki priorytet i wyższy", - "prefs_notifications_delete_after_one_day": "Po jednym dniu", - "prefs_notifications_delete_after_one_week": "Po tygodniu", - "prefs_notifications_delete_after_one_month": "Po miesiącu", - "prefs_notifications_delete_after_never_description": "Powiadomienia nigdy nie są automatycznie usuwane", - "prefs_notifications_delete_after_three_hours_description": "Powiadomienia są automatycznie usuwane po trzech godzinach", - "prefs_notifications_delete_after_one_day_description": "Powiadomienia są automatycznie usuwane po jednym dniu", - "prefs_notifications_delete_after_one_month_description": "Powiadomienia są automatycznie usuwane po upływie jednego miesiąca", - "prefs_notifications_delete_after_one_week_description": "Powiadomienia są automatycznie usuwane po upływie jedego tygodnia", - "prefs_users_title": "Zarządzaj użytkownikami", - "prefs_users_description": "Dodaj/usuń użytkowników dla tematów chronionych hasłem. Uwaga: Nazwa użytkownika i hasło są przechowywane w lokalnej pamięci przeglądarki.", - "prefs_users_table": "Tabela użytkowników", - "prefs_users_add_button": "Dodaj użytkownika", - "notifications_attachment_open_button": "Otwórz załącznik", - "prefs_users_edit_button": "Edytuj użytkownika", - "prefs_users_delete_button": "Usuń użytkownika", - "prefs_users_table_base_url_header": "Adres URL usługi", - "prefs_users_dialog_title_add": "Dodaj użytkownika", - "prefs_users_dialog_button_cancel": "Anuluj", - "prefs_users_dialog_button_add": "Dodaj", - "prefs_users_dialog_button_save": "Zapisz", - "prefs_appearance_title": "Wygląd", - "prefs_appearance_language_title": "Język", - "error_boundary_title": "Oh nie, ntfy przestało działać", - "error_boundary_description": "Oczywiście, to nie miało się wydarzyć. Bardzo przepraszam za to.
Jeśli masz minutę, proszę zgłoś to na GitHubie, albo daj nam znać przez Discord lub Matrix.", - "error_boundary_button_copy_stack_trace": "Kopiuj stack trace", - "error_boundary_stack_trace": "Stack trace", - "error_boundary_gathering_info": "Zbierz więcej informacji …", - "error_boundary_unsupported_indexeddb_title": "Prywatne karty przeglądarki nie są obsługiwane", - "action_bar_show_menu": "Pokaż menu", - "action_bar_logo_alt": "ntfy logo", - "action_bar_unsubscribe": "Zrezygnuj z subskrypcji", - "notifications_attachment_copy_url_title": "Kopiuj adres URL załącznika do schowka", - "action_bar_settings": "Ustawienia", - "notifications_priority_x": "Priorytet {{priority}}", - "notifications_new_indicator": "Nowe powiadomienie", - "notifications_attachment_open_title": "Przejdź do {{url}}", - "notifications_click_copy_url_button": "Skopiuj łącze", - "notifications_none_for_topic_description": "Aby wysłać powiadomienia do tego tematu, wyślij PUT lub POST-Request na adres URL tematu.", - "notifications_none_for_any_title": "Nie otrzymałeś żadnych powiadomień.", - "notifications_more_details": "Bardziej szczegółowe informacje można znaleźć na stronie internetowej oraz w dokumentacji.", - "publish_dialog_priority_default": "Domyślny priorytet", - "publish_dialog_priority_max": "Max. priorytet", - "publish_dialog_priority_high": "Wysoki priorytet", - "publish_dialog_delay_placeholder": "Opóźnienie dostarczenie, np.{{unixTimestamp}}, {{relativeTime}}, lub \"{{naturalLanguage}}\" (tylko w języku angielskim)", - "subscribe_dialog_subscribe_button_subscribe": "Subskrybuj", - "prefs_users_table_user_header": "Użytkownik", - "publish_dialog_attached_file_remove": "Usuń załączony plik", - "subscribe_dialog_subscribe_description": "Tematy nie mogą być chronione hasłem, więc wybierz trudną do odgadnięcia nazwę. Po zasubskrybowaniu możesz wysyłać powiadomienia poprzez POST/PUT.", - "subscribe_dialog_login_title": "Wymagane jest zalogowanie się", - "prefs_notifications_delete_after_title": "Usuń powiadomienia", - "prefs_users_dialog_password_label": "Hasło", - "priority_low": "niski", - "priority_default": "podstawowy", - "priority_max": "maksymalny", - "prefs_notifications_delete_after_three_hours": "Po trzech godzinach", - "prefs_users_dialog_base_url_label": "Adres URL usługi, np. https://ntfy.sh", - "prefs_notifications_sound_no_sound": "Bez dzwięku", - "prefs_users_dialog_username_label": "Nazwa użytkownika, np. phil", - "priority_high": "wysoki", - "prefs_notifications_min_priority_max_only": "Tylko maksymalny priorytet", - "prefs_notifications_delete_after_never": "Nigdy", - "prefs_users_dialog_title_edit": "Edytuj użytkownika", - "priority_min": "minimum", - "error_boundary_unsupported_indexeddb_description": "Aplikacja ntfy potrzebuje IndexedDB, aby działać poprawnie, a Twoja przeglądarka nie obsługuje IndexedDB w prywatnych zakładkach.

To denerwujące, ale używanie ntfy w prywatnej zakładce nie ma sensu, ponieważ wszystkie dane są przechowywane w przeglądarce. Więcej informacji można uzyskać w tym wydaniu GitHub, lub na czacie w Discord lub Matrix." + "action_bar_send_test_notification": "Wyślij powiadomienie testowe", + "action_bar_clear_notifications": "Wyczyść powiadomienia", + "action_bar_toggle_mute": "Włączanie/wyłączanie wyciszania powiadomień", + "action_bar_toggle_action_menu": "Otwórz/zamknij menu działań", + "message_bar_type_message": "Wpisz wiadomość tutaj", + "message_bar_error_publishing": "Błąd przy wysyłaniu powiadomienia", + "message_bar_show_dialog": "Pokaż okno dialogowe publikacji", + "nav_button_all_notifications": "Wszystkie powiadomienia", + "nav_button_documentation": "Dokumentacja", + "nav_button_muted": "Powiadomienia wyciszone", + "alert_grant_title": "Powiadomienia są wyłączone", + "alert_grant_description": "Udziel przeglądarce pozwolenia na wyświetlanie powiadomień na pulpicie.", + "alert_grant_button": "Pozwól teraz", + "alert_not_supported_title": "Powiadomienia nie są obsługiwane", + "alert_not_supported_description": "Powiadomienia nie są obsługiwane przez Twoją przeglądarkę.", + "notifications_list": "Lista powiadomień", + "notifications_list_item": "Powiadomienie", + "notifications_mark_read": "Oznacz jako przeczytane", + "notifications_delete": "Usuń", + "notifications_copied_to_clipboard": "Skopiowano do schowka", + "notifications_tags": "Tagi", + "message_bar_publish": "Opublikuj powiadomienie", + "nav_topics_title": "Subskrybowane tematy", + "nav_button_settings": "Ustawienia", + "nav_button_publish_message": "Opublikuj powiadomienie", + "nav_button_subscribe": "Zasubskrybuj temat", + "nav_button_connecting": "łączenie", + "notifications_attachment_image": "Obraz załącznika", + "notifications_attachment_copy_url_button": "Kopiuj Adres URL", + "notifications_attachment_link_expires": "Łącze wygasa w dniu {{date}}", + "notifications_attachment_link_expired": "Łącze do pobrania wygasło", + "notifications_attachment_file_image": "plik graficzny", + "notifications_attachment_file_video": "plik wideo", + "notifications_attachment_file_audio": "plik audio", + "notifications_attachment_file_app": "plik aplikacji Android", + "notifications_attachment_file_document": "inny dokument", + "notifications_click_copy_url_title": "Skopiuj adres URL do schowka", + "notifications_click_open_button": "Otwórz łącze", + "notifications_actions_open_url_title": "Przejdź do {{url}}", + "notifications_actions_not_supported": "Ta akcja nie jest obsługiwana w aplikacji internetowej", + "notifications_actions_http_request_title": "Wyślij HTTP {{method}} do {{url}}", + "notifications_none_for_topic_title": "Nie otrzymałeś jeszcze żadnych powiadomień dla tego tematu.", + "notifications_none_for_any_description": "Aby wysłać powiadomienia do tematu, wyślij PUT/POST do adresu URL tematu. Oto przykład z jednym z twoich tematów.", + "notifications_no_subscriptions_title": "Wygląda na to, że nie masz jeszcze żadnych subskrypcji.", + "notifications_no_subscriptions_description": "Kliknij łącze \"{{linktext}}\", aby stworzyć lub zasubskrybować temat. Następnie możesz wysyłać wiadomości za pomocą PUT lub POST i otrzymywać powiadomienia tutaj.", + "notifications_example": "Przykład", + "notifications_loading": "Ładowanie powiadomień …", + "publish_dialog_title_topic": "Opublikuj do {{topic}}", + "publish_dialog_title_no_topic": "Opublikuj powiadomienie", + "publish_dialog_progress_uploading": "Przesyłanie …", + "publish_dialog_progress_uploading_detail": "Przesyłanie {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Powiadomienie wysłane", + "publish_dialog_attachment_limits_file_and_quota_reached": "przekracza limit rozmiaru pliku {{fileSizeLimit}}, pozostaje {{remainingBytes}}", + "publish_dialog_attachment_limits_file_reached": "przekracza limit rozmiaru pliku {{filesizeLimit}}", + "publish_dialog_attachment_limits_quota_reached": "przekracza limit, {{remainingBytes}} pozostało", + "publish_dialog_emoji_picker_show": "Wybierz emotkę", + "publish_dialog_priority_min": "Min. priorytet", + "publish_dialog_priority_low": "Niski priorytet", + "publish_dialog_base_url_label": "Adres URL usługi", + "publish_dialog_base_url_placeholder": "Adres URL usługi, np. https://example.com", + "publish_dialog_topic_label": "Nazwa tematu", + "publish_dialog_topic_placeholder": "Nazwa tematu, np. moje_alerty", + "publish_dialog_topic_reset": "Resetuj temat", + "publish_dialog_title_label": "Tytuł", + "publish_dialog_title_placeholder": "Tytuł notyfikacji, np. Niski poziom baterrii", + "publish_dialog_message_label": "Wiadomość", + "publish_dialog_message_placeholder": "Wpisz wiadomość tutaj", + "publish_dialog_tags_label": "Tagi", + "publish_dialog_tags_placeholder": "Lista tagów oddzielona przecinkami, np. ostrzeżenie, srv1-backup", + "publish_dialog_priority_label": "Priorytet", + "publish_dialog_click_label": "Kliknij Adres URL", + "publish_dialog_click_placeholder": "Adres URL, który ma być otwarty po kliknięciu na powiadomienie", + "publish_dialog_click_reset": "Usuń adres URL kliknięcia", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Adres, na który ma być wysłane powiadomienie, np. phil@example.com", + "publish_dialog_email_reset": "Usuń przekazywanie wiadomości email", + "publish_dialog_attach_label": "Adres URL załącznika", + "publish_dialog_attach_placeholder": "Dołączenie pliku z adresu URL, np. https://f-droid.org/F-Droid.apk", + "publish_dialog_attach_reset": "Usuń adres URL załącznika", + "publish_dialog_filename_label": "Nazwa pliku", + "publish_dialog_filename_placeholder": "Nazwa pliku załącznika", + "publish_dialog_delay_label": "Opóźnienie", + "publish_dialog_delay_reset": "Usuń opóźnione dostarczenie", + "publish_dialog_other_features": "Inne funkcje:", + "publish_dialog_chip_click_label": "Adres URL kliknięcia", + "publish_dialog_chip_email_label": "Przekaż na email", + "publish_dialog_chip_attach_url_label": "Dołącz plik z adresu URL", + "publish_dialog_chip_attach_file_label": "Dołącz plik lokalny", + "publish_dialog_chip_delay_label": "Opóźnienie dostawy", + "publish_dialog_chip_topic_label": "Zmień temat", + "publish_dialog_details_examples_description": "Przykłady i szczegółowe informacje na temat wszystkich opcji można znaleźć w dokumentacji.", + "publish_dialog_button_cancel_sending": "Anuluj wysyłanie", + "publish_dialog_button_send": "Wyślij", + "publish_dialog_checkbox_publish_another": "Wyślij kolejną wiadomość", + "publish_dialog_attached_file_title": "Załączony plik:", + "publish_dialog_attached_file_filename_placeholder": "Nazwa pliku załącznika", + "publish_dialog_drop_file_here": "Upuść plik tutaj", + "emoji_picker_search_placeholder": "Szukaj emotki", + "emoji_picker_search_clear": "Wyczyść wyszukiwanie", + "subscribe_dialog_subscribe_title": "Zasubskrybuj temat", + "subscribe_dialog_subscribe_topic_placeholder": "Nazwa tematu, np. moje_alerty", + "subscribe_dialog_subscribe_use_another_label": "Użyj innego serwera", + "subscribe_dialog_subscribe_base_url_label": "Adres URL usługi", + "subscribe_dialog_subscribe_button_cancel": "Anuluj", + "subscribe_dialog_login_description": "Ten temat jest chroniony hasłem. Proszę podać nazwę użytkownika i hasło, aby zasubskrybować.", + "subscribe_dialog_login_username_label": "Nazwa użytkownika, np. phil", + "subscribe_dialog_login_password_label": "Hasło", + "publish_dialog_button_cancel": "Anuluj", + "subscribe_dialog_login_button_back": "Powrót", + "subscribe_dialog_login_button_login": "Zaloguj się", + "subscribe_dialog_error_user_not_authorized": "Użytkownik {{username}} nie ma uprawnień", + "subscribe_dialog_error_user_anonymous": "anonim", + "prefs_notifications_title": "Powiadomienia", + "prefs_notifications_sound_title": "Dźwięk powiadomienia", + "prefs_notifications_sound_description_none": "Brak dźwięku po otrzymaniu powiadomienia", + "prefs_notifications_sound_description_some": "Odtwarzaj dźwięk {{sound}}, gdy nadejdzie powiadomienie", + "prefs_notifications_sound_play": "Odtwórz wybrany dźwięk", + "prefs_notifications_min_priority_title": "Minimalny priorytet", + "prefs_notifications_min_priority_description_any": "Pokaż wszystkie powiadomienia, niezależnie od priorytetu", + "prefs_notifications_min_priority_description_x_or_higher": "Pokazuj powiadomienia, gdy ich priorytet to {{number}} ({{name}}) lub wyższy", + "prefs_notifications_min_priority_description_max": "Pokaż powiadomienia, jeśli priorytet wynosi 5 (max)", + "prefs_notifications_min_priority_any": "Dowolny priorytet", + "prefs_notifications_min_priority_low_and_higher": "Niski priorytet i wyższy", + "prefs_notifications_min_priority_default_and_higher": "Priorytet standardowy i wyższy", + "prefs_notifications_min_priority_high_and_higher": "Wysoki priorytet i wyższy", + "prefs_notifications_delete_after_one_day": "Po jednym dniu", + "prefs_notifications_delete_after_one_week": "Po tygodniu", + "prefs_notifications_delete_after_one_month": "Po miesiącu", + "prefs_notifications_delete_after_never_description": "Powiadomienia nigdy nie są automatycznie usuwane", + "prefs_notifications_delete_after_three_hours_description": "Powiadomienia są automatycznie usuwane po trzech godzinach", + "prefs_notifications_delete_after_one_day_description": "Powiadomienia są automatycznie usuwane po jednym dniu", + "prefs_notifications_delete_after_one_month_description": "Powiadomienia są automatycznie usuwane po upływie jednego miesiąca", + "prefs_notifications_delete_after_one_week_description": "Powiadomienia są automatycznie usuwane po upływie jedego tygodnia", + "prefs_users_title": "Zarządzaj użytkownikami", + "prefs_users_description": "Dodaj/usuń użytkowników dla tematów chronionych hasłem. Uwaga: Nazwa użytkownika i hasło są przechowywane w lokalnej pamięci przeglądarki.", + "prefs_users_table": "Tabela użytkowników", + "prefs_users_add_button": "Dodaj użytkownika", + "notifications_attachment_open_button": "Otwórz załącznik", + "prefs_users_edit_button": "Edytuj użytkownika", + "prefs_users_delete_button": "Usuń użytkownika", + "prefs_users_table_base_url_header": "Adres URL usługi", + "prefs_users_dialog_title_add": "Dodaj użytkownika", + "prefs_users_dialog_button_cancel": "Anuluj", + "prefs_users_dialog_button_add": "Dodaj", + "prefs_users_dialog_button_save": "Zapisz", + "prefs_appearance_title": "Wygląd", + "prefs_appearance_language_title": "Język", + "error_boundary_title": "Oh nie, ntfy przestało działać", + "error_boundary_description": "Oczywiście, to nie miało się wydarzyć. Bardzo przepraszam za to.
Jeśli masz minutę, proszę zgłoś to na GitHubie, albo daj nam znać przez Discord lub Matrix.", + "error_boundary_button_copy_stack_trace": "Kopiuj stack trace", + "error_boundary_stack_trace": "Stack trace", + "error_boundary_gathering_info": "Zbierz więcej informacji …", + "error_boundary_unsupported_indexeddb_title": "Prywatne karty przeglądarki nie są obsługiwane", + "action_bar_show_menu": "Pokaż menu", + "action_bar_logo_alt": "ntfy logo", + "action_bar_unsubscribe": "Zrezygnuj z subskrypcji", + "notifications_attachment_copy_url_title": "Kopiuj adres URL załącznika do schowka", + "action_bar_settings": "Ustawienia", + "notifications_priority_x": "Priorytet {{priority}}", + "notifications_new_indicator": "Nowe powiadomienie", + "notifications_attachment_open_title": "Przejdź do {{url}}", + "notifications_click_copy_url_button": "Skopiuj łącze", + "notifications_none_for_topic_description": "Aby wysłać powiadomienia do tego tematu, wyślij PUT lub POST-Request na adres URL tematu.", + "notifications_none_for_any_title": "Nie otrzymałeś żadnych powiadomień.", + "notifications_more_details": "Bardziej szczegółowe informacje można znaleźć na stronie internetowej oraz w dokumentacji.", + "publish_dialog_priority_default": "Domyślny priorytet", + "publish_dialog_priority_max": "Max. priorytet", + "publish_dialog_priority_high": "Wysoki priorytet", + "publish_dialog_delay_placeholder": "Opóźnienie dostarczenie, np.{{unixTimestamp}}, {{relativeTime}}, lub \"{{naturalLanguage}}\" (tylko w języku angielskim)", + "subscribe_dialog_subscribe_button_subscribe": "Subskrybuj", + "prefs_users_table_user_header": "Użytkownik", + "publish_dialog_attached_file_remove": "Usuń załączony plik", + "subscribe_dialog_subscribe_description": "Tematy nie mogą być chronione hasłem, więc wybierz trudną do odgadnięcia nazwę. Po zasubskrybowaniu możesz wysyłać powiadomienia poprzez POST/PUT.", + "subscribe_dialog_login_title": "Wymagane jest zalogowanie się", + "prefs_notifications_delete_after_title": "Usuń powiadomienia", + "prefs_users_dialog_password_label": "Hasło", + "priority_low": "niski", + "priority_default": "podstawowy", + "priority_max": "maksymalny", + "prefs_notifications_delete_after_three_hours": "Po trzech godzinach", + "prefs_users_dialog_base_url_label": "Adres URL usługi, np. https://ntfy.sh", + "prefs_notifications_sound_no_sound": "Bez dzwięku", + "prefs_users_dialog_username_label": "Nazwa użytkownika, np. phil", + "priority_high": "wysoki", + "prefs_notifications_min_priority_max_only": "Tylko maksymalny priorytet", + "prefs_notifications_delete_after_never": "Nigdy", + "prefs_users_dialog_title_edit": "Edytuj użytkownika", + "priority_min": "minimum", + "error_boundary_unsupported_indexeddb_description": "Aplikacja ntfy potrzebuje IndexedDB, aby działać poprawnie, a Twoja przeglądarka nie obsługuje IndexedDB w prywatnych zakładkach.

To denerwujące, ale używanie ntfy w prywatnej zakładce nie ma sensu, ponieważ wszystkie dane są przechowywane w przeglądarce. Więcej informacji można uzyskać w tym wydaniu GitHub, lub na czacie w Discord lub Matrix." } diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 009458ed..b1c5bfcc 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -1,192 +1,192 @@ { - "notifications_attachment_open_button": "Abrir anexo", - "action_bar_clear_notifications": "Limpar todas as notificações", - "action_bar_unsubscribe": "Desinscrever", - "message_bar_type_message": "Escreva uma mensagem aqui", - "message_bar_error_publishing": "Erro ao publicar notificação", - "nav_button_all_notifications": "Todas notificações", - "nav_button_settings": "Configurações", - "nav_button_subscribe": "Inscrever no tópico", - "alert_grant_title": "Notificações estão desativadas", - "alert_grant_description": "Conceder ao navegador permissão para mostrar notificações.", - "alert_grant_button": "Conceder agora", - "alert_not_supported_title": "Notificações não são suportadas", - "alert_not_supported_description": "Notificações não são suportadas pelo seu navagador.", - "notifications_copied_to_clipboard": "Copiado para a área de transferência", - "notifications_tags": "Etiquetas", - "notifications_attachment_copy_url_title": "Copiar URL do anexo para a área de transferência", - "notifications_click_copy_url_title": "Copiar URL do link para a área de transferência", - "notifications_click_copy_url_button": "Copiar link", - "notifications_click_open_title": "Ir para {{url}}", - "notifications_click_open_button": "Abrir link", - "notifications_none_for_topic_title": "Você ainda não recebeu nenhuma notificação para esse tópico.", - "notifications_none_for_topic_description": "Para enviar notificações para esse tópico, basta usar os métodos PUT ou POST na URL do tópico.", - "notifications_none_for_any_title": "Você ainda não recebeu nenhuma notificação.", - "notifications_none_for_any_description": "Para enviar notificações a um tópico, basta usar os métodos PUT ou POST para o URL do tópico. Aqui um exemplo usando um dos seus tópicos.", - "notifications_no_subscriptions_title": "Parece que você não tem nenhuma inscrição ainda.", - "notifications_no_subscriptions_description": "Clique no link \"{{linktext}}\" para criar ou inscrever em um tópico. Depois disso, poderá enviar mensagens via PUT ou POST e você receberá notificações aqui.", - "action_bar_settings": "Configurações", - "action_bar_send_test_notification": "Enviar notificação de teste", - "nav_button_documentation": "Documentação", - "nav_button_publish_message": "Publicar notificação", - "nav_topics_title": "Tópicos inscritos", - "notifications_attachment_open_title": "Ir para {{url}}", - "notifications_attachment_link_expires": "link expira em {{date}}", - "notifications_attachment_copy_url_button": "Copiar URL", - "notifications_attachment_link_expired": "link para transferência expirado", - "notifications_example": "Exemplo", - "notifications_more_details": "Para mais informações, confira site ou documentação.", - "notifications_loading": "Carregando notificações…", - "subscribe_dialog_error_user_anonymous": "anônimo", - "prefs_notifications_delete_after_three_hours": "Após três horas", - "prefs_notifications_delete_after_one_day": "Após um dia", - "prefs_notifications_delete_after_one_week": "Após uma semana", - "prefs_notifications_delete_after_one_month": "Após um mês", - "notifications_actions_not_supported": "Ação não suportada no aplicativo web", - "notifications_actions_http_request_title": "Enviar HTTP {{method}} para {{url}}", - "notifications_actions_open_url_title": "Ir para {{url}}", - "publish_dialog_title_topic": "Publicar em {{topic}}", - "publish_dialog_title_no_topic": "Publicar notificação", - "publish_dialog_progress_uploading": "Enviando …", - "publish_dialog_progress_uploading_detail": "Fazendo upload de {{loaded}}/{{total}} ({{percent}}%)…", - "publish_dialog_message_published": "Notificação publicada", - "publish_dialog_attachment_limits_file_reached": "excede o limite de arquivo {{fileSizeLimit}}", - "publish_dialog_priority_min": "Prioridade mínima", - "publish_dialog_priority_low": "Baixa prioridade", - "publish_dialog_priority_default": "Prioridade padrão", - "publish_dialog_base_url_label": "URL de serviço", - "publish_dialog_base_url_placeholder": "URL de serviço, por exemplo https://example.com", - "publish_dialog_topic_label": "Nome do tópico", - "publish_dialog_topic_placeholder": "Nome do tópico, por exemplo, phil_alerts", - "publish_dialog_title_label": "Título", - "publish_dialog_title_placeholder": "Título da notificação, por exemplo Alerta de espaço em disco", - "publish_dialog_message_label": "Mensagem", - "publish_dialog_message_placeholder": "Digite uma mensagem aqui", - "publish_dialog_tags_label": "Etiquetas", - "publish_dialog_tags_placeholder": "Lista de etiquetas, separadas por vírgula, por exemplo: srv1-backup", - "publish_dialog_priority_label": "Prioridade", - "publish_dialog_click_label": "Clique em URL", - "publish_dialog_click_placeholder": "URL que é aberto quando a notificação é clicada", - "publish_dialog_email_label": "Email", - "publish_dialog_email_placeholder": "Email para encaminhar a notificação, por exemplo phil@example.com", - "publish_dialog_filename_label": "Nome do arquivo", - "publish_dialog_filename_placeholder": "Nome do arquivo anexado", - "publish_dialog_delay_label": "Atraso", - "publish_dialog_delay_placeholder": "Atraso na entrega, por exemplo {{{unixTimestamp}}, {{relativeTime}}, ou \"{{naturalLanguage}}\" (apenas em inglês)", - "publish_dialog_other_features": "Outros recursos:", - "publish_dialog_chip_click_label": "Clique em URL", - "publish_dialog_chip_attach_file_label": "Anexar arquivo local", - "publish_dialog_chip_delay_label": "Atraso na entrega", - "publish_dialog_chip_topic_label": "Alterar tópico", - "publish_dialog_button_cancel_sending": "Cancelar o envio", - "publish_dialog_attached_file_filename_placeholder": "Nome do arquivo anexado", - "publish_dialog_drop_file_here": "Solte o arquivo aqui", - "emoji_picker_search_placeholder": "Pesquisar emoji", - "subscribe_dialog_subscribe_title": "Inscrever no tópico", - "subscribe_dialog_subscribe_use_another_label": "Usar outro servidor", - "subscribe_dialog_subscribe_description": "Os tópicos podem não ser protegidos por senha, então escolha um nome que não seja fácil de adivinhar. Uma vez inscrito, você pode PUT/POST notificações.", - "subscribe_dialog_subscribe_topic_placeholder": "Nome do tópico, por exemplo phil_alerts", - "subscribe_dialog_subscribe_button_cancel": "Cancelar", - "subscribe_dialog_subscribe_button_subscribe": "Inscrever", - "prefs_notifications_min_priority_description_max": "Mostrar notificações se prioridade for 5 (máxima)", - "prefs_notifications_min_priority_any": "Qualquer prioridade", - "prefs_notifications_min_priority_low_and_higher": "Baixa prioridade e acima", - "prefs_notifications_min_priority_default_and_higher": "Prioridade padrão e acima", - "subscribe_dialog_login_password_label": "Senha", - "subscribe_dialog_login_button_back": "Voltar", - "prefs_notifications_min_priority_high_and_higher": "Alta prioridade e acima", - "prefs_notifications_min_priority_max_only": "Apenas prioridade máxima", - "prefs_notifications_delete_after_title": "Apagar notificações", - "prefs_notifications_delete_after_never": "Nunca", - "prefs_notifications_delete_after_never_description": "Notificações nunca serão auto excluídas", - "prefs_users_description": "Adicionar/remover usuários em seus tópicos protegidos. Note que o usuário e senha são salvos no armazenamento local do navegador.", - "prefs_users_add_button": "Adicionar usuário", - "prefs_users_table_user_header": "Usuário", - "prefs_users_table_base_url_header": "URL de serviço", - "prefs_users_dialog_title_add": "Adicionar usuário", - "prefs_users_dialog_title_edit": "Editar usuário", - "prefs_users_dialog_base_url_label": "URL de serviço, exemplo https://ntfy.sh", - "prefs_users_dialog_username_label": "Usuário, por exemplo phil", - "prefs_users_dialog_password_label": "Senha", - "prefs_users_dialog_button_cancel": "Cancelar", - "prefs_users_dialog_button_add": "Adicionar", - "prefs_users_dialog_button_save": "Salvar", - "prefs_appearance_title": "Aparência", - "prefs_appearance_language_title": "LInguagem", - "priority_min": "minima", - "priority_low": "baixa", - "priority_default": "padrão", - "priority_high": "alta", - "priority_max": "máxima", - "error_boundary_title": "Ah não, ntfy parou de funcionar", - "error_boundary_gathering_info": "Coletar mais informações …", - "error_boundary_description": "Isto obviamente não deveria ter acontecido. Lamentamos muito por isto.
Se tiver um minuto, por favor relate isto no GitHub, ou informe-nos através de Discord ou Matrix.", - "error_boundary_button_copy_stack_trace": "Copiar rastreamento de pilha", - "error_boundary_stack_trace": "Rastreamento de pilha", - "publish_dialog_attachment_limits_file_and_quota_reached": "excede {{fileSizeLimit}} limite de arquivo e cota, {{remainingBytes}} restante", - "publish_dialog_attachment_limits_quota_reached": "excede a cota, {{remainingBytes}} restantes", - "publish_dialog_priority_high": "Alta prioridade", - "publish_dialog_priority_max": "Prioridade máxima", - "publish_dialog_button_send": "Enviar", - "publish_dialog_attached_file_title": "Arquivo anexado:", - "publish_dialog_attach_label": "URL de anexo", - "publish_dialog_chip_attach_url_label": "Anexar arquivo por URL", - "publish_dialog_attach_placeholder": "Anexar arquivo por URL, por exemplo, https://f-droid.org/F-Droid.apk", - "publish_dialog_chip_email_label": "Encaminhar para email", - "publish_dialog_checkbox_publish_another": "Publicar outro", - "publish_dialog_details_examples_description": "Para obter exemplos e uma descrição detalhada de todos os recursos de envio, consulte a documentação.", - "publish_dialog_button_cancel": "Cancelar", - "prefs_notifications_delete_after_one_day_description": "Notificações são automaticamente excluídas após um dia", - "prefs_notifications_delete_after_one_month_description": "Notificações são automaticamente excluídas após um mês", - "prefs_users_title": "Gerenciar usuários", - "subscribe_dialog_error_user_not_authorized": "Usuário {{username}} não autorizado", - "prefs_notifications_title": "Notificações", - "prefs_notifications_sound_no_sound": "Sem som", - "subscribe_dialog_login_title": "Login necessário", - "prefs_notifications_sound_title": "Som de notificações", - "prefs_notifications_min_priority_title": "Mínima prioridade", - "prefs_notifications_min_priority_description_any": "Mostrando todas as notificações, independente da prioridade", - "prefs_notifications_delete_after_one_week_description": "Notificações são automaticamente excluídas após uma semana", - "subscribe_dialog_login_description": "Esse tópico é protegido por senha. Por favor digite o nome de usuário e senha para inscrever.", - "subscribe_dialog_login_username_label": "Nome, por exemplo phil", - "subscribe_dialog_login_button_login": "Login", - "prefs_notifications_sound_description_none": "Notificações não reproduzem nenhum som quando chegam", - "prefs_notifications_sound_description_some": "Notificações reproduzem som {{sound}} quando chegam", - "prefs_notifications_min_priority_description_x_or_higher": "Mostrar notificações se prioridade for {{number}} ({{name}}) ou acima", - "prefs_notifications_delete_after_three_hours_description": "Notificações são automaticamente excluídas após três horas", - "publish_dialog_attach_reset": "Remover URL do anexo", - "publish_dialog_emoji_picker_show": "Escolher emoji", - "publish_dialog_attached_file_remove": "Remover arquivo anexado", - "emoji_picker_search_clear": "Limpar", - "subscribe_dialog_subscribe_base_url_label": "URL de subscrição", - "notifications_list": "Lista de notificações", - "message_bar_show_dialog": "Mostrar caixa de publicação", - "publish_dialog_topic_reset": "Resetar tópico", - "publish_dialog_delay_reset": "Remover entrega adiada da notificação", - "nav_button_connecting": "Conectando", - "publish_dialog_email_reset": "Remover encaminhar email", - "prefs_notifications_sound_play": "Reproduzir som selecionado", - "action_bar_show_menu": "Mostrar menu", - "action_bar_toggle_mute": "Habilita/Desabilita notificações", - "action_bar_toggle_action_menu": "Abrir/fechar menu de ação", - "action_bar_logo_alt": "nfty logo", - "message_bar_publish": "Publicar mensagem", - "nav_button_muted": "Notificações desabilitadas", - "notifications_list_item": "Notificação", - "notifications_mark_read": "Marcar como lido", - "notifications_delete": "Excluir", - "notifications_priority_x": "Prioridade {{priority}}", - "notifications_new_indicator": "Nova notificação", - "notifications_attachment_image": "Imagem anexada", - "notifications_attachment_file_image": "Arquivo de imagem", - "notifications_attachment_file_video": "Arquivo de vídeo", - "notifications_attachment_file_audio": "Arquivo de áudio", - "notifications_attachment_file_app": "Arquivo apk android", - "notifications_attachment_file_document": "Outros documentos", - "publish_dialog_click_reset": "Remover URL clicável", - "prefs_users_table": "Tabela de usuários", - "prefs_users_edit_button": "Editar usuário", - "prefs_users_delete_button": "Excluir usuário", - "error_boundary_unsupported_indexeddb_title": "Navegação anônima não suportada", - "error_boundary_unsupported_indexeddb_description": "O ntfy web app precisa do IndexedDB para funcionar, e seu navegador não suporta IndexedDB no modo de navegação privada.

Embora isso seja lamentável, também não faz muito sentido usar o ntfy web app no modo de navegação privada de qualquer maneira, porque tudo é armazenado no armazenamento do navegador. Você pode ler mais sobre isso nesta edição do GitHub, ou falar conosco em Discord ou Matrix." + "notifications_attachment_open_button": "Abrir anexo", + "action_bar_clear_notifications": "Limpar todas as notificações", + "action_bar_unsubscribe": "Desinscrever", + "message_bar_type_message": "Escreva uma mensagem aqui", + "message_bar_error_publishing": "Erro ao publicar notificação", + "nav_button_all_notifications": "Todas notificações", + "nav_button_settings": "Configurações", + "nav_button_subscribe": "Inscrever no tópico", + "alert_grant_title": "Notificações estão desativadas", + "alert_grant_description": "Conceder ao navegador permissão para mostrar notificações.", + "alert_grant_button": "Conceder agora", + "alert_not_supported_title": "Notificações não são suportadas", + "alert_not_supported_description": "Notificações não são suportadas pelo seu navagador.", + "notifications_copied_to_clipboard": "Copiado para a área de transferência", + "notifications_tags": "Etiquetas", + "notifications_attachment_copy_url_title": "Copiar URL do anexo para a área de transferência", + "notifications_click_copy_url_title": "Copiar URL do link para a área de transferência", + "notifications_click_copy_url_button": "Copiar link", + "notifications_click_open_title": "Ir para {{url}}", + "notifications_click_open_button": "Abrir link", + "notifications_none_for_topic_title": "Você ainda não recebeu nenhuma notificação para esse tópico.", + "notifications_none_for_topic_description": "Para enviar notificações para esse tópico, basta usar os métodos PUT ou POST na URL do tópico.", + "notifications_none_for_any_title": "Você ainda não recebeu nenhuma notificação.", + "notifications_none_for_any_description": "Para enviar notificações a um tópico, basta usar os métodos PUT ou POST para o URL do tópico. Aqui um exemplo usando um dos seus tópicos.", + "notifications_no_subscriptions_title": "Parece que você não tem nenhuma inscrição ainda.", + "notifications_no_subscriptions_description": "Clique no link \"{{linktext}}\" para criar ou inscrever em um tópico. Depois disso, poderá enviar mensagens via PUT ou POST e você receberá notificações aqui.", + "action_bar_settings": "Configurações", + "action_bar_send_test_notification": "Enviar notificação de teste", + "nav_button_documentation": "Documentação", + "nav_button_publish_message": "Publicar notificação", + "nav_topics_title": "Tópicos inscritos", + "notifications_attachment_open_title": "Ir para {{url}}", + "notifications_attachment_link_expires": "link expira em {{date}}", + "notifications_attachment_copy_url_button": "Copiar URL", + "notifications_attachment_link_expired": "link para transferência expirado", + "notifications_example": "Exemplo", + "notifications_more_details": "Para mais informações, confira site ou documentação.", + "notifications_loading": "Carregando notificações…", + "subscribe_dialog_error_user_anonymous": "anônimo", + "prefs_notifications_delete_after_three_hours": "Após três horas", + "prefs_notifications_delete_after_one_day": "Após um dia", + "prefs_notifications_delete_after_one_week": "Após uma semana", + "prefs_notifications_delete_after_one_month": "Após um mês", + "notifications_actions_not_supported": "Ação não suportada no aplicativo web", + "notifications_actions_http_request_title": "Enviar HTTP {{method}} para {{url}}", + "notifications_actions_open_url_title": "Ir para {{url}}", + "publish_dialog_title_topic": "Publicar em {{topic}}", + "publish_dialog_title_no_topic": "Publicar notificação", + "publish_dialog_progress_uploading": "Enviando …", + "publish_dialog_progress_uploading_detail": "Fazendo upload de {{loaded}}/{{total}} ({{percent}}%)…", + "publish_dialog_message_published": "Notificação publicada", + "publish_dialog_attachment_limits_file_reached": "excede o limite de arquivo {{fileSizeLimit}}", + "publish_dialog_priority_min": "Prioridade mínima", + "publish_dialog_priority_low": "Baixa prioridade", + "publish_dialog_priority_default": "Prioridade padrão", + "publish_dialog_base_url_label": "URL de serviço", + "publish_dialog_base_url_placeholder": "URL de serviço, por exemplo https://example.com", + "publish_dialog_topic_label": "Nome do tópico", + "publish_dialog_topic_placeholder": "Nome do tópico, por exemplo, phil_alerts", + "publish_dialog_title_label": "Título", + "publish_dialog_title_placeholder": "Título da notificação, por exemplo Alerta de espaço em disco", + "publish_dialog_message_label": "Mensagem", + "publish_dialog_message_placeholder": "Digite uma mensagem aqui", + "publish_dialog_tags_label": "Etiquetas", + "publish_dialog_tags_placeholder": "Lista de etiquetas, separadas por vírgula, por exemplo: srv1-backup", + "publish_dialog_priority_label": "Prioridade", + "publish_dialog_click_label": "Clique em URL", + "publish_dialog_click_placeholder": "URL que é aberto quando a notificação é clicada", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Email para encaminhar a notificação, por exemplo phil@example.com", + "publish_dialog_filename_label": "Nome do arquivo", + "publish_dialog_filename_placeholder": "Nome do arquivo anexado", + "publish_dialog_delay_label": "Atraso", + "publish_dialog_delay_placeholder": "Atraso na entrega, por exemplo {{{unixTimestamp}}, {{relativeTime}}, ou \"{{naturalLanguage}}\" (apenas em inglês)", + "publish_dialog_other_features": "Outros recursos:", + "publish_dialog_chip_click_label": "Clique em URL", + "publish_dialog_chip_attach_file_label": "Anexar arquivo local", + "publish_dialog_chip_delay_label": "Atraso na entrega", + "publish_dialog_chip_topic_label": "Alterar tópico", + "publish_dialog_button_cancel_sending": "Cancelar o envio", + "publish_dialog_attached_file_filename_placeholder": "Nome do arquivo anexado", + "publish_dialog_drop_file_here": "Solte o arquivo aqui", + "emoji_picker_search_placeholder": "Pesquisar emoji", + "subscribe_dialog_subscribe_title": "Inscrever no tópico", + "subscribe_dialog_subscribe_use_another_label": "Usar outro servidor", + "subscribe_dialog_subscribe_description": "Os tópicos podem não ser protegidos por senha, então escolha um nome que não seja fácil de adivinhar. Uma vez inscrito, você pode PUT/POST notificações.", + "subscribe_dialog_subscribe_topic_placeholder": "Nome do tópico, por exemplo phil_alerts", + "subscribe_dialog_subscribe_button_cancel": "Cancelar", + "subscribe_dialog_subscribe_button_subscribe": "Inscrever", + "prefs_notifications_min_priority_description_max": "Mostrar notificações se prioridade for 5 (máxima)", + "prefs_notifications_min_priority_any": "Qualquer prioridade", + "prefs_notifications_min_priority_low_and_higher": "Baixa prioridade e acima", + "prefs_notifications_min_priority_default_and_higher": "Prioridade padrão e acima", + "subscribe_dialog_login_password_label": "Senha", + "subscribe_dialog_login_button_back": "Voltar", + "prefs_notifications_min_priority_high_and_higher": "Alta prioridade e acima", + "prefs_notifications_min_priority_max_only": "Apenas prioridade máxima", + "prefs_notifications_delete_after_title": "Apagar notificações", + "prefs_notifications_delete_after_never": "Nunca", + "prefs_notifications_delete_after_never_description": "Notificações nunca serão auto excluídas", + "prefs_users_description": "Adicionar/remover usuários em seus tópicos protegidos. Note que o usuário e senha são salvos no armazenamento local do navegador.", + "prefs_users_add_button": "Adicionar usuário", + "prefs_users_table_user_header": "Usuário", + "prefs_users_table_base_url_header": "URL de serviço", + "prefs_users_dialog_title_add": "Adicionar usuário", + "prefs_users_dialog_title_edit": "Editar usuário", + "prefs_users_dialog_base_url_label": "URL de serviço, exemplo https://ntfy.sh", + "prefs_users_dialog_username_label": "Usuário, por exemplo phil", + "prefs_users_dialog_password_label": "Senha", + "prefs_users_dialog_button_cancel": "Cancelar", + "prefs_users_dialog_button_add": "Adicionar", + "prefs_users_dialog_button_save": "Salvar", + "prefs_appearance_title": "Aparência", + "prefs_appearance_language_title": "LInguagem", + "priority_min": "minima", + "priority_low": "baixa", + "priority_default": "padrão", + "priority_high": "alta", + "priority_max": "máxima", + "error_boundary_title": "Ah não, ntfy parou de funcionar", + "error_boundary_gathering_info": "Coletar mais informações …", + "error_boundary_description": "Isto obviamente não deveria ter acontecido. Lamentamos muito por isto.
Se tiver um minuto, por favor relate isto no GitHub, ou informe-nos através de Discord ou Matrix.", + "error_boundary_button_copy_stack_trace": "Copiar rastreamento de pilha", + "error_boundary_stack_trace": "Rastreamento de pilha", + "publish_dialog_attachment_limits_file_and_quota_reached": "excede {{fileSizeLimit}} limite de arquivo e cota, {{remainingBytes}} restante", + "publish_dialog_attachment_limits_quota_reached": "excede a cota, {{remainingBytes}} restantes", + "publish_dialog_priority_high": "Alta prioridade", + "publish_dialog_priority_max": "Prioridade máxima", + "publish_dialog_button_send": "Enviar", + "publish_dialog_attached_file_title": "Arquivo anexado:", + "publish_dialog_attach_label": "URL de anexo", + "publish_dialog_chip_attach_url_label": "Anexar arquivo por URL", + "publish_dialog_attach_placeholder": "Anexar arquivo por URL, por exemplo, https://f-droid.org/F-Droid.apk", + "publish_dialog_chip_email_label": "Encaminhar para email", + "publish_dialog_checkbox_publish_another": "Publicar outro", + "publish_dialog_details_examples_description": "Para obter exemplos e uma descrição detalhada de todos os recursos de envio, consulte a documentação.", + "publish_dialog_button_cancel": "Cancelar", + "prefs_notifications_delete_after_one_day_description": "Notificações são automaticamente excluídas após um dia", + "prefs_notifications_delete_after_one_month_description": "Notificações são automaticamente excluídas após um mês", + "prefs_users_title": "Gerenciar usuários", + "subscribe_dialog_error_user_not_authorized": "Usuário {{username}} não autorizado", + "prefs_notifications_title": "Notificações", + "prefs_notifications_sound_no_sound": "Sem som", + "subscribe_dialog_login_title": "Login necessário", + "prefs_notifications_sound_title": "Som de notificações", + "prefs_notifications_min_priority_title": "Mínima prioridade", + "prefs_notifications_min_priority_description_any": "Mostrando todas as notificações, independente da prioridade", + "prefs_notifications_delete_after_one_week_description": "Notificações são automaticamente excluídas após uma semana", + "subscribe_dialog_login_description": "Esse tópico é protegido por senha. Por favor digite o nome de usuário e senha para inscrever.", + "subscribe_dialog_login_username_label": "Nome, por exemplo phil", + "subscribe_dialog_login_button_login": "Login", + "prefs_notifications_sound_description_none": "Notificações não reproduzem nenhum som quando chegam", + "prefs_notifications_sound_description_some": "Notificações reproduzem som {{sound}} quando chegam", + "prefs_notifications_min_priority_description_x_or_higher": "Mostrar notificações se prioridade for {{number}} ({{name}}) ou acima", + "prefs_notifications_delete_after_three_hours_description": "Notificações são automaticamente excluídas após três horas", + "publish_dialog_attach_reset": "Remover URL do anexo", + "publish_dialog_emoji_picker_show": "Escolher emoji", + "publish_dialog_attached_file_remove": "Remover arquivo anexado", + "emoji_picker_search_clear": "Limpar", + "subscribe_dialog_subscribe_base_url_label": "URL de subscrição", + "notifications_list": "Lista de notificações", + "message_bar_show_dialog": "Mostrar caixa de publicação", + "publish_dialog_topic_reset": "Resetar tópico", + "publish_dialog_delay_reset": "Remover entrega adiada da notificação", + "nav_button_connecting": "Conectando", + "publish_dialog_email_reset": "Remover encaminhar email", + "prefs_notifications_sound_play": "Reproduzir som selecionado", + "action_bar_show_menu": "Mostrar menu", + "action_bar_toggle_mute": "Habilita/Desabilita notificações", + "action_bar_toggle_action_menu": "Abrir/fechar menu de ação", + "action_bar_logo_alt": "nfty logo", + "message_bar_publish": "Publicar mensagem", + "nav_button_muted": "Notificações desabilitadas", + "notifications_list_item": "Notificação", + "notifications_mark_read": "Marcar como lido", + "notifications_delete": "Excluir", + "notifications_priority_x": "Prioridade {{priority}}", + "notifications_new_indicator": "Nova notificação", + "notifications_attachment_image": "Imagem anexada", + "notifications_attachment_file_image": "Arquivo de imagem", + "notifications_attachment_file_video": "Arquivo de vídeo", + "notifications_attachment_file_audio": "Arquivo de áudio", + "notifications_attachment_file_app": "Arquivo apk android", + "notifications_attachment_file_document": "Outros documentos", + "publish_dialog_click_reset": "Remover URL clicável", + "prefs_users_table": "Tabela de usuários", + "prefs_users_edit_button": "Editar usuário", + "prefs_users_delete_button": "Excluir usuário", + "error_boundary_unsupported_indexeddb_title": "Navegação anônima não suportada", + "error_boundary_unsupported_indexeddb_description": "O ntfy web app precisa do IndexedDB para funcionar, e seu navegador não suporta IndexedDB no modo de navegação privada.

Embora isso seja lamentável, também não faz muito sentido usar o ntfy web app no modo de navegação privada de qualquer maneira, porque tudo é armazenado no armazenamento do navegador. Você pode ler mais sobre isso nesta edição do GitHub, ou falar conosco em Discord ou Matrix." } diff --git a/web/public/static/langs/ru.json b/web/public/static/langs/ru.json index 0e1cfea5..bf05022c 100644 --- a/web/public/static/langs/ru.json +++ b/web/public/static/langs/ru.json @@ -1,158 +1,158 @@ { - "publish_dialog_priority_min": "Мин. приоритет", - "action_bar_settings": "Настройки", - "action_bar_send_test_notification": "Отправить тестовое уведомление", - "action_bar_clear_notifications": "Удалить все уведомления", - "action_bar_unsubscribe": "Отписаться", - "message_bar_type_message": "Введите сообщение здесь", - "notifications_none_for_topic_description": "Чтобы отправить уведомление на данную тему, просто отправьте PUT или POST на URL-адрес этой темы.", - "notifications_none_for_any_description": "Чтобы отправить уведомления на тему, просто отправьте PUT или POST на URL-адрес темы. Вот пример используя одну из ваших тем.", - "notifications_no_subscriptions_title": "Похоже у вас ещё нет подписок.", - "alert_grant_description": "Разрешите браузеру показывать уведомления.", - "notifications_no_subscriptions_description": "Нажмите \"{{linktext}}\" ссылку, чтобы создать или подписаться на тему. После этого вы сможете отправлять сообщения используя PUT или POST, и вы будете получать здесь уведомления.", - "notifications_example": "Пример", - "notifications_more_details": "Дополнительную информацию найдёте на сайте или в документации.", - "notifications_loading": "Загружаются уведомления …", - "publish_dialog_title_topic": "Опубликовать в {{topic}}", - "publish_dialog_title_no_topic": "Опубликовать уведомление", - "publish_dialog_progress_uploading": "Загружается …", - "publish_dialog_progress_uploading_detail": "Загружается {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "Уведомление опубликовано", - "publish_dialog_attachment_limits_file_and_quota_reached": "превышает {{fileSizeLimit}} размер файла, {{remainingBytes}} осталось", - "publish_dialog_attachment_limits_file_reached": "превышает {{fileSizeLimit}} размер файла", - "publish_dialog_attachment_limits_quota_reached": "превышает квоту, {{remainingBytes}} осталось", - "publish_dialog_priority_low": "Низкий приоритет", - "publish_dialog_priority_default": "Приоритет по умолчанию", - "publish_dialog_priority_high": "Высокий приоритет", - "publish_dialog_priority_max": "Макс. приоритет", - "publish_dialog_base_url_label": "URL-адрес сервиса", - "publish_dialog_base_url_placeholder": "URL-адрес сервиса, например https://example.com", - "publish_dialog_topic_label": "Название темы", - "publish_dialog_topic_placeholder": "Название темы, например phil_alerts", - "publish_dialog_title_label": "Заголовок", - "publish_dialog_title_placeholder": "Заголовок уведомления, например Disk space alert", - "publish_dialog_message_label": "Сообщение", - "publish_dialog_message_placeholder": "Текст сообщения", - "publish_dialog_tags_label": "Тэги", - "publish_dialog_tags_placeholder": "Список тэгов, разделённый запятой, например warning, srv1-backup", - "publish_dialog_priority_label": "Приоритет", - "publish_dialog_click_label": "Нажмите на URL-адрес", - "publish_dialog_click_placeholder": "URL-адрес который откроется когда будет нажато уведомление", - "publish_dialog_email_label": "Эл. почта", - "message_bar_error_publishing": "Ошибка отправки уведомления", - "alert_not_supported_title": "Уведомления не поддерживаются", - "alert_not_supported_description": "Уведомления не поддерживаются вашим браузером.", - "notifications_copied_to_clipboard": "Скопировано в буфер обмена", - "notifications_attachment_open_button": "Открыть вложение", - "notifications_none_for_topic_title": "Вы ещё не получали уведомления для этой темы.", - "nav_topics_title": "Подписки на темы", - "nav_button_all_notifications": "Все уведомления", - "nav_button_settings": "Настройки", - "nav_button_documentation": "Документация", - "nav_button_publish_message": "Опубликовать уведомление", - "nav_button_subscribe": "Подписаться на тему", - "alert_grant_button": "Разрешить", - "notifications_attachment_copy_url_button": "Скопировать URL-адрес", - "notifications_attachment_open_title": "Перейти на {{url}}", - "notifications_attachment_link_expired": "срок действия ссылки для скачивания истёк", - "notifications_click_copy_url_button": "Скопировать ссылку", - "notifications_none_for_any_title": "Вы ещё не получали никаких уведомлений.", - "alert_grant_title": "Уведомления отключены", - "notifications_attachment_copy_url_title": "Скопировать URL-адрес вложения", - "notifications_actions_open_url_title": "Перейти на {{url}}", - "notifications_tags": "Тэги", - "notifications_attachment_link_expires": "срок действия ссылки истекает {{date}}", - "notifications_click_copy_url_title": "Скопировать URL-адрес ссылки", - "notifications_click_open_button": "Открыть ссылку", - "subscribe_dialog_subscribe_title": "Подписаться на тему", - "publish_dialog_button_cancel": "Отмена", - "subscribe_dialog_subscribe_description": "Темы могут быть не защищены паролем, поэтому укажите сложное имя. После подписки вы можете размещать/отправлять уведомления.", - "prefs_users_description": "Добавляйте/удаляйте пользователей для защищенных тем. Обратите внимание, что имя пользователя и пароль хранятся в локальном хранилище браузера.", - "error_boundary_description": "Этого, очевидно, не должно происходить. Очень сожалею об этом.
Если у вас есть минутка, пожалуйста сообщить об этом на GitHub, или сообщите нам через Discord или Matrix.", - "publish_dialog_email_placeholder": "Адрес для пересылки уведомления. Например, phil@example.com", - "publish_dialog_attach_placeholder": "Прикрепите файл по URL. Например, https://f-droid.org/F-Droid.apk", - "publish_dialog_filename_label": "Имя файла", - "publish_dialog_delay_label": "Задержка", - "publish_dialog_delay_placeholder": "Задержка доставки. Например, {{unixTimestamp}}, {{relativeTime}}, or \"{{naturalLanguage}}\" (English only)", - "publish_dialog_chip_click_label": "Адрес", - "publish_dialog_chip_email_label": "Переслать на электронную почту", - "publish_dialog_chip_attach_url_label": "Прикрепить файл по URL", - "publish_dialog_chip_attach_file_label": "Прикрепить локальный файл", - "publish_dialog_chip_delay_label": "Задержка отправки", - "publish_dialog_chip_topic_label": "Изменить тему", - "publish_dialog_details_examples_description": "Примеры и подробное описание всех функций см. в e документации.", - "publish_dialog_attach_label": "URL-адрес вложения", - "publish_dialog_filename_placeholder": "Имя файла вложения", - "publish_dialog_other_features": "Другие возможности:", - "publish_dialog_button_cancel_sending": "Отменить отправку", - "publish_dialog_button_send": "Отправить", - "publish_dialog_checkbox_publish_another": "Опубликовать еще", - "publish_dialog_attached_file_title": "Прикрепленный файл:", - "publish_dialog_attached_file_filename_placeholder": "Имя прикреплённого файла", - "emoji_picker_search_placeholder": "Поиск эмодзи", - "subscribe_dialog_subscribe_topic_placeholder": "Название темы. Например, phil_alerts", - "subscribe_dialog_subscribe_use_another_label": "Использовать другой сервер", - "subscribe_dialog_subscribe_button_cancel": "Отмена", - "subscribe_dialog_subscribe_button_subscribe": "Подписаться", - "subscribe_dialog_login_title": "Требуется авторизация", - "subscribe_dialog_login_description": "Эта тема защищена паролем. Пожалуйста, введите имя пользователя и пароль, чтобы подписаться.", - "subscribe_dialog_login_username_label": "Имя пользователя. Например, phil", - "subscribe_dialog_login_password_label": "Пароль", - "subscribe_dialog_login_button_back": "Назад", - "subscribe_dialog_login_button_login": "Войти", - "subscribe_dialog_error_user_not_authorized": "Пользователь {{username}} не авторизован", - "subscribe_dialog_error_user_anonymous": "аноним", - "prefs_notifications_title": "Уведомления", - "prefs_notifications_sound_title": "Звук уведомления", - "prefs_notifications_sound_description_none": "Уведомления не воспроизводят никаких звуков при получении", - "prefs_notifications_sound_no_sound": "Без звука", - "prefs_notifications_min_priority_title": "Минимальный приоритет", - "prefs_notifications_min_priority_description_any": "Показать все уведомления, независимо от приоритета", - "prefs_notifications_min_priority_description_x_or_higher": "Показывать уведомления, если приоритет {{number}} ({{name}}) или выше", - "prefs_notifications_min_priority_description_max": "Показывать уведомления, если приоритет равен 5 (максимум)", - "prefs_notifications_min_priority_any": "Любой приоритет", - "prefs_notifications_min_priority_low_and_higher": "Низкий и высокий приоритет", - "prefs_notifications_min_priority_max_only": "Только максимальный приоритет", - "prefs_notifications_delete_after_title": "Удалить уведомления", - "prefs_notifications_delete_after_never": "Никогда", - "prefs_notifications_delete_after_three_hours": "Через три часа", - "prefs_notifications_sound_description_some": "Уведомления воспроизводят звук {{sound}}", - "prefs_notifications_min_priority_default_and_higher": "Приоритет по умолчанию и высокий", - "prefs_notifications_delete_after_one_day": "Через день", - "prefs_notifications_delete_after_one_week": "Через неделю", - "prefs_notifications_delete_after_one_month": "Через месяц", - "prefs_notifications_delete_after_never_description": "Уведомления никогда не удаляются автоматически", - "prefs_notifications_delete_after_three_hours_description": "Уведомления автоматически удаляются через три часа", - "prefs_notifications_delete_after_one_day_description": "Уведомления автоматически удаляются через один день", - "prefs_notifications_delete_after_one_week_description": "Уведомления автоматически удаляются через неделю", - "prefs_notifications_delete_after_one_month_description": "Уведомления автоматически удаляются через месяц", - "prefs_users_title": "Управление пользователями", - "prefs_users_add_button": "Добавить пользователя", - "prefs_users_table_user_header": "Пользователь", - "prefs_users_table_base_url_header": "URL службы", - "prefs_users_dialog_title_add": "Добавить пользователя", - "prefs_users_dialog_title_edit": "Редактировать пользователя", - "prefs_users_dialog_base_url_label": "URL-адрес службы. Например, https://ntfy.sh", - "prefs_users_dialog_username_label": "Имя пользователя. Например, phil", - "prefs_users_dialog_password_label": "Пароль", - "prefs_users_dialog_button_cancel": "Отмена", - "prefs_users_dialog_button_add": "Добавить", - "prefs_users_dialog_button_save": "Сохранить", - "prefs_appearance_title": "Внешний вид", - "prefs_appearance_language_title": "Язык", - "priority_min": "минимум", - "priority_low": "низкий", - "priority_default": "по умолчанию", - "priority_high": "высокий", - "priority_max": "максимальный", - "error_boundary_title": "О нет, Ntfy сломался", - "error_boundary_button_copy_stack_trace": "Копирование трассировки стека", - "error_boundary_stack_trace": "Трассировка стека", - "error_boundary_gathering_info": "Соберите больше информации …", - "publish_dialog_drop_file_here": "Перетащите файл юда", - "prefs_notifications_min_priority_high_and_higher": "Высокий приоритет и выше", - "action_bar_toggle_action_menu": "Открыть/закрыть меню", - "action_bar_show_menu": "Показать меню", - "action_bar_logo_alt": "ntfy лого", - "emoji_picker_search_clear": "Очистить поиск" + "publish_dialog_priority_min": "Мин. приоритет", + "action_bar_settings": "Настройки", + "action_bar_send_test_notification": "Отправить тестовое уведомление", + "action_bar_clear_notifications": "Удалить все уведомления", + "action_bar_unsubscribe": "Отписаться", + "message_bar_type_message": "Введите сообщение здесь", + "notifications_none_for_topic_description": "Чтобы отправить уведомление на данную тему, просто отправьте PUT или POST на URL-адрес этой темы.", + "notifications_none_for_any_description": "Чтобы отправить уведомления на тему, просто отправьте PUT или POST на URL-адрес темы. Вот пример используя одну из ваших тем.", + "notifications_no_subscriptions_title": "Похоже у вас ещё нет подписок.", + "alert_grant_description": "Разрешите браузеру показывать уведомления.", + "notifications_no_subscriptions_description": "Нажмите \"{{linktext}}\" ссылку, чтобы создать или подписаться на тему. После этого вы сможете отправлять сообщения используя PUT или POST, и вы будете получать здесь уведомления.", + "notifications_example": "Пример", + "notifications_more_details": "Дополнительную информацию найдёте на сайте или в документации.", + "notifications_loading": "Загружаются уведомления …", + "publish_dialog_title_topic": "Опубликовать в {{topic}}", + "publish_dialog_title_no_topic": "Опубликовать уведомление", + "publish_dialog_progress_uploading": "Загружается …", + "publish_dialog_progress_uploading_detail": "Загружается {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Уведомление опубликовано", + "publish_dialog_attachment_limits_file_and_quota_reached": "превышает {{fileSizeLimit}} размер файла, {{remainingBytes}} осталось", + "publish_dialog_attachment_limits_file_reached": "превышает {{fileSizeLimit}} размер файла", + "publish_dialog_attachment_limits_quota_reached": "превышает квоту, {{remainingBytes}} осталось", + "publish_dialog_priority_low": "Низкий приоритет", + "publish_dialog_priority_default": "Приоритет по умолчанию", + "publish_dialog_priority_high": "Высокий приоритет", + "publish_dialog_priority_max": "Макс. приоритет", + "publish_dialog_base_url_label": "URL-адрес сервиса", + "publish_dialog_base_url_placeholder": "URL-адрес сервиса, например https://example.com", + "publish_dialog_topic_label": "Название темы", + "publish_dialog_topic_placeholder": "Название темы, например phil_alerts", + "publish_dialog_title_label": "Заголовок", + "publish_dialog_title_placeholder": "Заголовок уведомления, например Disk space alert", + "publish_dialog_message_label": "Сообщение", + "publish_dialog_message_placeholder": "Текст сообщения", + "publish_dialog_tags_label": "Тэги", + "publish_dialog_tags_placeholder": "Список тэгов, разделённый запятой, например warning, srv1-backup", + "publish_dialog_priority_label": "Приоритет", + "publish_dialog_click_label": "Нажмите на URL-адрес", + "publish_dialog_click_placeholder": "URL-адрес который откроется когда будет нажато уведомление", + "publish_dialog_email_label": "Эл. почта", + "message_bar_error_publishing": "Ошибка отправки уведомления", + "alert_not_supported_title": "Уведомления не поддерживаются", + "alert_not_supported_description": "Уведомления не поддерживаются вашим браузером.", + "notifications_copied_to_clipboard": "Скопировано в буфер обмена", + "notifications_attachment_open_button": "Открыть вложение", + "notifications_none_for_topic_title": "Вы ещё не получали уведомления для этой темы.", + "nav_topics_title": "Подписки на темы", + "nav_button_all_notifications": "Все уведомления", + "nav_button_settings": "Настройки", + "nav_button_documentation": "Документация", + "nav_button_publish_message": "Опубликовать уведомление", + "nav_button_subscribe": "Подписаться на тему", + "alert_grant_button": "Разрешить", + "notifications_attachment_copy_url_button": "Скопировать URL-адрес", + "notifications_attachment_open_title": "Перейти на {{url}}", + "notifications_attachment_link_expired": "срок действия ссылки для скачивания истёк", + "notifications_click_copy_url_button": "Скопировать ссылку", + "notifications_none_for_any_title": "Вы ещё не получали никаких уведомлений.", + "alert_grant_title": "Уведомления отключены", + "notifications_attachment_copy_url_title": "Скопировать URL-адрес вложения", + "notifications_actions_open_url_title": "Перейти на {{url}}", + "notifications_tags": "Тэги", + "notifications_attachment_link_expires": "срок действия ссылки истекает {{date}}", + "notifications_click_copy_url_title": "Скопировать URL-адрес ссылки", + "notifications_click_open_button": "Открыть ссылку", + "subscribe_dialog_subscribe_title": "Подписаться на тему", + "publish_dialog_button_cancel": "Отмена", + "subscribe_dialog_subscribe_description": "Темы могут быть не защищены паролем, поэтому укажите сложное имя. После подписки вы можете размещать/отправлять уведомления.", + "prefs_users_description": "Добавляйте/удаляйте пользователей для защищенных тем. Обратите внимание, что имя пользователя и пароль хранятся в локальном хранилище браузера.", + "error_boundary_description": "Этого, очевидно, не должно происходить. Очень сожалею об этом.
Если у вас есть минутка, пожалуйста сообщить об этом на GitHub, или сообщите нам через Discord или Matrix.", + "publish_dialog_email_placeholder": "Адрес для пересылки уведомления. Например, phil@example.com", + "publish_dialog_attach_placeholder": "Прикрепите файл по URL. Например, https://f-droid.org/F-Droid.apk", + "publish_dialog_filename_label": "Имя файла", + "publish_dialog_delay_label": "Задержка", + "publish_dialog_delay_placeholder": "Задержка доставки. Например, {{unixTimestamp}}, {{relativeTime}}, or \"{{naturalLanguage}}\" (English only)", + "publish_dialog_chip_click_label": "Адрес", + "publish_dialog_chip_email_label": "Переслать на электронную почту", + "publish_dialog_chip_attach_url_label": "Прикрепить файл по URL", + "publish_dialog_chip_attach_file_label": "Прикрепить локальный файл", + "publish_dialog_chip_delay_label": "Задержка отправки", + "publish_dialog_chip_topic_label": "Изменить тему", + "publish_dialog_details_examples_description": "Примеры и подробное описание всех функций см. в e документации.", + "publish_dialog_attach_label": "URL-адрес вложения", + "publish_dialog_filename_placeholder": "Имя файла вложения", + "publish_dialog_other_features": "Другие возможности:", + "publish_dialog_button_cancel_sending": "Отменить отправку", + "publish_dialog_button_send": "Отправить", + "publish_dialog_checkbox_publish_another": "Опубликовать еще", + "publish_dialog_attached_file_title": "Прикрепленный файл:", + "publish_dialog_attached_file_filename_placeholder": "Имя прикреплённого файла", + "emoji_picker_search_placeholder": "Поиск эмодзи", + "subscribe_dialog_subscribe_topic_placeholder": "Название темы. Например, phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "Использовать другой сервер", + "subscribe_dialog_subscribe_button_cancel": "Отмена", + "subscribe_dialog_subscribe_button_subscribe": "Подписаться", + "subscribe_dialog_login_title": "Требуется авторизация", + "subscribe_dialog_login_description": "Эта тема защищена паролем. Пожалуйста, введите имя пользователя и пароль, чтобы подписаться.", + "subscribe_dialog_login_username_label": "Имя пользователя. Например, phil", + "subscribe_dialog_login_password_label": "Пароль", + "subscribe_dialog_login_button_back": "Назад", + "subscribe_dialog_login_button_login": "Войти", + "subscribe_dialog_error_user_not_authorized": "Пользователь {{username}} не авторизован", + "subscribe_dialog_error_user_anonymous": "аноним", + "prefs_notifications_title": "Уведомления", + "prefs_notifications_sound_title": "Звук уведомления", + "prefs_notifications_sound_description_none": "Уведомления не воспроизводят никаких звуков при получении", + "prefs_notifications_sound_no_sound": "Без звука", + "prefs_notifications_min_priority_title": "Минимальный приоритет", + "prefs_notifications_min_priority_description_any": "Показать все уведомления, независимо от приоритета", + "prefs_notifications_min_priority_description_x_or_higher": "Показывать уведомления, если приоритет {{number}} ({{name}}) или выше", + "prefs_notifications_min_priority_description_max": "Показывать уведомления, если приоритет равен 5 (максимум)", + "prefs_notifications_min_priority_any": "Любой приоритет", + "prefs_notifications_min_priority_low_and_higher": "Низкий и высокий приоритет", + "prefs_notifications_min_priority_max_only": "Только максимальный приоритет", + "prefs_notifications_delete_after_title": "Удалить уведомления", + "prefs_notifications_delete_after_never": "Никогда", + "prefs_notifications_delete_after_three_hours": "Через три часа", + "prefs_notifications_sound_description_some": "Уведомления воспроизводят звук {{sound}}", + "prefs_notifications_min_priority_default_and_higher": "Приоритет по умолчанию и высокий", + "prefs_notifications_delete_after_one_day": "Через день", + "prefs_notifications_delete_after_one_week": "Через неделю", + "prefs_notifications_delete_after_one_month": "Через месяц", + "prefs_notifications_delete_after_never_description": "Уведомления никогда не удаляются автоматически", + "prefs_notifications_delete_after_three_hours_description": "Уведомления автоматически удаляются через три часа", + "prefs_notifications_delete_after_one_day_description": "Уведомления автоматически удаляются через один день", + "prefs_notifications_delete_after_one_week_description": "Уведомления автоматически удаляются через неделю", + "prefs_notifications_delete_after_one_month_description": "Уведомления автоматически удаляются через месяц", + "prefs_users_title": "Управление пользователями", + "prefs_users_add_button": "Добавить пользователя", + "prefs_users_table_user_header": "Пользователь", + "prefs_users_table_base_url_header": "URL службы", + "prefs_users_dialog_title_add": "Добавить пользователя", + "prefs_users_dialog_title_edit": "Редактировать пользователя", + "prefs_users_dialog_base_url_label": "URL-адрес службы. Например, https://ntfy.sh", + "prefs_users_dialog_username_label": "Имя пользователя. Например, phil", + "prefs_users_dialog_password_label": "Пароль", + "prefs_users_dialog_button_cancel": "Отмена", + "prefs_users_dialog_button_add": "Добавить", + "prefs_users_dialog_button_save": "Сохранить", + "prefs_appearance_title": "Внешний вид", + "prefs_appearance_language_title": "Язык", + "priority_min": "минимум", + "priority_low": "низкий", + "priority_default": "по умолчанию", + "priority_high": "высокий", + "priority_max": "максимальный", + "error_boundary_title": "О нет, Ntfy сломался", + "error_boundary_button_copy_stack_trace": "Копирование трассировки стека", + "error_boundary_stack_trace": "Трассировка стека", + "error_boundary_gathering_info": "Соберите больше информации …", + "publish_dialog_drop_file_here": "Перетащите файл юда", + "prefs_notifications_min_priority_high_and_higher": "Высокий приоритет и выше", + "action_bar_toggle_action_menu": "Открыть/закрыть меню", + "action_bar_show_menu": "Показать меню", + "action_bar_logo_alt": "ntfy лого", + "emoji_picker_search_clear": "Очистить поиск" } diff --git a/web/public/static/langs/sv.json b/web/public/static/langs/sv.json index 12939f70..158662d2 100644 --- a/web/public/static/langs/sv.json +++ b/web/public/static/langs/sv.json @@ -1,51 +1,51 @@ { - "action_bar_settings": "Inställningar", - "action_bar_send_test_notification": "Skicka test notis", - "action_bar_toggle_action_menu": "Öppna/stäng åtgärdsmeny", - "message_bar_type_message": "Skriv ett meddelande här", - "message_bar_error_publishing": "Fel vid publicering av notis", - "message_bar_show_dialog": "Visa publicerings dialog", - "message_bar_publish": "Publicera meddelande", - "nav_topics_title": "Prenumererade kategorier", - "nav_button_all_notifications": "Alla notiser", - "nav_button_documentation": "Dokumentation", - "nav_button_publish_message": "Publicera notis", - "nav_button_subscribe": "Prenumerera på kategori", - "alert_grant_title": "Notiser är avstängda", - "alert_grant_button": "Bevilja nu", - "alert_not_supported_title": "Notiser stöds inte", - "notifications_list": "Notis-lista", - "notifications_list_item": "Notis", - "notifications_delete": "Radera", - "notifications_copied_to_clipboard": "Kopierat till urklipp", - "notifications_tags": "Taggar", - "notifications_new_indicator": "Ny notis", - "notifications_attachment_copy_url_title": "Kopiera bifogad URL till urklipp", - "notifications_attachment_copy_url_button": "Kopiera URL", - "notifications_attachment_open_title": "Gå till {{url}}", - "notifications_attachment_open_button": "Öppna bilagan", - "notifications_attachment_link_expired": "Nedladdningslänk utgått", - "notifications_priority_x": "Prioritet {{priority}}", - "action_bar_show_menu": "Visa meny", - "action_bar_logo_alt": "ntfy logga", - "action_bar_unsubscribe": "Avprenumerera", - "action_bar_toggle_mute": "Tysta/aktivera notiser", - "action_bar_clear_notifications": "Rensa alla notiser", - "nav_button_connecting": "ansluter", - "notifications_attachment_image": "Bifogad bild", - "nav_button_settings": "Inställningar", - "nav_button_muted": "Notiser tystade", - "notifications_attachment_link_expires": "länken utgår {{date}}", - "notifications_attachment_file_image": "bild fil", - "notifications_attachment_file_audio": "ljud fil", - "alert_grant_description": "Ge din webbläsare behörighet att visa skrivbordsnotiser.", - "alert_not_supported_description": "Notiser stöds inte i din webbläsare.", - "notifications_mark_read": "Markera som läst", - "notifications_attachment_file_video": "video fil", - "notifications_click_copy_url_button": "Kopiera länk", - "notifications_click_open_button": "Öppna länk", - "notifications_actions_open_url_title": "Gå till {{url}}", - "notifications_none_for_any_title": "Du har inte fått några notiser.", - "notifications_example": "Exempel", - "notifications_loading": "Laddar notiser …" + "action_bar_settings": "Inställningar", + "action_bar_send_test_notification": "Skicka test notis", + "action_bar_toggle_action_menu": "Öppna/stäng åtgärdsmeny", + "message_bar_type_message": "Skriv ett meddelande här", + "message_bar_error_publishing": "Fel vid publicering av notis", + "message_bar_show_dialog": "Visa publicerings dialog", + "message_bar_publish": "Publicera meddelande", + "nav_topics_title": "Prenumererade kategorier", + "nav_button_all_notifications": "Alla notiser", + "nav_button_documentation": "Dokumentation", + "nav_button_publish_message": "Publicera notis", + "nav_button_subscribe": "Prenumerera på kategori", + "alert_grant_title": "Notiser är avstängda", + "alert_grant_button": "Bevilja nu", + "alert_not_supported_title": "Notiser stöds inte", + "notifications_list": "Notis-lista", + "notifications_list_item": "Notis", + "notifications_delete": "Radera", + "notifications_copied_to_clipboard": "Kopierat till urklipp", + "notifications_tags": "Taggar", + "notifications_new_indicator": "Ny notis", + "notifications_attachment_copy_url_title": "Kopiera bifogad URL till urklipp", + "notifications_attachment_copy_url_button": "Kopiera URL", + "notifications_attachment_open_title": "Gå till {{url}}", + "notifications_attachment_open_button": "Öppna bilagan", + "notifications_attachment_link_expired": "Nedladdningslänk utgått", + "notifications_priority_x": "Prioritet {{priority}}", + "action_bar_show_menu": "Visa meny", + "action_bar_logo_alt": "ntfy logga", + "action_bar_unsubscribe": "Avprenumerera", + "action_bar_toggle_mute": "Tysta/aktivera notiser", + "action_bar_clear_notifications": "Rensa alla notiser", + "nav_button_connecting": "ansluter", + "notifications_attachment_image": "Bifogad bild", + "nav_button_settings": "Inställningar", + "nav_button_muted": "Notiser tystade", + "notifications_attachment_link_expires": "länken utgår {{date}}", + "notifications_attachment_file_image": "bild fil", + "notifications_attachment_file_audio": "ljud fil", + "alert_grant_description": "Ge din webbläsare behörighet att visa skrivbordsnotiser.", + "alert_not_supported_description": "Notiser stöds inte i din webbläsare.", + "notifications_mark_read": "Markera som läst", + "notifications_attachment_file_video": "video fil", + "notifications_click_copy_url_button": "Kopiera länk", + "notifications_click_open_button": "Öppna länk", + "notifications_actions_open_url_title": "Gå till {{url}}", + "notifications_none_for_any_title": "Du har inte fått några notiser.", + "notifications_example": "Exempel", + "notifications_loading": "Laddar notiser …" } diff --git a/web/public/static/langs/tr.json b/web/public/static/langs/tr.json index 87458e53..3d9d1128 100644 --- a/web/public/static/langs/tr.json +++ b/web/public/static/langs/tr.json @@ -1,191 +1,191 @@ { - "nav_button_subscribe": "Konuya abone ol", - "nav_button_settings": "Ayarlar", - "action_bar_send_test_notification": "Test bildirimi gönder", - "message_bar_type_message": "Buraya bir mesaj yazın", - "action_bar_clear_notifications": "Tüm bildirimleri temizle", - "action_bar_unsubscribe": "Abonelikten çık", - "action_bar_settings": "Ayarlar", - "message_bar_error_publishing": "Bildirim yayınlanırken hata oluştu", - "nav_topics_title": "Abone olunan konular", - "nav_button_all_notifications": "Tüm bildirimler", - "publish_dialog_tags_placeholder": "Virgülle ayrılmış etiket listesi, örn. uyarı, srv1-yedekleme", - "publish_dialog_priority_label": "Öncelik", - "publish_dialog_click_label": "Tıklama URL'si", - "publish_dialog_click_placeholder": "Bildirim tıklandığında açılan URL", - "publish_dialog_email_label": "E-posta adresi", - "publish_dialog_email_placeholder": "Bildirimin iletileceği adres, örn. phil@example.com", - "publish_dialog_attach_label": "Ek URL'si", - "publish_dialog_filename_label": "Dosya adı", - "publish_dialog_filename_placeholder": "Ek dosya adı", - "publish_dialog_delay_label": "Gecikme", - "publish_dialog_button_cancel": "İptal", - "publish_dialog_button_send": "Gönder", - "publish_dialog_checkbox_publish_another": "Başka bir tane yayınla", - "publish_dialog_attached_file_title": "Ekli dosya:", - "publish_dialog_attached_file_filename_placeholder": "Ek dosya adı", - "subscribe_dialog_subscribe_title": "Konuya abone ol", - "subscribe_dialog_subscribe_description": "Konular parola korumalı olmayabilir, bu nedenle tahmin edilmesi kolay olmayan bir ad seçin. Abone olduktan sonra PUT/POST bildirimleri yapabilirsiniz.", - "subscribe_dialog_subscribe_topic_placeholder": "Konu adı, örn. benim_uyarilarim", - "subscribe_dialog_subscribe_use_another_label": "Başka bir sunucu kullan", - "subscribe_dialog_subscribe_button_cancel": "İptal", - "subscribe_dialog_subscribe_button_subscribe": "Abone ol", - "subscribe_dialog_login_title": "Oturum açma gerekli", - "subscribe_dialog_login_description": "Bu konu parola korumalı. Abone olmak için lütfen kullanıcı adı ve parola girin.", - "subscribe_dialog_login_username_label": "Kullanıcı adı, örn. phil", - "subscribe_dialog_login_password_label": "Parola", - "subscribe_dialog_login_button_back": "Geri", - "subscribe_dialog_login_button_login": "Oturum aç", - "subscribe_dialog_error_user_not_authorized": "{{username}} kullanıcısı yetkili değil", - "subscribe_dialog_error_user_anonymous": "anonim", - "prefs_notifications_title": "Bildirimler", - "prefs_notifications_sound_title": "Bildirim sesi", - "prefs_notifications_sound_no_sound": "Ses yok", - "prefs_notifications_min_priority_title": "En düşük öncelik", - "prefs_notifications_min_priority_any": "Herhangi bir öncelik", - "publish_dialog_topic_placeholder": "Konu adı, örn. benim_uyarilarim", - "alert_grant_button": "Şimdi ver", - "alert_not_supported_title": "Bildirimler desteklenmiyor", - "notifications_attachment_link_expires": "bağlantının süresi {{date}} tarihinde doluyor", - "notifications_click_copy_url_title": "Bağlantı URL'sini panoya kopyala", - "notifications_loading": "Bildirimler yükleniyor…", - "publish_dialog_progress_uploading": "Karşıya yükleniyor…", - "publish_dialog_attachment_limits_file_reached": "{{fileSizeLimit}} dosya sınırını aşıyor", - "publish_dialog_priority_default": "Öntanımlı öncelik", - "publish_dialog_chip_click_label": "Tıklama URL'si", - "publish_dialog_attach_placeholder": "URL ile dosya ekle, örn. https://f-droid.org/F-Droid.apk", - "prefs_notifications_delete_after_never": "Hiçbir zaman", - "notifications_attachment_copy_url_button": "URL'yi kopyala", - "notifications_attachment_open_button": "Eki aç", - "nav_button_documentation": "Belgelendirme", - "nav_button_publish_message": "Bildirim yayınla", - "alert_grant_title": "Bildirimler devre dışı", - "alert_grant_description": "Tarayıcınıza masaüstü bildirimlerini görüntüleme izni verin.", - "alert_not_supported_description": "Tarayıcınızda bildirimler desteklenmiyor.", - "notifications_copied_to_clipboard": "Panoya kopyalandı", - "notifications_tags": "Etiketler", - "notifications_attachment_copy_url_title": "Ek URL'sini panoya kopyala", - "notifications_attachment_open_title": "{{url}} adresine git", - "notifications_none_for_topic_title": "Bu konu için henüz herhangi bir bildirim almadınız.", - "notifications_none_for_topic_description": "Bu konuya bildirim göndermek için konu URL'sine PUT veya POST göndermeniz yeterlidir.", - "notifications_none_for_any_title": "Herhangi bir bildirim almadınız.", - "notifications_attachment_link_expired": "indirme bağlantısının süresi doldu", - "notifications_click_copy_url_button": "Bağlantıyı kopyala", - "notifications_actions_open_url_title": "{{url}} adresine git", - "notifications_click_open_button": "Bağlantıyı aç", - "notifications_no_subscriptions_description": "Bir konu oluşturmak veya bir konuya abone olmak için \"{{linktext}}\" bağlantısına tıklayın. Bundan sonra PUT veya POST yoluyla mesaj gönderebilirsiniz ve buradan bildirimler alırsınız.", - "notifications_example": "Örnek", - "notifications_more_details": "Daha fazla bilgi için web sitesine veya belgelendirmeye bakın.", - "publish_dialog_chip_attach_url_label": "URL ile dosya ekle", - "prefs_notifications_min_priority_default_and_higher": "Öntanımlı öncelik ve üstü", - "prefs_notifications_delete_after_three_hours": "Üç saat sonra", - "notifications_none_for_any_description": "Bir konuya bildirim göndermek için konu URL'sine PUT veya POST göndermeniz yeterlidir. İşte konularınızdan birini kullanan bir örnek.", - "notifications_no_subscriptions_title": "Henüz aboneliğiniz yok gibi görünüyor.", - "publish_dialog_title_topic": "{{topic}} konusuna yayınla", - "publish_dialog_title_no_topic": "Bildirim yayınla", - "publish_dialog_progress_uploading_detail": "Karşıya yükleniyor: {{loaded}}/{{total}} ({{percent}}%)…", - "publish_dialog_attachment_limits_file_and_quota_reached": "{{fileSizeLimit}} dosya sınırını ve kotasını aşıyor, kalan {{remainingBytes}}", - "publish_dialog_priority_min": "En düşük öncelik", - "publish_dialog_priority_low": "Düşük öncelik", - "publish_dialog_base_url_label": "Hizmet URL'si", - "publish_dialog_attachment_limits_quota_reached": "kotayı aşıyor, kalan {{remainingBytes}}", - "publish_dialog_message_published": "Bildirim yayınlandı", - "publish_dialog_title_label": "Başlık", - "publish_dialog_priority_high": "Yüksek öncelik", - "publish_dialog_priority_max": "En yüksek öncelik", - "publish_dialog_message_label": "Mesaj", - "publish_dialog_other_features": "Diğer özellikler:", - "publish_dialog_chip_email_label": "E-posta adresine ilet", - "publish_dialog_topic_label": "Konu adı", - "publish_dialog_base_url_placeholder": "Hizmet URL'si, örn. https://example.com", - "publish_dialog_title_placeholder": "Bildirim başlığı, örn. Disk alanı uyarısı", - "publish_dialog_message_placeholder": "Buraya bir mesaj yazın", - "publish_dialog_tags_label": "Etiketler", - "publish_dialog_delay_placeholder": "Teslimat gecikmesi, örn. {{unixTimestamp}}, {{relativeTime}} veya \"{{naturalLanguage}}\"", - "publish_dialog_chip_attach_file_label": "Yerel dosya ekle", - "publish_dialog_chip_delay_label": "Teslimat gecikmesi", - "publish_dialog_chip_topic_label": "Konuyu değiştir", - "publish_dialog_button_cancel_sending": "Göndermeyi iptal et", - "prefs_notifications_delete_after_one_week": "Bir hafta sonra", - "prefs_notifications_delete_after_one_month": "Bir ay sonra", - "publish_dialog_details_examples_description": "Örnekler ve tüm gönderme özelliklerinin ayrıntılı açıklaması için lütfen belgelendirmeye bakın.", - "emoji_picker_search_placeholder": "Emoji ara", - "prefs_notifications_delete_after_title": "Bildirimleri sil", - "prefs_notifications_delete_after_one_day": "Bir gün sonra", - "publish_dialog_drop_file_here": "Dosyayı buraya bırakın", - "prefs_notifications_min_priority_low_and_higher": "Düşük öncelik ve üstü", - "prefs_notifications_min_priority_high_and_higher": "Yüksek öncelik ve üstü", - "prefs_notifications_min_priority_max_only": "Yalnızca en yüksek öncelik", - "prefs_users_title": "Kullanıcıları yönet", - "prefs_users_dialog_title_edit": "Kullanıcıyı düzenle", - "prefs_users_dialog_base_url_label": "Hizmet URL'si, örn. https://ntfy.sh", - "prefs_users_description": "Burada korunan konularınız için kullanıcı ekleyin/kaldırın. Lütfen kullanıcı adı ve parolanın tarayıcının yerel deposunda saklandığını unutmayın.", - "prefs_users_add_button": "Kullanıcı ekle", - "prefs_users_table_base_url_header": "Hizmet URL'si", - "prefs_users_dialog_title_add": "Kullanıcı ekle", - "prefs_users_dialog_username_label": "Kullanıcı adı, örn. phil", - "prefs_users_table_user_header": "Kullanıcı", - "prefs_users_dialog_password_label": "Parola", - "prefs_users_dialog_button_add": "Ekle", - "prefs_users_dialog_button_cancel": "İptal", - "prefs_users_dialog_button_save": "Kaydet", - "prefs_appearance_title": "Görünüm", - "prefs_appearance_language_title": "Dil", - "error_boundary_title": "Olamaz, ntfy çöktü", - "error_boundary_gathering_info": "Daha fazla bilgi topla…", - "error_boundary_description": "Bunun olmaması gerekiyordu. Çok üzgünüm.
Bir dakikanız varsa, lütfen bunu GitHub üzerinden bildirin ya da Discord veya Matrix aracılığıyla bize iletin.", - "error_boundary_button_copy_stack_trace": "Yığın izlemeyi kopyala", - "error_boundary_stack_trace": "Yığın izleme", - "prefs_notifications_sound_description_none": "Bildirimler geldiğinde herhangi bir ses çalmaz", - "prefs_notifications_sound_description_some": "Bildirimler geldiğinde {{sound}} sesini çalar", - "prefs_notifications_min_priority_description_any": "Öncelikten bağımsız olarak tüm bildirimleri göster", - "prefs_notifications_min_priority_description_x_or_higher": "Öncelik {{number}} ({{name}}) veya üstüyse bildirimleri göster", - "prefs_notifications_delete_after_one_month_description": "Bildirimler bir ay sonra otomatik olarak silinir", - "prefs_notifications_delete_after_three_hours_description": "Bildirimler üç saat sonra otomatik olarak silinir", - "prefs_notifications_delete_after_one_week_description": "Bildirimler bir hafta sonra otomatik olarak silinir", - "priority_min": "en düşük", - "priority_low": "düşük", - "priority_max": "en yüksek", - "prefs_notifications_delete_after_one_day_description": "Bildirimler bir gün sonra otomatik olarak silinir", - "priority_default": "öntanımlı", - "prefs_notifications_min_priority_description_max": "Öncelik 5 (en fazla) ise bildirimleri göster", - "prefs_notifications_delete_after_never_description": "Bildirimler asla otomatik olarak silinmez", - "priority_high": "yüksek", - "notifications_actions_not_supported": "Eylem, web uygulamasında desteklenmiyor", - "notifications_actions_http_request_title": "{{url}} adresine HTTP {{method}} gönder", - "action_bar_show_menu": "Menüyü göster", - "action_bar_logo_alt": "ntfy logosu", - "action_bar_toggle_action_menu": "Eylem menüsünü aç/kapat", - "message_bar_show_dialog": "Yayınla iletişim kutusunu göster", - "message_bar_publish": "Mesaj yayınla", - "nav_button_connecting": "bağlanıyor", - "notifications_list": "Bildirimler listesi", - "notifications_list_item": "Bildirim", - "notifications_delete": "Sil", - "notifications_attachment_image": "Ek resmi", - "notifications_attachment_file_image": "resim dosyası", - "notifications_attachment_file_video": "video dosyası", - "notifications_attachment_file_audio": "ses dosyası", - "notifications_attachment_file_app": "Android uygulama dosyası", - "notifications_attachment_file_document": "diğer belge", - "publish_dialog_emoji_picker_show": "Emoji seç", - "publish_dialog_topic_reset": "Konuyu sıfırla", - "publish_dialog_attach_reset": "Ek URL'sini kaldır", - "publish_dialog_delay_reset": "Gecikmeli teslimatı kaldır", - "publish_dialog_attached_file_remove": "Ekli dosyayı kaldır", - "emoji_picker_search_clear": "Aramayı temizle", - "subscribe_dialog_subscribe_base_url_label": "Hizmet URL'si", - "prefs_notifications_sound_play": "Seçilen sesi çal", - "error_boundary_unsupported_indexeddb_description": "ntfy web uygulamasının çalışması için IndexedDB'ye ihtiyacı var ve tarayıcınız gizli tarama modunda IndexedDB'yi desteklemiyor.

Bu talihsiz olsa da, ntfy web uygulamasını gizli tarama modunda kullanmak pek mantıklı değildir, çünkü her şey tarayıcı deposunda saklanır. Bu GitHub sorununda bununla ilgili daha fazla bilgi edinebilir veya Discord veya Matrix üzerinden bizimle konuşabilirsiniz.", - "notifications_new_indicator": "Yeni bildirim", - "action_bar_toggle_mute": "Bildirimleri sesini kapat/aç", - "publish_dialog_click_reset": "Tıklama URL'sini kaldır", - "prefs_users_table": "Kullanıcılar tablosu", - "error_boundary_unsupported_indexeddb_title": "Gizli tarama desteklenmiyor", - "nav_button_muted": "Bildirimler sessize alındı", - "notifications_mark_read": "Okundu olarak işaretle", - "notifications_priority_x": "Öncelik {{priority}}", - "publish_dialog_email_reset": "E-posta yönlendirmesini kaldır", - "prefs_users_edit_button": "Kullanıcıyı düzenle", - "prefs_users_delete_button": "Kullanıcı sil" + "nav_button_subscribe": "Konuya abone ol", + "nav_button_settings": "Ayarlar", + "action_bar_send_test_notification": "Test bildirimi gönder", + "message_bar_type_message": "Buraya bir mesaj yazın", + "action_bar_clear_notifications": "Tüm bildirimleri temizle", + "action_bar_unsubscribe": "Abonelikten çık", + "action_bar_settings": "Ayarlar", + "message_bar_error_publishing": "Bildirim yayınlanırken hata oluştu", + "nav_topics_title": "Abone olunan konular", + "nav_button_all_notifications": "Tüm bildirimler", + "publish_dialog_tags_placeholder": "Virgülle ayrılmış etiket listesi, örn. uyarı, srv1-yedekleme", + "publish_dialog_priority_label": "Öncelik", + "publish_dialog_click_label": "Tıklama URL'si", + "publish_dialog_click_placeholder": "Bildirim tıklandığında açılan URL", + "publish_dialog_email_label": "E-posta adresi", + "publish_dialog_email_placeholder": "Bildirimin iletileceği adres, örn. phil@example.com", + "publish_dialog_attach_label": "Ek URL'si", + "publish_dialog_filename_label": "Dosya adı", + "publish_dialog_filename_placeholder": "Ek dosya adı", + "publish_dialog_delay_label": "Gecikme", + "publish_dialog_button_cancel": "İptal", + "publish_dialog_button_send": "Gönder", + "publish_dialog_checkbox_publish_another": "Başka bir tane yayınla", + "publish_dialog_attached_file_title": "Ekli dosya:", + "publish_dialog_attached_file_filename_placeholder": "Ek dosya adı", + "subscribe_dialog_subscribe_title": "Konuya abone ol", + "subscribe_dialog_subscribe_description": "Konular parola korumalı olmayabilir, bu nedenle tahmin edilmesi kolay olmayan bir ad seçin. Abone olduktan sonra PUT/POST bildirimleri yapabilirsiniz.", + "subscribe_dialog_subscribe_topic_placeholder": "Konu adı, örn. benim_uyarilarim", + "subscribe_dialog_subscribe_use_another_label": "Başka bir sunucu kullan", + "subscribe_dialog_subscribe_button_cancel": "İptal", + "subscribe_dialog_subscribe_button_subscribe": "Abone ol", + "subscribe_dialog_login_title": "Oturum açma gerekli", + "subscribe_dialog_login_description": "Bu konu parola korumalı. Abone olmak için lütfen kullanıcı adı ve parola girin.", + "subscribe_dialog_login_username_label": "Kullanıcı adı, örn. phil", + "subscribe_dialog_login_password_label": "Parola", + "subscribe_dialog_login_button_back": "Geri", + "subscribe_dialog_login_button_login": "Oturum aç", + "subscribe_dialog_error_user_not_authorized": "{{username}} kullanıcısı yetkili değil", + "subscribe_dialog_error_user_anonymous": "anonim", + "prefs_notifications_title": "Bildirimler", + "prefs_notifications_sound_title": "Bildirim sesi", + "prefs_notifications_sound_no_sound": "Ses yok", + "prefs_notifications_min_priority_title": "En düşük öncelik", + "prefs_notifications_min_priority_any": "Herhangi bir öncelik", + "publish_dialog_topic_placeholder": "Konu adı, örn. benim_uyarilarim", + "alert_grant_button": "Şimdi ver", + "alert_not_supported_title": "Bildirimler desteklenmiyor", + "notifications_attachment_link_expires": "bağlantının süresi {{date}} tarihinde doluyor", + "notifications_click_copy_url_title": "Bağlantı URL'sini panoya kopyala", + "notifications_loading": "Bildirimler yükleniyor…", + "publish_dialog_progress_uploading": "Karşıya yükleniyor…", + "publish_dialog_attachment_limits_file_reached": "{{fileSizeLimit}} dosya sınırını aşıyor", + "publish_dialog_priority_default": "Öntanımlı öncelik", + "publish_dialog_chip_click_label": "Tıklama URL'si", + "publish_dialog_attach_placeholder": "URL ile dosya ekle, örn. https://f-droid.org/F-Droid.apk", + "prefs_notifications_delete_after_never": "Hiçbir zaman", + "notifications_attachment_copy_url_button": "URL'yi kopyala", + "notifications_attachment_open_button": "Eki aç", + "nav_button_documentation": "Belgelendirme", + "nav_button_publish_message": "Bildirim yayınla", + "alert_grant_title": "Bildirimler devre dışı", + "alert_grant_description": "Tarayıcınıza masaüstü bildirimlerini görüntüleme izni verin.", + "alert_not_supported_description": "Tarayıcınızda bildirimler desteklenmiyor.", + "notifications_copied_to_clipboard": "Panoya kopyalandı", + "notifications_tags": "Etiketler", + "notifications_attachment_copy_url_title": "Ek URL'sini panoya kopyala", + "notifications_attachment_open_title": "{{url}} adresine git", + "notifications_none_for_topic_title": "Bu konu için henüz herhangi bir bildirim almadınız.", + "notifications_none_for_topic_description": "Bu konuya bildirim göndermek için konu URL'sine PUT veya POST göndermeniz yeterlidir.", + "notifications_none_for_any_title": "Herhangi bir bildirim almadınız.", + "notifications_attachment_link_expired": "indirme bağlantısının süresi doldu", + "notifications_click_copy_url_button": "Bağlantıyı kopyala", + "notifications_actions_open_url_title": "{{url}} adresine git", + "notifications_click_open_button": "Bağlantıyı aç", + "notifications_no_subscriptions_description": "Bir konu oluşturmak veya bir konuya abone olmak için \"{{linktext}}\" bağlantısına tıklayın. Bundan sonra PUT veya POST yoluyla mesaj gönderebilirsiniz ve buradan bildirimler alırsınız.", + "notifications_example": "Örnek", + "notifications_more_details": "Daha fazla bilgi için web sitesine veya belgelendirmeye bakın.", + "publish_dialog_chip_attach_url_label": "URL ile dosya ekle", + "prefs_notifications_min_priority_default_and_higher": "Öntanımlı öncelik ve üstü", + "prefs_notifications_delete_after_three_hours": "Üç saat sonra", + "notifications_none_for_any_description": "Bir konuya bildirim göndermek için konu URL'sine PUT veya POST göndermeniz yeterlidir. İşte konularınızdan birini kullanan bir örnek.", + "notifications_no_subscriptions_title": "Henüz aboneliğiniz yok gibi görünüyor.", + "publish_dialog_title_topic": "{{topic}} konusuna yayınla", + "publish_dialog_title_no_topic": "Bildirim yayınla", + "publish_dialog_progress_uploading_detail": "Karşıya yükleniyor: {{loaded}}/{{total}} ({{percent}}%)…", + "publish_dialog_attachment_limits_file_and_quota_reached": "{{fileSizeLimit}} dosya sınırını ve kotasını aşıyor, kalan {{remainingBytes}}", + "publish_dialog_priority_min": "En düşük öncelik", + "publish_dialog_priority_low": "Düşük öncelik", + "publish_dialog_base_url_label": "Hizmet URL'si", + "publish_dialog_attachment_limits_quota_reached": "kotayı aşıyor, kalan {{remainingBytes}}", + "publish_dialog_message_published": "Bildirim yayınlandı", + "publish_dialog_title_label": "Başlık", + "publish_dialog_priority_high": "Yüksek öncelik", + "publish_dialog_priority_max": "En yüksek öncelik", + "publish_dialog_message_label": "Mesaj", + "publish_dialog_other_features": "Diğer özellikler:", + "publish_dialog_chip_email_label": "E-posta adresine ilet", + "publish_dialog_topic_label": "Konu adı", + "publish_dialog_base_url_placeholder": "Hizmet URL'si, örn. https://example.com", + "publish_dialog_title_placeholder": "Bildirim başlığı, örn. Disk alanı uyarısı", + "publish_dialog_message_placeholder": "Buraya bir mesaj yazın", + "publish_dialog_tags_label": "Etiketler", + "publish_dialog_delay_placeholder": "Teslimat gecikmesi, örn. {{unixTimestamp}}, {{relativeTime}} veya \"{{naturalLanguage}}\"", + "publish_dialog_chip_attach_file_label": "Yerel dosya ekle", + "publish_dialog_chip_delay_label": "Teslimat gecikmesi", + "publish_dialog_chip_topic_label": "Konuyu değiştir", + "publish_dialog_button_cancel_sending": "Göndermeyi iptal et", + "prefs_notifications_delete_after_one_week": "Bir hafta sonra", + "prefs_notifications_delete_after_one_month": "Bir ay sonra", + "publish_dialog_details_examples_description": "Örnekler ve tüm gönderme özelliklerinin ayrıntılı açıklaması için lütfen belgelendirmeye bakın.", + "emoji_picker_search_placeholder": "Emoji ara", + "prefs_notifications_delete_after_title": "Bildirimleri sil", + "prefs_notifications_delete_after_one_day": "Bir gün sonra", + "publish_dialog_drop_file_here": "Dosyayı buraya bırakın", + "prefs_notifications_min_priority_low_and_higher": "Düşük öncelik ve üstü", + "prefs_notifications_min_priority_high_and_higher": "Yüksek öncelik ve üstü", + "prefs_notifications_min_priority_max_only": "Yalnızca en yüksek öncelik", + "prefs_users_title": "Kullanıcıları yönet", + "prefs_users_dialog_title_edit": "Kullanıcıyı düzenle", + "prefs_users_dialog_base_url_label": "Hizmet URL'si, örn. https://ntfy.sh", + "prefs_users_description": "Burada korunan konularınız için kullanıcı ekleyin/kaldırın. Lütfen kullanıcı adı ve parolanın tarayıcının yerel deposunda saklandığını unutmayın.", + "prefs_users_add_button": "Kullanıcı ekle", + "prefs_users_table_base_url_header": "Hizmet URL'si", + "prefs_users_dialog_title_add": "Kullanıcı ekle", + "prefs_users_dialog_username_label": "Kullanıcı adı, örn. phil", + "prefs_users_table_user_header": "Kullanıcı", + "prefs_users_dialog_password_label": "Parola", + "prefs_users_dialog_button_add": "Ekle", + "prefs_users_dialog_button_cancel": "İptal", + "prefs_users_dialog_button_save": "Kaydet", + "prefs_appearance_title": "Görünüm", + "prefs_appearance_language_title": "Dil", + "error_boundary_title": "Olamaz, ntfy çöktü", + "error_boundary_gathering_info": "Daha fazla bilgi topla…", + "error_boundary_description": "Bunun olmaması gerekiyordu. Çok üzgünüm.
Bir dakikanız varsa, lütfen bunu GitHub üzerinden bildirin ya da Discord veya Matrix aracılığıyla bize iletin.", + "error_boundary_button_copy_stack_trace": "Yığın izlemeyi kopyala", + "error_boundary_stack_trace": "Yığın izleme", + "prefs_notifications_sound_description_none": "Bildirimler geldiğinde herhangi bir ses çalmaz", + "prefs_notifications_sound_description_some": "Bildirimler geldiğinde {{sound}} sesini çalar", + "prefs_notifications_min_priority_description_any": "Öncelikten bağımsız olarak tüm bildirimleri göster", + "prefs_notifications_min_priority_description_x_or_higher": "Öncelik {{number}} ({{name}}) veya üstüyse bildirimleri göster", + "prefs_notifications_delete_after_one_month_description": "Bildirimler bir ay sonra otomatik olarak silinir", + "prefs_notifications_delete_after_three_hours_description": "Bildirimler üç saat sonra otomatik olarak silinir", + "prefs_notifications_delete_after_one_week_description": "Bildirimler bir hafta sonra otomatik olarak silinir", + "priority_min": "en düşük", + "priority_low": "düşük", + "priority_max": "en yüksek", + "prefs_notifications_delete_after_one_day_description": "Bildirimler bir gün sonra otomatik olarak silinir", + "priority_default": "öntanımlı", + "prefs_notifications_min_priority_description_max": "Öncelik 5 (en fazla) ise bildirimleri göster", + "prefs_notifications_delete_after_never_description": "Bildirimler asla otomatik olarak silinmez", + "priority_high": "yüksek", + "notifications_actions_not_supported": "Eylem, web uygulamasında desteklenmiyor", + "notifications_actions_http_request_title": "{{url}} adresine HTTP {{method}} gönder", + "action_bar_show_menu": "Menüyü göster", + "action_bar_logo_alt": "ntfy logosu", + "action_bar_toggle_action_menu": "Eylem menüsünü aç/kapat", + "message_bar_show_dialog": "Yayınla iletişim kutusunu göster", + "message_bar_publish": "Mesaj yayınla", + "nav_button_connecting": "bağlanıyor", + "notifications_list": "Bildirimler listesi", + "notifications_list_item": "Bildirim", + "notifications_delete": "Sil", + "notifications_attachment_image": "Ek resmi", + "notifications_attachment_file_image": "resim dosyası", + "notifications_attachment_file_video": "video dosyası", + "notifications_attachment_file_audio": "ses dosyası", + "notifications_attachment_file_app": "Android uygulama dosyası", + "notifications_attachment_file_document": "diğer belge", + "publish_dialog_emoji_picker_show": "Emoji seç", + "publish_dialog_topic_reset": "Konuyu sıfırla", + "publish_dialog_attach_reset": "Ek URL'sini kaldır", + "publish_dialog_delay_reset": "Gecikmeli teslimatı kaldır", + "publish_dialog_attached_file_remove": "Ekli dosyayı kaldır", + "emoji_picker_search_clear": "Aramayı temizle", + "subscribe_dialog_subscribe_base_url_label": "Hizmet URL'si", + "prefs_notifications_sound_play": "Seçilen sesi çal", + "error_boundary_unsupported_indexeddb_description": "ntfy web uygulamasının çalışması için IndexedDB'ye ihtiyacı var ve tarayıcınız gizli tarama modunda IndexedDB'yi desteklemiyor.

Bu talihsiz olsa da, ntfy web uygulamasını gizli tarama modunda kullanmak pek mantıklı değildir, çünkü her şey tarayıcı deposunda saklanır. Bu GitHub sorununda bununla ilgili daha fazla bilgi edinebilir veya Discord veya Matrix üzerinden bizimle konuşabilirsiniz.", + "notifications_new_indicator": "Yeni bildirim", + "action_bar_toggle_mute": "Bildirimleri sesini kapat/aç", + "publish_dialog_click_reset": "Tıklama URL'sini kaldır", + "prefs_users_table": "Kullanıcılar tablosu", + "error_boundary_unsupported_indexeddb_title": "Gizli tarama desteklenmiyor", + "nav_button_muted": "Bildirimler sessize alındı", + "notifications_mark_read": "Okundu olarak işaretle", + "notifications_priority_x": "Öncelik {{priority}}", + "publish_dialog_email_reset": "E-posta yönlendirmesini kaldır", + "prefs_users_edit_button": "Kullanıcıyı düzenle", + "prefs_users_delete_button": "Kullanıcı sil" } diff --git a/web/public/static/langs/uk.json b/web/public/static/langs/uk.json index 9420b8d5..5cd363b2 100644 --- a/web/public/static/langs/uk.json +++ b/web/public/static/langs/uk.json @@ -1,191 +1,191 @@ { - "action_bar_logo_alt": "логотип ntfy", - "action_bar_settings": "Налаштування", - "message_bar_type_message": "Введіть повідомлення тут", - "message_bar_error_publishing": "Помилка публікації сповіщення", - "message_bar_show_dialog": "Показати діалогове вікно публікації", - "nav_topics_title": "Підписки на теми", - "nav_button_settings": "Налаштування", - "nav_button_documentation": "Документація", - "nav_button_subscribe": "Підписатися на тему", - "nav_button_muted": "Сповіщення вимкнено", - "nav_button_connecting": "підключення", - "alert_grant_title": "Сповіщення вимкнено", - "alert_grant_description": "Дозвольте браузеру показувати сповіщення.", - "alert_grant_button": "Дозволити", - "alert_not_supported_title": "Сповіщення не підтримуються", - "notifications_list_item": "Сповіщення", - "notifications_attachment_image": "Прикріплене зображення", - "notifications_attachment_open_title": "Перейти на {{url}}", - "notifications_attachment_open_button": "Відкрити вкладення", - "notifications_attachment_link_expires": "термін дії посилання закінчується {{date}}", - "notifications_actions_http_request_title": "Надіслати HTTP {{method}} на {{url}}", - "notifications_none_for_any_title": "Ви не отримали жодних сповіщень.", - "notifications_no_subscriptions_description": "Натисніть \"{{linktext}}\" посилання, щоб створити або підписатися на тему. Після цього ви зможете надсилати повідомлення за допомогою PUT або POST, і ви отримуватимете тут повідомлення.", - "notifications_more_details": "Додаткову інформацію можна знайти на сайті або в документації.", - "notifications_loading": "Завантаження сповіщень…", - "publish_dialog_title_topic": "Опублікувати в {{topic}}", - "publish_dialog_title_no_topic": "Опублікувати сповіщення", - "publish_dialog_progress_uploading": "Завантаження…", - "publish_dialog_message_published": "Сповіщення опубліковано", - "publish_dialog_attachment_limits_quota_reached": "перевищує квоту, залишилося {{remainingBytes}}", - "publish_dialog_priority_low": "Низький пріоритет", - "publish_dialog_topic_label": "Назва теми", - "publish_dialog_topic_placeholder": "Назва теми, наприклад phil_alerts", - "publish_dialog_topic_reset": "Скинути тему", - "publish_dialog_title_label": "Заголовок", - "publish_dialog_title_placeholder": "Заголовок сповіщення, наприклад Сповіщення про дисковий простір", - "publish_dialog_message_label": "Повідомлення", - "publish_dialog_message_placeholder": "Введіть повідомлення", - "publish_dialog_tags_label": "Теги", - "publish_dialog_tags_placeholder": "Список тегів розділений комою, наприклад warning, srv1-backup", - "publish_dialog_click_placeholder": "URL-адреса, яка відкривається після натискання сповіщення", - "publish_dialog_email_label": "Електронна пошта", - "publish_dialog_attach_placeholder": "Прикріпіть файл за URL-адресою, наприклад https://f-droid.org/F-Droid.apk", - "publish_dialog_attach_reset": "Видалити URL вкладення", - "publish_dialog_filename_placeholder": "Ім'я файлу вкладення", - "publish_dialog_delay_reset": "Видалити затримку доставлення", - "publish_dialog_chip_click_label": "Адреса", - "publish_dialog_chip_email_label": "Переслати на електронну пошту", - "publish_dialog_chip_topic_label": "Змінити тему", - "publish_dialog_attached_file_remove": "Видалити прикріплений файл", - "subscribe_dialog_subscribe_topic_placeholder": "Назва теми, наприклад phil_alerts", - "subscribe_dialog_subscribe_use_another_label": "Використовувати інший сервер", - "subscribe_dialog_subscribe_base_url_label": "URL служби", - "subscribe_dialog_login_password_label": "Пароль", - "subscribe_dialog_login_button_back": "Назад", - "subscribe_dialog_error_user_not_authorized": "{{username}} користувач не авторизований", - "prefs_notifications_sound_description_none": "Сповіщення не відтворюють жодного звуку при надходженні", - "prefs_notifications_sound_description_some": "Сповіщення відтворюють звук {{sound}}", - "prefs_notifications_min_priority_description_any": "Показати всі сповіщень, незалежно від пріоритету", - "prefs_notifications_min_priority_any": "Будь-який пріоритет", - "prefs_notifications_min_priority_default_and_higher": "Пріоритет за замовчуванням та високий", - "prefs_notifications_delete_after_title": "Видалити сповіщення", - "prefs_notifications_delete_after_never": "Ніколи", - "prefs_notifications_delete_after_one_day": "Через день", - "prefs_notifications_delete_after_one_week": "Через тиждень", - "prefs_notifications_delete_after_one_month": "Через місяць", - "prefs_notifications_delete_after_never_description": "Сповіщення ніколи не видаляються автоматично", - "prefs_notifications_delete_after_three_hours_description": "Сповіщення автоматично видаляються через три години", - "prefs_notifications_delete_after_one_day_description": "Сповіщення автоматично видаляються через один день", - "prefs_notifications_delete_after_one_week_description": "Сповіщення автоматично видаляються через тиждень", - "prefs_notifications_delete_after_one_month_description": "Сповіщення автоматично видаляються через місяць", - "prefs_users_title": "Керувати користувачами", - "prefs_users_table": "Таблиця користувачів", - "prefs_users_edit_button": "Редагувати користувача", - "prefs_users_dialog_button_save": "Зберегти", - "prefs_appearance_title": "Зовнішній вигляд", - "priority_default": "за замовчуванням", - "priority_high": "високий", - "priority_max": "макс", - "error_boundary_title": "Ой, ntfy впав", - "error_boundary_button_copy_stack_trace": "Копіювати трасування стека", - "action_bar_show_menu": "Показати меню", - "action_bar_toggle_action_menu": "Відкрити/закрити меню", - "action_bar_send_test_notification": "Надіслати тестове сповіщення", - "action_bar_clear_notifications": "Очистити всі сповіщення", - "action_bar_toggle_mute": "Вимкнути/увімкнути сповіщення", - "action_bar_unsubscribe": "Відписатися", - "message_bar_publish": "Опублікувати повідомлення", - "nav_button_all_notifications": "Усі сповіщення", - "alert_not_supported_description": "Ваш браузер не підтримує сповіщення.", - "notifications_list": "Список сповіщень", - "notifications_mark_read": "Позначити як прочитане", - "notifications_delete": "Видалити", - "notifications_tags": "Теги", - "nav_button_publish_message": "Опублікувати сповіщення", - "notifications_attachment_copy_url_title": "Копіювати URL-адресу вкладення", - "notifications_attachment_link_expired": "термін дії посилання для завантаження закінчився", - "publish_dialog_progress_uploading_detail": "Завантажується {{loaded}}/{{total}} ({{percent}}%) …", - "notifications_priority_x": "Пріоритет {{priority}}", - "notifications_attachment_copy_url_button": "Копіювати URL-адресу", - "notifications_copied_to_clipboard": "Скопійовано в буфер обміну", - "notifications_attachment_file_video": "відео файл", - "notifications_attachment_file_audio": "звуковий файл", - "publish_dialog_emoji_picker_show": "Виберіть емодзі", - "notifications_new_indicator": "Нове сповіщення", - "notifications_attachment_file_image": "файл зображення", - "notifications_attachment_file_document": "інший документ", - "notifications_click_copy_url_title": "Копіювати URL-адресу посилання", - "notifications_click_copy_url_button": "Копіювати посилання", - "notifications_actions_not_supported": "Дія не підтримується у браузері", - "notifications_attachment_file_app": "Файл програми Android", - "notifications_click_open_button": "Відкрити посилання", - "notifications_actions_open_url_title": "Перейти на {{url}}", - "notifications_none_for_topic_description": "Щоб надіслати сповіщення до цієї теми, просто надішліть PUT або POST на URL-адресу цієї теми.", - "notifications_no_subscriptions_title": "Схоже, у вас ще немає жодної підписки.", - "publish_dialog_drop_file_here": "Перетягніть файл сюди", - "notifications_none_for_topic_title": "Ви ще не отримували сповіщення на цю тему.", - "notifications_example": "Приклад", - "notifications_none_for_any_description": "Щоб надіслати сповіщення до теми, просто надішліть PUT або POST на URL-адресу теми. Ось приклад, використовуючи одну з ваших тем.", - "publish_dialog_attachment_limits_file_and_quota_reached": "перевищує {{fileSizeLimit}} розмір файлу, {{remainingBytes}} залишилося", - "publish_dialog_priority_default": "Пріоритет за замовчуванням", - "publish_dialog_attachment_limits_file_reached": "перевищує {{fileSizeLimit}} розмір файлу", - "publish_dialog_priority_min": "Мін. пріоритет", - "publish_dialog_priority_high": "Високий пріоритет", - "publish_dialog_priority_max": "Макс. пріоритет", - "publish_dialog_base_url_placeholder": "URL-адреса сервісу, наприклад https://example.com", - "publish_dialog_base_url_label": "URL служби", - "publish_dialog_other_features": "Інші можливості:", - "publish_dialog_chip_attach_file_label": "Прикріпити локальний файл", - "publish_dialog_priority_label": "Пріоритет", - "publish_dialog_click_label": "Натисніть URL", - "publish_dialog_click_reset": "Видалити URL-адресу для натискання", - "publish_dialog_email_placeholder": "Адреса для пересилання сповіщення, наприклад phil@example.com", - "publish_dialog_attach_label": "URL-адреса вкладення", - "publish_dialog_filename_label": "Ім'я файлу", - "publish_dialog_delay_label": "Затримка", - "publish_dialog_email_reset": "Видалити пересилання електронної пошти", - "publish_dialog_chip_attach_url_label": "Прикріпити файл за URL", - "publish_dialog_details_examples_description": "Приклади та докладний опис усіх функцій, зверніться до документації.", - "publish_dialog_button_cancel_sending": "Скасувати відправку", - "publish_dialog_attached_file_filename_placeholder": "Ім'я прикріпленого файлу", - "publish_dialog_delay_placeholder": "Затримка доставлення, наприклад {{unixTimestamp}}, {{relativeTime}} або \"{{naturalLanguage}}\" (лише англійською)", - "publish_dialog_button_send": "Надіслати", - "publish_dialog_checkbox_publish_another": "Опублікувати ще", - "publish_dialog_chip_delay_label": "Затримка доставлення", - "publish_dialog_button_cancel": "Скасувати", - "publish_dialog_attached_file_title": "Прикріплений файл:", - "subscribe_dialog_subscribe_description": "Теми можуть не бути захищені паролем, тому виберіть назву, яку нелегко вгадати. Після підписки ви можете PUT/POST сповіщення.", - "emoji_picker_search_placeholder": "Пошук емодзі", - "emoji_picker_search_clear": "Очистити пошук", - "subscribe_dialog_subscribe_title": "Підпишіться на тему", - "subscribe_dialog_login_username_label": "Ім'я користувача, наприклад phil", - "prefs_notifications_title": "Сповіщення", - "subscribe_dialog_subscribe_button_cancel": "Скасувати", - "subscribe_dialog_subscribe_button_subscribe": "Підписатися", - "subscribe_dialog_error_user_anonymous": "анонімний", - "subscribe_dialog_login_title": "Потрібна авторизація", - "subscribe_dialog_login_description": "Ця тема захищена паролем. Будь ласка, введіть ім'я користувача та пароль, щоб підписатися.", - "prefs_notifications_sound_title": "Звук сповіщення", - "subscribe_dialog_login_button_login": "Логін", - "prefs_notifications_sound_no_sound": "Без звука", - "prefs_notifications_sound_play": "Відтворення вибраного звуку", - "prefs_users_description": "Додайте/видаляйте користувачів для захищених тем. Зверніть увагу, що ім'я користувача та пароль зберігаються у локальному сховищі браузера.", - "prefs_notifications_min_priority_title": "Мінімальний пріоритет", - "prefs_notifications_min_priority_high_and_higher": "Високий пріоритет і вище", - "prefs_notifications_min_priority_description_x_or_higher": "Показувати сповіщення, якщо пріоритет {{number}} ({{name}}) або вище", - "prefs_notifications_min_priority_description_max": "Показувати сповіщення, якщо пріоритет 5 (макс.)", - "prefs_notifications_min_priority_low_and_higher": "Низький та високий пріоритет", - "prefs_notifications_min_priority_max_only": "Тільки максимальний пріоритет", - "prefs_users_table_base_url_header": "URL служби", - "prefs_users_dialog_password_label": "Пароль", - "prefs_notifications_delete_after_three_hours": "Через три години", - "prefs_users_add_button": "Додати користувача", - "prefs_users_dialog_title_edit": "Редагувати користувача", - "prefs_users_dialog_base_url_label": "URL-адреса служби, наприклад https://ntfy.sh", - "prefs_users_delete_button": "Видалити користувача", - "prefs_users_table_user_header": "Користувач", - "prefs_users_dialog_title_add": "Додати користувача", - "prefs_users_dialog_username_label": "Ім'я користувача, наприклад phil", - "prefs_users_dialog_button_cancel": "Скасувати", - "prefs_users_dialog_button_add": "Додати", - "prefs_appearance_language_title": "Мова", - "error_boundary_gathering_info": "Зберіть більше інформації…", - "priority_min": "мін", - "error_boundary_description": "Очевидно, цього не повинно статися. Дуже шкода.
Якщо у вас є хвилина, повідомте про це на GitHub або повідомте нам через Discord або Matrix .", - "priority_low": "низький", - "error_boundary_stack_trace": "Трасування стека", - "error_boundary_unsupported_indexeddb_title": "Приватний перегляд не підтримується", - "error_boundary_unsupported_indexeddb_description": "Веб-програма ntfy потребує IndexedDB для роботи, а ваш браузер не підтримує IndexedDB у режимі приватного перегляду.

На жаль, використання ntfy web не має сенсу у режимі приватного перегляду, оскільки все зберігається в пам’яті браузера. Ви можете прочитати більше про це у цьому випуску GitHub або поспілкуватися з нами на Discord або Matrix." + "action_bar_logo_alt": "логотип ntfy", + "action_bar_settings": "Налаштування", + "message_bar_type_message": "Введіть повідомлення тут", + "message_bar_error_publishing": "Помилка публікації сповіщення", + "message_bar_show_dialog": "Показати діалогове вікно публікації", + "nav_topics_title": "Підписки на теми", + "nav_button_settings": "Налаштування", + "nav_button_documentation": "Документація", + "nav_button_subscribe": "Підписатися на тему", + "nav_button_muted": "Сповіщення вимкнено", + "nav_button_connecting": "підключення", + "alert_grant_title": "Сповіщення вимкнено", + "alert_grant_description": "Дозвольте браузеру показувати сповіщення.", + "alert_grant_button": "Дозволити", + "alert_not_supported_title": "Сповіщення не підтримуються", + "notifications_list_item": "Сповіщення", + "notifications_attachment_image": "Прикріплене зображення", + "notifications_attachment_open_title": "Перейти на {{url}}", + "notifications_attachment_open_button": "Відкрити вкладення", + "notifications_attachment_link_expires": "термін дії посилання закінчується {{date}}", + "notifications_actions_http_request_title": "Надіслати HTTP {{method}} на {{url}}", + "notifications_none_for_any_title": "Ви не отримали жодних сповіщень.", + "notifications_no_subscriptions_description": "Натисніть \"{{linktext}}\" посилання, щоб створити або підписатися на тему. Після цього ви зможете надсилати повідомлення за допомогою PUT або POST, і ви отримуватимете тут повідомлення.", + "notifications_more_details": "Додаткову інформацію можна знайти на сайті або в документації.", + "notifications_loading": "Завантаження сповіщень…", + "publish_dialog_title_topic": "Опублікувати в {{topic}}", + "publish_dialog_title_no_topic": "Опублікувати сповіщення", + "publish_dialog_progress_uploading": "Завантаження…", + "publish_dialog_message_published": "Сповіщення опубліковано", + "publish_dialog_attachment_limits_quota_reached": "перевищує квоту, залишилося {{remainingBytes}}", + "publish_dialog_priority_low": "Низький пріоритет", + "publish_dialog_topic_label": "Назва теми", + "publish_dialog_topic_placeholder": "Назва теми, наприклад phil_alerts", + "publish_dialog_topic_reset": "Скинути тему", + "publish_dialog_title_label": "Заголовок", + "publish_dialog_title_placeholder": "Заголовок сповіщення, наприклад Сповіщення про дисковий простір", + "publish_dialog_message_label": "Повідомлення", + "publish_dialog_message_placeholder": "Введіть повідомлення", + "publish_dialog_tags_label": "Теги", + "publish_dialog_tags_placeholder": "Список тегів розділений комою, наприклад warning, srv1-backup", + "publish_dialog_click_placeholder": "URL-адреса, яка відкривається після натискання сповіщення", + "publish_dialog_email_label": "Електронна пошта", + "publish_dialog_attach_placeholder": "Прикріпіть файл за URL-адресою, наприклад https://f-droid.org/F-Droid.apk", + "publish_dialog_attach_reset": "Видалити URL вкладення", + "publish_dialog_filename_placeholder": "Ім'я файлу вкладення", + "publish_dialog_delay_reset": "Видалити затримку доставлення", + "publish_dialog_chip_click_label": "Адреса", + "publish_dialog_chip_email_label": "Переслати на електронну пошту", + "publish_dialog_chip_topic_label": "Змінити тему", + "publish_dialog_attached_file_remove": "Видалити прикріплений файл", + "subscribe_dialog_subscribe_topic_placeholder": "Назва теми, наприклад phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "Використовувати інший сервер", + "subscribe_dialog_subscribe_base_url_label": "URL служби", + "subscribe_dialog_login_password_label": "Пароль", + "subscribe_dialog_login_button_back": "Назад", + "subscribe_dialog_error_user_not_authorized": "{{username}} користувач не авторизований", + "prefs_notifications_sound_description_none": "Сповіщення не відтворюють жодного звуку при надходженні", + "prefs_notifications_sound_description_some": "Сповіщення відтворюють звук {{sound}}", + "prefs_notifications_min_priority_description_any": "Показати всі сповіщень, незалежно від пріоритету", + "prefs_notifications_min_priority_any": "Будь-який пріоритет", + "prefs_notifications_min_priority_default_and_higher": "Пріоритет за замовчуванням та високий", + "prefs_notifications_delete_after_title": "Видалити сповіщення", + "prefs_notifications_delete_after_never": "Ніколи", + "prefs_notifications_delete_after_one_day": "Через день", + "prefs_notifications_delete_after_one_week": "Через тиждень", + "prefs_notifications_delete_after_one_month": "Через місяць", + "prefs_notifications_delete_after_never_description": "Сповіщення ніколи не видаляються автоматично", + "prefs_notifications_delete_after_three_hours_description": "Сповіщення автоматично видаляються через три години", + "prefs_notifications_delete_after_one_day_description": "Сповіщення автоматично видаляються через один день", + "prefs_notifications_delete_after_one_week_description": "Сповіщення автоматично видаляються через тиждень", + "prefs_notifications_delete_after_one_month_description": "Сповіщення автоматично видаляються через місяць", + "prefs_users_title": "Керувати користувачами", + "prefs_users_table": "Таблиця користувачів", + "prefs_users_edit_button": "Редагувати користувача", + "prefs_users_dialog_button_save": "Зберегти", + "prefs_appearance_title": "Зовнішній вигляд", + "priority_default": "за замовчуванням", + "priority_high": "високий", + "priority_max": "макс", + "error_boundary_title": "Ой, ntfy впав", + "error_boundary_button_copy_stack_trace": "Копіювати трасування стека", + "action_bar_show_menu": "Показати меню", + "action_bar_toggle_action_menu": "Відкрити/закрити меню", + "action_bar_send_test_notification": "Надіслати тестове сповіщення", + "action_bar_clear_notifications": "Очистити всі сповіщення", + "action_bar_toggle_mute": "Вимкнути/увімкнути сповіщення", + "action_bar_unsubscribe": "Відписатися", + "message_bar_publish": "Опублікувати повідомлення", + "nav_button_all_notifications": "Усі сповіщення", + "alert_not_supported_description": "Ваш браузер не підтримує сповіщення.", + "notifications_list": "Список сповіщень", + "notifications_mark_read": "Позначити як прочитане", + "notifications_delete": "Видалити", + "notifications_tags": "Теги", + "nav_button_publish_message": "Опублікувати сповіщення", + "notifications_attachment_copy_url_title": "Копіювати URL-адресу вкладення", + "notifications_attachment_link_expired": "термін дії посилання для завантаження закінчився", + "publish_dialog_progress_uploading_detail": "Завантажується {{loaded}}/{{total}} ({{percent}}%) …", + "notifications_priority_x": "Пріоритет {{priority}}", + "notifications_attachment_copy_url_button": "Копіювати URL-адресу", + "notifications_copied_to_clipboard": "Скопійовано в буфер обміну", + "notifications_attachment_file_video": "відео файл", + "notifications_attachment_file_audio": "звуковий файл", + "publish_dialog_emoji_picker_show": "Виберіть емодзі", + "notifications_new_indicator": "Нове сповіщення", + "notifications_attachment_file_image": "файл зображення", + "notifications_attachment_file_document": "інший документ", + "notifications_click_copy_url_title": "Копіювати URL-адресу посилання", + "notifications_click_copy_url_button": "Копіювати посилання", + "notifications_actions_not_supported": "Дія не підтримується у браузері", + "notifications_attachment_file_app": "Файл програми Android", + "notifications_click_open_button": "Відкрити посилання", + "notifications_actions_open_url_title": "Перейти на {{url}}", + "notifications_none_for_topic_description": "Щоб надіслати сповіщення до цієї теми, просто надішліть PUT або POST на URL-адресу цієї теми.", + "notifications_no_subscriptions_title": "Схоже, у вас ще немає жодної підписки.", + "publish_dialog_drop_file_here": "Перетягніть файл сюди", + "notifications_none_for_topic_title": "Ви ще не отримували сповіщення на цю тему.", + "notifications_example": "Приклад", + "notifications_none_for_any_description": "Щоб надіслати сповіщення до теми, просто надішліть PUT або POST на URL-адресу теми. Ось приклад, використовуючи одну з ваших тем.", + "publish_dialog_attachment_limits_file_and_quota_reached": "перевищує {{fileSizeLimit}} розмір файлу, {{remainingBytes}} залишилося", + "publish_dialog_priority_default": "Пріоритет за замовчуванням", + "publish_dialog_attachment_limits_file_reached": "перевищує {{fileSizeLimit}} розмір файлу", + "publish_dialog_priority_min": "Мін. пріоритет", + "publish_dialog_priority_high": "Високий пріоритет", + "publish_dialog_priority_max": "Макс. пріоритет", + "publish_dialog_base_url_placeholder": "URL-адреса сервісу, наприклад https://example.com", + "publish_dialog_base_url_label": "URL служби", + "publish_dialog_other_features": "Інші можливості:", + "publish_dialog_chip_attach_file_label": "Прикріпити локальний файл", + "publish_dialog_priority_label": "Пріоритет", + "publish_dialog_click_label": "Натисніть URL", + "publish_dialog_click_reset": "Видалити URL-адресу для натискання", + "publish_dialog_email_placeholder": "Адреса для пересилання сповіщення, наприклад phil@example.com", + "publish_dialog_attach_label": "URL-адреса вкладення", + "publish_dialog_filename_label": "Ім'я файлу", + "publish_dialog_delay_label": "Затримка", + "publish_dialog_email_reset": "Видалити пересилання електронної пошти", + "publish_dialog_chip_attach_url_label": "Прикріпити файл за URL", + "publish_dialog_details_examples_description": "Приклади та докладний опис усіх функцій, зверніться до документації.", + "publish_dialog_button_cancel_sending": "Скасувати відправку", + "publish_dialog_attached_file_filename_placeholder": "Ім'я прикріпленого файлу", + "publish_dialog_delay_placeholder": "Затримка доставлення, наприклад {{unixTimestamp}}, {{relativeTime}} або \"{{naturalLanguage}}\" (лише англійською)", + "publish_dialog_button_send": "Надіслати", + "publish_dialog_checkbox_publish_another": "Опублікувати ще", + "publish_dialog_chip_delay_label": "Затримка доставлення", + "publish_dialog_button_cancel": "Скасувати", + "publish_dialog_attached_file_title": "Прикріплений файл:", + "subscribe_dialog_subscribe_description": "Теми можуть не бути захищені паролем, тому виберіть назву, яку нелегко вгадати. Після підписки ви можете PUT/POST сповіщення.", + "emoji_picker_search_placeholder": "Пошук емодзі", + "emoji_picker_search_clear": "Очистити пошук", + "subscribe_dialog_subscribe_title": "Підпишіться на тему", + "subscribe_dialog_login_username_label": "Ім'я користувача, наприклад phil", + "prefs_notifications_title": "Сповіщення", + "subscribe_dialog_subscribe_button_cancel": "Скасувати", + "subscribe_dialog_subscribe_button_subscribe": "Підписатися", + "subscribe_dialog_error_user_anonymous": "анонімний", + "subscribe_dialog_login_title": "Потрібна авторизація", + "subscribe_dialog_login_description": "Ця тема захищена паролем. Будь ласка, введіть ім'я користувача та пароль, щоб підписатися.", + "prefs_notifications_sound_title": "Звук сповіщення", + "subscribe_dialog_login_button_login": "Логін", + "prefs_notifications_sound_no_sound": "Без звука", + "prefs_notifications_sound_play": "Відтворення вибраного звуку", + "prefs_users_description": "Додайте/видаляйте користувачів для захищених тем. Зверніть увагу, що ім'я користувача та пароль зберігаються у локальному сховищі браузера.", + "prefs_notifications_min_priority_title": "Мінімальний пріоритет", + "prefs_notifications_min_priority_high_and_higher": "Високий пріоритет і вище", + "prefs_notifications_min_priority_description_x_or_higher": "Показувати сповіщення, якщо пріоритет {{number}} ({{name}}) або вище", + "prefs_notifications_min_priority_description_max": "Показувати сповіщення, якщо пріоритет 5 (макс.)", + "prefs_notifications_min_priority_low_and_higher": "Низький та високий пріоритет", + "prefs_notifications_min_priority_max_only": "Тільки максимальний пріоритет", + "prefs_users_table_base_url_header": "URL служби", + "prefs_users_dialog_password_label": "Пароль", + "prefs_notifications_delete_after_three_hours": "Через три години", + "prefs_users_add_button": "Додати користувача", + "prefs_users_dialog_title_edit": "Редагувати користувача", + "prefs_users_dialog_base_url_label": "URL-адреса служби, наприклад https://ntfy.sh", + "prefs_users_delete_button": "Видалити користувача", + "prefs_users_table_user_header": "Користувач", + "prefs_users_dialog_title_add": "Додати користувача", + "prefs_users_dialog_username_label": "Ім'я користувача, наприклад phil", + "prefs_users_dialog_button_cancel": "Скасувати", + "prefs_users_dialog_button_add": "Додати", + "prefs_appearance_language_title": "Мова", + "error_boundary_gathering_info": "Зберіть більше інформації…", + "priority_min": "мін", + "error_boundary_description": "Очевидно, цього не повинно статися. Дуже шкода.
Якщо у вас є хвилина, повідомте про це на GitHub або повідомте нам через Discord або Matrix .", + "priority_low": "низький", + "error_boundary_stack_trace": "Трасування стека", + "error_boundary_unsupported_indexeddb_title": "Приватний перегляд не підтримується", + "error_boundary_unsupported_indexeddb_description": "Веб-програма ntfy потребує IndexedDB для роботи, а ваш браузер не підтримує IndexedDB у режимі приватного перегляду.

На жаль, використання ntfy web не має сенсу у режимі приватного перегляду, оскільки все зберігається в пам’яті браузера. Ви можете прочитати більше про це у цьому випуску GitHub або поспілкуватися з нами на Discord або Matrix." } diff --git a/web/public/static/langs/zh_Hans.json b/web/public/static/langs/zh_Hans.json index e4bb4810..82feef09 100644 --- a/web/public/static/langs/zh_Hans.json +++ b/web/public/static/langs/zh_Hans.json @@ -1,191 +1,191 @@ { - "action_bar_show_menu": "显示菜单", - "action_bar_logo_alt": "ntfy图标", - "action_bar_settings": "设置", - "action_bar_send_test_notification": "发送测试通知", - "action_bar_clear_notifications": "清除所有通知", - "action_bar_unsubscribe": "取消订阅", - "action_bar_toggle_action_menu": "开启或关闭操作菜单", - "message_bar_type_message": "在此处输入消息", - "message_bar_show_dialog": "显示发布对话框", - "message_bar_publish": "发布消息", - "nav_topics_title": "订阅主题", - "nav_button_all_notifications": "全部通知", - "nav_button_documentation": "文档", - "nav_button_publish_message": "发布通知", - "nav_button_subscribe": "订阅主题", - "nav_button_connecting": "正在连接", - "alert_grant_title": "已禁用通知", - "alert_grant_description": "授予浏览器显示桌面通知的权限。", - "alert_grant_button": "现在授予", - "alert_not_supported_title": "不支持通知", - "alert_not_supported_description": "您的浏览器不支持通知。", - "notifications_list": "通知列表", - "notifications_list_item": "通知", - "notifications_mark_read": "标记为已读", - "notifications_copied_to_clipboard": "复制到剪贴板", - "notifications_tags": "标记", - "notifications_priority_x": "优先级 {{priority}}", - "notifications_new_indicator": "新通知", - "notifications_attachment_open_button": "打开附件", - "notifications_attachment_link_expires": "链接过期 {{date}}", - "notifications_attachment_link_expired": "下载链接已过期", - "notifications_attachment_file_image": "图片文件", - "notifications_attachment_image": "附件图片", - "notifications_attachment_file_video": "视频文件", - "notifications_attachment_file_audio": "音频文件", - "notifications_attachment_file_app": "安卓应用文件", - "notifications_attachment_file_document": "其他文件", - "notifications_click_copy_url_title": "复制链接地址到剪贴板", - "notifications_click_copy_url_button": "复制链接", - "notifications_click_open_button": "打开链接", - "action_bar_toggle_mute": "暂停或恢复通知", - "nav_button_muted": "已暂停通知", - "notifications_actions_not_supported": "网页应用程序不支持操作", - "notifications_none_for_topic_title": "您尚未收到有关此主题的任何通知。", - "notifications_none_for_any_title": "您尚未收到任何通知。", - "notifications_none_for_any_description": "要向此主题发送通知,只需使用 PUT 或 POST 到主题链接即可。以下是使用您的主题的示例。", - "notifications_no_subscriptions_title": "看起来你还没有任何订阅。", - "notifications_example": "示例", - "notifications_more_details": "有关更多信息,请查看网站文档。", - "notifications_loading": "正在加载通知……", - "publish_dialog_title_topic": "发布到 {{topic}}", - "publish_dialog_title_no_topic": "发布通知", - "publish_dialog_progress_uploading": "正在上传……", - "publish_dialog_progress_uploading_detail": "正在上传 {{loaded}}/{{total}} ({{percent}}%) ……", - "publish_dialog_message_published": "已发布通知", - "publish_dialog_attachment_limits_file_and_quota_reached": "超过 {{fileSizeLimit}} 文件限制和配额,剩余 {{remainingBytes}}", - "publish_dialog_emoji_picker_show": "选择表情符号", - "publish_dialog_priority_min": "最低优先级", - "publish_dialog_priority_low": "低优先级", - "publish_dialog_priority_default": "默认优先级", - "publish_dialog_priority_high": "高优先级", - "publish_dialog_priority_max": "最高优先级", - "publish_dialog_topic_label": "主题名称", - "publish_dialog_topic_placeholder": "主题名称,例如 phil_alerts", - "publish_dialog_topic_reset": "重置主题", - "publish_dialog_title_label": "主题", - "publish_dialog_message_label": "消息", - "publish_dialog_message_placeholder": "在此输入消息", - "publish_dialog_tags_label": "标记", - "publish_dialog_priority_label": "优先级", - "publish_dialog_base_url_label": "服务链接地址", - "publish_dialog_base_url_placeholder": "服务链接地址,例如 https://example.com", - "publish_dialog_click_label": "点击链接地址", - "publish_dialog_click_placeholder": "点击通知时打开链接地址", - "publish_dialog_email_placeholder": "将通知转发到的地址,例如 phil@example.com", - "publish_dialog_email_reset": "移除电子邮件转发", - "publish_dialog_filename_label": "文件名", - "publish_dialog_filename_placeholder": "附件文件名", - "publish_dialog_delay_label": "延期", - "publish_dialog_other_features": "其它功能:", - "publish_dialog_attach_placeholder": "使用链接地址附加文件,例如 https://f-droid.org/F-Droid.apk", - "publish_dialog_delay_reset": "删除延期投递", - "publish_dialog_attach_reset": "移除附件链接地址", - "publish_dialog_chip_click_label": "点击链接地址", - "publish_dialog_chip_email_label": "转发邮件", - "publish_dialog_chip_attach_file_label": "本地文件附件", - "publish_dialog_chip_topic_label": "变更主题", - "publish_dialog_button_cancel_sending": "取消发送", - "publish_dialog_checkbox_publish_another": "发布另一个", - "publish_dialog_attached_file_title": "附件文件:", - "publish_dialog_attached_file_filename_placeholder": "附件文件名", - "publish_dialog_attached_file_remove": "删除附件文件", - "publish_dialog_drop_file_here": "将文件拖拽至此", - "emoji_picker_search_placeholder": "查找表情符号", - "emoji_picker_search_clear": "清除搜索", - "subscribe_dialog_subscribe_title": "订阅主题", - "publish_dialog_chip_delay_label": "延期投递", - "publish_dialog_chip_attach_url_label": "链接附件地址", - "subscribe_dialog_subscribe_use_another_label": "使用其他服务器", - "subscribe_dialog_subscribe_button_subscribe": "订阅", - "subscribe_dialog_login_title": "请登录", - "subscribe_dialog_login_description": "本主题受密码保护,请输入用户名和密码进行订阅。", - "subscribe_dialog_login_username_label": "用户名,例如 phil", - "subscribe_dialog_login_password_label": "密码", - "subscribe_dialog_login_button_back": "返回", - "subscribe_dialog_login_button_login": "登录", - "subscribe_dialog_error_user_not_authorized": "未授权 {{username}} 用户", - "subscribe_dialog_error_user_anonymous": "匿名", - "prefs_notifications_title": "通知", - "prefs_notifications_sound_title": "通知提示音", - "prefs_notifications_sound_description_none": "收到通知时不播放任何声音", - "prefs_notifications_sound_description_some": "收到通知时播放 {{sound}} 声音", - "prefs_notifications_sound_no_sound": "静音", - "prefs_notifications_sound_play": "播放选中声音", - "prefs_notifications_min_priority_title": "最低优先级", - "prefs_notifications_min_priority_description_x_or_higher": "仅显示优先级为{{number}}({{name}})或以上的通知", - "prefs_notifications_min_priority_description_max": "仅显示最高优先级的通知", - "prefs_notifications_min_priority_any": "任意优先级", - "prefs_notifications_min_priority_low_and_higher": "低优先级和更高优先级", - "prefs_notifications_min_priority_default_and_higher": "默认优先级和更高优先级", - "prefs_notifications_min_priority_high_and_higher": "高优先级和更高优先级", - "prefs_notifications_min_priority_max_only": "仅最高优先级", - "prefs_notifications_delete_after_never": "从不", - "prefs_notifications_delete_after_one_month": "一月后", - "prefs_notifications_delete_after_one_week": "一周后", - "prefs_notifications_delete_after_never_description": "永不自动删除通知", - "prefs_notifications_delete_after_three_hours_description": "三小时后自动删除通知", - "prefs_notifications_delete_after_one_day_description": "一天后自动删除通知", - "prefs_notifications_delete_after_one_week_description": "一周后自动删除通知", - "prefs_notifications_delete_after_one_month_description": "一月后后自动删除通知", - "prefs_users_title": "管理用户", - "prefs_users_description": "在此处添加/删除受保护主题的用户。请注意,用户名和密码存储在浏览器的本地存储中。", - "prefs_users_add_button": "添加用户", - "prefs_users_dialog_title_add": "添加用户", - "prefs_users_dialog_title_edit": "编辑用户", - "prefs_users_dialog_username_label": "用户名,例如 phil", - "prefs_users_dialog_password_label": "密码", - "prefs_users_dialog_button_cancel": "取消", - "prefs_users_dialog_button_save": "保存", - "prefs_appearance_title": "外观", - "prefs_appearance_language_title": "语言", - "priority_min": "最低", - "priority_low": "低", - "priority_default": "默认", - "priority_high": "高", - "priority_max": "最高", - "error_boundary_title": "天啊,ntfy 崩溃了", - "prefs_users_table_base_url_header": "服务链接地址", - "prefs_users_dialog_base_url_label": "服务链接地址,例如 https://ntfy.sh", - "error_boundary_button_copy_stack_trace": "复制堆栈跟踪", - "error_boundary_stack_trace": "堆栈跟踪", - "error_boundary_gathering_info": "收集更多信息……", - "error_boundary_unsupported_indexeddb_title": "不支持隐私浏览", - "error_boundary_unsupported_indexeddb_description": "Ntfy Web应用程序需要IndexedDB才能运行,并且您的浏览器在私隐私浏览模式下不支持IndexedDB。

虽然这很不幸,但在隐私浏览模式下使用ntfy Web应用程序也没有多大意义,因为所有东西都存储在浏览器存储中。您可以在本GitHub问题中阅读有关它的更多信息,或者在DiscordMatrix上与我们交谈。", - "message_bar_error_publishing": "发布通知时出错", - "nav_button_settings": "设置", - "notifications_delete": "删除", - "notifications_attachment_copy_url_title": "将附件中链接地址复制到剪贴板", - "notifications_attachment_copy_url_button": "复制链接地址", - "notifications_attachment_open_title": "转到 {{url}}", - "notifications_actions_http_request_title": "发送 HTTP {{method}} 到 {{url}}", - "notifications_actions_open_url_title": "转到 {{url}}", - "notifications_none_for_topic_description": "要向此主题发送通知,只需使用 PUT 或 POST 到主题链接即可。", - "subscribe_dialog_subscribe_topic_placeholder": "主题名,例如 phil_alerts", - "notifications_no_subscriptions_description": "单击 \"{{linktext}}\" 链接以创建或订阅主题。之后,您可以使用 PUT 或 POST 发送消息,您将在这里收到通知。", - "publish_dialog_attachment_limits_file_reached": "超过 {{fileSizeLimit}} 文件限制", - "publish_dialog_title_placeholder": "主题标题,例如 磁盘空间告警", - "publish_dialog_email_label": "电子邮件", - "publish_dialog_button_send": "发送", - "publish_dialog_attachment_limits_quota_reached": "超过配额,剩余 {{remainingBytes}}", - "publish_dialog_attach_label": "附件链接地址", - "publish_dialog_click_reset": "移除点击连接地址", - "publish_dialog_button_cancel": "取消", - "subscribe_dialog_subscribe_button_cancel": "取消", - "subscribe_dialog_subscribe_base_url_label": "服务地址地址", - "prefs_notifications_min_priority_description_any": "显示所有通知,无论优先级如何", - "prefs_notifications_delete_after_title": "删除通知", - "prefs_notifications_delete_after_three_hours": "三小时后", - "prefs_users_delete_button": "删除用户", - "prefs_users_table_user_header": "用户", - "prefs_users_dialog_button_add": "添加", - "prefs_notifications_delete_after_one_day": "一天后", - "error_boundary_description": "这显然不应该发生。对此非常抱歉。
如果您有时间,请在GitHub上报告,或通过DiscordMatrix告诉我们。", - "prefs_users_table": "用户表", - "prefs_users_edit_button": "编辑用户", - "publish_dialog_tags_placeholder": "英文逗号分隔标记列表,例如 warning, srv1-backup", - "publish_dialog_details_examples_description": "有关所有发送功能的示例和详细说明,请参阅文档。", - "subscribe_dialog_subscribe_description": "主题可能不受密码保护,因此请选择一个不容易被猜中的名字。订阅后,您可以使用 PUT/POST 通知。", - "publish_dialog_delay_placeholder": "延期投递,例如 {{unixTimestamp}}、{{relativeTime}}或「{{naturalLanguage}}」(仅限英语)" + "action_bar_show_menu": "显示菜单", + "action_bar_logo_alt": "ntfy图标", + "action_bar_settings": "设置", + "action_bar_send_test_notification": "发送测试通知", + "action_bar_clear_notifications": "清除所有通知", + "action_bar_unsubscribe": "取消订阅", + "action_bar_toggle_action_menu": "开启或关闭操作菜单", + "message_bar_type_message": "在此处输入消息", + "message_bar_show_dialog": "显示发布对话框", + "message_bar_publish": "发布消息", + "nav_topics_title": "订阅主题", + "nav_button_all_notifications": "全部通知", + "nav_button_documentation": "文档", + "nav_button_publish_message": "发布通知", + "nav_button_subscribe": "订阅主题", + "nav_button_connecting": "正在连接", + "alert_grant_title": "已禁用通知", + "alert_grant_description": "授予浏览器显示桌面通知的权限。", + "alert_grant_button": "现在授予", + "alert_not_supported_title": "不支持通知", + "alert_not_supported_description": "您的浏览器不支持通知。", + "notifications_list": "通知列表", + "notifications_list_item": "通知", + "notifications_mark_read": "标记为已读", + "notifications_copied_to_clipboard": "复制到剪贴板", + "notifications_tags": "标记", + "notifications_priority_x": "优先级 {{priority}}", + "notifications_new_indicator": "新通知", + "notifications_attachment_open_button": "打开附件", + "notifications_attachment_link_expires": "链接过期 {{date}}", + "notifications_attachment_link_expired": "下载链接已过期", + "notifications_attachment_file_image": "图片文件", + "notifications_attachment_image": "附件图片", + "notifications_attachment_file_video": "视频文件", + "notifications_attachment_file_audio": "音频文件", + "notifications_attachment_file_app": "安卓应用文件", + "notifications_attachment_file_document": "其他文件", + "notifications_click_copy_url_title": "复制链接地址到剪贴板", + "notifications_click_copy_url_button": "复制链接", + "notifications_click_open_button": "打开链接", + "action_bar_toggle_mute": "暂停或恢复通知", + "nav_button_muted": "已暂停通知", + "notifications_actions_not_supported": "网页应用程序不支持操作", + "notifications_none_for_topic_title": "您尚未收到有关此主题的任何通知。", + "notifications_none_for_any_title": "您尚未收到任何通知。", + "notifications_none_for_any_description": "要向此主题发送通知,只需使用 PUT 或 POST 到主题链接即可。以下是使用您的主题的示例。", + "notifications_no_subscriptions_title": "看起来你还没有任何订阅。", + "notifications_example": "示例", + "notifications_more_details": "有关更多信息,请查看网站文档。", + "notifications_loading": "正在加载通知……", + "publish_dialog_title_topic": "发布到 {{topic}}", + "publish_dialog_title_no_topic": "发布通知", + "publish_dialog_progress_uploading": "正在上传……", + "publish_dialog_progress_uploading_detail": "正在上传 {{loaded}}/{{total}} ({{percent}}%) ……", + "publish_dialog_message_published": "已发布通知", + "publish_dialog_attachment_limits_file_and_quota_reached": "超过 {{fileSizeLimit}} 文件限制和配额,剩余 {{remainingBytes}}", + "publish_dialog_emoji_picker_show": "选择表情符号", + "publish_dialog_priority_min": "最低优先级", + "publish_dialog_priority_low": "低优先级", + "publish_dialog_priority_default": "默认优先级", + "publish_dialog_priority_high": "高优先级", + "publish_dialog_priority_max": "最高优先级", + "publish_dialog_topic_label": "主题名称", + "publish_dialog_topic_placeholder": "主题名称,例如 phil_alerts", + "publish_dialog_topic_reset": "重置主题", + "publish_dialog_title_label": "主题", + "publish_dialog_message_label": "消息", + "publish_dialog_message_placeholder": "在此输入消息", + "publish_dialog_tags_label": "标记", + "publish_dialog_priority_label": "优先级", + "publish_dialog_base_url_label": "服务链接地址", + "publish_dialog_base_url_placeholder": "服务链接地址,例如 https://example.com", + "publish_dialog_click_label": "点击链接地址", + "publish_dialog_click_placeholder": "点击通知时打开链接地址", + "publish_dialog_email_placeholder": "将通知转发到的地址,例如 phil@example.com", + "publish_dialog_email_reset": "移除电子邮件转发", + "publish_dialog_filename_label": "文件名", + "publish_dialog_filename_placeholder": "附件文件名", + "publish_dialog_delay_label": "延期", + "publish_dialog_other_features": "其它功能:", + "publish_dialog_attach_placeholder": "使用链接地址附加文件,例如 https://f-droid.org/F-Droid.apk", + "publish_dialog_delay_reset": "删除延期投递", + "publish_dialog_attach_reset": "移除附件链接地址", + "publish_dialog_chip_click_label": "点击链接地址", + "publish_dialog_chip_email_label": "转发邮件", + "publish_dialog_chip_attach_file_label": "本地文件附件", + "publish_dialog_chip_topic_label": "变更主题", + "publish_dialog_button_cancel_sending": "取消发送", + "publish_dialog_checkbox_publish_another": "发布另一个", + "publish_dialog_attached_file_title": "附件文件:", + "publish_dialog_attached_file_filename_placeholder": "附件文件名", + "publish_dialog_attached_file_remove": "删除附件文件", + "publish_dialog_drop_file_here": "将文件拖拽至此", + "emoji_picker_search_placeholder": "查找表情符号", + "emoji_picker_search_clear": "清除搜索", + "subscribe_dialog_subscribe_title": "订阅主题", + "publish_dialog_chip_delay_label": "延期投递", + "publish_dialog_chip_attach_url_label": "链接附件地址", + "subscribe_dialog_subscribe_use_another_label": "使用其他服务器", + "subscribe_dialog_subscribe_button_subscribe": "订阅", + "subscribe_dialog_login_title": "请登录", + "subscribe_dialog_login_description": "本主题受密码保护,请输入用户名和密码进行订阅。", + "subscribe_dialog_login_username_label": "用户名,例如 phil", + "subscribe_dialog_login_password_label": "密码", + "subscribe_dialog_login_button_back": "返回", + "subscribe_dialog_login_button_login": "登录", + "subscribe_dialog_error_user_not_authorized": "未授权 {{username}} 用户", + "subscribe_dialog_error_user_anonymous": "匿名", + "prefs_notifications_title": "通知", + "prefs_notifications_sound_title": "通知提示音", + "prefs_notifications_sound_description_none": "收到通知时不播放任何声音", + "prefs_notifications_sound_description_some": "收到通知时播放 {{sound}} 声音", + "prefs_notifications_sound_no_sound": "静音", + "prefs_notifications_sound_play": "播放选中声音", + "prefs_notifications_min_priority_title": "最低优先级", + "prefs_notifications_min_priority_description_x_or_higher": "仅显示优先级为{{number}}({{name}})或以上的通知", + "prefs_notifications_min_priority_description_max": "仅显示最高优先级的通知", + "prefs_notifications_min_priority_any": "任意优先级", + "prefs_notifications_min_priority_low_and_higher": "低优先级和更高优先级", + "prefs_notifications_min_priority_default_and_higher": "默认优先级和更高优先级", + "prefs_notifications_min_priority_high_and_higher": "高优先级和更高优先级", + "prefs_notifications_min_priority_max_only": "仅最高优先级", + "prefs_notifications_delete_after_never": "从不", + "prefs_notifications_delete_after_one_month": "一月后", + "prefs_notifications_delete_after_one_week": "一周后", + "prefs_notifications_delete_after_never_description": "永不自动删除通知", + "prefs_notifications_delete_after_three_hours_description": "三小时后自动删除通知", + "prefs_notifications_delete_after_one_day_description": "一天后自动删除通知", + "prefs_notifications_delete_after_one_week_description": "一周后自动删除通知", + "prefs_notifications_delete_after_one_month_description": "一月后后自动删除通知", + "prefs_users_title": "管理用户", + "prefs_users_description": "在此处添加/删除受保护主题的用户。请注意,用户名和密码存储在浏览器的本地存储中。", + "prefs_users_add_button": "添加用户", + "prefs_users_dialog_title_add": "添加用户", + "prefs_users_dialog_title_edit": "编辑用户", + "prefs_users_dialog_username_label": "用户名,例如 phil", + "prefs_users_dialog_password_label": "密码", + "prefs_users_dialog_button_cancel": "取消", + "prefs_users_dialog_button_save": "保存", + "prefs_appearance_title": "外观", + "prefs_appearance_language_title": "语言", + "priority_min": "最低", + "priority_low": "低", + "priority_default": "默认", + "priority_high": "高", + "priority_max": "最高", + "error_boundary_title": "天啊,ntfy 崩溃了", + "prefs_users_table_base_url_header": "服务链接地址", + "prefs_users_dialog_base_url_label": "服务链接地址,例如 https://ntfy.sh", + "error_boundary_button_copy_stack_trace": "复制堆栈跟踪", + "error_boundary_stack_trace": "堆栈跟踪", + "error_boundary_gathering_info": "收集更多信息……", + "error_boundary_unsupported_indexeddb_title": "不支持隐私浏览", + "error_boundary_unsupported_indexeddb_description": "Ntfy Web应用程序需要IndexedDB才能运行,并且您的浏览器在私隐私浏览模式下不支持IndexedDB。

虽然这很不幸,但在隐私浏览模式下使用ntfy Web应用程序也没有多大意义,因为所有东西都存储在浏览器存储中。您可以在本GitHub问题中阅读有关它的更多信息,或者在DiscordMatrix上与我们交谈。", + "message_bar_error_publishing": "发布通知时出错", + "nav_button_settings": "设置", + "notifications_delete": "删除", + "notifications_attachment_copy_url_title": "将附件中链接地址复制到剪贴板", + "notifications_attachment_copy_url_button": "复制链接地址", + "notifications_attachment_open_title": "转到 {{url}}", + "notifications_actions_http_request_title": "发送 HTTP {{method}} 到 {{url}}", + "notifications_actions_open_url_title": "转到 {{url}}", + "notifications_none_for_topic_description": "要向此主题发送通知,只需使用 PUT 或 POST 到主题链接即可。", + "subscribe_dialog_subscribe_topic_placeholder": "主题名,例如 phil_alerts", + "notifications_no_subscriptions_description": "单击 \"{{linktext}}\" 链接以创建或订阅主题。之后,您可以使用 PUT 或 POST 发送消息,您将在这里收到通知。", + "publish_dialog_attachment_limits_file_reached": "超过 {{fileSizeLimit}} 文件限制", + "publish_dialog_title_placeholder": "主题标题,例如 磁盘空间告警", + "publish_dialog_email_label": "电子邮件", + "publish_dialog_button_send": "发送", + "publish_dialog_attachment_limits_quota_reached": "超过配额,剩余 {{remainingBytes}}", + "publish_dialog_attach_label": "附件链接地址", + "publish_dialog_click_reset": "移除点击连接地址", + "publish_dialog_button_cancel": "取消", + "subscribe_dialog_subscribe_button_cancel": "取消", + "subscribe_dialog_subscribe_base_url_label": "服务地址地址", + "prefs_notifications_min_priority_description_any": "显示所有通知,无论优先级如何", + "prefs_notifications_delete_after_title": "删除通知", + "prefs_notifications_delete_after_three_hours": "三小时后", + "prefs_users_delete_button": "删除用户", + "prefs_users_table_user_header": "用户", + "prefs_users_dialog_button_add": "添加", + "prefs_notifications_delete_after_one_day": "一天后", + "error_boundary_description": "这显然不应该发生。对此非常抱歉。
如果您有时间,请在GitHub上报告,或通过DiscordMatrix告诉我们。", + "prefs_users_table": "用户表", + "prefs_users_edit_button": "编辑用户", + "publish_dialog_tags_placeholder": "英文逗号分隔标记列表,例如 warning, srv1-backup", + "publish_dialog_details_examples_description": "有关所有发送功能的示例和详细说明,请参阅文档。", + "subscribe_dialog_subscribe_description": "主题可能不受密码保护,因此请选择一个不容易被猜中的名字。订阅后,您可以使用 PUT/POST 通知。", + "publish_dialog_delay_placeholder": "延期投递,例如 {{unixTimestamp}}、{{relativeTime}}或「{{naturalLanguage}}」(仅限英语)" } diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index 09b9b489..ac4141dd 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -1,85 +1,85 @@ { - "action_bar_logo_alt": "ntfy 標識", - "action_bar_unsubscribe": "取消訂閱", - "action_bar_toggle_mute": "通知靜音/解除通知靜音", - "action_bar_toggle_action_menu": "開啟/關閉操作選單", - "message_bar_type_message": "在這邊輸入訊息", - "alert_grant_description": "允許瀏覽器權限以顯示桌面通知。", - "alert_grant_button": "允許", - "notifications_list": "通知清單", - "notifications_list_item": "通知", - "notifications_mark_read": "標示已讀", - "notifications_attachment_image": "附加圖片", - "notifications_attachment_copy_url_title": "複製附件 URL 到剪貼簿", - "notifications_attachment_copy_url_button": "複製 URL", - "notifications_attachment_open_title": "前往 {{url}}", - "notifications_attachment_open_button": "開啟附件", - "notifications_attachment_link_expired": "下載連結已過期", - "notifications_attachment_file_video": "影片檔案", - "notifications_attachment_file_app": "Android 應用程式檔案", - "notifications_attachment_file_document": "其他文件", - "notifications_click_copy_url_title": "複製連結 URL 到剪貼板", - "notifications_click_copy_url_button": "複製連結", - "notifications_click_open_button": "開啟連結", - "notifications_actions_not_supported": "網頁程式無法支援該動作", - "notifications_actions_http_request_title": "傳送 HTTP {{method}} 到 {{url}}", - "notifications_none_for_topic_title": "尚未收到任何此主題的通知。", - "notifications_none_for_topic_description": "如要寄送通知到此主題,請使用 PUT 或 POST 到此主題URL。", - "notifications_none_for_any_title": "尚未收到任何通知。", - "action_bar_settings": "設定", - "action_bar_send_test_notification": "發送測試通知", - "action_bar_clear_notifications": "清除所有通知", - "action_bar_show_menu": "顯示選單", - "nav_button_documentation": "文件", - "nav_button_publish_message": "發佈通知", - "nav_button_muted": "通知已靜音", - "notifications_copied_to_clipboard": "已複製到剪貼簿", - "message_bar_publish": "發佈訊息", - "message_bar_show_dialog": "顯示發佈對話框", - "message_bar_error_publishing": "發佈通知時發生錯誤", - "nav_topics_title": "訂閱主題", - "nav_button_all_notifications": "所有通知", - "nav_button_settings": "設定", - "nav_button_subscribe": "訂閱主題", - "nav_button_connecting": "連線中", - "alert_grant_title": "通知已關閉", - "alert_not_supported_title": "不支援通知", - "alert_not_supported_description": "瀏覽器不支援通知。", - "notifications_tags": "標籤", - "notifications_priority_x": "優先度 {{priority}}", - "notifications_new_indicator": "新通知", - "notifications_attachment_file_audio": "聲音檔案", - "notifications_delete": "刪除", - "notifications_attachment_link_expires": "連結在 {{date}} 過期", - "notifications_attachment_file_image": "圖片檔案", - "notifications_actions_open_url_title": "前往 {{url}}", - "notifications_no_subscriptions_title": "你尚未有任何訂閱。", - "notifications_example": "範例", - "notifications_more_details": "你可以在 ntfy 網站或者技術文件中查看更多資訊。", - "notifications_loading": "載入中…", - "publish_dialog_title_topic": "發佈到 {{topic}}", - "publish_dialog_title_no_topic": "發佈通知", - "publish_dialog_progress_uploading": "上傳中…", - "publish_dialog_priority_label": "優先度", - "publish_dialog_email_label": "電郵地址", - "publish_dialog_filename_label": "檔案名稱", - "publish_dialog_button_cancel": "取消", - "publish_dialog_button_send": "傳送", - "publish_dialog_button_cancel_sending": "取消傳送", - "subscribe_dialog_subscribe_button_cancel": "取消", - "subscribe_dialog_subscribe_button_subscribe": "訂閱", - "emoji_picker_search_clear": "清除", - "subscribe_dialog_login_password_label": "密碼", - "subscribe_dialog_login_button_back": "返回", - "subscribe_dialog_login_button_login": "登入", - "prefs_notifications_delete_after_never": "從不", - "prefs_users_add_button": "新增使用者", - "prefs_users_dialog_password_label": "密碼", - "prefs_users_dialog_title_add": "新增使用者", - "prefs_users_dialog_button_save": "儲存", - "prefs_users_dialog_button_cancel": "取消", - "error_boundary_title": "歐買尬,ntfy 壞掉了", - "notifications_none_for_any_description": "要開始發送通知到一個主題,只需要對主題 URL 發送 HTTP PUT 或者 POST,例如:", - "notifications_no_subscriptions_description": "點選 「{{linktext}}」 連結以建立或訂閱主題。完成後,你就可以使用 HTTP PUT 或者 POST 發送通知到這裡了!", - "error_boundary_description": "很抱歉 ntfy 發生錯誤了。
如果你有時間,煩請到 Github 回報錯誤,或者到 Discord 或者 Matrix 聊天室裡面告訴我們。" + "action_bar_logo_alt": "ntfy 標識", + "action_bar_unsubscribe": "取消訂閱", + "action_bar_toggle_mute": "通知靜音/解除通知靜音", + "action_bar_toggle_action_menu": "開啟/關閉操作選單", + "message_bar_type_message": "在這邊輸入訊息", + "alert_grant_description": "允許瀏覽器權限以顯示桌面通知。", + "alert_grant_button": "允許", + "notifications_list": "通知清單", + "notifications_list_item": "通知", + "notifications_mark_read": "標示已讀", + "notifications_attachment_image": "附加圖片", + "notifications_attachment_copy_url_title": "複製附件 URL 到剪貼簿", + "notifications_attachment_copy_url_button": "複製 URL", + "notifications_attachment_open_title": "前往 {{url}}", + "notifications_attachment_open_button": "開啟附件", + "notifications_attachment_link_expired": "下載連結已過期", + "notifications_attachment_file_video": "影片檔案", + "notifications_attachment_file_app": "Android 應用程式檔案", + "notifications_attachment_file_document": "其他文件", + "notifications_click_copy_url_title": "複製連結 URL 到剪貼板", + "notifications_click_copy_url_button": "複製連結", + "notifications_click_open_button": "開啟連結", + "notifications_actions_not_supported": "網頁程式無法支援該動作", + "notifications_actions_http_request_title": "傳送 HTTP {{method}} 到 {{url}}", + "notifications_none_for_topic_title": "尚未收到任何此主題的通知。", + "notifications_none_for_topic_description": "如要寄送通知到此主題,請使用 PUT 或 POST 到此主題URL。", + "notifications_none_for_any_title": "尚未收到任何通知。", + "action_bar_settings": "設定", + "action_bar_send_test_notification": "發送測試通知", + "action_bar_clear_notifications": "清除所有通知", + "action_bar_show_menu": "顯示選單", + "nav_button_documentation": "文件", + "nav_button_publish_message": "發佈通知", + "nav_button_muted": "通知已靜音", + "notifications_copied_to_clipboard": "已複製到剪貼簿", + "message_bar_publish": "發佈訊息", + "message_bar_show_dialog": "顯示發佈對話框", + "message_bar_error_publishing": "發佈通知時發生錯誤", + "nav_topics_title": "訂閱主題", + "nav_button_all_notifications": "所有通知", + "nav_button_settings": "設定", + "nav_button_subscribe": "訂閱主題", + "nav_button_connecting": "連線中", + "alert_grant_title": "通知已關閉", + "alert_not_supported_title": "不支援通知", + "alert_not_supported_description": "瀏覽器不支援通知。", + "notifications_tags": "標籤", + "notifications_priority_x": "優先度 {{priority}}", + "notifications_new_indicator": "新通知", + "notifications_attachment_file_audio": "聲音檔案", + "notifications_delete": "刪除", + "notifications_attachment_link_expires": "連結在 {{date}} 過期", + "notifications_attachment_file_image": "圖片檔案", + "notifications_actions_open_url_title": "前往 {{url}}", + "notifications_no_subscriptions_title": "你尚未有任何訂閱。", + "notifications_example": "範例", + "notifications_more_details": "你可以在 ntfy 網站或者技術文件中查看更多資訊。", + "notifications_loading": "載入中…", + "publish_dialog_title_topic": "發佈到 {{topic}}", + "publish_dialog_title_no_topic": "發佈通知", + "publish_dialog_progress_uploading": "上傳中…", + "publish_dialog_priority_label": "優先度", + "publish_dialog_email_label": "電郵地址", + "publish_dialog_filename_label": "檔案名稱", + "publish_dialog_button_cancel": "取消", + "publish_dialog_button_send": "傳送", + "publish_dialog_button_cancel_sending": "取消傳送", + "subscribe_dialog_subscribe_button_cancel": "取消", + "subscribe_dialog_subscribe_button_subscribe": "訂閱", + "emoji_picker_search_clear": "清除", + "subscribe_dialog_login_password_label": "密碼", + "subscribe_dialog_login_button_back": "返回", + "subscribe_dialog_login_button_login": "登入", + "prefs_notifications_delete_after_never": "從不", + "prefs_users_add_button": "新增使用者", + "prefs_users_dialog_password_label": "密碼", + "prefs_users_dialog_title_add": "新增使用者", + "prefs_users_dialog_button_save": "儲存", + "prefs_users_dialog_button_cancel": "取消", + "error_boundary_title": "歐買尬,ntfy 壞掉了", + "notifications_none_for_any_description": "要開始發送通知到一個主題,只需要對主題 URL 發送 HTTP PUT 或者 POST,例如:", + "notifications_no_subscriptions_description": "點選 「{{linktext}}」 連結以建立或訂閱主題。完成後,你就可以使用 HTTP PUT 或者 POST 發送通知到這裡了!", + "error_boundary_description": "很抱歉 ntfy 發生錯誤了。
如果你有時間,煩請到 Github 回報錯誤,或者到 Discord 或者 Matrix 聊天室裡面告訴我們。" } diff --git a/web/src/app/Api.js b/web/src/app/Api.js index a07f7a56..8c6f0606 100644 --- a/web/src/app/Api.js +++ b/web/src/app/Api.js @@ -1,133 +1,140 @@ import { - fetchLinesIterator, - maybeWithBasicAuth, - topicShortUrl, - topicUrl, - topicUrlAuth, - topicUrlJsonPoll, - topicUrlJsonPollWithSince, - userStatsUrl + fetchLinesIterator, + maybeWithBasicAuth, + topicShortUrl, + topicUrl, + topicUrlAuth, + topicUrlJsonPoll, + topicUrlJsonPollWithSince, + userStatsUrl, } from "./utils"; import userManager from "./UserManager"; class Api { - async poll(baseUrl, topic, since) { - const user = await userManager.get(baseUrl); - const shortUrl = topicShortUrl(baseUrl, topic); - const url = (since) - ? topicUrlJsonPollWithSince(baseUrl, topic, since) - : topicUrlJsonPoll(baseUrl, topic); - const messages = []; - const headers = maybeWithBasicAuth({}, user); - console.log(`[Api] Polling ${url}`); - for await (let line of fetchLinesIterator(url, headers)) { - console.log(`[Api, ${shortUrl}] Received message ${line}`); - messages.push(JSON.parse(line)); - } - return messages; + async poll(baseUrl, topic, since) { + const user = await userManager.get(baseUrl); + const shortUrl = topicShortUrl(baseUrl, topic); + const url = since + ? topicUrlJsonPollWithSince(baseUrl, topic, since) + : topicUrlJsonPoll(baseUrl, topic); + const messages = []; + const headers = maybeWithBasicAuth({}, user); + console.log(`[Api] Polling ${url}`); + for await (let line of fetchLinesIterator(url, headers)) { + console.log(`[Api, ${shortUrl}] Received message ${line}`); + messages.push(JSON.parse(line)); } + return messages; + } - async publish(baseUrl, topic, message, options) { - const user = await userManager.get(baseUrl); - console.log(`[Api] Publishing message to ${topicUrl(baseUrl, topic)}`); - const headers = {}; - const body = { - topic: topic, - message: message, - ...options - }; - const response = await fetch(baseUrl, { - method: 'PUT', - body: JSON.stringify(body), - headers: maybeWithBasicAuth(headers, user) - }); - if (response.status < 200 || response.status > 299) { - throw new Error(`Unexpected response: ${response.status}`); - } - return response; + async publish(baseUrl, topic, message, options) { + const user = await userManager.get(baseUrl); + console.log(`[Api] Publishing message to ${topicUrl(baseUrl, topic)}`); + const headers = {}; + const body = { + topic: topic, + message: message, + ...options, + }; + const response = await fetch(baseUrl, { + method: "PUT", + body: JSON.stringify(body), + headers: maybeWithBasicAuth(headers, user), + }); + if (response.status < 200 || response.status > 299) { + throw new Error(`Unexpected response: ${response.status}`); } + return response; + } - /** - * Publishes to a topic using XMLHttpRequest (XHR), and returns a Promise with the active request. - * Unfortunately, fetch() does not support a progress hook, which is why XHR has to be used. - * - * Firefox XHR bug: - * Firefox has a bug(?), which returns 0 and "" for all fields of the XHR response in the case of an error, - * so we cannot determine the exact error. It also sometimes complains about CORS violations, even when the - * correct headers are clearly set. It's quite the odd behavior. - * - * There is an example, and the bug report here: - * - https://bugzilla.mozilla.org/show_bug.cgi?id=1733755 - * - https://gist.github.com/binwiederhier/627f146d1959799be207ad8c17a8f345 - */ - publishXHR(url, body, headers, onProgress) { - console.log(`[Api] Publishing message to ${url}`); - const xhr = new XMLHttpRequest(); - const send = new Promise(function (resolve, reject) { - xhr.open("PUT", url); - if (body.type) { - xhr.overrideMimeType(body.type); + /** + * Publishes to a topic using XMLHttpRequest (XHR), and returns a Promise with the active request. + * Unfortunately, fetch() does not support a progress hook, which is why XHR has to be used. + * + * Firefox XHR bug: + * Firefox has a bug(?), which returns 0 and "" for all fields of the XHR response in the case of an error, + * so we cannot determine the exact error. It also sometimes complains about CORS violations, even when the + * correct headers are clearly set. It's quite the odd behavior. + * + * There is an example, and the bug report here: + * - https://bugzilla.mozilla.org/show_bug.cgi?id=1733755 + * - https://gist.github.com/binwiederhier/627f146d1959799be207ad8c17a8f345 + */ + publishXHR(url, body, headers, onProgress) { + console.log(`[Api] Publishing message to ${url}`); + const xhr = new XMLHttpRequest(); + const send = new Promise(function (resolve, reject) { + xhr.open("PUT", url); + if (body.type) { + xhr.overrideMimeType(body.type); + } + for (const [key, value] of Object.entries(headers)) { + xhr.setRequestHeader(key, value); + } + xhr.upload.addEventListener("progress", onProgress); + xhr.addEventListener("readystatechange", (ev) => { + if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status <= 299) { + console.log( + `[Api] Publish successful (HTTP ${xhr.status})`, + xhr.response, + ); + resolve(xhr.response); + } else if (xhr.readyState === 4) { + // Firefox bug; see description above! + console.log( + `[Api] Publish failed (HTTP ${xhr.status})`, + xhr.responseText, + ); + let errorText; + try { + const error = JSON.parse(xhr.responseText); + if (error.code && error.error) { + errorText = `Error ${error.code}: ${error.error}`; } - for (const [key, value] of Object.entries(headers)) { - xhr.setRequestHeader(key, value); - } - xhr.upload.addEventListener("progress", onProgress); - xhr.addEventListener('readystatechange', (ev) => { - if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status <= 299) { - console.log(`[Api] Publish successful (HTTP ${xhr.status})`, xhr.response); - resolve(xhr.response); - } else if (xhr.readyState === 4) { - // Firefox bug; see description above! - console.log(`[Api] Publish failed (HTTP ${xhr.status})`, xhr.responseText); - let errorText; - try { - const error = JSON.parse(xhr.responseText); - if (error.code && error.error) { - errorText = `Error ${error.code}: ${error.error}`; - } - } catch (e) { - // Nothing - } - xhr.abort(); - reject(errorText ?? "An error occurred"); - } - }) - xhr.send(body); - }); - send.abort = () => { - console.log(`[Api] Publish aborted by user`); - xhr.abort(); + } catch (e) { + // Nothing + } + xhr.abort(); + reject(errorText ?? "An error occurred"); } - return send; - } + }); + xhr.send(body); + }); + send.abort = () => { + console.log(`[Api] Publish aborted by user`); + xhr.abort(); + }; + return send; + } - async auth(baseUrl, topic, user) { - const url = topicUrlAuth(baseUrl, topic); - console.log(`[Api] Checking auth for ${url}`); - const response = await fetch(url, { - headers: maybeWithBasicAuth({}, user) - }); - if (response.status >= 200 && response.status <= 299) { - return true; - } else if (!user && response.status === 404) { - return true; // Special case: Anonymous login to old servers return 404 since //auth doesn't exist - } else if (response.status === 401 || response.status === 403) { // See server/server.go - return false; - } - throw new Error(`Unexpected server response ${response.status}`); + async auth(baseUrl, topic, user) { + const url = topicUrlAuth(baseUrl, topic); + console.log(`[Api] Checking auth for ${url}`); + const response = await fetch(url, { + headers: maybeWithBasicAuth({}, user), + }); + if (response.status >= 200 && response.status <= 299) { + return true; + } else if (!user && response.status === 404) { + return true; // Special case: Anonymous login to old servers return 404 since //auth doesn't exist + } else if (response.status === 401 || response.status === 403) { + // See server/server.go + return false; } + throw new Error(`Unexpected server response ${response.status}`); + } - async userStats(baseUrl) { - const url = userStatsUrl(baseUrl); - console.log(`[Api] Fetching user stats ${url}`); - const response = await fetch(url); - if (response.status !== 200) { - throw new Error(`Unexpected server response ${response.status}`); - } - const stats = await response.json(); - console.log(`[Api] Stats`, stats); - return stats; + async userStats(baseUrl) { + const url = userStatsUrl(baseUrl); + console.log(`[Api] Fetching user stats ${url}`); + const response = await fetch(url); + if (response.status !== 200) { + throw new Error(`Unexpected server response ${response.status}`); } + const stats = await response.json(); + console.log(`[Api] Stats`, stats); + return stats; + } } const api = new Api(); diff --git a/web/src/app/Connection.js b/web/src/app/Connection.js index 55778023..caa2700d 100644 --- a/web/src/app/Connection.js +++ b/web/src/app/Connection.js @@ -1,4 +1,4 @@ -import {basicAuth, encodeBase64Url, topicShortUrl, topicUrlWs} from "./utils"; +import { basicAuth, encodeBase64Url, topicShortUrl, topicUrlWs } from "./utils"; const retryBackoffSeconds = [5, 10, 15, 20, 30]; @@ -9,104 +9,138 @@ const retryBackoffSeconds = [5, 10, 15, 20, 30]; * Incoming messages and state changes are forwarded via listeners. */ class Connection { - constructor(connectionId, subscriptionId, baseUrl, topic, user, since, onNotification, onStateChanged) { - this.connectionId = connectionId; - this.subscriptionId = subscriptionId; - this.baseUrl = baseUrl; - this.topic = topic; - this.user = user; - this.since = since; - this.shortUrl = topicShortUrl(baseUrl, topic); - this.onNotification = onNotification; - this.onStateChanged = onStateChanged; + constructor( + connectionId, + subscriptionId, + baseUrl, + topic, + user, + since, + onNotification, + onStateChanged, + ) { + this.connectionId = connectionId; + this.subscriptionId = subscriptionId; + this.baseUrl = baseUrl; + this.topic = topic; + this.user = user; + this.since = since; + this.shortUrl = topicShortUrl(baseUrl, topic); + this.onNotification = onNotification; + this.onStateChanged = onStateChanged; + this.ws = null; + this.retryCount = 0; + this.retryTimeout = null; + } + + start() { + // Don't fetch old messages; we do that as a poll() when adding a subscription; + // we don't want to re-trigger the main view re-render potentially hundreds of times. + + const wsUrl = this.wsUrl(); + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Opening connection to ${wsUrl}`, + ); + + this.ws = new WebSocket(wsUrl); + this.ws.onopen = (event) => { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Connection established`, + event, + ); + this.retryCount = 0; + this.onStateChanged(this.subscriptionId, ConnectionState.Connected); + }; + this.ws.onmessage = (event) => { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Message received from server: ${event.data}`, + ); + try { + const data = JSON.parse(event.data); + if (data.event === "open") { + return; + } + const relevantAndValid = + data.event === "message" && + "id" in data && + "time" in data && + "message" in data; + if (!relevantAndValid) { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Unexpected message. Ignoring.`, + ); + return; + } + this.since = data.id; + this.onNotification(this.subscriptionId, data); + } catch (e) { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Error handling message: ${e}`, + ); + } + }; + this.ws.onclose = (event) => { + if (event.wasClean) { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Connection closed cleanly, code=${event.code} reason=${event.reason}`, + ); this.ws = null; - this.retryCount = 0; - this.retryTimeout = null; + } else { + const retrySeconds = + retryBackoffSeconds[ + Math.min(this.retryCount, retryBackoffSeconds.length - 1) + ]; + this.retryCount++; + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Connection died, retrying in ${retrySeconds} seconds`, + ); + this.retryTimeout = setTimeout(() => this.start(), retrySeconds * 1000); + this.onStateChanged(this.subscriptionId, ConnectionState.Connecting); + } + }; + this.ws.onerror = (event) => { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Error occurred: ${event}`, + event, + ); + }; + } + + close() { + console.log( + `[Connection, ${this.shortUrl}, ${this.connectionId}] Closing connection`, + ); + const socket = this.ws; + const retryTimeout = this.retryTimeout; + if (socket !== null) { + socket.close(); } - - start() { - // Don't fetch old messages; we do that as a poll() when adding a subscription; - // we don't want to re-trigger the main view re-render potentially hundreds of times. - - const wsUrl = this.wsUrl(); - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Opening connection to ${wsUrl}`); - - this.ws = new WebSocket(wsUrl); - this.ws.onopen = (event) => { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Connection established`, event); - this.retryCount = 0; - this.onStateChanged(this.subscriptionId, ConnectionState.Connected); - } - this.ws.onmessage = (event) => { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Message received from server: ${event.data}`); - try { - const data = JSON.parse(event.data); - if (data.event === 'open') { - return; - } - const relevantAndValid = - data.event === 'message' && - 'id' in data && - 'time' in data && - 'message' in data; - if (!relevantAndValid) { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Unexpected message. Ignoring.`); - return; - } - this.since = data.id; - this.onNotification(this.subscriptionId, data); - } catch (e) { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Error handling message: ${e}`); - } - }; - this.ws.onclose = (event) => { - if (event.wasClean) { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Connection closed cleanly, code=${event.code} reason=${event.reason}`); - this.ws = null; - } else { - const retrySeconds = retryBackoffSeconds[Math.min(this.retryCount, retryBackoffSeconds.length-1)]; - this.retryCount++; - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Connection died, retrying in ${retrySeconds} seconds`); - this.retryTimeout = setTimeout(() => this.start(), retrySeconds * 1000); - this.onStateChanged(this.subscriptionId, ConnectionState.Connecting); - } - }; - this.ws.onerror = (event) => { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Error occurred: ${event}`, event); - }; + if (retryTimeout !== null) { + clearTimeout(retryTimeout); } + this.retryTimeout = null; + this.ws = null; + } - close() { - console.log(`[Connection, ${this.shortUrl}, ${this.connectionId}] Closing connection`); - const socket = this.ws; - const retryTimeout = this.retryTimeout; - if (socket !== null) { - socket.close(); - } - if (retryTimeout !== null) { - clearTimeout(retryTimeout); - } - this.retryTimeout = null; - this.ws = null; + wsUrl() { + const params = []; + if (this.since) { + params.push(`since=${this.since}`); } - - wsUrl() { - const params = []; - if (this.since) { - params.push(`since=${this.since}`); - } - if (this.user) { - const auth = encodeBase64Url(basicAuth(this.user.username, this.user.password)); - params.push(`auth=${auth}`); - } - const wsUrl = topicUrlWs(this.baseUrl, this.topic); - return (params.length === 0) ? wsUrl : `${wsUrl}?${params.join('&')}`; + if (this.user) { + const auth = encodeBase64Url( + basicAuth(this.user.username, this.user.password), + ); + params.push(`auth=${auth}`); } + const wsUrl = topicUrlWs(this.baseUrl, this.topic); + return params.length === 0 ? wsUrl : `${wsUrl}?${params.join("&")}`; + } } export class ConnectionState { - static Connected = "connected"; - static Connecting = "connecting"; + static Connected = "connected"; + static Connecting = "connecting"; } export default Connection; diff --git a/web/src/app/ConnectionManager.js b/web/src/app/ConnectionManager.js index 565cfe9b..84f84241 100644 --- a/web/src/app/ConnectionManager.js +++ b/web/src/app/ConnectionManager.js @@ -1,5 +1,5 @@ import Connection from "./Connection"; -import {hashCode} from "./utils"; +import { hashCode } from "./utils"; /** * The connection manager keeps track of active connections (WebSocket connections, see Connection). @@ -8,110 +8,126 @@ import {hashCode} from "./utils"; * as required. This is done pretty much exactly the same way as in the Android app. */ class ConnectionManager { - constructor() { - this.connections = new Map(); // ConnectionId -> Connection (hash, see below) - this.stateListener = null; // Fired when connection state changes - this.notificationListener = null; // Fired when new notifications arrive + constructor() { + this.connections = new Map(); // ConnectionId -> Connection (hash, see below) + this.stateListener = null; // Fired when connection state changes + this.notificationListener = null; // Fired when new notifications arrive + } + + registerStateListener(listener) { + this.stateListener = listener; + } + + resetStateListener() { + this.stateListener = null; + } + + registerNotificationListener(listener) { + this.notificationListener = listener; + } + + resetNotificationListener() { + this.notificationListener = null; + } + + /** + * This function figures out which websocket connections should be running by comparing the + * current state of the world (connections) with the target state (targetIds). + * + * It uses a "connectionId", which is sha256($subscriptionId|$username|$password) to identify + * connections. If any of them change, the connection is closed/replaced. + */ + async refresh(subscriptions, users) { + if (!subscriptions || !users) { + return; } + console.log(`[ConnectionManager] Refreshing connections`); + const subscriptionsWithUsersAndConnectionId = await Promise.all( + subscriptions.map(async (s) => { + const [user] = users.filter((u) => u.baseUrl === s.baseUrl); + const connectionId = await makeConnectionId(s, user); + return { ...s, user, connectionId }; + }), + ); + const targetIds = subscriptionsWithUsersAndConnectionId.map( + (s) => s.connectionId, + ); + const deletedIds = Array.from(this.connections.keys()).filter( + (id) => !targetIds.includes(id), + ); - registerStateListener(listener) { - this.stateListener = listener; + // Create and add new connections + subscriptionsWithUsersAndConnectionId.forEach((subscription) => { + const subscriptionId = subscription.id; + const connectionId = subscription.connectionId; + const added = !this.connections.get(connectionId); + if (added) { + const baseUrl = subscription.baseUrl; + const topic = subscription.topic; + const user = subscription.user; + const since = subscription.last; + const connection = new Connection( + connectionId, + subscriptionId, + baseUrl, + topic, + user, + since, + (subscriptionId, notification) => + this.notificationReceived(subscriptionId, notification), + (subscriptionId, state) => this.stateChanged(subscriptionId, state), + ); + this.connections.set(connectionId, connection); + console.log( + `[ConnectionManager] Starting new connection ${connectionId} (subscription ${subscriptionId} with user ${ + user ? user.username : "anonymous" + })`, + ); + connection.start(); + } + }); + + // Delete old connections + deletedIds.forEach((id) => { + console.log(`[ConnectionManager] Closing connection ${id}`); + const connection = this.connections.get(id); + this.connections.delete(id); + connection.close(); + }); + } + + stateChanged(subscriptionId, state) { + if (this.stateListener) { + try { + this.stateListener(subscriptionId, state); + } catch (e) { + console.error( + `[ConnectionManager] Error updating state of ${subscriptionId} to ${state}`, + e, + ); + } } + } - resetStateListener() { - this.stateListener = null; - } - - registerNotificationListener(listener) { - this.notificationListener = listener; - } - - resetNotificationListener() { - this.notificationListener = null; - } - - /** - * This function figures out which websocket connections should be running by comparing the - * current state of the world (connections) with the target state (targetIds). - * - * It uses a "connectionId", which is sha256($subscriptionId|$username|$password) to identify - * connections. If any of them change, the connection is closed/replaced. - */ - async refresh(subscriptions, users) { - if (!subscriptions || !users) { - return; - } - console.log(`[ConnectionManager] Refreshing connections`); - const subscriptionsWithUsersAndConnectionId = await Promise.all(subscriptions - .map(async s => { - const [user] = users.filter(u => u.baseUrl === s.baseUrl); - const connectionId = await makeConnectionId(s, user); - return {...s, user, connectionId}; - })); - const targetIds = subscriptionsWithUsersAndConnectionId.map(s => s.connectionId); - const deletedIds = Array.from(this.connections.keys()).filter(id => !targetIds.includes(id)); - - // Create and add new connections - subscriptionsWithUsersAndConnectionId.forEach(subscription => { - const subscriptionId = subscription.id; - const connectionId = subscription.connectionId; - const added = !this.connections.get(connectionId) - if (added) { - const baseUrl = subscription.baseUrl; - const topic = subscription.topic; - const user = subscription.user; - const since = subscription.last; - const connection = new Connection( - connectionId, - subscriptionId, - baseUrl, - topic, - user, - since, - (subscriptionId, notification) => this.notificationReceived(subscriptionId, notification), - (subscriptionId, state) => this.stateChanged(subscriptionId, state) - ); - this.connections.set(connectionId, connection); - console.log(`[ConnectionManager] Starting new connection ${connectionId} (subscription ${subscriptionId} with user ${user ? user.username : "anonymous"})`); - connection.start(); - } - }); - - // Delete old connections - deletedIds.forEach(id => { - console.log(`[ConnectionManager] Closing connection ${id}`); - const connection = this.connections.get(id); - this.connections.delete(id); - connection.close(); - }); - } - - stateChanged(subscriptionId, state) { - if (this.stateListener) { - try { - this.stateListener(subscriptionId, state); - } catch (e) { - console.error(`[ConnectionManager] Error updating state of ${subscriptionId} to ${state}`, e); - } - } - } - - notificationReceived(subscriptionId, notification) { - if (this.notificationListener) { - try { - this.notificationListener(subscriptionId, notification); - } catch (e) { - console.error(`[ConnectionManager] Error handling notification for ${subscriptionId}`, e); - } - } + notificationReceived(subscriptionId, notification) { + if (this.notificationListener) { + try { + this.notificationListener(subscriptionId, notification); + } catch (e) { + console.error( + `[ConnectionManager] Error handling notification for ${subscriptionId}`, + e, + ); + } } + } } const makeConnectionId = async (subscription, user) => { - return (user) - ? hashCode(`${subscription.id}|${user.username}|${user.password}`) - : hashCode(`${subscription.id}`); -} + return user + ? hashCode(`${subscription.id}|${user.username}|${user.password}`) + : hashCode(`${subscription.id}`); +}; const connectionManager = new ConnectionManager(); export default connectionManager; diff --git a/web/src/app/Notifier.js b/web/src/app/Notifier.js index 613340cb..45c3aa0c 100644 --- a/web/src/app/Notifier.js +++ b/web/src/app/Notifier.js @@ -1,4 +1,11 @@ -import {formatMessage, formatTitleWithDefault, openUrl, playSound, topicDisplayName, topicShortUrl} from "./utils"; +import { + formatMessage, + formatTitleWithDefault, + openUrl, + playSound, + topicDisplayName, + topicShortUrl, +} from "./utils"; import prefs from "./Prefs"; import subscriptionManager from "./SubscriptionManager"; import logo from "../img/ntfy.png"; @@ -8,89 +15,93 @@ import logo from "../img/ntfy.png"; * support this; most importantly, all iOS browsers do not support window.Notification. */ class Notifier { - async notify(subscriptionId, notification, onClickFallback) { - if (!this.supported()) { - return; - } - const subscription = await subscriptionManager.get(subscriptionId); - const shouldNotify = await this.shouldNotify(subscription, notification); - if (!shouldNotify) { - return; - } - const shortUrl = topicShortUrl(subscription.baseUrl, subscription.topic); - const displayName = topicDisplayName(subscription); - const message = formatMessage(notification); - const title = formatTitleWithDefault(notification, displayName); + async notify(subscriptionId, notification, onClickFallback) { + if (!this.supported()) { + return; + } + const subscription = await subscriptionManager.get(subscriptionId); + const shouldNotify = await this.shouldNotify(subscription, notification); + if (!shouldNotify) { + return; + } + const shortUrl = topicShortUrl(subscription.baseUrl, subscription.topic); + const displayName = topicDisplayName(subscription); + const message = formatMessage(notification); + const title = formatTitleWithDefault(notification, displayName); - // Show notification - console.log(`[Notifier, ${shortUrl}] Displaying notification ${notification.id}: ${message}`); - const n = new Notification(title, { - body: message, - icon: logo - }); - if (notification.click) { - n.onclick = (e) => openUrl(notification.click); - } else { - n.onclick = () => onClickFallback(subscription); - } - - // Play sound - const sound = await prefs.sound(); - if (sound && sound !== "none") { - try { - await playSound(sound); - } catch (e) { - console.log(`[Notifier, ${shortUrl}] Error playing audio`, e); - } - } + // Show notification + console.log( + `[Notifier, ${shortUrl}] Displaying notification ${notification.id}: ${message}`, + ); + const n = new Notification(title, { + body: message, + icon: logo, + }); + if (notification.click) { + n.onclick = (e) => openUrl(notification.click); + } else { + n.onclick = () => onClickFallback(subscription); } - granted() { - return this.supported() && Notification.permission === 'granted'; + // Play sound + const sound = await prefs.sound(); + if (sound && sound !== "none") { + try { + await playSound(sound); + } catch (e) { + console.log(`[Notifier, ${shortUrl}] Error playing audio`, e); + } } + } - maybeRequestPermission(cb) { - if (!this.supported()) { - cb(false); - return; - } - if (!this.granted()) { - Notification.requestPermission().then((permission) => { - const granted = permission === 'granted'; - cb(granted); - }); - } - } + granted() { + return this.supported() && Notification.permission === "granted"; + } - async shouldNotify(subscription, notification) { - if (subscription.mutedUntil === 1) { - return false; - } - const priority = (notification.priority) ? notification.priority : 3; - const minPriority = await prefs.minPriority(); - if (priority < minPriority) { - return false; - } - return true; + maybeRequestPermission(cb) { + if (!this.supported()) { + cb(false); + return; } + if (!this.granted()) { + Notification.requestPermission().then((permission) => { + const granted = permission === "granted"; + cb(granted); + }); + } + } - supported() { - return this.browserSupported() && this.contextSupported(); + async shouldNotify(subscription, notification) { + if (subscription.mutedUntil === 1) { + return false; } + const priority = notification.priority ? notification.priority : 3; + const minPriority = await prefs.minPriority(); + if (priority < minPriority) { + return false; + } + return true; + } - browserSupported() { - return 'Notification' in window; - } + supported() { + return this.browserSupported() && this.contextSupported(); + } - /** - * Returns true if this is a HTTPS site, or served over localhost. Otherwise the Notification API - * is not supported, see https://developer.mozilla.org/en-US/docs/Web/API/notification - */ - contextSupported() { - return location.protocol === 'https:' - || location.hostname.match('^127.') - || location.hostname === 'localhost'; - } + browserSupported() { + return "Notification" in window; + } + + /** + * Returns true if this is a HTTPS site, or served over localhost. Otherwise the Notification API + * is not supported, see https://developer.mozilla.org/en-US/docs/Web/API/notification + */ + contextSupported() { + return ( + location.protocol === "https:" || + location.hostname.match("^127.") || + location.hostname === "localhost" + ); + } } const notifier = new Notifier(); diff --git a/web/src/app/Poller.js b/web/src/app/Poller.js index ec284eaf..d1ac924b 100644 --- a/web/src/app/Poller.js +++ b/web/src/app/Poller.js @@ -5,54 +5,60 @@ const delayMillis = 8000; // 8 seconds const intervalMillis = 300000; // 5 minutes class Poller { - constructor() { - this.timer = null; - } + constructor() { + this.timer = null; + } - startWorker() { - if (this.timer !== null) { - return; - } - console.log(`[Poller] Starting worker`); - this.timer = setInterval(() => this.pollAll(), intervalMillis); - setTimeout(() => this.pollAll(), delayMillis); + startWorker() { + if (this.timer !== null) { + return; } + console.log(`[Poller] Starting worker`); + this.timer = setInterval(() => this.pollAll(), intervalMillis); + setTimeout(() => this.pollAll(), delayMillis); + } - async pollAll() { - console.log(`[Poller] Polling all subscriptions`); - const subscriptions = await subscriptionManager.all(); - for (const s of subscriptions) { - try { - await this.poll(s); - } catch (e) { - console.log(`[Poller] Error polling ${s.id}`, e); - } - } + async pollAll() { + console.log(`[Poller] Polling all subscriptions`); + const subscriptions = await subscriptionManager.all(); + for (const s of subscriptions) { + try { + await this.poll(s); + } catch (e) { + console.log(`[Poller] Error polling ${s.id}`, e); + } } + } - async poll(subscription) { - console.log(`[Poller] Polling ${subscription.id}`); + async poll(subscription) { + console.log(`[Poller] Polling ${subscription.id}`); - const since = subscription.last; - const notifications = await api.poll(subscription.baseUrl, subscription.topic, since); - if (!notifications || notifications.length === 0) { - console.log(`[Poller] No new notifications found for ${subscription.id}`); - return; - } - console.log(`[Poller] Adding ${notifications.length} notification(s) for ${subscription.id}`); - await subscriptionManager.addNotifications(subscription.id, notifications); + const since = subscription.last; + const notifications = await api.poll( + subscription.baseUrl, + subscription.topic, + since, + ); + if (!notifications || notifications.length === 0) { + console.log(`[Poller] No new notifications found for ${subscription.id}`); + return; } + console.log( + `[Poller] Adding ${notifications.length} notification(s) for ${subscription.id}`, + ); + await subscriptionManager.addNotifications(subscription.id, notifications); + } - pollInBackground(subscription) { - const fn = async () => { - try { - await this.poll(subscription); - } catch (e) { - console.error(`[App] Error polling subscription ${subscription.id}`, e); - } - }; - setTimeout(() => fn(), 0); - } + pollInBackground(subscription) { + const fn = async () => { + try { + await this.poll(subscription); + } catch (e) { + console.error(`[App] Error polling subscription ${subscription.id}`, e); + } + }; + setTimeout(() => fn(), 0); + } } const poller = new Poller(); diff --git a/web/src/app/Prefs.js b/web/src/app/Prefs.js index b444c6f8..8adc5088 100644 --- a/web/src/app/Prefs.js +++ b/web/src/app/Prefs.js @@ -1,32 +1,32 @@ import db from "./db"; class Prefs { - async setSound(sound) { - db.prefs.put({key: 'sound', value: sound.toString()}); - } + async setSound(sound) { + db.prefs.put({ key: "sound", value: sound.toString() }); + } - async sound() { - const sound = await db.prefs.get('sound'); - return (sound) ? sound.value : "ding"; - } + async sound() { + const sound = await db.prefs.get("sound"); + return sound ? sound.value : "ding"; + } - async setMinPriority(minPriority) { - db.prefs.put({key: 'minPriority', value: minPriority.toString()}); - } + async setMinPriority(minPriority) { + db.prefs.put({ key: "minPriority", value: minPriority.toString() }); + } - async minPriority() { - const minPriority = await db.prefs.get('minPriority'); - return (minPriority) ? Number(minPriority.value) : 1; - } + async minPriority() { + const minPriority = await db.prefs.get("minPriority"); + return minPriority ? Number(minPriority.value) : 1; + } - async setDeleteAfter(deleteAfter) { - db.prefs.put({key:'deleteAfter', value: deleteAfter.toString()}); - } + async setDeleteAfter(deleteAfter) { + db.prefs.put({ key: "deleteAfter", value: deleteAfter.toString() }); + } - async deleteAfter() { - const deleteAfter = await db.prefs.get('deleteAfter'); - return (deleteAfter) ? Number(deleteAfter.value) : 604800; // Default is one week - } + async deleteAfter() { + const deleteAfter = await db.prefs.get("deleteAfter"); + return deleteAfter ? Number(deleteAfter.value) : 604800; // Default is one week + } } const prefs = new Prefs(); diff --git a/web/src/app/Pruner.js b/web/src/app/Pruner.js index 45948057..f7c28f89 100644 --- a/web/src/app/Pruner.js +++ b/web/src/app/Pruner.js @@ -5,33 +5,36 @@ const delayMillis = 25000; // 25 seconds const intervalMillis = 1800000; // 30 minutes class Pruner { - constructor() { - this.timer = null; - } + constructor() { + this.timer = null; + } - startWorker() { - if (this.timer !== null) { - return; - } - console.log(`[Pruner] Starting worker`); - this.timer = setInterval(() => this.prune(), intervalMillis); - setTimeout(() => this.prune(), delayMillis); + startWorker() { + if (this.timer !== null) { + return; } + console.log(`[Pruner] Starting worker`); + this.timer = setInterval(() => this.prune(), intervalMillis); + setTimeout(() => this.prune(), delayMillis); + } - async prune() { - const deleteAfterSeconds = await prefs.deleteAfter(); - const pruneThresholdTimestamp = Math.round(Date.now()/1000) - deleteAfterSeconds; - if (deleteAfterSeconds === 0) { - console.log(`[Pruner] Pruning is disabled. Skipping.`); - return; - } - console.log(`[Pruner] Pruning notifications older than ${deleteAfterSeconds}s (timestamp ${pruneThresholdTimestamp})`); - try { - await subscriptionManager.pruneNotifications(pruneThresholdTimestamp); - } catch (e) { - console.log(`[Pruner] Error pruning old subscriptions`, e); - } + async prune() { + const deleteAfterSeconds = await prefs.deleteAfter(); + const pruneThresholdTimestamp = + Math.round(Date.now() / 1000) - deleteAfterSeconds; + if (deleteAfterSeconds === 0) { + console.log(`[Pruner] Pruning is disabled. Skipping.`); + return; } + console.log( + `[Pruner] Pruning notifications older than ${deleteAfterSeconds}s (timestamp ${pruneThresholdTimestamp})`, + ); + try { + await subscriptionManager.pruneNotifications(pruneThresholdTimestamp); + } catch (e) { + console.log(`[Pruner] Error pruning old subscriptions`, e); + } + } } const pruner = new Pruner(); diff --git a/web/src/app/SubscriptionManager.js b/web/src/app/SubscriptionManager.js index f6573489..c2627625 100644 --- a/web/src/app/SubscriptionManager.js +++ b/web/src/app/SubscriptionManager.js @@ -1,149 +1,144 @@ import db from "./db"; -import {topicUrl} from "./utils"; +import { topicUrl } from "./utils"; class SubscriptionManager { - /** All subscriptions, including "new count"; this is a JOIN, see https://dexie.org/docs/API-Reference#joining */ - async all() { - const subscriptions = await db.subscriptions.toArray(); - await Promise.all(subscriptions.map(async s => { - s.new = await db.notifications - .where({ subscriptionId: s.id, new: 1 }) - .count(); - })); - return subscriptions; - } + /** All subscriptions, including "new count"; this is a JOIN, see https://dexie.org/docs/API-Reference#joining */ + async all() { + const subscriptions = await db.subscriptions.toArray(); + await Promise.all( + subscriptions.map(async (s) => { + s.new = await db.notifications + .where({ subscriptionId: s.id, new: 1 }) + .count(); + }), + ); + return subscriptions; + } - async get(subscriptionId) { - return await db.subscriptions.get(subscriptionId) - } + async get(subscriptionId) { + return await db.subscriptions.get(subscriptionId); + } - async add(baseUrl, topic) { - const subscription = { - id: topicUrl(baseUrl, topic), - baseUrl: baseUrl, - topic: topic, - mutedUntil: 0, - last: null - }; - await db.subscriptions.put(subscription); - return subscription; - } + async add(baseUrl, topic) { + const subscription = { + id: topicUrl(baseUrl, topic), + baseUrl: baseUrl, + topic: topic, + mutedUntil: 0, + last: null, + }; + await db.subscriptions.put(subscription); + return subscription; + } - async updateState(subscriptionId, state) { - db.subscriptions.update(subscriptionId, { state: state }); - } + async updateState(subscriptionId, state) { + db.subscriptions.update(subscriptionId, { state: state }); + } - async remove(subscriptionId) { - await db.subscriptions.delete(subscriptionId); - await db.notifications - .where({subscriptionId: subscriptionId}) - .delete(); - } + async remove(subscriptionId) { + await db.subscriptions.delete(subscriptionId); + await db.notifications.where({ subscriptionId: subscriptionId }).delete(); + } - async first() { - return db.subscriptions.toCollection().first(); // May be undefined - } + async first() { + return db.subscriptions.toCollection().first(); // May be undefined + } - async getNotifications(subscriptionId) { - // This is quite awkward, but it is the recommended approach as per the Dexie docs. - // It's actually fine, because the reading and filtering is quite fast. The rendering is what's - // killing performance. See https://dexie.org/docs/Collection/Collection.offset()#a-better-paging-approach + async getNotifications(subscriptionId) { + // This is quite awkward, but it is the recommended approach as per the Dexie docs. + // It's actually fine, because the reading and filtering is quite fast. The rendering is what's + // killing performance. See https://dexie.org/docs/Collection/Collection.offset()#a-better-paging-approach - return db.notifications - .orderBy("time") // Sort by time first - .filter(n => n.subscriptionId === subscriptionId) - .reverse() - .toArray(); - } + return db.notifications + .orderBy("time") // Sort by time first + .filter((n) => n.subscriptionId === subscriptionId) + .reverse() + .toArray(); + } - async getAllNotifications() { - return db.notifications - .orderBy("time") // Efficient, see docs - .reverse() - .toArray(); - } + async getAllNotifications() { + return db.notifications + .orderBy("time") // Efficient, see docs + .reverse() + .toArray(); + } - /** Adds notification, or returns false if it already exists */ - async addNotification(subscriptionId, notification) { - const exists = await db.notifications.get(notification.id); - if (exists) { - return false; - } - try { - notification.new = 1; // New marker (used for bubble indicator); cannot be boolean; Dexie index limitation - await db.notifications.add({ ...notification, subscriptionId }); // FIXME consider put() for double tab - await db.subscriptions.update(subscriptionId, { - last: notification.id - }); - } catch (e) { - console.error(`[SubscriptionManager] Error adding notification`, e); - } - return true; + /** Adds notification, or returns false if it already exists */ + async addNotification(subscriptionId, notification) { + const exists = await db.notifications.get(notification.id); + if (exists) { + return false; } + try { + notification.new = 1; // New marker (used for bubble indicator); cannot be boolean; Dexie index limitation + await db.notifications.add({ ...notification, subscriptionId }); // FIXME consider put() for double tab + await db.subscriptions.update(subscriptionId, { + last: notification.id, + }); + } catch (e) { + console.error(`[SubscriptionManager] Error adding notification`, e); + } + return true; + } - /** Adds/replaces notifications, will not throw if they exist */ - async addNotifications(subscriptionId, notifications) { - const notificationsWithSubscriptionId = notifications - .map(notification => ({ ...notification, subscriptionId })); - const lastNotificationId = notifications.at(-1).id; - await db.notifications.bulkPut(notificationsWithSubscriptionId); - await db.subscriptions.update(subscriptionId, { - last: lastNotificationId - }); - } + /** Adds/replaces notifications, will not throw if they exist */ + async addNotifications(subscriptionId, notifications) { + const notificationsWithSubscriptionId = notifications.map( + (notification) => ({ ...notification, subscriptionId }), + ); + const lastNotificationId = notifications.at(-1).id; + await db.notifications.bulkPut(notificationsWithSubscriptionId); + await db.subscriptions.update(subscriptionId, { + last: lastNotificationId, + }); + } - async updateNotification(notification) { - const exists = await db.notifications.get(notification.id); - if (!exists) { - return false; - } - try { - await db.notifications.put({ ...notification }); - } catch (e) { - console.error(`[SubscriptionManager] Error updating notification`, e); - } - return true; + async updateNotification(notification) { + const exists = await db.notifications.get(notification.id); + if (!exists) { + return false; } + try { + await db.notifications.put({ ...notification }); + } catch (e) { + console.error(`[SubscriptionManager] Error updating notification`, e); + } + return true; + } - async deleteNotification(notificationId) { - await db.notifications.delete(notificationId); - } + async deleteNotification(notificationId) { + await db.notifications.delete(notificationId); + } - async deleteNotifications(subscriptionId) { - await db.notifications - .where({subscriptionId: subscriptionId}) - .delete(); - } + async deleteNotifications(subscriptionId) { + await db.notifications.where({ subscriptionId: subscriptionId }).delete(); + } - async markNotificationRead(notificationId) { - await db.notifications - .where({id: notificationId}) - .modify({new: 0}); - } + async markNotificationRead(notificationId) { + await db.notifications.where({ id: notificationId }).modify({ new: 0 }); + } - async markNotificationsRead(subscriptionId) { - await db.notifications - .where({subscriptionId: subscriptionId, new: 1}) - .modify({new: 0}); - } + async markNotificationsRead(subscriptionId) { + await db.notifications + .where({ subscriptionId: subscriptionId, new: 1 }) + .modify({ new: 0 }); + } - async setMutedUntil(subscriptionId, mutedUntil) { - await db.subscriptions.update(subscriptionId, { - mutedUntil: mutedUntil - }); - } + async setMutedUntil(subscriptionId, mutedUntil) { + await db.subscriptions.update(subscriptionId, { + mutedUntil: mutedUntil, + }); + } - async setDisplayName(subscriptionId, displayName) { - await db.subscriptions.update(subscriptionId, { - displayName: displayName - }); - } + async setDisplayName(subscriptionId, displayName) { + await db.subscriptions.update(subscriptionId, { + displayName: displayName, + }); + } - async pruneNotifications(thresholdTimestamp) { - await db.notifications - .where("time").below(thresholdTimestamp) - .delete(); - } + async pruneNotifications(thresholdTimestamp) { + await db.notifications.where("time").below(thresholdTimestamp).delete(); + } } const subscriptionManager = new SubscriptionManager(); diff --git a/web/src/app/UserManager.js b/web/src/app/UserManager.js index 25ad41e3..47ebcdf1 100644 --- a/web/src/app/UserManager.js +++ b/web/src/app/UserManager.js @@ -1,21 +1,21 @@ import db from "./db"; class UserManager { - async all() { - return db.users.toArray(); - } + async all() { + return db.users.toArray(); + } - async get(baseUrl) { - return db.users.get(baseUrl); - } + async get(baseUrl) { + return db.users.get(baseUrl); + } - async save(user) { - await db.users.put(user); - } + async save(user) { + await db.users.put(user); + } - async delete(baseUrl) { - await db.users.delete(baseUrl); - } + async delete(baseUrl) { + await db.users.delete(baseUrl); + } } const userManager = new UserManager(); diff --git a/web/src/app/db.js b/web/src/app/db.js index 7c82be31..3a094a67 100644 --- a/web/src/app/db.js +++ b/web/src/app/db.js @@ -1,4 +1,4 @@ -import Dexie from 'dexie'; +import Dexie from "dexie"; // Uses Dexie.js // https://dexie.org/docs/API-Reference#quick-reference @@ -6,13 +6,13 @@ import Dexie from 'dexie'; // Notes: // - As per docs, we only declare the indexable columns, not all columns -const db = new Dexie('ntfy'); +const db = new Dexie("ntfy"); db.version(1).stores({ - subscriptions: '&id,baseUrl', - notifications: '&id,subscriptionId,time,new,[subscriptionId+new]', // compound key for query performance - users: '&baseUrl,username', - prefs: '&key' + subscriptions: "&id,baseUrl", + notifications: "&id,subscriptionId,time,new,[subscriptionId+new]", // compound key for query performance + users: "&baseUrl,username", + prefs: "&key", }); export default db; diff --git a/web/src/app/emojis.js b/web/src/app/emojis.js index f6dac7b1..b7912c35 100644 --- a/web/src/app/emojis.js +++ b/web/src/app/emojis.js @@ -1,3 +1,14500 @@ // This file is generated by scripts/emoji-convert.sh to reduce the size // Original data source: https://github.com/github/gemoji/blob/master/db/emoji.json -export const rawEmojis = [{"emoji":"😀","aliases":["grinning"],"tags":["smile","happy"],"category":"Smileys & Emotion","description":"grinning face","unicode_version":"6.1"},{"emoji":"😃","aliases":["smiley"],"tags":["happy","joy","haha"],"category":"Smileys & Emotion","description":"grinning face with big eyes","unicode_version":"6.0"},{"emoji":"😄","aliases":["smile"],"tags":["happy","joy","laugh","pleased"],"category":"Smileys & Emotion","description":"grinning face with smiling eyes","unicode_version":"6.0"},{"emoji":"😁","aliases":["grin"],"tags":[],"category":"Smileys & Emotion","description":"beaming face with smiling eyes","unicode_version":"6.0"},{"emoji":"😆","aliases":["laughing","satisfied"],"tags":["happy","haha"],"category":"Smileys & Emotion","description":"grinning squinting face","unicode_version":"6.0"},{"emoji":"😅","aliases":["sweat_smile"],"tags":["hot"],"category":"Smileys & Emotion","description":"grinning face with sweat","unicode_version":"6.0"},{"emoji":"🤣","aliases":["rofl"],"tags":["lol","laughing"],"category":"Smileys & Emotion","description":"rolling on the floor laughing","unicode_version":"9.0"},{"emoji":"😂","aliases":["joy"],"tags":["tears"],"category":"Smileys & Emotion","description":"face with tears of joy","unicode_version":"6.0"},{"emoji":"🙂","aliases":["slightly_smiling_face"],"tags":[],"category":"Smileys & Emotion","description":"slightly smiling face","unicode_version":"7.0"},{"emoji":"🙃","aliases":["upside_down_face"],"tags":[],"category":"Smileys & Emotion","description":"upside-down face","unicode_version":"8.0"},{"emoji":"😉","aliases":["wink"],"tags":["flirt"],"category":"Smileys & Emotion","description":"winking face","unicode_version":"6.0"},{"emoji":"😊","aliases":["blush"],"tags":["proud"],"category":"Smileys & Emotion","description":"smiling face with smiling eyes","unicode_version":"6.0"},{"emoji":"😇","aliases":["innocent"],"tags":["angel"],"category":"Smileys & Emotion","description":"smiling face with halo","unicode_version":"6.0"},{"emoji":"🥰","aliases":["smiling_face_with_three_hearts"],"tags":["love"],"category":"Smileys & Emotion","description":"smiling face with hearts","unicode_version":"11.0"},{"emoji":"😍","aliases":["heart_eyes"],"tags":["love","crush"],"category":"Smileys & Emotion","description":"smiling face with heart-eyes","unicode_version":"6.0"},{"emoji":"🤩","aliases":["star_struck"],"tags":["eyes"],"category":"Smileys & Emotion","description":"star-struck","unicode_version":"11.0"},{"emoji":"😘","aliases":["kissing_heart"],"tags":["flirt"],"category":"Smileys & Emotion","description":"face blowing a kiss","unicode_version":"6.0"},{"emoji":"😗","aliases":["kissing"],"tags":[],"category":"Smileys & Emotion","description":"kissing face","unicode_version":"6.1"},{"emoji":"☺️","aliases":["relaxed"],"tags":["blush","pleased"],"category":"Smileys & Emotion","description":"smiling face","unicode_version":""},{"emoji":"😚","aliases":["kissing_closed_eyes"],"tags":[],"category":"Smileys & Emotion","description":"kissing face with closed eyes","unicode_version":"6.0"},{"emoji":"😙","aliases":["kissing_smiling_eyes"],"tags":[],"category":"Smileys & Emotion","description":"kissing face with smiling eyes","unicode_version":"6.1"},{"emoji":"🥲","aliases":["smiling_face_with_tear"],"tags":[],"category":"Smileys & Emotion","description":"smiling face with tear","unicode_version":"13.0"},{"emoji":"😋","aliases":["yum"],"tags":["tongue","lick"],"category":"Smileys & Emotion","description":"face savoring food","unicode_version":"6.0"},{"emoji":"😛","aliases":["stuck_out_tongue"],"tags":[],"category":"Smileys & Emotion","description":"face with tongue","unicode_version":"6.1"},{"emoji":"😜","aliases":["stuck_out_tongue_winking_eye"],"tags":["prank","silly"],"category":"Smileys & Emotion","description":"winking face with tongue","unicode_version":"6.0"},{"emoji":"🤪","aliases":["zany_face"],"tags":["goofy","wacky"],"category":"Smileys & Emotion","description":"zany face","unicode_version":"11.0"},{"emoji":"😝","aliases":["stuck_out_tongue_closed_eyes"],"tags":["prank"],"category":"Smileys & Emotion","description":"squinting face with tongue","unicode_version":"6.0"},{"emoji":"🤑","aliases":["money_mouth_face"],"tags":["rich"],"category":"Smileys & Emotion","description":"money-mouth face","unicode_version":"8.0"},{"emoji":"🤗","aliases":["hugs"],"tags":[],"category":"Smileys & Emotion","description":"hugging face","unicode_version":"8.0"},{"emoji":"🤭","aliases":["hand_over_mouth"],"tags":["quiet","whoops"],"category":"Smileys & Emotion","description":"face with hand over mouth","unicode_version":"11.0"},{"emoji":"🤫","aliases":["shushing_face"],"tags":["silence","quiet"],"category":"Smileys & Emotion","description":"shushing face","unicode_version":"11.0"},{"emoji":"🤔","aliases":["thinking"],"tags":[],"category":"Smileys & Emotion","description":"thinking face","unicode_version":"8.0"},{"emoji":"🤐","aliases":["zipper_mouth_face"],"tags":["silence","hush"],"category":"Smileys & Emotion","description":"zipper-mouth face","unicode_version":"8.0"},{"emoji":"🤨","aliases":["raised_eyebrow"],"tags":["suspicious"],"category":"Smileys & Emotion","description":"face with raised eyebrow","unicode_version":"11.0"},{"emoji":"😐","aliases":["neutral_face"],"tags":["meh"],"category":"Smileys & Emotion","description":"neutral face","unicode_version":"6.0"},{"emoji":"😑","aliases":["expressionless"],"tags":[],"category":"Smileys & Emotion","description":"expressionless face","unicode_version":"6.1"},{"emoji":"😶","aliases":["no_mouth"],"tags":["mute","silence"],"category":"Smileys & Emotion","description":"face without mouth","unicode_version":"6.0"},{"emoji":"😶‍🌫️","aliases":["face_in_clouds"],"tags":[],"category":"Smileys & Emotion","description":"face in clouds","unicode_version":"13.1"},{"emoji":"😏","aliases":["smirk"],"tags":["smug"],"category":"Smileys & Emotion","description":"smirking face","unicode_version":"6.0"},{"emoji":"😒","aliases":["unamused"],"tags":["meh"],"category":"Smileys & Emotion","description":"unamused face","unicode_version":"6.0"},{"emoji":"🙄","aliases":["roll_eyes"],"tags":[],"category":"Smileys & Emotion","description":"face with rolling eyes","unicode_version":"8.0"},{"emoji":"😬","aliases":["grimacing"],"tags":[],"category":"Smileys & Emotion","description":"grimacing face","unicode_version":"6.1"},{"emoji":"😮‍💨","aliases":["face_exhaling"],"tags":[],"category":"Smileys & Emotion","description":"face exhaling","unicode_version":"13.1"},{"emoji":"🤥","aliases":["lying_face"],"tags":["liar"],"category":"Smileys & Emotion","description":"lying face","unicode_version":"9.0"},{"emoji":"😌","aliases":["relieved"],"tags":["whew"],"category":"Smileys & Emotion","description":"relieved face","unicode_version":"6.0"},{"emoji":"😔","aliases":["pensive"],"tags":[],"category":"Smileys & Emotion","description":"pensive face","unicode_version":"6.0"},{"emoji":"😪","aliases":["sleepy"],"tags":["tired"],"category":"Smileys & Emotion","description":"sleepy face","unicode_version":"6.0"},{"emoji":"🤤","aliases":["drooling_face"],"tags":[],"category":"Smileys & Emotion","description":"drooling face","unicode_version":"9.0"},{"emoji":"😴","aliases":["sleeping"],"tags":["zzz"],"category":"Smileys & Emotion","description":"sleeping face","unicode_version":"6.1"},{"emoji":"😷","aliases":["mask"],"tags":["sick","ill"],"category":"Smileys & Emotion","description":"face with medical mask","unicode_version":"6.0"},{"emoji":"🤒","aliases":["face_with_thermometer"],"tags":["sick"],"category":"Smileys & Emotion","description":"face with thermometer","unicode_version":"8.0"},{"emoji":"🤕","aliases":["face_with_head_bandage"],"tags":["hurt"],"category":"Smileys & Emotion","description":"face with head-bandage","unicode_version":"8.0"},{"emoji":"🤢","aliases":["nauseated_face"],"tags":["sick","barf","disgusted"],"category":"Smileys & Emotion","description":"nauseated face","unicode_version":"9.0"},{"emoji":"🤮","aliases":["vomiting_face"],"tags":["barf","sick"],"category":"Smileys & Emotion","description":"face vomiting","unicode_version":"11.0"},{"emoji":"🤧","aliases":["sneezing_face"],"tags":["achoo","sick"],"category":"Smileys & Emotion","description":"sneezing face","unicode_version":"9.0"},{"emoji":"🥵","aliases":["hot_face"],"tags":["heat","sweating"],"category":"Smileys & Emotion","description":"hot face","unicode_version":"11.0"},{"emoji":"🥶","aliases":["cold_face"],"tags":["freezing","ice"],"category":"Smileys & Emotion","description":"cold face","unicode_version":"11.0"},{"emoji":"🥴","aliases":["woozy_face"],"tags":["groggy"],"category":"Smileys & Emotion","description":"woozy face","unicode_version":"11.0"},{"emoji":"😵","aliases":["dizzy_face"],"tags":[],"category":"Smileys & Emotion","description":"knocked-out face","unicode_version":"6.0"},{"emoji":"😵‍💫","aliases":["face_with_spiral_eyes"],"tags":[],"category":"Smileys & Emotion","description":"face with spiral eyes","unicode_version":"13.1"},{"emoji":"🤯","aliases":["exploding_head"],"tags":["mind","blown"],"category":"Smileys & Emotion","description":"exploding head","unicode_version":"11.0"},{"emoji":"🤠","aliases":["cowboy_hat_face"],"tags":[],"category":"Smileys & Emotion","description":"cowboy hat face","unicode_version":"9.0"},{"emoji":"🥳","aliases":["partying_face"],"tags":["celebration","birthday"],"category":"Smileys & Emotion","description":"partying face","unicode_version":"11.0"},{"emoji":"🥸","aliases":["disguised_face"],"tags":[],"category":"Smileys & Emotion","description":"disguised face","unicode_version":"13.0"},{"emoji":"😎","aliases":["sunglasses"],"tags":["cool"],"category":"Smileys & Emotion","description":"smiling face with sunglasses","unicode_version":"6.0"},{"emoji":"🤓","aliases":["nerd_face"],"tags":["geek","glasses"],"category":"Smileys & Emotion","description":"nerd face","unicode_version":"8.0"},{"emoji":"🧐","aliases":["monocle_face"],"tags":[],"category":"Smileys & Emotion","description":"face with monocle","unicode_version":"11.0"},{"emoji":"😕","aliases":["confused"],"tags":[],"category":"Smileys & Emotion","description":"confused face","unicode_version":"6.1"},{"emoji":"😟","aliases":["worried"],"tags":["nervous"],"category":"Smileys & Emotion","description":"worried face","unicode_version":"6.1"},{"emoji":"🙁","aliases":["slightly_frowning_face"],"tags":[],"category":"Smileys & Emotion","description":"slightly frowning face","unicode_version":"7.0"},{"emoji":"☹️","aliases":["frowning_face"],"tags":[],"category":"Smileys & Emotion","description":"frowning face","unicode_version":""},{"emoji":"😮","aliases":["open_mouth"],"tags":["surprise","impressed","wow"],"category":"Smileys & Emotion","description":"face with open mouth","unicode_version":"6.1"},{"emoji":"😯","aliases":["hushed"],"tags":["silence","speechless"],"category":"Smileys & Emotion","description":"hushed face","unicode_version":"6.1"},{"emoji":"😲","aliases":["astonished"],"tags":["amazed","gasp"],"category":"Smileys & Emotion","description":"astonished face","unicode_version":"6.0"},{"emoji":"😳","aliases":["flushed"],"tags":[],"category":"Smileys & Emotion","description":"flushed face","unicode_version":"6.0"},{"emoji":"🥺","aliases":["pleading_face"],"tags":["puppy","eyes"],"category":"Smileys & Emotion","description":"pleading face","unicode_version":"11.0"},{"emoji":"😦","aliases":["frowning"],"tags":[],"category":"Smileys & Emotion","description":"frowning face with open mouth","unicode_version":"6.1"},{"emoji":"😧","aliases":["anguished"],"tags":["stunned"],"category":"Smileys & Emotion","description":"anguished face","unicode_version":"6.1"},{"emoji":"😨","aliases":["fearful"],"tags":["scared","shocked","oops"],"category":"Smileys & Emotion","description":"fearful face","unicode_version":"6.0"},{"emoji":"😰","aliases":["cold_sweat"],"tags":["nervous"],"category":"Smileys & Emotion","description":"anxious face with sweat","unicode_version":"6.0"},{"emoji":"😥","aliases":["disappointed_relieved"],"tags":["phew","sweat","nervous"],"category":"Smileys & Emotion","description":"sad but relieved face","unicode_version":"6.0"},{"emoji":"😢","aliases":["cry"],"tags":["sad","tear"],"category":"Smileys & Emotion","description":"crying face","unicode_version":"6.0"},{"emoji":"😭","aliases":["sob"],"tags":["sad","cry","bawling"],"category":"Smileys & Emotion","description":"loudly crying face","unicode_version":"6.0"},{"emoji":"😱","aliases":["scream"],"tags":["horror","shocked"],"category":"Smileys & Emotion","description":"face screaming in fear","unicode_version":"6.0"},{"emoji":"😖","aliases":["confounded"],"tags":[],"category":"Smileys & Emotion","description":"confounded face","unicode_version":"6.0"},{"emoji":"😣","aliases":["persevere"],"tags":["struggling"],"category":"Smileys & Emotion","description":"persevering face","unicode_version":"6.0"},{"emoji":"😞","aliases":["disappointed"],"tags":["sad"],"category":"Smileys & Emotion","description":"disappointed face","unicode_version":"6.0"},{"emoji":"😓","aliases":["sweat"],"tags":[],"category":"Smileys & Emotion","description":"downcast face with sweat","unicode_version":"6.0"},{"emoji":"😩","aliases":["weary"],"tags":["tired"],"category":"Smileys & Emotion","description":"weary face","unicode_version":"6.0"},{"emoji":"😫","aliases":["tired_face"],"tags":["upset","whine"],"category":"Smileys & Emotion","description":"tired face","unicode_version":"6.0"},{"emoji":"🥱","aliases":["yawning_face"],"tags":[],"category":"Smileys & Emotion","description":"yawning face","unicode_version":"12.0"},{"emoji":"😤","aliases":["triumph"],"tags":["smug"],"category":"Smileys & Emotion","description":"face with steam from nose","unicode_version":"6.0"},{"emoji":"😡","aliases":["rage","pout"],"tags":["angry"],"category":"Smileys & Emotion","description":"pouting face","unicode_version":"6.0"},{"emoji":"😠","aliases":["angry"],"tags":["mad","annoyed"],"category":"Smileys & Emotion","description":"angry face","unicode_version":"6.0"},{"emoji":"🤬","aliases":["cursing_face"],"tags":["foul"],"category":"Smileys & Emotion","description":"face with symbols on mouth","unicode_version":"11.0"},{"emoji":"😈","aliases":["smiling_imp"],"tags":["devil","evil","horns"],"category":"Smileys & Emotion","description":"smiling face with horns","unicode_version":"6.0"},{"emoji":"👿","aliases":["imp"],"tags":["angry","devil","evil","horns"],"category":"Smileys & Emotion","description":"angry face with horns","unicode_version":"6.0"},{"emoji":"💀","aliases":["skull"],"tags":["dead","danger","poison"],"category":"Smileys & Emotion","description":"skull","unicode_version":"6.0"},{"emoji":"☠️","aliases":["skull_and_crossbones"],"tags":["danger","pirate"],"category":"Smileys & Emotion","description":"skull and crossbones","unicode_version":""},{"emoji":"💩","aliases":["hankey","poop","shit"],"tags":["crap"],"category":"Smileys & Emotion","description":"pile of poo","unicode_version":"6.0"},{"emoji":"🤡","aliases":["clown_face"],"tags":[],"category":"Smileys & Emotion","description":"clown face","unicode_version":"9.0"},{"emoji":"👹","aliases":["japanese_ogre"],"tags":["monster"],"category":"Smileys & Emotion","description":"ogre","unicode_version":"6.0"},{"emoji":"👺","aliases":["japanese_goblin"],"tags":[],"category":"Smileys & Emotion","description":"goblin","unicode_version":"6.0"},{"emoji":"👻","aliases":["ghost"],"tags":["halloween"],"category":"Smileys & Emotion","description":"ghost","unicode_version":"6.0"},{"emoji":"👽","aliases":["alien"],"tags":["ufo"],"category":"Smileys & Emotion","description":"alien","unicode_version":"6.0"},{"emoji":"👾","aliases":["space_invader"],"tags":["game","retro"],"category":"Smileys & Emotion","description":"alien monster","unicode_version":"6.0"},{"emoji":"🤖","aliases":["robot"],"tags":[],"category":"Smileys & Emotion","description":"robot","unicode_version":"8.0"},{"emoji":"😺","aliases":["smiley_cat"],"tags":[],"category":"Smileys & Emotion","description":"grinning cat","unicode_version":"6.0"},{"emoji":"😸","aliases":["smile_cat"],"tags":[],"category":"Smileys & Emotion","description":"grinning cat with smiling eyes","unicode_version":"6.0"},{"emoji":"😹","aliases":["joy_cat"],"tags":[],"category":"Smileys & Emotion","description":"cat with tears of joy","unicode_version":"6.0"},{"emoji":"😻","aliases":["heart_eyes_cat"],"tags":[],"category":"Smileys & Emotion","description":"smiling cat with heart-eyes","unicode_version":"6.0"},{"emoji":"😼","aliases":["smirk_cat"],"tags":[],"category":"Smileys & Emotion","description":"cat with wry smile","unicode_version":"6.0"},{"emoji":"😽","aliases":["kissing_cat"],"tags":[],"category":"Smileys & Emotion","description":"kissing cat","unicode_version":"6.0"},{"emoji":"🙀","aliases":["scream_cat"],"tags":["horror"],"category":"Smileys & Emotion","description":"weary cat","unicode_version":"6.0"},{"emoji":"😿","aliases":["crying_cat_face"],"tags":["sad","tear"],"category":"Smileys & Emotion","description":"crying cat","unicode_version":"6.0"},{"emoji":"😾","aliases":["pouting_cat"],"tags":[],"category":"Smileys & Emotion","description":"pouting cat","unicode_version":"6.0"},{"emoji":"🙈","aliases":["see_no_evil"],"tags":["monkey","blind","ignore"],"category":"Smileys & Emotion","description":"see-no-evil monkey","unicode_version":"6.0"},{"emoji":"🙉","aliases":["hear_no_evil"],"tags":["monkey","deaf"],"category":"Smileys & Emotion","description":"hear-no-evil monkey","unicode_version":"6.0"},{"emoji":"🙊","aliases":["speak_no_evil"],"tags":["monkey","mute","hush"],"category":"Smileys & Emotion","description":"speak-no-evil monkey","unicode_version":"6.0"},{"emoji":"💋","aliases":["kiss"],"tags":["lipstick"],"category":"Smileys & Emotion","description":"kiss mark","unicode_version":"6.0"},{"emoji":"💌","aliases":["love_letter"],"tags":["email","envelope"],"category":"Smileys & Emotion","description":"love letter","unicode_version":"6.0"},{"emoji":"💘","aliases":["cupid"],"tags":["love","heart"],"category":"Smileys & Emotion","description":"heart with arrow","unicode_version":"6.0"},{"emoji":"💝","aliases":["gift_heart"],"tags":["chocolates"],"category":"Smileys & Emotion","description":"heart with ribbon","unicode_version":"6.0"},{"emoji":"💖","aliases":["sparkling_heart"],"tags":[],"category":"Smileys & Emotion","description":"sparkling heart","unicode_version":"6.0"},{"emoji":"💗","aliases":["heartpulse"],"tags":[],"category":"Smileys & Emotion","description":"growing heart","unicode_version":"6.0"},{"emoji":"💓","aliases":["heartbeat"],"tags":[],"category":"Smileys & Emotion","description":"beating heart","unicode_version":"6.0"},{"emoji":"💞","aliases":["revolving_hearts"],"tags":[],"category":"Smileys & Emotion","description":"revolving hearts","unicode_version":"6.0"},{"emoji":"💕","aliases":["two_hearts"],"tags":[],"category":"Smileys & Emotion","description":"two hearts","unicode_version":"6.0"},{"emoji":"💟","aliases":["heart_decoration"],"tags":[],"category":"Smileys & Emotion","description":"heart decoration","unicode_version":"6.0"},{"emoji":"❣️","aliases":["heavy_heart_exclamation"],"tags":[],"category":"Smileys & Emotion","description":"heart exclamation","unicode_version":""},{"emoji":"💔","aliases":["broken_heart"],"tags":[],"category":"Smileys & Emotion","description":"broken heart","unicode_version":"6.0"},{"emoji":"❤️‍🔥","aliases":["heart_on_fire"],"tags":[],"category":"Smileys & Emotion","description":"heart on fire","unicode_version":"13.1"},{"emoji":"❤️‍🩹","aliases":["mending_heart"],"tags":[],"category":"Smileys & Emotion","description":"mending heart","unicode_version":"13.1"},{"emoji":"❤️","aliases":["heart"],"tags":["love"],"category":"Smileys & Emotion","description":"red heart","unicode_version":""},{"emoji":"🧡","aliases":["orange_heart"],"tags":[],"category":"Smileys & Emotion","description":"orange heart","unicode_version":"11.0"},{"emoji":"💛","aliases":["yellow_heart"],"tags":[],"category":"Smileys & Emotion","description":"yellow heart","unicode_version":"6.0"},{"emoji":"💚","aliases":["green_heart"],"tags":[],"category":"Smileys & Emotion","description":"green heart","unicode_version":"6.0"},{"emoji":"💙","aliases":["blue_heart"],"tags":[],"category":"Smileys & Emotion","description":"blue heart","unicode_version":"6.0"},{"emoji":"💜","aliases":["purple_heart"],"tags":[],"category":"Smileys & Emotion","description":"purple heart","unicode_version":"6.0"},{"emoji":"🤎","aliases":["brown_heart"],"tags":[],"category":"Smileys & Emotion","description":"brown heart","unicode_version":"12.0"},{"emoji":"🖤","aliases":["black_heart"],"tags":[],"category":"Smileys & Emotion","description":"black heart","unicode_version":"9.0"},{"emoji":"🤍","aliases":["white_heart"],"tags":[],"category":"Smileys & Emotion","description":"white heart","unicode_version":"12.0"},{"emoji":"💯","aliases":["100"],"tags":["score","perfect"],"category":"Smileys & Emotion","description":"hundred points","unicode_version":"6.0"},{"emoji":"💢","aliases":["anger"],"tags":["angry"],"category":"Smileys & Emotion","description":"anger symbol","unicode_version":"6.0"},{"emoji":"💥","aliases":["boom","collision"],"tags":["explode"],"category":"Smileys & Emotion","description":"collision","unicode_version":"6.0"},{"emoji":"💫","aliases":["dizzy"],"tags":["star"],"category":"Smileys & Emotion","description":"dizzy","unicode_version":"6.0"},{"emoji":"💦","aliases":["sweat_drops"],"tags":["water","workout"],"category":"Smileys & Emotion","description":"sweat droplets","unicode_version":"6.0"},{"emoji":"💨","aliases":["dash"],"tags":["wind","blow","fast"],"category":"Smileys & Emotion","description":"dashing away","unicode_version":"6.0"},{"emoji":"🕳️","aliases":["hole"],"tags":[],"category":"Smileys & Emotion","description":"hole","unicode_version":"7.0"},{"emoji":"💣","aliases":["bomb"],"tags":["boom"],"category":"Smileys & Emotion","description":"bomb","unicode_version":"6.0"},{"emoji":"💬","aliases":["speech_balloon"],"tags":["comment"],"category":"Smileys & Emotion","description":"speech balloon","unicode_version":"6.0"},{"emoji":"👁️‍🗨️","aliases":["eye_speech_bubble"],"tags":[],"category":"Smileys & Emotion","description":"eye in speech bubble","unicode_version":"11.0"},{"emoji":"🗨️","aliases":["left_speech_bubble"],"tags":[],"category":"Smileys & Emotion","description":"left speech bubble","unicode_version":"11.0"},{"emoji":"🗯️","aliases":["right_anger_bubble"],"tags":[],"category":"Smileys & Emotion","description":"right anger bubble","unicode_version":"7.0"},{"emoji":"💭","aliases":["thought_balloon"],"tags":["thinking"],"category":"Smileys & Emotion","description":"thought balloon","unicode_version":"6.0"},{"emoji":"💤","aliases":["zzz"],"tags":["sleeping"],"category":"Smileys & Emotion","description":"zzz","unicode_version":"6.0"},{"emoji":"👋","aliases":["wave"],"tags":["goodbye"],"category":"People & Body","description":"waving hand","unicode_version":"6.0"},{"emoji":"🤚","aliases":["raised_back_of_hand"],"tags":[],"category":"People & Body","description":"raised back of hand","unicode_version":"9.0"},{"emoji":"🖐️","aliases":["raised_hand_with_fingers_splayed"],"tags":[],"category":"People & Body","description":"hand with fingers splayed","unicode_version":"7.0"},{"emoji":"✋","aliases":["hand","raised_hand"],"tags":["highfive","stop"],"category":"People & Body","description":"raised hand","unicode_version":"6.0"},{"emoji":"🖖","aliases":["vulcan_salute"],"tags":["prosper","spock"],"category":"People & Body","description":"vulcan salute","unicode_version":"7.0"},{"emoji":"👌","aliases":["ok_hand"],"tags":[],"category":"People & Body","description":"OK hand","unicode_version":"6.0"},{"emoji":"🤌","aliases":["pinched_fingers"],"tags":[],"category":"People & Body","description":"pinched fingers","unicode_version":"13.0"},{"emoji":"🤏","aliases":["pinching_hand"],"tags":[],"category":"People & Body","description":"pinching hand","unicode_version":"12.0"},{"emoji":"✌️","aliases":["v"],"tags":["victory","peace"],"category":"People & Body","description":"victory hand","unicode_version":""},{"emoji":"🤞","aliases":["crossed_fingers"],"tags":["luck","hopeful"],"category":"People & Body","description":"crossed fingers","unicode_version":"9.0"},{"emoji":"🤟","aliases":["love_you_gesture"],"tags":[],"category":"People & Body","description":"love-you gesture","unicode_version":"11.0"},{"emoji":"🤘","aliases":["metal"],"tags":[],"category":"People & Body","description":"sign of the horns","unicode_version":"8.0"},{"emoji":"🤙","aliases":["call_me_hand"],"tags":[],"category":"People & Body","description":"call me hand","unicode_version":"9.0"},{"emoji":"👈","aliases":["point_left"],"tags":[],"category":"People & Body","description":"backhand index pointing left","unicode_version":"6.0"},{"emoji":"👉","aliases":["point_right"],"tags":[],"category":"People & Body","description":"backhand index pointing right","unicode_version":"6.0"},{"emoji":"👆","aliases":["point_up_2"],"tags":[],"category":"People & Body","description":"backhand index pointing up","unicode_version":"6.0"},{"emoji":"🖕","aliases":["middle_finger","fu"],"tags":[],"category":"People & Body","description":"middle finger","unicode_version":"7.0"},{"emoji":"👇","aliases":["point_down"],"tags":[],"category":"People & Body","description":"backhand index pointing down","unicode_version":"6.0"},{"emoji":"☝️","aliases":["point_up"],"tags":[],"category":"People & Body","description":"index pointing up","unicode_version":""},{"emoji":"👍","aliases":["+1","thumbsup"],"tags":["approve","ok"],"category":"People & Body","description":"thumbs up","unicode_version":"6.0"},{"emoji":"👎","aliases":["-1","thumbsdown"],"tags":["disapprove","bury"],"category":"People & Body","description":"thumbs down","unicode_version":"6.0"},{"emoji":"✊","aliases":["fist_raised","fist"],"tags":["power"],"category":"People & Body","description":"raised fist","unicode_version":"6.0"},{"emoji":"👊","aliases":["fist_oncoming","facepunch","punch"],"tags":["attack"],"category":"People & Body","description":"oncoming fist","unicode_version":"6.0"},{"emoji":"🤛","aliases":["fist_left"],"tags":[],"category":"People & Body","description":"left-facing fist","unicode_version":"9.0"},{"emoji":"🤜","aliases":["fist_right"],"tags":[],"category":"People & Body","description":"right-facing fist","unicode_version":"9.0"},{"emoji":"👏","aliases":["clap"],"tags":["praise","applause"],"category":"People & Body","description":"clapping hands","unicode_version":"6.0"},{"emoji":"🙌","aliases":["raised_hands"],"tags":["hooray"],"category":"People & Body","description":"raising hands","unicode_version":"6.0"},{"emoji":"👐","aliases":["open_hands"],"tags":[],"category":"People & Body","description":"open hands","unicode_version":"6.0"},{"emoji":"🤲","aliases":["palms_up_together"],"tags":[],"category":"People & Body","description":"palms up together","unicode_version":"11.0"},{"emoji":"🤝","aliases":["handshake"],"tags":["deal"],"category":"People & Body","description":"handshake","unicode_version":"9.0"},{"emoji":"🙏","aliases":["pray"],"tags":["please","hope","wish"],"category":"People & Body","description":"folded hands","unicode_version":"6.0"},{"emoji":"✍️","aliases":["writing_hand"],"tags":[],"category":"People & Body","description":"writing hand","unicode_version":""},{"emoji":"💅","aliases":["nail_care"],"tags":["beauty","manicure"],"category":"People & Body","description":"nail polish","unicode_version":"6.0"},{"emoji":"🤳","aliases":["selfie"],"tags":[],"category":"People & Body","description":"selfie","unicode_version":"9.0"},{"emoji":"💪","aliases":["muscle"],"tags":["flex","bicep","strong","workout"],"category":"People & Body","description":"flexed biceps","unicode_version":"6.0"},{"emoji":"🦾","aliases":["mechanical_arm"],"tags":[],"category":"People & Body","description":"mechanical arm","unicode_version":"12.0"},{"emoji":"🦿","aliases":["mechanical_leg"],"tags":[],"category":"People & Body","description":"mechanical leg","unicode_version":"12.0"},{"emoji":"🦵","aliases":["leg"],"tags":[],"category":"People & Body","description":"leg","unicode_version":"11.0"},{"emoji":"🦶","aliases":["foot"],"tags":[],"category":"People & Body","description":"foot","unicode_version":"11.0"},{"emoji":"👂","aliases":["ear"],"tags":["hear","sound","listen"],"category":"People & Body","description":"ear","unicode_version":"6.0"},{"emoji":"🦻","aliases":["ear_with_hearing_aid"],"tags":[],"category":"People & Body","description":"ear with hearing aid","unicode_version":"12.0"},{"emoji":"👃","aliases":["nose"],"tags":["smell"],"category":"People & Body","description":"nose","unicode_version":"6.0"},{"emoji":"🧠","aliases":["brain"],"tags":[],"category":"People & Body","description":"brain","unicode_version":"11.0"},{"emoji":"🫀","aliases":["anatomical_heart"],"tags":[],"category":"People & Body","description":"anatomical heart","unicode_version":"13.0"},{"emoji":"🫁","aliases":["lungs"],"tags":[],"category":"People & Body","description":"lungs","unicode_version":"13.0"},{"emoji":"🦷","aliases":["tooth"],"tags":[],"category":"People & Body","description":"tooth","unicode_version":"11.0"},{"emoji":"🦴","aliases":["bone"],"tags":[],"category":"People & Body","description":"bone","unicode_version":"11.0"},{"emoji":"👀","aliases":["eyes"],"tags":["look","see","watch"],"category":"People & Body","description":"eyes","unicode_version":"6.0"},{"emoji":"👁️","aliases":["eye"],"tags":[],"category":"People & Body","description":"eye","unicode_version":"7.0"},{"emoji":"👅","aliases":["tongue"],"tags":["taste"],"category":"People & Body","description":"tongue","unicode_version":"6.0"},{"emoji":"👄","aliases":["lips"],"tags":["kiss"],"category":"People & Body","description":"mouth","unicode_version":"6.0"},{"emoji":"👶","aliases":["baby"],"tags":["child","newborn"],"category":"People & Body","description":"baby","unicode_version":"6.0"},{"emoji":"🧒","aliases":["child"],"tags":[],"category":"People & Body","description":"child","unicode_version":"11.0"},{"emoji":"👦","aliases":["boy"],"tags":["child"],"category":"People & Body","description":"boy","unicode_version":"6.0"},{"emoji":"👧","aliases":["girl"],"tags":["child"],"category":"People & Body","description":"girl","unicode_version":"6.0"},{"emoji":"🧑","aliases":["adult"],"tags":[],"category":"People & Body","description":"person","unicode_version":"11.0"},{"emoji":"👱","aliases":["blond_haired_person"],"tags":[],"category":"People & Body","description":"person: blond hair","unicode_version":"6.0"},{"emoji":"👨","aliases":["man"],"tags":["mustache","father","dad"],"category":"People & Body","description":"man","unicode_version":"6.0"},{"emoji":"🧔","aliases":["bearded_person"],"tags":[],"category":"People & Body","description":"person: beard","unicode_version":"11.0"},{"emoji":"🧔‍♂️","aliases":["man_beard"],"tags":[],"category":"People & Body","description":"man: beard","unicode_version":"13.1"},{"emoji":"🧔‍♀️","aliases":["woman_beard"],"tags":[],"category":"People & Body","description":"woman: beard","unicode_version":"13.1"},{"emoji":"👨‍🦰","aliases":["red_haired_man"],"tags":[],"category":"People & Body","description":"man: red hair","unicode_version":"11.0"},{"emoji":"👨‍🦱","aliases":["curly_haired_man"],"tags":[],"category":"People & Body","description":"man: curly hair","unicode_version":"11.0"},{"emoji":"👨‍🦳","aliases":["white_haired_man"],"tags":[],"category":"People & Body","description":"man: white hair","unicode_version":"11.0"},{"emoji":"👨‍🦲","aliases":["bald_man"],"tags":[],"category":"People & Body","description":"man: bald","unicode_version":"11.0"},{"emoji":"👩","aliases":["woman"],"tags":["girls"],"category":"People & Body","description":"woman","unicode_version":"6.0"},{"emoji":"👩‍🦰","aliases":["red_haired_woman"],"tags":[],"category":"People & Body","description":"woman: red hair","unicode_version":"11.0"},{"emoji":"🧑‍🦰","aliases":["person_red_hair"],"tags":[],"category":"People & Body","description":"person: red hair","unicode_version":"12.1"},{"emoji":"👩‍🦱","aliases":["curly_haired_woman"],"tags":[],"category":"People & Body","description":"woman: curly hair","unicode_version":"11.0"},{"emoji":"🧑‍🦱","aliases":["person_curly_hair"],"tags":[],"category":"People & Body","description":"person: curly hair","unicode_version":"12.1"},{"emoji":"👩‍🦳","aliases":["white_haired_woman"],"tags":[],"category":"People & Body","description":"woman: white hair","unicode_version":"11.0"},{"emoji":"🧑‍🦳","aliases":["person_white_hair"],"tags":[],"category":"People & Body","description":"person: white hair","unicode_version":"12.1"},{"emoji":"👩‍🦲","aliases":["bald_woman"],"tags":[],"category":"People & Body","description":"woman: bald","unicode_version":"11.0"},{"emoji":"🧑‍🦲","aliases":["person_bald"],"tags":[],"category":"People & Body","description":"person: bald","unicode_version":"12.1"},{"emoji":"👱‍♀️","aliases":["blond_haired_woman","blonde_woman"],"tags":[],"category":"People & Body","description":"woman: blond hair","unicode_version":"6.0"},{"emoji":"👱‍♂️","aliases":["blond_haired_man"],"tags":[],"category":"People & Body","description":"man: blond hair","unicode_version":"11.0"},{"emoji":"🧓","aliases":["older_adult"],"tags":[],"category":"People & Body","description":"older person","unicode_version":"11.0"},{"emoji":"👴","aliases":["older_man"],"tags":[],"category":"People & Body","description":"old man","unicode_version":"6.0"},{"emoji":"👵","aliases":["older_woman"],"tags":[],"category":"People & Body","description":"old woman","unicode_version":"6.0"},{"emoji":"🙍","aliases":["frowning_person"],"tags":[],"category":"People & Body","description":"person frowning","unicode_version":"6.0"},{"emoji":"🙍‍♂️","aliases":["frowning_man"],"tags":[],"category":"People & Body","description":"man frowning","unicode_version":"6.0"},{"emoji":"🙍‍♀️","aliases":["frowning_woman"],"tags":[],"category":"People & Body","description":"woman frowning","unicode_version":"11.0"},{"emoji":"🙎","aliases":["pouting_face"],"tags":[],"category":"People & Body","description":"person pouting","unicode_version":"6.0"},{"emoji":"🙎‍♂️","aliases":["pouting_man"],"tags":[],"category":"People & Body","description":"man pouting","unicode_version":"6.0"},{"emoji":"🙎‍♀️","aliases":["pouting_woman"],"tags":[],"category":"People & Body","description":"woman pouting","unicode_version":"11.0"},{"emoji":"🙅","aliases":["no_good"],"tags":["stop","halt","denied"],"category":"People & Body","description":"person gesturing NO","unicode_version":"6.0"},{"emoji":"🙅‍♂️","aliases":["no_good_man","ng_man"],"tags":["stop","halt","denied"],"category":"People & Body","description":"man gesturing NO","unicode_version":"6.0"},{"emoji":"🙅‍♀️","aliases":["no_good_woman","ng_woman"],"tags":["stop","halt","denied"],"category":"People & Body","description":"woman gesturing NO","unicode_version":"11.0"},{"emoji":"🙆","aliases":["ok_person"],"tags":[],"category":"People & Body","description":"person gesturing OK","unicode_version":"6.0"},{"emoji":"🙆‍♂️","aliases":["ok_man"],"tags":[],"category":"People & Body","description":"man gesturing OK","unicode_version":"6.0"},{"emoji":"🙆‍♀️","aliases":["ok_woman"],"tags":[],"category":"People & Body","description":"woman gesturing OK","unicode_version":"11.0"},{"emoji":"💁","aliases":["tipping_hand_person","information_desk_person"],"tags":[],"category":"People & Body","description":"person tipping hand","unicode_version":"6.0"},{"emoji":"💁‍♂️","aliases":["tipping_hand_man","sassy_man"],"tags":["information"],"category":"People & Body","description":"man tipping hand","unicode_version":"6.0"},{"emoji":"💁‍♀️","aliases":["tipping_hand_woman","sassy_woman"],"tags":["information"],"category":"People & Body","description":"woman tipping hand","unicode_version":"11.0"},{"emoji":"🙋","aliases":["raising_hand"],"tags":[],"category":"People & Body","description":"person raising hand","unicode_version":"6.0"},{"emoji":"🙋‍♂️","aliases":["raising_hand_man"],"tags":[],"category":"People & Body","description":"man raising hand","unicode_version":"6.0"},{"emoji":"🙋‍♀️","aliases":["raising_hand_woman"],"tags":[],"category":"People & Body","description":"woman raising hand","unicode_version":"11.0"},{"emoji":"🧏","aliases":["deaf_person"],"tags":[],"category":"People & Body","description":"deaf person","unicode_version":"12.0"},{"emoji":"🧏‍♂️","aliases":["deaf_man"],"tags":[],"category":"People & Body","description":"deaf man","unicode_version":"12.0"},{"emoji":"🧏‍♀️","aliases":["deaf_woman"],"tags":[],"category":"People & Body","description":"deaf woman","unicode_version":"12.0"},{"emoji":"🙇","aliases":["bow"],"tags":["respect","thanks"],"category":"People & Body","description":"person bowing","unicode_version":"6.0"},{"emoji":"🙇‍♂️","aliases":["bowing_man"],"tags":["respect","thanks"],"category":"People & Body","description":"man bowing","unicode_version":"11.0"},{"emoji":"🙇‍♀️","aliases":["bowing_woman"],"tags":["respect","thanks"],"category":"People & Body","description":"woman bowing","unicode_version":"6.0"},{"emoji":"🤦","aliases":["facepalm"],"tags":[],"category":"People & Body","description":"person facepalming","unicode_version":"11.0"},{"emoji":"🤦‍♂️","aliases":["man_facepalming"],"tags":[],"category":"People & Body","description":"man facepalming","unicode_version":"9.0"},{"emoji":"🤦‍♀️","aliases":["woman_facepalming"],"tags":[],"category":"People & Body","description":"woman facepalming","unicode_version":"9.0"},{"emoji":"🤷","aliases":["shrug"],"tags":[],"category":"People & Body","description":"person shrugging","unicode_version":"11.0"},{"emoji":"🤷‍♂️","aliases":["man_shrugging"],"tags":[],"category":"People & Body","description":"man shrugging","unicode_version":"9.0"},{"emoji":"🤷‍♀️","aliases":["woman_shrugging"],"tags":[],"category":"People & Body","description":"woman shrugging","unicode_version":"9.0"},{"emoji":"🧑‍⚕️","aliases":["health_worker"],"tags":[],"category":"People & Body","description":"health worker","unicode_version":"12.1"},{"emoji":"👨‍⚕️","aliases":["man_health_worker"],"tags":["doctor","nurse"],"category":"People & Body","description":"man health worker","unicode_version":""},{"emoji":"👩‍⚕️","aliases":["woman_health_worker"],"tags":["doctor","nurse"],"category":"People & Body","description":"woman health worker","unicode_version":""},{"emoji":"🧑‍🎓","aliases":["student"],"tags":[],"category":"People & Body","description":"student","unicode_version":"12.1"},{"emoji":"👨‍🎓","aliases":["man_student"],"tags":["graduation"],"category":"People & Body","description":"man student","unicode_version":""},{"emoji":"👩‍🎓","aliases":["woman_student"],"tags":["graduation"],"category":"People & Body","description":"woman student","unicode_version":""},{"emoji":"🧑‍🏫","aliases":["teacher"],"tags":[],"category":"People & Body","description":"teacher","unicode_version":"12.1"},{"emoji":"👨‍🏫","aliases":["man_teacher"],"tags":["school","professor"],"category":"People & Body","description":"man teacher","unicode_version":""},{"emoji":"👩‍🏫","aliases":["woman_teacher"],"tags":["school","professor"],"category":"People & Body","description":"woman teacher","unicode_version":""},{"emoji":"🧑‍⚖️","aliases":["judge"],"tags":[],"category":"People & Body","description":"judge","unicode_version":"12.1"},{"emoji":"👨‍⚖️","aliases":["man_judge"],"tags":["justice"],"category":"People & Body","description":"man judge","unicode_version":""},{"emoji":"👩‍⚖️","aliases":["woman_judge"],"tags":["justice"],"category":"People & Body","description":"woman judge","unicode_version":""},{"emoji":"🧑‍🌾","aliases":["farmer"],"tags":[],"category":"People & Body","description":"farmer","unicode_version":"12.1"},{"emoji":"👨‍🌾","aliases":["man_farmer"],"tags":[],"category":"People & Body","description":"man farmer","unicode_version":""},{"emoji":"👩‍🌾","aliases":["woman_farmer"],"tags":[],"category":"People & Body","description":"woman farmer","unicode_version":""},{"emoji":"🧑‍🍳","aliases":["cook"],"tags":[],"category":"People & Body","description":"cook","unicode_version":"12.1"},{"emoji":"👨‍🍳","aliases":["man_cook"],"tags":["chef"],"category":"People & Body","description":"man cook","unicode_version":""},{"emoji":"👩‍🍳","aliases":["woman_cook"],"tags":["chef"],"category":"People & Body","description":"woman cook","unicode_version":""},{"emoji":"🧑‍🔧","aliases":["mechanic"],"tags":[],"category":"People & Body","description":"mechanic","unicode_version":"12.1"},{"emoji":"👨‍🔧","aliases":["man_mechanic"],"tags":[],"category":"People & Body","description":"man mechanic","unicode_version":""},{"emoji":"👩‍🔧","aliases":["woman_mechanic"],"tags":[],"category":"People & Body","description":"woman mechanic","unicode_version":""},{"emoji":"🧑‍🏭","aliases":["factory_worker"],"tags":[],"category":"People & Body","description":"factory worker","unicode_version":"12.1"},{"emoji":"👨‍🏭","aliases":["man_factory_worker"],"tags":[],"category":"People & Body","description":"man factory worker","unicode_version":""},{"emoji":"👩‍🏭","aliases":["woman_factory_worker"],"tags":[],"category":"People & Body","description":"woman factory worker","unicode_version":""},{"emoji":"🧑‍💼","aliases":["office_worker"],"tags":[],"category":"People & Body","description":"office worker","unicode_version":"12.1"},{"emoji":"👨‍💼","aliases":["man_office_worker"],"tags":["business"],"category":"People & Body","description":"man office worker","unicode_version":""},{"emoji":"👩‍💼","aliases":["woman_office_worker"],"tags":["business"],"category":"People & Body","description":"woman office worker","unicode_version":""},{"emoji":"🧑‍🔬","aliases":["scientist"],"tags":[],"category":"People & Body","description":"scientist","unicode_version":"12.1"},{"emoji":"👨‍🔬","aliases":["man_scientist"],"tags":["research"],"category":"People & Body","description":"man scientist","unicode_version":""},{"emoji":"👩‍🔬","aliases":["woman_scientist"],"tags":["research"],"category":"People & Body","description":"woman scientist","unicode_version":""},{"emoji":"🧑‍💻","aliases":["technologist"],"tags":[],"category":"People & Body","description":"technologist","unicode_version":"12.1"},{"emoji":"👨‍💻","aliases":["man_technologist"],"tags":["coder"],"category":"People & Body","description":"man technologist","unicode_version":""},{"emoji":"👩‍💻","aliases":["woman_technologist"],"tags":["coder"],"category":"People & Body","description":"woman technologist","unicode_version":""},{"emoji":"🧑‍🎤","aliases":["singer"],"tags":[],"category":"People & Body","description":"singer","unicode_version":"12.1"},{"emoji":"👨‍🎤","aliases":["man_singer"],"tags":["rockstar"],"category":"People & Body","description":"man singer","unicode_version":""},{"emoji":"👩‍🎤","aliases":["woman_singer"],"tags":["rockstar"],"category":"People & Body","description":"woman singer","unicode_version":""},{"emoji":"🧑‍🎨","aliases":["artist"],"tags":[],"category":"People & Body","description":"artist","unicode_version":"12.1"},{"emoji":"👨‍🎨","aliases":["man_artist"],"tags":["painter"],"category":"People & Body","description":"man artist","unicode_version":""},{"emoji":"👩‍🎨","aliases":["woman_artist"],"tags":["painter"],"category":"People & Body","description":"woman artist","unicode_version":""},{"emoji":"🧑‍✈️","aliases":["pilot"],"tags":[],"category":"People & Body","description":"pilot","unicode_version":"12.1"},{"emoji":"👨‍✈️","aliases":["man_pilot"],"tags":[],"category":"People & Body","description":"man pilot","unicode_version":""},{"emoji":"👩‍✈️","aliases":["woman_pilot"],"tags":[],"category":"People & Body","description":"woman pilot","unicode_version":""},{"emoji":"🧑‍🚀","aliases":["astronaut"],"tags":[],"category":"People & Body","description":"astronaut","unicode_version":"12.1"},{"emoji":"👨‍🚀","aliases":["man_astronaut"],"tags":["space"],"category":"People & Body","description":"man astronaut","unicode_version":""},{"emoji":"👩‍🚀","aliases":["woman_astronaut"],"tags":["space"],"category":"People & Body","description":"woman astronaut","unicode_version":""},{"emoji":"🧑‍🚒","aliases":["firefighter"],"tags":[],"category":"People & Body","description":"firefighter","unicode_version":"12.1"},{"emoji":"👨‍🚒","aliases":["man_firefighter"],"tags":[],"category":"People & Body","description":"man firefighter","unicode_version":""},{"emoji":"👩‍🚒","aliases":["woman_firefighter"],"tags":[],"category":"People & Body","description":"woman firefighter","unicode_version":""},{"emoji":"👮","aliases":["police_officer","cop"],"tags":["law"],"category":"People & Body","description":"police officer","unicode_version":"6.0"},{"emoji":"👮‍♂️","aliases":["policeman"],"tags":["law","cop"],"category":"People & Body","description":"man police officer","unicode_version":"11.0"},{"emoji":"👮‍♀️","aliases":["policewoman"],"tags":["law","cop"],"category":"People & Body","description":"woman police officer","unicode_version":"6.0"},{"emoji":"🕵️","aliases":["detective"],"tags":["sleuth"],"category":"People & Body","description":"detective","unicode_version":"7.0"},{"emoji":"🕵️‍♂️","aliases":["male_detective"],"tags":["sleuth"],"category":"People & Body","description":"man detective","unicode_version":"11.0"},{"emoji":"🕵️‍♀️","aliases":["female_detective"],"tags":["sleuth"],"category":"People & Body","description":"woman detective","unicode_version":"6.0"},{"emoji":"💂","aliases":["guard"],"tags":[],"category":"People & Body","description":"guard","unicode_version":"6.0"},{"emoji":"💂‍♂️","aliases":["guardsman"],"tags":[],"category":"People & Body","description":"man guard","unicode_version":"11.0"},{"emoji":"💂‍♀️","aliases":["guardswoman"],"tags":[],"category":"People & Body","description":"woman guard","unicode_version":"6.0"},{"emoji":"🥷","aliases":["ninja"],"tags":[],"category":"People & Body","description":"ninja","unicode_version":"13.0"},{"emoji":"👷","aliases":["construction_worker"],"tags":["helmet"],"category":"People & Body","description":"construction worker","unicode_version":"6.0"},{"emoji":"👷‍♂️","aliases":["construction_worker_man"],"tags":["helmet"],"category":"People & Body","description":"man construction worker","unicode_version":"11.0"},{"emoji":"👷‍♀️","aliases":["construction_worker_woman"],"tags":["helmet"],"category":"People & Body","description":"woman construction worker","unicode_version":"6.0"},{"emoji":"🤴","aliases":["prince"],"tags":["crown","royal"],"category":"People & Body","description":"prince","unicode_version":"9.0"},{"emoji":"👸","aliases":["princess"],"tags":["crown","royal"],"category":"People & Body","description":"princess","unicode_version":"6.0"},{"emoji":"👳","aliases":["person_with_turban"],"tags":[],"category":"People & Body","description":"person wearing turban","unicode_version":"6.0"},{"emoji":"👳‍♂️","aliases":["man_with_turban"],"tags":[],"category":"People & Body","description":"man wearing turban","unicode_version":"11.0"},{"emoji":"👳‍♀️","aliases":["woman_with_turban"],"tags":[],"category":"People & Body","description":"woman wearing turban","unicode_version":"6.0"},{"emoji":"👲","aliases":["man_with_gua_pi_mao"],"tags":[],"category":"People & Body","description":"person with skullcap","unicode_version":"6.0"},{"emoji":"🧕","aliases":["woman_with_headscarf"],"tags":["hijab"],"category":"People & Body","description":"woman with headscarf","unicode_version":"11.0"},{"emoji":"🤵","aliases":["person_in_tuxedo"],"tags":["groom","marriage","wedding"],"category":"People & Body","description":"person in tuxedo","unicode_version":"9.0"},{"emoji":"🤵‍♂️","aliases":["man_in_tuxedo"],"tags":[],"category":"People & Body","description":"man in tuxedo","unicode_version":"13.0"},{"emoji":"🤵‍♀️","aliases":["woman_in_tuxedo"],"tags":[],"category":"People & Body","description":"woman in tuxedo","unicode_version":"13.0"},{"emoji":"👰","aliases":["person_with_veil"],"tags":["marriage","wedding"],"category":"People & Body","description":"person with veil","unicode_version":"6.0"},{"emoji":"👰‍♂️","aliases":["man_with_veil"],"tags":[],"category":"People & Body","description":"man with veil","unicode_version":"13.0"},{"emoji":"👰‍♀️","aliases":["woman_with_veil","bride_with_veil"],"tags":[],"category":"People & Body","description":"woman with veil","unicode_version":"13.0"},{"emoji":"🤰","aliases":["pregnant_woman"],"tags":[],"category":"People & Body","description":"pregnant woman","unicode_version":"9.0"},{"emoji":"🤱","aliases":["breast_feeding"],"tags":["nursing"],"category":"People & Body","description":"breast-feeding","unicode_version":"11.0"},{"emoji":"👩‍🍼","aliases":["woman_feeding_baby"],"tags":[],"category":"People & Body","description":"woman feeding baby","unicode_version":"13.0"},{"emoji":"👨‍🍼","aliases":["man_feeding_baby"],"tags":[],"category":"People & Body","description":"man feeding baby","unicode_version":"13.0"},{"emoji":"🧑‍🍼","aliases":["person_feeding_baby"],"tags":[],"category":"People & Body","description":"person feeding baby","unicode_version":"13.0"},{"emoji":"👼","aliases":["angel"],"tags":[],"category":"People & Body","description":"baby angel","unicode_version":"6.0"},{"emoji":"🎅","aliases":["santa"],"tags":["christmas"],"category":"People & Body","description":"Santa Claus","unicode_version":"6.0"},{"emoji":"🤶","aliases":["mrs_claus"],"tags":["santa"],"category":"People & Body","description":"Mrs. Claus","unicode_version":"9.0"},{"emoji":"🧑‍🎄","aliases":["mx_claus"],"tags":[],"category":"People & Body","description":"mx claus","unicode_version":"13.0"},{"emoji":"🦸","aliases":["superhero"],"tags":[],"category":"People & Body","description":"superhero","unicode_version":"11.0"},{"emoji":"🦸‍♂️","aliases":["superhero_man"],"tags":[],"category":"People & Body","description":"man superhero","unicode_version":"11.0"},{"emoji":"🦸‍♀️","aliases":["superhero_woman"],"tags":[],"category":"People & Body","description":"woman superhero","unicode_version":"11.0"},{"emoji":"🦹","aliases":["supervillain"],"tags":[],"category":"People & Body","description":"supervillain","unicode_version":"11.0"},{"emoji":"🦹‍♂️","aliases":["supervillain_man"],"tags":[],"category":"People & Body","description":"man supervillain","unicode_version":"11.0"},{"emoji":"🦹‍♀️","aliases":["supervillain_woman"],"tags":[],"category":"People & Body","description":"woman supervillain","unicode_version":"11.0"},{"emoji":"🧙","aliases":["mage"],"tags":["wizard"],"category":"People & Body","description":"mage","unicode_version":"11.0"},{"emoji":"🧙‍♂️","aliases":["mage_man"],"tags":["wizard"],"category":"People & Body","description":"man mage","unicode_version":"11.0"},{"emoji":"🧙‍♀️","aliases":["mage_woman"],"tags":["wizard"],"category":"People & Body","description":"woman mage","unicode_version":"11.0"},{"emoji":"🧚","aliases":["fairy"],"tags":[],"category":"People & Body","description":"fairy","unicode_version":"11.0"},{"emoji":"🧚‍♂️","aliases":["fairy_man"],"tags":[],"category":"People & Body","description":"man fairy","unicode_version":"11.0"},{"emoji":"🧚‍♀️","aliases":["fairy_woman"],"tags":[],"category":"People & Body","description":"woman fairy","unicode_version":"11.0"},{"emoji":"🧛","aliases":["vampire"],"tags":[],"category":"People & Body","description":"vampire","unicode_version":"11.0"},{"emoji":"🧛‍♂️","aliases":["vampire_man"],"tags":[],"category":"People & Body","description":"man vampire","unicode_version":"11.0"},{"emoji":"🧛‍♀️","aliases":["vampire_woman"],"tags":[],"category":"People & Body","description":"woman vampire","unicode_version":"11.0"},{"emoji":"🧜","aliases":["merperson"],"tags":[],"category":"People & Body","description":"merperson","unicode_version":"11.0"},{"emoji":"🧜‍♂️","aliases":["merman"],"tags":[],"category":"People & Body","description":"merman","unicode_version":"11.0"},{"emoji":"🧜‍♀️","aliases":["mermaid"],"tags":[],"category":"People & Body","description":"mermaid","unicode_version":"11.0"},{"emoji":"🧝","aliases":["elf"],"tags":[],"category":"People & Body","description":"elf","unicode_version":"11.0"},{"emoji":"🧝‍♂️","aliases":["elf_man"],"tags":[],"category":"People & Body","description":"man elf","unicode_version":"11.0"},{"emoji":"🧝‍♀️","aliases":["elf_woman"],"tags":[],"category":"People & Body","description":"woman elf","unicode_version":"11.0"},{"emoji":"🧞","aliases":["genie"],"tags":[],"category":"People & Body","description":"genie","unicode_version":"11.0"},{"emoji":"🧞‍♂️","aliases":["genie_man"],"tags":[],"category":"People & Body","description":"man genie","unicode_version":"11.0"},{"emoji":"🧞‍♀️","aliases":["genie_woman"],"tags":[],"category":"People & Body","description":"woman genie","unicode_version":"11.0"},{"emoji":"🧟","aliases":["zombie"],"tags":[],"category":"People & Body","description":"zombie","unicode_version":"11.0"},{"emoji":"🧟‍♂️","aliases":["zombie_man"],"tags":[],"category":"People & Body","description":"man zombie","unicode_version":"11.0"},{"emoji":"🧟‍♀️","aliases":["zombie_woman"],"tags":[],"category":"People & Body","description":"woman zombie","unicode_version":"11.0"},{"emoji":"💆","aliases":["massage"],"tags":["spa"],"category":"People & Body","description":"person getting massage","unicode_version":"6.0"},{"emoji":"💆‍♂️","aliases":["massage_man"],"tags":["spa"],"category":"People & Body","description":"man getting massage","unicode_version":"6.0"},{"emoji":"💆‍♀️","aliases":["massage_woman"],"tags":["spa"],"category":"People & Body","description":"woman getting massage","unicode_version":"11.0"},{"emoji":"💇","aliases":["haircut"],"tags":["beauty"],"category":"People & Body","description":"person getting haircut","unicode_version":"6.0"},{"emoji":"💇‍♂️","aliases":["haircut_man"],"tags":[],"category":"People & Body","description":"man getting haircut","unicode_version":"6.0"},{"emoji":"💇‍♀️","aliases":["haircut_woman"],"tags":[],"category":"People & Body","description":"woman getting haircut","unicode_version":"11.0"},{"emoji":"🚶","aliases":["walking"],"tags":[],"category":"People & Body","description":"person walking","unicode_version":"6.0"},{"emoji":"🚶‍♂️","aliases":["walking_man"],"tags":[],"category":"People & Body","description":"man walking","unicode_version":"11.0"},{"emoji":"🚶‍♀️","aliases":["walking_woman"],"tags":[],"category":"People & Body","description":"woman walking","unicode_version":"6.0"},{"emoji":"🧍","aliases":["standing_person"],"tags":[],"category":"People & Body","description":"person standing","unicode_version":"12.0"},{"emoji":"🧍‍♂️","aliases":["standing_man"],"tags":[],"category":"People & Body","description":"man standing","unicode_version":"12.0"},{"emoji":"🧍‍♀️","aliases":["standing_woman"],"tags":[],"category":"People & Body","description":"woman standing","unicode_version":"12.0"},{"emoji":"🧎","aliases":["kneeling_person"],"tags":[],"category":"People & Body","description":"person kneeling","unicode_version":"12.0"},{"emoji":"🧎‍♂️","aliases":["kneeling_man"],"tags":[],"category":"People & Body","description":"man kneeling","unicode_version":"12.0"},{"emoji":"🧎‍♀️","aliases":["kneeling_woman"],"tags":[],"category":"People & Body","description":"woman kneeling","unicode_version":"12.0"},{"emoji":"🧑‍🦯","aliases":["person_with_probing_cane"],"tags":[],"category":"People & Body","description":"person with white cane","unicode_version":"12.1"},{"emoji":"👨‍🦯","aliases":["man_with_probing_cane"],"tags":[],"category":"People & Body","description":"man with white cane","unicode_version":"12.0"},{"emoji":"👩‍🦯","aliases":["woman_with_probing_cane"],"tags":[],"category":"People & Body","description":"woman with white cane","unicode_version":"12.0"},{"emoji":"🧑‍🦼","aliases":["person_in_motorized_wheelchair"],"tags":[],"category":"People & Body","description":"person in motorized wheelchair","unicode_version":"12.1"},{"emoji":"👨‍🦼","aliases":["man_in_motorized_wheelchair"],"tags":[],"category":"People & Body","description":"man in motorized wheelchair","unicode_version":"12.0"},{"emoji":"👩‍🦼","aliases":["woman_in_motorized_wheelchair"],"tags":[],"category":"People & Body","description":"woman in motorized wheelchair","unicode_version":"12.0"},{"emoji":"🧑‍🦽","aliases":["person_in_manual_wheelchair"],"tags":[],"category":"People & Body","description":"person in manual wheelchair","unicode_version":"12.1"},{"emoji":"👨‍🦽","aliases":["man_in_manual_wheelchair"],"tags":[],"category":"People & Body","description":"man in manual wheelchair","unicode_version":"12.0"},{"emoji":"👩‍🦽","aliases":["woman_in_manual_wheelchair"],"tags":[],"category":"People & Body","description":"woman in manual wheelchair","unicode_version":"12.0"},{"emoji":"🏃","aliases":["runner","running"],"tags":["exercise","workout","marathon"],"category":"People & Body","description":"person running","unicode_version":"6.0"},{"emoji":"🏃‍♂️","aliases":["running_man"],"tags":["exercise","workout","marathon"],"category":"People & Body","description":"man running","unicode_version":"11.0"},{"emoji":"🏃‍♀️","aliases":["running_woman"],"tags":["exercise","workout","marathon"],"category":"People & Body","description":"woman running","unicode_version":"6.0"},{"emoji":"💃","aliases":["woman_dancing","dancer"],"tags":["dress"],"category":"People & Body","description":"woman dancing","unicode_version":"6.0"},{"emoji":"🕺","aliases":["man_dancing"],"tags":["dancer"],"category":"People & Body","description":"man dancing","unicode_version":"9.0"},{"emoji":"🕴️","aliases":["business_suit_levitating"],"tags":[],"category":"People & Body","description":"person in suit levitating","unicode_version":"7.0"},{"emoji":"👯","aliases":["dancers"],"tags":["bunny"],"category":"People & Body","description":"people with bunny ears","unicode_version":"6.0"},{"emoji":"👯‍♂️","aliases":["dancing_men"],"tags":["bunny"],"category":"People & Body","description":"men with bunny ears","unicode_version":"6.0"},{"emoji":"👯‍♀️","aliases":["dancing_women"],"tags":["bunny"],"category":"People & Body","description":"women with bunny ears","unicode_version":"11.0"},{"emoji":"🧖","aliases":["sauna_person"],"tags":["steamy"],"category":"People & Body","description":"person in steamy room","unicode_version":"11.0"},{"emoji":"🧖‍♂️","aliases":["sauna_man"],"tags":["steamy"],"category":"People & Body","description":"man in steamy room","unicode_version":"11.0"},{"emoji":"🧖‍♀️","aliases":["sauna_woman"],"tags":["steamy"],"category":"People & Body","description":"woman in steamy room","unicode_version":"11.0"},{"emoji":"🧗","aliases":["climbing"],"tags":["bouldering"],"category":"People & Body","description":"person climbing","unicode_version":"11.0"},{"emoji":"🧗‍♂️","aliases":["climbing_man"],"tags":["bouldering"],"category":"People & Body","description":"man climbing","unicode_version":"11.0"},{"emoji":"🧗‍♀️","aliases":["climbing_woman"],"tags":["bouldering"],"category":"People & Body","description":"woman climbing","unicode_version":"11.0"},{"emoji":"🤺","aliases":["person_fencing"],"tags":[],"category":"People & Body","description":"person fencing","unicode_version":"9.0"},{"emoji":"🏇","aliases":["horse_racing"],"tags":[],"category":"People & Body","description":"horse racing","unicode_version":"6.0"},{"emoji":"⛷️","aliases":["skier"],"tags":[],"category":"People & Body","description":"skier","unicode_version":"5.2"},{"emoji":"🏂","aliases":["snowboarder"],"tags":[],"category":"People & Body","description":"snowboarder","unicode_version":"6.0"},{"emoji":"🏌️","aliases":["golfing"],"tags":[],"category":"People & Body","description":"person golfing","unicode_version":"7.0"},{"emoji":"🏌️‍♂️","aliases":["golfing_man"],"tags":[],"category":"People & Body","description":"man golfing","unicode_version":"11.0"},{"emoji":"🏌️‍♀️","aliases":["golfing_woman"],"tags":[],"category":"People & Body","description":"woman golfing","unicode_version":""},{"emoji":"🏄","aliases":["surfer"],"tags":[],"category":"People & Body","description":"person surfing","unicode_version":"6.0"},{"emoji":"🏄‍♂️","aliases":["surfing_man"],"tags":[],"category":"People & Body","description":"man surfing","unicode_version":"11.0"},{"emoji":"🏄‍♀️","aliases":["surfing_woman"],"tags":[],"category":"People & Body","description":"woman surfing","unicode_version":"7.0"},{"emoji":"🚣","aliases":["rowboat"],"tags":[],"category":"People & Body","description":"person rowing boat","unicode_version":"6.0"},{"emoji":"🚣‍♂️","aliases":["rowing_man"],"tags":[],"category":"People & Body","description":"man rowing boat","unicode_version":"11.0"},{"emoji":"🚣‍♀️","aliases":["rowing_woman"],"tags":[],"category":"People & Body","description":"woman rowing boat","unicode_version":"6.0"},{"emoji":"🏊","aliases":["swimmer"],"tags":[],"category":"People & Body","description":"person swimming","unicode_version":"6.0"},{"emoji":"🏊‍♂️","aliases":["swimming_man"],"tags":[],"category":"People & Body","description":"man swimming","unicode_version":"11.0"},{"emoji":"🏊‍♀️","aliases":["swimming_woman"],"tags":[],"category":"People & Body","description":"woman swimming","unicode_version":"6.0"},{"emoji":"⛹️","aliases":["bouncing_ball_person"],"tags":["basketball"],"category":"People & Body","description":"person bouncing ball","unicode_version":"5.2"},{"emoji":"⛹️‍♂️","aliases":["bouncing_ball_man","basketball_man"],"tags":[],"category":"People & Body","description":"man bouncing ball","unicode_version":"11.0"},{"emoji":"⛹️‍♀️","aliases":["bouncing_ball_woman","basketball_woman"],"tags":[],"category":"People & Body","description":"woman bouncing ball","unicode_version":"7.0"},{"emoji":"🏋️","aliases":["weight_lifting"],"tags":["gym","workout"],"category":"People & Body","description":"person lifting weights","unicode_version":"7.0"},{"emoji":"🏋️‍♂️","aliases":["weight_lifting_man"],"tags":["gym","workout"],"category":"People & Body","description":"man lifting weights","unicode_version":"11.0"},{"emoji":"🏋️‍♀️","aliases":["weight_lifting_woman"],"tags":["gym","workout"],"category":"People & Body","description":"woman lifting weights","unicode_version":"6.0"},{"emoji":"🚴","aliases":["bicyclist"],"tags":[],"category":"People & Body","description":"person biking","unicode_version":"6.0"},{"emoji":"🚴‍♂️","aliases":["biking_man"],"tags":[],"category":"People & Body","description":"man biking","unicode_version":"11.0"},{"emoji":"🚴‍♀️","aliases":["biking_woman"],"tags":[],"category":"People & Body","description":"woman biking","unicode_version":"6.0"},{"emoji":"🚵","aliases":["mountain_bicyclist"],"tags":[],"category":"People & Body","description":"person mountain biking","unicode_version":"6.0"},{"emoji":"🚵‍♂️","aliases":["mountain_biking_man"],"tags":[],"category":"People & Body","description":"man mountain biking","unicode_version":"11.0"},{"emoji":"🚵‍♀️","aliases":["mountain_biking_woman"],"tags":[],"category":"People & Body","description":"woman mountain biking","unicode_version":"6.0"},{"emoji":"🤸","aliases":["cartwheeling"],"tags":[],"category":"People & Body","description":"person cartwheeling","unicode_version":"11.0"},{"emoji":"🤸‍♂️","aliases":["man_cartwheeling"],"tags":[],"category":"People & Body","description":"man cartwheeling","unicode_version":""},{"emoji":"🤸‍♀️","aliases":["woman_cartwheeling"],"tags":[],"category":"People & Body","description":"woman cartwheeling","unicode_version":""},{"emoji":"🤼","aliases":["wrestling"],"tags":[],"category":"People & Body","description":"people wrestling","unicode_version":"11.0"},{"emoji":"🤼‍♂️","aliases":["men_wrestling"],"tags":[],"category":"People & Body","description":"men wrestling","unicode_version":"9.0"},{"emoji":"🤼‍♀️","aliases":["women_wrestling"],"tags":[],"category":"People & Body","description":"women wrestling","unicode_version":"9.0"},{"emoji":"🤽","aliases":["water_polo"],"tags":[],"category":"People & Body","description":"person playing water polo","unicode_version":"11.0"},{"emoji":"🤽‍♂️","aliases":["man_playing_water_polo"],"tags":[],"category":"People & Body","description":"man playing water polo","unicode_version":"9.0"},{"emoji":"🤽‍♀️","aliases":["woman_playing_water_polo"],"tags":[],"category":"People & Body","description":"woman playing water polo","unicode_version":"9.0"},{"emoji":"🤾","aliases":["handball_person"],"tags":[],"category":"People & Body","description":"person playing handball","unicode_version":"11.0"},{"emoji":"🤾‍♂️","aliases":["man_playing_handball"],"tags":[],"category":"People & Body","description":"man playing handball","unicode_version":"9.0"},{"emoji":"🤾‍♀️","aliases":["woman_playing_handball"],"tags":[],"category":"People & Body","description":"woman playing handball","unicode_version":"9.0"},{"emoji":"🤹","aliases":["juggling_person"],"tags":[],"category":"People & Body","description":"person juggling","unicode_version":"11.0"},{"emoji":"🤹‍♂️","aliases":["man_juggling"],"tags":[],"category":"People & Body","description":"man juggling","unicode_version":"9.0"},{"emoji":"🤹‍♀️","aliases":["woman_juggling"],"tags":[],"category":"People & Body","description":"woman juggling","unicode_version":"9.0"},{"emoji":"🧘","aliases":["lotus_position"],"tags":["meditation"],"category":"People & Body","description":"person in lotus position","unicode_version":"11.0"},{"emoji":"🧘‍♂️","aliases":["lotus_position_man"],"tags":["meditation"],"category":"People & Body","description":"man in lotus position","unicode_version":"11.0"},{"emoji":"🧘‍♀️","aliases":["lotus_position_woman"],"tags":["meditation"],"category":"People & Body","description":"woman in lotus position","unicode_version":"11.0"},{"emoji":"🛀","aliases":["bath"],"tags":["shower"],"category":"People & Body","description":"person taking bath","unicode_version":"6.0"},{"emoji":"🛌","aliases":["sleeping_bed"],"tags":[],"category":"People & Body","description":"person in bed","unicode_version":"7.0"},{"emoji":"🧑‍🤝‍🧑","aliases":["people_holding_hands"],"tags":["couple","date"],"category":"People & Body","description":"people holding hands","unicode_version":"12.0"},{"emoji":"👭","aliases":["two_women_holding_hands"],"tags":["couple","date"],"category":"People & Body","description":"women holding hands","unicode_version":"6.0"},{"emoji":"👫","aliases":["couple"],"tags":["date"],"category":"People & Body","description":"woman and man holding hands","unicode_version":"6.0"},{"emoji":"👬","aliases":["two_men_holding_hands"],"tags":["couple","date"],"category":"People & Body","description":"men holding hands","unicode_version":"6.0"},{"emoji":"💏","aliases":["couplekiss"],"tags":[],"category":"People & Body","description":"kiss","unicode_version":"6.0"},{"emoji":"👩‍❤️‍💋‍👨","aliases":["couplekiss_man_woman"],"tags":[],"category":"People & Body","description":"kiss: woman, man","unicode_version":"11.0"},{"emoji":"👨‍❤️‍💋‍👨","aliases":["couplekiss_man_man"],"tags":[],"category":"People & Body","description":"kiss: man, man","unicode_version":"6.0"},{"emoji":"👩‍❤️‍💋‍👩","aliases":["couplekiss_woman_woman"],"tags":[],"category":"People & Body","description":"kiss: woman, woman","unicode_version":"6.0"},{"emoji":"💑","aliases":["couple_with_heart"],"tags":[],"category":"People & Body","description":"couple with heart","unicode_version":"6.0"},{"emoji":"👩‍❤️‍👨","aliases":["couple_with_heart_woman_man"],"tags":[],"category":"People & Body","description":"couple with heart: woman, man","unicode_version":"11.0"},{"emoji":"👨‍❤️‍👨","aliases":["couple_with_heart_man_man"],"tags":[],"category":"People & Body","description":"couple with heart: man, man","unicode_version":"6.0"},{"emoji":"👩‍❤️‍👩","aliases":["couple_with_heart_woman_woman"],"tags":[],"category":"People & Body","description":"couple with heart: woman, woman","unicode_version":"6.0"},{"emoji":"👪","aliases":["family"],"tags":["home","parents","child"],"category":"People & Body","description":"family","unicode_version":"6.0"},{"emoji":"👨‍👩‍👦","aliases":["family_man_woman_boy"],"tags":[],"category":"People & Body","description":"family: man, woman, boy","unicode_version":"11.0"},{"emoji":"👨‍👩‍👧","aliases":["family_man_woman_girl"],"tags":[],"category":"People & Body","description":"family: man, woman, girl","unicode_version":"6.0"},{"emoji":"👨‍👩‍👧‍👦","aliases":["family_man_woman_girl_boy"],"tags":[],"category":"People & Body","description":"family: man, woman, girl, boy","unicode_version":"6.0"},{"emoji":"👨‍👩‍👦‍👦","aliases":["family_man_woman_boy_boy"],"tags":[],"category":"People & Body","description":"family: man, woman, boy, boy","unicode_version":"6.0"},{"emoji":"👨‍👩‍👧‍👧","aliases":["family_man_woman_girl_girl"],"tags":[],"category":"People & Body","description":"family: man, woman, girl, girl","unicode_version":"6.0"},{"emoji":"👨‍👨‍👦","aliases":["family_man_man_boy"],"tags":[],"category":"People & Body","description":"family: man, man, boy","unicode_version":"6.0"},{"emoji":"👨‍👨‍👧","aliases":["family_man_man_girl"],"tags":[],"category":"People & Body","description":"family: man, man, girl","unicode_version":"6.0"},{"emoji":"👨‍👨‍👧‍👦","aliases":["family_man_man_girl_boy"],"tags":[],"category":"People & Body","description":"family: man, man, girl, boy","unicode_version":"6.0"},{"emoji":"👨‍👨‍👦‍👦","aliases":["family_man_man_boy_boy"],"tags":[],"category":"People & Body","description":"family: man, man, boy, boy","unicode_version":"6.0"},{"emoji":"👨‍👨‍👧‍👧","aliases":["family_man_man_girl_girl"],"tags":[],"category":"People & Body","description":"family: man, man, girl, girl","unicode_version":"6.0"},{"emoji":"👩‍👩‍👦","aliases":["family_woman_woman_boy"],"tags":[],"category":"People & Body","description":"family: woman, woman, boy","unicode_version":"6.0"},{"emoji":"👩‍👩‍👧","aliases":["family_woman_woman_girl"],"tags":[],"category":"People & Body","description":"family: woman, woman, girl","unicode_version":"6.0"},{"emoji":"👩‍👩‍👧‍👦","aliases":["family_woman_woman_girl_boy"],"tags":[],"category":"People & Body","description":"family: woman, woman, girl, boy","unicode_version":"6.0"},{"emoji":"👩‍👩‍👦‍👦","aliases":["family_woman_woman_boy_boy"],"tags":[],"category":"People & Body","description":"family: woman, woman, boy, boy","unicode_version":"6.0"},{"emoji":"👩‍👩‍👧‍👧","aliases":["family_woman_woman_girl_girl"],"tags":[],"category":"People & Body","description":"family: woman, woman, girl, girl","unicode_version":"6.0"},{"emoji":"👨‍👦","aliases":["family_man_boy"],"tags":[],"category":"People & Body","description":"family: man, boy","unicode_version":"6.0"},{"emoji":"👨‍👦‍👦","aliases":["family_man_boy_boy"],"tags":[],"category":"People & Body","description":"family: man, boy, boy","unicode_version":"6.0"},{"emoji":"👨‍👧","aliases":["family_man_girl"],"tags":[],"category":"People & Body","description":"family: man, girl","unicode_version":"6.0"},{"emoji":"👨‍👧‍👦","aliases":["family_man_girl_boy"],"tags":[],"category":"People & Body","description":"family: man, girl, boy","unicode_version":"6.0"},{"emoji":"👨‍👧‍👧","aliases":["family_man_girl_girl"],"tags":[],"category":"People & Body","description":"family: man, girl, girl","unicode_version":"6.0"},{"emoji":"👩‍👦","aliases":["family_woman_boy"],"tags":[],"category":"People & Body","description":"family: woman, boy","unicode_version":"6.0"},{"emoji":"👩‍👦‍👦","aliases":["family_woman_boy_boy"],"tags":[],"category":"People & Body","description":"family: woman, boy, boy","unicode_version":"6.0"},{"emoji":"👩‍👧","aliases":["family_woman_girl"],"tags":[],"category":"People & Body","description":"family: woman, girl","unicode_version":"6.0"},{"emoji":"👩‍👧‍👦","aliases":["family_woman_girl_boy"],"tags":[],"category":"People & Body","description":"family: woman, girl, boy","unicode_version":"6.0"},{"emoji":"👩‍👧‍👧","aliases":["family_woman_girl_girl"],"tags":[],"category":"People & Body","description":"family: woman, girl, girl","unicode_version":"6.0"},{"emoji":"🗣️","aliases":["speaking_head"],"tags":[],"category":"People & Body","description":"speaking head","unicode_version":"7.0"},{"emoji":"👤","aliases":["bust_in_silhouette"],"tags":["user"],"category":"People & Body","description":"bust in silhouette","unicode_version":"6.0"},{"emoji":"👥","aliases":["busts_in_silhouette"],"tags":["users","group","team"],"category":"People & Body","description":"busts in silhouette","unicode_version":"6.0"},{"emoji":"🫂","aliases":["people_hugging"],"tags":[],"category":"People & Body","description":"people hugging","unicode_version":"13.0"},{"emoji":"👣","aliases":["footprints"],"tags":["feet","tracks"],"category":"People & Body","description":"footprints","unicode_version":"6.0"},{"emoji":"🐵","aliases":["monkey_face"],"tags":[],"category":"Animals & Nature","description":"monkey face","unicode_version":"6.0"},{"emoji":"🐒","aliases":["monkey"],"tags":[],"category":"Animals & Nature","description":"monkey","unicode_version":"6.0"},{"emoji":"🦍","aliases":["gorilla"],"tags":[],"category":"Animals & Nature","description":"gorilla","unicode_version":"9.0"},{"emoji":"🦧","aliases":["orangutan"],"tags":[],"category":"Animals & Nature","description":"orangutan","unicode_version":"12.0"},{"emoji":"🐶","aliases":["dog"],"tags":["pet"],"category":"Animals & Nature","description":"dog face","unicode_version":"6.0"},{"emoji":"🐕","aliases":["dog2"],"tags":[],"category":"Animals & Nature","description":"dog","unicode_version":"6.0"},{"emoji":"🦮","aliases":["guide_dog"],"tags":[],"category":"Animals & Nature","description":"guide dog","unicode_version":"12.0"},{"emoji":"🐕‍🦺","aliases":["service_dog"],"tags":[],"category":"Animals & Nature","description":"service dog","unicode_version":"12.0"},{"emoji":"🐩","aliases":["poodle"],"tags":["dog"],"category":"Animals & Nature","description":"poodle","unicode_version":"6.0"},{"emoji":"🐺","aliases":["wolf"],"tags":[],"category":"Animals & Nature","description":"wolf","unicode_version":"6.0"},{"emoji":"🦊","aliases":["fox_face"],"tags":[],"category":"Animals & Nature","description":"fox","unicode_version":"9.0"},{"emoji":"🦝","aliases":["raccoon"],"tags":[],"category":"Animals & Nature","description":"raccoon","unicode_version":"11.0"},{"emoji":"🐱","aliases":["cat"],"tags":["pet"],"category":"Animals & Nature","description":"cat face","unicode_version":"6.0"},{"emoji":"🐈","aliases":["cat2"],"tags":[],"category":"Animals & Nature","description":"cat","unicode_version":"6.0"},{"emoji":"🐈‍⬛","aliases":["black_cat"],"tags":[],"category":"Animals & Nature","description":"black cat","unicode_version":"13.0"},{"emoji":"🦁","aliases":["lion"],"tags":[],"category":"Animals & Nature","description":"lion","unicode_version":"8.0"},{"emoji":"🐯","aliases":["tiger"],"tags":[],"category":"Animals & Nature","description":"tiger face","unicode_version":"6.0"},{"emoji":"🐅","aliases":["tiger2"],"tags":[],"category":"Animals & Nature","description":"tiger","unicode_version":"6.0"},{"emoji":"🐆","aliases":["leopard"],"tags":[],"category":"Animals & Nature","description":"leopard","unicode_version":"6.0"},{"emoji":"🐴","aliases":["horse"],"tags":[],"category":"Animals & Nature","description":"horse face","unicode_version":"6.0"},{"emoji":"🐎","aliases":["racehorse"],"tags":["speed"],"category":"Animals & Nature","description":"horse","unicode_version":"6.0"},{"emoji":"🦄","aliases":["unicorn"],"tags":[],"category":"Animals & Nature","description":"unicorn","unicode_version":"8.0"},{"emoji":"🦓","aliases":["zebra"],"tags":[],"category":"Animals & Nature","description":"zebra","unicode_version":"11.0"},{"emoji":"🦌","aliases":["deer"],"tags":[],"category":"Animals & Nature","description":"deer","unicode_version":"9.0"},{"emoji":"🦬","aliases":["bison"],"tags":[],"category":"Animals & Nature","description":"bison","unicode_version":"13.0"},{"emoji":"🐮","aliases":["cow"],"tags":[],"category":"Animals & Nature","description":"cow face","unicode_version":"6.0"},{"emoji":"🐂","aliases":["ox"],"tags":[],"category":"Animals & Nature","description":"ox","unicode_version":"6.0"},{"emoji":"🐃","aliases":["water_buffalo"],"tags":[],"category":"Animals & Nature","description":"water buffalo","unicode_version":"6.0"},{"emoji":"🐄","aliases":["cow2"],"tags":[],"category":"Animals & Nature","description":"cow","unicode_version":"6.0"},{"emoji":"🐷","aliases":["pig"],"tags":[],"category":"Animals & Nature","description":"pig face","unicode_version":"6.0"},{"emoji":"🐖","aliases":["pig2"],"tags":[],"category":"Animals & Nature","description":"pig","unicode_version":"6.0"},{"emoji":"🐗","aliases":["boar"],"tags":[],"category":"Animals & Nature","description":"boar","unicode_version":"6.0"},{"emoji":"🐽","aliases":["pig_nose"],"tags":[],"category":"Animals & Nature","description":"pig nose","unicode_version":"6.0"},{"emoji":"🐏","aliases":["ram"],"tags":[],"category":"Animals & Nature","description":"ram","unicode_version":"6.0"},{"emoji":"🐑","aliases":["sheep"],"tags":[],"category":"Animals & Nature","description":"ewe","unicode_version":"6.0"},{"emoji":"🐐","aliases":["goat"],"tags":[],"category":"Animals & Nature","description":"goat","unicode_version":"6.0"},{"emoji":"🐪","aliases":["dromedary_camel"],"tags":["desert"],"category":"Animals & Nature","description":"camel","unicode_version":"6.0"},{"emoji":"🐫","aliases":["camel"],"tags":[],"category":"Animals & Nature","description":"two-hump camel","unicode_version":"6.0"},{"emoji":"🦙","aliases":["llama"],"tags":[],"category":"Animals & Nature","description":"llama","unicode_version":"11.0"},{"emoji":"🦒","aliases":["giraffe"],"tags":[],"category":"Animals & Nature","description":"giraffe","unicode_version":"11.0"},{"emoji":"🐘","aliases":["elephant"],"tags":[],"category":"Animals & Nature","description":"elephant","unicode_version":"6.0"},{"emoji":"🦣","aliases":["mammoth"],"tags":[],"category":"Animals & Nature","description":"mammoth","unicode_version":"13.0"},{"emoji":"🦏","aliases":["rhinoceros"],"tags":[],"category":"Animals & Nature","description":"rhinoceros","unicode_version":"9.0"},{"emoji":"🦛","aliases":["hippopotamus"],"tags":[],"category":"Animals & Nature","description":"hippopotamus","unicode_version":"11.0"},{"emoji":"🐭","aliases":["mouse"],"tags":[],"category":"Animals & Nature","description":"mouse face","unicode_version":"6.0"},{"emoji":"🐁","aliases":["mouse2"],"tags":[],"category":"Animals & Nature","description":"mouse","unicode_version":"6.0"},{"emoji":"🐀","aliases":["rat"],"tags":[],"category":"Animals & Nature","description":"rat","unicode_version":"6.0"},{"emoji":"🐹","aliases":["hamster"],"tags":["pet"],"category":"Animals & Nature","description":"hamster","unicode_version":"6.0"},{"emoji":"🐰","aliases":["rabbit"],"tags":["bunny"],"category":"Animals & Nature","description":"rabbit face","unicode_version":"6.0"},{"emoji":"🐇","aliases":["rabbit2"],"tags":[],"category":"Animals & Nature","description":"rabbit","unicode_version":"6.0"},{"emoji":"🐿️","aliases":["chipmunk"],"tags":[],"category":"Animals & Nature","description":"chipmunk","unicode_version":"7.0"},{"emoji":"🦫","aliases":["beaver"],"tags":[],"category":"Animals & Nature","description":"beaver","unicode_version":"13.0"},{"emoji":"🦔","aliases":["hedgehog"],"tags":[],"category":"Animals & Nature","description":"hedgehog","unicode_version":"11.0"},{"emoji":"🦇","aliases":["bat"],"tags":[],"category":"Animals & Nature","description":"bat","unicode_version":"9.0"},{"emoji":"🐻","aliases":["bear"],"tags":[],"category":"Animals & Nature","description":"bear","unicode_version":"6.0"},{"emoji":"🐻‍❄️","aliases":["polar_bear"],"tags":[],"category":"Animals & Nature","description":"polar bear","unicode_version":"13.0"},{"emoji":"🐨","aliases":["koala"],"tags":[],"category":"Animals & Nature","description":"koala","unicode_version":"6.0"},{"emoji":"🐼","aliases":["panda_face"],"tags":[],"category":"Animals & Nature","description":"panda","unicode_version":"6.0"},{"emoji":"🦥","aliases":["sloth"],"tags":[],"category":"Animals & Nature","description":"sloth","unicode_version":"12.0"},{"emoji":"🦦","aliases":["otter"],"tags":[],"category":"Animals & Nature","description":"otter","unicode_version":"12.0"},{"emoji":"🦨","aliases":["skunk"],"tags":[],"category":"Animals & Nature","description":"skunk","unicode_version":"12.0"},{"emoji":"🦘","aliases":["kangaroo"],"tags":[],"category":"Animals & Nature","description":"kangaroo","unicode_version":"11.0"},{"emoji":"🦡","aliases":["badger"],"tags":[],"category":"Animals & Nature","description":"badger","unicode_version":"11.0"},{"emoji":"🐾","aliases":["feet","paw_prints"],"tags":[],"category":"Animals & Nature","description":"paw prints","unicode_version":"6.0"},{"emoji":"🦃","aliases":["turkey"],"tags":["thanksgiving"],"category":"Animals & Nature","description":"turkey","unicode_version":"8.0"},{"emoji":"🐔","aliases":["chicken"],"tags":[],"category":"Animals & Nature","description":"chicken","unicode_version":"6.0"},{"emoji":"🐓","aliases":["rooster"],"tags":[],"category":"Animals & Nature","description":"rooster","unicode_version":"6.0"},{"emoji":"🐣","aliases":["hatching_chick"],"tags":[],"category":"Animals & Nature","description":"hatching chick","unicode_version":"6.0"},{"emoji":"🐤","aliases":["baby_chick"],"tags":[],"category":"Animals & Nature","description":"baby chick","unicode_version":"6.0"},{"emoji":"🐥","aliases":["hatched_chick"],"tags":[],"category":"Animals & Nature","description":"front-facing baby chick","unicode_version":"6.0"},{"emoji":"🐦","aliases":["bird"],"tags":[],"category":"Animals & Nature","description":"bird","unicode_version":"6.0"},{"emoji":"🐧","aliases":["penguin"],"tags":[],"category":"Animals & Nature","description":"penguin","unicode_version":"6.0"},{"emoji":"🕊️","aliases":["dove"],"tags":["peace"],"category":"Animals & Nature","description":"dove","unicode_version":"7.0"},{"emoji":"🦅","aliases":["eagle"],"tags":[],"category":"Animals & Nature","description":"eagle","unicode_version":"9.0"},{"emoji":"🦆","aliases":["duck"],"tags":[],"category":"Animals & Nature","description":"duck","unicode_version":"9.0"},{"emoji":"🦢","aliases":["swan"],"tags":[],"category":"Animals & Nature","description":"swan","unicode_version":"11.0"},{"emoji":"🦉","aliases":["owl"],"tags":[],"category":"Animals & Nature","description":"owl","unicode_version":"9.0"},{"emoji":"🦤","aliases":["dodo"],"tags":[],"category":"Animals & Nature","description":"dodo","unicode_version":"13.0"},{"emoji":"🪶","aliases":["feather"],"tags":[],"category":"Animals & Nature","description":"feather","unicode_version":"13.0"},{"emoji":"🦩","aliases":["flamingo"],"tags":[],"category":"Animals & Nature","description":"flamingo","unicode_version":"12.0"},{"emoji":"🦚","aliases":["peacock"],"tags":[],"category":"Animals & Nature","description":"peacock","unicode_version":"11.0"},{"emoji":"🦜","aliases":["parrot"],"tags":[],"category":"Animals & Nature","description":"parrot","unicode_version":"11.0"},{"emoji":"🐸","aliases":["frog"],"tags":[],"category":"Animals & Nature","description":"frog","unicode_version":"6.0"},{"emoji":"🐊","aliases":["crocodile"],"tags":[],"category":"Animals & Nature","description":"crocodile","unicode_version":"6.0"},{"emoji":"🐢","aliases":["turtle"],"tags":["slow"],"category":"Animals & Nature","description":"turtle","unicode_version":"6.0"},{"emoji":"🦎","aliases":["lizard"],"tags":[],"category":"Animals & Nature","description":"lizard","unicode_version":"9.0"},{"emoji":"🐍","aliases":["snake"],"tags":[],"category":"Animals & Nature","description":"snake","unicode_version":"6.0"},{"emoji":"🐲","aliases":["dragon_face"],"tags":[],"category":"Animals & Nature","description":"dragon face","unicode_version":"6.0"},{"emoji":"🐉","aliases":["dragon"],"tags":[],"category":"Animals & Nature","description":"dragon","unicode_version":"6.0"},{"emoji":"🦕","aliases":["sauropod"],"tags":["dinosaur"],"category":"Animals & Nature","description":"sauropod","unicode_version":"11.0"},{"emoji":"🦖","aliases":["t-rex"],"tags":["dinosaur"],"category":"Animals & Nature","description":"T-Rex","unicode_version":"11.0"},{"emoji":"🐳","aliases":["whale"],"tags":["sea"],"category":"Animals & Nature","description":"spouting whale","unicode_version":"6.0"},{"emoji":"🐋","aliases":["whale2"],"tags":[],"category":"Animals & Nature","description":"whale","unicode_version":"6.0"},{"emoji":"🐬","aliases":["dolphin","flipper"],"tags":[],"category":"Animals & Nature","description":"dolphin","unicode_version":"6.0"},{"emoji":"🦭","aliases":["seal"],"tags":[],"category":"Animals & Nature","description":"seal","unicode_version":"13.0"},{"emoji":"🐟","aliases":["fish"],"tags":[],"category":"Animals & Nature","description":"fish","unicode_version":"6.0"},{"emoji":"🐠","aliases":["tropical_fish"],"tags":[],"category":"Animals & Nature","description":"tropical fish","unicode_version":"6.0"},{"emoji":"🐡","aliases":["blowfish"],"tags":[],"category":"Animals & Nature","description":"blowfish","unicode_version":"6.0"},{"emoji":"🦈","aliases":["shark"],"tags":[],"category":"Animals & Nature","description":"shark","unicode_version":"9.0"},{"emoji":"🐙","aliases":["octopus"],"tags":[],"category":"Animals & Nature","description":"octopus","unicode_version":"6.0"},{"emoji":"🐚","aliases":["shell"],"tags":["sea","beach"],"category":"Animals & Nature","description":"spiral shell","unicode_version":"6.0"},{"emoji":"🐌","aliases":["snail"],"tags":["slow"],"category":"Animals & Nature","description":"snail","unicode_version":"6.0"},{"emoji":"🦋","aliases":["butterfly"],"tags":[],"category":"Animals & Nature","description":"butterfly","unicode_version":"9.0"},{"emoji":"🐛","aliases":["bug"],"tags":[],"category":"Animals & Nature","description":"bug","unicode_version":"6.0"},{"emoji":"🐜","aliases":["ant"],"tags":[],"category":"Animals & Nature","description":"ant","unicode_version":"6.0"},{"emoji":"🐝","aliases":["bee","honeybee"],"tags":[],"category":"Animals & Nature","description":"honeybee","unicode_version":"6.0"},{"emoji":"🪲","aliases":["beetle"],"tags":[],"category":"Animals & Nature","description":"beetle","unicode_version":"13.0"},{"emoji":"🐞","aliases":["lady_beetle"],"tags":["bug"],"category":"Animals & Nature","description":"lady beetle","unicode_version":"6.0"},{"emoji":"🦗","aliases":["cricket"],"tags":[],"category":"Animals & Nature","description":"cricket","unicode_version":"11.0"},{"emoji":"🪳","aliases":["cockroach"],"tags":[],"category":"Animals & Nature","description":"cockroach","unicode_version":"13.0"},{"emoji":"🕷️","aliases":["spider"],"tags":[],"category":"Animals & Nature","description":"spider","unicode_version":"7.0"},{"emoji":"🕸️","aliases":["spider_web"],"tags":[],"category":"Animals & Nature","description":"spider web","unicode_version":"7.0"},{"emoji":"🦂","aliases":["scorpion"],"tags":[],"category":"Animals & Nature","description":"scorpion","unicode_version":"8.0"},{"emoji":"🦟","aliases":["mosquito"],"tags":[],"category":"Animals & Nature","description":"mosquito","unicode_version":"11.0"},{"emoji":"🪰","aliases":["fly"],"tags":[],"category":"Animals & Nature","description":"fly","unicode_version":"13.0"},{"emoji":"🪱","aliases":["worm"],"tags":[],"category":"Animals & Nature","description":"worm","unicode_version":"13.0"},{"emoji":"🦠","aliases":["microbe"],"tags":["germ"],"category":"Animals & Nature","description":"microbe","unicode_version":"11.0"},{"emoji":"💐","aliases":["bouquet"],"tags":["flowers"],"category":"Animals & Nature","description":"bouquet","unicode_version":"6.0"},{"emoji":"🌸","aliases":["cherry_blossom"],"tags":["flower","spring"],"category":"Animals & Nature","description":"cherry blossom","unicode_version":"6.0"},{"emoji":"💮","aliases":["white_flower"],"tags":[],"category":"Animals & Nature","description":"white flower","unicode_version":"6.0"},{"emoji":"🏵️","aliases":["rosette"],"tags":[],"category":"Animals & Nature","description":"rosette","unicode_version":"7.0"},{"emoji":"🌹","aliases":["rose"],"tags":["flower"],"category":"Animals & Nature","description":"rose","unicode_version":"6.0"},{"emoji":"🥀","aliases":["wilted_flower"],"tags":[],"category":"Animals & Nature","description":"wilted flower","unicode_version":"9.0"},{"emoji":"🌺","aliases":["hibiscus"],"tags":[],"category":"Animals & Nature","description":"hibiscus","unicode_version":"6.0"},{"emoji":"🌻","aliases":["sunflower"],"tags":[],"category":"Animals & Nature","description":"sunflower","unicode_version":"6.0"},{"emoji":"🌼","aliases":["blossom"],"tags":[],"category":"Animals & Nature","description":"blossom","unicode_version":"6.0"},{"emoji":"🌷","aliases":["tulip"],"tags":["flower"],"category":"Animals & Nature","description":"tulip","unicode_version":"6.0"},{"emoji":"🌱","aliases":["seedling"],"tags":["plant"],"category":"Animals & Nature","description":"seedling","unicode_version":"6.0"},{"emoji":"🪴","aliases":["potted_plant"],"tags":[],"category":"Animals & Nature","description":"potted plant","unicode_version":"13.0"},{"emoji":"🌲","aliases":["evergreen_tree"],"tags":["wood"],"category":"Animals & Nature","description":"evergreen tree","unicode_version":"6.0"},{"emoji":"🌳","aliases":["deciduous_tree"],"tags":["wood"],"category":"Animals & Nature","description":"deciduous tree","unicode_version":"6.0"},{"emoji":"🌴","aliases":["palm_tree"],"tags":[],"category":"Animals & Nature","description":"palm tree","unicode_version":"6.0"},{"emoji":"🌵","aliases":["cactus"],"tags":[],"category":"Animals & Nature","description":"cactus","unicode_version":"6.0"},{"emoji":"🌾","aliases":["ear_of_rice"],"tags":[],"category":"Animals & Nature","description":"sheaf of rice","unicode_version":"6.0"},{"emoji":"🌿","aliases":["herb"],"tags":[],"category":"Animals & Nature","description":"herb","unicode_version":"6.0"},{"emoji":"☘️","aliases":["shamrock"],"tags":[],"category":"Animals & Nature","description":"shamrock","unicode_version":"4.1"},{"emoji":"🍀","aliases":["four_leaf_clover"],"tags":["luck"],"category":"Animals & Nature","description":"four leaf clover","unicode_version":"6.0"},{"emoji":"🍁","aliases":["maple_leaf"],"tags":["canada"],"category":"Animals & Nature","description":"maple leaf","unicode_version":"6.0"},{"emoji":"🍂","aliases":["fallen_leaf"],"tags":["autumn"],"category":"Animals & Nature","description":"fallen leaf","unicode_version":"6.0"},{"emoji":"🍃","aliases":["leaves"],"tags":["leaf"],"category":"Animals & Nature","description":"leaf fluttering in wind","unicode_version":"6.0"},{"emoji":"🍇","aliases":["grapes"],"tags":[],"category":"Food & Drink","description":"grapes","unicode_version":"6.0"},{"emoji":"🍈","aliases":["melon"],"tags":[],"category":"Food & Drink","description":"melon","unicode_version":"6.0"},{"emoji":"🍉","aliases":["watermelon"],"tags":[],"category":"Food & Drink","description":"watermelon","unicode_version":"6.0"},{"emoji":"🍊","aliases":["tangerine","orange","mandarin"],"tags":[],"category":"Food & Drink","description":"tangerine","unicode_version":"6.0"},{"emoji":"🍋","aliases":["lemon"],"tags":[],"category":"Food & Drink","description":"lemon","unicode_version":"6.0"},{"emoji":"🍌","aliases":["banana"],"tags":["fruit"],"category":"Food & Drink","description":"banana","unicode_version":"6.0"},{"emoji":"🍍","aliases":["pineapple"],"tags":[],"category":"Food & Drink","description":"pineapple","unicode_version":"6.0"},{"emoji":"🥭","aliases":["mango"],"tags":[],"category":"Food & Drink","description":"mango","unicode_version":"11.0"},{"emoji":"🍎","aliases":["apple"],"tags":[],"category":"Food & Drink","description":"red apple","unicode_version":"6.0"},{"emoji":"🍏","aliases":["green_apple"],"tags":["fruit"],"category":"Food & Drink","description":"green apple","unicode_version":"6.0"},{"emoji":"🍐","aliases":["pear"],"tags":[],"category":"Food & Drink","description":"pear","unicode_version":"6.0"},{"emoji":"🍑","aliases":["peach"],"tags":[],"category":"Food & Drink","description":"peach","unicode_version":"6.0"},{"emoji":"🍒","aliases":["cherries"],"tags":["fruit"],"category":"Food & Drink","description":"cherries","unicode_version":"6.0"},{"emoji":"🍓","aliases":["strawberry"],"tags":["fruit"],"category":"Food & Drink","description":"strawberry","unicode_version":"6.0"},{"emoji":"🫐","aliases":["blueberries"],"tags":[],"category":"Food & Drink","description":"blueberries","unicode_version":"13.0"},{"emoji":"🥝","aliases":["kiwi_fruit"],"tags":[],"category":"Food & Drink","description":"kiwi fruit","unicode_version":"9.0"},{"emoji":"🍅","aliases":["tomato"],"tags":[],"category":"Food & Drink","description":"tomato","unicode_version":"6.0"},{"emoji":"🫒","aliases":["olive"],"tags":[],"category":"Food & Drink","description":"olive","unicode_version":"13.0"},{"emoji":"🥥","aliases":["coconut"],"tags":[],"category":"Food & Drink","description":"coconut","unicode_version":"11.0"},{"emoji":"🥑","aliases":["avocado"],"tags":[],"category":"Food & Drink","description":"avocado","unicode_version":"9.0"},{"emoji":"🍆","aliases":["eggplant"],"tags":["aubergine"],"category":"Food & Drink","description":"eggplant","unicode_version":"6.0"},{"emoji":"🥔","aliases":["potato"],"tags":[],"category":"Food & Drink","description":"potato","unicode_version":"9.0"},{"emoji":"🥕","aliases":["carrot"],"tags":[],"category":"Food & Drink","description":"carrot","unicode_version":"9.0"},{"emoji":"🌽","aliases":["corn"],"tags":[],"category":"Food & Drink","description":"ear of corn","unicode_version":"6.0"},{"emoji":"🌶️","aliases":["hot_pepper"],"tags":["spicy"],"category":"Food & Drink","description":"hot pepper","unicode_version":"7.0"},{"emoji":"🫑","aliases":["bell_pepper"],"tags":[],"category":"Food & Drink","description":"bell pepper","unicode_version":"13.0"},{"emoji":"🥒","aliases":["cucumber"],"tags":[],"category":"Food & Drink","description":"cucumber","unicode_version":"9.0"},{"emoji":"🥬","aliases":["leafy_green"],"tags":[],"category":"Food & Drink","description":"leafy green","unicode_version":"11.0"},{"emoji":"🥦","aliases":["broccoli"],"tags":[],"category":"Food & Drink","description":"broccoli","unicode_version":"11.0"},{"emoji":"🧄","aliases":["garlic"],"tags":[],"category":"Food & Drink","description":"garlic","unicode_version":"12.0"},{"emoji":"🧅","aliases":["onion"],"tags":[],"category":"Food & Drink","description":"onion","unicode_version":"12.0"},{"emoji":"🍄","aliases":["mushroom"],"tags":[],"category":"Food & Drink","description":"mushroom","unicode_version":"6.0"},{"emoji":"🥜","aliases":["peanuts"],"tags":[],"category":"Food & Drink","description":"peanuts","unicode_version":"9.0"},{"emoji":"🌰","aliases":["chestnut"],"tags":[],"category":"Food & Drink","description":"chestnut","unicode_version":"6.0"},{"emoji":"🍞","aliases":["bread"],"tags":["toast"],"category":"Food & Drink","description":"bread","unicode_version":"6.0"},{"emoji":"🥐","aliases":["croissant"],"tags":[],"category":"Food & Drink","description":"croissant","unicode_version":"9.0"},{"emoji":"🥖","aliases":["baguette_bread"],"tags":[],"category":"Food & Drink","description":"baguette bread","unicode_version":"9.0"},{"emoji":"🫓","aliases":["flatbread"],"tags":[],"category":"Food & Drink","description":"flatbread","unicode_version":"13.0"},{"emoji":"🥨","aliases":["pretzel"],"tags":[],"category":"Food & Drink","description":"pretzel","unicode_version":"11.0"},{"emoji":"🥯","aliases":["bagel"],"tags":[],"category":"Food & Drink","description":"bagel","unicode_version":"11.0"},{"emoji":"🥞","aliases":["pancakes"],"tags":[],"category":"Food & Drink","description":"pancakes","unicode_version":"9.0"},{"emoji":"🧇","aliases":["waffle"],"tags":[],"category":"Food & Drink","description":"waffle","unicode_version":"12.0"},{"emoji":"🧀","aliases":["cheese"],"tags":[],"category":"Food & Drink","description":"cheese wedge","unicode_version":"8.0"},{"emoji":"🍖","aliases":["meat_on_bone"],"tags":[],"category":"Food & Drink","description":"meat on bone","unicode_version":"6.0"},{"emoji":"🍗","aliases":["poultry_leg"],"tags":["meat","chicken"],"category":"Food & Drink","description":"poultry leg","unicode_version":"6.0"},{"emoji":"🥩","aliases":["cut_of_meat"],"tags":[],"category":"Food & Drink","description":"cut of meat","unicode_version":"11.0"},{"emoji":"🥓","aliases":["bacon"],"tags":[],"category":"Food & Drink","description":"bacon","unicode_version":"9.0"},{"emoji":"🍔","aliases":["hamburger"],"tags":["burger"],"category":"Food & Drink","description":"hamburger","unicode_version":"6.0"},{"emoji":"🍟","aliases":["fries"],"tags":[],"category":"Food & Drink","description":"french fries","unicode_version":"6.0"},{"emoji":"🍕","aliases":["pizza"],"tags":[],"category":"Food & Drink","description":"pizza","unicode_version":"6.0"},{"emoji":"🌭","aliases":["hotdog"],"tags":[],"category":"Food & Drink","description":"hot dog","unicode_version":"8.0"},{"emoji":"🥪","aliases":["sandwich"],"tags":[],"category":"Food & Drink","description":"sandwich","unicode_version":"11.0"},{"emoji":"🌮","aliases":["taco"],"tags":[],"category":"Food & Drink","description":"taco","unicode_version":"8.0"},{"emoji":"🌯","aliases":["burrito"],"tags":[],"category":"Food & Drink","description":"burrito","unicode_version":"8.0"},{"emoji":"🫔","aliases":["tamale"],"tags":[],"category":"Food & Drink","description":"tamale","unicode_version":"13.0"},{"emoji":"🥙","aliases":["stuffed_flatbread"],"tags":[],"category":"Food & Drink","description":"stuffed flatbread","unicode_version":"9.0"},{"emoji":"🧆","aliases":["falafel"],"tags":[],"category":"Food & Drink","description":"falafel","unicode_version":"12.0"},{"emoji":"🥚","aliases":["egg"],"tags":[],"category":"Food & Drink","description":"egg","unicode_version":"9.0"},{"emoji":"🍳","aliases":["fried_egg"],"tags":["breakfast"],"category":"Food & Drink","description":"cooking","unicode_version":"6.0"},{"emoji":"🥘","aliases":["shallow_pan_of_food"],"tags":["paella","curry"],"category":"Food & Drink","description":"shallow pan of food","unicode_version":""},{"emoji":"🍲","aliases":["stew"],"tags":[],"category":"Food & Drink","description":"pot of food","unicode_version":"6.0"},{"emoji":"🫕","aliases":["fondue"],"tags":[],"category":"Food & Drink","description":"fondue","unicode_version":"13.0"},{"emoji":"🥣","aliases":["bowl_with_spoon"],"tags":[],"category":"Food & Drink","description":"bowl with spoon","unicode_version":"11.0"},{"emoji":"🥗","aliases":["green_salad"],"tags":[],"category":"Food & Drink","description":"green salad","unicode_version":"9.0"},{"emoji":"🍿","aliases":["popcorn"],"tags":[],"category":"Food & Drink","description":"popcorn","unicode_version":"8.0"},{"emoji":"🧈","aliases":["butter"],"tags":[],"category":"Food & Drink","description":"butter","unicode_version":"12.0"},{"emoji":"🧂","aliases":["salt"],"tags":[],"category":"Food & Drink","description":"salt","unicode_version":"11.0"},{"emoji":"🥫","aliases":["canned_food"],"tags":[],"category":"Food & Drink","description":"canned food","unicode_version":"11.0"},{"emoji":"🍱","aliases":["bento"],"tags":[],"category":"Food & Drink","description":"bento box","unicode_version":"6.0"},{"emoji":"🍘","aliases":["rice_cracker"],"tags":[],"category":"Food & Drink","description":"rice cracker","unicode_version":"6.0"},{"emoji":"🍙","aliases":["rice_ball"],"tags":[],"category":"Food & Drink","description":"rice ball","unicode_version":"6.0"},{"emoji":"🍚","aliases":["rice"],"tags":[],"category":"Food & Drink","description":"cooked rice","unicode_version":"6.0"},{"emoji":"🍛","aliases":["curry"],"tags":[],"category":"Food & Drink","description":"curry rice","unicode_version":"6.0"},{"emoji":"🍜","aliases":["ramen"],"tags":["noodle"],"category":"Food & Drink","description":"steaming bowl","unicode_version":"6.0"},{"emoji":"🍝","aliases":["spaghetti"],"tags":["pasta"],"category":"Food & Drink","description":"spaghetti","unicode_version":"6.0"},{"emoji":"🍠","aliases":["sweet_potato"],"tags":[],"category":"Food & Drink","description":"roasted sweet potato","unicode_version":"6.0"},{"emoji":"🍢","aliases":["oden"],"tags":[],"category":"Food & Drink","description":"oden","unicode_version":"6.0"},{"emoji":"🍣","aliases":["sushi"],"tags":[],"category":"Food & Drink","description":"sushi","unicode_version":"6.0"},{"emoji":"🍤","aliases":["fried_shrimp"],"tags":["tempura"],"category":"Food & Drink","description":"fried shrimp","unicode_version":"6.0"},{"emoji":"🍥","aliases":["fish_cake"],"tags":[],"category":"Food & Drink","description":"fish cake with swirl","unicode_version":"6.0"},{"emoji":"🥮","aliases":["moon_cake"],"tags":[],"category":"Food & Drink","description":"moon cake","unicode_version":"11.0"},{"emoji":"🍡","aliases":["dango"],"tags":[],"category":"Food & Drink","description":"dango","unicode_version":"6.0"},{"emoji":"🥟","aliases":["dumpling"],"tags":[],"category":"Food & Drink","description":"dumpling","unicode_version":"11.0"},{"emoji":"🥠","aliases":["fortune_cookie"],"tags":[],"category":"Food & Drink","description":"fortune cookie","unicode_version":"11.0"},{"emoji":"🥡","aliases":["takeout_box"],"tags":[],"category":"Food & Drink","description":"takeout box","unicode_version":"11.0"},{"emoji":"🦀","aliases":["crab"],"tags":[],"category":"Food & Drink","description":"crab","unicode_version":"8.0"},{"emoji":"🦞","aliases":["lobster"],"tags":[],"category":"Food & Drink","description":"lobster","unicode_version":"11.0"},{"emoji":"🦐","aliases":["shrimp"],"tags":[],"category":"Food & Drink","description":"shrimp","unicode_version":"9.0"},{"emoji":"🦑","aliases":["squid"],"tags":[],"category":"Food & Drink","description":"squid","unicode_version":"9.0"},{"emoji":"🦪","aliases":["oyster"],"tags":[],"category":"Food & Drink","description":"oyster","unicode_version":"12.0"},{"emoji":"🍦","aliases":["icecream"],"tags":[],"category":"Food & Drink","description":"soft ice cream","unicode_version":"6.0"},{"emoji":"🍧","aliases":["shaved_ice"],"tags":[],"category":"Food & Drink","description":"shaved ice","unicode_version":"6.0"},{"emoji":"🍨","aliases":["ice_cream"],"tags":[],"category":"Food & Drink","description":"ice cream","unicode_version":"6.0"},{"emoji":"🍩","aliases":["doughnut"],"tags":[],"category":"Food & Drink","description":"doughnut","unicode_version":"6.0"},{"emoji":"🍪","aliases":["cookie"],"tags":[],"category":"Food & Drink","description":"cookie","unicode_version":"6.0"},{"emoji":"🎂","aliases":["birthday"],"tags":["party"],"category":"Food & Drink","description":"birthday cake","unicode_version":"6.0"},{"emoji":"🍰","aliases":["cake"],"tags":["dessert"],"category":"Food & Drink","description":"shortcake","unicode_version":"6.0"},{"emoji":"🧁","aliases":["cupcake"],"tags":[],"category":"Food & Drink","description":"cupcake","unicode_version":"11.0"},{"emoji":"🥧","aliases":["pie"],"tags":[],"category":"Food & Drink","description":"pie","unicode_version":"11.0"},{"emoji":"🍫","aliases":["chocolate_bar"],"tags":[],"category":"Food & Drink","description":"chocolate bar","unicode_version":"6.0"},{"emoji":"🍬","aliases":["candy"],"tags":["sweet"],"category":"Food & Drink","description":"candy","unicode_version":"6.0"},{"emoji":"🍭","aliases":["lollipop"],"tags":[],"category":"Food & Drink","description":"lollipop","unicode_version":"6.0"},{"emoji":"🍮","aliases":["custard"],"tags":[],"category":"Food & Drink","description":"custard","unicode_version":"6.0"},{"emoji":"🍯","aliases":["honey_pot"],"tags":[],"category":"Food & Drink","description":"honey pot","unicode_version":"6.0"},{"emoji":"🍼","aliases":["baby_bottle"],"tags":["milk"],"category":"Food & Drink","description":"baby bottle","unicode_version":"6.0"},{"emoji":"🥛","aliases":["milk_glass"],"tags":[],"category":"Food & Drink","description":"glass of milk","unicode_version":"9.0"},{"emoji":"☕","aliases":["coffee"],"tags":["cafe","espresso"],"category":"Food & Drink","description":"hot beverage","unicode_version":"4.0"},{"emoji":"🫖","aliases":["teapot"],"tags":[],"category":"Food & Drink","description":"teapot","unicode_version":"13.0"},{"emoji":"🍵","aliases":["tea"],"tags":["green","breakfast"],"category":"Food & Drink","description":"teacup without handle","unicode_version":"6.0"},{"emoji":"🍶","aliases":["sake"],"tags":[],"category":"Food & Drink","description":"sake","unicode_version":"6.0"},{"emoji":"🍾","aliases":["champagne"],"tags":["bottle","bubbly","celebration"],"category":"Food & Drink","description":"bottle with popping cork","unicode_version":"8.0"},{"emoji":"🍷","aliases":["wine_glass"],"tags":[],"category":"Food & Drink","description":"wine glass","unicode_version":"6.0"},{"emoji":"🍸","aliases":["cocktail"],"tags":["drink"],"category":"Food & Drink","description":"cocktail glass","unicode_version":"6.0"},{"emoji":"🍹","aliases":["tropical_drink"],"tags":["summer","vacation"],"category":"Food & Drink","description":"tropical drink","unicode_version":"6.0"},{"emoji":"🍺","aliases":["beer"],"tags":["drink"],"category":"Food & Drink","description":"beer mug","unicode_version":"6.0"},{"emoji":"🍻","aliases":["beers"],"tags":["drinks"],"category":"Food & Drink","description":"clinking beer mugs","unicode_version":"6.0"},{"emoji":"🥂","aliases":["clinking_glasses"],"tags":["cheers","toast"],"category":"Food & Drink","description":"clinking glasses","unicode_version":"9.0"},{"emoji":"🥃","aliases":["tumbler_glass"],"tags":["whisky"],"category":"Food & Drink","description":"tumbler glass","unicode_version":"9.0"},{"emoji":"🥤","aliases":["cup_with_straw"],"tags":[],"category":"Food & Drink","description":"cup with straw","unicode_version":"11.0"},{"emoji":"🧋","aliases":["bubble_tea"],"tags":[],"category":"Food & Drink","description":"bubble tea","unicode_version":"13.0"},{"emoji":"🧃","aliases":["beverage_box"],"tags":[],"category":"Food & Drink","description":"beverage box","unicode_version":"12.0"},{"emoji":"🧉","aliases":["mate"],"tags":[],"category":"Food & Drink","description":"mate","unicode_version":"12.0"},{"emoji":"🧊","aliases":["ice_cube"],"tags":[],"category":"Food & Drink","description":"ice","unicode_version":"12.0"},{"emoji":"🥢","aliases":["chopsticks"],"tags":[],"category":"Food & Drink","description":"chopsticks","unicode_version":"11.0"},{"emoji":"🍽️","aliases":["plate_with_cutlery"],"tags":["dining","dinner"],"category":"Food & Drink","description":"fork and knife with plate","unicode_version":"7.0"},{"emoji":"🍴","aliases":["fork_and_knife"],"tags":["cutlery"],"category":"Food & Drink","description":"fork and knife","unicode_version":"6.0"},{"emoji":"🥄","aliases":["spoon"],"tags":[],"category":"Food & Drink","description":"spoon","unicode_version":"9.0"},{"emoji":"🔪","aliases":["hocho","knife"],"tags":["cut","chop"],"category":"Food & Drink","description":"kitchen knife","unicode_version":"6.0"},{"emoji":"🏺","aliases":["amphora"],"tags":[],"category":"Food & Drink","description":"amphora","unicode_version":"8.0"},{"emoji":"🌍","aliases":["earth_africa"],"tags":["globe","world","international"],"category":"Travel & Places","description":"globe showing Europe-Africa","unicode_version":"6.0"},{"emoji":"🌎","aliases":["earth_americas"],"tags":["globe","world","international"],"category":"Travel & Places","description":"globe showing Americas","unicode_version":"6.0"},{"emoji":"🌏","aliases":["earth_asia"],"tags":["globe","world","international"],"category":"Travel & Places","description":"globe showing Asia-Australia","unicode_version":"6.0"},{"emoji":"🌐","aliases":["globe_with_meridians"],"tags":["world","global","international"],"category":"Travel & Places","description":"globe with meridians","unicode_version":"6.0"},{"emoji":"🗺️","aliases":["world_map"],"tags":["travel"],"category":"Travel & Places","description":"world map","unicode_version":"7.0"},{"emoji":"🗾","aliases":["japan"],"tags":[],"category":"Travel & Places","description":"map of Japan","unicode_version":"6.0"},{"emoji":"🧭","aliases":["compass"],"tags":[],"category":"Travel & Places","description":"compass","unicode_version":"11.0"},{"emoji":"🏔️","aliases":["mountain_snow"],"tags":[],"category":"Travel & Places","description":"snow-capped mountain","unicode_version":"7.0"},{"emoji":"⛰️","aliases":["mountain"],"tags":[],"category":"Travel & Places","description":"mountain","unicode_version":"5.2"},{"emoji":"🌋","aliases":["volcano"],"tags":[],"category":"Travel & Places","description":"volcano","unicode_version":"6.0"},{"emoji":"🗻","aliases":["mount_fuji"],"tags":[],"category":"Travel & Places","description":"mount fuji","unicode_version":"6.0"},{"emoji":"🏕️","aliases":["camping"],"tags":[],"category":"Travel & Places","description":"camping","unicode_version":"7.0"},{"emoji":"🏖️","aliases":["beach_umbrella"],"tags":[],"category":"Travel & Places","description":"beach with umbrella","unicode_version":"7.0"},{"emoji":"🏜️","aliases":["desert"],"tags":[],"category":"Travel & Places","description":"desert","unicode_version":"7.0"},{"emoji":"🏝️","aliases":["desert_island"],"tags":[],"category":"Travel & Places","description":"desert island","unicode_version":"7.0"},{"emoji":"🏞️","aliases":["national_park"],"tags":[],"category":"Travel & Places","description":"national park","unicode_version":"7.0"},{"emoji":"🏟️","aliases":["stadium"],"tags":[],"category":"Travel & Places","description":"stadium","unicode_version":"7.0"},{"emoji":"🏛️","aliases":["classical_building"],"tags":[],"category":"Travel & Places","description":"classical building","unicode_version":"7.0"},{"emoji":"🏗️","aliases":["building_construction"],"tags":[],"category":"Travel & Places","description":"building construction","unicode_version":"7.0"},{"emoji":"🧱","aliases":["bricks"],"tags":[],"category":"Travel & Places","description":"brick","unicode_version":"11.0"},{"emoji":"🪨","aliases":["rock"],"tags":[],"category":"Travel & Places","description":"rock","unicode_version":"13.0"},{"emoji":"🪵","aliases":["wood"],"tags":[],"category":"Travel & Places","description":"wood","unicode_version":"13.0"},{"emoji":"🛖","aliases":["hut"],"tags":[],"category":"Travel & Places","description":"hut","unicode_version":"13.0"},{"emoji":"🏘️","aliases":["houses"],"tags":[],"category":"Travel & Places","description":"houses","unicode_version":"7.0"},{"emoji":"🏚️","aliases":["derelict_house"],"tags":[],"category":"Travel & Places","description":"derelict house","unicode_version":"7.0"},{"emoji":"🏠","aliases":["house"],"tags":[],"category":"Travel & Places","description":"house","unicode_version":"6.0"},{"emoji":"🏡","aliases":["house_with_garden"],"tags":[],"category":"Travel & Places","description":"house with garden","unicode_version":"6.0"},{"emoji":"🏢","aliases":["office"],"tags":[],"category":"Travel & Places","description":"office building","unicode_version":"6.0"},{"emoji":"🏣","aliases":["post_office"],"tags":[],"category":"Travel & Places","description":"Japanese post office","unicode_version":"6.0"},{"emoji":"🏤","aliases":["european_post_office"],"tags":[],"category":"Travel & Places","description":"post office","unicode_version":"6.0"},{"emoji":"🏥","aliases":["hospital"],"tags":[],"category":"Travel & Places","description":"hospital","unicode_version":"6.0"},{"emoji":"🏦","aliases":["bank"],"tags":[],"category":"Travel & Places","description":"bank","unicode_version":"6.0"},{"emoji":"🏨","aliases":["hotel"],"tags":[],"category":"Travel & Places","description":"hotel","unicode_version":"6.0"},{"emoji":"🏩","aliases":["love_hotel"],"tags":[],"category":"Travel & Places","description":"love hotel","unicode_version":"6.0"},{"emoji":"🏪","aliases":["convenience_store"],"tags":[],"category":"Travel & Places","description":"convenience store","unicode_version":"6.0"},{"emoji":"🏫","aliases":["school"],"tags":[],"category":"Travel & Places","description":"school","unicode_version":"6.0"},{"emoji":"🏬","aliases":["department_store"],"tags":[],"category":"Travel & Places","description":"department store","unicode_version":"6.0"},{"emoji":"🏭","aliases":["factory"],"tags":[],"category":"Travel & Places","description":"factory","unicode_version":"6.0"},{"emoji":"🏯","aliases":["japanese_castle"],"tags":[],"category":"Travel & Places","description":"Japanese castle","unicode_version":"6.0"},{"emoji":"🏰","aliases":["european_castle"],"tags":[],"category":"Travel & Places","description":"castle","unicode_version":"6.0"},{"emoji":"💒","aliases":["wedding"],"tags":["marriage"],"category":"Travel & Places","description":"wedding","unicode_version":"6.0"},{"emoji":"🗼","aliases":["tokyo_tower"],"tags":[],"category":"Travel & Places","description":"Tokyo tower","unicode_version":"6.0"},{"emoji":"🗽","aliases":["statue_of_liberty"],"tags":[],"category":"Travel & Places","description":"Statue of Liberty","unicode_version":"6.0"},{"emoji":"⛪","aliases":["church"],"tags":[],"category":"Travel & Places","description":"church","unicode_version":"5.2"},{"emoji":"🕌","aliases":["mosque"],"tags":[],"category":"Travel & Places","description":"mosque","unicode_version":"8.0"},{"emoji":"🛕","aliases":["hindu_temple"],"tags":[],"category":"Travel & Places","description":"hindu temple","unicode_version":"12.0"},{"emoji":"🕍","aliases":["synagogue"],"tags":[],"category":"Travel & Places","description":"synagogue","unicode_version":"8.0"},{"emoji":"⛩️","aliases":["shinto_shrine"],"tags":[],"category":"Travel & Places","description":"shinto shrine","unicode_version":"5.2"},{"emoji":"🕋","aliases":["kaaba"],"tags":[],"category":"Travel & Places","description":"kaaba","unicode_version":"8.0"},{"emoji":"⛲","aliases":["fountain"],"tags":[],"category":"Travel & Places","description":"fountain","unicode_version":"5.2"},{"emoji":"⛺","aliases":["tent"],"tags":["camping"],"category":"Travel & Places","description":"tent","unicode_version":"5.2"},{"emoji":"🌁","aliases":["foggy"],"tags":["karl"],"category":"Travel & Places","description":"foggy","unicode_version":"6.0"},{"emoji":"🌃","aliases":["night_with_stars"],"tags":[],"category":"Travel & Places","description":"night with stars","unicode_version":"6.0"},{"emoji":"🏙️","aliases":["cityscape"],"tags":["skyline"],"category":"Travel & Places","description":"cityscape","unicode_version":"7.0"},{"emoji":"🌄","aliases":["sunrise_over_mountains"],"tags":[],"category":"Travel & Places","description":"sunrise over mountains","unicode_version":"6.0"},{"emoji":"🌅","aliases":["sunrise"],"tags":[],"category":"Travel & Places","description":"sunrise","unicode_version":"6.0"},{"emoji":"🌆","aliases":["city_sunset"],"tags":[],"category":"Travel & Places","description":"cityscape at dusk","unicode_version":"6.0"},{"emoji":"🌇","aliases":["city_sunrise"],"tags":[],"category":"Travel & Places","description":"sunset","unicode_version":"6.0"},{"emoji":"🌉","aliases":["bridge_at_night"],"tags":[],"category":"Travel & Places","description":"bridge at night","unicode_version":"6.0"},{"emoji":"♨️","aliases":["hotsprings"],"tags":[],"category":"Travel & Places","description":"hot springs","unicode_version":""},{"emoji":"🎠","aliases":["carousel_horse"],"tags":[],"category":"Travel & Places","description":"carousel horse","unicode_version":"6.0"},{"emoji":"🎡","aliases":["ferris_wheel"],"tags":[],"category":"Travel & Places","description":"ferris wheel","unicode_version":"6.0"},{"emoji":"🎢","aliases":["roller_coaster"],"tags":[],"category":"Travel & Places","description":"roller coaster","unicode_version":"6.0"},{"emoji":"💈","aliases":["barber"],"tags":[],"category":"Travel & Places","description":"barber pole","unicode_version":"6.0"},{"emoji":"🎪","aliases":["circus_tent"],"tags":[],"category":"Travel & Places","description":"circus tent","unicode_version":"6.0"},{"emoji":"🚂","aliases":["steam_locomotive"],"tags":["train"],"category":"Travel & Places","description":"locomotive","unicode_version":"6.0"},{"emoji":"🚃","aliases":["railway_car"],"tags":[],"category":"Travel & Places","description":"railway car","unicode_version":"6.0"},{"emoji":"🚄","aliases":["bullettrain_side"],"tags":["train"],"category":"Travel & Places","description":"high-speed train","unicode_version":"6.0"},{"emoji":"🚅","aliases":["bullettrain_front"],"tags":["train"],"category":"Travel & Places","description":"bullet train","unicode_version":"6.0"},{"emoji":"🚆","aliases":["train2"],"tags":[],"category":"Travel & Places","description":"train","unicode_version":"6.0"},{"emoji":"🚇","aliases":["metro"],"tags":[],"category":"Travel & Places","description":"metro","unicode_version":"6.0"},{"emoji":"🚈","aliases":["light_rail"],"tags":[],"category":"Travel & Places","description":"light rail","unicode_version":"6.0"},{"emoji":"🚉","aliases":["station"],"tags":[],"category":"Travel & Places","description":"station","unicode_version":"6.0"},{"emoji":"🚊","aliases":["tram"],"tags":[],"category":"Travel & Places","description":"tram","unicode_version":"6.0"},{"emoji":"🚝","aliases":["monorail"],"tags":[],"category":"Travel & Places","description":"monorail","unicode_version":"6.0"},{"emoji":"🚞","aliases":["mountain_railway"],"tags":[],"category":"Travel & Places","description":"mountain railway","unicode_version":"6.0"},{"emoji":"🚋","aliases":["train"],"tags":[],"category":"Travel & Places","description":"tram car","unicode_version":"6.0"},{"emoji":"🚌","aliases":["bus"],"tags":[],"category":"Travel & Places","description":"bus","unicode_version":"6.0"},{"emoji":"🚍","aliases":["oncoming_bus"],"tags":[],"category":"Travel & Places","description":"oncoming bus","unicode_version":"6.0"},{"emoji":"🚎","aliases":["trolleybus"],"tags":[],"category":"Travel & Places","description":"trolleybus","unicode_version":"6.0"},{"emoji":"🚐","aliases":["minibus"],"tags":[],"category":"Travel & Places","description":"minibus","unicode_version":"6.0"},{"emoji":"🚑","aliases":["ambulance"],"tags":[],"category":"Travel & Places","description":"ambulance","unicode_version":"6.0"},{"emoji":"🚒","aliases":["fire_engine"],"tags":[],"category":"Travel & Places","description":"fire engine","unicode_version":"6.0"},{"emoji":"🚓","aliases":["police_car"],"tags":[],"category":"Travel & Places","description":"police car","unicode_version":"6.0"},{"emoji":"🚔","aliases":["oncoming_police_car"],"tags":[],"category":"Travel & Places","description":"oncoming police car","unicode_version":"6.0"},{"emoji":"🚕","aliases":["taxi"],"tags":[],"category":"Travel & Places","description":"taxi","unicode_version":"6.0"},{"emoji":"🚖","aliases":["oncoming_taxi"],"tags":[],"category":"Travel & Places","description":"oncoming taxi","unicode_version":"6.0"},{"emoji":"🚗","aliases":["car","red_car"],"tags":[],"category":"Travel & Places","description":"automobile","unicode_version":"6.0"},{"emoji":"🚘","aliases":["oncoming_automobile"],"tags":[],"category":"Travel & Places","description":"oncoming automobile","unicode_version":"6.0"},{"emoji":"🚙","aliases":["blue_car"],"tags":[],"category":"Travel & Places","description":"sport utility vehicle","unicode_version":"6.0"},{"emoji":"🛻","aliases":["pickup_truck"],"tags":[],"category":"Travel & Places","description":"pickup truck","unicode_version":"13.0"},{"emoji":"🚚","aliases":["truck"],"tags":[],"category":"Travel & Places","description":"delivery truck","unicode_version":"6.0"},{"emoji":"🚛","aliases":["articulated_lorry"],"tags":[],"category":"Travel & Places","description":"articulated lorry","unicode_version":"6.0"},{"emoji":"🚜","aliases":["tractor"],"tags":[],"category":"Travel & Places","description":"tractor","unicode_version":"6.0"},{"emoji":"🏎️","aliases":["racing_car"],"tags":[],"category":"Travel & Places","description":"racing car","unicode_version":"7.0"},{"emoji":"🏍️","aliases":["motorcycle"],"tags":[],"category":"Travel & Places","description":"motorcycle","unicode_version":"7.0"},{"emoji":"🛵","aliases":["motor_scooter"],"tags":[],"category":"Travel & Places","description":"motor scooter","unicode_version":"9.0"},{"emoji":"🦽","aliases":["manual_wheelchair"],"tags":[],"category":"Travel & Places","description":"manual wheelchair","unicode_version":"12.0"},{"emoji":"🦼","aliases":["motorized_wheelchair"],"tags":[],"category":"Travel & Places","description":"motorized wheelchair","unicode_version":"12.0"},{"emoji":"🛺","aliases":["auto_rickshaw"],"tags":[],"category":"Travel & Places","description":"auto rickshaw","unicode_version":"12.0"},{"emoji":"🚲","aliases":["bike"],"tags":["bicycle"],"category":"Travel & Places","description":"bicycle","unicode_version":"6.0"},{"emoji":"🛴","aliases":["kick_scooter"],"tags":[],"category":"Travel & Places","description":"kick scooter","unicode_version":"9.0"},{"emoji":"🛹","aliases":["skateboard"],"tags":[],"category":"Travel & Places","description":"skateboard","unicode_version":"11.0"},{"emoji":"🛼","aliases":["roller_skate"],"tags":[],"category":"Travel & Places","description":"roller skate","unicode_version":"13.0"},{"emoji":"🚏","aliases":["busstop"],"tags":[],"category":"Travel & Places","description":"bus stop","unicode_version":"6.0"},{"emoji":"🛣️","aliases":["motorway"],"tags":[],"category":"Travel & Places","description":"motorway","unicode_version":"7.0"},{"emoji":"🛤️","aliases":["railway_track"],"tags":[],"category":"Travel & Places","description":"railway track","unicode_version":"7.0"},{"emoji":"🛢️","aliases":["oil_drum"],"tags":[],"category":"Travel & Places","description":"oil drum","unicode_version":"7.0"},{"emoji":"⛽","aliases":["fuelpump"],"tags":[],"category":"Travel & Places","description":"fuel pump","unicode_version":"5.2"},{"emoji":"🚨","aliases":["rotating_light"],"tags":["911","emergency"],"category":"Travel & Places","description":"police car light","unicode_version":"6.0"},{"emoji":"🚥","aliases":["traffic_light"],"tags":[],"category":"Travel & Places","description":"horizontal traffic light","unicode_version":"6.0"},{"emoji":"🚦","aliases":["vertical_traffic_light"],"tags":["semaphore"],"category":"Travel & Places","description":"vertical traffic light","unicode_version":"6.0"},{"emoji":"🛑","aliases":["stop_sign"],"tags":[],"category":"Travel & Places","description":"stop sign","unicode_version":"9.0"},{"emoji":"🚧","aliases":["construction"],"tags":["wip"],"category":"Travel & Places","description":"construction","unicode_version":"6.0"},{"emoji":"⚓","aliases":["anchor"],"tags":["ship"],"category":"Travel & Places","description":"anchor","unicode_version":"4.1"},{"emoji":"⛵","aliases":["boat","sailboat"],"tags":[],"category":"Travel & Places","description":"sailboat","unicode_version":"5.2"},{"emoji":"🛶","aliases":["canoe"],"tags":[],"category":"Travel & Places","description":"canoe","unicode_version":"9.0"},{"emoji":"🚤","aliases":["speedboat"],"tags":["ship"],"category":"Travel & Places","description":"speedboat","unicode_version":"6.0"},{"emoji":"🛳️","aliases":["passenger_ship"],"tags":["cruise"],"category":"Travel & Places","description":"passenger ship","unicode_version":"7.0"},{"emoji":"⛴️","aliases":["ferry"],"tags":[],"category":"Travel & Places","description":"ferry","unicode_version":"5.2"},{"emoji":"🛥️","aliases":["motor_boat"],"tags":[],"category":"Travel & Places","description":"motor boat","unicode_version":"7.0"},{"emoji":"🚢","aliases":["ship"],"tags":[],"category":"Travel & Places","description":"ship","unicode_version":"6.0"},{"emoji":"✈️","aliases":["airplane"],"tags":["flight"],"category":"Travel & Places","description":"airplane","unicode_version":""},{"emoji":"🛩️","aliases":["small_airplane"],"tags":["flight"],"category":"Travel & Places","description":"small airplane","unicode_version":"7.0"},{"emoji":"🛫","aliases":["flight_departure"],"tags":[],"category":"Travel & Places","description":"airplane departure","unicode_version":"7.0"},{"emoji":"🛬","aliases":["flight_arrival"],"tags":[],"category":"Travel & Places","description":"airplane arrival","unicode_version":"7.0"},{"emoji":"🪂","aliases":["parachute"],"tags":[],"category":"Travel & Places","description":"parachute","unicode_version":"12.0"},{"emoji":"💺","aliases":["seat"],"tags":[],"category":"Travel & Places","description":"seat","unicode_version":"6.0"},{"emoji":"🚁","aliases":["helicopter"],"tags":[],"category":"Travel & Places","description":"helicopter","unicode_version":"6.0"},{"emoji":"🚟","aliases":["suspension_railway"],"tags":[],"category":"Travel & Places","description":"suspension railway","unicode_version":"6.0"},{"emoji":"🚠","aliases":["mountain_cableway"],"tags":[],"category":"Travel & Places","description":"mountain cableway","unicode_version":"6.0"},{"emoji":"🚡","aliases":["aerial_tramway"],"tags":[],"category":"Travel & Places","description":"aerial tramway","unicode_version":"6.0"},{"emoji":"🛰️","aliases":["artificial_satellite"],"tags":["orbit","space"],"category":"Travel & Places","description":"satellite","unicode_version":"7.0"},{"emoji":"🚀","aliases":["rocket"],"tags":["ship","launch"],"category":"Travel & Places","description":"rocket","unicode_version":"6.0"},{"emoji":"🛸","aliases":["flying_saucer"],"tags":["ufo"],"category":"Travel & Places","description":"flying saucer","unicode_version":"11.0"},{"emoji":"🛎️","aliases":["bellhop_bell"],"tags":[],"category":"Travel & Places","description":"bellhop bell","unicode_version":"7.0"},{"emoji":"🧳","aliases":["luggage"],"tags":[],"category":"Travel & Places","description":"luggage","unicode_version":"11.0"},{"emoji":"⌛","aliases":["hourglass"],"tags":["time"],"category":"Travel & Places","description":"hourglass done","unicode_version":""},{"emoji":"⏳","aliases":["hourglass_flowing_sand"],"tags":["time"],"category":"Travel & Places","description":"hourglass not done","unicode_version":"6.0"},{"emoji":"⌚","aliases":["watch"],"tags":["time"],"category":"Travel & Places","description":"watch","unicode_version":""},{"emoji":"⏰","aliases":["alarm_clock"],"tags":["morning"],"category":"Travel & Places","description":"alarm clock","unicode_version":"6.0"},{"emoji":"⏱️","aliases":["stopwatch"],"tags":[],"category":"Travel & Places","description":"stopwatch","unicode_version":"6.0"},{"emoji":"⏲️","aliases":["timer_clock"],"tags":[],"category":"Travel & Places","description":"timer clock","unicode_version":"6.0"},{"emoji":"🕰️","aliases":["mantelpiece_clock"],"tags":[],"category":"Travel & Places","description":"mantelpiece clock","unicode_version":"7.0"},{"emoji":"🕛","aliases":["clock12"],"tags":[],"category":"Travel & Places","description":"twelve o’clock","unicode_version":"6.0"},{"emoji":"🕧","aliases":["clock1230"],"tags":[],"category":"Travel & Places","description":"twelve-thirty","unicode_version":"6.0"},{"emoji":"🕐","aliases":["clock1"],"tags":[],"category":"Travel & Places","description":"one o’clock","unicode_version":"6.0"},{"emoji":"🕜","aliases":["clock130"],"tags":[],"category":"Travel & Places","description":"one-thirty","unicode_version":"6.0"},{"emoji":"🕑","aliases":["clock2"],"tags":[],"category":"Travel & Places","description":"two o’clock","unicode_version":"6.0"},{"emoji":"🕝","aliases":["clock230"],"tags":[],"category":"Travel & Places","description":"two-thirty","unicode_version":"6.0"},{"emoji":"🕒","aliases":["clock3"],"tags":[],"category":"Travel & Places","description":"three o’clock","unicode_version":"6.0"},{"emoji":"🕞","aliases":["clock330"],"tags":[],"category":"Travel & Places","description":"three-thirty","unicode_version":"6.0"},{"emoji":"🕓","aliases":["clock4"],"tags":[],"category":"Travel & Places","description":"four o’clock","unicode_version":"6.0"},{"emoji":"🕟","aliases":["clock430"],"tags":[],"category":"Travel & Places","description":"four-thirty","unicode_version":"6.0"},{"emoji":"🕔","aliases":["clock5"],"tags":[],"category":"Travel & Places","description":"five o’clock","unicode_version":"6.0"},{"emoji":"🕠","aliases":["clock530"],"tags":[],"category":"Travel & Places","description":"five-thirty","unicode_version":"6.0"},{"emoji":"🕕","aliases":["clock6"],"tags":[],"category":"Travel & Places","description":"six o’clock","unicode_version":"6.0"},{"emoji":"🕡","aliases":["clock630"],"tags":[],"category":"Travel & Places","description":"six-thirty","unicode_version":"6.0"},{"emoji":"🕖","aliases":["clock7"],"tags":[],"category":"Travel & Places","description":"seven o’clock","unicode_version":"6.0"},{"emoji":"🕢","aliases":["clock730"],"tags":[],"category":"Travel & Places","description":"seven-thirty","unicode_version":"6.0"},{"emoji":"🕗","aliases":["clock8"],"tags":[],"category":"Travel & Places","description":"eight o’clock","unicode_version":"6.0"},{"emoji":"🕣","aliases":["clock830"],"tags":[],"category":"Travel & Places","description":"eight-thirty","unicode_version":"6.0"},{"emoji":"🕘","aliases":["clock9"],"tags":[],"category":"Travel & Places","description":"nine o’clock","unicode_version":"6.0"},{"emoji":"🕤","aliases":["clock930"],"tags":[],"category":"Travel & Places","description":"nine-thirty","unicode_version":"6.0"},{"emoji":"🕙","aliases":["clock10"],"tags":[],"category":"Travel & Places","description":"ten o’clock","unicode_version":"6.0"},{"emoji":"🕥","aliases":["clock1030"],"tags":[],"category":"Travel & Places","description":"ten-thirty","unicode_version":"6.0"},{"emoji":"🕚","aliases":["clock11"],"tags":[],"category":"Travel & Places","description":"eleven o’clock","unicode_version":"6.0"},{"emoji":"🕦","aliases":["clock1130"],"tags":[],"category":"Travel & Places","description":"eleven-thirty","unicode_version":"6.0"},{"emoji":"🌑","aliases":["new_moon"],"tags":[],"category":"Travel & Places","description":"new moon","unicode_version":"6.0"},{"emoji":"🌒","aliases":["waxing_crescent_moon"],"tags":[],"category":"Travel & Places","description":"waxing crescent moon","unicode_version":"6.0"},{"emoji":"🌓","aliases":["first_quarter_moon"],"tags":[],"category":"Travel & Places","description":"first quarter moon","unicode_version":"6.0"},{"emoji":"🌔","aliases":["moon","waxing_gibbous_moon"],"tags":[],"category":"Travel & Places","description":"waxing gibbous moon","unicode_version":"6.0"},{"emoji":"🌕","aliases":["full_moon"],"tags":[],"category":"Travel & Places","description":"full moon","unicode_version":"6.0"},{"emoji":"🌖","aliases":["waning_gibbous_moon"],"tags":[],"category":"Travel & Places","description":"waning gibbous moon","unicode_version":"6.0"},{"emoji":"🌗","aliases":["last_quarter_moon"],"tags":[],"category":"Travel & Places","description":"last quarter moon","unicode_version":"6.0"},{"emoji":"🌘","aliases":["waning_crescent_moon"],"tags":[],"category":"Travel & Places","description":"waning crescent moon","unicode_version":"6.0"},{"emoji":"🌙","aliases":["crescent_moon"],"tags":["night"],"category":"Travel & Places","description":"crescent moon","unicode_version":"6.0"},{"emoji":"🌚","aliases":["new_moon_with_face"],"tags":[],"category":"Travel & Places","description":"new moon face","unicode_version":"6.0"},{"emoji":"🌛","aliases":["first_quarter_moon_with_face"],"tags":[],"category":"Travel & Places","description":"first quarter moon face","unicode_version":"6.0"},{"emoji":"🌜","aliases":["last_quarter_moon_with_face"],"tags":[],"category":"Travel & Places","description":"last quarter moon face","unicode_version":"6.0"},{"emoji":"🌡️","aliases":["thermometer"],"tags":[],"category":"Travel & Places","description":"thermometer","unicode_version":"7.0"},{"emoji":"☀️","aliases":["sunny"],"tags":["weather"],"category":"Travel & Places","description":"sun","unicode_version":""},{"emoji":"🌝","aliases":["full_moon_with_face"],"tags":[],"category":"Travel & Places","description":"full moon face","unicode_version":"6.0"},{"emoji":"🌞","aliases":["sun_with_face"],"tags":["summer"],"category":"Travel & Places","description":"sun with face","unicode_version":"6.0"},{"emoji":"🪐","aliases":["ringed_planet"],"tags":[],"category":"Travel & Places","description":"ringed planet","unicode_version":"12.0"},{"emoji":"⭐","aliases":["star"],"tags":[],"category":"Travel & Places","description":"star","unicode_version":"5.1"},{"emoji":"🌟","aliases":["star2"],"tags":[],"category":"Travel & Places","description":"glowing star","unicode_version":"6.0"},{"emoji":"🌠","aliases":["stars"],"tags":[],"category":"Travel & Places","description":"shooting star","unicode_version":"6.0"},{"emoji":"🌌","aliases":["milky_way"],"tags":[],"category":"Travel & Places","description":"milky way","unicode_version":"6.0"},{"emoji":"☁️","aliases":["cloud"],"tags":[],"category":"Travel & Places","description":"cloud","unicode_version":""},{"emoji":"⛅","aliases":["partly_sunny"],"tags":["weather","cloud"],"category":"Travel & Places","description":"sun behind cloud","unicode_version":"5.2"},{"emoji":"⛈️","aliases":["cloud_with_lightning_and_rain"],"tags":[],"category":"Travel & Places","description":"cloud with lightning and rain","unicode_version":"5.2"},{"emoji":"🌤️","aliases":["sun_behind_small_cloud"],"tags":[],"category":"Travel & Places","description":"sun behind small cloud","unicode_version":"7.0"},{"emoji":"🌥️","aliases":["sun_behind_large_cloud"],"tags":[],"category":"Travel & Places","description":"sun behind large cloud","unicode_version":"7.0"},{"emoji":"🌦️","aliases":["sun_behind_rain_cloud"],"tags":[],"category":"Travel & Places","description":"sun behind rain cloud","unicode_version":"7.0"},{"emoji":"🌧️","aliases":["cloud_with_rain"],"tags":[],"category":"Travel & Places","description":"cloud with rain","unicode_version":"7.0"},{"emoji":"🌨️","aliases":["cloud_with_snow"],"tags":[],"category":"Travel & Places","description":"cloud with snow","unicode_version":"7.0"},{"emoji":"🌩️","aliases":["cloud_with_lightning"],"tags":[],"category":"Travel & Places","description":"cloud with lightning","unicode_version":"7.0"},{"emoji":"🌪️","aliases":["tornado"],"tags":[],"category":"Travel & Places","description":"tornado","unicode_version":"7.0"},{"emoji":"🌫️","aliases":["fog"],"tags":[],"category":"Travel & Places","description":"fog","unicode_version":"7.0"},{"emoji":"🌬️","aliases":["wind_face"],"tags":[],"category":"Travel & Places","description":"wind face","unicode_version":"7.0"},{"emoji":"🌀","aliases":["cyclone"],"tags":["swirl"],"category":"Travel & Places","description":"cyclone","unicode_version":"6.0"},{"emoji":"🌈","aliases":["rainbow"],"tags":[],"category":"Travel & Places","description":"rainbow","unicode_version":"6.0"},{"emoji":"🌂","aliases":["closed_umbrella"],"tags":["weather","rain"],"category":"Travel & Places","description":"closed umbrella","unicode_version":"6.0"},{"emoji":"☂️","aliases":["open_umbrella"],"tags":[],"category":"Travel & Places","description":"umbrella","unicode_version":""},{"emoji":"☔","aliases":["umbrella"],"tags":["rain","weather"],"category":"Travel & Places","description":"umbrella with rain drops","unicode_version":"4.0"},{"emoji":"⛱️","aliases":["parasol_on_ground"],"tags":["beach_umbrella"],"category":"Travel & Places","description":"umbrella on ground","unicode_version":"5.2"},{"emoji":"⚡","aliases":["zap"],"tags":["lightning","thunder"],"category":"Travel & Places","description":"high voltage","unicode_version":"4.0"},{"emoji":"❄️","aliases":["snowflake"],"tags":["winter","cold","weather"],"category":"Travel & Places","description":"snowflake","unicode_version":""},{"emoji":"☃️","aliases":["snowman_with_snow"],"tags":["winter","christmas"],"category":"Travel & Places","description":"snowman","unicode_version":""},{"emoji":"⛄","aliases":["snowman"],"tags":["winter"],"category":"Travel & Places","description":"snowman without snow","unicode_version":"5.2"},{"emoji":"☄️","aliases":["comet"],"tags":[],"category":"Travel & Places","description":"comet","unicode_version":""},{"emoji":"🔥","aliases":["fire"],"tags":["burn"],"category":"Travel & Places","description":"fire","unicode_version":"6.0"},{"emoji":"💧","aliases":["droplet"],"tags":["water"],"category":"Travel & Places","description":"droplet","unicode_version":"6.0"},{"emoji":"🌊","aliases":["ocean"],"tags":["sea"],"category":"Travel & Places","description":"water wave","unicode_version":"6.0"},{"emoji":"🎃","aliases":["jack_o_lantern"],"tags":["halloween"],"category":"Activities","description":"jack-o-lantern","unicode_version":"6.0"},{"emoji":"🎄","aliases":["christmas_tree"],"tags":[],"category":"Activities","description":"Christmas tree","unicode_version":"6.0"},{"emoji":"🎆","aliases":["fireworks"],"tags":["festival","celebration"],"category":"Activities","description":"fireworks","unicode_version":"6.0"},{"emoji":"🎇","aliases":["sparkler"],"tags":[],"category":"Activities","description":"sparkler","unicode_version":"6.0"},{"emoji":"🧨","aliases":["firecracker"],"tags":[],"category":"Activities","description":"firecracker","unicode_version":"11.0"},{"emoji":"✨","aliases":["sparkles"],"tags":["shiny"],"category":"Activities","description":"sparkles","unicode_version":"6.0"},{"emoji":"🎈","aliases":["balloon"],"tags":["party","birthday"],"category":"Activities","description":"balloon","unicode_version":"6.0"},{"emoji":"🎉","aliases":["tada"],"tags":["hooray","party"],"category":"Activities","description":"party popper","unicode_version":"6.0"},{"emoji":"🎊","aliases":["confetti_ball"],"tags":[],"category":"Activities","description":"confetti ball","unicode_version":"6.0"},{"emoji":"🎋","aliases":["tanabata_tree"],"tags":[],"category":"Activities","description":"tanabata tree","unicode_version":"6.0"},{"emoji":"🎍","aliases":["bamboo"],"tags":[],"category":"Activities","description":"pine decoration","unicode_version":"6.0"},{"emoji":"🎎","aliases":["dolls"],"tags":[],"category":"Activities","description":"Japanese dolls","unicode_version":"6.0"},{"emoji":"🎏","aliases":["flags"],"tags":[],"category":"Activities","description":"carp streamer","unicode_version":"6.0"},{"emoji":"🎐","aliases":["wind_chime"],"tags":[],"category":"Activities","description":"wind chime","unicode_version":"6.0"},{"emoji":"🎑","aliases":["rice_scene"],"tags":[],"category":"Activities","description":"moon viewing ceremony","unicode_version":"6.0"},{"emoji":"🧧","aliases":["red_envelope"],"tags":[],"category":"Activities","description":"red envelope","unicode_version":"11.0"},{"emoji":"🎀","aliases":["ribbon"],"tags":[],"category":"Activities","description":"ribbon","unicode_version":"6.0"},{"emoji":"🎁","aliases":["gift"],"tags":["present","birthday","christmas"],"category":"Activities","description":"wrapped gift","unicode_version":"6.0"},{"emoji":"🎗️","aliases":["reminder_ribbon"],"tags":[],"category":"Activities","description":"reminder ribbon","unicode_version":"7.0"},{"emoji":"🎟️","aliases":["tickets"],"tags":[],"category":"Activities","description":"admission tickets","unicode_version":"7.0"},{"emoji":"🎫","aliases":["ticket"],"tags":[],"category":"Activities","description":"ticket","unicode_version":"6.0"},{"emoji":"🎖️","aliases":["medal_military"],"tags":[],"category":"Activities","description":"military medal","unicode_version":"7.0"},{"emoji":"🏆","aliases":["trophy"],"tags":["award","contest","winner"],"category":"Activities","description":"trophy","unicode_version":"6.0"},{"emoji":"🏅","aliases":["medal_sports"],"tags":["gold","winner"],"category":"Activities","description":"sports medal","unicode_version":"7.0"},{"emoji":"🥇","aliases":["1st_place_medal"],"tags":["gold"],"category":"Activities","description":"1st place medal","unicode_version":"9.0"},{"emoji":"🥈","aliases":["2nd_place_medal"],"tags":["silver"],"category":"Activities","description":"2nd place medal","unicode_version":"9.0"},{"emoji":"🥉","aliases":["3rd_place_medal"],"tags":["bronze"],"category":"Activities","description":"3rd place medal","unicode_version":"9.0"},{"emoji":"⚽","aliases":["soccer"],"tags":["sports"],"category":"Activities","description":"soccer ball","unicode_version":"5.2"},{"emoji":"⚾","aliases":["baseball"],"tags":["sports"],"category":"Activities","description":"baseball","unicode_version":"5.2"},{"emoji":"🥎","aliases":["softball"],"tags":[],"category":"Activities","description":"softball","unicode_version":"11.0"},{"emoji":"🏀","aliases":["basketball"],"tags":["sports"],"category":"Activities","description":"basketball","unicode_version":"6.0"},{"emoji":"🏐","aliases":["volleyball"],"tags":[],"category":"Activities","description":"volleyball","unicode_version":"8.0"},{"emoji":"🏈","aliases":["football"],"tags":["sports"],"category":"Activities","description":"american football","unicode_version":"6.0"},{"emoji":"🏉","aliases":["rugby_football"],"tags":[],"category":"Activities","description":"rugby football","unicode_version":"6.0"},{"emoji":"🎾","aliases":["tennis"],"tags":["sports"],"category":"Activities","description":"tennis","unicode_version":"6.0"},{"emoji":"🥏","aliases":["flying_disc"],"tags":[],"category":"Activities","description":"flying disc","unicode_version":"11.0"},{"emoji":"🎳","aliases":["bowling"],"tags":[],"category":"Activities","description":"bowling","unicode_version":"6.0"},{"emoji":"🏏","aliases":["cricket_game"],"tags":[],"category":"Activities","description":"cricket game","unicode_version":"8.0"},{"emoji":"🏑","aliases":["field_hockey"],"tags":[],"category":"Activities","description":"field hockey","unicode_version":"8.0"},{"emoji":"🏒","aliases":["ice_hockey"],"tags":[],"category":"Activities","description":"ice hockey","unicode_version":"8.0"},{"emoji":"🥍","aliases":["lacrosse"],"tags":[],"category":"Activities","description":"lacrosse","unicode_version":"11.0"},{"emoji":"🏓","aliases":["ping_pong"],"tags":[],"category":"Activities","description":"ping pong","unicode_version":"8.0"},{"emoji":"🏸","aliases":["badminton"],"tags":[],"category":"Activities","description":"badminton","unicode_version":"8.0"},{"emoji":"🥊","aliases":["boxing_glove"],"tags":[],"category":"Activities","description":"boxing glove","unicode_version":"9.0"},{"emoji":"🥋","aliases":["martial_arts_uniform"],"tags":[],"category":"Activities","description":"martial arts uniform","unicode_version":"9.0"},{"emoji":"🥅","aliases":["goal_net"],"tags":[],"category":"Activities","description":"goal net","unicode_version":"9.0"},{"emoji":"⛳","aliases":["golf"],"tags":[],"category":"Activities","description":"flag in hole","unicode_version":"5.2"},{"emoji":"⛸️","aliases":["ice_skate"],"tags":["skating"],"category":"Activities","description":"ice skate","unicode_version":"5.2"},{"emoji":"🎣","aliases":["fishing_pole_and_fish"],"tags":[],"category":"Activities","description":"fishing pole","unicode_version":"6.0"},{"emoji":"🤿","aliases":["diving_mask"],"tags":[],"category":"Activities","description":"diving mask","unicode_version":"12.0"},{"emoji":"🎽","aliases":["running_shirt_with_sash"],"tags":["marathon"],"category":"Activities","description":"running shirt","unicode_version":"6.0"},{"emoji":"🎿","aliases":["ski"],"tags":[],"category":"Activities","description":"skis","unicode_version":"6.0"},{"emoji":"🛷","aliases":["sled"],"tags":[],"category":"Activities","description":"sled","unicode_version":"11.0"},{"emoji":"🥌","aliases":["curling_stone"],"tags":[],"category":"Activities","description":"curling stone","unicode_version":"11.0"},{"emoji":"🎯","aliases":["dart"],"tags":["target"],"category":"Activities","description":"bullseye","unicode_version":"6.0"},{"emoji":"🪀","aliases":["yo_yo"],"tags":[],"category":"Activities","description":"yo-yo","unicode_version":"12.0"},{"emoji":"🪁","aliases":["kite"],"tags":[],"category":"Activities","description":"kite","unicode_version":"12.0"},{"emoji":"🎱","aliases":["8ball"],"tags":["pool","billiards"],"category":"Activities","description":"pool 8 ball","unicode_version":"6.0"},{"emoji":"🔮","aliases":["crystal_ball"],"tags":["fortune"],"category":"Activities","description":"crystal ball","unicode_version":"6.0"},{"emoji":"🪄","aliases":["magic_wand"],"tags":[],"category":"Activities","description":"magic wand","unicode_version":"13.0"},{"emoji":"🧿","aliases":["nazar_amulet"],"tags":[],"category":"Activities","description":"nazar amulet","unicode_version":"11.0"},{"emoji":"🎮","aliases":["video_game"],"tags":["play","controller","console"],"category":"Activities","description":"video game","unicode_version":"6.0"},{"emoji":"🕹️","aliases":["joystick"],"tags":[],"category":"Activities","description":"joystick","unicode_version":"7.0"},{"emoji":"🎰","aliases":["slot_machine"],"tags":[],"category":"Activities","description":"slot machine","unicode_version":"6.0"},{"emoji":"🎲","aliases":["game_die"],"tags":["dice","gambling"],"category":"Activities","description":"game die","unicode_version":"6.0"},{"emoji":"🧩","aliases":["jigsaw"],"tags":[],"category":"Activities","description":"puzzle piece","unicode_version":"11.0"},{"emoji":"🧸","aliases":["teddy_bear"],"tags":[],"category":"Activities","description":"teddy bear","unicode_version":"11.0"},{"emoji":"🪅","aliases":["pinata"],"tags":[],"category":"Activities","description":"piñata","unicode_version":"13.0"},{"emoji":"🪆","aliases":["nesting_dolls"],"tags":[],"category":"Activities","description":"nesting dolls","unicode_version":"13.0"},{"emoji":"♠️","aliases":["spades"],"tags":[],"category":"Activities","description":"spade suit","unicode_version":""},{"emoji":"♥️","aliases":["hearts"],"tags":[],"category":"Activities","description":"heart suit","unicode_version":""},{"emoji":"♦️","aliases":["diamonds"],"tags":[],"category":"Activities","description":"diamond suit","unicode_version":""},{"emoji":"♣️","aliases":["clubs"],"tags":[],"category":"Activities","description":"club suit","unicode_version":""},{"emoji":"♟️","aliases":["chess_pawn"],"tags":[],"category":"Activities","description":"chess pawn","unicode_version":"11.0"},{"emoji":"🃏","aliases":["black_joker"],"tags":[],"category":"Activities","description":"joker","unicode_version":"6.0"},{"emoji":"🀄","aliases":["mahjong"],"tags":[],"category":"Activities","description":"mahjong red dragon","unicode_version":""},{"emoji":"🎴","aliases":["flower_playing_cards"],"tags":[],"category":"Activities","description":"flower playing cards","unicode_version":"6.0"},{"emoji":"🎭","aliases":["performing_arts"],"tags":["theater","drama"],"category":"Activities","description":"performing arts","unicode_version":"6.0"},{"emoji":"🖼️","aliases":["framed_picture"],"tags":[],"category":"Activities","description":"framed picture","unicode_version":"7.0"},{"emoji":"🎨","aliases":["art"],"tags":["design","paint"],"category":"Activities","description":"artist palette","unicode_version":"6.0"},{"emoji":"🧵","aliases":["thread"],"tags":[],"category":"Activities","description":"thread","unicode_version":"11.0"},{"emoji":"🪡","aliases":["sewing_needle"],"tags":[],"category":"Activities","description":"sewing needle","unicode_version":"13.0"},{"emoji":"🧶","aliases":["yarn"],"tags":[],"category":"Activities","description":"yarn","unicode_version":"11.0"},{"emoji":"🪢","aliases":["knot"],"tags":[],"category":"Activities","description":"knot","unicode_version":"13.0"},{"emoji":"👓","aliases":["eyeglasses"],"tags":["glasses"],"category":"Objects","description":"glasses","unicode_version":"6.0"},{"emoji":"🕶️","aliases":["dark_sunglasses"],"tags":[],"category":"Objects","description":"sunglasses","unicode_version":"7.0"},{"emoji":"🥽","aliases":["goggles"],"tags":[],"category":"Objects","description":"goggles","unicode_version":"11.0"},{"emoji":"🥼","aliases":["lab_coat"],"tags":[],"category":"Objects","description":"lab coat","unicode_version":"11.0"},{"emoji":"🦺","aliases":["safety_vest"],"tags":[],"category":"Objects","description":"safety vest","unicode_version":"12.0"},{"emoji":"👔","aliases":["necktie"],"tags":["shirt","formal"],"category":"Objects","description":"necktie","unicode_version":"6.0"},{"emoji":"👕","aliases":["shirt","tshirt"],"tags":[],"category":"Objects","description":"t-shirt","unicode_version":"6.0"},{"emoji":"👖","aliases":["jeans"],"tags":["pants"],"category":"Objects","description":"jeans","unicode_version":"6.0"},{"emoji":"🧣","aliases":["scarf"],"tags":[],"category":"Objects","description":"scarf","unicode_version":"11.0"},{"emoji":"🧤","aliases":["gloves"],"tags":[],"category":"Objects","description":"gloves","unicode_version":"11.0"},{"emoji":"🧥","aliases":["coat"],"tags":[],"category":"Objects","description":"coat","unicode_version":"11.0"},{"emoji":"🧦","aliases":["socks"],"tags":[],"category":"Objects","description":"socks","unicode_version":"11.0"},{"emoji":"👗","aliases":["dress"],"tags":[],"category":"Objects","description":"dress","unicode_version":"6.0"},{"emoji":"👘","aliases":["kimono"],"tags":[],"category":"Objects","description":"kimono","unicode_version":"6.0"},{"emoji":"🥻","aliases":["sari"],"tags":[],"category":"Objects","description":"sari","unicode_version":"12.0"},{"emoji":"🩱","aliases":["one_piece_swimsuit"],"tags":[],"category":"Objects","description":"one-piece swimsuit","unicode_version":"12.0"},{"emoji":"🩲","aliases":["swim_brief"],"tags":[],"category":"Objects","description":"briefs","unicode_version":"12.0"},{"emoji":"🩳","aliases":["shorts"],"tags":[],"category":"Objects","description":"shorts","unicode_version":"12.0"},{"emoji":"👙","aliases":["bikini"],"tags":["beach"],"category":"Objects","description":"bikini","unicode_version":"6.0"},{"emoji":"👚","aliases":["womans_clothes"],"tags":[],"category":"Objects","description":"woman’s clothes","unicode_version":"6.0"},{"emoji":"👛","aliases":["purse"],"tags":[],"category":"Objects","description":"purse","unicode_version":"6.0"},{"emoji":"👜","aliases":["handbag"],"tags":["bag"],"category":"Objects","description":"handbag","unicode_version":"6.0"},{"emoji":"👝","aliases":["pouch"],"tags":["bag"],"category":"Objects","description":"clutch bag","unicode_version":"6.0"},{"emoji":"🛍️","aliases":["shopping"],"tags":["bags"],"category":"Objects","description":"shopping bags","unicode_version":"7.0"},{"emoji":"🎒","aliases":["school_satchel"],"tags":[],"category":"Objects","description":"backpack","unicode_version":"6.0"},{"emoji":"🩴","aliases":["thong_sandal"],"tags":[],"category":"Objects","description":"thong sandal","unicode_version":"13.0"},{"emoji":"👞","aliases":["mans_shoe","shoe"],"tags":[],"category":"Objects","description":"man’s shoe","unicode_version":"6.0"},{"emoji":"👟","aliases":["athletic_shoe"],"tags":["sneaker","sport","running"],"category":"Objects","description":"running shoe","unicode_version":"6.0"},{"emoji":"🥾","aliases":["hiking_boot"],"tags":[],"category":"Objects","description":"hiking boot","unicode_version":"11.0"},{"emoji":"🥿","aliases":["flat_shoe"],"tags":[],"category":"Objects","description":"flat shoe","unicode_version":"11.0"},{"emoji":"👠","aliases":["high_heel"],"tags":["shoe"],"category":"Objects","description":"high-heeled shoe","unicode_version":"6.0"},{"emoji":"👡","aliases":["sandal"],"tags":["shoe"],"category":"Objects","description":"woman’s sandal","unicode_version":"6.0"},{"emoji":"🩰","aliases":["ballet_shoes"],"tags":[],"category":"Objects","description":"ballet shoes","unicode_version":"12.0"},{"emoji":"👢","aliases":["boot"],"tags":[],"category":"Objects","description":"woman’s boot","unicode_version":"6.0"},{"emoji":"👑","aliases":["crown"],"tags":["king","queen","royal"],"category":"Objects","description":"crown","unicode_version":"6.0"},{"emoji":"👒","aliases":["womans_hat"],"tags":[],"category":"Objects","description":"woman’s hat","unicode_version":"6.0"},{"emoji":"🎩","aliases":["tophat"],"tags":["hat","classy"],"category":"Objects","description":"top hat","unicode_version":"6.0"},{"emoji":"🎓","aliases":["mortar_board"],"tags":["education","college","university","graduation"],"category":"Objects","description":"graduation cap","unicode_version":"6.0"},{"emoji":"🧢","aliases":["billed_cap"],"tags":[],"category":"Objects","description":"billed cap","unicode_version":"11.0"},{"emoji":"🪖","aliases":["military_helmet"],"tags":[],"category":"Objects","description":"military helmet","unicode_version":"13.0"},{"emoji":"⛑️","aliases":["rescue_worker_helmet"],"tags":[],"category":"Objects","description":"rescue worker’s helmet","unicode_version":"5.2"},{"emoji":"📿","aliases":["prayer_beads"],"tags":[],"category":"Objects","description":"prayer beads","unicode_version":"8.0"},{"emoji":"💄","aliases":["lipstick"],"tags":["makeup"],"category":"Objects","description":"lipstick","unicode_version":"6.0"},{"emoji":"💍","aliases":["ring"],"tags":["wedding","marriage","engaged"],"category":"Objects","description":"ring","unicode_version":"6.0"},{"emoji":"💎","aliases":["gem"],"tags":["diamond"],"category":"Objects","description":"gem stone","unicode_version":"6.0"},{"emoji":"🔇","aliases":["mute"],"tags":["sound","volume"],"category":"Objects","description":"muted speaker","unicode_version":"6.0"},{"emoji":"🔈","aliases":["speaker"],"tags":[],"category":"Objects","description":"speaker low volume","unicode_version":"6.0"},{"emoji":"🔉","aliases":["sound"],"tags":["volume"],"category":"Objects","description":"speaker medium volume","unicode_version":"6.0"},{"emoji":"🔊","aliases":["loud_sound"],"tags":["volume"],"category":"Objects","description":"speaker high volume","unicode_version":"6.0"},{"emoji":"📢","aliases":["loudspeaker"],"tags":["announcement"],"category":"Objects","description":"loudspeaker","unicode_version":"6.0"},{"emoji":"📣","aliases":["mega"],"tags":[],"category":"Objects","description":"megaphone","unicode_version":"6.0"},{"emoji":"📯","aliases":["postal_horn"],"tags":[],"category":"Objects","description":"postal horn","unicode_version":"6.0"},{"emoji":"🔔","aliases":["bell"],"tags":["sound","notification"],"category":"Objects","description":"bell","unicode_version":"6.0"},{"emoji":"🔕","aliases":["no_bell"],"tags":["volume","off"],"category":"Objects","description":"bell with slash","unicode_version":"6.0"},{"emoji":"🎼","aliases":["musical_score"],"tags":[],"category":"Objects","description":"musical score","unicode_version":"6.0"},{"emoji":"🎵","aliases":["musical_note"],"tags":[],"category":"Objects","description":"musical note","unicode_version":"6.0"},{"emoji":"🎶","aliases":["notes"],"tags":["music"],"category":"Objects","description":"musical notes","unicode_version":"6.0"},{"emoji":"🎙️","aliases":["studio_microphone"],"tags":["podcast"],"category":"Objects","description":"studio microphone","unicode_version":"7.0"},{"emoji":"🎚️","aliases":["level_slider"],"tags":[],"category":"Objects","description":"level slider","unicode_version":"7.0"},{"emoji":"🎛️","aliases":["control_knobs"],"tags":[],"category":"Objects","description":"control knobs","unicode_version":"7.0"},{"emoji":"🎤","aliases":["microphone"],"tags":["sing"],"category":"Objects","description":"microphone","unicode_version":"6.0"},{"emoji":"🎧","aliases":["headphones"],"tags":["music","earphones"],"category":"Objects","description":"headphone","unicode_version":"6.0"},{"emoji":"📻","aliases":["radio"],"tags":["podcast"],"category":"Objects","description":"radio","unicode_version":"6.0"},{"emoji":"🎷","aliases":["saxophone"],"tags":[],"category":"Objects","description":"saxophone","unicode_version":"6.0"},{"emoji":"🪗","aliases":["accordion"],"tags":[],"category":"Objects","description":"accordion","unicode_version":"13.0"},{"emoji":"🎸","aliases":["guitar"],"tags":["rock"],"category":"Objects","description":"guitar","unicode_version":"6.0"},{"emoji":"🎹","aliases":["musical_keyboard"],"tags":["piano"],"category":"Objects","description":"musical keyboard","unicode_version":"6.0"},{"emoji":"🎺","aliases":["trumpet"],"tags":[],"category":"Objects","description":"trumpet","unicode_version":"6.0"},{"emoji":"🎻","aliases":["violin"],"tags":[],"category":"Objects","description":"violin","unicode_version":"6.0"},{"emoji":"🪕","aliases":["banjo"],"tags":[],"category":"Objects","description":"banjo","unicode_version":"12.0"},{"emoji":"🥁","aliases":["drum"],"tags":[],"category":"Objects","description":"drum","unicode_version":""},{"emoji":"🪘","aliases":["long_drum"],"tags":[],"category":"Objects","description":"long drum","unicode_version":"13.0"},{"emoji":"📱","aliases":["iphone"],"tags":["smartphone","mobile"],"category":"Objects","description":"mobile phone","unicode_version":"6.0"},{"emoji":"📲","aliases":["calling"],"tags":["call","incoming"],"category":"Objects","description":"mobile phone with arrow","unicode_version":"6.0"},{"emoji":"☎️","aliases":["phone","telephone"],"tags":[],"category":"Objects","description":"telephone","unicode_version":""},{"emoji":"📞","aliases":["telephone_receiver"],"tags":["phone","call"],"category":"Objects","description":"telephone receiver","unicode_version":"6.0"},{"emoji":"📟","aliases":["pager"],"tags":[],"category":"Objects","description":"pager","unicode_version":"6.0"},{"emoji":"📠","aliases":["fax"],"tags":[],"category":"Objects","description":"fax machine","unicode_version":"6.0"},{"emoji":"🔋","aliases":["battery"],"tags":["power"],"category":"Objects","description":"battery","unicode_version":"6.0"},{"emoji":"🔌","aliases":["electric_plug"],"tags":[],"category":"Objects","description":"electric plug","unicode_version":"6.0"},{"emoji":"💻","aliases":["computer"],"tags":["desktop","screen"],"category":"Objects","description":"laptop","unicode_version":"6.0"},{"emoji":"🖥️","aliases":["desktop_computer"],"tags":[],"category":"Objects","description":"desktop computer","unicode_version":"7.0"},{"emoji":"🖨️","aliases":["printer"],"tags":[],"category":"Objects","description":"printer","unicode_version":"7.0"},{"emoji":"⌨️","aliases":["keyboard"],"tags":[],"category":"Objects","description":"keyboard","unicode_version":""},{"emoji":"🖱️","aliases":["computer_mouse"],"tags":[],"category":"Objects","description":"computer mouse","unicode_version":"7.0"},{"emoji":"🖲️","aliases":["trackball"],"tags":[],"category":"Objects","description":"trackball","unicode_version":"7.0"},{"emoji":"💽","aliases":["minidisc"],"tags":[],"category":"Objects","description":"computer disk","unicode_version":"6.0"},{"emoji":"💾","aliases":["floppy_disk"],"tags":["save"],"category":"Objects","description":"floppy disk","unicode_version":"6.0"},{"emoji":"💿","aliases":["cd"],"tags":[],"category":"Objects","description":"optical disk","unicode_version":"6.0"},{"emoji":"📀","aliases":["dvd"],"tags":[],"category":"Objects","description":"dvd","unicode_version":"6.0"},{"emoji":"🧮","aliases":["abacus"],"tags":[],"category":"Objects","description":"abacus","unicode_version":"11.0"},{"emoji":"🎥","aliases":["movie_camera"],"tags":["film","video"],"category":"Objects","description":"movie camera","unicode_version":"6.0"},{"emoji":"🎞️","aliases":["film_strip"],"tags":[],"category":"Objects","description":"film frames","unicode_version":"7.0"},{"emoji":"📽️","aliases":["film_projector"],"tags":[],"category":"Objects","description":"film projector","unicode_version":"7.0"},{"emoji":"🎬","aliases":["clapper"],"tags":["film"],"category":"Objects","description":"clapper board","unicode_version":"6.0"},{"emoji":"📺","aliases":["tv"],"tags":[],"category":"Objects","description":"television","unicode_version":"6.0"},{"emoji":"📷","aliases":["camera"],"tags":["photo"],"category":"Objects","description":"camera","unicode_version":"6.0"},{"emoji":"📸","aliases":["camera_flash"],"tags":["photo"],"category":"Objects","description":"camera with flash","unicode_version":"7.0"},{"emoji":"📹","aliases":["video_camera"],"tags":[],"category":"Objects","description":"video camera","unicode_version":"6.0"},{"emoji":"📼","aliases":["vhs"],"tags":[],"category":"Objects","description":"videocassette","unicode_version":"6.0"},{"emoji":"🔍","aliases":["mag"],"tags":["search","zoom"],"category":"Objects","description":"magnifying glass tilted left","unicode_version":"6.0"},{"emoji":"🔎","aliases":["mag_right"],"tags":[],"category":"Objects","description":"magnifying glass tilted right","unicode_version":"6.0"},{"emoji":"🕯️","aliases":["candle"],"tags":[],"category":"Objects","description":"candle","unicode_version":"7.0"},{"emoji":"💡","aliases":["bulb"],"tags":["idea","light"],"category":"Objects","description":"light bulb","unicode_version":"6.0"},{"emoji":"🔦","aliases":["flashlight"],"tags":[],"category":"Objects","description":"flashlight","unicode_version":"6.0"},{"emoji":"🏮","aliases":["izakaya_lantern","lantern"],"tags":[],"category":"Objects","description":"red paper lantern","unicode_version":"6.0"},{"emoji":"🪔","aliases":["diya_lamp"],"tags":[],"category":"Objects","description":"diya lamp","unicode_version":"12.0"},{"emoji":"📔","aliases":["notebook_with_decorative_cover"],"tags":[],"category":"Objects","description":"notebook with decorative cover","unicode_version":"6.0"},{"emoji":"📕","aliases":["closed_book"],"tags":[],"category":"Objects","description":"closed book","unicode_version":"6.0"},{"emoji":"📖","aliases":["book","open_book"],"tags":[],"category":"Objects","description":"open book","unicode_version":"6.0"},{"emoji":"📗","aliases":["green_book"],"tags":[],"category":"Objects","description":"green book","unicode_version":"6.0"},{"emoji":"📘","aliases":["blue_book"],"tags":[],"category":"Objects","description":"blue book","unicode_version":"6.0"},{"emoji":"📙","aliases":["orange_book"],"tags":[],"category":"Objects","description":"orange book","unicode_version":"6.0"},{"emoji":"📚","aliases":["books"],"tags":["library"],"category":"Objects","description":"books","unicode_version":"6.0"},{"emoji":"📓","aliases":["notebook"],"tags":[],"category":"Objects","description":"notebook","unicode_version":"6.0"},{"emoji":"📒","aliases":["ledger"],"tags":[],"category":"Objects","description":"ledger","unicode_version":"6.0"},{"emoji":"📃","aliases":["page_with_curl"],"tags":[],"category":"Objects","description":"page with curl","unicode_version":"6.0"},{"emoji":"📜","aliases":["scroll"],"tags":["document"],"category":"Objects","description":"scroll","unicode_version":"6.0"},{"emoji":"📄","aliases":["page_facing_up"],"tags":["document"],"category":"Objects","description":"page facing up","unicode_version":"6.0"},{"emoji":"📰","aliases":["newspaper"],"tags":["press"],"category":"Objects","description":"newspaper","unicode_version":"6.0"},{"emoji":"🗞️","aliases":["newspaper_roll"],"tags":["press"],"category":"Objects","description":"rolled-up newspaper","unicode_version":"7.0"},{"emoji":"📑","aliases":["bookmark_tabs"],"tags":[],"category":"Objects","description":"bookmark tabs","unicode_version":"6.0"},{"emoji":"🔖","aliases":["bookmark"],"tags":[],"category":"Objects","description":"bookmark","unicode_version":"6.0"},{"emoji":"🏷️","aliases":["label"],"tags":["tag"],"category":"Objects","description":"label","unicode_version":"7.0"},{"emoji":"💰","aliases":["moneybag"],"tags":["dollar","cream"],"category":"Objects","description":"money bag","unicode_version":"6.0"},{"emoji":"🪙","aliases":["coin"],"tags":[],"category":"Objects","description":"coin","unicode_version":"13.0"},{"emoji":"💴","aliases":["yen"],"tags":[],"category":"Objects","description":"yen banknote","unicode_version":"6.0"},{"emoji":"💵","aliases":["dollar"],"tags":["money"],"category":"Objects","description":"dollar banknote","unicode_version":"6.0"},{"emoji":"💶","aliases":["euro"],"tags":[],"category":"Objects","description":"euro banknote","unicode_version":"6.0"},{"emoji":"💷","aliases":["pound"],"tags":[],"category":"Objects","description":"pound banknote","unicode_version":"6.0"},{"emoji":"💸","aliases":["money_with_wings"],"tags":["dollar"],"category":"Objects","description":"money with wings","unicode_version":"6.0"},{"emoji":"💳","aliases":["credit_card"],"tags":["subscription"],"category":"Objects","description":"credit card","unicode_version":"6.0"},{"emoji":"🧾","aliases":["receipt"],"tags":[],"category":"Objects","description":"receipt","unicode_version":"11.0"},{"emoji":"💹","aliases":["chart"],"tags":[],"category":"Objects","description":"chart increasing with yen","unicode_version":"6.0"},{"emoji":"✉️","aliases":["envelope"],"tags":["letter","email"],"category":"Objects","description":"envelope","unicode_version":""},{"emoji":"📧","aliases":["email","e-mail"],"tags":[],"category":"Objects","description":"e-mail","unicode_version":"6.0"},{"emoji":"📨","aliases":["incoming_envelope"],"tags":[],"category":"Objects","description":"incoming envelope","unicode_version":"6.0"},{"emoji":"📩","aliases":["envelope_with_arrow"],"tags":[],"category":"Objects","description":"envelope with arrow","unicode_version":"6.0"},{"emoji":"📤","aliases":["outbox_tray"],"tags":[],"category":"Objects","description":"outbox tray","unicode_version":"6.0"},{"emoji":"📥","aliases":["inbox_tray"],"tags":[],"category":"Objects","description":"inbox tray","unicode_version":"6.0"},{"emoji":"📦","aliases":["package"],"tags":["shipping"],"category":"Objects","description":"package","unicode_version":"6.0"},{"emoji":"📫","aliases":["mailbox"],"tags":[],"category":"Objects","description":"closed mailbox with raised flag","unicode_version":"6.0"},{"emoji":"📪","aliases":["mailbox_closed"],"tags":[],"category":"Objects","description":"closed mailbox with lowered flag","unicode_version":"6.0"},{"emoji":"📬","aliases":["mailbox_with_mail"],"tags":[],"category":"Objects","description":"open mailbox with raised flag","unicode_version":"6.0"},{"emoji":"📭","aliases":["mailbox_with_no_mail"],"tags":[],"category":"Objects","description":"open mailbox with lowered flag","unicode_version":"6.0"},{"emoji":"📮","aliases":["postbox"],"tags":[],"category":"Objects","description":"postbox","unicode_version":"6.0"},{"emoji":"🗳️","aliases":["ballot_box"],"tags":[],"category":"Objects","description":"ballot box with ballot","unicode_version":"7.0"},{"emoji":"✏️","aliases":["pencil2"],"tags":[],"category":"Objects","description":"pencil","unicode_version":""},{"emoji":"✒️","aliases":["black_nib"],"tags":[],"category":"Objects","description":"black nib","unicode_version":""},{"emoji":"🖋️","aliases":["fountain_pen"],"tags":[],"category":"Objects","description":"fountain pen","unicode_version":"7.0"},{"emoji":"🖊️","aliases":["pen"],"tags":[],"category":"Objects","description":"pen","unicode_version":"7.0"},{"emoji":"🖌️","aliases":["paintbrush"],"tags":[],"category":"Objects","description":"paintbrush","unicode_version":"7.0"},{"emoji":"🖍️","aliases":["crayon"],"tags":[],"category":"Objects","description":"crayon","unicode_version":"7.0"},{"emoji":"📝","aliases":["memo","pencil"],"tags":["document","note"],"category":"Objects","description":"memo","unicode_version":"6.0"},{"emoji":"💼","aliases":["briefcase"],"tags":["business"],"category":"Objects","description":"briefcase","unicode_version":"6.0"},{"emoji":"📁","aliases":["file_folder"],"tags":["directory"],"category":"Objects","description":"file folder","unicode_version":"6.0"},{"emoji":"📂","aliases":["open_file_folder"],"tags":[],"category":"Objects","description":"open file folder","unicode_version":"6.0"},{"emoji":"🗂️","aliases":["card_index_dividers"],"tags":[],"category":"Objects","description":"card index dividers","unicode_version":"7.0"},{"emoji":"📅","aliases":["date"],"tags":["calendar","schedule"],"category":"Objects","description":"calendar","unicode_version":"6.0"},{"emoji":"📆","aliases":["calendar"],"tags":["schedule"],"category":"Objects","description":"tear-off calendar","unicode_version":"6.0"},{"emoji":"🗒️","aliases":["spiral_notepad"],"tags":[],"category":"Objects","description":"spiral notepad","unicode_version":"7.0"},{"emoji":"🗓️","aliases":["spiral_calendar"],"tags":[],"category":"Objects","description":"spiral calendar","unicode_version":"7.0"},{"emoji":"📇","aliases":["card_index"],"tags":[],"category":"Objects","description":"card index","unicode_version":"6.0"},{"emoji":"📈","aliases":["chart_with_upwards_trend"],"tags":["graph","metrics"],"category":"Objects","description":"chart increasing","unicode_version":"6.0"},{"emoji":"📉","aliases":["chart_with_downwards_trend"],"tags":["graph","metrics"],"category":"Objects","description":"chart decreasing","unicode_version":"6.0"},{"emoji":"📊","aliases":["bar_chart"],"tags":["stats","metrics"],"category":"Objects","description":"bar chart","unicode_version":"6.0"},{"emoji":"📋","aliases":["clipboard"],"tags":[],"category":"Objects","description":"clipboard","unicode_version":"6.0"},{"emoji":"📌","aliases":["pushpin"],"tags":["location"],"category":"Objects","description":"pushpin","unicode_version":"6.0"},{"emoji":"📍","aliases":["round_pushpin"],"tags":["location"],"category":"Objects","description":"round pushpin","unicode_version":"6.0"},{"emoji":"📎","aliases":["paperclip"],"tags":[],"category":"Objects","description":"paperclip","unicode_version":"6.0"},{"emoji":"🖇️","aliases":["paperclips"],"tags":[],"category":"Objects","description":"linked paperclips","unicode_version":"7.0"},{"emoji":"📏","aliases":["straight_ruler"],"tags":[],"category":"Objects","description":"straight ruler","unicode_version":"6.0"},{"emoji":"📐","aliases":["triangular_ruler"],"tags":[],"category":"Objects","description":"triangular ruler","unicode_version":"6.0"},{"emoji":"✂️","aliases":["scissors"],"tags":["cut"],"category":"Objects","description":"scissors","unicode_version":""},{"emoji":"🗃️","aliases":["card_file_box"],"tags":[],"category":"Objects","description":"card file box","unicode_version":"7.0"},{"emoji":"🗄️","aliases":["file_cabinet"],"tags":[],"category":"Objects","description":"file cabinet","unicode_version":"7.0"},{"emoji":"🗑️","aliases":["wastebasket"],"tags":["trash"],"category":"Objects","description":"wastebasket","unicode_version":"7.0"},{"emoji":"🔒","aliases":["lock"],"tags":["security","private"],"category":"Objects","description":"locked","unicode_version":"6.0"},{"emoji":"🔓","aliases":["unlock"],"tags":["security"],"category":"Objects","description":"unlocked","unicode_version":"6.0"},{"emoji":"🔏","aliases":["lock_with_ink_pen"],"tags":[],"category":"Objects","description":"locked with pen","unicode_version":"6.0"},{"emoji":"🔐","aliases":["closed_lock_with_key"],"tags":["security"],"category":"Objects","description":"locked with key","unicode_version":"6.0"},{"emoji":"🔑","aliases":["key"],"tags":["lock","password"],"category":"Objects","description":"key","unicode_version":"6.0"},{"emoji":"🗝️","aliases":["old_key"],"tags":[],"category":"Objects","description":"old key","unicode_version":"7.0"},{"emoji":"🔨","aliases":["hammer"],"tags":["tool"],"category":"Objects","description":"hammer","unicode_version":"6.0"},{"emoji":"🪓","aliases":["axe"],"tags":[],"category":"Objects","description":"axe","unicode_version":"12.0"},{"emoji":"⛏️","aliases":["pick"],"tags":[],"category":"Objects","description":"pick","unicode_version":"5.2"},{"emoji":"⚒️","aliases":["hammer_and_pick"],"tags":[],"category":"Objects","description":"hammer and pick","unicode_version":"4.1"},{"emoji":"🛠️","aliases":["hammer_and_wrench"],"tags":[],"category":"Objects","description":"hammer and wrench","unicode_version":"7.0"},{"emoji":"🗡️","aliases":["dagger"],"tags":[],"category":"Objects","description":"dagger","unicode_version":"7.0"},{"emoji":"⚔️","aliases":["crossed_swords"],"tags":[],"category":"Objects","description":"crossed swords","unicode_version":"4.1"},{"emoji":"🔫","aliases":["gun"],"tags":["shoot","weapon"],"category":"Objects","description":"water pistol","unicode_version":"6.0"},{"emoji":"🪃","aliases":["boomerang"],"tags":[],"category":"Objects","description":"boomerang","unicode_version":"13.0"},{"emoji":"🏹","aliases":["bow_and_arrow"],"tags":["archery"],"category":"Objects","description":"bow and arrow","unicode_version":"8.0"},{"emoji":"🛡️","aliases":["shield"],"tags":[],"category":"Objects","description":"shield","unicode_version":"7.0"},{"emoji":"🪚","aliases":["carpentry_saw"],"tags":[],"category":"Objects","description":"carpentry saw","unicode_version":"13.0"},{"emoji":"🔧","aliases":["wrench"],"tags":["tool"],"category":"Objects","description":"wrench","unicode_version":"6.0"},{"emoji":"🪛","aliases":["screwdriver"],"tags":[],"category":"Objects","description":"screwdriver","unicode_version":"13.0"},{"emoji":"🔩","aliases":["nut_and_bolt"],"tags":[],"category":"Objects","description":"nut and bolt","unicode_version":"6.0"},{"emoji":"⚙️","aliases":["gear"],"tags":[],"category":"Objects","description":"gear","unicode_version":"4.1"},{"emoji":"🗜️","aliases":["clamp"],"tags":[],"category":"Objects","description":"clamp","unicode_version":"7.0"},{"emoji":"⚖️","aliases":["balance_scale"],"tags":[],"category":"Objects","description":"balance scale","unicode_version":"4.1"},{"emoji":"🦯","aliases":["probing_cane"],"tags":[],"category":"Objects","description":"white cane","unicode_version":"12.0"},{"emoji":"🔗","aliases":["link"],"tags":[],"category":"Objects","description":"link","unicode_version":"6.0"},{"emoji":"⛓️","aliases":["chains"],"tags":[],"category":"Objects","description":"chains","unicode_version":"5.2"},{"emoji":"🪝","aliases":["hook"],"tags":[],"category":"Objects","description":"hook","unicode_version":"13.0"},{"emoji":"🧰","aliases":["toolbox"],"tags":[],"category":"Objects","description":"toolbox","unicode_version":"11.0"},{"emoji":"🧲","aliases":["magnet"],"tags":[],"category":"Objects","description":"magnet","unicode_version":"11.0"},{"emoji":"🪜","aliases":["ladder"],"tags":[],"category":"Objects","description":"ladder","unicode_version":"13.0"},{"emoji":"⚗️","aliases":["alembic"],"tags":[],"category":"Objects","description":"alembic","unicode_version":"4.1"},{"emoji":"🧪","aliases":["test_tube"],"tags":[],"category":"Objects","description":"test tube","unicode_version":"11.0"},{"emoji":"🧫","aliases":["petri_dish"],"tags":[],"category":"Objects","description":"petri dish","unicode_version":"11.0"},{"emoji":"🧬","aliases":["dna"],"tags":[],"category":"Objects","description":"dna","unicode_version":"11.0"},{"emoji":"🔬","aliases":["microscope"],"tags":["science","laboratory","investigate"],"category":"Objects","description":"microscope","unicode_version":"6.0"},{"emoji":"🔭","aliases":["telescope"],"tags":[],"category":"Objects","description":"telescope","unicode_version":"6.0"},{"emoji":"📡","aliases":["satellite"],"tags":["signal"],"category":"Objects","description":"satellite antenna","unicode_version":"6.0"},{"emoji":"💉","aliases":["syringe"],"tags":["health","hospital","needle"],"category":"Objects","description":"syringe","unicode_version":"6.0"},{"emoji":"🩸","aliases":["drop_of_blood"],"tags":[],"category":"Objects","description":"drop of blood","unicode_version":"12.0"},{"emoji":"💊","aliases":["pill"],"tags":["health","medicine"],"category":"Objects","description":"pill","unicode_version":"6.0"},{"emoji":"🩹","aliases":["adhesive_bandage"],"tags":[],"category":"Objects","description":"adhesive bandage","unicode_version":"12.0"},{"emoji":"🩺","aliases":["stethoscope"],"tags":[],"category":"Objects","description":"stethoscope","unicode_version":"12.0"},{"emoji":"🚪","aliases":["door"],"tags":[],"category":"Objects","description":"door","unicode_version":"6.0"},{"emoji":"🛗","aliases":["elevator"],"tags":[],"category":"Objects","description":"elevator","unicode_version":"13.0"},{"emoji":"🪞","aliases":["mirror"],"tags":[],"category":"Objects","description":"mirror","unicode_version":"13.0"},{"emoji":"🪟","aliases":["window"],"tags":[],"category":"Objects","description":"window","unicode_version":"13.0"},{"emoji":"🛏️","aliases":["bed"],"tags":[],"category":"Objects","description":"bed","unicode_version":"7.0"},{"emoji":"🛋️","aliases":["couch_and_lamp"],"tags":[],"category":"Objects","description":"couch and lamp","unicode_version":"7.0"},{"emoji":"🪑","aliases":["chair"],"tags":[],"category":"Objects","description":"chair","unicode_version":"12.0"},{"emoji":"🚽","aliases":["toilet"],"tags":["wc"],"category":"Objects","description":"toilet","unicode_version":"6.0"},{"emoji":"🪠","aliases":["plunger"],"tags":[],"category":"Objects","description":"plunger","unicode_version":"13.0"},{"emoji":"🚿","aliases":["shower"],"tags":["bath"],"category":"Objects","description":"shower","unicode_version":"6.0"},{"emoji":"🛁","aliases":["bathtub"],"tags":[],"category":"Objects","description":"bathtub","unicode_version":"6.0"},{"emoji":"🪤","aliases":["mouse_trap"],"tags":[],"category":"Objects","description":"mouse trap","unicode_version":"13.0"},{"emoji":"🪒","aliases":["razor"],"tags":[],"category":"Objects","description":"razor","unicode_version":"12.0"},{"emoji":"🧴","aliases":["lotion_bottle"],"tags":[],"category":"Objects","description":"lotion bottle","unicode_version":"11.0"},{"emoji":"🧷","aliases":["safety_pin"],"tags":[],"category":"Objects","description":"safety pin","unicode_version":"11.0"},{"emoji":"🧹","aliases":["broom"],"tags":[],"category":"Objects","description":"broom","unicode_version":"11.0"},{"emoji":"🧺","aliases":["basket"],"tags":[],"category":"Objects","description":"basket","unicode_version":"11.0"},{"emoji":"🧻","aliases":["roll_of_paper"],"tags":["toilet"],"category":"Objects","description":"roll of paper","unicode_version":"11.0"},{"emoji":"🪣","aliases":["bucket"],"tags":[],"category":"Objects","description":"bucket","unicode_version":"13.0"},{"emoji":"🧼","aliases":["soap"],"tags":[],"category":"Objects","description":"soap","unicode_version":"11.0"},{"emoji":"🪥","aliases":["toothbrush"],"tags":[],"category":"Objects","description":"toothbrush","unicode_version":"13.0"},{"emoji":"🧽","aliases":["sponge"],"tags":[],"category":"Objects","description":"sponge","unicode_version":"11.0"},{"emoji":"🧯","aliases":["fire_extinguisher"],"tags":[],"category":"Objects","description":"fire extinguisher","unicode_version":"11.0"},{"emoji":"🛒","aliases":["shopping_cart"],"tags":[],"category":"Objects","description":"shopping cart","unicode_version":"9.0"},{"emoji":"🚬","aliases":["smoking"],"tags":["cigarette"],"category":"Objects","description":"cigarette","unicode_version":"6.0"},{"emoji":"⚰️","aliases":["coffin"],"tags":["funeral"],"category":"Objects","description":"coffin","unicode_version":"4.1"},{"emoji":"🪦","aliases":["headstone"],"tags":[],"category":"Objects","description":"headstone","unicode_version":"13.0"},{"emoji":"⚱️","aliases":["funeral_urn"],"tags":[],"category":"Objects","description":"funeral urn","unicode_version":"4.1"},{"emoji":"🗿","aliases":["moyai"],"tags":["stone"],"category":"Objects","description":"moai","unicode_version":"6.0"},{"emoji":"🪧","aliases":["placard"],"tags":[],"category":"Objects","description":"placard","unicode_version":"13.0"},{"emoji":"🏧","aliases":["atm"],"tags":[],"category":"Symbols","description":"ATM sign","unicode_version":"6.0"},{"emoji":"🚮","aliases":["put_litter_in_its_place"],"tags":[],"category":"Symbols","description":"litter in bin sign","unicode_version":"6.0"},{"emoji":"🚰","aliases":["potable_water"],"tags":[],"category":"Symbols","description":"potable water","unicode_version":"6.0"},{"emoji":"♿","aliases":["wheelchair"],"tags":["accessibility"],"category":"Symbols","description":"wheelchair symbol","unicode_version":"4.1"},{"emoji":"🚹","aliases":["mens"],"tags":[],"category":"Symbols","description":"men’s room","unicode_version":"6.0"},{"emoji":"🚺","aliases":["womens"],"tags":[],"category":"Symbols","description":"women’s room","unicode_version":"6.0"},{"emoji":"🚻","aliases":["restroom"],"tags":["toilet"],"category":"Symbols","description":"restroom","unicode_version":"6.0"},{"emoji":"🚼","aliases":["baby_symbol"],"tags":[],"category":"Symbols","description":"baby symbol","unicode_version":"6.0"},{"emoji":"🚾","aliases":["wc"],"tags":["toilet","restroom"],"category":"Symbols","description":"water closet","unicode_version":"6.0"},{"emoji":"🛂","aliases":["passport_control"],"tags":[],"category":"Symbols","description":"passport control","unicode_version":"6.0"},{"emoji":"🛃","aliases":["customs"],"tags":[],"category":"Symbols","description":"customs","unicode_version":"6.0"},{"emoji":"🛄","aliases":["baggage_claim"],"tags":["airport"],"category":"Symbols","description":"baggage claim","unicode_version":"6.0"},{"emoji":"🛅","aliases":["left_luggage"],"tags":[],"category":"Symbols","description":"left luggage","unicode_version":"6.0"},{"emoji":"⚠️","aliases":["warning"],"tags":["wip"],"category":"Symbols","description":"warning","unicode_version":"4.0"},{"emoji":"🚸","aliases":["children_crossing"],"tags":[],"category":"Symbols","description":"children crossing","unicode_version":"6.0"},{"emoji":"⛔","aliases":["no_entry"],"tags":["limit"],"category":"Symbols","description":"no entry","unicode_version":"5.2"},{"emoji":"🚫","aliases":["no_entry_sign"],"tags":["block","forbidden"],"category":"Symbols","description":"prohibited","unicode_version":"6.0"},{"emoji":"🚳","aliases":["no_bicycles"],"tags":[],"category":"Symbols","description":"no bicycles","unicode_version":"6.0"},{"emoji":"🚭","aliases":["no_smoking"],"tags":[],"category":"Symbols","description":"no smoking","unicode_version":"6.0"},{"emoji":"🚯","aliases":["do_not_litter"],"tags":[],"category":"Symbols","description":"no littering","unicode_version":"6.0"},{"emoji":"🚱","aliases":["non-potable_water"],"tags":[],"category":"Symbols","description":"non-potable water","unicode_version":"6.0"},{"emoji":"🚷","aliases":["no_pedestrians"],"tags":[],"category":"Symbols","description":"no pedestrians","unicode_version":"6.0"},{"emoji":"📵","aliases":["no_mobile_phones"],"tags":[],"category":"Symbols","description":"no mobile phones","unicode_version":"6.0"},{"emoji":"🔞","aliases":["underage"],"tags":[],"category":"Symbols","description":"no one under eighteen","unicode_version":"6.0"},{"emoji":"☢️","aliases":["radioactive"],"tags":[],"category":"Symbols","description":"radioactive","unicode_version":""},{"emoji":"☣️","aliases":["biohazard"],"tags":[],"category":"Symbols","description":"biohazard","unicode_version":""},{"emoji":"⬆️","aliases":["arrow_up"],"tags":[],"category":"Symbols","description":"up arrow","unicode_version":"4.0"},{"emoji":"↗️","aliases":["arrow_upper_right"],"tags":[],"category":"Symbols","description":"up-right arrow","unicode_version":""},{"emoji":"➡️","aliases":["arrow_right"],"tags":[],"category":"Symbols","description":"right arrow","unicode_version":""},{"emoji":"↘️","aliases":["arrow_lower_right"],"tags":[],"category":"Symbols","description":"down-right arrow","unicode_version":""},{"emoji":"⬇️","aliases":["arrow_down"],"tags":[],"category":"Symbols","description":"down arrow","unicode_version":"4.0"},{"emoji":"↙️","aliases":["arrow_lower_left"],"tags":[],"category":"Symbols","description":"down-left arrow","unicode_version":""},{"emoji":"⬅️","aliases":["arrow_left"],"tags":[],"category":"Symbols","description":"left arrow","unicode_version":"4.0"},{"emoji":"↖️","aliases":["arrow_upper_left"],"tags":[],"category":"Symbols","description":"up-left arrow","unicode_version":""},{"emoji":"↕️","aliases":["arrow_up_down"],"tags":[],"category":"Symbols","description":"up-down arrow","unicode_version":""},{"emoji":"↔️","aliases":["left_right_arrow"],"tags":[],"category":"Symbols","description":"left-right arrow","unicode_version":""},{"emoji":"↩️","aliases":["leftwards_arrow_with_hook"],"tags":["return"],"category":"Symbols","description":"right arrow curving left","unicode_version":""},{"emoji":"↪️","aliases":["arrow_right_hook"],"tags":[],"category":"Symbols","description":"left arrow curving right","unicode_version":""},{"emoji":"⤴️","aliases":["arrow_heading_up"],"tags":[],"category":"Symbols","description":"right arrow curving up","unicode_version":""},{"emoji":"⤵️","aliases":["arrow_heading_down"],"tags":[],"category":"Symbols","description":"right arrow curving down","unicode_version":""},{"emoji":"🔃","aliases":["arrows_clockwise"],"tags":[],"category":"Symbols","description":"clockwise vertical arrows","unicode_version":"6.0"},{"emoji":"🔄","aliases":["arrows_counterclockwise"],"tags":["sync"],"category":"Symbols","description":"counterclockwise arrows button","unicode_version":"6.0"},{"emoji":"🔙","aliases":["back"],"tags":[],"category":"Symbols","description":"BACK arrow","unicode_version":"6.0"},{"emoji":"🔚","aliases":["end"],"tags":[],"category":"Symbols","description":"END arrow","unicode_version":"6.0"},{"emoji":"🔛","aliases":["on"],"tags":[],"category":"Symbols","description":"ON! arrow","unicode_version":"6.0"},{"emoji":"🔜","aliases":["soon"],"tags":[],"category":"Symbols","description":"SOON arrow","unicode_version":"6.0"},{"emoji":"🔝","aliases":["top"],"tags":[],"category":"Symbols","description":"TOP arrow","unicode_version":"6.0"},{"emoji":"🛐","aliases":["place_of_worship"],"tags":[],"category":"Symbols","description":"place of worship","unicode_version":"8.0"},{"emoji":"⚛️","aliases":["atom_symbol"],"tags":[],"category":"Symbols","description":"atom symbol","unicode_version":"4.1"},{"emoji":"🕉️","aliases":["om"],"tags":[],"category":"Symbols","description":"om","unicode_version":"7.0"},{"emoji":"✡️","aliases":["star_of_david"],"tags":[],"category":"Symbols","description":"star of David","unicode_version":""},{"emoji":"☸️","aliases":["wheel_of_dharma"],"tags":[],"category":"Symbols","description":"wheel of dharma","unicode_version":""},{"emoji":"☯️","aliases":["yin_yang"],"tags":[],"category":"Symbols","description":"yin yang","unicode_version":""},{"emoji":"✝️","aliases":["latin_cross"],"tags":[],"category":"Symbols","description":"latin cross","unicode_version":""},{"emoji":"☦️","aliases":["orthodox_cross"],"tags":[],"category":"Symbols","description":"orthodox cross","unicode_version":""},{"emoji":"☪️","aliases":["star_and_crescent"],"tags":[],"category":"Symbols","description":"star and crescent","unicode_version":""},{"emoji":"☮️","aliases":["peace_symbol"],"tags":[],"category":"Symbols","description":"peace symbol","unicode_version":""},{"emoji":"🕎","aliases":["menorah"],"tags":[],"category":"Symbols","description":"menorah","unicode_version":"8.0"},{"emoji":"🔯","aliases":["six_pointed_star"],"tags":[],"category":"Symbols","description":"dotted six-pointed star","unicode_version":"6.0"},{"emoji":"♈","aliases":["aries"],"tags":[],"category":"Symbols","description":"Aries","unicode_version":""},{"emoji":"♉","aliases":["taurus"],"tags":[],"category":"Symbols","description":"Taurus","unicode_version":""},{"emoji":"♊","aliases":["gemini"],"tags":[],"category":"Symbols","description":"Gemini","unicode_version":""},{"emoji":"♋","aliases":["cancer"],"tags":[],"category":"Symbols","description":"Cancer","unicode_version":""},{"emoji":"♌","aliases":["leo"],"tags":[],"category":"Symbols","description":"Leo","unicode_version":""},{"emoji":"♍","aliases":["virgo"],"tags":[],"category":"Symbols","description":"Virgo","unicode_version":""},{"emoji":"♎","aliases":["libra"],"tags":[],"category":"Symbols","description":"Libra","unicode_version":""},{"emoji":"♏","aliases":["scorpius"],"tags":[],"category":"Symbols","description":"Scorpio","unicode_version":""},{"emoji":"♐","aliases":["sagittarius"],"tags":[],"category":"Symbols","description":"Sagittarius","unicode_version":""},{"emoji":"♑","aliases":["capricorn"],"tags":[],"category":"Symbols","description":"Capricorn","unicode_version":""},{"emoji":"♒","aliases":["aquarius"],"tags":[],"category":"Symbols","description":"Aquarius","unicode_version":""},{"emoji":"♓","aliases":["pisces"],"tags":[],"category":"Symbols","description":"Pisces","unicode_version":""},{"emoji":"⛎","aliases":["ophiuchus"],"tags":[],"category":"Symbols","description":"Ophiuchus","unicode_version":"6.0"},{"emoji":"🔀","aliases":["twisted_rightwards_arrows"],"tags":["shuffle"],"category":"Symbols","description":"shuffle tracks button","unicode_version":"6.0"},{"emoji":"🔁","aliases":["repeat"],"tags":["loop"],"category":"Symbols","description":"repeat button","unicode_version":"6.0"},{"emoji":"🔂","aliases":["repeat_one"],"tags":[],"category":"Symbols","description":"repeat single button","unicode_version":"6.0"},{"emoji":"▶️","aliases":["arrow_forward"],"tags":[],"category":"Symbols","description":"play button","unicode_version":""},{"emoji":"⏩","aliases":["fast_forward"],"tags":[],"category":"Symbols","description":"fast-forward button","unicode_version":"6.0"},{"emoji":"⏭️","aliases":["next_track_button"],"tags":[],"category":"Symbols","description":"next track button","unicode_version":"6.0"},{"emoji":"⏯️","aliases":["play_or_pause_button"],"tags":[],"category":"Symbols","description":"play or pause button","unicode_version":"6.0"},{"emoji":"◀️","aliases":["arrow_backward"],"tags":[],"category":"Symbols","description":"reverse button","unicode_version":""},{"emoji":"⏪","aliases":["rewind"],"tags":[],"category":"Symbols","description":"fast reverse button","unicode_version":"6.0"},{"emoji":"⏮️","aliases":["previous_track_button"],"tags":[],"category":"Symbols","description":"last track button","unicode_version":"6.0"},{"emoji":"🔼","aliases":["arrow_up_small"],"tags":[],"category":"Symbols","description":"upwards button","unicode_version":"6.0"},{"emoji":"⏫","aliases":["arrow_double_up"],"tags":[],"category":"Symbols","description":"fast up button","unicode_version":"6.0"},{"emoji":"🔽","aliases":["arrow_down_small"],"tags":[],"category":"Symbols","description":"downwards button","unicode_version":"6.0"},{"emoji":"⏬","aliases":["arrow_double_down"],"tags":[],"category":"Symbols","description":"fast down button","unicode_version":"6.0"},{"emoji":"⏸️","aliases":["pause_button"],"tags":[],"category":"Symbols","description":"pause button","unicode_version":"7.0"},{"emoji":"⏹️","aliases":["stop_button"],"tags":[],"category":"Symbols","description":"stop button","unicode_version":"7.0"},{"emoji":"⏺️","aliases":["record_button"],"tags":[],"category":"Symbols","description":"record button","unicode_version":"7.0"},{"emoji":"⏏️","aliases":["eject_button"],"tags":[],"category":"Symbols","description":"eject button","unicode_version":"11.0"},{"emoji":"🎦","aliases":["cinema"],"tags":["film","movie"],"category":"Symbols","description":"cinema","unicode_version":"6.0"},{"emoji":"🔅","aliases":["low_brightness"],"tags":[],"category":"Symbols","description":"dim button","unicode_version":"6.0"},{"emoji":"🔆","aliases":["high_brightness"],"tags":[],"category":"Symbols","description":"bright button","unicode_version":"6.0"},{"emoji":"📶","aliases":["signal_strength"],"tags":["wifi"],"category":"Symbols","description":"antenna bars","unicode_version":"6.0"},{"emoji":"📳","aliases":["vibration_mode"],"tags":[],"category":"Symbols","description":"vibration mode","unicode_version":"6.0"},{"emoji":"📴","aliases":["mobile_phone_off"],"tags":["mute","off"],"category":"Symbols","description":"mobile phone off","unicode_version":"6.0"},{"emoji":"♀️","aliases":["female_sign"],"tags":[],"category":"Symbols","description":"female sign","unicode_version":"11.0"},{"emoji":"♂️","aliases":["male_sign"],"tags":[],"category":"Symbols","description":"male sign","unicode_version":"11.0"},{"emoji":"⚧️","aliases":["transgender_symbol"],"tags":[],"category":"Symbols","description":"transgender symbol","unicode_version":"13.0"},{"emoji":"✖️","aliases":["heavy_multiplication_x"],"tags":[],"category":"Symbols","description":"multiply","unicode_version":""},{"emoji":"➕","aliases":["heavy_plus_sign"],"tags":[],"category":"Symbols","description":"plus","unicode_version":"6.0"},{"emoji":"➖","aliases":["heavy_minus_sign"],"tags":[],"category":"Symbols","description":"minus","unicode_version":"6.0"},{"emoji":"➗","aliases":["heavy_division_sign"],"tags":[],"category":"Symbols","description":"divide","unicode_version":"6.0"},{"emoji":"♾️","aliases":["infinity"],"tags":[],"category":"Symbols","description":"infinity","unicode_version":"11.0"},{"emoji":"‼️","aliases":["bangbang"],"tags":[],"category":"Symbols","description":"double exclamation mark","unicode_version":""},{"emoji":"⁉️","aliases":["interrobang"],"tags":[],"category":"Symbols","description":"exclamation question mark","unicode_version":"3.0"},{"emoji":"❓","aliases":["question"],"tags":["confused"],"category":"Symbols","description":"red question mark","unicode_version":"6.0"},{"emoji":"❔","aliases":["grey_question"],"tags":[],"category":"Symbols","description":"white question mark","unicode_version":"6.0"},{"emoji":"❕","aliases":["grey_exclamation"],"tags":[],"category":"Symbols","description":"white exclamation mark","unicode_version":"6.0"},{"emoji":"❗","aliases":["exclamation","heavy_exclamation_mark"],"tags":["bang"],"category":"Symbols","description":"red exclamation mark","unicode_version":"5.2"},{"emoji":"〰️","aliases":["wavy_dash"],"tags":[],"category":"Symbols","description":"wavy dash","unicode_version":""},{"emoji":"💱","aliases":["currency_exchange"],"tags":[],"category":"Symbols","description":"currency exchange","unicode_version":"6.0"},{"emoji":"💲","aliases":["heavy_dollar_sign"],"tags":[],"category":"Symbols","description":"heavy dollar sign","unicode_version":"6.0"},{"emoji":"⚕️","aliases":["medical_symbol"],"tags":[],"category":"Symbols","description":"medical symbol","unicode_version":"11.0"},{"emoji":"♻️","aliases":["recycle"],"tags":["environment","green"],"category":"Symbols","description":"recycling symbol","unicode_version":"3.2"},{"emoji":"⚜️","aliases":["fleur_de_lis"],"tags":[],"category":"Symbols","description":"fleur-de-lis","unicode_version":"4.1"},{"emoji":"🔱","aliases":["trident"],"tags":[],"category":"Symbols","description":"trident emblem","unicode_version":"6.0"},{"emoji":"📛","aliases":["name_badge"],"tags":[],"category":"Symbols","description":"name badge","unicode_version":"6.0"},{"emoji":"🔰","aliases":["beginner"],"tags":[],"category":"Symbols","description":"Japanese symbol for beginner","unicode_version":"6.0"},{"emoji":"⭕","aliases":["o"],"tags":[],"category":"Symbols","description":"hollow red circle","unicode_version":"5.2"},{"emoji":"✅","aliases":["white_check_mark"],"tags":[],"category":"Symbols","description":"check mark button","unicode_version":"6.0"},{"emoji":"☑️","aliases":["ballot_box_with_check"],"tags":[],"category":"Symbols","description":"check box with check","unicode_version":""},{"emoji":"✔️","aliases":["heavy_check_mark"],"tags":[],"category":"Symbols","description":"check mark","unicode_version":""},{"emoji":"❌","aliases":["x"],"tags":[],"category":"Symbols","description":"cross mark","unicode_version":"6.0"},{"emoji":"❎","aliases":["negative_squared_cross_mark"],"tags":[],"category":"Symbols","description":"cross mark button","unicode_version":"6.0"},{"emoji":"➰","aliases":["curly_loop"],"tags":[],"category":"Symbols","description":"curly loop","unicode_version":"6.0"},{"emoji":"➿","aliases":["loop"],"tags":[],"category":"Symbols","description":"double curly loop","unicode_version":"6.0"},{"emoji":"〽️","aliases":["part_alternation_mark"],"tags":[],"category":"Symbols","description":"part alternation mark","unicode_version":"3.2"},{"emoji":"✳️","aliases":["eight_spoked_asterisk"],"tags":[],"category":"Symbols","description":"eight-spoked asterisk","unicode_version":""},{"emoji":"✴️","aliases":["eight_pointed_black_star"],"tags":[],"category":"Symbols","description":"eight-pointed star","unicode_version":""},{"emoji":"❇️","aliases":["sparkle"],"tags":[],"category":"Symbols","description":"sparkle","unicode_version":""},{"emoji":"©️","aliases":["copyright"],"tags":[],"category":"Symbols","description":"copyright","unicode_version":""},{"emoji":"®️","aliases":["registered"],"tags":[],"category":"Symbols","description":"registered","unicode_version":""},{"emoji":"™️","aliases":["tm"],"tags":["trademark"],"category":"Symbols","description":"trade mark","unicode_version":""},{"emoji":"#️⃣","aliases":["hash"],"tags":["number"],"category":"Symbols","description":"keycap: #","unicode_version":""},{"emoji":"*️⃣","aliases":["asterisk"],"tags":[],"category":"Symbols","description":"keycap: *","unicode_version":""},{"emoji":"0️⃣","aliases":["zero"],"tags":[],"category":"Symbols","description":"keycap: 0","unicode_version":""},{"emoji":"1️⃣","aliases":["one"],"tags":[],"category":"Symbols","description":"keycap: 1","unicode_version":""},{"emoji":"2️⃣","aliases":["two"],"tags":[],"category":"Symbols","description":"keycap: 2","unicode_version":""},{"emoji":"3️⃣","aliases":["three"],"tags":[],"category":"Symbols","description":"keycap: 3","unicode_version":""},{"emoji":"4️⃣","aliases":["four"],"tags":[],"category":"Symbols","description":"keycap: 4","unicode_version":""},{"emoji":"5️⃣","aliases":["five"],"tags":[],"category":"Symbols","description":"keycap: 5","unicode_version":""},{"emoji":"6️⃣","aliases":["six"],"tags":[],"category":"Symbols","description":"keycap: 6","unicode_version":""},{"emoji":"7️⃣","aliases":["seven"],"tags":[],"category":"Symbols","description":"keycap: 7","unicode_version":""},{"emoji":"8️⃣","aliases":["eight"],"tags":[],"category":"Symbols","description":"keycap: 8","unicode_version":""},{"emoji":"9️⃣","aliases":["nine"],"tags":[],"category":"Symbols","description":"keycap: 9","unicode_version":""},{"emoji":"🔟","aliases":["keycap_ten"],"tags":[],"category":"Symbols","description":"keycap: 10","unicode_version":"6.0"},{"emoji":"🔠","aliases":["capital_abcd"],"tags":["letters"],"category":"Symbols","description":"input latin uppercase","unicode_version":"6.0"},{"emoji":"🔡","aliases":["abcd"],"tags":[],"category":"Symbols","description":"input latin lowercase","unicode_version":"6.0"},{"emoji":"🔢","aliases":["1234"],"tags":["numbers"],"category":"Symbols","description":"input numbers","unicode_version":"6.0"},{"emoji":"🔣","aliases":["symbols"],"tags":[],"category":"Symbols","description":"input symbols","unicode_version":"6.0"},{"emoji":"🔤","aliases":["abc"],"tags":["alphabet"],"category":"Symbols","description":"input latin letters","unicode_version":"6.0"},{"emoji":"🅰️","aliases":["a"],"tags":[],"category":"Symbols","description":"A button (blood type)","unicode_version":"6.0"},{"emoji":"🆎","aliases":["ab"],"tags":[],"category":"Symbols","description":"AB button (blood type)","unicode_version":"6.0"},{"emoji":"🅱️","aliases":["b"],"tags":[],"category":"Symbols","description":"B button (blood type)","unicode_version":"6.0"},{"emoji":"🆑","aliases":["cl"],"tags":[],"category":"Symbols","description":"CL button","unicode_version":"6.0"},{"emoji":"🆒","aliases":["cool"],"tags":[],"category":"Symbols","description":"COOL button","unicode_version":"6.0"},{"emoji":"🆓","aliases":["free"],"tags":[],"category":"Symbols","description":"FREE button","unicode_version":"6.0"},{"emoji":"ℹ️","aliases":["information_source"],"tags":[],"category":"Symbols","description":"information","unicode_version":"3.0"},{"emoji":"🆔","aliases":["id"],"tags":[],"category":"Symbols","description":"ID button","unicode_version":"6.0"},{"emoji":"Ⓜ️","aliases":["m"],"tags":[],"category":"Symbols","description":"circled M","unicode_version":""},{"emoji":"🆕","aliases":["new"],"tags":["fresh"],"category":"Symbols","description":"NEW button","unicode_version":"6.0"},{"emoji":"🆖","aliases":["ng"],"tags":[],"category":"Symbols","description":"NG button","unicode_version":"6.0"},{"emoji":"🅾️","aliases":["o2"],"tags":[],"category":"Symbols","description":"O button (blood type)","unicode_version":"6.0"},{"emoji":"🆗","aliases":["ok"],"tags":["yes"],"category":"Symbols","description":"OK button","unicode_version":"6.0"},{"emoji":"🅿️","aliases":["parking"],"tags":[],"category":"Symbols","description":"P button","unicode_version":"5.2"},{"emoji":"🆘","aliases":["sos"],"tags":["help","emergency"],"category":"Symbols","description":"SOS button","unicode_version":"6.0"},{"emoji":"🆙","aliases":["up"],"tags":[],"category":"Symbols","description":"UP! button","unicode_version":"6.0"},{"emoji":"🆚","aliases":["vs"],"tags":[],"category":"Symbols","description":"VS button","unicode_version":"6.0"},{"emoji":"🈁","aliases":["koko"],"tags":[],"category":"Symbols","description":"Japanese “here” button","unicode_version":"6.0"},{"emoji":"🈂️","aliases":["sa"],"tags":[],"category":"Symbols","description":"Japanese “service charge” button","unicode_version":"6.0"},{"emoji":"🈷️","aliases":["u6708"],"tags":[],"category":"Symbols","description":"Japanese “monthly amount” button","unicode_version":"6.0"},{"emoji":"🈶","aliases":["u6709"],"tags":[],"category":"Symbols","description":"Japanese “not free of charge” button","unicode_version":"6.0"},{"emoji":"🈯","aliases":["u6307"],"tags":[],"category":"Symbols","description":"Japanese “reserved” button","unicode_version":""},{"emoji":"🉐","aliases":["ideograph_advantage"],"tags":[],"category":"Symbols","description":"Japanese “bargain” button","unicode_version":"6.0"},{"emoji":"🈹","aliases":["u5272"],"tags":[],"category":"Symbols","description":"Japanese “discount” button","unicode_version":"6.0"},{"emoji":"🈚","aliases":["u7121"],"tags":[],"category":"Symbols","description":"Japanese “free of charge” button","unicode_version":""},{"emoji":"🈲","aliases":["u7981"],"tags":[],"category":"Symbols","description":"Japanese “prohibited” button","unicode_version":"6.0"},{"emoji":"🉑","aliases":["accept"],"tags":[],"category":"Symbols","description":"Japanese “acceptable” button","unicode_version":"6.0"},{"emoji":"🈸","aliases":["u7533"],"tags":[],"category":"Symbols","description":"Japanese “application” button","unicode_version":"6.0"},{"emoji":"🈴","aliases":["u5408"],"tags":[],"category":"Symbols","description":"Japanese “passing grade” button","unicode_version":"6.0"},{"emoji":"🈳","aliases":["u7a7a"],"tags":[],"category":"Symbols","description":"Japanese “vacancy” button","unicode_version":"6.0"},{"emoji":"㊗️","aliases":["congratulations"],"tags":[],"category":"Symbols","description":"Japanese “congratulations” button","unicode_version":""},{"emoji":"㊙️","aliases":["secret"],"tags":[],"category":"Symbols","description":"Japanese “secret” button","unicode_version":""},{"emoji":"🈺","aliases":["u55b6"],"tags":[],"category":"Symbols","description":"Japanese “open for business” button","unicode_version":"6.0"},{"emoji":"🈵","aliases":["u6e80"],"tags":[],"category":"Symbols","description":"Japanese “no vacancy” button","unicode_version":"6.0"},{"emoji":"🔴","aliases":["red_circle"],"tags":[],"category":"Symbols","description":"red circle","unicode_version":"6.0"},{"emoji":"🟠","aliases":["orange_circle"],"tags":[],"category":"Symbols","description":"orange circle","unicode_version":"12.0"},{"emoji":"🟡","aliases":["yellow_circle"],"tags":[],"category":"Symbols","description":"yellow circle","unicode_version":"12.0"},{"emoji":"🟢","aliases":["green_circle"],"tags":[],"category":"Symbols","description":"green circle","unicode_version":"12.0"},{"emoji":"🔵","aliases":["large_blue_circle"],"tags":[],"category":"Symbols","description":"blue circle","unicode_version":"6.0"},{"emoji":"🟣","aliases":["purple_circle"],"tags":[],"category":"Symbols","description":"purple circle","unicode_version":"12.0"},{"emoji":"🟤","aliases":["brown_circle"],"tags":[],"category":"Symbols","description":"brown circle","unicode_version":"12.0"},{"emoji":"⚫","aliases":["black_circle"],"tags":[],"category":"Symbols","description":"black circle","unicode_version":"4.1"},{"emoji":"⚪","aliases":["white_circle"],"tags":[],"category":"Symbols","description":"white circle","unicode_version":"4.1"},{"emoji":"🟥","aliases":["red_square"],"tags":[],"category":"Symbols","description":"red square","unicode_version":"12.0"},{"emoji":"🟧","aliases":["orange_square"],"tags":[],"category":"Symbols","description":"orange square","unicode_version":"12.0"},{"emoji":"🟨","aliases":["yellow_square"],"tags":[],"category":"Symbols","description":"yellow square","unicode_version":"12.0"},{"emoji":"🟩","aliases":["green_square"],"tags":[],"category":"Symbols","description":"green square","unicode_version":"12.0"},{"emoji":"🟦","aliases":["blue_square"],"tags":[],"category":"Symbols","description":"blue square","unicode_version":"12.0"},{"emoji":"🟪","aliases":["purple_square"],"tags":[],"category":"Symbols","description":"purple square","unicode_version":"12.0"},{"emoji":"🟫","aliases":["brown_square"],"tags":[],"category":"Symbols","description":"brown square","unicode_version":"12.0"},{"emoji":"⬛","aliases":["black_large_square"],"tags":[],"category":"Symbols","description":"black large square","unicode_version":"5.1"},{"emoji":"⬜","aliases":["white_large_square"],"tags":[],"category":"Symbols","description":"white large square","unicode_version":"5.1"},{"emoji":"◼️","aliases":["black_medium_square"],"tags":[],"category":"Symbols","description":"black medium square","unicode_version":"3.2"},{"emoji":"◻️","aliases":["white_medium_square"],"tags":[],"category":"Symbols","description":"white medium square","unicode_version":"3.2"},{"emoji":"◾","aliases":["black_medium_small_square"],"tags":[],"category":"Symbols","description":"black medium-small square","unicode_version":"3.2"},{"emoji":"◽","aliases":["white_medium_small_square"],"tags":[],"category":"Symbols","description":"white medium-small square","unicode_version":"3.2"},{"emoji":"▪️","aliases":["black_small_square"],"tags":[],"category":"Symbols","description":"black small square","unicode_version":""},{"emoji":"▫️","aliases":["white_small_square"],"tags":[],"category":"Symbols","description":"white small square","unicode_version":""},{"emoji":"🔶","aliases":["large_orange_diamond"],"tags":[],"category":"Symbols","description":"large orange diamond","unicode_version":"6.0"},{"emoji":"🔷","aliases":["large_blue_diamond"],"tags":[],"category":"Symbols","description":"large blue diamond","unicode_version":"6.0"},{"emoji":"🔸","aliases":["small_orange_diamond"],"tags":[],"category":"Symbols","description":"small orange diamond","unicode_version":"6.0"},{"emoji":"🔹","aliases":["small_blue_diamond"],"tags":[],"category":"Symbols","description":"small blue diamond","unicode_version":"6.0"},{"emoji":"🔺","aliases":["small_red_triangle"],"tags":[],"category":"Symbols","description":"red triangle pointed up","unicode_version":"6.0"},{"emoji":"🔻","aliases":["small_red_triangle_down"],"tags":[],"category":"Symbols","description":"red triangle pointed down","unicode_version":"6.0"},{"emoji":"💠","aliases":["diamond_shape_with_a_dot_inside"],"tags":[],"category":"Symbols","description":"diamond with a dot","unicode_version":"6.0"},{"emoji":"🔘","aliases":["radio_button"],"tags":[],"category":"Symbols","description":"radio button","unicode_version":"6.0"},{"emoji":"🔳","aliases":["white_square_button"],"tags":[],"category":"Symbols","description":"white square button","unicode_version":"6.0"},{"emoji":"🔲","aliases":["black_square_button"],"tags":[],"category":"Symbols","description":"black square button","unicode_version":"6.0"},{"emoji":"🏁","aliases":["checkered_flag"],"tags":["milestone","finish"],"category":"Flags","description":"chequered flag","unicode_version":"6.0"},{"emoji":"🚩","aliases":["triangular_flag_on_post"],"tags":[],"category":"Flags","description":"triangular flag","unicode_version":"6.0"},{"emoji":"🎌","aliases":["crossed_flags"],"tags":[],"category":"Flags","description":"crossed flags","unicode_version":"6.0"},{"emoji":"🏴","aliases":["black_flag"],"tags":[],"category":"Flags","description":"black flag","unicode_version":"7.0"},{"emoji":"🏳️","aliases":["white_flag"],"tags":[],"category":"Flags","description":"white flag","unicode_version":"7.0"},{"emoji":"🏳️‍🌈","aliases":["rainbow_flag"],"tags":["pride"],"category":"Flags","description":"rainbow flag","unicode_version":"6.0"},{"emoji":"🏳️‍⚧️","aliases":["transgender_flag"],"tags":[],"category":"Flags","description":"transgender flag","unicode_version":"13.0"},{"emoji":"🏴‍☠️","aliases":["pirate_flag"],"tags":[],"category":"Flags","description":"pirate flag","unicode_version":"11.0"},{"emoji":"🇦🇨","aliases":["ascension_island"],"tags":[],"category":"Flags","description":"flag: Ascension Island","unicode_version":"11.0"},{"emoji":"🇦🇩","aliases":["andorra"],"tags":[],"category":"Flags","description":"flag: Andorra","unicode_version":"6.0"},{"emoji":"🇦🇪","aliases":["united_arab_emirates"],"tags":[],"category":"Flags","description":"flag: United Arab Emirates","unicode_version":"6.0"},{"emoji":"🇦🇫","aliases":["afghanistan"],"tags":[],"category":"Flags","description":"flag: Afghanistan","unicode_version":"6.0"},{"emoji":"🇦🇬","aliases":["antigua_barbuda"],"tags":[],"category":"Flags","description":"flag: Antigua & Barbuda","unicode_version":"6.0"},{"emoji":"🇦🇮","aliases":["anguilla"],"tags":[],"category":"Flags","description":"flag: Anguilla","unicode_version":"6.0"},{"emoji":"🇦🇱","aliases":["albania"],"tags":[],"category":"Flags","description":"flag: Albania","unicode_version":"6.0"},{"emoji":"🇦🇲","aliases":["armenia"],"tags":[],"category":"Flags","description":"flag: Armenia","unicode_version":"6.0"},{"emoji":"🇦🇴","aliases":["angola"],"tags":[],"category":"Flags","description":"flag: Angola","unicode_version":"6.0"},{"emoji":"🇦🇶","aliases":["antarctica"],"tags":[],"category":"Flags","description":"flag: Antarctica","unicode_version":"6.0"},{"emoji":"🇦🇷","aliases":["argentina"],"tags":[],"category":"Flags","description":"flag: Argentina","unicode_version":"6.0"},{"emoji":"🇦🇸","aliases":["american_samoa"],"tags":[],"category":"Flags","description":"flag: American Samoa","unicode_version":"6.0"},{"emoji":"🇦🇹","aliases":["austria"],"tags":[],"category":"Flags","description":"flag: Austria","unicode_version":"6.0"},{"emoji":"🇦🇺","aliases":["australia"],"tags":[],"category":"Flags","description":"flag: Australia","unicode_version":"6.0"},{"emoji":"🇦🇼","aliases":["aruba"],"tags":[],"category":"Flags","description":"flag: Aruba","unicode_version":"6.0"},{"emoji":"🇦🇽","aliases":["aland_islands"],"tags":[],"category":"Flags","description":"flag: Åland Islands","unicode_version":"6.0"},{"emoji":"🇦🇿","aliases":["azerbaijan"],"tags":[],"category":"Flags","description":"flag: Azerbaijan","unicode_version":"6.0"},{"emoji":"🇧🇦","aliases":["bosnia_herzegovina"],"tags":[],"category":"Flags","description":"flag: Bosnia & Herzegovina","unicode_version":"6.0"},{"emoji":"🇧🇧","aliases":["barbados"],"tags":[],"category":"Flags","description":"flag: Barbados","unicode_version":"6.0"},{"emoji":"🇧🇩","aliases":["bangladesh"],"tags":[],"category":"Flags","description":"flag: Bangladesh","unicode_version":"6.0"},{"emoji":"🇧🇪","aliases":["belgium"],"tags":[],"category":"Flags","description":"flag: Belgium","unicode_version":"6.0"},{"emoji":"🇧🇫","aliases":["burkina_faso"],"tags":[],"category":"Flags","description":"flag: Burkina Faso","unicode_version":"6.0"},{"emoji":"🇧🇬","aliases":["bulgaria"],"tags":[],"category":"Flags","description":"flag: Bulgaria","unicode_version":"6.0"},{"emoji":"🇧🇭","aliases":["bahrain"],"tags":[],"category":"Flags","description":"flag: Bahrain","unicode_version":"6.0"},{"emoji":"🇧🇮","aliases":["burundi"],"tags":[],"category":"Flags","description":"flag: Burundi","unicode_version":"6.0"},{"emoji":"🇧🇯","aliases":["benin"],"tags":[],"category":"Flags","description":"flag: Benin","unicode_version":"6.0"},{"emoji":"🇧🇱","aliases":["st_barthelemy"],"tags":[],"category":"Flags","description":"flag: St. Barthélemy","unicode_version":"6.0"},{"emoji":"🇧🇲","aliases":["bermuda"],"tags":[],"category":"Flags","description":"flag: Bermuda","unicode_version":"6.0"},{"emoji":"🇧🇳","aliases":["brunei"],"tags":[],"category":"Flags","description":"flag: Brunei","unicode_version":"6.0"},{"emoji":"🇧🇴","aliases":["bolivia"],"tags":[],"category":"Flags","description":"flag: Bolivia","unicode_version":"6.0"},{"emoji":"🇧🇶","aliases":["caribbean_netherlands"],"tags":[],"category":"Flags","description":"flag: Caribbean Netherlands","unicode_version":"6.0"},{"emoji":"🇧🇷","aliases":["brazil"],"tags":[],"category":"Flags","description":"flag: Brazil","unicode_version":"6.0"},{"emoji":"🇧🇸","aliases":["bahamas"],"tags":[],"category":"Flags","description":"flag: Bahamas","unicode_version":"6.0"},{"emoji":"🇧🇹","aliases":["bhutan"],"tags":[],"category":"Flags","description":"flag: Bhutan","unicode_version":"6.0"},{"emoji":"🇧🇻","aliases":["bouvet_island"],"tags":[],"category":"Flags","description":"flag: Bouvet Island","unicode_version":"11.0"},{"emoji":"🇧🇼","aliases":["botswana"],"tags":[],"category":"Flags","description":"flag: Botswana","unicode_version":"6.0"},{"emoji":"🇧🇾","aliases":["belarus"],"tags":[],"category":"Flags","description":"flag: Belarus","unicode_version":"6.0"},{"emoji":"🇧🇿","aliases":["belize"],"tags":[],"category":"Flags","description":"flag: Belize","unicode_version":"6.0"},{"emoji":"🇨🇦","aliases":["canada"],"tags":[],"category":"Flags","description":"flag: Canada","unicode_version":"6.0"},{"emoji":"🇨🇨","aliases":["cocos_islands"],"tags":["keeling"],"category":"Flags","description":"flag: Cocos (Keeling) Islands","unicode_version":"6.0"},{"emoji":"🇨🇩","aliases":["congo_kinshasa"],"tags":[],"category":"Flags","description":"flag: Congo - Kinshasa","unicode_version":"6.0"},{"emoji":"🇨🇫","aliases":["central_african_republic"],"tags":[],"category":"Flags","description":"flag: Central African Republic","unicode_version":"6.0"},{"emoji":"🇨🇬","aliases":["congo_brazzaville"],"tags":[],"category":"Flags","description":"flag: Congo - Brazzaville","unicode_version":"6.0"},{"emoji":"🇨🇭","aliases":["switzerland"],"tags":[],"category":"Flags","description":"flag: Switzerland","unicode_version":"6.0"},{"emoji":"🇨🇮","aliases":["cote_divoire"],"tags":["ivory"],"category":"Flags","description":"flag: Côte d’Ivoire","unicode_version":"6.0"},{"emoji":"🇨🇰","aliases":["cook_islands"],"tags":[],"category":"Flags","description":"flag: Cook Islands","unicode_version":"6.0"},{"emoji":"🇨🇱","aliases":["chile"],"tags":[],"category":"Flags","description":"flag: Chile","unicode_version":"6.0"},{"emoji":"🇨🇲","aliases":["cameroon"],"tags":[],"category":"Flags","description":"flag: Cameroon","unicode_version":"6.0"},{"emoji":"🇨🇳","aliases":["cn"],"tags":["china"],"category":"Flags","description":"flag: China","unicode_version":"6.0"},{"emoji":"🇨🇴","aliases":["colombia"],"tags":[],"category":"Flags","description":"flag: Colombia","unicode_version":"6.0"},{"emoji":"🇨🇵","aliases":["clipperton_island"],"tags":[],"category":"Flags","description":"flag: Clipperton Island","unicode_version":"11.0"},{"emoji":"🇨🇷","aliases":["costa_rica"],"tags":[],"category":"Flags","description":"flag: Costa Rica","unicode_version":"6.0"},{"emoji":"🇨🇺","aliases":["cuba"],"tags":[],"category":"Flags","description":"flag: Cuba","unicode_version":"6.0"},{"emoji":"🇨🇻","aliases":["cape_verde"],"tags":[],"category":"Flags","description":"flag: Cape Verde","unicode_version":"6.0"},{"emoji":"🇨🇼","aliases":["curacao"],"tags":[],"category":"Flags","description":"flag: Curaçao","unicode_version":"6.0"},{"emoji":"🇨🇽","aliases":["christmas_island"],"tags":[],"category":"Flags","description":"flag: Christmas Island","unicode_version":"6.0"},{"emoji":"🇨🇾","aliases":["cyprus"],"tags":[],"category":"Flags","description":"flag: Cyprus","unicode_version":"6.0"},{"emoji":"🇨🇿","aliases":["czech_republic"],"tags":[],"category":"Flags","description":"flag: Czechia","unicode_version":"6.0"},{"emoji":"🇩🇪","aliases":["de"],"tags":["flag","germany"],"category":"Flags","description":"flag: Germany","unicode_version":"6.0"},{"emoji":"🇩🇬","aliases":["diego_garcia"],"tags":[],"category":"Flags","description":"flag: Diego Garcia","unicode_version":"11.0"},{"emoji":"🇩🇯","aliases":["djibouti"],"tags":[],"category":"Flags","description":"flag: Djibouti","unicode_version":"6.0"},{"emoji":"🇩🇰","aliases":["denmark"],"tags":[],"category":"Flags","description":"flag: Denmark","unicode_version":"6.0"},{"emoji":"🇩🇲","aliases":["dominica"],"tags":[],"category":"Flags","description":"flag: Dominica","unicode_version":"6.0"},{"emoji":"🇩🇴","aliases":["dominican_republic"],"tags":[],"category":"Flags","description":"flag: Dominican Republic","unicode_version":"6.0"},{"emoji":"🇩🇿","aliases":["algeria"],"tags":[],"category":"Flags","description":"flag: Algeria","unicode_version":"6.0"},{"emoji":"🇪🇦","aliases":["ceuta_melilla"],"tags":[],"category":"Flags","description":"flag: Ceuta & Melilla","unicode_version":"11.0"},{"emoji":"🇪🇨","aliases":["ecuador"],"tags":[],"category":"Flags","description":"flag: Ecuador","unicode_version":"6.0"},{"emoji":"🇪🇪","aliases":["estonia"],"tags":[],"category":"Flags","description":"flag: Estonia","unicode_version":"6.0"},{"emoji":"🇪🇬","aliases":["egypt"],"tags":[],"category":"Flags","description":"flag: Egypt","unicode_version":"6.0"},{"emoji":"🇪🇭","aliases":["western_sahara"],"tags":[],"category":"Flags","description":"flag: Western Sahara","unicode_version":"6.0"},{"emoji":"🇪🇷","aliases":["eritrea"],"tags":[],"category":"Flags","description":"flag: Eritrea","unicode_version":"6.0"},{"emoji":"🇪🇸","aliases":["es"],"tags":["spain"],"category":"Flags","description":"flag: Spain","unicode_version":"6.0"},{"emoji":"🇪🇹","aliases":["ethiopia"],"tags":[],"category":"Flags","description":"flag: Ethiopia","unicode_version":"6.0"},{"emoji":"🇪🇺","aliases":["eu","european_union"],"tags":[],"category":"Flags","description":"flag: European Union","unicode_version":"6.0"},{"emoji":"🇫🇮","aliases":["finland"],"tags":[],"category":"Flags","description":"flag: Finland","unicode_version":"6.0"},{"emoji":"🇫🇯","aliases":["fiji"],"tags":[],"category":"Flags","description":"flag: Fiji","unicode_version":"6.0"},{"emoji":"🇫🇰","aliases":["falkland_islands"],"tags":[],"category":"Flags","description":"flag: Falkland Islands","unicode_version":"6.0"},{"emoji":"🇫🇲","aliases":["micronesia"],"tags":[],"category":"Flags","description":"flag: Micronesia","unicode_version":"6.0"},{"emoji":"🇫🇴","aliases":["faroe_islands"],"tags":[],"category":"Flags","description":"flag: Faroe Islands","unicode_version":"6.0"},{"emoji":"🇫🇷","aliases":["fr"],"tags":["france","french"],"category":"Flags","description":"flag: France","unicode_version":"6.0"},{"emoji":"🇬🇦","aliases":["gabon"],"tags":[],"category":"Flags","description":"flag: Gabon","unicode_version":"6.0"},{"emoji":"🇬🇧","aliases":["gb","uk"],"tags":["flag","british"],"category":"Flags","description":"flag: United Kingdom","unicode_version":"6.0"},{"emoji":"🇬🇩","aliases":["grenada"],"tags":[],"category":"Flags","description":"flag: Grenada","unicode_version":"6.0"},{"emoji":"🇬🇪","aliases":["georgia"],"tags":[],"category":"Flags","description":"flag: Georgia","unicode_version":"6.0"},{"emoji":"🇬🇫","aliases":["french_guiana"],"tags":[],"category":"Flags","description":"flag: French Guiana","unicode_version":"6.0"},{"emoji":"🇬🇬","aliases":["guernsey"],"tags":[],"category":"Flags","description":"flag: Guernsey","unicode_version":"6.0"},{"emoji":"🇬🇭","aliases":["ghana"],"tags":[],"category":"Flags","description":"flag: Ghana","unicode_version":"6.0"},{"emoji":"🇬🇮","aliases":["gibraltar"],"tags":[],"category":"Flags","description":"flag: Gibraltar","unicode_version":"6.0"},{"emoji":"🇬🇱","aliases":["greenland"],"tags":[],"category":"Flags","description":"flag: Greenland","unicode_version":"6.0"},{"emoji":"🇬🇲","aliases":["gambia"],"tags":[],"category":"Flags","description":"flag: Gambia","unicode_version":"6.0"},{"emoji":"🇬🇳","aliases":["guinea"],"tags":[],"category":"Flags","description":"flag: Guinea","unicode_version":"6.0"},{"emoji":"🇬🇵","aliases":["guadeloupe"],"tags":[],"category":"Flags","description":"flag: Guadeloupe","unicode_version":"6.0"},{"emoji":"🇬🇶","aliases":["equatorial_guinea"],"tags":[],"category":"Flags","description":"flag: Equatorial Guinea","unicode_version":"6.0"},{"emoji":"🇬🇷","aliases":["greece"],"tags":[],"category":"Flags","description":"flag: Greece","unicode_version":"6.0"},{"emoji":"🇬🇸","aliases":["south_georgia_south_sandwich_islands"],"tags":[],"category":"Flags","description":"flag: South Georgia & South Sandwich Islands","unicode_version":"6.0"},{"emoji":"🇬🇹","aliases":["guatemala"],"tags":[],"category":"Flags","description":"flag: Guatemala","unicode_version":"6.0"},{"emoji":"🇬🇺","aliases":["guam"],"tags":[],"category":"Flags","description":"flag: Guam","unicode_version":"6.0"},{"emoji":"🇬🇼","aliases":["guinea_bissau"],"tags":[],"category":"Flags","description":"flag: Guinea-Bissau","unicode_version":"6.0"},{"emoji":"🇬🇾","aliases":["guyana"],"tags":[],"category":"Flags","description":"flag: Guyana","unicode_version":"6.0"},{"emoji":"🇭🇰","aliases":["hong_kong"],"tags":[],"category":"Flags","description":"flag: Hong Kong SAR China","unicode_version":"6.0"},{"emoji":"🇭🇲","aliases":["heard_mcdonald_islands"],"tags":[],"category":"Flags","description":"flag: Heard & McDonald Islands","unicode_version":"11.0"},{"emoji":"🇭🇳","aliases":["honduras"],"tags":[],"category":"Flags","description":"flag: Honduras","unicode_version":"6.0"},{"emoji":"🇭🇷","aliases":["croatia"],"tags":[],"category":"Flags","description":"flag: Croatia","unicode_version":"6.0"},{"emoji":"🇭🇹","aliases":["haiti"],"tags":[],"category":"Flags","description":"flag: Haiti","unicode_version":"6.0"},{"emoji":"🇭🇺","aliases":["hungary"],"tags":[],"category":"Flags","description":"flag: Hungary","unicode_version":"6.0"},{"emoji":"🇮🇨","aliases":["canary_islands"],"tags":[],"category":"Flags","description":"flag: Canary Islands","unicode_version":"6.0"},{"emoji":"🇮🇩","aliases":["indonesia"],"tags":[],"category":"Flags","description":"flag: Indonesia","unicode_version":"6.0"},{"emoji":"🇮🇪","aliases":["ireland"],"tags":[],"category":"Flags","description":"flag: Ireland","unicode_version":"6.0"},{"emoji":"🇮🇱","aliases":["israel"],"tags":[],"category":"Flags","description":"flag: Israel","unicode_version":"6.0"},{"emoji":"🇮🇲","aliases":["isle_of_man"],"tags":[],"category":"Flags","description":"flag: Isle of Man","unicode_version":"6.0"},{"emoji":"🇮🇳","aliases":["india"],"tags":[],"category":"Flags","description":"flag: India","unicode_version":"6.0"},{"emoji":"🇮🇴","aliases":["british_indian_ocean_territory"],"tags":[],"category":"Flags","description":"flag: British Indian Ocean Territory","unicode_version":"6.0"},{"emoji":"🇮🇶","aliases":["iraq"],"tags":[],"category":"Flags","description":"flag: Iraq","unicode_version":"6.0"},{"emoji":"🇮🇷","aliases":["iran"],"tags":[],"category":"Flags","description":"flag: Iran","unicode_version":"6.0"},{"emoji":"🇮🇸","aliases":["iceland"],"tags":[],"category":"Flags","description":"flag: Iceland","unicode_version":"6.0"},{"emoji":"🇮🇹","aliases":["it"],"tags":["italy"],"category":"Flags","description":"flag: Italy","unicode_version":"6.0"},{"emoji":"🇯🇪","aliases":["jersey"],"tags":[],"category":"Flags","description":"flag: Jersey","unicode_version":"6.0"},{"emoji":"🇯🇲","aliases":["jamaica"],"tags":[],"category":"Flags","description":"flag: Jamaica","unicode_version":"6.0"},{"emoji":"🇯🇴","aliases":["jordan"],"tags":[],"category":"Flags","description":"flag: Jordan","unicode_version":"6.0"},{"emoji":"🇯🇵","aliases":["jp"],"tags":["japan"],"category":"Flags","description":"flag: Japan","unicode_version":"6.0"},{"emoji":"🇰🇪","aliases":["kenya"],"tags":[],"category":"Flags","description":"flag: Kenya","unicode_version":"6.0"},{"emoji":"🇰🇬","aliases":["kyrgyzstan"],"tags":[],"category":"Flags","description":"flag: Kyrgyzstan","unicode_version":"6.0"},{"emoji":"🇰🇭","aliases":["cambodia"],"tags":[],"category":"Flags","description":"flag: Cambodia","unicode_version":"6.0"},{"emoji":"🇰🇮","aliases":["kiribati"],"tags":[],"category":"Flags","description":"flag: Kiribati","unicode_version":"6.0"},{"emoji":"🇰🇲","aliases":["comoros"],"tags":[],"category":"Flags","description":"flag: Comoros","unicode_version":"6.0"},{"emoji":"🇰🇳","aliases":["st_kitts_nevis"],"tags":[],"category":"Flags","description":"flag: St. Kitts & Nevis","unicode_version":"6.0"},{"emoji":"🇰🇵","aliases":["north_korea"],"tags":[],"category":"Flags","description":"flag: North Korea","unicode_version":"6.0"},{"emoji":"🇰🇷","aliases":["kr"],"tags":["korea"],"category":"Flags","description":"flag: South Korea","unicode_version":"6.0"},{"emoji":"🇰🇼","aliases":["kuwait"],"tags":[],"category":"Flags","description":"flag: Kuwait","unicode_version":"6.0"},{"emoji":"🇰🇾","aliases":["cayman_islands"],"tags":[],"category":"Flags","description":"flag: Cayman Islands","unicode_version":"6.0"},{"emoji":"🇰🇿","aliases":["kazakhstan"],"tags":[],"category":"Flags","description":"flag: Kazakhstan","unicode_version":"6.0"},{"emoji":"🇱🇦","aliases":["laos"],"tags":[],"category":"Flags","description":"flag: Laos","unicode_version":"6.0"},{"emoji":"🇱🇧","aliases":["lebanon"],"tags":[],"category":"Flags","description":"flag: Lebanon","unicode_version":"6.0"},{"emoji":"🇱🇨","aliases":["st_lucia"],"tags":[],"category":"Flags","description":"flag: St. Lucia","unicode_version":"6.0"},{"emoji":"🇱🇮","aliases":["liechtenstein"],"tags":[],"category":"Flags","description":"flag: Liechtenstein","unicode_version":"6.0"},{"emoji":"🇱🇰","aliases":["sri_lanka"],"tags":[],"category":"Flags","description":"flag: Sri Lanka","unicode_version":"6.0"},{"emoji":"🇱🇷","aliases":["liberia"],"tags":[],"category":"Flags","description":"flag: Liberia","unicode_version":"6.0"},{"emoji":"🇱🇸","aliases":["lesotho"],"tags":[],"category":"Flags","description":"flag: Lesotho","unicode_version":"6.0"},{"emoji":"🇱🇹","aliases":["lithuania"],"tags":[],"category":"Flags","description":"flag: Lithuania","unicode_version":"6.0"},{"emoji":"🇱🇺","aliases":["luxembourg"],"tags":[],"category":"Flags","description":"flag: Luxembourg","unicode_version":"6.0"},{"emoji":"🇱🇻","aliases":["latvia"],"tags":[],"category":"Flags","description":"flag: Latvia","unicode_version":"6.0"},{"emoji":"🇱🇾","aliases":["libya"],"tags":[],"category":"Flags","description":"flag: Libya","unicode_version":"6.0"},{"emoji":"🇲🇦","aliases":["morocco"],"tags":[],"category":"Flags","description":"flag: Morocco","unicode_version":"6.0"},{"emoji":"🇲🇨","aliases":["monaco"],"tags":[],"category":"Flags","description":"flag: Monaco","unicode_version":"6.0"},{"emoji":"🇲🇩","aliases":["moldova"],"tags":[],"category":"Flags","description":"flag: Moldova","unicode_version":"6.0"},{"emoji":"🇲🇪","aliases":["montenegro"],"tags":[],"category":"Flags","description":"flag: Montenegro","unicode_version":"6.0"},{"emoji":"🇲🇫","aliases":["st_martin"],"tags":[],"category":"Flags","description":"flag: St. Martin","unicode_version":"11.0"},{"emoji":"🇲🇬","aliases":["madagascar"],"tags":[],"category":"Flags","description":"flag: Madagascar","unicode_version":"6.0"},{"emoji":"🇲🇭","aliases":["marshall_islands"],"tags":[],"category":"Flags","description":"flag: Marshall Islands","unicode_version":"6.0"},{"emoji":"🇲🇰","aliases":["macedonia"],"tags":[],"category":"Flags","description":"flag: North Macedonia","unicode_version":"6.0"},{"emoji":"🇲🇱","aliases":["mali"],"tags":[],"category":"Flags","description":"flag: Mali","unicode_version":"6.0"},{"emoji":"🇲🇲","aliases":["myanmar"],"tags":["burma"],"category":"Flags","description":"flag: Myanmar (Burma)","unicode_version":"6.0"},{"emoji":"🇲🇳","aliases":["mongolia"],"tags":[],"category":"Flags","description":"flag: Mongolia","unicode_version":"6.0"},{"emoji":"🇲🇴","aliases":["macau"],"tags":[],"category":"Flags","description":"flag: Macao SAR China","unicode_version":"6.0"},{"emoji":"🇲🇵","aliases":["northern_mariana_islands"],"tags":[],"category":"Flags","description":"flag: Northern Mariana Islands","unicode_version":"6.0"},{"emoji":"🇲🇶","aliases":["martinique"],"tags":[],"category":"Flags","description":"flag: Martinique","unicode_version":"6.0"},{"emoji":"🇲🇷","aliases":["mauritania"],"tags":[],"category":"Flags","description":"flag: Mauritania","unicode_version":"6.0"},{"emoji":"🇲🇸","aliases":["montserrat"],"tags":[],"category":"Flags","description":"flag: Montserrat","unicode_version":"6.0"},{"emoji":"🇲🇹","aliases":["malta"],"tags":[],"category":"Flags","description":"flag: Malta","unicode_version":"6.0"},{"emoji":"🇲🇺","aliases":["mauritius"],"tags":[],"category":"Flags","description":"flag: Mauritius","unicode_version":"6.0"},{"emoji":"🇲🇻","aliases":["maldives"],"tags":[],"category":"Flags","description":"flag: Maldives","unicode_version":"6.0"},{"emoji":"🇲🇼","aliases":["malawi"],"tags":[],"category":"Flags","description":"flag: Malawi","unicode_version":"6.0"},{"emoji":"🇲🇽","aliases":["mexico"],"tags":[],"category":"Flags","description":"flag: Mexico","unicode_version":"6.0"},{"emoji":"🇲🇾","aliases":["malaysia"],"tags":[],"category":"Flags","description":"flag: Malaysia","unicode_version":"6.0"},{"emoji":"🇲🇿","aliases":["mozambique"],"tags":[],"category":"Flags","description":"flag: Mozambique","unicode_version":"6.0"},{"emoji":"🇳🇦","aliases":["namibia"],"tags":[],"category":"Flags","description":"flag: Namibia","unicode_version":"6.0"},{"emoji":"🇳🇨","aliases":["new_caledonia"],"tags":[],"category":"Flags","description":"flag: New Caledonia","unicode_version":"6.0"},{"emoji":"🇳🇪","aliases":["niger"],"tags":[],"category":"Flags","description":"flag: Niger","unicode_version":"6.0"},{"emoji":"🇳🇫","aliases":["norfolk_island"],"tags":[],"category":"Flags","description":"flag: Norfolk Island","unicode_version":"6.0"},{"emoji":"🇳🇬","aliases":["nigeria"],"tags":[],"category":"Flags","description":"flag: Nigeria","unicode_version":"6.0"},{"emoji":"🇳🇮","aliases":["nicaragua"],"tags":[],"category":"Flags","description":"flag: Nicaragua","unicode_version":"6.0"},{"emoji":"🇳🇱","aliases":["netherlands"],"tags":[],"category":"Flags","description":"flag: Netherlands","unicode_version":"6.0"},{"emoji":"🇳🇴","aliases":["norway"],"tags":[],"category":"Flags","description":"flag: Norway","unicode_version":"6.0"},{"emoji":"🇳🇵","aliases":["nepal"],"tags":[],"category":"Flags","description":"flag: Nepal","unicode_version":"6.0"},{"emoji":"🇳🇷","aliases":["nauru"],"tags":[],"category":"Flags","description":"flag: Nauru","unicode_version":"6.0"},{"emoji":"🇳🇺","aliases":["niue"],"tags":[],"category":"Flags","description":"flag: Niue","unicode_version":"6.0"},{"emoji":"🇳🇿","aliases":["new_zealand"],"tags":[],"category":"Flags","description":"flag: New Zealand","unicode_version":"6.0"},{"emoji":"🇴🇲","aliases":["oman"],"tags":[],"category":"Flags","description":"flag: Oman","unicode_version":"6.0"},{"emoji":"🇵🇦","aliases":["panama"],"tags":[],"category":"Flags","description":"flag: Panama","unicode_version":"6.0"},{"emoji":"🇵🇪","aliases":["peru"],"tags":[],"category":"Flags","description":"flag: Peru","unicode_version":"6.0"},{"emoji":"🇵🇫","aliases":["french_polynesia"],"tags":[],"category":"Flags","description":"flag: French Polynesia","unicode_version":"6.0"},{"emoji":"🇵🇬","aliases":["papua_new_guinea"],"tags":[],"category":"Flags","description":"flag: Papua New Guinea","unicode_version":"6.0"},{"emoji":"🇵🇭","aliases":["philippines"],"tags":[],"category":"Flags","description":"flag: Philippines","unicode_version":"6.0"},{"emoji":"🇵🇰","aliases":["pakistan"],"tags":[],"category":"Flags","description":"flag: Pakistan","unicode_version":"6.0"},{"emoji":"🇵🇱","aliases":["poland"],"tags":[],"category":"Flags","description":"flag: Poland","unicode_version":"6.0"},{"emoji":"🇵🇲","aliases":["st_pierre_miquelon"],"tags":[],"category":"Flags","description":"flag: St. Pierre & Miquelon","unicode_version":"6.0"},{"emoji":"🇵🇳","aliases":["pitcairn_islands"],"tags":[],"category":"Flags","description":"flag: Pitcairn Islands","unicode_version":"6.0"},{"emoji":"🇵🇷","aliases":["puerto_rico"],"tags":[],"category":"Flags","description":"flag: Puerto Rico","unicode_version":"6.0"},{"emoji":"🇵🇸","aliases":["palestinian_territories"],"tags":[],"category":"Flags","description":"flag: Palestinian Territories","unicode_version":"6.0"},{"emoji":"🇵🇹","aliases":["portugal"],"tags":[],"category":"Flags","description":"flag: Portugal","unicode_version":"6.0"},{"emoji":"🇵🇼","aliases":["palau"],"tags":[],"category":"Flags","description":"flag: Palau","unicode_version":"6.0"},{"emoji":"🇵🇾","aliases":["paraguay"],"tags":[],"category":"Flags","description":"flag: Paraguay","unicode_version":"6.0"},{"emoji":"🇶🇦","aliases":["qatar"],"tags":[],"category":"Flags","description":"flag: Qatar","unicode_version":"6.0"},{"emoji":"🇷🇪","aliases":["reunion"],"tags":[],"category":"Flags","description":"flag: Réunion","unicode_version":"6.0"},{"emoji":"🇷🇴","aliases":["romania"],"tags":[],"category":"Flags","description":"flag: Romania","unicode_version":"6.0"},{"emoji":"🇷🇸","aliases":["serbia"],"tags":[],"category":"Flags","description":"flag: Serbia","unicode_version":"6.0"},{"emoji":"🇷🇺","aliases":["ru"],"tags":["russia"],"category":"Flags","description":"flag: Russia","unicode_version":"6.0"},{"emoji":"🇷🇼","aliases":["rwanda"],"tags":[],"category":"Flags","description":"flag: Rwanda","unicode_version":"6.0"},{"emoji":"🇸🇦","aliases":["saudi_arabia"],"tags":[],"category":"Flags","description":"flag: Saudi Arabia","unicode_version":"6.0"},{"emoji":"🇸🇧","aliases":["solomon_islands"],"tags":[],"category":"Flags","description":"flag: Solomon Islands","unicode_version":"6.0"},{"emoji":"🇸🇨","aliases":["seychelles"],"tags":[],"category":"Flags","description":"flag: Seychelles","unicode_version":"6.0"},{"emoji":"🇸🇩","aliases":["sudan"],"tags":[],"category":"Flags","description":"flag: Sudan","unicode_version":"6.0"},{"emoji":"🇸🇪","aliases":["sweden"],"tags":[],"category":"Flags","description":"flag: Sweden","unicode_version":"6.0"},{"emoji":"🇸🇬","aliases":["singapore"],"tags":[],"category":"Flags","description":"flag: Singapore","unicode_version":"6.0"},{"emoji":"🇸🇭","aliases":["st_helena"],"tags":[],"category":"Flags","description":"flag: St. Helena","unicode_version":"6.0"},{"emoji":"🇸🇮","aliases":["slovenia"],"tags":[],"category":"Flags","description":"flag: Slovenia","unicode_version":"6.0"},{"emoji":"🇸🇯","aliases":["svalbard_jan_mayen"],"tags":[],"category":"Flags","description":"flag: Svalbard & Jan Mayen","unicode_version":"11.0"},{"emoji":"🇸🇰","aliases":["slovakia"],"tags":[],"category":"Flags","description":"flag: Slovakia","unicode_version":"6.0"},{"emoji":"🇸🇱","aliases":["sierra_leone"],"tags":[],"category":"Flags","description":"flag: Sierra Leone","unicode_version":"6.0"},{"emoji":"🇸🇲","aliases":["san_marino"],"tags":[],"category":"Flags","description":"flag: San Marino","unicode_version":"6.0"},{"emoji":"🇸🇳","aliases":["senegal"],"tags":[],"category":"Flags","description":"flag: Senegal","unicode_version":"6.0"},{"emoji":"🇸🇴","aliases":["somalia"],"tags":[],"category":"Flags","description":"flag: Somalia","unicode_version":"6.0"},{"emoji":"🇸🇷","aliases":["suriname"],"tags":[],"category":"Flags","description":"flag: Suriname","unicode_version":"6.0"},{"emoji":"🇸🇸","aliases":["south_sudan"],"tags":[],"category":"Flags","description":"flag: South Sudan","unicode_version":"6.0"},{"emoji":"🇸🇹","aliases":["sao_tome_principe"],"tags":[],"category":"Flags","description":"flag: São Tomé & Príncipe","unicode_version":"6.0"},{"emoji":"🇸🇻","aliases":["el_salvador"],"tags":[],"category":"Flags","description":"flag: El Salvador","unicode_version":"6.0"},{"emoji":"🇸🇽","aliases":["sint_maarten"],"tags":[],"category":"Flags","description":"flag: Sint Maarten","unicode_version":"6.0"},{"emoji":"🇸🇾","aliases":["syria"],"tags":[],"category":"Flags","description":"flag: Syria","unicode_version":"6.0"},{"emoji":"🇸🇿","aliases":["swaziland"],"tags":[],"category":"Flags","description":"flag: Eswatini","unicode_version":"6.0"},{"emoji":"🇹🇦","aliases":["tristan_da_cunha"],"tags":[],"category":"Flags","description":"flag: Tristan da Cunha","unicode_version":"11.0"},{"emoji":"🇹🇨","aliases":["turks_caicos_islands"],"tags":[],"category":"Flags","description":"flag: Turks & Caicos Islands","unicode_version":"6.0"},{"emoji":"🇹🇩","aliases":["chad"],"tags":[],"category":"Flags","description":"flag: Chad","unicode_version":"6.0"},{"emoji":"🇹🇫","aliases":["french_southern_territories"],"tags":[],"category":"Flags","description":"flag: French Southern Territories","unicode_version":"6.0"},{"emoji":"🇹🇬","aliases":["togo"],"tags":[],"category":"Flags","description":"flag: Togo","unicode_version":"6.0"},{"emoji":"🇹🇭","aliases":["thailand"],"tags":[],"category":"Flags","description":"flag: Thailand","unicode_version":"6.0"},{"emoji":"🇹🇯","aliases":["tajikistan"],"tags":[],"category":"Flags","description":"flag: Tajikistan","unicode_version":"6.0"},{"emoji":"🇹🇰","aliases":["tokelau"],"tags":[],"category":"Flags","description":"flag: Tokelau","unicode_version":"6.0"},{"emoji":"🇹🇱","aliases":["timor_leste"],"tags":[],"category":"Flags","description":"flag: Timor-Leste","unicode_version":"6.0"},{"emoji":"🇹🇲","aliases":["turkmenistan"],"tags":[],"category":"Flags","description":"flag: Turkmenistan","unicode_version":"6.0"},{"emoji":"🇹🇳","aliases":["tunisia"],"tags":[],"category":"Flags","description":"flag: Tunisia","unicode_version":"6.0"},{"emoji":"🇹🇴","aliases":["tonga"],"tags":[],"category":"Flags","description":"flag: Tonga","unicode_version":"6.0"},{"emoji":"🇹🇷","aliases":["tr"],"tags":["turkey"],"category":"Flags","description":"flag: Turkey","unicode_version":"8.0"},{"emoji":"🇹🇹","aliases":["trinidad_tobago"],"tags":[],"category":"Flags","description":"flag: Trinidad & Tobago","unicode_version":"6.0"},{"emoji":"🇹🇻","aliases":["tuvalu"],"tags":[],"category":"Flags","description":"flag: Tuvalu","unicode_version":"6.0"},{"emoji":"🇹🇼","aliases":["taiwan"],"tags":[],"category":"Flags","description":"flag: Taiwan","unicode_version":"6.0"},{"emoji":"🇹🇿","aliases":["tanzania"],"tags":[],"category":"Flags","description":"flag: Tanzania","unicode_version":"6.0"},{"emoji":"🇺🇦","aliases":["ukraine"],"tags":[],"category":"Flags","description":"flag: Ukraine","unicode_version":"6.0"},{"emoji":"🇺🇬","aliases":["uganda"],"tags":[],"category":"Flags","description":"flag: Uganda","unicode_version":"6.0"},{"emoji":"🇺🇲","aliases":["us_outlying_islands"],"tags":[],"category":"Flags","description":"flag: U.S. Outlying Islands","unicode_version":"11.0"},{"emoji":"🇺🇳","aliases":["united_nations"],"tags":[],"category":"Flags","description":"flag: United Nations","unicode_version":"11.0"},{"emoji":"🇺🇸","aliases":["us"],"tags":["flag","united","america"],"category":"Flags","description":"flag: United States","unicode_version":"6.0"},{"emoji":"🇺🇾","aliases":["uruguay"],"tags":[],"category":"Flags","description":"flag: Uruguay","unicode_version":"6.0"},{"emoji":"🇺🇿","aliases":["uzbekistan"],"tags":[],"category":"Flags","description":"flag: Uzbekistan","unicode_version":"6.0"},{"emoji":"🇻🇦","aliases":["vatican_city"],"tags":[],"category":"Flags","description":"flag: Vatican City","unicode_version":"6.0"},{"emoji":"🇻🇨","aliases":["st_vincent_grenadines"],"tags":[],"category":"Flags","description":"flag: St. Vincent & Grenadines","unicode_version":"6.0"},{"emoji":"🇻🇪","aliases":["venezuela"],"tags":[],"category":"Flags","description":"flag: Venezuela","unicode_version":"6.0"},{"emoji":"🇻🇬","aliases":["british_virgin_islands"],"tags":[],"category":"Flags","description":"flag: British Virgin Islands","unicode_version":"6.0"},{"emoji":"🇻🇮","aliases":["us_virgin_islands"],"tags":[],"category":"Flags","description":"flag: U.S. Virgin Islands","unicode_version":"6.0"},{"emoji":"🇻🇳","aliases":["vietnam"],"tags":[],"category":"Flags","description":"flag: Vietnam","unicode_version":"6.0"},{"emoji":"🇻🇺","aliases":["vanuatu"],"tags":[],"category":"Flags","description":"flag: Vanuatu","unicode_version":"6.0"},{"emoji":"🇼🇫","aliases":["wallis_futuna"],"tags":[],"category":"Flags","description":"flag: Wallis & Futuna","unicode_version":"6.0"},{"emoji":"🇼🇸","aliases":["samoa"],"tags":[],"category":"Flags","description":"flag: Samoa","unicode_version":"6.0"},{"emoji":"🇽🇰","aliases":["kosovo"],"tags":[],"category":"Flags","description":"flag: Kosovo","unicode_version":"6.0"},{"emoji":"🇾🇪","aliases":["yemen"],"tags":[],"category":"Flags","description":"flag: Yemen","unicode_version":"6.0"},{"emoji":"🇾🇹","aliases":["mayotte"],"tags":[],"category":"Flags","description":"flag: Mayotte","unicode_version":"6.0"},{"emoji":"🇿🇦","aliases":["south_africa"],"tags":[],"category":"Flags","description":"flag: South Africa","unicode_version":"6.0"},{"emoji":"🇿🇲","aliases":["zambia"],"tags":[],"category":"Flags","description":"flag: Zambia","unicode_version":"6.0"},{"emoji":"🇿🇼","aliases":["zimbabwe"],"tags":[],"category":"Flags","description":"flag: Zimbabwe","unicode_version":"6.0"},{"emoji":"🏴󠁧󠁢󠁥󠁮󠁧󠁿","aliases":["england"],"tags":[],"category":"Flags","description":"flag: England","unicode_version":"11.0"},{"emoji":"🏴󠁧󠁢󠁳󠁣󠁴󠁿","aliases":["scotland"],"tags":[],"category":"Flags","description":"flag: Scotland","unicode_version":"11.0"},{"emoji":"🏴󠁧󠁢󠁷󠁬󠁳󠁿","aliases":["wales"],"tags":[],"category":"Flags","description":"flag: Wales","unicode_version":"11.0"}] +export const rawEmojis = [ + { + emoji: "😀", + aliases: ["grinning"], + tags: ["smile", "happy"], + category: "Smileys & Emotion", + description: "grinning face", + unicode_version: "6.1", + }, + { + emoji: "😃", + aliases: ["smiley"], + tags: ["happy", "joy", "haha"], + category: "Smileys & Emotion", + description: "grinning face with big eyes", + unicode_version: "6.0", + }, + { + emoji: "😄", + aliases: ["smile"], + tags: ["happy", "joy", "laugh", "pleased"], + category: "Smileys & Emotion", + description: "grinning face with smiling eyes", + unicode_version: "6.0", + }, + { + emoji: "😁", + aliases: ["grin"], + tags: [], + category: "Smileys & Emotion", + description: "beaming face with smiling eyes", + unicode_version: "6.0", + }, + { + emoji: "😆", + aliases: ["laughing", "satisfied"], + tags: ["happy", "haha"], + category: "Smileys & Emotion", + description: "grinning squinting face", + unicode_version: "6.0", + }, + { + emoji: "😅", + aliases: ["sweat_smile"], + tags: ["hot"], + category: "Smileys & Emotion", + description: "grinning face with sweat", + unicode_version: "6.0", + }, + { + emoji: "🤣", + aliases: ["rofl"], + tags: ["lol", "laughing"], + category: "Smileys & Emotion", + description: "rolling on the floor laughing", + unicode_version: "9.0", + }, + { + emoji: "😂", + aliases: ["joy"], + tags: ["tears"], + category: "Smileys & Emotion", + description: "face with tears of joy", + unicode_version: "6.0", + }, + { + emoji: "🙂", + aliases: ["slightly_smiling_face"], + tags: [], + category: "Smileys & Emotion", + description: "slightly smiling face", + unicode_version: "7.0", + }, + { + emoji: "🙃", + aliases: ["upside_down_face"], + tags: [], + category: "Smileys & Emotion", + description: "upside-down face", + unicode_version: "8.0", + }, + { + emoji: "😉", + aliases: ["wink"], + tags: ["flirt"], + category: "Smileys & Emotion", + description: "winking face", + unicode_version: "6.0", + }, + { + emoji: "😊", + aliases: ["blush"], + tags: ["proud"], + category: "Smileys & Emotion", + description: "smiling face with smiling eyes", + unicode_version: "6.0", + }, + { + emoji: "😇", + aliases: ["innocent"], + tags: ["angel"], + category: "Smileys & Emotion", + description: "smiling face with halo", + unicode_version: "6.0", + }, + { + emoji: "🥰", + aliases: ["smiling_face_with_three_hearts"], + tags: ["love"], + category: "Smileys & Emotion", + description: "smiling face with hearts", + unicode_version: "11.0", + }, + { + emoji: "😍", + aliases: ["heart_eyes"], + tags: ["love", "crush"], + category: "Smileys & Emotion", + description: "smiling face with heart-eyes", + unicode_version: "6.0", + }, + { + emoji: "🤩", + aliases: ["star_struck"], + tags: ["eyes"], + category: "Smileys & Emotion", + description: "star-struck", + unicode_version: "11.0", + }, + { + emoji: "😘", + aliases: ["kissing_heart"], + tags: ["flirt"], + category: "Smileys & Emotion", + description: "face blowing a kiss", + unicode_version: "6.0", + }, + { + emoji: "😗", + aliases: ["kissing"], + tags: [], + category: "Smileys & Emotion", + description: "kissing face", + unicode_version: "6.1", + }, + { + emoji: "☺️", + aliases: ["relaxed"], + tags: ["blush", "pleased"], + category: "Smileys & Emotion", + description: "smiling face", + unicode_version: "", + }, + { + emoji: "😚", + aliases: ["kissing_closed_eyes"], + tags: [], + category: "Smileys & Emotion", + description: "kissing face with closed eyes", + unicode_version: "6.0", + }, + { + emoji: "😙", + aliases: ["kissing_smiling_eyes"], + tags: [], + category: "Smileys & Emotion", + description: "kissing face with smiling eyes", + unicode_version: "6.1", + }, + { + emoji: "🥲", + aliases: ["smiling_face_with_tear"], + tags: [], + category: "Smileys & Emotion", + description: "smiling face with tear", + unicode_version: "13.0", + }, + { + emoji: "😋", + aliases: ["yum"], + tags: ["tongue", "lick"], + category: "Smileys & Emotion", + description: "face savoring food", + unicode_version: "6.0", + }, + { + emoji: "😛", + aliases: ["stuck_out_tongue"], + tags: [], + category: "Smileys & Emotion", + description: "face with tongue", + unicode_version: "6.1", + }, + { + emoji: "😜", + aliases: ["stuck_out_tongue_winking_eye"], + tags: ["prank", "silly"], + category: "Smileys & Emotion", + description: "winking face with tongue", + unicode_version: "6.0", + }, + { + emoji: "🤪", + aliases: ["zany_face"], + tags: ["goofy", "wacky"], + category: "Smileys & Emotion", + description: "zany face", + unicode_version: "11.0", + }, + { + emoji: "😝", + aliases: ["stuck_out_tongue_closed_eyes"], + tags: ["prank"], + category: "Smileys & Emotion", + description: "squinting face with tongue", + unicode_version: "6.0", + }, + { + emoji: "🤑", + aliases: ["money_mouth_face"], + tags: ["rich"], + category: "Smileys & Emotion", + description: "money-mouth face", + unicode_version: "8.0", + }, + { + emoji: "🤗", + aliases: ["hugs"], + tags: [], + category: "Smileys & Emotion", + description: "hugging face", + unicode_version: "8.0", + }, + { + emoji: "🤭", + aliases: ["hand_over_mouth"], + tags: ["quiet", "whoops"], + category: "Smileys & Emotion", + description: "face with hand over mouth", + unicode_version: "11.0", + }, + { + emoji: "🤫", + aliases: ["shushing_face"], + tags: ["silence", "quiet"], + category: "Smileys & Emotion", + description: "shushing face", + unicode_version: "11.0", + }, + { + emoji: "🤔", + aliases: ["thinking"], + tags: [], + category: "Smileys & Emotion", + description: "thinking face", + unicode_version: "8.0", + }, + { + emoji: "🤐", + aliases: ["zipper_mouth_face"], + tags: ["silence", "hush"], + category: "Smileys & Emotion", + description: "zipper-mouth face", + unicode_version: "8.0", + }, + { + emoji: "🤨", + aliases: ["raised_eyebrow"], + tags: ["suspicious"], + category: "Smileys & Emotion", + description: "face with raised eyebrow", + unicode_version: "11.0", + }, + { + emoji: "😐", + aliases: ["neutral_face"], + tags: ["meh"], + category: "Smileys & Emotion", + description: "neutral face", + unicode_version: "6.0", + }, + { + emoji: "😑", + aliases: ["expressionless"], + tags: [], + category: "Smileys & Emotion", + description: "expressionless face", + unicode_version: "6.1", + }, + { + emoji: "😶", + aliases: ["no_mouth"], + tags: ["mute", "silence"], + category: "Smileys & Emotion", + description: "face without mouth", + unicode_version: "6.0", + }, + { + emoji: "😶‍🌫️", + aliases: ["face_in_clouds"], + tags: [], + category: "Smileys & Emotion", + description: "face in clouds", + unicode_version: "13.1", + }, + { + emoji: "😏", + aliases: ["smirk"], + tags: ["smug"], + category: "Smileys & Emotion", + description: "smirking face", + unicode_version: "6.0", + }, + { + emoji: "😒", + aliases: ["unamused"], + tags: ["meh"], + category: "Smileys & Emotion", + description: "unamused face", + unicode_version: "6.0", + }, + { + emoji: "🙄", + aliases: ["roll_eyes"], + tags: [], + category: "Smileys & Emotion", + description: "face with rolling eyes", + unicode_version: "8.0", + }, + { + emoji: "😬", + aliases: ["grimacing"], + tags: [], + category: "Smileys & Emotion", + description: "grimacing face", + unicode_version: "6.1", + }, + { + emoji: "😮‍💨", + aliases: ["face_exhaling"], + tags: [], + category: "Smileys & Emotion", + description: "face exhaling", + unicode_version: "13.1", + }, + { + emoji: "🤥", + aliases: ["lying_face"], + tags: ["liar"], + category: "Smileys & Emotion", + description: "lying face", + unicode_version: "9.0", + }, + { + emoji: "😌", + aliases: ["relieved"], + tags: ["whew"], + category: "Smileys & Emotion", + description: "relieved face", + unicode_version: "6.0", + }, + { + emoji: "😔", + aliases: ["pensive"], + tags: [], + category: "Smileys & Emotion", + description: "pensive face", + unicode_version: "6.0", + }, + { + emoji: "😪", + aliases: ["sleepy"], + tags: ["tired"], + category: "Smileys & Emotion", + description: "sleepy face", + unicode_version: "6.0", + }, + { + emoji: "🤤", + aliases: ["drooling_face"], + tags: [], + category: "Smileys & Emotion", + description: "drooling face", + unicode_version: "9.0", + }, + { + emoji: "😴", + aliases: ["sleeping"], + tags: ["zzz"], + category: "Smileys & Emotion", + description: "sleeping face", + unicode_version: "6.1", + }, + { + emoji: "😷", + aliases: ["mask"], + tags: ["sick", "ill"], + category: "Smileys & Emotion", + description: "face with medical mask", + unicode_version: "6.0", + }, + { + emoji: "🤒", + aliases: ["face_with_thermometer"], + tags: ["sick"], + category: "Smileys & Emotion", + description: "face with thermometer", + unicode_version: "8.0", + }, + { + emoji: "🤕", + aliases: ["face_with_head_bandage"], + tags: ["hurt"], + category: "Smileys & Emotion", + description: "face with head-bandage", + unicode_version: "8.0", + }, + { + emoji: "🤢", + aliases: ["nauseated_face"], + tags: ["sick", "barf", "disgusted"], + category: "Smileys & Emotion", + description: "nauseated face", + unicode_version: "9.0", + }, + { + emoji: "🤮", + aliases: ["vomiting_face"], + tags: ["barf", "sick"], + category: "Smileys & Emotion", + description: "face vomiting", + unicode_version: "11.0", + }, + { + emoji: "🤧", + aliases: ["sneezing_face"], + tags: ["achoo", "sick"], + category: "Smileys & Emotion", + description: "sneezing face", + unicode_version: "9.0", + }, + { + emoji: "🥵", + aliases: ["hot_face"], + tags: ["heat", "sweating"], + category: "Smileys & Emotion", + description: "hot face", + unicode_version: "11.0", + }, + { + emoji: "🥶", + aliases: ["cold_face"], + tags: ["freezing", "ice"], + category: "Smileys & Emotion", + description: "cold face", + unicode_version: "11.0", + }, + { + emoji: "🥴", + aliases: ["woozy_face"], + tags: ["groggy"], + category: "Smileys & Emotion", + description: "woozy face", + unicode_version: "11.0", + }, + { + emoji: "😵", + aliases: ["dizzy_face"], + tags: [], + category: "Smileys & Emotion", + description: "knocked-out face", + unicode_version: "6.0", + }, + { + emoji: "😵‍💫", + aliases: ["face_with_spiral_eyes"], + tags: [], + category: "Smileys & Emotion", + description: "face with spiral eyes", + unicode_version: "13.1", + }, + { + emoji: "🤯", + aliases: ["exploding_head"], + tags: ["mind", "blown"], + category: "Smileys & Emotion", + description: "exploding head", + unicode_version: "11.0", + }, + { + emoji: "🤠", + aliases: ["cowboy_hat_face"], + tags: [], + category: "Smileys & Emotion", + description: "cowboy hat face", + unicode_version: "9.0", + }, + { + emoji: "🥳", + aliases: ["partying_face"], + tags: ["celebration", "birthday"], + category: "Smileys & Emotion", + description: "partying face", + unicode_version: "11.0", + }, + { + emoji: "🥸", + aliases: ["disguised_face"], + tags: [], + category: "Smileys & Emotion", + description: "disguised face", + unicode_version: "13.0", + }, + { + emoji: "😎", + aliases: ["sunglasses"], + tags: ["cool"], + category: "Smileys & Emotion", + description: "smiling face with sunglasses", + unicode_version: "6.0", + }, + { + emoji: "🤓", + aliases: ["nerd_face"], + tags: ["geek", "glasses"], + category: "Smileys & Emotion", + description: "nerd face", + unicode_version: "8.0", + }, + { + emoji: "🧐", + aliases: ["monocle_face"], + tags: [], + category: "Smileys & Emotion", + description: "face with monocle", + unicode_version: "11.0", + }, + { + emoji: "😕", + aliases: ["confused"], + tags: [], + category: "Smileys & Emotion", + description: "confused face", + unicode_version: "6.1", + }, + { + emoji: "😟", + aliases: ["worried"], + tags: ["nervous"], + category: "Smileys & Emotion", + description: "worried face", + unicode_version: "6.1", + }, + { + emoji: "🙁", + aliases: ["slightly_frowning_face"], + tags: [], + category: "Smileys & Emotion", + description: "slightly frowning face", + unicode_version: "7.0", + }, + { + emoji: "☹️", + aliases: ["frowning_face"], + tags: [], + category: "Smileys & Emotion", + description: "frowning face", + unicode_version: "", + }, + { + emoji: "😮", + aliases: ["open_mouth"], + tags: ["surprise", "impressed", "wow"], + category: "Smileys & Emotion", + description: "face with open mouth", + unicode_version: "6.1", + }, + { + emoji: "😯", + aliases: ["hushed"], + tags: ["silence", "speechless"], + category: "Smileys & Emotion", + description: "hushed face", + unicode_version: "6.1", + }, + { + emoji: "😲", + aliases: ["astonished"], + tags: ["amazed", "gasp"], + category: "Smileys & Emotion", + description: "astonished face", + unicode_version: "6.0", + }, + { + emoji: "😳", + aliases: ["flushed"], + tags: [], + category: "Smileys & Emotion", + description: "flushed face", + unicode_version: "6.0", + }, + { + emoji: "🥺", + aliases: ["pleading_face"], + tags: ["puppy", "eyes"], + category: "Smileys & Emotion", + description: "pleading face", + unicode_version: "11.0", + }, + { + emoji: "😦", + aliases: ["frowning"], + tags: [], + category: "Smileys & Emotion", + description: "frowning face with open mouth", + unicode_version: "6.1", + }, + { + emoji: "😧", + aliases: ["anguished"], + tags: ["stunned"], + category: "Smileys & Emotion", + description: "anguished face", + unicode_version: "6.1", + }, + { + emoji: "😨", + aliases: ["fearful"], + tags: ["scared", "shocked", "oops"], + category: "Smileys & Emotion", + description: "fearful face", + unicode_version: "6.0", + }, + { + emoji: "😰", + aliases: ["cold_sweat"], + tags: ["nervous"], + category: "Smileys & Emotion", + description: "anxious face with sweat", + unicode_version: "6.0", + }, + { + emoji: "😥", + aliases: ["disappointed_relieved"], + tags: ["phew", "sweat", "nervous"], + category: "Smileys & Emotion", + description: "sad but relieved face", + unicode_version: "6.0", + }, + { + emoji: "😢", + aliases: ["cry"], + tags: ["sad", "tear"], + category: "Smileys & Emotion", + description: "crying face", + unicode_version: "6.0", + }, + { + emoji: "😭", + aliases: ["sob"], + tags: ["sad", "cry", "bawling"], + category: "Smileys & Emotion", + description: "loudly crying face", + unicode_version: "6.0", + }, + { + emoji: "😱", + aliases: ["scream"], + tags: ["horror", "shocked"], + category: "Smileys & Emotion", + description: "face screaming in fear", + unicode_version: "6.0", + }, + { + emoji: "😖", + aliases: ["confounded"], + tags: [], + category: "Smileys & Emotion", + description: "confounded face", + unicode_version: "6.0", + }, + { + emoji: "😣", + aliases: ["persevere"], + tags: ["struggling"], + category: "Smileys & Emotion", + description: "persevering face", + unicode_version: "6.0", + }, + { + emoji: "😞", + aliases: ["disappointed"], + tags: ["sad"], + category: "Smileys & Emotion", + description: "disappointed face", + unicode_version: "6.0", + }, + { + emoji: "😓", + aliases: ["sweat"], + tags: [], + category: "Smileys & Emotion", + description: "downcast face with sweat", + unicode_version: "6.0", + }, + { + emoji: "😩", + aliases: ["weary"], + tags: ["tired"], + category: "Smileys & Emotion", + description: "weary face", + unicode_version: "6.0", + }, + { + emoji: "😫", + aliases: ["tired_face"], + tags: ["upset", "whine"], + category: "Smileys & Emotion", + description: "tired face", + unicode_version: "6.0", + }, + { + emoji: "🥱", + aliases: ["yawning_face"], + tags: [], + category: "Smileys & Emotion", + description: "yawning face", + unicode_version: "12.0", + }, + { + emoji: "😤", + aliases: ["triumph"], + tags: ["smug"], + category: "Smileys & Emotion", + description: "face with steam from nose", + unicode_version: "6.0", + }, + { + emoji: "😡", + aliases: ["rage", "pout"], + tags: ["angry"], + category: "Smileys & Emotion", + description: "pouting face", + unicode_version: "6.0", + }, + { + emoji: "😠", + aliases: ["angry"], + tags: ["mad", "annoyed"], + category: "Smileys & Emotion", + description: "angry face", + unicode_version: "6.0", + }, + { + emoji: "🤬", + aliases: ["cursing_face"], + tags: ["foul"], + category: "Smileys & Emotion", + description: "face with symbols on mouth", + unicode_version: "11.0", + }, + { + emoji: "😈", + aliases: ["smiling_imp"], + tags: ["devil", "evil", "horns"], + category: "Smileys & Emotion", + description: "smiling face with horns", + unicode_version: "6.0", + }, + { + emoji: "👿", + aliases: ["imp"], + tags: ["angry", "devil", "evil", "horns"], + category: "Smileys & Emotion", + description: "angry face with horns", + unicode_version: "6.0", + }, + { + emoji: "💀", + aliases: ["skull"], + tags: ["dead", "danger", "poison"], + category: "Smileys & Emotion", + description: "skull", + unicode_version: "6.0", + }, + { + emoji: "☠️", + aliases: ["skull_and_crossbones"], + tags: ["danger", "pirate"], + category: "Smileys & Emotion", + description: "skull and crossbones", + unicode_version: "", + }, + { + emoji: "💩", + aliases: ["hankey", "poop", "shit"], + tags: ["crap"], + category: "Smileys & Emotion", + description: "pile of poo", + unicode_version: "6.0", + }, + { + emoji: "🤡", + aliases: ["clown_face"], + tags: [], + category: "Smileys & Emotion", + description: "clown face", + unicode_version: "9.0", + }, + { + emoji: "👹", + aliases: ["japanese_ogre"], + tags: ["monster"], + category: "Smileys & Emotion", + description: "ogre", + unicode_version: "6.0", + }, + { + emoji: "👺", + aliases: ["japanese_goblin"], + tags: [], + category: "Smileys & Emotion", + description: "goblin", + unicode_version: "6.0", + }, + { + emoji: "👻", + aliases: ["ghost"], + tags: ["halloween"], + category: "Smileys & Emotion", + description: "ghost", + unicode_version: "6.0", + }, + { + emoji: "👽", + aliases: ["alien"], + tags: ["ufo"], + category: "Smileys & Emotion", + description: "alien", + unicode_version: "6.0", + }, + { + emoji: "👾", + aliases: ["space_invader"], + tags: ["game", "retro"], + category: "Smileys & Emotion", + description: "alien monster", + unicode_version: "6.0", + }, + { + emoji: "🤖", + aliases: ["robot"], + tags: [], + category: "Smileys & Emotion", + description: "robot", + unicode_version: "8.0", + }, + { + emoji: "😺", + aliases: ["smiley_cat"], + tags: [], + category: "Smileys & Emotion", + description: "grinning cat", + unicode_version: "6.0", + }, + { + emoji: "😸", + aliases: ["smile_cat"], + tags: [], + category: "Smileys & Emotion", + description: "grinning cat with smiling eyes", + unicode_version: "6.0", + }, + { + emoji: "😹", + aliases: ["joy_cat"], + tags: [], + category: "Smileys & Emotion", + description: "cat with tears of joy", + unicode_version: "6.0", + }, + { + emoji: "😻", + aliases: ["heart_eyes_cat"], + tags: [], + category: "Smileys & Emotion", + description: "smiling cat with heart-eyes", + unicode_version: "6.0", + }, + { + emoji: "😼", + aliases: ["smirk_cat"], + tags: [], + category: "Smileys & Emotion", + description: "cat with wry smile", + unicode_version: "6.0", + }, + { + emoji: "😽", + aliases: ["kissing_cat"], + tags: [], + category: "Smileys & Emotion", + description: "kissing cat", + unicode_version: "6.0", + }, + { + emoji: "🙀", + aliases: ["scream_cat"], + tags: ["horror"], + category: "Smileys & Emotion", + description: "weary cat", + unicode_version: "6.0", + }, + { + emoji: "😿", + aliases: ["crying_cat_face"], + tags: ["sad", "tear"], + category: "Smileys & Emotion", + description: "crying cat", + unicode_version: "6.0", + }, + { + emoji: "😾", + aliases: ["pouting_cat"], + tags: [], + category: "Smileys & Emotion", + description: "pouting cat", + unicode_version: "6.0", + }, + { + emoji: "🙈", + aliases: ["see_no_evil"], + tags: ["monkey", "blind", "ignore"], + category: "Smileys & Emotion", + description: "see-no-evil monkey", + unicode_version: "6.0", + }, + { + emoji: "🙉", + aliases: ["hear_no_evil"], + tags: ["monkey", "deaf"], + category: "Smileys & Emotion", + description: "hear-no-evil monkey", + unicode_version: "6.0", + }, + { + emoji: "🙊", + aliases: ["speak_no_evil"], + tags: ["monkey", "mute", "hush"], + category: "Smileys & Emotion", + description: "speak-no-evil monkey", + unicode_version: "6.0", + }, + { + emoji: "💋", + aliases: ["kiss"], + tags: ["lipstick"], + category: "Smileys & Emotion", + description: "kiss mark", + unicode_version: "6.0", + }, + { + emoji: "💌", + aliases: ["love_letter"], + tags: ["email", "envelope"], + category: "Smileys & Emotion", + description: "love letter", + unicode_version: "6.0", + }, + { + emoji: "💘", + aliases: ["cupid"], + tags: ["love", "heart"], + category: "Smileys & Emotion", + description: "heart with arrow", + unicode_version: "6.0", + }, + { + emoji: "💝", + aliases: ["gift_heart"], + tags: ["chocolates"], + category: "Smileys & Emotion", + description: "heart with ribbon", + unicode_version: "6.0", + }, + { + emoji: "💖", + aliases: ["sparkling_heart"], + tags: [], + category: "Smileys & Emotion", + description: "sparkling heart", + unicode_version: "6.0", + }, + { + emoji: "💗", + aliases: ["heartpulse"], + tags: [], + category: "Smileys & Emotion", + description: "growing heart", + unicode_version: "6.0", + }, + { + emoji: "💓", + aliases: ["heartbeat"], + tags: [], + category: "Smileys & Emotion", + description: "beating heart", + unicode_version: "6.0", + }, + { + emoji: "💞", + aliases: ["revolving_hearts"], + tags: [], + category: "Smileys & Emotion", + description: "revolving hearts", + unicode_version: "6.0", + }, + { + emoji: "💕", + aliases: ["two_hearts"], + tags: [], + category: "Smileys & Emotion", + description: "two hearts", + unicode_version: "6.0", + }, + { + emoji: "💟", + aliases: ["heart_decoration"], + tags: [], + category: "Smileys & Emotion", + description: "heart decoration", + unicode_version: "6.0", + }, + { + emoji: "❣️", + aliases: ["heavy_heart_exclamation"], + tags: [], + category: "Smileys & Emotion", + description: "heart exclamation", + unicode_version: "", + }, + { + emoji: "💔", + aliases: ["broken_heart"], + tags: [], + category: "Smileys & Emotion", + description: "broken heart", + unicode_version: "6.0", + }, + { + emoji: "❤️‍🔥", + aliases: ["heart_on_fire"], + tags: [], + category: "Smileys & Emotion", + description: "heart on fire", + unicode_version: "13.1", + }, + { + emoji: "❤️‍🩹", + aliases: ["mending_heart"], + tags: [], + category: "Smileys & Emotion", + description: "mending heart", + unicode_version: "13.1", + }, + { + emoji: "❤️", + aliases: ["heart"], + tags: ["love"], + category: "Smileys & Emotion", + description: "red heart", + unicode_version: "", + }, + { + emoji: "🧡", + aliases: ["orange_heart"], + tags: [], + category: "Smileys & Emotion", + description: "orange heart", + unicode_version: "11.0", + }, + { + emoji: "💛", + aliases: ["yellow_heart"], + tags: [], + category: "Smileys & Emotion", + description: "yellow heart", + unicode_version: "6.0", + }, + { + emoji: "💚", + aliases: ["green_heart"], + tags: [], + category: "Smileys & Emotion", + description: "green heart", + unicode_version: "6.0", + }, + { + emoji: "💙", + aliases: ["blue_heart"], + tags: [], + category: "Smileys & Emotion", + description: "blue heart", + unicode_version: "6.0", + }, + { + emoji: "💜", + aliases: ["purple_heart"], + tags: [], + category: "Smileys & Emotion", + description: "purple heart", + unicode_version: "6.0", + }, + { + emoji: "🤎", + aliases: ["brown_heart"], + tags: [], + category: "Smileys & Emotion", + description: "brown heart", + unicode_version: "12.0", + }, + { + emoji: "🖤", + aliases: ["black_heart"], + tags: [], + category: "Smileys & Emotion", + description: "black heart", + unicode_version: "9.0", + }, + { + emoji: "🤍", + aliases: ["white_heart"], + tags: [], + category: "Smileys & Emotion", + description: "white heart", + unicode_version: "12.0", + }, + { + emoji: "💯", + aliases: ["100"], + tags: ["score", "perfect"], + category: "Smileys & Emotion", + description: "hundred points", + unicode_version: "6.0", + }, + { + emoji: "💢", + aliases: ["anger"], + tags: ["angry"], + category: "Smileys & Emotion", + description: "anger symbol", + unicode_version: "6.0", + }, + { + emoji: "💥", + aliases: ["boom", "collision"], + tags: ["explode"], + category: "Smileys & Emotion", + description: "collision", + unicode_version: "6.0", + }, + { + emoji: "💫", + aliases: ["dizzy"], + tags: ["star"], + category: "Smileys & Emotion", + description: "dizzy", + unicode_version: "6.0", + }, + { + emoji: "💦", + aliases: ["sweat_drops"], + tags: ["water", "workout"], + category: "Smileys & Emotion", + description: "sweat droplets", + unicode_version: "6.0", + }, + { + emoji: "💨", + aliases: ["dash"], + tags: ["wind", "blow", "fast"], + category: "Smileys & Emotion", + description: "dashing away", + unicode_version: "6.0", + }, + { + emoji: "🕳️", + aliases: ["hole"], + tags: [], + category: "Smileys & Emotion", + description: "hole", + unicode_version: "7.0", + }, + { + emoji: "💣", + aliases: ["bomb"], + tags: ["boom"], + category: "Smileys & Emotion", + description: "bomb", + unicode_version: "6.0", + }, + { + emoji: "💬", + aliases: ["speech_balloon"], + tags: ["comment"], + category: "Smileys & Emotion", + description: "speech balloon", + unicode_version: "6.0", + }, + { + emoji: "👁️‍🗨️", + aliases: ["eye_speech_bubble"], + tags: [], + category: "Smileys & Emotion", + description: "eye in speech bubble", + unicode_version: "11.0", + }, + { + emoji: "🗨️", + aliases: ["left_speech_bubble"], + tags: [], + category: "Smileys & Emotion", + description: "left speech bubble", + unicode_version: "11.0", + }, + { + emoji: "🗯️", + aliases: ["right_anger_bubble"], + tags: [], + category: "Smileys & Emotion", + description: "right anger bubble", + unicode_version: "7.0", + }, + { + emoji: "💭", + aliases: ["thought_balloon"], + tags: ["thinking"], + category: "Smileys & Emotion", + description: "thought balloon", + unicode_version: "6.0", + }, + { + emoji: "💤", + aliases: ["zzz"], + tags: ["sleeping"], + category: "Smileys & Emotion", + description: "zzz", + unicode_version: "6.0", + }, + { + emoji: "👋", + aliases: ["wave"], + tags: ["goodbye"], + category: "People & Body", + description: "waving hand", + unicode_version: "6.0", + }, + { + emoji: "🤚", + aliases: ["raised_back_of_hand"], + tags: [], + category: "People & Body", + description: "raised back of hand", + unicode_version: "9.0", + }, + { + emoji: "🖐️", + aliases: ["raised_hand_with_fingers_splayed"], + tags: [], + category: "People & Body", + description: "hand with fingers splayed", + unicode_version: "7.0", + }, + { + emoji: "✋", + aliases: ["hand", "raised_hand"], + tags: ["highfive", "stop"], + category: "People & Body", + description: "raised hand", + unicode_version: "6.0", + }, + { + emoji: "🖖", + aliases: ["vulcan_salute"], + tags: ["prosper", "spock"], + category: "People & Body", + description: "vulcan salute", + unicode_version: "7.0", + }, + { + emoji: "👌", + aliases: ["ok_hand"], + tags: [], + category: "People & Body", + description: "OK hand", + unicode_version: "6.0", + }, + { + emoji: "🤌", + aliases: ["pinched_fingers"], + tags: [], + category: "People & Body", + description: "pinched fingers", + unicode_version: "13.0", + }, + { + emoji: "🤏", + aliases: ["pinching_hand"], + tags: [], + category: "People & Body", + description: "pinching hand", + unicode_version: "12.0", + }, + { + emoji: "✌️", + aliases: ["v"], + tags: ["victory", "peace"], + category: "People & Body", + description: "victory hand", + unicode_version: "", + }, + { + emoji: "🤞", + aliases: ["crossed_fingers"], + tags: ["luck", "hopeful"], + category: "People & Body", + description: "crossed fingers", + unicode_version: "9.0", + }, + { + emoji: "🤟", + aliases: ["love_you_gesture"], + tags: [], + category: "People & Body", + description: "love-you gesture", + unicode_version: "11.0", + }, + { + emoji: "🤘", + aliases: ["metal"], + tags: [], + category: "People & Body", + description: "sign of the horns", + unicode_version: "8.0", + }, + { + emoji: "🤙", + aliases: ["call_me_hand"], + tags: [], + category: "People & Body", + description: "call me hand", + unicode_version: "9.0", + }, + { + emoji: "👈", + aliases: ["point_left"], + tags: [], + category: "People & Body", + description: "backhand index pointing left", + unicode_version: "6.0", + }, + { + emoji: "👉", + aliases: ["point_right"], + tags: [], + category: "People & Body", + description: "backhand index pointing right", + unicode_version: "6.0", + }, + { + emoji: "👆", + aliases: ["point_up_2"], + tags: [], + category: "People & Body", + description: "backhand index pointing up", + unicode_version: "6.0", + }, + { + emoji: "🖕", + aliases: ["middle_finger", "fu"], + tags: [], + category: "People & Body", + description: "middle finger", + unicode_version: "7.0", + }, + { + emoji: "👇", + aliases: ["point_down"], + tags: [], + category: "People & Body", + description: "backhand index pointing down", + unicode_version: "6.0", + }, + { + emoji: "☝️", + aliases: ["point_up"], + tags: [], + category: "People & Body", + description: "index pointing up", + unicode_version: "", + }, + { + emoji: "👍", + aliases: ["+1", "thumbsup"], + tags: ["approve", "ok"], + category: "People & Body", + description: "thumbs up", + unicode_version: "6.0", + }, + { + emoji: "👎", + aliases: ["-1", "thumbsdown"], + tags: ["disapprove", "bury"], + category: "People & Body", + description: "thumbs down", + unicode_version: "6.0", + }, + { + emoji: "✊", + aliases: ["fist_raised", "fist"], + tags: ["power"], + category: "People & Body", + description: "raised fist", + unicode_version: "6.0", + }, + { + emoji: "👊", + aliases: ["fist_oncoming", "facepunch", "punch"], + tags: ["attack"], + category: "People & Body", + description: "oncoming fist", + unicode_version: "6.0", + }, + { + emoji: "🤛", + aliases: ["fist_left"], + tags: [], + category: "People & Body", + description: "left-facing fist", + unicode_version: "9.0", + }, + { + emoji: "🤜", + aliases: ["fist_right"], + tags: [], + category: "People & Body", + description: "right-facing fist", + unicode_version: "9.0", + }, + { + emoji: "👏", + aliases: ["clap"], + tags: ["praise", "applause"], + category: "People & Body", + description: "clapping hands", + unicode_version: "6.0", + }, + { + emoji: "🙌", + aliases: ["raised_hands"], + tags: ["hooray"], + category: "People & Body", + description: "raising hands", + unicode_version: "6.0", + }, + { + emoji: "👐", + aliases: ["open_hands"], + tags: [], + category: "People & Body", + description: "open hands", + unicode_version: "6.0", + }, + { + emoji: "🤲", + aliases: ["palms_up_together"], + tags: [], + category: "People & Body", + description: "palms up together", + unicode_version: "11.0", + }, + { + emoji: "🤝", + aliases: ["handshake"], + tags: ["deal"], + category: "People & Body", + description: "handshake", + unicode_version: "9.0", + }, + { + emoji: "🙏", + aliases: ["pray"], + tags: ["please", "hope", "wish"], + category: "People & Body", + description: "folded hands", + unicode_version: "6.0", + }, + { + emoji: "✍️", + aliases: ["writing_hand"], + tags: [], + category: "People & Body", + description: "writing hand", + unicode_version: "", + }, + { + emoji: "💅", + aliases: ["nail_care"], + tags: ["beauty", "manicure"], + category: "People & Body", + description: "nail polish", + unicode_version: "6.0", + }, + { + emoji: "🤳", + aliases: ["selfie"], + tags: [], + category: "People & Body", + description: "selfie", + unicode_version: "9.0", + }, + { + emoji: "💪", + aliases: ["muscle"], + tags: ["flex", "bicep", "strong", "workout"], + category: "People & Body", + description: "flexed biceps", + unicode_version: "6.0", + }, + { + emoji: "🦾", + aliases: ["mechanical_arm"], + tags: [], + category: "People & Body", + description: "mechanical arm", + unicode_version: "12.0", + }, + { + emoji: "🦿", + aliases: ["mechanical_leg"], + tags: [], + category: "People & Body", + description: "mechanical leg", + unicode_version: "12.0", + }, + { + emoji: "🦵", + aliases: ["leg"], + tags: [], + category: "People & Body", + description: "leg", + unicode_version: "11.0", + }, + { + emoji: "🦶", + aliases: ["foot"], + tags: [], + category: "People & Body", + description: "foot", + unicode_version: "11.0", + }, + { + emoji: "👂", + aliases: ["ear"], + tags: ["hear", "sound", "listen"], + category: "People & Body", + description: "ear", + unicode_version: "6.0", + }, + { + emoji: "🦻", + aliases: ["ear_with_hearing_aid"], + tags: [], + category: "People & Body", + description: "ear with hearing aid", + unicode_version: "12.0", + }, + { + emoji: "👃", + aliases: ["nose"], + tags: ["smell"], + category: "People & Body", + description: "nose", + unicode_version: "6.0", + }, + { + emoji: "🧠", + aliases: ["brain"], + tags: [], + category: "People & Body", + description: "brain", + unicode_version: "11.0", + }, + { + emoji: "🫀", + aliases: ["anatomical_heart"], + tags: [], + category: "People & Body", + description: "anatomical heart", + unicode_version: "13.0", + }, + { + emoji: "🫁", + aliases: ["lungs"], + tags: [], + category: "People & Body", + description: "lungs", + unicode_version: "13.0", + }, + { + emoji: "🦷", + aliases: ["tooth"], + tags: [], + category: "People & Body", + description: "tooth", + unicode_version: "11.0", + }, + { + emoji: "🦴", + aliases: ["bone"], + tags: [], + category: "People & Body", + description: "bone", + unicode_version: "11.0", + }, + { + emoji: "👀", + aliases: ["eyes"], + tags: ["look", "see", "watch"], + category: "People & Body", + description: "eyes", + unicode_version: "6.0", + }, + { + emoji: "👁️", + aliases: ["eye"], + tags: [], + category: "People & Body", + description: "eye", + unicode_version: "7.0", + }, + { + emoji: "👅", + aliases: ["tongue"], + tags: ["taste"], + category: "People & Body", + description: "tongue", + unicode_version: "6.0", + }, + { + emoji: "👄", + aliases: ["lips"], + tags: ["kiss"], + category: "People & Body", + description: "mouth", + unicode_version: "6.0", + }, + { + emoji: "👶", + aliases: ["baby"], + tags: ["child", "newborn"], + category: "People & Body", + description: "baby", + unicode_version: "6.0", + }, + { + emoji: "🧒", + aliases: ["child"], + tags: [], + category: "People & Body", + description: "child", + unicode_version: "11.0", + }, + { + emoji: "👦", + aliases: ["boy"], + tags: ["child"], + category: "People & Body", + description: "boy", + unicode_version: "6.0", + }, + { + emoji: "👧", + aliases: ["girl"], + tags: ["child"], + category: "People & Body", + description: "girl", + unicode_version: "6.0", + }, + { + emoji: "🧑", + aliases: ["adult"], + tags: [], + category: "People & Body", + description: "person", + unicode_version: "11.0", + }, + { + emoji: "👱", + aliases: ["blond_haired_person"], + tags: [], + category: "People & Body", + description: "person: blond hair", + unicode_version: "6.0", + }, + { + emoji: "👨", + aliases: ["man"], + tags: ["mustache", "father", "dad"], + category: "People & Body", + description: "man", + unicode_version: "6.0", + }, + { + emoji: "🧔", + aliases: ["bearded_person"], + tags: [], + category: "People & Body", + description: "person: beard", + unicode_version: "11.0", + }, + { + emoji: "🧔‍♂️", + aliases: ["man_beard"], + tags: [], + category: "People & Body", + description: "man: beard", + unicode_version: "13.1", + }, + { + emoji: "🧔‍♀️", + aliases: ["woman_beard"], + tags: [], + category: "People & Body", + description: "woman: beard", + unicode_version: "13.1", + }, + { + emoji: "👨‍🦰", + aliases: ["red_haired_man"], + tags: [], + category: "People & Body", + description: "man: red hair", + unicode_version: "11.0", + }, + { + emoji: "👨‍🦱", + aliases: ["curly_haired_man"], + tags: [], + category: "People & Body", + description: "man: curly hair", + unicode_version: "11.0", + }, + { + emoji: "👨‍🦳", + aliases: ["white_haired_man"], + tags: [], + category: "People & Body", + description: "man: white hair", + unicode_version: "11.0", + }, + { + emoji: "👨‍🦲", + aliases: ["bald_man"], + tags: [], + category: "People & Body", + description: "man: bald", + unicode_version: "11.0", + }, + { + emoji: "👩", + aliases: ["woman"], + tags: ["girls"], + category: "People & Body", + description: "woman", + unicode_version: "6.0", + }, + { + emoji: "👩‍🦰", + aliases: ["red_haired_woman"], + tags: [], + category: "People & Body", + description: "woman: red hair", + unicode_version: "11.0", + }, + { + emoji: "🧑‍🦰", + aliases: ["person_red_hair"], + tags: [], + category: "People & Body", + description: "person: red hair", + unicode_version: "12.1", + }, + { + emoji: "👩‍🦱", + aliases: ["curly_haired_woman"], + tags: [], + category: "People & Body", + description: "woman: curly hair", + unicode_version: "11.0", + }, + { + emoji: "🧑‍🦱", + aliases: ["person_curly_hair"], + tags: [], + category: "People & Body", + description: "person: curly hair", + unicode_version: "12.1", + }, + { + emoji: "👩‍🦳", + aliases: ["white_haired_woman"], + tags: [], + category: "People & Body", + description: "woman: white hair", + unicode_version: "11.0", + }, + { + emoji: "🧑‍🦳", + aliases: ["person_white_hair"], + tags: [], + category: "People & Body", + description: "person: white hair", + unicode_version: "12.1", + }, + { + emoji: "👩‍🦲", + aliases: ["bald_woman"], + tags: [], + category: "People & Body", + description: "woman: bald", + unicode_version: "11.0", + }, + { + emoji: "🧑‍🦲", + aliases: ["person_bald"], + tags: [], + category: "People & Body", + description: "person: bald", + unicode_version: "12.1", + }, + { + emoji: "👱‍♀️", + aliases: ["blond_haired_woman", "blonde_woman"], + tags: [], + category: "People & Body", + description: "woman: blond hair", + unicode_version: "6.0", + }, + { + emoji: "👱‍♂️", + aliases: ["blond_haired_man"], + tags: [], + category: "People & Body", + description: "man: blond hair", + unicode_version: "11.0", + }, + { + emoji: "🧓", + aliases: ["older_adult"], + tags: [], + category: "People & Body", + description: "older person", + unicode_version: "11.0", + }, + { + emoji: "👴", + aliases: ["older_man"], + tags: [], + category: "People & Body", + description: "old man", + unicode_version: "6.0", + }, + { + emoji: "👵", + aliases: ["older_woman"], + tags: [], + category: "People & Body", + description: "old woman", + unicode_version: "6.0", + }, + { + emoji: "🙍", + aliases: ["frowning_person"], + tags: [], + category: "People & Body", + description: "person frowning", + unicode_version: "6.0", + }, + { + emoji: "🙍‍♂️", + aliases: ["frowning_man"], + tags: [], + category: "People & Body", + description: "man frowning", + unicode_version: "6.0", + }, + { + emoji: "🙍‍♀️", + aliases: ["frowning_woman"], + tags: [], + category: "People & Body", + description: "woman frowning", + unicode_version: "11.0", + }, + { + emoji: "🙎", + aliases: ["pouting_face"], + tags: [], + category: "People & Body", + description: "person pouting", + unicode_version: "6.0", + }, + { + emoji: "🙎‍♂️", + aliases: ["pouting_man"], + tags: [], + category: "People & Body", + description: "man pouting", + unicode_version: "6.0", + }, + { + emoji: "🙎‍♀️", + aliases: ["pouting_woman"], + tags: [], + category: "People & Body", + description: "woman pouting", + unicode_version: "11.0", + }, + { + emoji: "🙅", + aliases: ["no_good"], + tags: ["stop", "halt", "denied"], + category: "People & Body", + description: "person gesturing NO", + unicode_version: "6.0", + }, + { + emoji: "🙅‍♂️", + aliases: ["no_good_man", "ng_man"], + tags: ["stop", "halt", "denied"], + category: "People & Body", + description: "man gesturing NO", + unicode_version: "6.0", + }, + { + emoji: "🙅‍♀️", + aliases: ["no_good_woman", "ng_woman"], + tags: ["stop", "halt", "denied"], + category: "People & Body", + description: "woman gesturing NO", + unicode_version: "11.0", + }, + { + emoji: "🙆", + aliases: ["ok_person"], + tags: [], + category: "People & Body", + description: "person gesturing OK", + unicode_version: "6.0", + }, + { + emoji: "🙆‍♂️", + aliases: ["ok_man"], + tags: [], + category: "People & Body", + description: "man gesturing OK", + unicode_version: "6.0", + }, + { + emoji: "🙆‍♀️", + aliases: ["ok_woman"], + tags: [], + category: "People & Body", + description: "woman gesturing OK", + unicode_version: "11.0", + }, + { + emoji: "💁", + aliases: ["tipping_hand_person", "information_desk_person"], + tags: [], + category: "People & Body", + description: "person tipping hand", + unicode_version: "6.0", + }, + { + emoji: "💁‍♂️", + aliases: ["tipping_hand_man", "sassy_man"], + tags: ["information"], + category: "People & Body", + description: "man tipping hand", + unicode_version: "6.0", + }, + { + emoji: "💁‍♀️", + aliases: ["tipping_hand_woman", "sassy_woman"], + tags: ["information"], + category: "People & Body", + description: "woman tipping hand", + unicode_version: "11.0", + }, + { + emoji: "🙋", + aliases: ["raising_hand"], + tags: [], + category: "People & Body", + description: "person raising hand", + unicode_version: "6.0", + }, + { + emoji: "🙋‍♂️", + aliases: ["raising_hand_man"], + tags: [], + category: "People & Body", + description: "man raising hand", + unicode_version: "6.0", + }, + { + emoji: "🙋‍♀️", + aliases: ["raising_hand_woman"], + tags: [], + category: "People & Body", + description: "woman raising hand", + unicode_version: "11.0", + }, + { + emoji: "🧏", + aliases: ["deaf_person"], + tags: [], + category: "People & Body", + description: "deaf person", + unicode_version: "12.0", + }, + { + emoji: "🧏‍♂️", + aliases: ["deaf_man"], + tags: [], + category: "People & Body", + description: "deaf man", + unicode_version: "12.0", + }, + { + emoji: "🧏‍♀️", + aliases: ["deaf_woman"], + tags: [], + category: "People & Body", + description: "deaf woman", + unicode_version: "12.0", + }, + { + emoji: "🙇", + aliases: ["bow"], + tags: ["respect", "thanks"], + category: "People & Body", + description: "person bowing", + unicode_version: "6.0", + }, + { + emoji: "🙇‍♂️", + aliases: ["bowing_man"], + tags: ["respect", "thanks"], + category: "People & Body", + description: "man bowing", + unicode_version: "11.0", + }, + { + emoji: "🙇‍♀️", + aliases: ["bowing_woman"], + tags: ["respect", "thanks"], + category: "People & Body", + description: "woman bowing", + unicode_version: "6.0", + }, + { + emoji: "🤦", + aliases: ["facepalm"], + tags: [], + category: "People & Body", + description: "person facepalming", + unicode_version: "11.0", + }, + { + emoji: "🤦‍♂️", + aliases: ["man_facepalming"], + tags: [], + category: "People & Body", + description: "man facepalming", + unicode_version: "9.0", + }, + { + emoji: "🤦‍♀️", + aliases: ["woman_facepalming"], + tags: [], + category: "People & Body", + description: "woman facepalming", + unicode_version: "9.0", + }, + { + emoji: "🤷", + aliases: ["shrug"], + tags: [], + category: "People & Body", + description: "person shrugging", + unicode_version: "11.0", + }, + { + emoji: "🤷‍♂️", + aliases: ["man_shrugging"], + tags: [], + category: "People & Body", + description: "man shrugging", + unicode_version: "9.0", + }, + { + emoji: "🤷‍♀️", + aliases: ["woman_shrugging"], + tags: [], + category: "People & Body", + description: "woman shrugging", + unicode_version: "9.0", + }, + { + emoji: "🧑‍⚕️", + aliases: ["health_worker"], + tags: [], + category: "People & Body", + description: "health worker", + unicode_version: "12.1", + }, + { + emoji: "👨‍⚕️", + aliases: ["man_health_worker"], + tags: ["doctor", "nurse"], + category: "People & Body", + description: "man health worker", + unicode_version: "", + }, + { + emoji: "👩‍⚕️", + aliases: ["woman_health_worker"], + tags: ["doctor", "nurse"], + category: "People & Body", + description: "woman health worker", + unicode_version: "", + }, + { + emoji: "🧑‍🎓", + aliases: ["student"], + tags: [], + category: "People & Body", + description: "student", + unicode_version: "12.1", + }, + { + emoji: "👨‍🎓", + aliases: ["man_student"], + tags: ["graduation"], + category: "People & Body", + description: "man student", + unicode_version: "", + }, + { + emoji: "👩‍🎓", + aliases: ["woman_student"], + tags: ["graduation"], + category: "People & Body", + description: "woman student", + unicode_version: "", + }, + { + emoji: "🧑‍🏫", + aliases: ["teacher"], + tags: [], + category: "People & Body", + description: "teacher", + unicode_version: "12.1", + }, + { + emoji: "👨‍🏫", + aliases: ["man_teacher"], + tags: ["school", "professor"], + category: "People & Body", + description: "man teacher", + unicode_version: "", + }, + { + emoji: "👩‍🏫", + aliases: ["woman_teacher"], + tags: ["school", "professor"], + category: "People & Body", + description: "woman teacher", + unicode_version: "", + }, + { + emoji: "🧑‍⚖️", + aliases: ["judge"], + tags: [], + category: "People & Body", + description: "judge", + unicode_version: "12.1", + }, + { + emoji: "👨‍⚖️", + aliases: ["man_judge"], + tags: ["justice"], + category: "People & Body", + description: "man judge", + unicode_version: "", + }, + { + emoji: "👩‍⚖️", + aliases: ["woman_judge"], + tags: ["justice"], + category: "People & Body", + description: "woman judge", + unicode_version: "", + }, + { + emoji: "🧑‍🌾", + aliases: ["farmer"], + tags: [], + category: "People & Body", + description: "farmer", + unicode_version: "12.1", + }, + { + emoji: "👨‍🌾", + aliases: ["man_farmer"], + tags: [], + category: "People & Body", + description: "man farmer", + unicode_version: "", + }, + { + emoji: "👩‍🌾", + aliases: ["woman_farmer"], + tags: [], + category: "People & Body", + description: "woman farmer", + unicode_version: "", + }, + { + emoji: "🧑‍🍳", + aliases: ["cook"], + tags: [], + category: "People & Body", + description: "cook", + unicode_version: "12.1", + }, + { + emoji: "👨‍🍳", + aliases: ["man_cook"], + tags: ["chef"], + category: "People & Body", + description: "man cook", + unicode_version: "", + }, + { + emoji: "👩‍🍳", + aliases: ["woman_cook"], + tags: ["chef"], + category: "People & Body", + description: "woman cook", + unicode_version: "", + }, + { + emoji: "🧑‍🔧", + aliases: ["mechanic"], + tags: [], + category: "People & Body", + description: "mechanic", + unicode_version: "12.1", + }, + { + emoji: "👨‍🔧", + aliases: ["man_mechanic"], + tags: [], + category: "People & Body", + description: "man mechanic", + unicode_version: "", + }, + { + emoji: "👩‍🔧", + aliases: ["woman_mechanic"], + tags: [], + category: "People & Body", + description: "woman mechanic", + unicode_version: "", + }, + { + emoji: "🧑‍🏭", + aliases: ["factory_worker"], + tags: [], + category: "People & Body", + description: "factory worker", + unicode_version: "12.1", + }, + { + emoji: "👨‍🏭", + aliases: ["man_factory_worker"], + tags: [], + category: "People & Body", + description: "man factory worker", + unicode_version: "", + }, + { + emoji: "👩‍🏭", + aliases: ["woman_factory_worker"], + tags: [], + category: "People & Body", + description: "woman factory worker", + unicode_version: "", + }, + { + emoji: "🧑‍💼", + aliases: ["office_worker"], + tags: [], + category: "People & Body", + description: "office worker", + unicode_version: "12.1", + }, + { + emoji: "👨‍💼", + aliases: ["man_office_worker"], + tags: ["business"], + category: "People & Body", + description: "man office worker", + unicode_version: "", + }, + { + emoji: "👩‍💼", + aliases: ["woman_office_worker"], + tags: ["business"], + category: "People & Body", + description: "woman office worker", + unicode_version: "", + }, + { + emoji: "🧑‍🔬", + aliases: ["scientist"], + tags: [], + category: "People & Body", + description: "scientist", + unicode_version: "12.1", + }, + { + emoji: "👨‍🔬", + aliases: ["man_scientist"], + tags: ["research"], + category: "People & Body", + description: "man scientist", + unicode_version: "", + }, + { + emoji: "👩‍🔬", + aliases: ["woman_scientist"], + tags: ["research"], + category: "People & Body", + description: "woman scientist", + unicode_version: "", + }, + { + emoji: "🧑‍💻", + aliases: ["technologist"], + tags: [], + category: "People & Body", + description: "technologist", + unicode_version: "12.1", + }, + { + emoji: "👨‍💻", + aliases: ["man_technologist"], + tags: ["coder"], + category: "People & Body", + description: "man technologist", + unicode_version: "", + }, + { + emoji: "👩‍💻", + aliases: ["woman_technologist"], + tags: ["coder"], + category: "People & Body", + description: "woman technologist", + unicode_version: "", + }, + { + emoji: "🧑‍🎤", + aliases: ["singer"], + tags: [], + category: "People & Body", + description: "singer", + unicode_version: "12.1", + }, + { + emoji: "👨‍🎤", + aliases: ["man_singer"], + tags: ["rockstar"], + category: "People & Body", + description: "man singer", + unicode_version: "", + }, + { + emoji: "👩‍🎤", + aliases: ["woman_singer"], + tags: ["rockstar"], + category: "People & Body", + description: "woman singer", + unicode_version: "", + }, + { + emoji: "🧑‍🎨", + aliases: ["artist"], + tags: [], + category: "People & Body", + description: "artist", + unicode_version: "12.1", + }, + { + emoji: "👨‍🎨", + aliases: ["man_artist"], + tags: ["painter"], + category: "People & Body", + description: "man artist", + unicode_version: "", + }, + { + emoji: "👩‍🎨", + aliases: ["woman_artist"], + tags: ["painter"], + category: "People & Body", + description: "woman artist", + unicode_version: "", + }, + { + emoji: "🧑‍✈️", + aliases: ["pilot"], + tags: [], + category: "People & Body", + description: "pilot", + unicode_version: "12.1", + }, + { + emoji: "👨‍✈️", + aliases: ["man_pilot"], + tags: [], + category: "People & Body", + description: "man pilot", + unicode_version: "", + }, + { + emoji: "👩‍✈️", + aliases: ["woman_pilot"], + tags: [], + category: "People & Body", + description: "woman pilot", + unicode_version: "", + }, + { + emoji: "🧑‍🚀", + aliases: ["astronaut"], + tags: [], + category: "People & Body", + description: "astronaut", + unicode_version: "12.1", + }, + { + emoji: "👨‍🚀", + aliases: ["man_astronaut"], + tags: ["space"], + category: "People & Body", + description: "man astronaut", + unicode_version: "", + }, + { + emoji: "👩‍🚀", + aliases: ["woman_astronaut"], + tags: ["space"], + category: "People & Body", + description: "woman astronaut", + unicode_version: "", + }, + { + emoji: "🧑‍🚒", + aliases: ["firefighter"], + tags: [], + category: "People & Body", + description: "firefighter", + unicode_version: "12.1", + }, + { + emoji: "👨‍🚒", + aliases: ["man_firefighter"], + tags: [], + category: "People & Body", + description: "man firefighter", + unicode_version: "", + }, + { + emoji: "👩‍🚒", + aliases: ["woman_firefighter"], + tags: [], + category: "People & Body", + description: "woman firefighter", + unicode_version: "", + }, + { + emoji: "👮", + aliases: ["police_officer", "cop"], + tags: ["law"], + category: "People & Body", + description: "police officer", + unicode_version: "6.0", + }, + { + emoji: "👮‍♂️", + aliases: ["policeman"], + tags: ["law", "cop"], + category: "People & Body", + description: "man police officer", + unicode_version: "11.0", + }, + { + emoji: "👮‍♀️", + aliases: ["policewoman"], + tags: ["law", "cop"], + category: "People & Body", + description: "woman police officer", + unicode_version: "6.0", + }, + { + emoji: "🕵️", + aliases: ["detective"], + tags: ["sleuth"], + category: "People & Body", + description: "detective", + unicode_version: "7.0", + }, + { + emoji: "🕵️‍♂️", + aliases: ["male_detective"], + tags: ["sleuth"], + category: "People & Body", + description: "man detective", + unicode_version: "11.0", + }, + { + emoji: "🕵️‍♀️", + aliases: ["female_detective"], + tags: ["sleuth"], + category: "People & Body", + description: "woman detective", + unicode_version: "6.0", + }, + { + emoji: "💂", + aliases: ["guard"], + tags: [], + category: "People & Body", + description: "guard", + unicode_version: "6.0", + }, + { + emoji: "💂‍♂️", + aliases: ["guardsman"], + tags: [], + category: "People & Body", + description: "man guard", + unicode_version: "11.0", + }, + { + emoji: "💂‍♀️", + aliases: ["guardswoman"], + tags: [], + category: "People & Body", + description: "woman guard", + unicode_version: "6.0", + }, + { + emoji: "🥷", + aliases: ["ninja"], + tags: [], + category: "People & Body", + description: "ninja", + unicode_version: "13.0", + }, + { + emoji: "👷", + aliases: ["construction_worker"], + tags: ["helmet"], + category: "People & Body", + description: "construction worker", + unicode_version: "6.0", + }, + { + emoji: "👷‍♂️", + aliases: ["construction_worker_man"], + tags: ["helmet"], + category: "People & Body", + description: "man construction worker", + unicode_version: "11.0", + }, + { + emoji: "👷‍♀️", + aliases: ["construction_worker_woman"], + tags: ["helmet"], + category: "People & Body", + description: "woman construction worker", + unicode_version: "6.0", + }, + { + emoji: "🤴", + aliases: ["prince"], + tags: ["crown", "royal"], + category: "People & Body", + description: "prince", + unicode_version: "9.0", + }, + { + emoji: "👸", + aliases: ["princess"], + tags: ["crown", "royal"], + category: "People & Body", + description: "princess", + unicode_version: "6.0", + }, + { + emoji: "👳", + aliases: ["person_with_turban"], + tags: [], + category: "People & Body", + description: "person wearing turban", + unicode_version: "6.0", + }, + { + emoji: "👳‍♂️", + aliases: ["man_with_turban"], + tags: [], + category: "People & Body", + description: "man wearing turban", + unicode_version: "11.0", + }, + { + emoji: "👳‍♀️", + aliases: ["woman_with_turban"], + tags: [], + category: "People & Body", + description: "woman wearing turban", + unicode_version: "6.0", + }, + { + emoji: "👲", + aliases: ["man_with_gua_pi_mao"], + tags: [], + category: "People & Body", + description: "person with skullcap", + unicode_version: "6.0", + }, + { + emoji: "🧕", + aliases: ["woman_with_headscarf"], + tags: ["hijab"], + category: "People & Body", + description: "woman with headscarf", + unicode_version: "11.0", + }, + { + emoji: "🤵", + aliases: ["person_in_tuxedo"], + tags: ["groom", "marriage", "wedding"], + category: "People & Body", + description: "person in tuxedo", + unicode_version: "9.0", + }, + { + emoji: "🤵‍♂️", + aliases: ["man_in_tuxedo"], + tags: [], + category: "People & Body", + description: "man in tuxedo", + unicode_version: "13.0", + }, + { + emoji: "🤵‍♀️", + aliases: ["woman_in_tuxedo"], + tags: [], + category: "People & Body", + description: "woman in tuxedo", + unicode_version: "13.0", + }, + { + emoji: "👰", + aliases: ["person_with_veil"], + tags: ["marriage", "wedding"], + category: "People & Body", + description: "person with veil", + unicode_version: "6.0", + }, + { + emoji: "👰‍♂️", + aliases: ["man_with_veil"], + tags: [], + category: "People & Body", + description: "man with veil", + unicode_version: "13.0", + }, + { + emoji: "👰‍♀️", + aliases: ["woman_with_veil", "bride_with_veil"], + tags: [], + category: "People & Body", + description: "woman with veil", + unicode_version: "13.0", + }, + { + emoji: "🤰", + aliases: ["pregnant_woman"], + tags: [], + category: "People & Body", + description: "pregnant woman", + unicode_version: "9.0", + }, + { + emoji: "🤱", + aliases: ["breast_feeding"], + tags: ["nursing"], + category: "People & Body", + description: "breast-feeding", + unicode_version: "11.0", + }, + { + emoji: "👩‍🍼", + aliases: ["woman_feeding_baby"], + tags: [], + category: "People & Body", + description: "woman feeding baby", + unicode_version: "13.0", + }, + { + emoji: "👨‍🍼", + aliases: ["man_feeding_baby"], + tags: [], + category: "People & Body", + description: "man feeding baby", + unicode_version: "13.0", + }, + { + emoji: "🧑‍🍼", + aliases: ["person_feeding_baby"], + tags: [], + category: "People & Body", + description: "person feeding baby", + unicode_version: "13.0", + }, + { + emoji: "👼", + aliases: ["angel"], + tags: [], + category: "People & Body", + description: "baby angel", + unicode_version: "6.0", + }, + { + emoji: "🎅", + aliases: ["santa"], + tags: ["christmas"], + category: "People & Body", + description: "Santa Claus", + unicode_version: "6.0", + }, + { + emoji: "🤶", + aliases: ["mrs_claus"], + tags: ["santa"], + category: "People & Body", + description: "Mrs. Claus", + unicode_version: "9.0", + }, + { + emoji: "🧑‍🎄", + aliases: ["mx_claus"], + tags: [], + category: "People & Body", + description: "mx claus", + unicode_version: "13.0", + }, + { + emoji: "🦸", + aliases: ["superhero"], + tags: [], + category: "People & Body", + description: "superhero", + unicode_version: "11.0", + }, + { + emoji: "🦸‍♂️", + aliases: ["superhero_man"], + tags: [], + category: "People & Body", + description: "man superhero", + unicode_version: "11.0", + }, + { + emoji: "🦸‍♀️", + aliases: ["superhero_woman"], + tags: [], + category: "People & Body", + description: "woman superhero", + unicode_version: "11.0", + }, + { + emoji: "🦹", + aliases: ["supervillain"], + tags: [], + category: "People & Body", + description: "supervillain", + unicode_version: "11.0", + }, + { + emoji: "🦹‍♂️", + aliases: ["supervillain_man"], + tags: [], + category: "People & Body", + description: "man supervillain", + unicode_version: "11.0", + }, + { + emoji: "🦹‍♀️", + aliases: ["supervillain_woman"], + tags: [], + category: "People & Body", + description: "woman supervillain", + unicode_version: "11.0", + }, + { + emoji: "🧙", + aliases: ["mage"], + tags: ["wizard"], + category: "People & Body", + description: "mage", + unicode_version: "11.0", + }, + { + emoji: "🧙‍♂️", + aliases: ["mage_man"], + tags: ["wizard"], + category: "People & Body", + description: "man mage", + unicode_version: "11.0", + }, + { + emoji: "🧙‍♀️", + aliases: ["mage_woman"], + tags: ["wizard"], + category: "People & Body", + description: "woman mage", + unicode_version: "11.0", + }, + { + emoji: "🧚", + aliases: ["fairy"], + tags: [], + category: "People & Body", + description: "fairy", + unicode_version: "11.0", + }, + { + emoji: "🧚‍♂️", + aliases: ["fairy_man"], + tags: [], + category: "People & Body", + description: "man fairy", + unicode_version: "11.0", + }, + { + emoji: "🧚‍♀️", + aliases: ["fairy_woman"], + tags: [], + category: "People & Body", + description: "woman fairy", + unicode_version: "11.0", + }, + { + emoji: "🧛", + aliases: ["vampire"], + tags: [], + category: "People & Body", + description: "vampire", + unicode_version: "11.0", + }, + { + emoji: "🧛‍♂️", + aliases: ["vampire_man"], + tags: [], + category: "People & Body", + description: "man vampire", + unicode_version: "11.0", + }, + { + emoji: "🧛‍♀️", + aliases: ["vampire_woman"], + tags: [], + category: "People & Body", + description: "woman vampire", + unicode_version: "11.0", + }, + { + emoji: "🧜", + aliases: ["merperson"], + tags: [], + category: "People & Body", + description: "merperson", + unicode_version: "11.0", + }, + { + emoji: "🧜‍♂️", + aliases: ["merman"], + tags: [], + category: "People & Body", + description: "merman", + unicode_version: "11.0", + }, + { + emoji: "🧜‍♀️", + aliases: ["mermaid"], + tags: [], + category: "People & Body", + description: "mermaid", + unicode_version: "11.0", + }, + { + emoji: "🧝", + aliases: ["elf"], + tags: [], + category: "People & Body", + description: "elf", + unicode_version: "11.0", + }, + { + emoji: "🧝‍♂️", + aliases: ["elf_man"], + tags: [], + category: "People & Body", + description: "man elf", + unicode_version: "11.0", + }, + { + emoji: "🧝‍♀️", + aliases: ["elf_woman"], + tags: [], + category: "People & Body", + description: "woman elf", + unicode_version: "11.0", + }, + { + emoji: "🧞", + aliases: ["genie"], + tags: [], + category: "People & Body", + description: "genie", + unicode_version: "11.0", + }, + { + emoji: "🧞‍♂️", + aliases: ["genie_man"], + tags: [], + category: "People & Body", + description: "man genie", + unicode_version: "11.0", + }, + { + emoji: "🧞‍♀️", + aliases: ["genie_woman"], + tags: [], + category: "People & Body", + description: "woman genie", + unicode_version: "11.0", + }, + { + emoji: "🧟", + aliases: ["zombie"], + tags: [], + category: "People & Body", + description: "zombie", + unicode_version: "11.0", + }, + { + emoji: "🧟‍♂️", + aliases: ["zombie_man"], + tags: [], + category: "People & Body", + description: "man zombie", + unicode_version: "11.0", + }, + { + emoji: "🧟‍♀️", + aliases: ["zombie_woman"], + tags: [], + category: "People & Body", + description: "woman zombie", + unicode_version: "11.0", + }, + { + emoji: "💆", + aliases: ["massage"], + tags: ["spa"], + category: "People & Body", + description: "person getting massage", + unicode_version: "6.0", + }, + { + emoji: "💆‍♂️", + aliases: ["massage_man"], + tags: ["spa"], + category: "People & Body", + description: "man getting massage", + unicode_version: "6.0", + }, + { + emoji: "💆‍♀️", + aliases: ["massage_woman"], + tags: ["spa"], + category: "People & Body", + description: "woman getting massage", + unicode_version: "11.0", + }, + { + emoji: "💇", + aliases: ["haircut"], + tags: ["beauty"], + category: "People & Body", + description: "person getting haircut", + unicode_version: "6.0", + }, + { + emoji: "💇‍♂️", + aliases: ["haircut_man"], + tags: [], + category: "People & Body", + description: "man getting haircut", + unicode_version: "6.0", + }, + { + emoji: "💇‍♀️", + aliases: ["haircut_woman"], + tags: [], + category: "People & Body", + description: "woman getting haircut", + unicode_version: "11.0", + }, + { + emoji: "🚶", + aliases: ["walking"], + tags: [], + category: "People & Body", + description: "person walking", + unicode_version: "6.0", + }, + { + emoji: "🚶‍♂️", + aliases: ["walking_man"], + tags: [], + category: "People & Body", + description: "man walking", + unicode_version: "11.0", + }, + { + emoji: "🚶‍♀️", + aliases: ["walking_woman"], + tags: [], + category: "People & Body", + description: "woman walking", + unicode_version: "6.0", + }, + { + emoji: "🧍", + aliases: ["standing_person"], + tags: [], + category: "People & Body", + description: "person standing", + unicode_version: "12.0", + }, + { + emoji: "🧍‍♂️", + aliases: ["standing_man"], + tags: [], + category: "People & Body", + description: "man standing", + unicode_version: "12.0", + }, + { + emoji: "🧍‍♀️", + aliases: ["standing_woman"], + tags: [], + category: "People & Body", + description: "woman standing", + unicode_version: "12.0", + }, + { + emoji: "🧎", + aliases: ["kneeling_person"], + tags: [], + category: "People & Body", + description: "person kneeling", + unicode_version: "12.0", + }, + { + emoji: "🧎‍♂️", + aliases: ["kneeling_man"], + tags: [], + category: "People & Body", + description: "man kneeling", + unicode_version: "12.0", + }, + { + emoji: "🧎‍♀️", + aliases: ["kneeling_woman"], + tags: [], + category: "People & Body", + description: "woman kneeling", + unicode_version: "12.0", + }, + { + emoji: "🧑‍🦯", + aliases: ["person_with_probing_cane"], + tags: [], + category: "People & Body", + description: "person with white cane", + unicode_version: "12.1", + }, + { + emoji: "👨‍🦯", + aliases: ["man_with_probing_cane"], + tags: [], + category: "People & Body", + description: "man with white cane", + unicode_version: "12.0", + }, + { + emoji: "👩‍🦯", + aliases: ["woman_with_probing_cane"], + tags: [], + category: "People & Body", + description: "woman with white cane", + unicode_version: "12.0", + }, + { + emoji: "🧑‍🦼", + aliases: ["person_in_motorized_wheelchair"], + tags: [], + category: "People & Body", + description: "person in motorized wheelchair", + unicode_version: "12.1", + }, + { + emoji: "👨‍🦼", + aliases: ["man_in_motorized_wheelchair"], + tags: [], + category: "People & Body", + description: "man in motorized wheelchair", + unicode_version: "12.0", + }, + { + emoji: "👩‍🦼", + aliases: ["woman_in_motorized_wheelchair"], + tags: [], + category: "People & Body", + description: "woman in motorized wheelchair", + unicode_version: "12.0", + }, + { + emoji: "🧑‍🦽", + aliases: ["person_in_manual_wheelchair"], + tags: [], + category: "People & Body", + description: "person in manual wheelchair", + unicode_version: "12.1", + }, + { + emoji: "👨‍🦽", + aliases: ["man_in_manual_wheelchair"], + tags: [], + category: "People & Body", + description: "man in manual wheelchair", + unicode_version: "12.0", + }, + { + emoji: "👩‍🦽", + aliases: ["woman_in_manual_wheelchair"], + tags: [], + category: "People & Body", + description: "woman in manual wheelchair", + unicode_version: "12.0", + }, + { + emoji: "🏃", + aliases: ["runner", "running"], + tags: ["exercise", "workout", "marathon"], + category: "People & Body", + description: "person running", + unicode_version: "6.0", + }, + { + emoji: "🏃‍♂️", + aliases: ["running_man"], + tags: ["exercise", "workout", "marathon"], + category: "People & Body", + description: "man running", + unicode_version: "11.0", + }, + { + emoji: "🏃‍♀️", + aliases: ["running_woman"], + tags: ["exercise", "workout", "marathon"], + category: "People & Body", + description: "woman running", + unicode_version: "6.0", + }, + { + emoji: "💃", + aliases: ["woman_dancing", "dancer"], + tags: ["dress"], + category: "People & Body", + description: "woman dancing", + unicode_version: "6.0", + }, + { + emoji: "🕺", + aliases: ["man_dancing"], + tags: ["dancer"], + category: "People & Body", + description: "man dancing", + unicode_version: "9.0", + }, + { + emoji: "🕴️", + aliases: ["business_suit_levitating"], + tags: [], + category: "People & Body", + description: "person in suit levitating", + unicode_version: "7.0", + }, + { + emoji: "👯", + aliases: ["dancers"], + tags: ["bunny"], + category: "People & Body", + description: "people with bunny ears", + unicode_version: "6.0", + }, + { + emoji: "👯‍♂️", + aliases: ["dancing_men"], + tags: ["bunny"], + category: "People & Body", + description: "men with bunny ears", + unicode_version: "6.0", + }, + { + emoji: "👯‍♀️", + aliases: ["dancing_women"], + tags: ["bunny"], + category: "People & Body", + description: "women with bunny ears", + unicode_version: "11.0", + }, + { + emoji: "🧖", + aliases: ["sauna_person"], + tags: ["steamy"], + category: "People & Body", + description: "person in steamy room", + unicode_version: "11.0", + }, + { + emoji: "🧖‍♂️", + aliases: ["sauna_man"], + tags: ["steamy"], + category: "People & Body", + description: "man in steamy room", + unicode_version: "11.0", + }, + { + emoji: "🧖‍♀️", + aliases: ["sauna_woman"], + tags: ["steamy"], + category: "People & Body", + description: "woman in steamy room", + unicode_version: "11.0", + }, + { + emoji: "🧗", + aliases: ["climbing"], + tags: ["bouldering"], + category: "People & Body", + description: "person climbing", + unicode_version: "11.0", + }, + { + emoji: "🧗‍♂️", + aliases: ["climbing_man"], + tags: ["bouldering"], + category: "People & Body", + description: "man climbing", + unicode_version: "11.0", + }, + { + emoji: "🧗‍♀️", + aliases: ["climbing_woman"], + tags: ["bouldering"], + category: "People & Body", + description: "woman climbing", + unicode_version: "11.0", + }, + { + emoji: "🤺", + aliases: ["person_fencing"], + tags: [], + category: "People & Body", + description: "person fencing", + unicode_version: "9.0", + }, + { + emoji: "🏇", + aliases: ["horse_racing"], + tags: [], + category: "People & Body", + description: "horse racing", + unicode_version: "6.0", + }, + { + emoji: "⛷️", + aliases: ["skier"], + tags: [], + category: "People & Body", + description: "skier", + unicode_version: "5.2", + }, + { + emoji: "🏂", + aliases: ["snowboarder"], + tags: [], + category: "People & Body", + description: "snowboarder", + unicode_version: "6.0", + }, + { + emoji: "🏌️", + aliases: ["golfing"], + tags: [], + category: "People & Body", + description: "person golfing", + unicode_version: "7.0", + }, + { + emoji: "🏌️‍♂️", + aliases: ["golfing_man"], + tags: [], + category: "People & Body", + description: "man golfing", + unicode_version: "11.0", + }, + { + emoji: "🏌️‍♀️", + aliases: ["golfing_woman"], + tags: [], + category: "People & Body", + description: "woman golfing", + unicode_version: "", + }, + { + emoji: "🏄", + aliases: ["surfer"], + tags: [], + category: "People & Body", + description: "person surfing", + unicode_version: "6.0", + }, + { + emoji: "🏄‍♂️", + aliases: ["surfing_man"], + tags: [], + category: "People & Body", + description: "man surfing", + unicode_version: "11.0", + }, + { + emoji: "🏄‍♀️", + aliases: ["surfing_woman"], + tags: [], + category: "People & Body", + description: "woman surfing", + unicode_version: "7.0", + }, + { + emoji: "🚣", + aliases: ["rowboat"], + tags: [], + category: "People & Body", + description: "person rowing boat", + unicode_version: "6.0", + }, + { + emoji: "🚣‍♂️", + aliases: ["rowing_man"], + tags: [], + category: "People & Body", + description: "man rowing boat", + unicode_version: "11.0", + }, + { + emoji: "🚣‍♀️", + aliases: ["rowing_woman"], + tags: [], + category: "People & Body", + description: "woman rowing boat", + unicode_version: "6.0", + }, + { + emoji: "🏊", + aliases: ["swimmer"], + tags: [], + category: "People & Body", + description: "person swimming", + unicode_version: "6.0", + }, + { + emoji: "🏊‍♂️", + aliases: ["swimming_man"], + tags: [], + category: "People & Body", + description: "man swimming", + unicode_version: "11.0", + }, + { + emoji: "🏊‍♀️", + aliases: ["swimming_woman"], + tags: [], + category: "People & Body", + description: "woman swimming", + unicode_version: "6.0", + }, + { + emoji: "⛹️", + aliases: ["bouncing_ball_person"], + tags: ["basketball"], + category: "People & Body", + description: "person bouncing ball", + unicode_version: "5.2", + }, + { + emoji: "⛹️‍♂️", + aliases: ["bouncing_ball_man", "basketball_man"], + tags: [], + category: "People & Body", + description: "man bouncing ball", + unicode_version: "11.0", + }, + { + emoji: "⛹️‍♀️", + aliases: ["bouncing_ball_woman", "basketball_woman"], + tags: [], + category: "People & Body", + description: "woman bouncing ball", + unicode_version: "7.0", + }, + { + emoji: "🏋️", + aliases: ["weight_lifting"], + tags: ["gym", "workout"], + category: "People & Body", + description: "person lifting weights", + unicode_version: "7.0", + }, + { + emoji: "🏋️‍♂️", + aliases: ["weight_lifting_man"], + tags: ["gym", "workout"], + category: "People & Body", + description: "man lifting weights", + unicode_version: "11.0", + }, + { + emoji: "🏋️‍♀️", + aliases: ["weight_lifting_woman"], + tags: ["gym", "workout"], + category: "People & Body", + description: "woman lifting weights", + unicode_version: "6.0", + }, + { + emoji: "🚴", + aliases: ["bicyclist"], + tags: [], + category: "People & Body", + description: "person biking", + unicode_version: "6.0", + }, + { + emoji: "🚴‍♂️", + aliases: ["biking_man"], + tags: [], + category: "People & Body", + description: "man biking", + unicode_version: "11.0", + }, + { + emoji: "🚴‍♀️", + aliases: ["biking_woman"], + tags: [], + category: "People & Body", + description: "woman biking", + unicode_version: "6.0", + }, + { + emoji: "🚵", + aliases: ["mountain_bicyclist"], + tags: [], + category: "People & Body", + description: "person mountain biking", + unicode_version: "6.0", + }, + { + emoji: "🚵‍♂️", + aliases: ["mountain_biking_man"], + tags: [], + category: "People & Body", + description: "man mountain biking", + unicode_version: "11.0", + }, + { + emoji: "🚵‍♀️", + aliases: ["mountain_biking_woman"], + tags: [], + category: "People & Body", + description: "woman mountain biking", + unicode_version: "6.0", + }, + { + emoji: "🤸", + aliases: ["cartwheeling"], + tags: [], + category: "People & Body", + description: "person cartwheeling", + unicode_version: "11.0", + }, + { + emoji: "🤸‍♂️", + aliases: ["man_cartwheeling"], + tags: [], + category: "People & Body", + description: "man cartwheeling", + unicode_version: "", + }, + { + emoji: "🤸‍♀️", + aliases: ["woman_cartwheeling"], + tags: [], + category: "People & Body", + description: "woman cartwheeling", + unicode_version: "", + }, + { + emoji: "🤼", + aliases: ["wrestling"], + tags: [], + category: "People & Body", + description: "people wrestling", + unicode_version: "11.0", + }, + { + emoji: "🤼‍♂️", + aliases: ["men_wrestling"], + tags: [], + category: "People & Body", + description: "men wrestling", + unicode_version: "9.0", + }, + { + emoji: "🤼‍♀️", + aliases: ["women_wrestling"], + tags: [], + category: "People & Body", + description: "women wrestling", + unicode_version: "9.0", + }, + { + emoji: "🤽", + aliases: ["water_polo"], + tags: [], + category: "People & Body", + description: "person playing water polo", + unicode_version: "11.0", + }, + { + emoji: "🤽‍♂️", + aliases: ["man_playing_water_polo"], + tags: [], + category: "People & Body", + description: "man playing water polo", + unicode_version: "9.0", + }, + { + emoji: "🤽‍♀️", + aliases: ["woman_playing_water_polo"], + tags: [], + category: "People & Body", + description: "woman playing water polo", + unicode_version: "9.0", + }, + { + emoji: "🤾", + aliases: ["handball_person"], + tags: [], + category: "People & Body", + description: "person playing handball", + unicode_version: "11.0", + }, + { + emoji: "🤾‍♂️", + aliases: ["man_playing_handball"], + tags: [], + category: "People & Body", + description: "man playing handball", + unicode_version: "9.0", + }, + { + emoji: "🤾‍♀️", + aliases: ["woman_playing_handball"], + tags: [], + category: "People & Body", + description: "woman playing handball", + unicode_version: "9.0", + }, + { + emoji: "🤹", + aliases: ["juggling_person"], + tags: [], + category: "People & Body", + description: "person juggling", + unicode_version: "11.0", + }, + { + emoji: "🤹‍♂️", + aliases: ["man_juggling"], + tags: [], + category: "People & Body", + description: "man juggling", + unicode_version: "9.0", + }, + { + emoji: "🤹‍♀️", + aliases: ["woman_juggling"], + tags: [], + category: "People & Body", + description: "woman juggling", + unicode_version: "9.0", + }, + { + emoji: "🧘", + aliases: ["lotus_position"], + tags: ["meditation"], + category: "People & Body", + description: "person in lotus position", + unicode_version: "11.0", + }, + { + emoji: "🧘‍♂️", + aliases: ["lotus_position_man"], + tags: ["meditation"], + category: "People & Body", + description: "man in lotus position", + unicode_version: "11.0", + }, + { + emoji: "🧘‍♀️", + aliases: ["lotus_position_woman"], + tags: ["meditation"], + category: "People & Body", + description: "woman in lotus position", + unicode_version: "11.0", + }, + { + emoji: "🛀", + aliases: ["bath"], + tags: ["shower"], + category: "People & Body", + description: "person taking bath", + unicode_version: "6.0", + }, + { + emoji: "🛌", + aliases: ["sleeping_bed"], + tags: [], + category: "People & Body", + description: "person in bed", + unicode_version: "7.0", + }, + { + emoji: "🧑‍🤝‍🧑", + aliases: ["people_holding_hands"], + tags: ["couple", "date"], + category: "People & Body", + description: "people holding hands", + unicode_version: "12.0", + }, + { + emoji: "👭", + aliases: ["two_women_holding_hands"], + tags: ["couple", "date"], + category: "People & Body", + description: "women holding hands", + unicode_version: "6.0", + }, + { + emoji: "👫", + aliases: ["couple"], + tags: ["date"], + category: "People & Body", + description: "woman and man holding hands", + unicode_version: "6.0", + }, + { + emoji: "👬", + aliases: ["two_men_holding_hands"], + tags: ["couple", "date"], + category: "People & Body", + description: "men holding hands", + unicode_version: "6.0", + }, + { + emoji: "💏", + aliases: ["couplekiss"], + tags: [], + category: "People & Body", + description: "kiss", + unicode_version: "6.0", + }, + { + emoji: "👩‍❤️‍💋‍👨", + aliases: ["couplekiss_man_woman"], + tags: [], + category: "People & Body", + description: "kiss: woman, man", + unicode_version: "11.0", + }, + { + emoji: "👨‍❤️‍💋‍👨", + aliases: ["couplekiss_man_man"], + tags: [], + category: "People & Body", + description: "kiss: man, man", + unicode_version: "6.0", + }, + { + emoji: "👩‍❤️‍💋‍👩", + aliases: ["couplekiss_woman_woman"], + tags: [], + category: "People & Body", + description: "kiss: woman, woman", + unicode_version: "6.0", + }, + { + emoji: "💑", + aliases: ["couple_with_heart"], + tags: [], + category: "People & Body", + description: "couple with heart", + unicode_version: "6.0", + }, + { + emoji: "👩‍❤️‍👨", + aliases: ["couple_with_heart_woman_man"], + tags: [], + category: "People & Body", + description: "couple with heart: woman, man", + unicode_version: "11.0", + }, + { + emoji: "👨‍❤️‍👨", + aliases: ["couple_with_heart_man_man"], + tags: [], + category: "People & Body", + description: "couple with heart: man, man", + unicode_version: "6.0", + }, + { + emoji: "👩‍❤️‍👩", + aliases: ["couple_with_heart_woman_woman"], + tags: [], + category: "People & Body", + description: "couple with heart: woman, woman", + unicode_version: "6.0", + }, + { + emoji: "👪", + aliases: ["family"], + tags: ["home", "parents", "child"], + category: "People & Body", + description: "family", + unicode_version: "6.0", + }, + { + emoji: "👨‍👩‍👦", + aliases: ["family_man_woman_boy"], + tags: [], + category: "People & Body", + description: "family: man, woman, boy", + unicode_version: "11.0", + }, + { + emoji: "👨‍👩‍👧", + aliases: ["family_man_woman_girl"], + tags: [], + category: "People & Body", + description: "family: man, woman, girl", + unicode_version: "6.0", + }, + { + emoji: "👨‍👩‍👧‍👦", + aliases: ["family_man_woman_girl_boy"], + tags: [], + category: "People & Body", + description: "family: man, woman, girl, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👩‍👦‍👦", + aliases: ["family_man_woman_boy_boy"], + tags: [], + category: "People & Body", + description: "family: man, woman, boy, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👩‍👧‍👧", + aliases: ["family_man_woman_girl_girl"], + tags: [], + category: "People & Body", + description: "family: man, woman, girl, girl", + unicode_version: "6.0", + }, + { + emoji: "👨‍👨‍👦", + aliases: ["family_man_man_boy"], + tags: [], + category: "People & Body", + description: "family: man, man, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👨‍👧", + aliases: ["family_man_man_girl"], + tags: [], + category: "People & Body", + description: "family: man, man, girl", + unicode_version: "6.0", + }, + { + emoji: "👨‍👨‍👧‍👦", + aliases: ["family_man_man_girl_boy"], + tags: [], + category: "People & Body", + description: "family: man, man, girl, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👨‍👦‍👦", + aliases: ["family_man_man_boy_boy"], + tags: [], + category: "People & Body", + description: "family: man, man, boy, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👨‍👧‍👧", + aliases: ["family_man_man_girl_girl"], + tags: [], + category: "People & Body", + description: "family: man, man, girl, girl", + unicode_version: "6.0", + }, + { + emoji: "👩‍👩‍👦", + aliases: ["family_woman_woman_boy"], + tags: [], + category: "People & Body", + description: "family: woman, woman, boy", + unicode_version: "6.0", + }, + { + emoji: "👩‍👩‍👧", + aliases: ["family_woman_woman_girl"], + tags: [], + category: "People & Body", + description: "family: woman, woman, girl", + unicode_version: "6.0", + }, + { + emoji: "👩‍👩‍👧‍👦", + aliases: ["family_woman_woman_girl_boy"], + tags: [], + category: "People & Body", + description: "family: woman, woman, girl, boy", + unicode_version: "6.0", + }, + { + emoji: "👩‍👩‍👦‍👦", + aliases: ["family_woman_woman_boy_boy"], + tags: [], + category: "People & Body", + description: "family: woman, woman, boy, boy", + unicode_version: "6.0", + }, + { + emoji: "👩‍👩‍👧‍👧", + aliases: ["family_woman_woman_girl_girl"], + tags: [], + category: "People & Body", + description: "family: woman, woman, girl, girl", + unicode_version: "6.0", + }, + { + emoji: "👨‍👦", + aliases: ["family_man_boy"], + tags: [], + category: "People & Body", + description: "family: man, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👦‍👦", + aliases: ["family_man_boy_boy"], + tags: [], + category: "People & Body", + description: "family: man, boy, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👧", + aliases: ["family_man_girl"], + tags: [], + category: "People & Body", + description: "family: man, girl", + unicode_version: "6.0", + }, + { + emoji: "👨‍👧‍👦", + aliases: ["family_man_girl_boy"], + tags: [], + category: "People & Body", + description: "family: man, girl, boy", + unicode_version: "6.0", + }, + { + emoji: "👨‍👧‍👧", + aliases: ["family_man_girl_girl"], + tags: [], + category: "People & Body", + description: "family: man, girl, girl", + unicode_version: "6.0", + }, + { + emoji: "👩‍👦", + aliases: ["family_woman_boy"], + tags: [], + category: "People & Body", + description: "family: woman, boy", + unicode_version: "6.0", + }, + { + emoji: "👩‍👦‍👦", + aliases: ["family_woman_boy_boy"], + tags: [], + category: "People & Body", + description: "family: woman, boy, boy", + unicode_version: "6.0", + }, + { + emoji: "👩‍👧", + aliases: ["family_woman_girl"], + tags: [], + category: "People & Body", + description: "family: woman, girl", + unicode_version: "6.0", + }, + { + emoji: "👩‍👧‍👦", + aliases: ["family_woman_girl_boy"], + tags: [], + category: "People & Body", + description: "family: woman, girl, boy", + unicode_version: "6.0", + }, + { + emoji: "👩‍👧‍👧", + aliases: ["family_woman_girl_girl"], + tags: [], + category: "People & Body", + description: "family: woman, girl, girl", + unicode_version: "6.0", + }, + { + emoji: "🗣️", + aliases: ["speaking_head"], + tags: [], + category: "People & Body", + description: "speaking head", + unicode_version: "7.0", + }, + { + emoji: "👤", + aliases: ["bust_in_silhouette"], + tags: ["user"], + category: "People & Body", + description: "bust in silhouette", + unicode_version: "6.0", + }, + { + emoji: "👥", + aliases: ["busts_in_silhouette"], + tags: ["users", "group", "team"], + category: "People & Body", + description: "busts in silhouette", + unicode_version: "6.0", + }, + { + emoji: "🫂", + aliases: ["people_hugging"], + tags: [], + category: "People & Body", + description: "people hugging", + unicode_version: "13.0", + }, + { + emoji: "👣", + aliases: ["footprints"], + tags: ["feet", "tracks"], + category: "People & Body", + description: "footprints", + unicode_version: "6.0", + }, + { + emoji: "🐵", + aliases: ["monkey_face"], + tags: [], + category: "Animals & Nature", + description: "monkey face", + unicode_version: "6.0", + }, + { + emoji: "🐒", + aliases: ["monkey"], + tags: [], + category: "Animals & Nature", + description: "monkey", + unicode_version: "6.0", + }, + { + emoji: "🦍", + aliases: ["gorilla"], + tags: [], + category: "Animals & Nature", + description: "gorilla", + unicode_version: "9.0", + }, + { + emoji: "🦧", + aliases: ["orangutan"], + tags: [], + category: "Animals & Nature", + description: "orangutan", + unicode_version: "12.0", + }, + { + emoji: "🐶", + aliases: ["dog"], + tags: ["pet"], + category: "Animals & Nature", + description: "dog face", + unicode_version: "6.0", + }, + { + emoji: "🐕", + aliases: ["dog2"], + tags: [], + category: "Animals & Nature", + description: "dog", + unicode_version: "6.0", + }, + { + emoji: "🦮", + aliases: ["guide_dog"], + tags: [], + category: "Animals & Nature", + description: "guide dog", + unicode_version: "12.0", + }, + { + emoji: "🐕‍🦺", + aliases: ["service_dog"], + tags: [], + category: "Animals & Nature", + description: "service dog", + unicode_version: "12.0", + }, + { + emoji: "🐩", + aliases: ["poodle"], + tags: ["dog"], + category: "Animals & Nature", + description: "poodle", + unicode_version: "6.0", + }, + { + emoji: "🐺", + aliases: ["wolf"], + tags: [], + category: "Animals & Nature", + description: "wolf", + unicode_version: "6.0", + }, + { + emoji: "🦊", + aliases: ["fox_face"], + tags: [], + category: "Animals & Nature", + description: "fox", + unicode_version: "9.0", + }, + { + emoji: "🦝", + aliases: ["raccoon"], + tags: [], + category: "Animals & Nature", + description: "raccoon", + unicode_version: "11.0", + }, + { + emoji: "🐱", + aliases: ["cat"], + tags: ["pet"], + category: "Animals & Nature", + description: "cat face", + unicode_version: "6.0", + }, + { + emoji: "🐈", + aliases: ["cat2"], + tags: [], + category: "Animals & Nature", + description: "cat", + unicode_version: "6.0", + }, + { + emoji: "🐈‍⬛", + aliases: ["black_cat"], + tags: [], + category: "Animals & Nature", + description: "black cat", + unicode_version: "13.0", + }, + { + emoji: "🦁", + aliases: ["lion"], + tags: [], + category: "Animals & Nature", + description: "lion", + unicode_version: "8.0", + }, + { + emoji: "🐯", + aliases: ["tiger"], + tags: [], + category: "Animals & Nature", + description: "tiger face", + unicode_version: "6.0", + }, + { + emoji: "🐅", + aliases: ["tiger2"], + tags: [], + category: "Animals & Nature", + description: "tiger", + unicode_version: "6.0", + }, + { + emoji: "🐆", + aliases: ["leopard"], + tags: [], + category: "Animals & Nature", + description: "leopard", + unicode_version: "6.0", + }, + { + emoji: "🐴", + aliases: ["horse"], + tags: [], + category: "Animals & Nature", + description: "horse face", + unicode_version: "6.0", + }, + { + emoji: "🐎", + aliases: ["racehorse"], + tags: ["speed"], + category: "Animals & Nature", + description: "horse", + unicode_version: "6.0", + }, + { + emoji: "🦄", + aliases: ["unicorn"], + tags: [], + category: "Animals & Nature", + description: "unicorn", + unicode_version: "8.0", + }, + { + emoji: "🦓", + aliases: ["zebra"], + tags: [], + category: "Animals & Nature", + description: "zebra", + unicode_version: "11.0", + }, + { + emoji: "🦌", + aliases: ["deer"], + tags: [], + category: "Animals & Nature", + description: "deer", + unicode_version: "9.0", + }, + { + emoji: "🦬", + aliases: ["bison"], + tags: [], + category: "Animals & Nature", + description: "bison", + unicode_version: "13.0", + }, + { + emoji: "🐮", + aliases: ["cow"], + tags: [], + category: "Animals & Nature", + description: "cow face", + unicode_version: "6.0", + }, + { + emoji: "🐂", + aliases: ["ox"], + tags: [], + category: "Animals & Nature", + description: "ox", + unicode_version: "6.0", + }, + { + emoji: "🐃", + aliases: ["water_buffalo"], + tags: [], + category: "Animals & Nature", + description: "water buffalo", + unicode_version: "6.0", + }, + { + emoji: "🐄", + aliases: ["cow2"], + tags: [], + category: "Animals & Nature", + description: "cow", + unicode_version: "6.0", + }, + { + emoji: "🐷", + aliases: ["pig"], + tags: [], + category: "Animals & Nature", + description: "pig face", + unicode_version: "6.0", + }, + { + emoji: "🐖", + aliases: ["pig2"], + tags: [], + category: "Animals & Nature", + description: "pig", + unicode_version: "6.0", + }, + { + emoji: "🐗", + aliases: ["boar"], + tags: [], + category: "Animals & Nature", + description: "boar", + unicode_version: "6.0", + }, + { + emoji: "🐽", + aliases: ["pig_nose"], + tags: [], + category: "Animals & Nature", + description: "pig nose", + unicode_version: "6.0", + }, + { + emoji: "🐏", + aliases: ["ram"], + tags: [], + category: "Animals & Nature", + description: "ram", + unicode_version: "6.0", + }, + { + emoji: "🐑", + aliases: ["sheep"], + tags: [], + category: "Animals & Nature", + description: "ewe", + unicode_version: "6.0", + }, + { + emoji: "🐐", + aliases: ["goat"], + tags: [], + category: "Animals & Nature", + description: "goat", + unicode_version: "6.0", + }, + { + emoji: "🐪", + aliases: ["dromedary_camel"], + tags: ["desert"], + category: "Animals & Nature", + description: "camel", + unicode_version: "6.0", + }, + { + emoji: "🐫", + aliases: ["camel"], + tags: [], + category: "Animals & Nature", + description: "two-hump camel", + unicode_version: "6.0", + }, + { + emoji: "🦙", + aliases: ["llama"], + tags: [], + category: "Animals & Nature", + description: "llama", + unicode_version: "11.0", + }, + { + emoji: "🦒", + aliases: ["giraffe"], + tags: [], + category: "Animals & Nature", + description: "giraffe", + unicode_version: "11.0", + }, + { + emoji: "🐘", + aliases: ["elephant"], + tags: [], + category: "Animals & Nature", + description: "elephant", + unicode_version: "6.0", + }, + { + emoji: "🦣", + aliases: ["mammoth"], + tags: [], + category: "Animals & Nature", + description: "mammoth", + unicode_version: "13.0", + }, + { + emoji: "🦏", + aliases: ["rhinoceros"], + tags: [], + category: "Animals & Nature", + description: "rhinoceros", + unicode_version: "9.0", + }, + { + emoji: "🦛", + aliases: ["hippopotamus"], + tags: [], + category: "Animals & Nature", + description: "hippopotamus", + unicode_version: "11.0", + }, + { + emoji: "🐭", + aliases: ["mouse"], + tags: [], + category: "Animals & Nature", + description: "mouse face", + unicode_version: "6.0", + }, + { + emoji: "🐁", + aliases: ["mouse2"], + tags: [], + category: "Animals & Nature", + description: "mouse", + unicode_version: "6.0", + }, + { + emoji: "🐀", + aliases: ["rat"], + tags: [], + category: "Animals & Nature", + description: "rat", + unicode_version: "6.0", + }, + { + emoji: "🐹", + aliases: ["hamster"], + tags: ["pet"], + category: "Animals & Nature", + description: "hamster", + unicode_version: "6.0", + }, + { + emoji: "🐰", + aliases: ["rabbit"], + tags: ["bunny"], + category: "Animals & Nature", + description: "rabbit face", + unicode_version: "6.0", + }, + { + emoji: "🐇", + aliases: ["rabbit2"], + tags: [], + category: "Animals & Nature", + description: "rabbit", + unicode_version: "6.0", + }, + { + emoji: "🐿️", + aliases: ["chipmunk"], + tags: [], + category: "Animals & Nature", + description: "chipmunk", + unicode_version: "7.0", + }, + { + emoji: "🦫", + aliases: ["beaver"], + tags: [], + category: "Animals & Nature", + description: "beaver", + unicode_version: "13.0", + }, + { + emoji: "🦔", + aliases: ["hedgehog"], + tags: [], + category: "Animals & Nature", + description: "hedgehog", + unicode_version: "11.0", + }, + { + emoji: "🦇", + aliases: ["bat"], + tags: [], + category: "Animals & Nature", + description: "bat", + unicode_version: "9.0", + }, + { + emoji: "🐻", + aliases: ["bear"], + tags: [], + category: "Animals & Nature", + description: "bear", + unicode_version: "6.0", + }, + { + emoji: "🐻‍❄️", + aliases: ["polar_bear"], + tags: [], + category: "Animals & Nature", + description: "polar bear", + unicode_version: "13.0", + }, + { + emoji: "🐨", + aliases: ["koala"], + tags: [], + category: "Animals & Nature", + description: "koala", + unicode_version: "6.0", + }, + { + emoji: "🐼", + aliases: ["panda_face"], + tags: [], + category: "Animals & Nature", + description: "panda", + unicode_version: "6.0", + }, + { + emoji: "🦥", + aliases: ["sloth"], + tags: [], + category: "Animals & Nature", + description: "sloth", + unicode_version: "12.0", + }, + { + emoji: "🦦", + aliases: ["otter"], + tags: [], + category: "Animals & Nature", + description: "otter", + unicode_version: "12.0", + }, + { + emoji: "🦨", + aliases: ["skunk"], + tags: [], + category: "Animals & Nature", + description: "skunk", + unicode_version: "12.0", + }, + { + emoji: "🦘", + aliases: ["kangaroo"], + tags: [], + category: "Animals & Nature", + description: "kangaroo", + unicode_version: "11.0", + }, + { + emoji: "🦡", + aliases: ["badger"], + tags: [], + category: "Animals & Nature", + description: "badger", + unicode_version: "11.0", + }, + { + emoji: "🐾", + aliases: ["feet", "paw_prints"], + tags: [], + category: "Animals & Nature", + description: "paw prints", + unicode_version: "6.0", + }, + { + emoji: "🦃", + aliases: ["turkey"], + tags: ["thanksgiving"], + category: "Animals & Nature", + description: "turkey", + unicode_version: "8.0", + }, + { + emoji: "🐔", + aliases: ["chicken"], + tags: [], + category: "Animals & Nature", + description: "chicken", + unicode_version: "6.0", + }, + { + emoji: "🐓", + aliases: ["rooster"], + tags: [], + category: "Animals & Nature", + description: "rooster", + unicode_version: "6.0", + }, + { + emoji: "🐣", + aliases: ["hatching_chick"], + tags: [], + category: "Animals & Nature", + description: "hatching chick", + unicode_version: "6.0", + }, + { + emoji: "🐤", + aliases: ["baby_chick"], + tags: [], + category: "Animals & Nature", + description: "baby chick", + unicode_version: "6.0", + }, + { + emoji: "🐥", + aliases: ["hatched_chick"], + tags: [], + category: "Animals & Nature", + description: "front-facing baby chick", + unicode_version: "6.0", + }, + { + emoji: "🐦", + aliases: ["bird"], + tags: [], + category: "Animals & Nature", + description: "bird", + unicode_version: "6.0", + }, + { + emoji: "🐧", + aliases: ["penguin"], + tags: [], + category: "Animals & Nature", + description: "penguin", + unicode_version: "6.0", + }, + { + emoji: "🕊️", + aliases: ["dove"], + tags: ["peace"], + category: "Animals & Nature", + description: "dove", + unicode_version: "7.0", + }, + { + emoji: "🦅", + aliases: ["eagle"], + tags: [], + category: "Animals & Nature", + description: "eagle", + unicode_version: "9.0", + }, + { + emoji: "🦆", + aliases: ["duck"], + tags: [], + category: "Animals & Nature", + description: "duck", + unicode_version: "9.0", + }, + { + emoji: "🦢", + aliases: ["swan"], + tags: [], + category: "Animals & Nature", + description: "swan", + unicode_version: "11.0", + }, + { + emoji: "🦉", + aliases: ["owl"], + tags: [], + category: "Animals & Nature", + description: "owl", + unicode_version: "9.0", + }, + { + emoji: "🦤", + aliases: ["dodo"], + tags: [], + category: "Animals & Nature", + description: "dodo", + unicode_version: "13.0", + }, + { + emoji: "🪶", + aliases: ["feather"], + tags: [], + category: "Animals & Nature", + description: "feather", + unicode_version: "13.0", + }, + { + emoji: "🦩", + aliases: ["flamingo"], + tags: [], + category: "Animals & Nature", + description: "flamingo", + unicode_version: "12.0", + }, + { + emoji: "🦚", + aliases: ["peacock"], + tags: [], + category: "Animals & Nature", + description: "peacock", + unicode_version: "11.0", + }, + { + emoji: "🦜", + aliases: ["parrot"], + tags: [], + category: "Animals & Nature", + description: "parrot", + unicode_version: "11.0", + }, + { + emoji: "🐸", + aliases: ["frog"], + tags: [], + category: "Animals & Nature", + description: "frog", + unicode_version: "6.0", + }, + { + emoji: "🐊", + aliases: ["crocodile"], + tags: [], + category: "Animals & Nature", + description: "crocodile", + unicode_version: "6.0", + }, + { + emoji: "🐢", + aliases: ["turtle"], + tags: ["slow"], + category: "Animals & Nature", + description: "turtle", + unicode_version: "6.0", + }, + { + emoji: "🦎", + aliases: ["lizard"], + tags: [], + category: "Animals & Nature", + description: "lizard", + unicode_version: "9.0", + }, + { + emoji: "🐍", + aliases: ["snake"], + tags: [], + category: "Animals & Nature", + description: "snake", + unicode_version: "6.0", + }, + { + emoji: "🐲", + aliases: ["dragon_face"], + tags: [], + category: "Animals & Nature", + description: "dragon face", + unicode_version: "6.0", + }, + { + emoji: "🐉", + aliases: ["dragon"], + tags: [], + category: "Animals & Nature", + description: "dragon", + unicode_version: "6.0", + }, + { + emoji: "🦕", + aliases: ["sauropod"], + tags: ["dinosaur"], + category: "Animals & Nature", + description: "sauropod", + unicode_version: "11.0", + }, + { + emoji: "🦖", + aliases: ["t-rex"], + tags: ["dinosaur"], + category: "Animals & Nature", + description: "T-Rex", + unicode_version: "11.0", + }, + { + emoji: "🐳", + aliases: ["whale"], + tags: ["sea"], + category: "Animals & Nature", + description: "spouting whale", + unicode_version: "6.0", + }, + { + emoji: "🐋", + aliases: ["whale2"], + tags: [], + category: "Animals & Nature", + description: "whale", + unicode_version: "6.0", + }, + { + emoji: "🐬", + aliases: ["dolphin", "flipper"], + tags: [], + category: "Animals & Nature", + description: "dolphin", + unicode_version: "6.0", + }, + { + emoji: "🦭", + aliases: ["seal"], + tags: [], + category: "Animals & Nature", + description: "seal", + unicode_version: "13.0", + }, + { + emoji: "🐟", + aliases: ["fish"], + tags: [], + category: "Animals & Nature", + description: "fish", + unicode_version: "6.0", + }, + { + emoji: "🐠", + aliases: ["tropical_fish"], + tags: [], + category: "Animals & Nature", + description: "tropical fish", + unicode_version: "6.0", + }, + { + emoji: "🐡", + aliases: ["blowfish"], + tags: [], + category: "Animals & Nature", + description: "blowfish", + unicode_version: "6.0", + }, + { + emoji: "🦈", + aliases: ["shark"], + tags: [], + category: "Animals & Nature", + description: "shark", + unicode_version: "9.0", + }, + { + emoji: "🐙", + aliases: ["octopus"], + tags: [], + category: "Animals & Nature", + description: "octopus", + unicode_version: "6.0", + }, + { + emoji: "🐚", + aliases: ["shell"], + tags: ["sea", "beach"], + category: "Animals & Nature", + description: "spiral shell", + unicode_version: "6.0", + }, + { + emoji: "🐌", + aliases: ["snail"], + tags: ["slow"], + category: "Animals & Nature", + description: "snail", + unicode_version: "6.0", + }, + { + emoji: "🦋", + aliases: ["butterfly"], + tags: [], + category: "Animals & Nature", + description: "butterfly", + unicode_version: "9.0", + }, + { + emoji: "🐛", + aliases: ["bug"], + tags: [], + category: "Animals & Nature", + description: "bug", + unicode_version: "6.0", + }, + { + emoji: "🐜", + aliases: ["ant"], + tags: [], + category: "Animals & Nature", + description: "ant", + unicode_version: "6.0", + }, + { + emoji: "🐝", + aliases: ["bee", "honeybee"], + tags: [], + category: "Animals & Nature", + description: "honeybee", + unicode_version: "6.0", + }, + { + emoji: "🪲", + aliases: ["beetle"], + tags: [], + category: "Animals & Nature", + description: "beetle", + unicode_version: "13.0", + }, + { + emoji: "🐞", + aliases: ["lady_beetle"], + tags: ["bug"], + category: "Animals & Nature", + description: "lady beetle", + unicode_version: "6.0", + }, + { + emoji: "🦗", + aliases: ["cricket"], + tags: [], + category: "Animals & Nature", + description: "cricket", + unicode_version: "11.0", + }, + { + emoji: "🪳", + aliases: ["cockroach"], + tags: [], + category: "Animals & Nature", + description: "cockroach", + unicode_version: "13.0", + }, + { + emoji: "🕷️", + aliases: ["spider"], + tags: [], + category: "Animals & Nature", + description: "spider", + unicode_version: "7.0", + }, + { + emoji: "🕸️", + aliases: ["spider_web"], + tags: [], + category: "Animals & Nature", + description: "spider web", + unicode_version: "7.0", + }, + { + emoji: "🦂", + aliases: ["scorpion"], + tags: [], + category: "Animals & Nature", + description: "scorpion", + unicode_version: "8.0", + }, + { + emoji: "🦟", + aliases: ["mosquito"], + tags: [], + category: "Animals & Nature", + description: "mosquito", + unicode_version: "11.0", + }, + { + emoji: "🪰", + aliases: ["fly"], + tags: [], + category: "Animals & Nature", + description: "fly", + unicode_version: "13.0", + }, + { + emoji: "🪱", + aliases: ["worm"], + tags: [], + category: "Animals & Nature", + description: "worm", + unicode_version: "13.0", + }, + { + emoji: "🦠", + aliases: ["microbe"], + tags: ["germ"], + category: "Animals & Nature", + description: "microbe", + unicode_version: "11.0", + }, + { + emoji: "💐", + aliases: ["bouquet"], + tags: ["flowers"], + category: "Animals & Nature", + description: "bouquet", + unicode_version: "6.0", + }, + { + emoji: "🌸", + aliases: ["cherry_blossom"], + tags: ["flower", "spring"], + category: "Animals & Nature", + description: "cherry blossom", + unicode_version: "6.0", + }, + { + emoji: "💮", + aliases: ["white_flower"], + tags: [], + category: "Animals & Nature", + description: "white flower", + unicode_version: "6.0", + }, + { + emoji: "🏵️", + aliases: ["rosette"], + tags: [], + category: "Animals & Nature", + description: "rosette", + unicode_version: "7.0", + }, + { + emoji: "🌹", + aliases: ["rose"], + tags: ["flower"], + category: "Animals & Nature", + description: "rose", + unicode_version: "6.0", + }, + { + emoji: "🥀", + aliases: ["wilted_flower"], + tags: [], + category: "Animals & Nature", + description: "wilted flower", + unicode_version: "9.0", + }, + { + emoji: "🌺", + aliases: ["hibiscus"], + tags: [], + category: "Animals & Nature", + description: "hibiscus", + unicode_version: "6.0", + }, + { + emoji: "🌻", + aliases: ["sunflower"], + tags: [], + category: "Animals & Nature", + description: "sunflower", + unicode_version: "6.0", + }, + { + emoji: "🌼", + aliases: ["blossom"], + tags: [], + category: "Animals & Nature", + description: "blossom", + unicode_version: "6.0", + }, + { + emoji: "🌷", + aliases: ["tulip"], + tags: ["flower"], + category: "Animals & Nature", + description: "tulip", + unicode_version: "6.0", + }, + { + emoji: "🌱", + aliases: ["seedling"], + tags: ["plant"], + category: "Animals & Nature", + description: "seedling", + unicode_version: "6.0", + }, + { + emoji: "🪴", + aliases: ["potted_plant"], + tags: [], + category: "Animals & Nature", + description: "potted plant", + unicode_version: "13.0", + }, + { + emoji: "🌲", + aliases: ["evergreen_tree"], + tags: ["wood"], + category: "Animals & Nature", + description: "evergreen tree", + unicode_version: "6.0", + }, + { + emoji: "🌳", + aliases: ["deciduous_tree"], + tags: ["wood"], + category: "Animals & Nature", + description: "deciduous tree", + unicode_version: "6.0", + }, + { + emoji: "🌴", + aliases: ["palm_tree"], + tags: [], + category: "Animals & Nature", + description: "palm tree", + unicode_version: "6.0", + }, + { + emoji: "🌵", + aliases: ["cactus"], + tags: [], + category: "Animals & Nature", + description: "cactus", + unicode_version: "6.0", + }, + { + emoji: "🌾", + aliases: ["ear_of_rice"], + tags: [], + category: "Animals & Nature", + description: "sheaf of rice", + unicode_version: "6.0", + }, + { + emoji: "🌿", + aliases: ["herb"], + tags: [], + category: "Animals & Nature", + description: "herb", + unicode_version: "6.0", + }, + { + emoji: "☘️", + aliases: ["shamrock"], + tags: [], + category: "Animals & Nature", + description: "shamrock", + unicode_version: "4.1", + }, + { + emoji: "🍀", + aliases: ["four_leaf_clover"], + tags: ["luck"], + category: "Animals & Nature", + description: "four leaf clover", + unicode_version: "6.0", + }, + { + emoji: "🍁", + aliases: ["maple_leaf"], + tags: ["canada"], + category: "Animals & Nature", + description: "maple leaf", + unicode_version: "6.0", + }, + { + emoji: "🍂", + aliases: ["fallen_leaf"], + tags: ["autumn"], + category: "Animals & Nature", + description: "fallen leaf", + unicode_version: "6.0", + }, + { + emoji: "🍃", + aliases: ["leaves"], + tags: ["leaf"], + category: "Animals & Nature", + description: "leaf fluttering in wind", + unicode_version: "6.0", + }, + { + emoji: "🍇", + aliases: ["grapes"], + tags: [], + category: "Food & Drink", + description: "grapes", + unicode_version: "6.0", + }, + { + emoji: "🍈", + aliases: ["melon"], + tags: [], + category: "Food & Drink", + description: "melon", + unicode_version: "6.0", + }, + { + emoji: "🍉", + aliases: ["watermelon"], + tags: [], + category: "Food & Drink", + description: "watermelon", + unicode_version: "6.0", + }, + { + emoji: "🍊", + aliases: ["tangerine", "orange", "mandarin"], + tags: [], + category: "Food & Drink", + description: "tangerine", + unicode_version: "6.0", + }, + { + emoji: "🍋", + aliases: ["lemon"], + tags: [], + category: "Food & Drink", + description: "lemon", + unicode_version: "6.0", + }, + { + emoji: "🍌", + aliases: ["banana"], + tags: ["fruit"], + category: "Food & Drink", + description: "banana", + unicode_version: "6.0", + }, + { + emoji: "🍍", + aliases: ["pineapple"], + tags: [], + category: "Food & Drink", + description: "pineapple", + unicode_version: "6.0", + }, + { + emoji: "🥭", + aliases: ["mango"], + tags: [], + category: "Food & Drink", + description: "mango", + unicode_version: "11.0", + }, + { + emoji: "🍎", + aliases: ["apple"], + tags: [], + category: "Food & Drink", + description: "red apple", + unicode_version: "6.0", + }, + { + emoji: "🍏", + aliases: ["green_apple"], + tags: ["fruit"], + category: "Food & Drink", + description: "green apple", + unicode_version: "6.0", + }, + { + emoji: "🍐", + aliases: ["pear"], + tags: [], + category: "Food & Drink", + description: "pear", + unicode_version: "6.0", + }, + { + emoji: "🍑", + aliases: ["peach"], + tags: [], + category: "Food & Drink", + description: "peach", + unicode_version: "6.0", + }, + { + emoji: "🍒", + aliases: ["cherries"], + tags: ["fruit"], + category: "Food & Drink", + description: "cherries", + unicode_version: "6.0", + }, + { + emoji: "🍓", + aliases: ["strawberry"], + tags: ["fruit"], + category: "Food & Drink", + description: "strawberry", + unicode_version: "6.0", + }, + { + emoji: "🫐", + aliases: ["blueberries"], + tags: [], + category: "Food & Drink", + description: "blueberries", + unicode_version: "13.0", + }, + { + emoji: "🥝", + aliases: ["kiwi_fruit"], + tags: [], + category: "Food & Drink", + description: "kiwi fruit", + unicode_version: "9.0", + }, + { + emoji: "🍅", + aliases: ["tomato"], + tags: [], + category: "Food & Drink", + description: "tomato", + unicode_version: "6.0", + }, + { + emoji: "🫒", + aliases: ["olive"], + tags: [], + category: "Food & Drink", + description: "olive", + unicode_version: "13.0", + }, + { + emoji: "🥥", + aliases: ["coconut"], + tags: [], + category: "Food & Drink", + description: "coconut", + unicode_version: "11.0", + }, + { + emoji: "🥑", + aliases: ["avocado"], + tags: [], + category: "Food & Drink", + description: "avocado", + unicode_version: "9.0", + }, + { + emoji: "🍆", + aliases: ["eggplant"], + tags: ["aubergine"], + category: "Food & Drink", + description: "eggplant", + unicode_version: "6.0", + }, + { + emoji: "🥔", + aliases: ["potato"], + tags: [], + category: "Food & Drink", + description: "potato", + unicode_version: "9.0", + }, + { + emoji: "🥕", + aliases: ["carrot"], + tags: [], + category: "Food & Drink", + description: "carrot", + unicode_version: "9.0", + }, + { + emoji: "🌽", + aliases: ["corn"], + tags: [], + category: "Food & Drink", + description: "ear of corn", + unicode_version: "6.0", + }, + { + emoji: "🌶️", + aliases: ["hot_pepper"], + tags: ["spicy"], + category: "Food & Drink", + description: "hot pepper", + unicode_version: "7.0", + }, + { + emoji: "🫑", + aliases: ["bell_pepper"], + tags: [], + category: "Food & Drink", + description: "bell pepper", + unicode_version: "13.0", + }, + { + emoji: "🥒", + aliases: ["cucumber"], + tags: [], + category: "Food & Drink", + description: "cucumber", + unicode_version: "9.0", + }, + { + emoji: "🥬", + aliases: ["leafy_green"], + tags: [], + category: "Food & Drink", + description: "leafy green", + unicode_version: "11.0", + }, + { + emoji: "🥦", + aliases: ["broccoli"], + tags: [], + category: "Food & Drink", + description: "broccoli", + unicode_version: "11.0", + }, + { + emoji: "🧄", + aliases: ["garlic"], + tags: [], + category: "Food & Drink", + description: "garlic", + unicode_version: "12.0", + }, + { + emoji: "🧅", + aliases: ["onion"], + tags: [], + category: "Food & Drink", + description: "onion", + unicode_version: "12.0", + }, + { + emoji: "🍄", + aliases: ["mushroom"], + tags: [], + category: "Food & Drink", + description: "mushroom", + unicode_version: "6.0", + }, + { + emoji: "🥜", + aliases: ["peanuts"], + tags: [], + category: "Food & Drink", + description: "peanuts", + unicode_version: "9.0", + }, + { + emoji: "🌰", + aliases: ["chestnut"], + tags: [], + category: "Food & Drink", + description: "chestnut", + unicode_version: "6.0", + }, + { + emoji: "🍞", + aliases: ["bread"], + tags: ["toast"], + category: "Food & Drink", + description: "bread", + unicode_version: "6.0", + }, + { + emoji: "🥐", + aliases: ["croissant"], + tags: [], + category: "Food & Drink", + description: "croissant", + unicode_version: "9.0", + }, + { + emoji: "🥖", + aliases: ["baguette_bread"], + tags: [], + category: "Food & Drink", + description: "baguette bread", + unicode_version: "9.0", + }, + { + emoji: "🫓", + aliases: ["flatbread"], + tags: [], + category: "Food & Drink", + description: "flatbread", + unicode_version: "13.0", + }, + { + emoji: "🥨", + aliases: ["pretzel"], + tags: [], + category: "Food & Drink", + description: "pretzel", + unicode_version: "11.0", + }, + { + emoji: "🥯", + aliases: ["bagel"], + tags: [], + category: "Food & Drink", + description: "bagel", + unicode_version: "11.0", + }, + { + emoji: "🥞", + aliases: ["pancakes"], + tags: [], + category: "Food & Drink", + description: "pancakes", + unicode_version: "9.0", + }, + { + emoji: "🧇", + aliases: ["waffle"], + tags: [], + category: "Food & Drink", + description: "waffle", + unicode_version: "12.0", + }, + { + emoji: "🧀", + aliases: ["cheese"], + tags: [], + category: "Food & Drink", + description: "cheese wedge", + unicode_version: "8.0", + }, + { + emoji: "🍖", + aliases: ["meat_on_bone"], + tags: [], + category: "Food & Drink", + description: "meat on bone", + unicode_version: "6.0", + }, + { + emoji: "🍗", + aliases: ["poultry_leg"], + tags: ["meat", "chicken"], + category: "Food & Drink", + description: "poultry leg", + unicode_version: "6.0", + }, + { + emoji: "🥩", + aliases: ["cut_of_meat"], + tags: [], + category: "Food & Drink", + description: "cut of meat", + unicode_version: "11.0", + }, + { + emoji: "🥓", + aliases: ["bacon"], + tags: [], + category: "Food & Drink", + description: "bacon", + unicode_version: "9.0", + }, + { + emoji: "🍔", + aliases: ["hamburger"], + tags: ["burger"], + category: "Food & Drink", + description: "hamburger", + unicode_version: "6.0", + }, + { + emoji: "🍟", + aliases: ["fries"], + tags: [], + category: "Food & Drink", + description: "french fries", + unicode_version: "6.0", + }, + { + emoji: "🍕", + aliases: ["pizza"], + tags: [], + category: "Food & Drink", + description: "pizza", + unicode_version: "6.0", + }, + { + emoji: "🌭", + aliases: ["hotdog"], + tags: [], + category: "Food & Drink", + description: "hot dog", + unicode_version: "8.0", + }, + { + emoji: "🥪", + aliases: ["sandwich"], + tags: [], + category: "Food & Drink", + description: "sandwich", + unicode_version: "11.0", + }, + { + emoji: "🌮", + aliases: ["taco"], + tags: [], + category: "Food & Drink", + description: "taco", + unicode_version: "8.0", + }, + { + emoji: "🌯", + aliases: ["burrito"], + tags: [], + category: "Food & Drink", + description: "burrito", + unicode_version: "8.0", + }, + { + emoji: "🫔", + aliases: ["tamale"], + tags: [], + category: "Food & Drink", + description: "tamale", + unicode_version: "13.0", + }, + { + emoji: "🥙", + aliases: ["stuffed_flatbread"], + tags: [], + category: "Food & Drink", + description: "stuffed flatbread", + unicode_version: "9.0", + }, + { + emoji: "🧆", + aliases: ["falafel"], + tags: [], + category: "Food & Drink", + description: "falafel", + unicode_version: "12.0", + }, + { + emoji: "🥚", + aliases: ["egg"], + tags: [], + category: "Food & Drink", + description: "egg", + unicode_version: "9.0", + }, + { + emoji: "🍳", + aliases: ["fried_egg"], + tags: ["breakfast"], + category: "Food & Drink", + description: "cooking", + unicode_version: "6.0", + }, + { + emoji: "🥘", + aliases: ["shallow_pan_of_food"], + tags: ["paella", "curry"], + category: "Food & Drink", + description: "shallow pan of food", + unicode_version: "", + }, + { + emoji: "🍲", + aliases: ["stew"], + tags: [], + category: "Food & Drink", + description: "pot of food", + unicode_version: "6.0", + }, + { + emoji: "🫕", + aliases: ["fondue"], + tags: [], + category: "Food & Drink", + description: "fondue", + unicode_version: "13.0", + }, + { + emoji: "🥣", + aliases: ["bowl_with_spoon"], + tags: [], + category: "Food & Drink", + description: "bowl with spoon", + unicode_version: "11.0", + }, + { + emoji: "🥗", + aliases: ["green_salad"], + tags: [], + category: "Food & Drink", + description: "green salad", + unicode_version: "9.0", + }, + { + emoji: "🍿", + aliases: ["popcorn"], + tags: [], + category: "Food & Drink", + description: "popcorn", + unicode_version: "8.0", + }, + { + emoji: "🧈", + aliases: ["butter"], + tags: [], + category: "Food & Drink", + description: "butter", + unicode_version: "12.0", + }, + { + emoji: "🧂", + aliases: ["salt"], + tags: [], + category: "Food & Drink", + description: "salt", + unicode_version: "11.0", + }, + { + emoji: "🥫", + aliases: ["canned_food"], + tags: [], + category: "Food & Drink", + description: "canned food", + unicode_version: "11.0", + }, + { + emoji: "🍱", + aliases: ["bento"], + tags: [], + category: "Food & Drink", + description: "bento box", + unicode_version: "6.0", + }, + { + emoji: "🍘", + aliases: ["rice_cracker"], + tags: [], + category: "Food & Drink", + description: "rice cracker", + unicode_version: "6.0", + }, + { + emoji: "🍙", + aliases: ["rice_ball"], + tags: [], + category: "Food & Drink", + description: "rice ball", + unicode_version: "6.0", + }, + { + emoji: "🍚", + aliases: ["rice"], + tags: [], + category: "Food & Drink", + description: "cooked rice", + unicode_version: "6.0", + }, + { + emoji: "🍛", + aliases: ["curry"], + tags: [], + category: "Food & Drink", + description: "curry rice", + unicode_version: "6.0", + }, + { + emoji: "🍜", + aliases: ["ramen"], + tags: ["noodle"], + category: "Food & Drink", + description: "steaming bowl", + unicode_version: "6.0", + }, + { + emoji: "🍝", + aliases: ["spaghetti"], + tags: ["pasta"], + category: "Food & Drink", + description: "spaghetti", + unicode_version: "6.0", + }, + { + emoji: "🍠", + aliases: ["sweet_potato"], + tags: [], + category: "Food & Drink", + description: "roasted sweet potato", + unicode_version: "6.0", + }, + { + emoji: "🍢", + aliases: ["oden"], + tags: [], + category: "Food & Drink", + description: "oden", + unicode_version: "6.0", + }, + { + emoji: "🍣", + aliases: ["sushi"], + tags: [], + category: "Food & Drink", + description: "sushi", + unicode_version: "6.0", + }, + { + emoji: "🍤", + aliases: ["fried_shrimp"], + tags: ["tempura"], + category: "Food & Drink", + description: "fried shrimp", + unicode_version: "6.0", + }, + { + emoji: "🍥", + aliases: ["fish_cake"], + tags: [], + category: "Food & Drink", + description: "fish cake with swirl", + unicode_version: "6.0", + }, + { + emoji: "🥮", + aliases: ["moon_cake"], + tags: [], + category: "Food & Drink", + description: "moon cake", + unicode_version: "11.0", + }, + { + emoji: "🍡", + aliases: ["dango"], + tags: [], + category: "Food & Drink", + description: "dango", + unicode_version: "6.0", + }, + { + emoji: "🥟", + aliases: ["dumpling"], + tags: [], + category: "Food & Drink", + description: "dumpling", + unicode_version: "11.0", + }, + { + emoji: "🥠", + aliases: ["fortune_cookie"], + tags: [], + category: "Food & Drink", + description: "fortune cookie", + unicode_version: "11.0", + }, + { + emoji: "🥡", + aliases: ["takeout_box"], + tags: [], + category: "Food & Drink", + description: "takeout box", + unicode_version: "11.0", + }, + { + emoji: "🦀", + aliases: ["crab"], + tags: [], + category: "Food & Drink", + description: "crab", + unicode_version: "8.0", + }, + { + emoji: "🦞", + aliases: ["lobster"], + tags: [], + category: "Food & Drink", + description: "lobster", + unicode_version: "11.0", + }, + { + emoji: "🦐", + aliases: ["shrimp"], + tags: [], + category: "Food & Drink", + description: "shrimp", + unicode_version: "9.0", + }, + { + emoji: "🦑", + aliases: ["squid"], + tags: [], + category: "Food & Drink", + description: "squid", + unicode_version: "9.0", + }, + { + emoji: "🦪", + aliases: ["oyster"], + tags: [], + category: "Food & Drink", + description: "oyster", + unicode_version: "12.0", + }, + { + emoji: "🍦", + aliases: ["icecream"], + tags: [], + category: "Food & Drink", + description: "soft ice cream", + unicode_version: "6.0", + }, + { + emoji: "🍧", + aliases: ["shaved_ice"], + tags: [], + category: "Food & Drink", + description: "shaved ice", + unicode_version: "6.0", + }, + { + emoji: "🍨", + aliases: ["ice_cream"], + tags: [], + category: "Food & Drink", + description: "ice cream", + unicode_version: "6.0", + }, + { + emoji: "🍩", + aliases: ["doughnut"], + tags: [], + category: "Food & Drink", + description: "doughnut", + unicode_version: "6.0", + }, + { + emoji: "🍪", + aliases: ["cookie"], + tags: [], + category: "Food & Drink", + description: "cookie", + unicode_version: "6.0", + }, + { + emoji: "🎂", + aliases: ["birthday"], + tags: ["party"], + category: "Food & Drink", + description: "birthday cake", + unicode_version: "6.0", + }, + { + emoji: "🍰", + aliases: ["cake"], + tags: ["dessert"], + category: "Food & Drink", + description: "shortcake", + unicode_version: "6.0", + }, + { + emoji: "🧁", + aliases: ["cupcake"], + tags: [], + category: "Food & Drink", + description: "cupcake", + unicode_version: "11.0", + }, + { + emoji: "🥧", + aliases: ["pie"], + tags: [], + category: "Food & Drink", + description: "pie", + unicode_version: "11.0", + }, + { + emoji: "🍫", + aliases: ["chocolate_bar"], + tags: [], + category: "Food & Drink", + description: "chocolate bar", + unicode_version: "6.0", + }, + { + emoji: "🍬", + aliases: ["candy"], + tags: ["sweet"], + category: "Food & Drink", + description: "candy", + unicode_version: "6.0", + }, + { + emoji: "🍭", + aliases: ["lollipop"], + tags: [], + category: "Food & Drink", + description: "lollipop", + unicode_version: "6.0", + }, + { + emoji: "🍮", + aliases: ["custard"], + tags: [], + category: "Food & Drink", + description: "custard", + unicode_version: "6.0", + }, + { + emoji: "🍯", + aliases: ["honey_pot"], + tags: [], + category: "Food & Drink", + description: "honey pot", + unicode_version: "6.0", + }, + { + emoji: "🍼", + aliases: ["baby_bottle"], + tags: ["milk"], + category: "Food & Drink", + description: "baby bottle", + unicode_version: "6.0", + }, + { + emoji: "🥛", + aliases: ["milk_glass"], + tags: [], + category: "Food & Drink", + description: "glass of milk", + unicode_version: "9.0", + }, + { + emoji: "☕", + aliases: ["coffee"], + tags: ["cafe", "espresso"], + category: "Food & Drink", + description: "hot beverage", + unicode_version: "4.0", + }, + { + emoji: "🫖", + aliases: ["teapot"], + tags: [], + category: "Food & Drink", + description: "teapot", + unicode_version: "13.0", + }, + { + emoji: "🍵", + aliases: ["tea"], + tags: ["green", "breakfast"], + category: "Food & Drink", + description: "teacup without handle", + unicode_version: "6.0", + }, + { + emoji: "🍶", + aliases: ["sake"], + tags: [], + category: "Food & Drink", + description: "sake", + unicode_version: "6.0", + }, + { + emoji: "🍾", + aliases: ["champagne"], + tags: ["bottle", "bubbly", "celebration"], + category: "Food & Drink", + description: "bottle with popping cork", + unicode_version: "8.0", + }, + { + emoji: "🍷", + aliases: ["wine_glass"], + tags: [], + category: "Food & Drink", + description: "wine glass", + unicode_version: "6.0", + }, + { + emoji: "🍸", + aliases: ["cocktail"], + tags: ["drink"], + category: "Food & Drink", + description: "cocktail glass", + unicode_version: "6.0", + }, + { + emoji: "🍹", + aliases: ["tropical_drink"], + tags: ["summer", "vacation"], + category: "Food & Drink", + description: "tropical drink", + unicode_version: "6.0", + }, + { + emoji: "🍺", + aliases: ["beer"], + tags: ["drink"], + category: "Food & Drink", + description: "beer mug", + unicode_version: "6.0", + }, + { + emoji: "🍻", + aliases: ["beers"], + tags: ["drinks"], + category: "Food & Drink", + description: "clinking beer mugs", + unicode_version: "6.0", + }, + { + emoji: "🥂", + aliases: ["clinking_glasses"], + tags: ["cheers", "toast"], + category: "Food & Drink", + description: "clinking glasses", + unicode_version: "9.0", + }, + { + emoji: "🥃", + aliases: ["tumbler_glass"], + tags: ["whisky"], + category: "Food & Drink", + description: "tumbler glass", + unicode_version: "9.0", + }, + { + emoji: "🥤", + aliases: ["cup_with_straw"], + tags: [], + category: "Food & Drink", + description: "cup with straw", + unicode_version: "11.0", + }, + { + emoji: "🧋", + aliases: ["bubble_tea"], + tags: [], + category: "Food & Drink", + description: "bubble tea", + unicode_version: "13.0", + }, + { + emoji: "🧃", + aliases: ["beverage_box"], + tags: [], + category: "Food & Drink", + description: "beverage box", + unicode_version: "12.0", + }, + { + emoji: "🧉", + aliases: ["mate"], + tags: [], + category: "Food & Drink", + description: "mate", + unicode_version: "12.0", + }, + { + emoji: "🧊", + aliases: ["ice_cube"], + tags: [], + category: "Food & Drink", + description: "ice", + unicode_version: "12.0", + }, + { + emoji: "🥢", + aliases: ["chopsticks"], + tags: [], + category: "Food & Drink", + description: "chopsticks", + unicode_version: "11.0", + }, + { + emoji: "🍽️", + aliases: ["plate_with_cutlery"], + tags: ["dining", "dinner"], + category: "Food & Drink", + description: "fork and knife with plate", + unicode_version: "7.0", + }, + { + emoji: "🍴", + aliases: ["fork_and_knife"], + tags: ["cutlery"], + category: "Food & Drink", + description: "fork and knife", + unicode_version: "6.0", + }, + { + emoji: "🥄", + aliases: ["spoon"], + tags: [], + category: "Food & Drink", + description: "spoon", + unicode_version: "9.0", + }, + { + emoji: "🔪", + aliases: ["hocho", "knife"], + tags: ["cut", "chop"], + category: "Food & Drink", + description: "kitchen knife", + unicode_version: "6.0", + }, + { + emoji: "🏺", + aliases: ["amphora"], + tags: [], + category: "Food & Drink", + description: "amphora", + unicode_version: "8.0", + }, + { + emoji: "🌍", + aliases: ["earth_africa"], + tags: ["globe", "world", "international"], + category: "Travel & Places", + description: "globe showing Europe-Africa", + unicode_version: "6.0", + }, + { + emoji: "🌎", + aliases: ["earth_americas"], + tags: ["globe", "world", "international"], + category: "Travel & Places", + description: "globe showing Americas", + unicode_version: "6.0", + }, + { + emoji: "🌏", + aliases: ["earth_asia"], + tags: ["globe", "world", "international"], + category: "Travel & Places", + description: "globe showing Asia-Australia", + unicode_version: "6.0", + }, + { + emoji: "🌐", + aliases: ["globe_with_meridians"], + tags: ["world", "global", "international"], + category: "Travel & Places", + description: "globe with meridians", + unicode_version: "6.0", + }, + { + emoji: "🗺️", + aliases: ["world_map"], + tags: ["travel"], + category: "Travel & Places", + description: "world map", + unicode_version: "7.0", + }, + { + emoji: "🗾", + aliases: ["japan"], + tags: [], + category: "Travel & Places", + description: "map of Japan", + unicode_version: "6.0", + }, + { + emoji: "🧭", + aliases: ["compass"], + tags: [], + category: "Travel & Places", + description: "compass", + unicode_version: "11.0", + }, + { + emoji: "🏔️", + aliases: ["mountain_snow"], + tags: [], + category: "Travel & Places", + description: "snow-capped mountain", + unicode_version: "7.0", + }, + { + emoji: "⛰️", + aliases: ["mountain"], + tags: [], + category: "Travel & Places", + description: "mountain", + unicode_version: "5.2", + }, + { + emoji: "🌋", + aliases: ["volcano"], + tags: [], + category: "Travel & Places", + description: "volcano", + unicode_version: "6.0", + }, + { + emoji: "🗻", + aliases: ["mount_fuji"], + tags: [], + category: "Travel & Places", + description: "mount fuji", + unicode_version: "6.0", + }, + { + emoji: "🏕️", + aliases: ["camping"], + tags: [], + category: "Travel & Places", + description: "camping", + unicode_version: "7.0", + }, + { + emoji: "🏖️", + aliases: ["beach_umbrella"], + tags: [], + category: "Travel & Places", + description: "beach with umbrella", + unicode_version: "7.0", + }, + { + emoji: "🏜️", + aliases: ["desert"], + tags: [], + category: "Travel & Places", + description: "desert", + unicode_version: "7.0", + }, + { + emoji: "🏝️", + aliases: ["desert_island"], + tags: [], + category: "Travel & Places", + description: "desert island", + unicode_version: "7.0", + }, + { + emoji: "🏞️", + aliases: ["national_park"], + tags: [], + category: "Travel & Places", + description: "national park", + unicode_version: "7.0", + }, + { + emoji: "🏟️", + aliases: ["stadium"], + tags: [], + category: "Travel & Places", + description: "stadium", + unicode_version: "7.0", + }, + { + emoji: "🏛️", + aliases: ["classical_building"], + tags: [], + category: "Travel & Places", + description: "classical building", + unicode_version: "7.0", + }, + { + emoji: "🏗️", + aliases: ["building_construction"], + tags: [], + category: "Travel & Places", + description: "building construction", + unicode_version: "7.0", + }, + { + emoji: "🧱", + aliases: ["bricks"], + tags: [], + category: "Travel & Places", + description: "brick", + unicode_version: "11.0", + }, + { + emoji: "🪨", + aliases: ["rock"], + tags: [], + category: "Travel & Places", + description: "rock", + unicode_version: "13.0", + }, + { + emoji: "🪵", + aliases: ["wood"], + tags: [], + category: "Travel & Places", + description: "wood", + unicode_version: "13.0", + }, + { + emoji: "🛖", + aliases: ["hut"], + tags: [], + category: "Travel & Places", + description: "hut", + unicode_version: "13.0", + }, + { + emoji: "🏘️", + aliases: ["houses"], + tags: [], + category: "Travel & Places", + description: "houses", + unicode_version: "7.0", + }, + { + emoji: "🏚️", + aliases: ["derelict_house"], + tags: [], + category: "Travel & Places", + description: "derelict house", + unicode_version: "7.0", + }, + { + emoji: "🏠", + aliases: ["house"], + tags: [], + category: "Travel & Places", + description: "house", + unicode_version: "6.0", + }, + { + emoji: "🏡", + aliases: ["house_with_garden"], + tags: [], + category: "Travel & Places", + description: "house with garden", + unicode_version: "6.0", + }, + { + emoji: "🏢", + aliases: ["office"], + tags: [], + category: "Travel & Places", + description: "office building", + unicode_version: "6.0", + }, + { + emoji: "🏣", + aliases: ["post_office"], + tags: [], + category: "Travel & Places", + description: "Japanese post office", + unicode_version: "6.0", + }, + { + emoji: "🏤", + aliases: ["european_post_office"], + tags: [], + category: "Travel & Places", + description: "post office", + unicode_version: "6.0", + }, + { + emoji: "🏥", + aliases: ["hospital"], + tags: [], + category: "Travel & Places", + description: "hospital", + unicode_version: "6.0", + }, + { + emoji: "🏦", + aliases: ["bank"], + tags: [], + category: "Travel & Places", + description: "bank", + unicode_version: "6.0", + }, + { + emoji: "🏨", + aliases: ["hotel"], + tags: [], + category: "Travel & Places", + description: "hotel", + unicode_version: "6.0", + }, + { + emoji: "🏩", + aliases: ["love_hotel"], + tags: [], + category: "Travel & Places", + description: "love hotel", + unicode_version: "6.0", + }, + { + emoji: "🏪", + aliases: ["convenience_store"], + tags: [], + category: "Travel & Places", + description: "convenience store", + unicode_version: "6.0", + }, + { + emoji: "🏫", + aliases: ["school"], + tags: [], + category: "Travel & Places", + description: "school", + unicode_version: "6.0", + }, + { + emoji: "🏬", + aliases: ["department_store"], + tags: [], + category: "Travel & Places", + description: "department store", + unicode_version: "6.0", + }, + { + emoji: "🏭", + aliases: ["factory"], + tags: [], + category: "Travel & Places", + description: "factory", + unicode_version: "6.0", + }, + { + emoji: "🏯", + aliases: ["japanese_castle"], + tags: [], + category: "Travel & Places", + description: "Japanese castle", + unicode_version: "6.0", + }, + { + emoji: "🏰", + aliases: ["european_castle"], + tags: [], + category: "Travel & Places", + description: "castle", + unicode_version: "6.0", + }, + { + emoji: "💒", + aliases: ["wedding"], + tags: ["marriage"], + category: "Travel & Places", + description: "wedding", + unicode_version: "6.0", + }, + { + emoji: "🗼", + aliases: ["tokyo_tower"], + tags: [], + category: "Travel & Places", + description: "Tokyo tower", + unicode_version: "6.0", + }, + { + emoji: "🗽", + aliases: ["statue_of_liberty"], + tags: [], + category: "Travel & Places", + description: "Statue of Liberty", + unicode_version: "6.0", + }, + { + emoji: "⛪", + aliases: ["church"], + tags: [], + category: "Travel & Places", + description: "church", + unicode_version: "5.2", + }, + { + emoji: "🕌", + aliases: ["mosque"], + tags: [], + category: "Travel & Places", + description: "mosque", + unicode_version: "8.0", + }, + { + emoji: "🛕", + aliases: ["hindu_temple"], + tags: [], + category: "Travel & Places", + description: "hindu temple", + unicode_version: "12.0", + }, + { + emoji: "🕍", + aliases: ["synagogue"], + tags: [], + category: "Travel & Places", + description: "synagogue", + unicode_version: "8.0", + }, + { + emoji: "⛩️", + aliases: ["shinto_shrine"], + tags: [], + category: "Travel & Places", + description: "shinto shrine", + unicode_version: "5.2", + }, + { + emoji: "🕋", + aliases: ["kaaba"], + tags: [], + category: "Travel & Places", + description: "kaaba", + unicode_version: "8.0", + }, + { + emoji: "⛲", + aliases: ["fountain"], + tags: [], + category: "Travel & Places", + description: "fountain", + unicode_version: "5.2", + }, + { + emoji: "⛺", + aliases: ["tent"], + tags: ["camping"], + category: "Travel & Places", + description: "tent", + unicode_version: "5.2", + }, + { + emoji: "🌁", + aliases: ["foggy"], + tags: ["karl"], + category: "Travel & Places", + description: "foggy", + unicode_version: "6.0", + }, + { + emoji: "🌃", + aliases: ["night_with_stars"], + tags: [], + category: "Travel & Places", + description: "night with stars", + unicode_version: "6.0", + }, + { + emoji: "🏙️", + aliases: ["cityscape"], + tags: ["skyline"], + category: "Travel & Places", + description: "cityscape", + unicode_version: "7.0", + }, + { + emoji: "🌄", + aliases: ["sunrise_over_mountains"], + tags: [], + category: "Travel & Places", + description: "sunrise over mountains", + unicode_version: "6.0", + }, + { + emoji: "🌅", + aliases: ["sunrise"], + tags: [], + category: "Travel & Places", + description: "sunrise", + unicode_version: "6.0", + }, + { + emoji: "🌆", + aliases: ["city_sunset"], + tags: [], + category: "Travel & Places", + description: "cityscape at dusk", + unicode_version: "6.0", + }, + { + emoji: "🌇", + aliases: ["city_sunrise"], + tags: [], + category: "Travel & Places", + description: "sunset", + unicode_version: "6.0", + }, + { + emoji: "🌉", + aliases: ["bridge_at_night"], + tags: [], + category: "Travel & Places", + description: "bridge at night", + unicode_version: "6.0", + }, + { + emoji: "♨️", + aliases: ["hotsprings"], + tags: [], + category: "Travel & Places", + description: "hot springs", + unicode_version: "", + }, + { + emoji: "🎠", + aliases: ["carousel_horse"], + tags: [], + category: "Travel & Places", + description: "carousel horse", + unicode_version: "6.0", + }, + { + emoji: "🎡", + aliases: ["ferris_wheel"], + tags: [], + category: "Travel & Places", + description: "ferris wheel", + unicode_version: "6.0", + }, + { + emoji: "🎢", + aliases: ["roller_coaster"], + tags: [], + category: "Travel & Places", + description: "roller coaster", + unicode_version: "6.0", + }, + { + emoji: "💈", + aliases: ["barber"], + tags: [], + category: "Travel & Places", + description: "barber pole", + unicode_version: "6.0", + }, + { + emoji: "🎪", + aliases: ["circus_tent"], + tags: [], + category: "Travel & Places", + description: "circus tent", + unicode_version: "6.0", + }, + { + emoji: "🚂", + aliases: ["steam_locomotive"], + tags: ["train"], + category: "Travel & Places", + description: "locomotive", + unicode_version: "6.0", + }, + { + emoji: "🚃", + aliases: ["railway_car"], + tags: [], + category: "Travel & Places", + description: "railway car", + unicode_version: "6.0", + }, + { + emoji: "🚄", + aliases: ["bullettrain_side"], + tags: ["train"], + category: "Travel & Places", + description: "high-speed train", + unicode_version: "6.0", + }, + { + emoji: "🚅", + aliases: ["bullettrain_front"], + tags: ["train"], + category: "Travel & Places", + description: "bullet train", + unicode_version: "6.0", + }, + { + emoji: "🚆", + aliases: ["train2"], + tags: [], + category: "Travel & Places", + description: "train", + unicode_version: "6.0", + }, + { + emoji: "🚇", + aliases: ["metro"], + tags: [], + category: "Travel & Places", + description: "metro", + unicode_version: "6.0", + }, + { + emoji: "🚈", + aliases: ["light_rail"], + tags: [], + category: "Travel & Places", + description: "light rail", + unicode_version: "6.0", + }, + { + emoji: "🚉", + aliases: ["station"], + tags: [], + category: "Travel & Places", + description: "station", + unicode_version: "6.0", + }, + { + emoji: "🚊", + aliases: ["tram"], + tags: [], + category: "Travel & Places", + description: "tram", + unicode_version: "6.0", + }, + { + emoji: "🚝", + aliases: ["monorail"], + tags: [], + category: "Travel & Places", + description: "monorail", + unicode_version: "6.0", + }, + { + emoji: "🚞", + aliases: ["mountain_railway"], + tags: [], + category: "Travel & Places", + description: "mountain railway", + unicode_version: "6.0", + }, + { + emoji: "🚋", + aliases: ["train"], + tags: [], + category: "Travel & Places", + description: "tram car", + unicode_version: "6.0", + }, + { + emoji: "🚌", + aliases: ["bus"], + tags: [], + category: "Travel & Places", + description: "bus", + unicode_version: "6.0", + }, + { + emoji: "🚍", + aliases: ["oncoming_bus"], + tags: [], + category: "Travel & Places", + description: "oncoming bus", + unicode_version: "6.0", + }, + { + emoji: "🚎", + aliases: ["trolleybus"], + tags: [], + category: "Travel & Places", + description: "trolleybus", + unicode_version: "6.0", + }, + { + emoji: "🚐", + aliases: ["minibus"], + tags: [], + category: "Travel & Places", + description: "minibus", + unicode_version: "6.0", + }, + { + emoji: "🚑", + aliases: ["ambulance"], + tags: [], + category: "Travel & Places", + description: "ambulance", + unicode_version: "6.0", + }, + { + emoji: "🚒", + aliases: ["fire_engine"], + tags: [], + category: "Travel & Places", + description: "fire engine", + unicode_version: "6.0", + }, + { + emoji: "🚓", + aliases: ["police_car"], + tags: [], + category: "Travel & Places", + description: "police car", + unicode_version: "6.0", + }, + { + emoji: "🚔", + aliases: ["oncoming_police_car"], + tags: [], + category: "Travel & Places", + description: "oncoming police car", + unicode_version: "6.0", + }, + { + emoji: "🚕", + aliases: ["taxi"], + tags: [], + category: "Travel & Places", + description: "taxi", + unicode_version: "6.0", + }, + { + emoji: "🚖", + aliases: ["oncoming_taxi"], + tags: [], + category: "Travel & Places", + description: "oncoming taxi", + unicode_version: "6.0", + }, + { + emoji: "🚗", + aliases: ["car", "red_car"], + tags: [], + category: "Travel & Places", + description: "automobile", + unicode_version: "6.0", + }, + { + emoji: "🚘", + aliases: ["oncoming_automobile"], + tags: [], + category: "Travel & Places", + description: "oncoming automobile", + unicode_version: "6.0", + }, + { + emoji: "🚙", + aliases: ["blue_car"], + tags: [], + category: "Travel & Places", + description: "sport utility vehicle", + unicode_version: "6.0", + }, + { + emoji: "🛻", + aliases: ["pickup_truck"], + tags: [], + category: "Travel & Places", + description: "pickup truck", + unicode_version: "13.0", + }, + { + emoji: "🚚", + aliases: ["truck"], + tags: [], + category: "Travel & Places", + description: "delivery truck", + unicode_version: "6.0", + }, + { + emoji: "🚛", + aliases: ["articulated_lorry"], + tags: [], + category: "Travel & Places", + description: "articulated lorry", + unicode_version: "6.0", + }, + { + emoji: "🚜", + aliases: ["tractor"], + tags: [], + category: "Travel & Places", + description: "tractor", + unicode_version: "6.0", + }, + { + emoji: "🏎️", + aliases: ["racing_car"], + tags: [], + category: "Travel & Places", + description: "racing car", + unicode_version: "7.0", + }, + { + emoji: "🏍️", + aliases: ["motorcycle"], + tags: [], + category: "Travel & Places", + description: "motorcycle", + unicode_version: "7.0", + }, + { + emoji: "🛵", + aliases: ["motor_scooter"], + tags: [], + category: "Travel & Places", + description: "motor scooter", + unicode_version: "9.0", + }, + { + emoji: "🦽", + aliases: ["manual_wheelchair"], + tags: [], + category: "Travel & Places", + description: "manual wheelchair", + unicode_version: "12.0", + }, + { + emoji: "🦼", + aliases: ["motorized_wheelchair"], + tags: [], + category: "Travel & Places", + description: "motorized wheelchair", + unicode_version: "12.0", + }, + { + emoji: "🛺", + aliases: ["auto_rickshaw"], + tags: [], + category: "Travel & Places", + description: "auto rickshaw", + unicode_version: "12.0", + }, + { + emoji: "🚲", + aliases: ["bike"], + tags: ["bicycle"], + category: "Travel & Places", + description: "bicycle", + unicode_version: "6.0", + }, + { + emoji: "🛴", + aliases: ["kick_scooter"], + tags: [], + category: "Travel & Places", + description: "kick scooter", + unicode_version: "9.0", + }, + { + emoji: "🛹", + aliases: ["skateboard"], + tags: [], + category: "Travel & Places", + description: "skateboard", + unicode_version: "11.0", + }, + { + emoji: "🛼", + aliases: ["roller_skate"], + tags: [], + category: "Travel & Places", + description: "roller skate", + unicode_version: "13.0", + }, + { + emoji: "🚏", + aliases: ["busstop"], + tags: [], + category: "Travel & Places", + description: "bus stop", + unicode_version: "6.0", + }, + { + emoji: "🛣️", + aliases: ["motorway"], + tags: [], + category: "Travel & Places", + description: "motorway", + unicode_version: "7.0", + }, + { + emoji: "🛤️", + aliases: ["railway_track"], + tags: [], + category: "Travel & Places", + description: "railway track", + unicode_version: "7.0", + }, + { + emoji: "🛢️", + aliases: ["oil_drum"], + tags: [], + category: "Travel & Places", + description: "oil drum", + unicode_version: "7.0", + }, + { + emoji: "⛽", + aliases: ["fuelpump"], + tags: [], + category: "Travel & Places", + description: "fuel pump", + unicode_version: "5.2", + }, + { + emoji: "🚨", + aliases: ["rotating_light"], + tags: ["911", "emergency"], + category: "Travel & Places", + description: "police car light", + unicode_version: "6.0", + }, + { + emoji: "🚥", + aliases: ["traffic_light"], + tags: [], + category: "Travel & Places", + description: "horizontal traffic light", + unicode_version: "6.0", + }, + { + emoji: "🚦", + aliases: ["vertical_traffic_light"], + tags: ["semaphore"], + category: "Travel & Places", + description: "vertical traffic light", + unicode_version: "6.0", + }, + { + emoji: "🛑", + aliases: ["stop_sign"], + tags: [], + category: "Travel & Places", + description: "stop sign", + unicode_version: "9.0", + }, + { + emoji: "🚧", + aliases: ["construction"], + tags: ["wip"], + category: "Travel & Places", + description: "construction", + unicode_version: "6.0", + }, + { + emoji: "⚓", + aliases: ["anchor"], + tags: ["ship"], + category: "Travel & Places", + description: "anchor", + unicode_version: "4.1", + }, + { + emoji: "⛵", + aliases: ["boat", "sailboat"], + tags: [], + category: "Travel & Places", + description: "sailboat", + unicode_version: "5.2", + }, + { + emoji: "🛶", + aliases: ["canoe"], + tags: [], + category: "Travel & Places", + description: "canoe", + unicode_version: "9.0", + }, + { + emoji: "🚤", + aliases: ["speedboat"], + tags: ["ship"], + category: "Travel & Places", + description: "speedboat", + unicode_version: "6.0", + }, + { + emoji: "🛳️", + aliases: ["passenger_ship"], + tags: ["cruise"], + category: "Travel & Places", + description: "passenger ship", + unicode_version: "7.0", + }, + { + emoji: "⛴️", + aliases: ["ferry"], + tags: [], + category: "Travel & Places", + description: "ferry", + unicode_version: "5.2", + }, + { + emoji: "🛥️", + aliases: ["motor_boat"], + tags: [], + category: "Travel & Places", + description: "motor boat", + unicode_version: "7.0", + }, + { + emoji: "🚢", + aliases: ["ship"], + tags: [], + category: "Travel & Places", + description: "ship", + unicode_version: "6.0", + }, + { + emoji: "✈️", + aliases: ["airplane"], + tags: ["flight"], + category: "Travel & Places", + description: "airplane", + unicode_version: "", + }, + { + emoji: "🛩️", + aliases: ["small_airplane"], + tags: ["flight"], + category: "Travel & Places", + description: "small airplane", + unicode_version: "7.0", + }, + { + emoji: "🛫", + aliases: ["flight_departure"], + tags: [], + category: "Travel & Places", + description: "airplane departure", + unicode_version: "7.0", + }, + { + emoji: "🛬", + aliases: ["flight_arrival"], + tags: [], + category: "Travel & Places", + description: "airplane arrival", + unicode_version: "7.0", + }, + { + emoji: "🪂", + aliases: ["parachute"], + tags: [], + category: "Travel & Places", + description: "parachute", + unicode_version: "12.0", + }, + { + emoji: "💺", + aliases: ["seat"], + tags: [], + category: "Travel & Places", + description: "seat", + unicode_version: "6.0", + }, + { + emoji: "🚁", + aliases: ["helicopter"], + tags: [], + category: "Travel & Places", + description: "helicopter", + unicode_version: "6.0", + }, + { + emoji: "🚟", + aliases: ["suspension_railway"], + tags: [], + category: "Travel & Places", + description: "suspension railway", + unicode_version: "6.0", + }, + { + emoji: "🚠", + aliases: ["mountain_cableway"], + tags: [], + category: "Travel & Places", + description: "mountain cableway", + unicode_version: "6.0", + }, + { + emoji: "🚡", + aliases: ["aerial_tramway"], + tags: [], + category: "Travel & Places", + description: "aerial tramway", + unicode_version: "6.0", + }, + { + emoji: "🛰️", + aliases: ["artificial_satellite"], + tags: ["orbit", "space"], + category: "Travel & Places", + description: "satellite", + unicode_version: "7.0", + }, + { + emoji: "🚀", + aliases: ["rocket"], + tags: ["ship", "launch"], + category: "Travel & Places", + description: "rocket", + unicode_version: "6.0", + }, + { + emoji: "🛸", + aliases: ["flying_saucer"], + tags: ["ufo"], + category: "Travel & Places", + description: "flying saucer", + unicode_version: "11.0", + }, + { + emoji: "🛎️", + aliases: ["bellhop_bell"], + tags: [], + category: "Travel & Places", + description: "bellhop bell", + unicode_version: "7.0", + }, + { + emoji: "🧳", + aliases: ["luggage"], + tags: [], + category: "Travel & Places", + description: "luggage", + unicode_version: "11.0", + }, + { + emoji: "⌛", + aliases: ["hourglass"], + tags: ["time"], + category: "Travel & Places", + description: "hourglass done", + unicode_version: "", + }, + { + emoji: "⏳", + aliases: ["hourglass_flowing_sand"], + tags: ["time"], + category: "Travel & Places", + description: "hourglass not done", + unicode_version: "6.0", + }, + { + emoji: "⌚", + aliases: ["watch"], + tags: ["time"], + category: "Travel & Places", + description: "watch", + unicode_version: "", + }, + { + emoji: "⏰", + aliases: ["alarm_clock"], + tags: ["morning"], + category: "Travel & Places", + description: "alarm clock", + unicode_version: "6.0", + }, + { + emoji: "⏱️", + aliases: ["stopwatch"], + tags: [], + category: "Travel & Places", + description: "stopwatch", + unicode_version: "6.0", + }, + { + emoji: "⏲️", + aliases: ["timer_clock"], + tags: [], + category: "Travel & Places", + description: "timer clock", + unicode_version: "6.0", + }, + { + emoji: "🕰️", + aliases: ["mantelpiece_clock"], + tags: [], + category: "Travel & Places", + description: "mantelpiece clock", + unicode_version: "7.0", + }, + { + emoji: "🕛", + aliases: ["clock12"], + tags: [], + category: "Travel & Places", + description: "twelve o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕧", + aliases: ["clock1230"], + tags: [], + category: "Travel & Places", + description: "twelve-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕐", + aliases: ["clock1"], + tags: [], + category: "Travel & Places", + description: "one o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕜", + aliases: ["clock130"], + tags: [], + category: "Travel & Places", + description: "one-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕑", + aliases: ["clock2"], + tags: [], + category: "Travel & Places", + description: "two o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕝", + aliases: ["clock230"], + tags: [], + category: "Travel & Places", + description: "two-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕒", + aliases: ["clock3"], + tags: [], + category: "Travel & Places", + description: "three o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕞", + aliases: ["clock330"], + tags: [], + category: "Travel & Places", + description: "three-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕓", + aliases: ["clock4"], + tags: [], + category: "Travel & Places", + description: "four o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕟", + aliases: ["clock430"], + tags: [], + category: "Travel & Places", + description: "four-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕔", + aliases: ["clock5"], + tags: [], + category: "Travel & Places", + description: "five o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕠", + aliases: ["clock530"], + tags: [], + category: "Travel & Places", + description: "five-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕕", + aliases: ["clock6"], + tags: [], + category: "Travel & Places", + description: "six o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕡", + aliases: ["clock630"], + tags: [], + category: "Travel & Places", + description: "six-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕖", + aliases: ["clock7"], + tags: [], + category: "Travel & Places", + description: "seven o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕢", + aliases: ["clock730"], + tags: [], + category: "Travel & Places", + description: "seven-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕗", + aliases: ["clock8"], + tags: [], + category: "Travel & Places", + description: "eight o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕣", + aliases: ["clock830"], + tags: [], + category: "Travel & Places", + description: "eight-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕘", + aliases: ["clock9"], + tags: [], + category: "Travel & Places", + description: "nine o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕤", + aliases: ["clock930"], + tags: [], + category: "Travel & Places", + description: "nine-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕙", + aliases: ["clock10"], + tags: [], + category: "Travel & Places", + description: "ten o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕥", + aliases: ["clock1030"], + tags: [], + category: "Travel & Places", + description: "ten-thirty", + unicode_version: "6.0", + }, + { + emoji: "🕚", + aliases: ["clock11"], + tags: [], + category: "Travel & Places", + description: "eleven o’clock", + unicode_version: "6.0", + }, + { + emoji: "🕦", + aliases: ["clock1130"], + tags: [], + category: "Travel & Places", + description: "eleven-thirty", + unicode_version: "6.0", + }, + { + emoji: "🌑", + aliases: ["new_moon"], + tags: [], + category: "Travel & Places", + description: "new moon", + unicode_version: "6.0", + }, + { + emoji: "🌒", + aliases: ["waxing_crescent_moon"], + tags: [], + category: "Travel & Places", + description: "waxing crescent moon", + unicode_version: "6.0", + }, + { + emoji: "🌓", + aliases: ["first_quarter_moon"], + tags: [], + category: "Travel & Places", + description: "first quarter moon", + unicode_version: "6.0", + }, + { + emoji: "🌔", + aliases: ["moon", "waxing_gibbous_moon"], + tags: [], + category: "Travel & Places", + description: "waxing gibbous moon", + unicode_version: "6.0", + }, + { + emoji: "🌕", + aliases: ["full_moon"], + tags: [], + category: "Travel & Places", + description: "full moon", + unicode_version: "6.0", + }, + { + emoji: "🌖", + aliases: ["waning_gibbous_moon"], + tags: [], + category: "Travel & Places", + description: "waning gibbous moon", + unicode_version: "6.0", + }, + { + emoji: "🌗", + aliases: ["last_quarter_moon"], + tags: [], + category: "Travel & Places", + description: "last quarter moon", + unicode_version: "6.0", + }, + { + emoji: "🌘", + aliases: ["waning_crescent_moon"], + tags: [], + category: "Travel & Places", + description: "waning crescent moon", + unicode_version: "6.0", + }, + { + emoji: "🌙", + aliases: ["crescent_moon"], + tags: ["night"], + category: "Travel & Places", + description: "crescent moon", + unicode_version: "6.0", + }, + { + emoji: "🌚", + aliases: ["new_moon_with_face"], + tags: [], + category: "Travel & Places", + description: "new moon face", + unicode_version: "6.0", + }, + { + emoji: "🌛", + aliases: ["first_quarter_moon_with_face"], + tags: [], + category: "Travel & Places", + description: "first quarter moon face", + unicode_version: "6.0", + }, + { + emoji: "🌜", + aliases: ["last_quarter_moon_with_face"], + tags: [], + category: "Travel & Places", + description: "last quarter moon face", + unicode_version: "6.0", + }, + { + emoji: "🌡️", + aliases: ["thermometer"], + tags: [], + category: "Travel & Places", + description: "thermometer", + unicode_version: "7.0", + }, + { + emoji: "☀️", + aliases: ["sunny"], + tags: ["weather"], + category: "Travel & Places", + description: "sun", + unicode_version: "", + }, + { + emoji: "🌝", + aliases: ["full_moon_with_face"], + tags: [], + category: "Travel & Places", + description: "full moon face", + unicode_version: "6.0", + }, + { + emoji: "🌞", + aliases: ["sun_with_face"], + tags: ["summer"], + category: "Travel & Places", + description: "sun with face", + unicode_version: "6.0", + }, + { + emoji: "🪐", + aliases: ["ringed_planet"], + tags: [], + category: "Travel & Places", + description: "ringed planet", + unicode_version: "12.0", + }, + { + emoji: "⭐", + aliases: ["star"], + tags: [], + category: "Travel & Places", + description: "star", + unicode_version: "5.1", + }, + { + emoji: "🌟", + aliases: ["star2"], + tags: [], + category: "Travel & Places", + description: "glowing star", + unicode_version: "6.0", + }, + { + emoji: "🌠", + aliases: ["stars"], + tags: [], + category: "Travel & Places", + description: "shooting star", + unicode_version: "6.0", + }, + { + emoji: "🌌", + aliases: ["milky_way"], + tags: [], + category: "Travel & Places", + description: "milky way", + unicode_version: "6.0", + }, + { + emoji: "☁️", + aliases: ["cloud"], + tags: [], + category: "Travel & Places", + description: "cloud", + unicode_version: "", + }, + { + emoji: "⛅", + aliases: ["partly_sunny"], + tags: ["weather", "cloud"], + category: "Travel & Places", + description: "sun behind cloud", + unicode_version: "5.2", + }, + { + emoji: "⛈️", + aliases: ["cloud_with_lightning_and_rain"], + tags: [], + category: "Travel & Places", + description: "cloud with lightning and rain", + unicode_version: "5.2", + }, + { + emoji: "🌤️", + aliases: ["sun_behind_small_cloud"], + tags: [], + category: "Travel & Places", + description: "sun behind small cloud", + unicode_version: "7.0", + }, + { + emoji: "🌥️", + aliases: ["sun_behind_large_cloud"], + tags: [], + category: "Travel & Places", + description: "sun behind large cloud", + unicode_version: "7.0", + }, + { + emoji: "🌦️", + aliases: ["sun_behind_rain_cloud"], + tags: [], + category: "Travel & Places", + description: "sun behind rain cloud", + unicode_version: "7.0", + }, + { + emoji: "🌧️", + aliases: ["cloud_with_rain"], + tags: [], + category: "Travel & Places", + description: "cloud with rain", + unicode_version: "7.0", + }, + { + emoji: "🌨️", + aliases: ["cloud_with_snow"], + tags: [], + category: "Travel & Places", + description: "cloud with snow", + unicode_version: "7.0", + }, + { + emoji: "🌩️", + aliases: ["cloud_with_lightning"], + tags: [], + category: "Travel & Places", + description: "cloud with lightning", + unicode_version: "7.0", + }, + { + emoji: "🌪️", + aliases: ["tornado"], + tags: [], + category: "Travel & Places", + description: "tornado", + unicode_version: "7.0", + }, + { + emoji: "🌫️", + aliases: ["fog"], + tags: [], + category: "Travel & Places", + description: "fog", + unicode_version: "7.0", + }, + { + emoji: "🌬️", + aliases: ["wind_face"], + tags: [], + category: "Travel & Places", + description: "wind face", + unicode_version: "7.0", + }, + { + emoji: "🌀", + aliases: ["cyclone"], + tags: ["swirl"], + category: "Travel & Places", + description: "cyclone", + unicode_version: "6.0", + }, + { + emoji: "🌈", + aliases: ["rainbow"], + tags: [], + category: "Travel & Places", + description: "rainbow", + unicode_version: "6.0", + }, + { + emoji: "🌂", + aliases: ["closed_umbrella"], + tags: ["weather", "rain"], + category: "Travel & Places", + description: "closed umbrella", + unicode_version: "6.0", + }, + { + emoji: "☂️", + aliases: ["open_umbrella"], + tags: [], + category: "Travel & Places", + description: "umbrella", + unicode_version: "", + }, + { + emoji: "☔", + aliases: ["umbrella"], + tags: ["rain", "weather"], + category: "Travel & Places", + description: "umbrella with rain drops", + unicode_version: "4.0", + }, + { + emoji: "⛱️", + aliases: ["parasol_on_ground"], + tags: ["beach_umbrella"], + category: "Travel & Places", + description: "umbrella on ground", + unicode_version: "5.2", + }, + { + emoji: "⚡", + aliases: ["zap"], + tags: ["lightning", "thunder"], + category: "Travel & Places", + description: "high voltage", + unicode_version: "4.0", + }, + { + emoji: "❄️", + aliases: ["snowflake"], + tags: ["winter", "cold", "weather"], + category: "Travel & Places", + description: "snowflake", + unicode_version: "", + }, + { + emoji: "☃️", + aliases: ["snowman_with_snow"], + tags: ["winter", "christmas"], + category: "Travel & Places", + description: "snowman", + unicode_version: "", + }, + { + emoji: "⛄", + aliases: ["snowman"], + tags: ["winter"], + category: "Travel & Places", + description: "snowman without snow", + unicode_version: "5.2", + }, + { + emoji: "☄️", + aliases: ["comet"], + tags: [], + category: "Travel & Places", + description: "comet", + unicode_version: "", + }, + { + emoji: "🔥", + aliases: ["fire"], + tags: ["burn"], + category: "Travel & Places", + description: "fire", + unicode_version: "6.0", + }, + { + emoji: "💧", + aliases: ["droplet"], + tags: ["water"], + category: "Travel & Places", + description: "droplet", + unicode_version: "6.0", + }, + { + emoji: "🌊", + aliases: ["ocean"], + tags: ["sea"], + category: "Travel & Places", + description: "water wave", + unicode_version: "6.0", + }, + { + emoji: "🎃", + aliases: ["jack_o_lantern"], + tags: ["halloween"], + category: "Activities", + description: "jack-o-lantern", + unicode_version: "6.0", + }, + { + emoji: "🎄", + aliases: ["christmas_tree"], + tags: [], + category: "Activities", + description: "Christmas tree", + unicode_version: "6.0", + }, + { + emoji: "🎆", + aliases: ["fireworks"], + tags: ["festival", "celebration"], + category: "Activities", + description: "fireworks", + unicode_version: "6.0", + }, + { + emoji: "🎇", + aliases: ["sparkler"], + tags: [], + category: "Activities", + description: "sparkler", + unicode_version: "6.0", + }, + { + emoji: "🧨", + aliases: ["firecracker"], + tags: [], + category: "Activities", + description: "firecracker", + unicode_version: "11.0", + }, + { + emoji: "✨", + aliases: ["sparkles"], + tags: ["shiny"], + category: "Activities", + description: "sparkles", + unicode_version: "6.0", + }, + { + emoji: "🎈", + aliases: ["balloon"], + tags: ["party", "birthday"], + category: "Activities", + description: "balloon", + unicode_version: "6.0", + }, + { + emoji: "🎉", + aliases: ["tada"], + tags: ["hooray", "party"], + category: "Activities", + description: "party popper", + unicode_version: "6.0", + }, + { + emoji: "🎊", + aliases: ["confetti_ball"], + tags: [], + category: "Activities", + description: "confetti ball", + unicode_version: "6.0", + }, + { + emoji: "🎋", + aliases: ["tanabata_tree"], + tags: [], + category: "Activities", + description: "tanabata tree", + unicode_version: "6.0", + }, + { + emoji: "🎍", + aliases: ["bamboo"], + tags: [], + category: "Activities", + description: "pine decoration", + unicode_version: "6.0", + }, + { + emoji: "🎎", + aliases: ["dolls"], + tags: [], + category: "Activities", + description: "Japanese dolls", + unicode_version: "6.0", + }, + { + emoji: "🎏", + aliases: ["flags"], + tags: [], + category: "Activities", + description: "carp streamer", + unicode_version: "6.0", + }, + { + emoji: "🎐", + aliases: ["wind_chime"], + tags: [], + category: "Activities", + description: "wind chime", + unicode_version: "6.0", + }, + { + emoji: "🎑", + aliases: ["rice_scene"], + tags: [], + category: "Activities", + description: "moon viewing ceremony", + unicode_version: "6.0", + }, + { + emoji: "🧧", + aliases: ["red_envelope"], + tags: [], + category: "Activities", + description: "red envelope", + unicode_version: "11.0", + }, + { + emoji: "🎀", + aliases: ["ribbon"], + tags: [], + category: "Activities", + description: "ribbon", + unicode_version: "6.0", + }, + { + emoji: "🎁", + aliases: ["gift"], + tags: ["present", "birthday", "christmas"], + category: "Activities", + description: "wrapped gift", + unicode_version: "6.0", + }, + { + emoji: "🎗️", + aliases: ["reminder_ribbon"], + tags: [], + category: "Activities", + description: "reminder ribbon", + unicode_version: "7.0", + }, + { + emoji: "🎟️", + aliases: ["tickets"], + tags: [], + category: "Activities", + description: "admission tickets", + unicode_version: "7.0", + }, + { + emoji: "🎫", + aliases: ["ticket"], + tags: [], + category: "Activities", + description: "ticket", + unicode_version: "6.0", + }, + { + emoji: "🎖️", + aliases: ["medal_military"], + tags: [], + category: "Activities", + description: "military medal", + unicode_version: "7.0", + }, + { + emoji: "🏆", + aliases: ["trophy"], + tags: ["award", "contest", "winner"], + category: "Activities", + description: "trophy", + unicode_version: "6.0", + }, + { + emoji: "🏅", + aliases: ["medal_sports"], + tags: ["gold", "winner"], + category: "Activities", + description: "sports medal", + unicode_version: "7.0", + }, + { + emoji: "🥇", + aliases: ["1st_place_medal"], + tags: ["gold"], + category: "Activities", + description: "1st place medal", + unicode_version: "9.0", + }, + { + emoji: "🥈", + aliases: ["2nd_place_medal"], + tags: ["silver"], + category: "Activities", + description: "2nd place medal", + unicode_version: "9.0", + }, + { + emoji: "🥉", + aliases: ["3rd_place_medal"], + tags: ["bronze"], + category: "Activities", + description: "3rd place medal", + unicode_version: "9.0", + }, + { + emoji: "⚽", + aliases: ["soccer"], + tags: ["sports"], + category: "Activities", + description: "soccer ball", + unicode_version: "5.2", + }, + { + emoji: "⚾", + aliases: ["baseball"], + tags: ["sports"], + category: "Activities", + description: "baseball", + unicode_version: "5.2", + }, + { + emoji: "🥎", + aliases: ["softball"], + tags: [], + category: "Activities", + description: "softball", + unicode_version: "11.0", + }, + { + emoji: "🏀", + aliases: ["basketball"], + tags: ["sports"], + category: "Activities", + description: "basketball", + unicode_version: "6.0", + }, + { + emoji: "🏐", + aliases: ["volleyball"], + tags: [], + category: "Activities", + description: "volleyball", + unicode_version: "8.0", + }, + { + emoji: "🏈", + aliases: ["football"], + tags: ["sports"], + category: "Activities", + description: "american football", + unicode_version: "6.0", + }, + { + emoji: "🏉", + aliases: ["rugby_football"], + tags: [], + category: "Activities", + description: "rugby football", + unicode_version: "6.0", + }, + { + emoji: "🎾", + aliases: ["tennis"], + tags: ["sports"], + category: "Activities", + description: "tennis", + unicode_version: "6.0", + }, + { + emoji: "🥏", + aliases: ["flying_disc"], + tags: [], + category: "Activities", + description: "flying disc", + unicode_version: "11.0", + }, + { + emoji: "🎳", + aliases: ["bowling"], + tags: [], + category: "Activities", + description: "bowling", + unicode_version: "6.0", + }, + { + emoji: "🏏", + aliases: ["cricket_game"], + tags: [], + category: "Activities", + description: "cricket game", + unicode_version: "8.0", + }, + { + emoji: "🏑", + aliases: ["field_hockey"], + tags: [], + category: "Activities", + description: "field hockey", + unicode_version: "8.0", + }, + { + emoji: "🏒", + aliases: ["ice_hockey"], + tags: [], + category: "Activities", + description: "ice hockey", + unicode_version: "8.0", + }, + { + emoji: "🥍", + aliases: ["lacrosse"], + tags: [], + category: "Activities", + description: "lacrosse", + unicode_version: "11.0", + }, + { + emoji: "🏓", + aliases: ["ping_pong"], + tags: [], + category: "Activities", + description: "ping pong", + unicode_version: "8.0", + }, + { + emoji: "🏸", + aliases: ["badminton"], + tags: [], + category: "Activities", + description: "badminton", + unicode_version: "8.0", + }, + { + emoji: "🥊", + aliases: ["boxing_glove"], + tags: [], + category: "Activities", + description: "boxing glove", + unicode_version: "9.0", + }, + { + emoji: "🥋", + aliases: ["martial_arts_uniform"], + tags: [], + category: "Activities", + description: "martial arts uniform", + unicode_version: "9.0", + }, + { + emoji: "🥅", + aliases: ["goal_net"], + tags: [], + category: "Activities", + description: "goal net", + unicode_version: "9.0", + }, + { + emoji: "⛳", + aliases: ["golf"], + tags: [], + category: "Activities", + description: "flag in hole", + unicode_version: "5.2", + }, + { + emoji: "⛸️", + aliases: ["ice_skate"], + tags: ["skating"], + category: "Activities", + description: "ice skate", + unicode_version: "5.2", + }, + { + emoji: "🎣", + aliases: ["fishing_pole_and_fish"], + tags: [], + category: "Activities", + description: "fishing pole", + unicode_version: "6.0", + }, + { + emoji: "🤿", + aliases: ["diving_mask"], + tags: [], + category: "Activities", + description: "diving mask", + unicode_version: "12.0", + }, + { + emoji: "🎽", + aliases: ["running_shirt_with_sash"], + tags: ["marathon"], + category: "Activities", + description: "running shirt", + unicode_version: "6.0", + }, + { + emoji: "🎿", + aliases: ["ski"], + tags: [], + category: "Activities", + description: "skis", + unicode_version: "6.0", + }, + { + emoji: "🛷", + aliases: ["sled"], + tags: [], + category: "Activities", + description: "sled", + unicode_version: "11.0", + }, + { + emoji: "🥌", + aliases: ["curling_stone"], + tags: [], + category: "Activities", + description: "curling stone", + unicode_version: "11.0", + }, + { + emoji: "🎯", + aliases: ["dart"], + tags: ["target"], + category: "Activities", + description: "bullseye", + unicode_version: "6.0", + }, + { + emoji: "🪀", + aliases: ["yo_yo"], + tags: [], + category: "Activities", + description: "yo-yo", + unicode_version: "12.0", + }, + { + emoji: "🪁", + aliases: ["kite"], + tags: [], + category: "Activities", + description: "kite", + unicode_version: "12.0", + }, + { + emoji: "🎱", + aliases: ["8ball"], + tags: ["pool", "billiards"], + category: "Activities", + description: "pool 8 ball", + unicode_version: "6.0", + }, + { + emoji: "🔮", + aliases: ["crystal_ball"], + tags: ["fortune"], + category: "Activities", + description: "crystal ball", + unicode_version: "6.0", + }, + { + emoji: "🪄", + aliases: ["magic_wand"], + tags: [], + category: "Activities", + description: "magic wand", + unicode_version: "13.0", + }, + { + emoji: "🧿", + aliases: ["nazar_amulet"], + tags: [], + category: "Activities", + description: "nazar amulet", + unicode_version: "11.0", + }, + { + emoji: "🎮", + aliases: ["video_game"], + tags: ["play", "controller", "console"], + category: "Activities", + description: "video game", + unicode_version: "6.0", + }, + { + emoji: "🕹️", + aliases: ["joystick"], + tags: [], + category: "Activities", + description: "joystick", + unicode_version: "7.0", + }, + { + emoji: "🎰", + aliases: ["slot_machine"], + tags: [], + category: "Activities", + description: "slot machine", + unicode_version: "6.0", + }, + { + emoji: "🎲", + aliases: ["game_die"], + tags: ["dice", "gambling"], + category: "Activities", + description: "game die", + unicode_version: "6.0", + }, + { + emoji: "🧩", + aliases: ["jigsaw"], + tags: [], + category: "Activities", + description: "puzzle piece", + unicode_version: "11.0", + }, + { + emoji: "🧸", + aliases: ["teddy_bear"], + tags: [], + category: "Activities", + description: "teddy bear", + unicode_version: "11.0", + }, + { + emoji: "🪅", + aliases: ["pinata"], + tags: [], + category: "Activities", + description: "piñata", + unicode_version: "13.0", + }, + { + emoji: "🪆", + aliases: ["nesting_dolls"], + tags: [], + category: "Activities", + description: "nesting dolls", + unicode_version: "13.0", + }, + { + emoji: "♠️", + aliases: ["spades"], + tags: [], + category: "Activities", + description: "spade suit", + unicode_version: "", + }, + { + emoji: "♥️", + aliases: ["hearts"], + tags: [], + category: "Activities", + description: "heart suit", + unicode_version: "", + }, + { + emoji: "♦️", + aliases: ["diamonds"], + tags: [], + category: "Activities", + description: "diamond suit", + unicode_version: "", + }, + { + emoji: "♣️", + aliases: ["clubs"], + tags: [], + category: "Activities", + description: "club suit", + unicode_version: "", + }, + { + emoji: "♟️", + aliases: ["chess_pawn"], + tags: [], + category: "Activities", + description: "chess pawn", + unicode_version: "11.0", + }, + { + emoji: "🃏", + aliases: ["black_joker"], + tags: [], + category: "Activities", + description: "joker", + unicode_version: "6.0", + }, + { + emoji: "🀄", + aliases: ["mahjong"], + tags: [], + category: "Activities", + description: "mahjong red dragon", + unicode_version: "", + }, + { + emoji: "🎴", + aliases: ["flower_playing_cards"], + tags: [], + category: "Activities", + description: "flower playing cards", + unicode_version: "6.0", + }, + { + emoji: "🎭", + aliases: ["performing_arts"], + tags: ["theater", "drama"], + category: "Activities", + description: "performing arts", + unicode_version: "6.0", + }, + { + emoji: "🖼️", + aliases: ["framed_picture"], + tags: [], + category: "Activities", + description: "framed picture", + unicode_version: "7.0", + }, + { + emoji: "🎨", + aliases: ["art"], + tags: ["design", "paint"], + category: "Activities", + description: "artist palette", + unicode_version: "6.0", + }, + { + emoji: "🧵", + aliases: ["thread"], + tags: [], + category: "Activities", + description: "thread", + unicode_version: "11.0", + }, + { + emoji: "🪡", + aliases: ["sewing_needle"], + tags: [], + category: "Activities", + description: "sewing needle", + unicode_version: "13.0", + }, + { + emoji: "🧶", + aliases: ["yarn"], + tags: [], + category: "Activities", + description: "yarn", + unicode_version: "11.0", + }, + { + emoji: "🪢", + aliases: ["knot"], + tags: [], + category: "Activities", + description: "knot", + unicode_version: "13.0", + }, + { + emoji: "👓", + aliases: ["eyeglasses"], + tags: ["glasses"], + category: "Objects", + description: "glasses", + unicode_version: "6.0", + }, + { + emoji: "🕶️", + aliases: ["dark_sunglasses"], + tags: [], + category: "Objects", + description: "sunglasses", + unicode_version: "7.0", + }, + { + emoji: "🥽", + aliases: ["goggles"], + tags: [], + category: "Objects", + description: "goggles", + unicode_version: "11.0", + }, + { + emoji: "🥼", + aliases: ["lab_coat"], + tags: [], + category: "Objects", + description: "lab coat", + unicode_version: "11.0", + }, + { + emoji: "🦺", + aliases: ["safety_vest"], + tags: [], + category: "Objects", + description: "safety vest", + unicode_version: "12.0", + }, + { + emoji: "👔", + aliases: ["necktie"], + tags: ["shirt", "formal"], + category: "Objects", + description: "necktie", + unicode_version: "6.0", + }, + { + emoji: "👕", + aliases: ["shirt", "tshirt"], + tags: [], + category: "Objects", + description: "t-shirt", + unicode_version: "6.0", + }, + { + emoji: "👖", + aliases: ["jeans"], + tags: ["pants"], + category: "Objects", + description: "jeans", + unicode_version: "6.0", + }, + { + emoji: "🧣", + aliases: ["scarf"], + tags: [], + category: "Objects", + description: "scarf", + unicode_version: "11.0", + }, + { + emoji: "🧤", + aliases: ["gloves"], + tags: [], + category: "Objects", + description: "gloves", + unicode_version: "11.0", + }, + { + emoji: "🧥", + aliases: ["coat"], + tags: [], + category: "Objects", + description: "coat", + unicode_version: "11.0", + }, + { + emoji: "🧦", + aliases: ["socks"], + tags: [], + category: "Objects", + description: "socks", + unicode_version: "11.0", + }, + { + emoji: "👗", + aliases: ["dress"], + tags: [], + category: "Objects", + description: "dress", + unicode_version: "6.0", + }, + { + emoji: "👘", + aliases: ["kimono"], + tags: [], + category: "Objects", + description: "kimono", + unicode_version: "6.0", + }, + { + emoji: "🥻", + aliases: ["sari"], + tags: [], + category: "Objects", + description: "sari", + unicode_version: "12.0", + }, + { + emoji: "🩱", + aliases: ["one_piece_swimsuit"], + tags: [], + category: "Objects", + description: "one-piece swimsuit", + unicode_version: "12.0", + }, + { + emoji: "🩲", + aliases: ["swim_brief"], + tags: [], + category: "Objects", + description: "briefs", + unicode_version: "12.0", + }, + { + emoji: "🩳", + aliases: ["shorts"], + tags: [], + category: "Objects", + description: "shorts", + unicode_version: "12.0", + }, + { + emoji: "👙", + aliases: ["bikini"], + tags: ["beach"], + category: "Objects", + description: "bikini", + unicode_version: "6.0", + }, + { + emoji: "👚", + aliases: ["womans_clothes"], + tags: [], + category: "Objects", + description: "woman’s clothes", + unicode_version: "6.0", + }, + { + emoji: "👛", + aliases: ["purse"], + tags: [], + category: "Objects", + description: "purse", + unicode_version: "6.0", + }, + { + emoji: "👜", + aliases: ["handbag"], + tags: ["bag"], + category: "Objects", + description: "handbag", + unicode_version: "6.0", + }, + { + emoji: "👝", + aliases: ["pouch"], + tags: ["bag"], + category: "Objects", + description: "clutch bag", + unicode_version: "6.0", + }, + { + emoji: "🛍️", + aliases: ["shopping"], + tags: ["bags"], + category: "Objects", + description: "shopping bags", + unicode_version: "7.0", + }, + { + emoji: "🎒", + aliases: ["school_satchel"], + tags: [], + category: "Objects", + description: "backpack", + unicode_version: "6.0", + }, + { + emoji: "🩴", + aliases: ["thong_sandal"], + tags: [], + category: "Objects", + description: "thong sandal", + unicode_version: "13.0", + }, + { + emoji: "👞", + aliases: ["mans_shoe", "shoe"], + tags: [], + category: "Objects", + description: "man’s shoe", + unicode_version: "6.0", + }, + { + emoji: "👟", + aliases: ["athletic_shoe"], + tags: ["sneaker", "sport", "running"], + category: "Objects", + description: "running shoe", + unicode_version: "6.0", + }, + { + emoji: "🥾", + aliases: ["hiking_boot"], + tags: [], + category: "Objects", + description: "hiking boot", + unicode_version: "11.0", + }, + { + emoji: "🥿", + aliases: ["flat_shoe"], + tags: [], + category: "Objects", + description: "flat shoe", + unicode_version: "11.0", + }, + { + emoji: "👠", + aliases: ["high_heel"], + tags: ["shoe"], + category: "Objects", + description: "high-heeled shoe", + unicode_version: "6.0", + }, + { + emoji: "👡", + aliases: ["sandal"], + tags: ["shoe"], + category: "Objects", + description: "woman’s sandal", + unicode_version: "6.0", + }, + { + emoji: "🩰", + aliases: ["ballet_shoes"], + tags: [], + category: "Objects", + description: "ballet shoes", + unicode_version: "12.0", + }, + { + emoji: "👢", + aliases: ["boot"], + tags: [], + category: "Objects", + description: "woman’s boot", + unicode_version: "6.0", + }, + { + emoji: "👑", + aliases: ["crown"], + tags: ["king", "queen", "royal"], + category: "Objects", + description: "crown", + unicode_version: "6.0", + }, + { + emoji: "👒", + aliases: ["womans_hat"], + tags: [], + category: "Objects", + description: "woman’s hat", + unicode_version: "6.0", + }, + { + emoji: "🎩", + aliases: ["tophat"], + tags: ["hat", "classy"], + category: "Objects", + description: "top hat", + unicode_version: "6.0", + }, + { + emoji: "🎓", + aliases: ["mortar_board"], + tags: ["education", "college", "university", "graduation"], + category: "Objects", + description: "graduation cap", + unicode_version: "6.0", + }, + { + emoji: "🧢", + aliases: ["billed_cap"], + tags: [], + category: "Objects", + description: "billed cap", + unicode_version: "11.0", + }, + { + emoji: "🪖", + aliases: ["military_helmet"], + tags: [], + category: "Objects", + description: "military helmet", + unicode_version: "13.0", + }, + { + emoji: "⛑️", + aliases: ["rescue_worker_helmet"], + tags: [], + category: "Objects", + description: "rescue worker’s helmet", + unicode_version: "5.2", + }, + { + emoji: "📿", + aliases: ["prayer_beads"], + tags: [], + category: "Objects", + description: "prayer beads", + unicode_version: "8.0", + }, + { + emoji: "💄", + aliases: ["lipstick"], + tags: ["makeup"], + category: "Objects", + description: "lipstick", + unicode_version: "6.0", + }, + { + emoji: "💍", + aliases: ["ring"], + tags: ["wedding", "marriage", "engaged"], + category: "Objects", + description: "ring", + unicode_version: "6.0", + }, + { + emoji: "💎", + aliases: ["gem"], + tags: ["diamond"], + category: "Objects", + description: "gem stone", + unicode_version: "6.0", + }, + { + emoji: "🔇", + aliases: ["mute"], + tags: ["sound", "volume"], + category: "Objects", + description: "muted speaker", + unicode_version: "6.0", + }, + { + emoji: "🔈", + aliases: ["speaker"], + tags: [], + category: "Objects", + description: "speaker low volume", + unicode_version: "6.0", + }, + { + emoji: "🔉", + aliases: ["sound"], + tags: ["volume"], + category: "Objects", + description: "speaker medium volume", + unicode_version: "6.0", + }, + { + emoji: "🔊", + aliases: ["loud_sound"], + tags: ["volume"], + category: "Objects", + description: "speaker high volume", + unicode_version: "6.0", + }, + { + emoji: "📢", + aliases: ["loudspeaker"], + tags: ["announcement"], + category: "Objects", + description: "loudspeaker", + unicode_version: "6.0", + }, + { + emoji: "📣", + aliases: ["mega"], + tags: [], + category: "Objects", + description: "megaphone", + unicode_version: "6.0", + }, + { + emoji: "📯", + aliases: ["postal_horn"], + tags: [], + category: "Objects", + description: "postal horn", + unicode_version: "6.0", + }, + { + emoji: "🔔", + aliases: ["bell"], + tags: ["sound", "notification"], + category: "Objects", + description: "bell", + unicode_version: "6.0", + }, + { + emoji: "🔕", + aliases: ["no_bell"], + tags: ["volume", "off"], + category: "Objects", + description: "bell with slash", + unicode_version: "6.0", + }, + { + emoji: "🎼", + aliases: ["musical_score"], + tags: [], + category: "Objects", + description: "musical score", + unicode_version: "6.0", + }, + { + emoji: "🎵", + aliases: ["musical_note"], + tags: [], + category: "Objects", + description: "musical note", + unicode_version: "6.0", + }, + { + emoji: "🎶", + aliases: ["notes"], + tags: ["music"], + category: "Objects", + description: "musical notes", + unicode_version: "6.0", + }, + { + emoji: "🎙️", + aliases: ["studio_microphone"], + tags: ["podcast"], + category: "Objects", + description: "studio microphone", + unicode_version: "7.0", + }, + { + emoji: "🎚️", + aliases: ["level_slider"], + tags: [], + category: "Objects", + description: "level slider", + unicode_version: "7.0", + }, + { + emoji: "🎛️", + aliases: ["control_knobs"], + tags: [], + category: "Objects", + description: "control knobs", + unicode_version: "7.0", + }, + { + emoji: "🎤", + aliases: ["microphone"], + tags: ["sing"], + category: "Objects", + description: "microphone", + unicode_version: "6.0", + }, + { + emoji: "🎧", + aliases: ["headphones"], + tags: ["music", "earphones"], + category: "Objects", + description: "headphone", + unicode_version: "6.0", + }, + { + emoji: "📻", + aliases: ["radio"], + tags: ["podcast"], + category: "Objects", + description: "radio", + unicode_version: "6.0", + }, + { + emoji: "🎷", + aliases: ["saxophone"], + tags: [], + category: "Objects", + description: "saxophone", + unicode_version: "6.0", + }, + { + emoji: "🪗", + aliases: ["accordion"], + tags: [], + category: "Objects", + description: "accordion", + unicode_version: "13.0", + }, + { + emoji: "🎸", + aliases: ["guitar"], + tags: ["rock"], + category: "Objects", + description: "guitar", + unicode_version: "6.0", + }, + { + emoji: "🎹", + aliases: ["musical_keyboard"], + tags: ["piano"], + category: "Objects", + description: "musical keyboard", + unicode_version: "6.0", + }, + { + emoji: "🎺", + aliases: ["trumpet"], + tags: [], + category: "Objects", + description: "trumpet", + unicode_version: "6.0", + }, + { + emoji: "🎻", + aliases: ["violin"], + tags: [], + category: "Objects", + description: "violin", + unicode_version: "6.0", + }, + { + emoji: "🪕", + aliases: ["banjo"], + tags: [], + category: "Objects", + description: "banjo", + unicode_version: "12.0", + }, + { + emoji: "🥁", + aliases: ["drum"], + tags: [], + category: "Objects", + description: "drum", + unicode_version: "", + }, + { + emoji: "🪘", + aliases: ["long_drum"], + tags: [], + category: "Objects", + description: "long drum", + unicode_version: "13.0", + }, + { + emoji: "📱", + aliases: ["iphone"], + tags: ["smartphone", "mobile"], + category: "Objects", + description: "mobile phone", + unicode_version: "6.0", + }, + { + emoji: "📲", + aliases: ["calling"], + tags: ["call", "incoming"], + category: "Objects", + description: "mobile phone with arrow", + unicode_version: "6.0", + }, + { + emoji: "☎️", + aliases: ["phone", "telephone"], + tags: [], + category: "Objects", + description: "telephone", + unicode_version: "", + }, + { + emoji: "📞", + aliases: ["telephone_receiver"], + tags: ["phone", "call"], + category: "Objects", + description: "telephone receiver", + unicode_version: "6.0", + }, + { + emoji: "📟", + aliases: ["pager"], + tags: [], + category: "Objects", + description: "pager", + unicode_version: "6.0", + }, + { + emoji: "📠", + aliases: ["fax"], + tags: [], + category: "Objects", + description: "fax machine", + unicode_version: "6.0", + }, + { + emoji: "🔋", + aliases: ["battery"], + tags: ["power"], + category: "Objects", + description: "battery", + unicode_version: "6.0", + }, + { + emoji: "🔌", + aliases: ["electric_plug"], + tags: [], + category: "Objects", + description: "electric plug", + unicode_version: "6.0", + }, + { + emoji: "💻", + aliases: ["computer"], + tags: ["desktop", "screen"], + category: "Objects", + description: "laptop", + unicode_version: "6.0", + }, + { + emoji: "🖥️", + aliases: ["desktop_computer"], + tags: [], + category: "Objects", + description: "desktop computer", + unicode_version: "7.0", + }, + { + emoji: "🖨️", + aliases: ["printer"], + tags: [], + category: "Objects", + description: "printer", + unicode_version: "7.0", + }, + { + emoji: "⌨️", + aliases: ["keyboard"], + tags: [], + category: "Objects", + description: "keyboard", + unicode_version: "", + }, + { + emoji: "🖱️", + aliases: ["computer_mouse"], + tags: [], + category: "Objects", + description: "computer mouse", + unicode_version: "7.0", + }, + { + emoji: "🖲️", + aliases: ["trackball"], + tags: [], + category: "Objects", + description: "trackball", + unicode_version: "7.0", + }, + { + emoji: "💽", + aliases: ["minidisc"], + tags: [], + category: "Objects", + description: "computer disk", + unicode_version: "6.0", + }, + { + emoji: "💾", + aliases: ["floppy_disk"], + tags: ["save"], + category: "Objects", + description: "floppy disk", + unicode_version: "6.0", + }, + { + emoji: "💿", + aliases: ["cd"], + tags: [], + category: "Objects", + description: "optical disk", + unicode_version: "6.0", + }, + { + emoji: "📀", + aliases: ["dvd"], + tags: [], + category: "Objects", + description: "dvd", + unicode_version: "6.0", + }, + { + emoji: "🧮", + aliases: ["abacus"], + tags: [], + category: "Objects", + description: "abacus", + unicode_version: "11.0", + }, + { + emoji: "🎥", + aliases: ["movie_camera"], + tags: ["film", "video"], + category: "Objects", + description: "movie camera", + unicode_version: "6.0", + }, + { + emoji: "🎞️", + aliases: ["film_strip"], + tags: [], + category: "Objects", + description: "film frames", + unicode_version: "7.0", + }, + { + emoji: "📽️", + aliases: ["film_projector"], + tags: [], + category: "Objects", + description: "film projector", + unicode_version: "7.0", + }, + { + emoji: "🎬", + aliases: ["clapper"], + tags: ["film"], + category: "Objects", + description: "clapper board", + unicode_version: "6.0", + }, + { + emoji: "📺", + aliases: ["tv"], + tags: [], + category: "Objects", + description: "television", + unicode_version: "6.0", + }, + { + emoji: "📷", + aliases: ["camera"], + tags: ["photo"], + category: "Objects", + description: "camera", + unicode_version: "6.0", + }, + { + emoji: "📸", + aliases: ["camera_flash"], + tags: ["photo"], + category: "Objects", + description: "camera with flash", + unicode_version: "7.0", + }, + { + emoji: "📹", + aliases: ["video_camera"], + tags: [], + category: "Objects", + description: "video camera", + unicode_version: "6.0", + }, + { + emoji: "📼", + aliases: ["vhs"], + tags: [], + category: "Objects", + description: "videocassette", + unicode_version: "6.0", + }, + { + emoji: "🔍", + aliases: ["mag"], + tags: ["search", "zoom"], + category: "Objects", + description: "magnifying glass tilted left", + unicode_version: "6.0", + }, + { + emoji: "🔎", + aliases: ["mag_right"], + tags: [], + category: "Objects", + description: "magnifying glass tilted right", + unicode_version: "6.0", + }, + { + emoji: "🕯️", + aliases: ["candle"], + tags: [], + category: "Objects", + description: "candle", + unicode_version: "7.0", + }, + { + emoji: "💡", + aliases: ["bulb"], + tags: ["idea", "light"], + category: "Objects", + description: "light bulb", + unicode_version: "6.0", + }, + { + emoji: "🔦", + aliases: ["flashlight"], + tags: [], + category: "Objects", + description: "flashlight", + unicode_version: "6.0", + }, + { + emoji: "🏮", + aliases: ["izakaya_lantern", "lantern"], + tags: [], + category: "Objects", + description: "red paper lantern", + unicode_version: "6.0", + }, + { + emoji: "🪔", + aliases: ["diya_lamp"], + tags: [], + category: "Objects", + description: "diya lamp", + unicode_version: "12.0", + }, + { + emoji: "📔", + aliases: ["notebook_with_decorative_cover"], + tags: [], + category: "Objects", + description: "notebook with decorative cover", + unicode_version: "6.0", + }, + { + emoji: "📕", + aliases: ["closed_book"], + tags: [], + category: "Objects", + description: "closed book", + unicode_version: "6.0", + }, + { + emoji: "📖", + aliases: ["book", "open_book"], + tags: [], + category: "Objects", + description: "open book", + unicode_version: "6.0", + }, + { + emoji: "📗", + aliases: ["green_book"], + tags: [], + category: "Objects", + description: "green book", + unicode_version: "6.0", + }, + { + emoji: "📘", + aliases: ["blue_book"], + tags: [], + category: "Objects", + description: "blue book", + unicode_version: "6.0", + }, + { + emoji: "📙", + aliases: ["orange_book"], + tags: [], + category: "Objects", + description: "orange book", + unicode_version: "6.0", + }, + { + emoji: "📚", + aliases: ["books"], + tags: ["library"], + category: "Objects", + description: "books", + unicode_version: "6.0", + }, + { + emoji: "📓", + aliases: ["notebook"], + tags: [], + category: "Objects", + description: "notebook", + unicode_version: "6.0", + }, + { + emoji: "📒", + aliases: ["ledger"], + tags: [], + category: "Objects", + description: "ledger", + unicode_version: "6.0", + }, + { + emoji: "📃", + aliases: ["page_with_curl"], + tags: [], + category: "Objects", + description: "page with curl", + unicode_version: "6.0", + }, + { + emoji: "📜", + aliases: ["scroll"], + tags: ["document"], + category: "Objects", + description: "scroll", + unicode_version: "6.0", + }, + { + emoji: "📄", + aliases: ["page_facing_up"], + tags: ["document"], + category: "Objects", + description: "page facing up", + unicode_version: "6.0", + }, + { + emoji: "📰", + aliases: ["newspaper"], + tags: ["press"], + category: "Objects", + description: "newspaper", + unicode_version: "6.0", + }, + { + emoji: "🗞️", + aliases: ["newspaper_roll"], + tags: ["press"], + category: "Objects", + description: "rolled-up newspaper", + unicode_version: "7.0", + }, + { + emoji: "📑", + aliases: ["bookmark_tabs"], + tags: [], + category: "Objects", + description: "bookmark tabs", + unicode_version: "6.0", + }, + { + emoji: "🔖", + aliases: ["bookmark"], + tags: [], + category: "Objects", + description: "bookmark", + unicode_version: "6.0", + }, + { + emoji: "🏷️", + aliases: ["label"], + tags: ["tag"], + category: "Objects", + description: "label", + unicode_version: "7.0", + }, + { + emoji: "💰", + aliases: ["moneybag"], + tags: ["dollar", "cream"], + category: "Objects", + description: "money bag", + unicode_version: "6.0", + }, + { + emoji: "🪙", + aliases: ["coin"], + tags: [], + category: "Objects", + description: "coin", + unicode_version: "13.0", + }, + { + emoji: "💴", + aliases: ["yen"], + tags: [], + category: "Objects", + description: "yen banknote", + unicode_version: "6.0", + }, + { + emoji: "💵", + aliases: ["dollar"], + tags: ["money"], + category: "Objects", + description: "dollar banknote", + unicode_version: "6.0", + }, + { + emoji: "💶", + aliases: ["euro"], + tags: [], + category: "Objects", + description: "euro banknote", + unicode_version: "6.0", + }, + { + emoji: "💷", + aliases: ["pound"], + tags: [], + category: "Objects", + description: "pound banknote", + unicode_version: "6.0", + }, + { + emoji: "💸", + aliases: ["money_with_wings"], + tags: ["dollar"], + category: "Objects", + description: "money with wings", + unicode_version: "6.0", + }, + { + emoji: "💳", + aliases: ["credit_card"], + tags: ["subscription"], + category: "Objects", + description: "credit card", + unicode_version: "6.0", + }, + { + emoji: "🧾", + aliases: ["receipt"], + tags: [], + category: "Objects", + description: "receipt", + unicode_version: "11.0", + }, + { + emoji: "💹", + aliases: ["chart"], + tags: [], + category: "Objects", + description: "chart increasing with yen", + unicode_version: "6.0", + }, + { + emoji: "✉️", + aliases: ["envelope"], + tags: ["letter", "email"], + category: "Objects", + description: "envelope", + unicode_version: "", + }, + { + emoji: "📧", + aliases: ["email", "e-mail"], + tags: [], + category: "Objects", + description: "e-mail", + unicode_version: "6.0", + }, + { + emoji: "📨", + aliases: ["incoming_envelope"], + tags: [], + category: "Objects", + description: "incoming envelope", + unicode_version: "6.0", + }, + { + emoji: "📩", + aliases: ["envelope_with_arrow"], + tags: [], + category: "Objects", + description: "envelope with arrow", + unicode_version: "6.0", + }, + { + emoji: "📤", + aliases: ["outbox_tray"], + tags: [], + category: "Objects", + description: "outbox tray", + unicode_version: "6.0", + }, + { + emoji: "📥", + aliases: ["inbox_tray"], + tags: [], + category: "Objects", + description: "inbox tray", + unicode_version: "6.0", + }, + { + emoji: "📦", + aliases: ["package"], + tags: ["shipping"], + category: "Objects", + description: "package", + unicode_version: "6.0", + }, + { + emoji: "📫", + aliases: ["mailbox"], + tags: [], + category: "Objects", + description: "closed mailbox with raised flag", + unicode_version: "6.0", + }, + { + emoji: "📪", + aliases: ["mailbox_closed"], + tags: [], + category: "Objects", + description: "closed mailbox with lowered flag", + unicode_version: "6.0", + }, + { + emoji: "📬", + aliases: ["mailbox_with_mail"], + tags: [], + category: "Objects", + description: "open mailbox with raised flag", + unicode_version: "6.0", + }, + { + emoji: "📭", + aliases: ["mailbox_with_no_mail"], + tags: [], + category: "Objects", + description: "open mailbox with lowered flag", + unicode_version: "6.0", + }, + { + emoji: "📮", + aliases: ["postbox"], + tags: [], + category: "Objects", + description: "postbox", + unicode_version: "6.0", + }, + { + emoji: "🗳️", + aliases: ["ballot_box"], + tags: [], + category: "Objects", + description: "ballot box with ballot", + unicode_version: "7.0", + }, + { + emoji: "✏️", + aliases: ["pencil2"], + tags: [], + category: "Objects", + description: "pencil", + unicode_version: "", + }, + { + emoji: "✒️", + aliases: ["black_nib"], + tags: [], + category: "Objects", + description: "black nib", + unicode_version: "", + }, + { + emoji: "🖋️", + aliases: ["fountain_pen"], + tags: [], + category: "Objects", + description: "fountain pen", + unicode_version: "7.0", + }, + { + emoji: "🖊️", + aliases: ["pen"], + tags: [], + category: "Objects", + description: "pen", + unicode_version: "7.0", + }, + { + emoji: "🖌️", + aliases: ["paintbrush"], + tags: [], + category: "Objects", + description: "paintbrush", + unicode_version: "7.0", + }, + { + emoji: "🖍️", + aliases: ["crayon"], + tags: [], + category: "Objects", + description: "crayon", + unicode_version: "7.0", + }, + { + emoji: "📝", + aliases: ["memo", "pencil"], + tags: ["document", "note"], + category: "Objects", + description: "memo", + unicode_version: "6.0", + }, + { + emoji: "💼", + aliases: ["briefcase"], + tags: ["business"], + category: "Objects", + description: "briefcase", + unicode_version: "6.0", + }, + { + emoji: "📁", + aliases: ["file_folder"], + tags: ["directory"], + category: "Objects", + description: "file folder", + unicode_version: "6.0", + }, + { + emoji: "📂", + aliases: ["open_file_folder"], + tags: [], + category: "Objects", + description: "open file folder", + unicode_version: "6.0", + }, + { + emoji: "🗂️", + aliases: ["card_index_dividers"], + tags: [], + category: "Objects", + description: "card index dividers", + unicode_version: "7.0", + }, + { + emoji: "📅", + aliases: ["date"], + tags: ["calendar", "schedule"], + category: "Objects", + description: "calendar", + unicode_version: "6.0", + }, + { + emoji: "📆", + aliases: ["calendar"], + tags: ["schedule"], + category: "Objects", + description: "tear-off calendar", + unicode_version: "6.0", + }, + { + emoji: "🗒️", + aliases: ["spiral_notepad"], + tags: [], + category: "Objects", + description: "spiral notepad", + unicode_version: "7.0", + }, + { + emoji: "🗓️", + aliases: ["spiral_calendar"], + tags: [], + category: "Objects", + description: "spiral calendar", + unicode_version: "7.0", + }, + { + emoji: "📇", + aliases: ["card_index"], + tags: [], + category: "Objects", + description: "card index", + unicode_version: "6.0", + }, + { + emoji: "📈", + aliases: ["chart_with_upwards_trend"], + tags: ["graph", "metrics"], + category: "Objects", + description: "chart increasing", + unicode_version: "6.0", + }, + { + emoji: "📉", + aliases: ["chart_with_downwards_trend"], + tags: ["graph", "metrics"], + category: "Objects", + description: "chart decreasing", + unicode_version: "6.0", + }, + { + emoji: "📊", + aliases: ["bar_chart"], + tags: ["stats", "metrics"], + category: "Objects", + description: "bar chart", + unicode_version: "6.0", + }, + { + emoji: "📋", + aliases: ["clipboard"], + tags: [], + category: "Objects", + description: "clipboard", + unicode_version: "6.0", + }, + { + emoji: "📌", + aliases: ["pushpin"], + tags: ["location"], + category: "Objects", + description: "pushpin", + unicode_version: "6.0", + }, + { + emoji: "📍", + aliases: ["round_pushpin"], + tags: ["location"], + category: "Objects", + description: "round pushpin", + unicode_version: "6.0", + }, + { + emoji: "📎", + aliases: ["paperclip"], + tags: [], + category: "Objects", + description: "paperclip", + unicode_version: "6.0", + }, + { + emoji: "🖇️", + aliases: ["paperclips"], + tags: [], + category: "Objects", + description: "linked paperclips", + unicode_version: "7.0", + }, + { + emoji: "📏", + aliases: ["straight_ruler"], + tags: [], + category: "Objects", + description: "straight ruler", + unicode_version: "6.0", + }, + { + emoji: "📐", + aliases: ["triangular_ruler"], + tags: [], + category: "Objects", + description: "triangular ruler", + unicode_version: "6.0", + }, + { + emoji: "✂️", + aliases: ["scissors"], + tags: ["cut"], + category: "Objects", + description: "scissors", + unicode_version: "", + }, + { + emoji: "🗃️", + aliases: ["card_file_box"], + tags: [], + category: "Objects", + description: "card file box", + unicode_version: "7.0", + }, + { + emoji: "🗄️", + aliases: ["file_cabinet"], + tags: [], + category: "Objects", + description: "file cabinet", + unicode_version: "7.0", + }, + { + emoji: "🗑️", + aliases: ["wastebasket"], + tags: ["trash"], + category: "Objects", + description: "wastebasket", + unicode_version: "7.0", + }, + { + emoji: "🔒", + aliases: ["lock"], + tags: ["security", "private"], + category: "Objects", + description: "locked", + unicode_version: "6.0", + }, + { + emoji: "🔓", + aliases: ["unlock"], + tags: ["security"], + category: "Objects", + description: "unlocked", + unicode_version: "6.0", + }, + { + emoji: "🔏", + aliases: ["lock_with_ink_pen"], + tags: [], + category: "Objects", + description: "locked with pen", + unicode_version: "6.0", + }, + { + emoji: "🔐", + aliases: ["closed_lock_with_key"], + tags: ["security"], + category: "Objects", + description: "locked with key", + unicode_version: "6.0", + }, + { + emoji: "🔑", + aliases: ["key"], + tags: ["lock", "password"], + category: "Objects", + description: "key", + unicode_version: "6.0", + }, + { + emoji: "🗝️", + aliases: ["old_key"], + tags: [], + category: "Objects", + description: "old key", + unicode_version: "7.0", + }, + { + emoji: "🔨", + aliases: ["hammer"], + tags: ["tool"], + category: "Objects", + description: "hammer", + unicode_version: "6.0", + }, + { + emoji: "🪓", + aliases: ["axe"], + tags: [], + category: "Objects", + description: "axe", + unicode_version: "12.0", + }, + { + emoji: "⛏️", + aliases: ["pick"], + tags: [], + category: "Objects", + description: "pick", + unicode_version: "5.2", + }, + { + emoji: "⚒️", + aliases: ["hammer_and_pick"], + tags: [], + category: "Objects", + description: "hammer and pick", + unicode_version: "4.1", + }, + { + emoji: "🛠️", + aliases: ["hammer_and_wrench"], + tags: [], + category: "Objects", + description: "hammer and wrench", + unicode_version: "7.0", + }, + { + emoji: "🗡️", + aliases: ["dagger"], + tags: [], + category: "Objects", + description: "dagger", + unicode_version: "7.0", + }, + { + emoji: "⚔️", + aliases: ["crossed_swords"], + tags: [], + category: "Objects", + description: "crossed swords", + unicode_version: "4.1", + }, + { + emoji: "🔫", + aliases: ["gun"], + tags: ["shoot", "weapon"], + category: "Objects", + description: "water pistol", + unicode_version: "6.0", + }, + { + emoji: "🪃", + aliases: ["boomerang"], + tags: [], + category: "Objects", + description: "boomerang", + unicode_version: "13.0", + }, + { + emoji: "🏹", + aliases: ["bow_and_arrow"], + tags: ["archery"], + category: "Objects", + description: "bow and arrow", + unicode_version: "8.0", + }, + { + emoji: "🛡️", + aliases: ["shield"], + tags: [], + category: "Objects", + description: "shield", + unicode_version: "7.0", + }, + { + emoji: "🪚", + aliases: ["carpentry_saw"], + tags: [], + category: "Objects", + description: "carpentry saw", + unicode_version: "13.0", + }, + { + emoji: "🔧", + aliases: ["wrench"], + tags: ["tool"], + category: "Objects", + description: "wrench", + unicode_version: "6.0", + }, + { + emoji: "🪛", + aliases: ["screwdriver"], + tags: [], + category: "Objects", + description: "screwdriver", + unicode_version: "13.0", + }, + { + emoji: "🔩", + aliases: ["nut_and_bolt"], + tags: [], + category: "Objects", + description: "nut and bolt", + unicode_version: "6.0", + }, + { + emoji: "⚙️", + aliases: ["gear"], + tags: [], + category: "Objects", + description: "gear", + unicode_version: "4.1", + }, + { + emoji: "🗜️", + aliases: ["clamp"], + tags: [], + category: "Objects", + description: "clamp", + unicode_version: "7.0", + }, + { + emoji: "⚖️", + aliases: ["balance_scale"], + tags: [], + category: "Objects", + description: "balance scale", + unicode_version: "4.1", + }, + { + emoji: "🦯", + aliases: ["probing_cane"], + tags: [], + category: "Objects", + description: "white cane", + unicode_version: "12.0", + }, + { + emoji: "🔗", + aliases: ["link"], + tags: [], + category: "Objects", + description: "link", + unicode_version: "6.0", + }, + { + emoji: "⛓️", + aliases: ["chains"], + tags: [], + category: "Objects", + description: "chains", + unicode_version: "5.2", + }, + { + emoji: "🪝", + aliases: ["hook"], + tags: [], + category: "Objects", + description: "hook", + unicode_version: "13.0", + }, + { + emoji: "🧰", + aliases: ["toolbox"], + tags: [], + category: "Objects", + description: "toolbox", + unicode_version: "11.0", + }, + { + emoji: "🧲", + aliases: ["magnet"], + tags: [], + category: "Objects", + description: "magnet", + unicode_version: "11.0", + }, + { + emoji: "🪜", + aliases: ["ladder"], + tags: [], + category: "Objects", + description: "ladder", + unicode_version: "13.0", + }, + { + emoji: "⚗️", + aliases: ["alembic"], + tags: [], + category: "Objects", + description: "alembic", + unicode_version: "4.1", + }, + { + emoji: "🧪", + aliases: ["test_tube"], + tags: [], + category: "Objects", + description: "test tube", + unicode_version: "11.0", + }, + { + emoji: "🧫", + aliases: ["petri_dish"], + tags: [], + category: "Objects", + description: "petri dish", + unicode_version: "11.0", + }, + { + emoji: "🧬", + aliases: ["dna"], + tags: [], + category: "Objects", + description: "dna", + unicode_version: "11.0", + }, + { + emoji: "🔬", + aliases: ["microscope"], + tags: ["science", "laboratory", "investigate"], + category: "Objects", + description: "microscope", + unicode_version: "6.0", + }, + { + emoji: "🔭", + aliases: ["telescope"], + tags: [], + category: "Objects", + description: "telescope", + unicode_version: "6.0", + }, + { + emoji: "📡", + aliases: ["satellite"], + tags: ["signal"], + category: "Objects", + description: "satellite antenna", + unicode_version: "6.0", + }, + { + emoji: "💉", + aliases: ["syringe"], + tags: ["health", "hospital", "needle"], + category: "Objects", + description: "syringe", + unicode_version: "6.0", + }, + { + emoji: "🩸", + aliases: ["drop_of_blood"], + tags: [], + category: "Objects", + description: "drop of blood", + unicode_version: "12.0", + }, + { + emoji: "💊", + aliases: ["pill"], + tags: ["health", "medicine"], + category: "Objects", + description: "pill", + unicode_version: "6.0", + }, + { + emoji: "🩹", + aliases: ["adhesive_bandage"], + tags: [], + category: "Objects", + description: "adhesive bandage", + unicode_version: "12.0", + }, + { + emoji: "🩺", + aliases: ["stethoscope"], + tags: [], + category: "Objects", + description: "stethoscope", + unicode_version: "12.0", + }, + { + emoji: "🚪", + aliases: ["door"], + tags: [], + category: "Objects", + description: "door", + unicode_version: "6.0", + }, + { + emoji: "🛗", + aliases: ["elevator"], + tags: [], + category: "Objects", + description: "elevator", + unicode_version: "13.0", + }, + { + emoji: "🪞", + aliases: ["mirror"], + tags: [], + category: "Objects", + description: "mirror", + unicode_version: "13.0", + }, + { + emoji: "🪟", + aliases: ["window"], + tags: [], + category: "Objects", + description: "window", + unicode_version: "13.0", + }, + { + emoji: "🛏️", + aliases: ["bed"], + tags: [], + category: "Objects", + description: "bed", + unicode_version: "7.0", + }, + { + emoji: "🛋️", + aliases: ["couch_and_lamp"], + tags: [], + category: "Objects", + description: "couch and lamp", + unicode_version: "7.0", + }, + { + emoji: "🪑", + aliases: ["chair"], + tags: [], + category: "Objects", + description: "chair", + unicode_version: "12.0", + }, + { + emoji: "🚽", + aliases: ["toilet"], + tags: ["wc"], + category: "Objects", + description: "toilet", + unicode_version: "6.0", + }, + { + emoji: "🪠", + aliases: ["plunger"], + tags: [], + category: "Objects", + description: "plunger", + unicode_version: "13.0", + }, + { + emoji: "🚿", + aliases: ["shower"], + tags: ["bath"], + category: "Objects", + description: "shower", + unicode_version: "6.0", + }, + { + emoji: "🛁", + aliases: ["bathtub"], + tags: [], + category: "Objects", + description: "bathtub", + unicode_version: "6.0", + }, + { + emoji: "🪤", + aliases: ["mouse_trap"], + tags: [], + category: "Objects", + description: "mouse trap", + unicode_version: "13.0", + }, + { + emoji: "🪒", + aliases: ["razor"], + tags: [], + category: "Objects", + description: "razor", + unicode_version: "12.0", + }, + { + emoji: "🧴", + aliases: ["lotion_bottle"], + tags: [], + category: "Objects", + description: "lotion bottle", + unicode_version: "11.0", + }, + { + emoji: "🧷", + aliases: ["safety_pin"], + tags: [], + category: "Objects", + description: "safety pin", + unicode_version: "11.0", + }, + { + emoji: "🧹", + aliases: ["broom"], + tags: [], + category: "Objects", + description: "broom", + unicode_version: "11.0", + }, + { + emoji: "🧺", + aliases: ["basket"], + tags: [], + category: "Objects", + description: "basket", + unicode_version: "11.0", + }, + { + emoji: "🧻", + aliases: ["roll_of_paper"], + tags: ["toilet"], + category: "Objects", + description: "roll of paper", + unicode_version: "11.0", + }, + { + emoji: "🪣", + aliases: ["bucket"], + tags: [], + category: "Objects", + description: "bucket", + unicode_version: "13.0", + }, + { + emoji: "🧼", + aliases: ["soap"], + tags: [], + category: "Objects", + description: "soap", + unicode_version: "11.0", + }, + { + emoji: "🪥", + aliases: ["toothbrush"], + tags: [], + category: "Objects", + description: "toothbrush", + unicode_version: "13.0", + }, + { + emoji: "🧽", + aliases: ["sponge"], + tags: [], + category: "Objects", + description: "sponge", + unicode_version: "11.0", + }, + { + emoji: "🧯", + aliases: ["fire_extinguisher"], + tags: [], + category: "Objects", + description: "fire extinguisher", + unicode_version: "11.0", + }, + { + emoji: "🛒", + aliases: ["shopping_cart"], + tags: [], + category: "Objects", + description: "shopping cart", + unicode_version: "9.0", + }, + { + emoji: "🚬", + aliases: ["smoking"], + tags: ["cigarette"], + category: "Objects", + description: "cigarette", + unicode_version: "6.0", + }, + { + emoji: "⚰️", + aliases: ["coffin"], + tags: ["funeral"], + category: "Objects", + description: "coffin", + unicode_version: "4.1", + }, + { + emoji: "🪦", + aliases: ["headstone"], + tags: [], + category: "Objects", + description: "headstone", + unicode_version: "13.0", + }, + { + emoji: "⚱️", + aliases: ["funeral_urn"], + tags: [], + category: "Objects", + description: "funeral urn", + unicode_version: "4.1", + }, + { + emoji: "🗿", + aliases: ["moyai"], + tags: ["stone"], + category: "Objects", + description: "moai", + unicode_version: "6.0", + }, + { + emoji: "🪧", + aliases: ["placard"], + tags: [], + category: "Objects", + description: "placard", + unicode_version: "13.0", + }, + { + emoji: "🏧", + aliases: ["atm"], + tags: [], + category: "Symbols", + description: "ATM sign", + unicode_version: "6.0", + }, + { + emoji: "🚮", + aliases: ["put_litter_in_its_place"], + tags: [], + category: "Symbols", + description: "litter in bin sign", + unicode_version: "6.0", + }, + { + emoji: "🚰", + aliases: ["potable_water"], + tags: [], + category: "Symbols", + description: "potable water", + unicode_version: "6.0", + }, + { + emoji: "♿", + aliases: ["wheelchair"], + tags: ["accessibility"], + category: "Symbols", + description: "wheelchair symbol", + unicode_version: "4.1", + }, + { + emoji: "🚹", + aliases: ["mens"], + tags: [], + category: "Symbols", + description: "men’s room", + unicode_version: "6.0", + }, + { + emoji: "🚺", + aliases: ["womens"], + tags: [], + category: "Symbols", + description: "women’s room", + unicode_version: "6.0", + }, + { + emoji: "🚻", + aliases: ["restroom"], + tags: ["toilet"], + category: "Symbols", + description: "restroom", + unicode_version: "6.0", + }, + { + emoji: "🚼", + aliases: ["baby_symbol"], + tags: [], + category: "Symbols", + description: "baby symbol", + unicode_version: "6.0", + }, + { + emoji: "🚾", + aliases: ["wc"], + tags: ["toilet", "restroom"], + category: "Symbols", + description: "water closet", + unicode_version: "6.0", + }, + { + emoji: "🛂", + aliases: ["passport_control"], + tags: [], + category: "Symbols", + description: "passport control", + unicode_version: "6.0", + }, + { + emoji: "🛃", + aliases: ["customs"], + tags: [], + category: "Symbols", + description: "customs", + unicode_version: "6.0", + }, + { + emoji: "🛄", + aliases: ["baggage_claim"], + tags: ["airport"], + category: "Symbols", + description: "baggage claim", + unicode_version: "6.0", + }, + { + emoji: "🛅", + aliases: ["left_luggage"], + tags: [], + category: "Symbols", + description: "left luggage", + unicode_version: "6.0", + }, + { + emoji: "⚠️", + aliases: ["warning"], + tags: ["wip"], + category: "Symbols", + description: "warning", + unicode_version: "4.0", + }, + { + emoji: "🚸", + aliases: ["children_crossing"], + tags: [], + category: "Symbols", + description: "children crossing", + unicode_version: "6.0", + }, + { + emoji: "⛔", + aliases: ["no_entry"], + tags: ["limit"], + category: "Symbols", + description: "no entry", + unicode_version: "5.2", + }, + { + emoji: "🚫", + aliases: ["no_entry_sign"], + tags: ["block", "forbidden"], + category: "Symbols", + description: "prohibited", + unicode_version: "6.0", + }, + { + emoji: "🚳", + aliases: ["no_bicycles"], + tags: [], + category: "Symbols", + description: "no bicycles", + unicode_version: "6.0", + }, + { + emoji: "🚭", + aliases: ["no_smoking"], + tags: [], + category: "Symbols", + description: "no smoking", + unicode_version: "6.0", + }, + { + emoji: "🚯", + aliases: ["do_not_litter"], + tags: [], + category: "Symbols", + description: "no littering", + unicode_version: "6.0", + }, + { + emoji: "🚱", + aliases: ["non-potable_water"], + tags: [], + category: "Symbols", + description: "non-potable water", + unicode_version: "6.0", + }, + { + emoji: "🚷", + aliases: ["no_pedestrians"], + tags: [], + category: "Symbols", + description: "no pedestrians", + unicode_version: "6.0", + }, + { + emoji: "📵", + aliases: ["no_mobile_phones"], + tags: [], + category: "Symbols", + description: "no mobile phones", + unicode_version: "6.0", + }, + { + emoji: "🔞", + aliases: ["underage"], + tags: [], + category: "Symbols", + description: "no one under eighteen", + unicode_version: "6.0", + }, + { + emoji: "☢️", + aliases: ["radioactive"], + tags: [], + category: "Symbols", + description: "radioactive", + unicode_version: "", + }, + { + emoji: "☣️", + aliases: ["biohazard"], + tags: [], + category: "Symbols", + description: "biohazard", + unicode_version: "", + }, + { + emoji: "⬆️", + aliases: ["arrow_up"], + tags: [], + category: "Symbols", + description: "up arrow", + unicode_version: "4.0", + }, + { + emoji: "↗️", + aliases: ["arrow_upper_right"], + tags: [], + category: "Symbols", + description: "up-right arrow", + unicode_version: "", + }, + { + emoji: "➡️", + aliases: ["arrow_right"], + tags: [], + category: "Symbols", + description: "right arrow", + unicode_version: "", + }, + { + emoji: "↘️", + aliases: ["arrow_lower_right"], + tags: [], + category: "Symbols", + description: "down-right arrow", + unicode_version: "", + }, + { + emoji: "⬇️", + aliases: ["arrow_down"], + tags: [], + category: "Symbols", + description: "down arrow", + unicode_version: "4.0", + }, + { + emoji: "↙️", + aliases: ["arrow_lower_left"], + tags: [], + category: "Symbols", + description: "down-left arrow", + unicode_version: "", + }, + { + emoji: "⬅️", + aliases: ["arrow_left"], + tags: [], + category: "Symbols", + description: "left arrow", + unicode_version: "4.0", + }, + { + emoji: "↖️", + aliases: ["arrow_upper_left"], + tags: [], + category: "Symbols", + description: "up-left arrow", + unicode_version: "", + }, + { + emoji: "↕️", + aliases: ["arrow_up_down"], + tags: [], + category: "Symbols", + description: "up-down arrow", + unicode_version: "", + }, + { + emoji: "↔️", + aliases: ["left_right_arrow"], + tags: [], + category: "Symbols", + description: "left-right arrow", + unicode_version: "", + }, + { + emoji: "↩️", + aliases: ["leftwards_arrow_with_hook"], + tags: ["return"], + category: "Symbols", + description: "right arrow curving left", + unicode_version: "", + }, + { + emoji: "↪️", + aliases: ["arrow_right_hook"], + tags: [], + category: "Symbols", + description: "left arrow curving right", + unicode_version: "", + }, + { + emoji: "⤴️", + aliases: ["arrow_heading_up"], + tags: [], + category: "Symbols", + description: "right arrow curving up", + unicode_version: "", + }, + { + emoji: "⤵️", + aliases: ["arrow_heading_down"], + tags: [], + category: "Symbols", + description: "right arrow curving down", + unicode_version: "", + }, + { + emoji: "🔃", + aliases: ["arrows_clockwise"], + tags: [], + category: "Symbols", + description: "clockwise vertical arrows", + unicode_version: "6.0", + }, + { + emoji: "🔄", + aliases: ["arrows_counterclockwise"], + tags: ["sync"], + category: "Symbols", + description: "counterclockwise arrows button", + unicode_version: "6.0", + }, + { + emoji: "🔙", + aliases: ["back"], + tags: [], + category: "Symbols", + description: "BACK arrow", + unicode_version: "6.0", + }, + { + emoji: "🔚", + aliases: ["end"], + tags: [], + category: "Symbols", + description: "END arrow", + unicode_version: "6.0", + }, + { + emoji: "🔛", + aliases: ["on"], + tags: [], + category: "Symbols", + description: "ON! arrow", + unicode_version: "6.0", + }, + { + emoji: "🔜", + aliases: ["soon"], + tags: [], + category: "Symbols", + description: "SOON arrow", + unicode_version: "6.0", + }, + { + emoji: "🔝", + aliases: ["top"], + tags: [], + category: "Symbols", + description: "TOP arrow", + unicode_version: "6.0", + }, + { + emoji: "🛐", + aliases: ["place_of_worship"], + tags: [], + category: "Symbols", + description: "place of worship", + unicode_version: "8.0", + }, + { + emoji: "⚛️", + aliases: ["atom_symbol"], + tags: [], + category: "Symbols", + description: "atom symbol", + unicode_version: "4.1", + }, + { + emoji: "🕉️", + aliases: ["om"], + tags: [], + category: "Symbols", + description: "om", + unicode_version: "7.0", + }, + { + emoji: "✡️", + aliases: ["star_of_david"], + tags: [], + category: "Symbols", + description: "star of David", + unicode_version: "", + }, + { + emoji: "☸️", + aliases: ["wheel_of_dharma"], + tags: [], + category: "Symbols", + description: "wheel of dharma", + unicode_version: "", + }, + { + emoji: "☯️", + aliases: ["yin_yang"], + tags: [], + category: "Symbols", + description: "yin yang", + unicode_version: "", + }, + { + emoji: "✝️", + aliases: ["latin_cross"], + tags: [], + category: "Symbols", + description: "latin cross", + unicode_version: "", + }, + { + emoji: "☦️", + aliases: ["orthodox_cross"], + tags: [], + category: "Symbols", + description: "orthodox cross", + unicode_version: "", + }, + { + emoji: "☪️", + aliases: ["star_and_crescent"], + tags: [], + category: "Symbols", + description: "star and crescent", + unicode_version: "", + }, + { + emoji: "☮️", + aliases: ["peace_symbol"], + tags: [], + category: "Symbols", + description: "peace symbol", + unicode_version: "", + }, + { + emoji: "🕎", + aliases: ["menorah"], + tags: [], + category: "Symbols", + description: "menorah", + unicode_version: "8.0", + }, + { + emoji: "🔯", + aliases: ["six_pointed_star"], + tags: [], + category: "Symbols", + description: "dotted six-pointed star", + unicode_version: "6.0", + }, + { + emoji: "♈", + aliases: ["aries"], + tags: [], + category: "Symbols", + description: "Aries", + unicode_version: "", + }, + { + emoji: "♉", + aliases: ["taurus"], + tags: [], + category: "Symbols", + description: "Taurus", + unicode_version: "", + }, + { + emoji: "♊", + aliases: ["gemini"], + tags: [], + category: "Symbols", + description: "Gemini", + unicode_version: "", + }, + { + emoji: "♋", + aliases: ["cancer"], + tags: [], + category: "Symbols", + description: "Cancer", + unicode_version: "", + }, + { + emoji: "♌", + aliases: ["leo"], + tags: [], + category: "Symbols", + description: "Leo", + unicode_version: "", + }, + { + emoji: "♍", + aliases: ["virgo"], + tags: [], + category: "Symbols", + description: "Virgo", + unicode_version: "", + }, + { + emoji: "♎", + aliases: ["libra"], + tags: [], + category: "Symbols", + description: "Libra", + unicode_version: "", + }, + { + emoji: "♏", + aliases: ["scorpius"], + tags: [], + category: "Symbols", + description: "Scorpio", + unicode_version: "", + }, + { + emoji: "♐", + aliases: ["sagittarius"], + tags: [], + category: "Symbols", + description: "Sagittarius", + unicode_version: "", + }, + { + emoji: "♑", + aliases: ["capricorn"], + tags: [], + category: "Symbols", + description: "Capricorn", + unicode_version: "", + }, + { + emoji: "♒", + aliases: ["aquarius"], + tags: [], + category: "Symbols", + description: "Aquarius", + unicode_version: "", + }, + { + emoji: "♓", + aliases: ["pisces"], + tags: [], + category: "Symbols", + description: "Pisces", + unicode_version: "", + }, + { + emoji: "⛎", + aliases: ["ophiuchus"], + tags: [], + category: "Symbols", + description: "Ophiuchus", + unicode_version: "6.0", + }, + { + emoji: "🔀", + aliases: ["twisted_rightwards_arrows"], + tags: ["shuffle"], + category: "Symbols", + description: "shuffle tracks button", + unicode_version: "6.0", + }, + { + emoji: "🔁", + aliases: ["repeat"], + tags: ["loop"], + category: "Symbols", + description: "repeat button", + unicode_version: "6.0", + }, + { + emoji: "🔂", + aliases: ["repeat_one"], + tags: [], + category: "Symbols", + description: "repeat single button", + unicode_version: "6.0", + }, + { + emoji: "▶️", + aliases: ["arrow_forward"], + tags: [], + category: "Symbols", + description: "play button", + unicode_version: "", + }, + { + emoji: "⏩", + aliases: ["fast_forward"], + tags: [], + category: "Symbols", + description: "fast-forward button", + unicode_version: "6.0", + }, + { + emoji: "⏭️", + aliases: ["next_track_button"], + tags: [], + category: "Symbols", + description: "next track button", + unicode_version: "6.0", + }, + { + emoji: "⏯️", + aliases: ["play_or_pause_button"], + tags: [], + category: "Symbols", + description: "play or pause button", + unicode_version: "6.0", + }, + { + emoji: "◀️", + aliases: ["arrow_backward"], + tags: [], + category: "Symbols", + description: "reverse button", + unicode_version: "", + }, + { + emoji: "⏪", + aliases: ["rewind"], + tags: [], + category: "Symbols", + description: "fast reverse button", + unicode_version: "6.0", + }, + { + emoji: "⏮️", + aliases: ["previous_track_button"], + tags: [], + category: "Symbols", + description: "last track button", + unicode_version: "6.0", + }, + { + emoji: "🔼", + aliases: ["arrow_up_small"], + tags: [], + category: "Symbols", + description: "upwards button", + unicode_version: "6.0", + }, + { + emoji: "⏫", + aliases: ["arrow_double_up"], + tags: [], + category: "Symbols", + description: "fast up button", + unicode_version: "6.0", + }, + { + emoji: "🔽", + aliases: ["arrow_down_small"], + tags: [], + category: "Symbols", + description: "downwards button", + unicode_version: "6.0", + }, + { + emoji: "⏬", + aliases: ["arrow_double_down"], + tags: [], + category: "Symbols", + description: "fast down button", + unicode_version: "6.0", + }, + { + emoji: "⏸️", + aliases: ["pause_button"], + tags: [], + category: "Symbols", + description: "pause button", + unicode_version: "7.0", + }, + { + emoji: "⏹️", + aliases: ["stop_button"], + tags: [], + category: "Symbols", + description: "stop button", + unicode_version: "7.0", + }, + { + emoji: "⏺️", + aliases: ["record_button"], + tags: [], + category: "Symbols", + description: "record button", + unicode_version: "7.0", + }, + { + emoji: "⏏️", + aliases: ["eject_button"], + tags: [], + category: "Symbols", + description: "eject button", + unicode_version: "11.0", + }, + { + emoji: "🎦", + aliases: ["cinema"], + tags: ["film", "movie"], + category: "Symbols", + description: "cinema", + unicode_version: "6.0", + }, + { + emoji: "🔅", + aliases: ["low_brightness"], + tags: [], + category: "Symbols", + description: "dim button", + unicode_version: "6.0", + }, + { + emoji: "🔆", + aliases: ["high_brightness"], + tags: [], + category: "Symbols", + description: "bright button", + unicode_version: "6.0", + }, + { + emoji: "📶", + aliases: ["signal_strength"], + tags: ["wifi"], + category: "Symbols", + description: "antenna bars", + unicode_version: "6.0", + }, + { + emoji: "📳", + aliases: ["vibration_mode"], + tags: [], + category: "Symbols", + description: "vibration mode", + unicode_version: "6.0", + }, + { + emoji: "📴", + aliases: ["mobile_phone_off"], + tags: ["mute", "off"], + category: "Symbols", + description: "mobile phone off", + unicode_version: "6.0", + }, + { + emoji: "♀️", + aliases: ["female_sign"], + tags: [], + category: "Symbols", + description: "female sign", + unicode_version: "11.0", + }, + { + emoji: "♂️", + aliases: ["male_sign"], + tags: [], + category: "Symbols", + description: "male sign", + unicode_version: "11.0", + }, + { + emoji: "⚧️", + aliases: ["transgender_symbol"], + tags: [], + category: "Symbols", + description: "transgender symbol", + unicode_version: "13.0", + }, + { + emoji: "✖️", + aliases: ["heavy_multiplication_x"], + tags: [], + category: "Symbols", + description: "multiply", + unicode_version: "", + }, + { + emoji: "➕", + aliases: ["heavy_plus_sign"], + tags: [], + category: "Symbols", + description: "plus", + unicode_version: "6.0", + }, + { + emoji: "➖", + aliases: ["heavy_minus_sign"], + tags: [], + category: "Symbols", + description: "minus", + unicode_version: "6.0", + }, + { + emoji: "➗", + aliases: ["heavy_division_sign"], + tags: [], + category: "Symbols", + description: "divide", + unicode_version: "6.0", + }, + { + emoji: "♾️", + aliases: ["infinity"], + tags: [], + category: "Symbols", + description: "infinity", + unicode_version: "11.0", + }, + { + emoji: "‼️", + aliases: ["bangbang"], + tags: [], + category: "Symbols", + description: "double exclamation mark", + unicode_version: "", + }, + { + emoji: "⁉️", + aliases: ["interrobang"], + tags: [], + category: "Symbols", + description: "exclamation question mark", + unicode_version: "3.0", + }, + { + emoji: "❓", + aliases: ["question"], + tags: ["confused"], + category: "Symbols", + description: "red question mark", + unicode_version: "6.0", + }, + { + emoji: "❔", + aliases: ["grey_question"], + tags: [], + category: "Symbols", + description: "white question mark", + unicode_version: "6.0", + }, + { + emoji: "❕", + aliases: ["grey_exclamation"], + tags: [], + category: "Symbols", + description: "white exclamation mark", + unicode_version: "6.0", + }, + { + emoji: "❗", + aliases: ["exclamation", "heavy_exclamation_mark"], + tags: ["bang"], + category: "Symbols", + description: "red exclamation mark", + unicode_version: "5.2", + }, + { + emoji: "〰️", + aliases: ["wavy_dash"], + tags: [], + category: "Symbols", + description: "wavy dash", + unicode_version: "", + }, + { + emoji: "💱", + aliases: ["currency_exchange"], + tags: [], + category: "Symbols", + description: "currency exchange", + unicode_version: "6.0", + }, + { + emoji: "💲", + aliases: ["heavy_dollar_sign"], + tags: [], + category: "Symbols", + description: "heavy dollar sign", + unicode_version: "6.0", + }, + { + emoji: "⚕️", + aliases: ["medical_symbol"], + tags: [], + category: "Symbols", + description: "medical symbol", + unicode_version: "11.0", + }, + { + emoji: "♻️", + aliases: ["recycle"], + tags: ["environment", "green"], + category: "Symbols", + description: "recycling symbol", + unicode_version: "3.2", + }, + { + emoji: "⚜️", + aliases: ["fleur_de_lis"], + tags: [], + category: "Symbols", + description: "fleur-de-lis", + unicode_version: "4.1", + }, + { + emoji: "🔱", + aliases: ["trident"], + tags: [], + category: "Symbols", + description: "trident emblem", + unicode_version: "6.0", + }, + { + emoji: "📛", + aliases: ["name_badge"], + tags: [], + category: "Symbols", + description: "name badge", + unicode_version: "6.0", + }, + { + emoji: "🔰", + aliases: ["beginner"], + tags: [], + category: "Symbols", + description: "Japanese symbol for beginner", + unicode_version: "6.0", + }, + { + emoji: "⭕", + aliases: ["o"], + tags: [], + category: "Symbols", + description: "hollow red circle", + unicode_version: "5.2", + }, + { + emoji: "✅", + aliases: ["white_check_mark"], + tags: [], + category: "Symbols", + description: "check mark button", + unicode_version: "6.0", + }, + { + emoji: "☑️", + aliases: ["ballot_box_with_check"], + tags: [], + category: "Symbols", + description: "check box with check", + unicode_version: "", + }, + { + emoji: "✔️", + aliases: ["heavy_check_mark"], + tags: [], + category: "Symbols", + description: "check mark", + unicode_version: "", + }, + { + emoji: "❌", + aliases: ["x"], + tags: [], + category: "Symbols", + description: "cross mark", + unicode_version: "6.0", + }, + { + emoji: "❎", + aliases: ["negative_squared_cross_mark"], + tags: [], + category: "Symbols", + description: "cross mark button", + unicode_version: "6.0", + }, + { + emoji: "➰", + aliases: ["curly_loop"], + tags: [], + category: "Symbols", + description: "curly loop", + unicode_version: "6.0", + }, + { + emoji: "➿", + aliases: ["loop"], + tags: [], + category: "Symbols", + description: "double curly loop", + unicode_version: "6.0", + }, + { + emoji: "〽️", + aliases: ["part_alternation_mark"], + tags: [], + category: "Symbols", + description: "part alternation mark", + unicode_version: "3.2", + }, + { + emoji: "✳️", + aliases: ["eight_spoked_asterisk"], + tags: [], + category: "Symbols", + description: "eight-spoked asterisk", + unicode_version: "", + }, + { + emoji: "✴️", + aliases: ["eight_pointed_black_star"], + tags: [], + category: "Symbols", + description: "eight-pointed star", + unicode_version: "", + }, + { + emoji: "❇️", + aliases: ["sparkle"], + tags: [], + category: "Symbols", + description: "sparkle", + unicode_version: "", + }, + { + emoji: "©️", + aliases: ["copyright"], + tags: [], + category: "Symbols", + description: "copyright", + unicode_version: "", + }, + { + emoji: "®️", + aliases: ["registered"], + tags: [], + category: "Symbols", + description: "registered", + unicode_version: "", + }, + { + emoji: "™️", + aliases: ["tm"], + tags: ["trademark"], + category: "Symbols", + description: "trade mark", + unicode_version: "", + }, + { + emoji: "#️⃣", + aliases: ["hash"], + tags: ["number"], + category: "Symbols", + description: "keycap: #", + unicode_version: "", + }, + { + emoji: "*️⃣", + aliases: ["asterisk"], + tags: [], + category: "Symbols", + description: "keycap: *", + unicode_version: "", + }, + { + emoji: "0️⃣", + aliases: ["zero"], + tags: [], + category: "Symbols", + description: "keycap: 0", + unicode_version: "", + }, + { + emoji: "1️⃣", + aliases: ["one"], + tags: [], + category: "Symbols", + description: "keycap: 1", + unicode_version: "", + }, + { + emoji: "2️⃣", + aliases: ["two"], + tags: [], + category: "Symbols", + description: "keycap: 2", + unicode_version: "", + }, + { + emoji: "3️⃣", + aliases: ["three"], + tags: [], + category: "Symbols", + description: "keycap: 3", + unicode_version: "", + }, + { + emoji: "4️⃣", + aliases: ["four"], + tags: [], + category: "Symbols", + description: "keycap: 4", + unicode_version: "", + }, + { + emoji: "5️⃣", + aliases: ["five"], + tags: [], + category: "Symbols", + description: "keycap: 5", + unicode_version: "", + }, + { + emoji: "6️⃣", + aliases: ["six"], + tags: [], + category: "Symbols", + description: "keycap: 6", + unicode_version: "", + }, + { + emoji: "7️⃣", + aliases: ["seven"], + tags: [], + category: "Symbols", + description: "keycap: 7", + unicode_version: "", + }, + { + emoji: "8️⃣", + aliases: ["eight"], + tags: [], + category: "Symbols", + description: "keycap: 8", + unicode_version: "", + }, + { + emoji: "9️⃣", + aliases: ["nine"], + tags: [], + category: "Symbols", + description: "keycap: 9", + unicode_version: "", + }, + { + emoji: "🔟", + aliases: ["keycap_ten"], + tags: [], + category: "Symbols", + description: "keycap: 10", + unicode_version: "6.0", + }, + { + emoji: "🔠", + aliases: ["capital_abcd"], + tags: ["letters"], + category: "Symbols", + description: "input latin uppercase", + unicode_version: "6.0", + }, + { + emoji: "🔡", + aliases: ["abcd"], + tags: [], + category: "Symbols", + description: "input latin lowercase", + unicode_version: "6.0", + }, + { + emoji: "🔢", + aliases: ["1234"], + tags: ["numbers"], + category: "Symbols", + description: "input numbers", + unicode_version: "6.0", + }, + { + emoji: "🔣", + aliases: ["symbols"], + tags: [], + category: "Symbols", + description: "input symbols", + unicode_version: "6.0", + }, + { + emoji: "🔤", + aliases: ["abc"], + tags: ["alphabet"], + category: "Symbols", + description: "input latin letters", + unicode_version: "6.0", + }, + { + emoji: "🅰️", + aliases: ["a"], + tags: [], + category: "Symbols", + description: "A button (blood type)", + unicode_version: "6.0", + }, + { + emoji: "🆎", + aliases: ["ab"], + tags: [], + category: "Symbols", + description: "AB button (blood type)", + unicode_version: "6.0", + }, + { + emoji: "🅱️", + aliases: ["b"], + tags: [], + category: "Symbols", + description: "B button (blood type)", + unicode_version: "6.0", + }, + { + emoji: "🆑", + aliases: ["cl"], + tags: [], + category: "Symbols", + description: "CL button", + unicode_version: "6.0", + }, + { + emoji: "🆒", + aliases: ["cool"], + tags: [], + category: "Symbols", + description: "COOL button", + unicode_version: "6.0", + }, + { + emoji: "🆓", + aliases: ["free"], + tags: [], + category: "Symbols", + description: "FREE button", + unicode_version: "6.0", + }, + { + emoji: "ℹ️", + aliases: ["information_source"], + tags: [], + category: "Symbols", + description: "information", + unicode_version: "3.0", + }, + { + emoji: "🆔", + aliases: ["id"], + tags: [], + category: "Symbols", + description: "ID button", + unicode_version: "6.0", + }, + { + emoji: "Ⓜ️", + aliases: ["m"], + tags: [], + category: "Symbols", + description: "circled M", + unicode_version: "", + }, + { + emoji: "🆕", + aliases: ["new"], + tags: ["fresh"], + category: "Symbols", + description: "NEW button", + unicode_version: "6.0", + }, + { + emoji: "🆖", + aliases: ["ng"], + tags: [], + category: "Symbols", + description: "NG button", + unicode_version: "6.0", + }, + { + emoji: "🅾️", + aliases: ["o2"], + tags: [], + category: "Symbols", + description: "O button (blood type)", + unicode_version: "6.0", + }, + { + emoji: "🆗", + aliases: ["ok"], + tags: ["yes"], + category: "Symbols", + description: "OK button", + unicode_version: "6.0", + }, + { + emoji: "🅿️", + aliases: ["parking"], + tags: [], + category: "Symbols", + description: "P button", + unicode_version: "5.2", + }, + { + emoji: "🆘", + aliases: ["sos"], + tags: ["help", "emergency"], + category: "Symbols", + description: "SOS button", + unicode_version: "6.0", + }, + { + emoji: "🆙", + aliases: ["up"], + tags: [], + category: "Symbols", + description: "UP! button", + unicode_version: "6.0", + }, + { + emoji: "🆚", + aliases: ["vs"], + tags: [], + category: "Symbols", + description: "VS button", + unicode_version: "6.0", + }, + { + emoji: "🈁", + aliases: ["koko"], + tags: [], + category: "Symbols", + description: "Japanese “here” button", + unicode_version: "6.0", + }, + { + emoji: "🈂️", + aliases: ["sa"], + tags: [], + category: "Symbols", + description: "Japanese “service charge” button", + unicode_version: "6.0", + }, + { + emoji: "🈷️", + aliases: ["u6708"], + tags: [], + category: "Symbols", + description: "Japanese “monthly amount” button", + unicode_version: "6.0", + }, + { + emoji: "🈶", + aliases: ["u6709"], + tags: [], + category: "Symbols", + description: "Japanese “not free of charge” button", + unicode_version: "6.0", + }, + { + emoji: "🈯", + aliases: ["u6307"], + tags: [], + category: "Symbols", + description: "Japanese “reserved” button", + unicode_version: "", + }, + { + emoji: "🉐", + aliases: ["ideograph_advantage"], + tags: [], + category: "Symbols", + description: "Japanese “bargain” button", + unicode_version: "6.0", + }, + { + emoji: "🈹", + aliases: ["u5272"], + tags: [], + category: "Symbols", + description: "Japanese “discount” button", + unicode_version: "6.0", + }, + { + emoji: "🈚", + aliases: ["u7121"], + tags: [], + category: "Symbols", + description: "Japanese “free of charge” button", + unicode_version: "", + }, + { + emoji: "🈲", + aliases: ["u7981"], + tags: [], + category: "Symbols", + description: "Japanese “prohibited” button", + unicode_version: "6.0", + }, + { + emoji: "🉑", + aliases: ["accept"], + tags: [], + category: "Symbols", + description: "Japanese “acceptable” button", + unicode_version: "6.0", + }, + { + emoji: "🈸", + aliases: ["u7533"], + tags: [], + category: "Symbols", + description: "Japanese “application” button", + unicode_version: "6.0", + }, + { + emoji: "🈴", + aliases: ["u5408"], + tags: [], + category: "Symbols", + description: "Japanese “passing grade” button", + unicode_version: "6.0", + }, + { + emoji: "🈳", + aliases: ["u7a7a"], + tags: [], + category: "Symbols", + description: "Japanese “vacancy” button", + unicode_version: "6.0", + }, + { + emoji: "㊗️", + aliases: ["congratulations"], + tags: [], + category: "Symbols", + description: "Japanese “congratulations” button", + unicode_version: "", + }, + { + emoji: "㊙️", + aliases: ["secret"], + tags: [], + category: "Symbols", + description: "Japanese “secret” button", + unicode_version: "", + }, + { + emoji: "🈺", + aliases: ["u55b6"], + tags: [], + category: "Symbols", + description: "Japanese “open for business” button", + unicode_version: "6.0", + }, + { + emoji: "🈵", + aliases: ["u6e80"], + tags: [], + category: "Symbols", + description: "Japanese “no vacancy” button", + unicode_version: "6.0", + }, + { + emoji: "🔴", + aliases: ["red_circle"], + tags: [], + category: "Symbols", + description: "red circle", + unicode_version: "6.0", + }, + { + emoji: "🟠", + aliases: ["orange_circle"], + tags: [], + category: "Symbols", + description: "orange circle", + unicode_version: "12.0", + }, + { + emoji: "🟡", + aliases: ["yellow_circle"], + tags: [], + category: "Symbols", + description: "yellow circle", + unicode_version: "12.0", + }, + { + emoji: "🟢", + aliases: ["green_circle"], + tags: [], + category: "Symbols", + description: "green circle", + unicode_version: "12.0", + }, + { + emoji: "🔵", + aliases: ["large_blue_circle"], + tags: [], + category: "Symbols", + description: "blue circle", + unicode_version: "6.0", + }, + { + emoji: "🟣", + aliases: ["purple_circle"], + tags: [], + category: "Symbols", + description: "purple circle", + unicode_version: "12.0", + }, + { + emoji: "🟤", + aliases: ["brown_circle"], + tags: [], + category: "Symbols", + description: "brown circle", + unicode_version: "12.0", + }, + { + emoji: "⚫", + aliases: ["black_circle"], + tags: [], + category: "Symbols", + description: "black circle", + unicode_version: "4.1", + }, + { + emoji: "⚪", + aliases: ["white_circle"], + tags: [], + category: "Symbols", + description: "white circle", + unicode_version: "4.1", + }, + { + emoji: "🟥", + aliases: ["red_square"], + tags: [], + category: "Symbols", + description: "red square", + unicode_version: "12.0", + }, + { + emoji: "🟧", + aliases: ["orange_square"], + tags: [], + category: "Symbols", + description: "orange square", + unicode_version: "12.0", + }, + { + emoji: "🟨", + aliases: ["yellow_square"], + tags: [], + category: "Symbols", + description: "yellow square", + unicode_version: "12.0", + }, + { + emoji: "🟩", + aliases: ["green_square"], + tags: [], + category: "Symbols", + description: "green square", + unicode_version: "12.0", + }, + { + emoji: "🟦", + aliases: ["blue_square"], + tags: [], + category: "Symbols", + description: "blue square", + unicode_version: "12.0", + }, + { + emoji: "🟪", + aliases: ["purple_square"], + tags: [], + category: "Symbols", + description: "purple square", + unicode_version: "12.0", + }, + { + emoji: "🟫", + aliases: ["brown_square"], + tags: [], + category: "Symbols", + description: "brown square", + unicode_version: "12.0", + }, + { + emoji: "⬛", + aliases: ["black_large_square"], + tags: [], + category: "Symbols", + description: "black large square", + unicode_version: "5.1", + }, + { + emoji: "⬜", + aliases: ["white_large_square"], + tags: [], + category: "Symbols", + description: "white large square", + unicode_version: "5.1", + }, + { + emoji: "◼️", + aliases: ["black_medium_square"], + tags: [], + category: "Symbols", + description: "black medium square", + unicode_version: "3.2", + }, + { + emoji: "◻️", + aliases: ["white_medium_square"], + tags: [], + category: "Symbols", + description: "white medium square", + unicode_version: "3.2", + }, + { + emoji: "◾", + aliases: ["black_medium_small_square"], + tags: [], + category: "Symbols", + description: "black medium-small square", + unicode_version: "3.2", + }, + { + emoji: "◽", + aliases: ["white_medium_small_square"], + tags: [], + category: "Symbols", + description: "white medium-small square", + unicode_version: "3.2", + }, + { + emoji: "▪️", + aliases: ["black_small_square"], + tags: [], + category: "Symbols", + description: "black small square", + unicode_version: "", + }, + { + emoji: "▫️", + aliases: ["white_small_square"], + tags: [], + category: "Symbols", + description: "white small square", + unicode_version: "", + }, + { + emoji: "🔶", + aliases: ["large_orange_diamond"], + tags: [], + category: "Symbols", + description: "large orange diamond", + unicode_version: "6.0", + }, + { + emoji: "🔷", + aliases: ["large_blue_diamond"], + tags: [], + category: "Symbols", + description: "large blue diamond", + unicode_version: "6.0", + }, + { + emoji: "🔸", + aliases: ["small_orange_diamond"], + tags: [], + category: "Symbols", + description: "small orange diamond", + unicode_version: "6.0", + }, + { + emoji: "🔹", + aliases: ["small_blue_diamond"], + tags: [], + category: "Symbols", + description: "small blue diamond", + unicode_version: "6.0", + }, + { + emoji: "🔺", + aliases: ["small_red_triangle"], + tags: [], + category: "Symbols", + description: "red triangle pointed up", + unicode_version: "6.0", + }, + { + emoji: "🔻", + aliases: ["small_red_triangle_down"], + tags: [], + category: "Symbols", + description: "red triangle pointed down", + unicode_version: "6.0", + }, + { + emoji: "💠", + aliases: ["diamond_shape_with_a_dot_inside"], + tags: [], + category: "Symbols", + description: "diamond with a dot", + unicode_version: "6.0", + }, + { + emoji: "🔘", + aliases: ["radio_button"], + tags: [], + category: "Symbols", + description: "radio button", + unicode_version: "6.0", + }, + { + emoji: "🔳", + aliases: ["white_square_button"], + tags: [], + category: "Symbols", + description: "white square button", + unicode_version: "6.0", + }, + { + emoji: "🔲", + aliases: ["black_square_button"], + tags: [], + category: "Symbols", + description: "black square button", + unicode_version: "6.0", + }, + { + emoji: "🏁", + aliases: ["checkered_flag"], + tags: ["milestone", "finish"], + category: "Flags", + description: "chequered flag", + unicode_version: "6.0", + }, + { + emoji: "🚩", + aliases: ["triangular_flag_on_post"], + tags: [], + category: "Flags", + description: "triangular flag", + unicode_version: "6.0", + }, + { + emoji: "🎌", + aliases: ["crossed_flags"], + tags: [], + category: "Flags", + description: "crossed flags", + unicode_version: "6.0", + }, + { + emoji: "🏴", + aliases: ["black_flag"], + tags: [], + category: "Flags", + description: "black flag", + unicode_version: "7.0", + }, + { + emoji: "🏳️", + aliases: ["white_flag"], + tags: [], + category: "Flags", + description: "white flag", + unicode_version: "7.0", + }, + { + emoji: "🏳️‍🌈", + aliases: ["rainbow_flag"], + tags: ["pride"], + category: "Flags", + description: "rainbow flag", + unicode_version: "6.0", + }, + { + emoji: "🏳️‍⚧️", + aliases: ["transgender_flag"], + tags: [], + category: "Flags", + description: "transgender flag", + unicode_version: "13.0", + }, + { + emoji: "🏴‍☠️", + aliases: ["pirate_flag"], + tags: [], + category: "Flags", + description: "pirate flag", + unicode_version: "11.0", + }, + { + emoji: "🇦🇨", + aliases: ["ascension_island"], + tags: [], + category: "Flags", + description: "flag: Ascension Island", + unicode_version: "11.0", + }, + { + emoji: "🇦🇩", + aliases: ["andorra"], + tags: [], + category: "Flags", + description: "flag: Andorra", + unicode_version: "6.0", + }, + { + emoji: "🇦🇪", + aliases: ["united_arab_emirates"], + tags: [], + category: "Flags", + description: "flag: United Arab Emirates", + unicode_version: "6.0", + }, + { + emoji: "🇦🇫", + aliases: ["afghanistan"], + tags: [], + category: "Flags", + description: "flag: Afghanistan", + unicode_version: "6.0", + }, + { + emoji: "🇦🇬", + aliases: ["antigua_barbuda"], + tags: [], + category: "Flags", + description: "flag: Antigua & Barbuda", + unicode_version: "6.0", + }, + { + emoji: "🇦🇮", + aliases: ["anguilla"], + tags: [], + category: "Flags", + description: "flag: Anguilla", + unicode_version: "6.0", + }, + { + emoji: "🇦🇱", + aliases: ["albania"], + tags: [], + category: "Flags", + description: "flag: Albania", + unicode_version: "6.0", + }, + { + emoji: "🇦🇲", + aliases: ["armenia"], + tags: [], + category: "Flags", + description: "flag: Armenia", + unicode_version: "6.0", + }, + { + emoji: "🇦🇴", + aliases: ["angola"], + tags: [], + category: "Flags", + description: "flag: Angola", + unicode_version: "6.0", + }, + { + emoji: "🇦🇶", + aliases: ["antarctica"], + tags: [], + category: "Flags", + description: "flag: Antarctica", + unicode_version: "6.0", + }, + { + emoji: "🇦🇷", + aliases: ["argentina"], + tags: [], + category: "Flags", + description: "flag: Argentina", + unicode_version: "6.0", + }, + { + emoji: "🇦🇸", + aliases: ["american_samoa"], + tags: [], + category: "Flags", + description: "flag: American Samoa", + unicode_version: "6.0", + }, + { + emoji: "🇦🇹", + aliases: ["austria"], + tags: [], + category: "Flags", + description: "flag: Austria", + unicode_version: "6.0", + }, + { + emoji: "🇦🇺", + aliases: ["australia"], + tags: [], + category: "Flags", + description: "flag: Australia", + unicode_version: "6.0", + }, + { + emoji: "🇦🇼", + aliases: ["aruba"], + tags: [], + category: "Flags", + description: "flag: Aruba", + unicode_version: "6.0", + }, + { + emoji: "🇦🇽", + aliases: ["aland_islands"], + tags: [], + category: "Flags", + description: "flag: Åland Islands", + unicode_version: "6.0", + }, + { + emoji: "🇦🇿", + aliases: ["azerbaijan"], + tags: [], + category: "Flags", + description: "flag: Azerbaijan", + unicode_version: "6.0", + }, + { + emoji: "🇧🇦", + aliases: ["bosnia_herzegovina"], + tags: [], + category: "Flags", + description: "flag: Bosnia & Herzegovina", + unicode_version: "6.0", + }, + { + emoji: "🇧🇧", + aliases: ["barbados"], + tags: [], + category: "Flags", + description: "flag: Barbados", + unicode_version: "6.0", + }, + { + emoji: "🇧🇩", + aliases: ["bangladesh"], + tags: [], + category: "Flags", + description: "flag: Bangladesh", + unicode_version: "6.0", + }, + { + emoji: "🇧🇪", + aliases: ["belgium"], + tags: [], + category: "Flags", + description: "flag: Belgium", + unicode_version: "6.0", + }, + { + emoji: "🇧🇫", + aliases: ["burkina_faso"], + tags: [], + category: "Flags", + description: "flag: Burkina Faso", + unicode_version: "6.0", + }, + { + emoji: "🇧🇬", + aliases: ["bulgaria"], + tags: [], + category: "Flags", + description: "flag: Bulgaria", + unicode_version: "6.0", + }, + { + emoji: "🇧🇭", + aliases: ["bahrain"], + tags: [], + category: "Flags", + description: "flag: Bahrain", + unicode_version: "6.0", + }, + { + emoji: "🇧🇮", + aliases: ["burundi"], + tags: [], + category: "Flags", + description: "flag: Burundi", + unicode_version: "6.0", + }, + { + emoji: "🇧🇯", + aliases: ["benin"], + tags: [], + category: "Flags", + description: "flag: Benin", + unicode_version: "6.0", + }, + { + emoji: "🇧🇱", + aliases: ["st_barthelemy"], + tags: [], + category: "Flags", + description: "flag: St. Barthélemy", + unicode_version: "6.0", + }, + { + emoji: "🇧🇲", + aliases: ["bermuda"], + tags: [], + category: "Flags", + description: "flag: Bermuda", + unicode_version: "6.0", + }, + { + emoji: "🇧🇳", + aliases: ["brunei"], + tags: [], + category: "Flags", + description: "flag: Brunei", + unicode_version: "6.0", + }, + { + emoji: "🇧🇴", + aliases: ["bolivia"], + tags: [], + category: "Flags", + description: "flag: Bolivia", + unicode_version: "6.0", + }, + { + emoji: "🇧🇶", + aliases: ["caribbean_netherlands"], + tags: [], + category: "Flags", + description: "flag: Caribbean Netherlands", + unicode_version: "6.0", + }, + { + emoji: "🇧🇷", + aliases: ["brazil"], + tags: [], + category: "Flags", + description: "flag: Brazil", + unicode_version: "6.0", + }, + { + emoji: "🇧🇸", + aliases: ["bahamas"], + tags: [], + category: "Flags", + description: "flag: Bahamas", + unicode_version: "6.0", + }, + { + emoji: "🇧🇹", + aliases: ["bhutan"], + tags: [], + category: "Flags", + description: "flag: Bhutan", + unicode_version: "6.0", + }, + { + emoji: "🇧🇻", + aliases: ["bouvet_island"], + tags: [], + category: "Flags", + description: "flag: Bouvet Island", + unicode_version: "11.0", + }, + { + emoji: "🇧🇼", + aliases: ["botswana"], + tags: [], + category: "Flags", + description: "flag: Botswana", + unicode_version: "6.0", + }, + { + emoji: "🇧🇾", + aliases: ["belarus"], + tags: [], + category: "Flags", + description: "flag: Belarus", + unicode_version: "6.0", + }, + { + emoji: "🇧🇿", + aliases: ["belize"], + tags: [], + category: "Flags", + description: "flag: Belize", + unicode_version: "6.0", + }, + { + emoji: "🇨🇦", + aliases: ["canada"], + tags: [], + category: "Flags", + description: "flag: Canada", + unicode_version: "6.0", + }, + { + emoji: "🇨🇨", + aliases: ["cocos_islands"], + tags: ["keeling"], + category: "Flags", + description: "flag: Cocos (Keeling) Islands", + unicode_version: "6.0", + }, + { + emoji: "🇨🇩", + aliases: ["congo_kinshasa"], + tags: [], + category: "Flags", + description: "flag: Congo - Kinshasa", + unicode_version: "6.0", + }, + { + emoji: "🇨🇫", + aliases: ["central_african_republic"], + tags: [], + category: "Flags", + description: "flag: Central African Republic", + unicode_version: "6.0", + }, + { + emoji: "🇨🇬", + aliases: ["congo_brazzaville"], + tags: [], + category: "Flags", + description: "flag: Congo - Brazzaville", + unicode_version: "6.0", + }, + { + emoji: "🇨🇭", + aliases: ["switzerland"], + tags: [], + category: "Flags", + description: "flag: Switzerland", + unicode_version: "6.0", + }, + { + emoji: "🇨🇮", + aliases: ["cote_divoire"], + tags: ["ivory"], + category: "Flags", + description: "flag: Côte d’Ivoire", + unicode_version: "6.0", + }, + { + emoji: "🇨🇰", + aliases: ["cook_islands"], + tags: [], + category: "Flags", + description: "flag: Cook Islands", + unicode_version: "6.0", + }, + { + emoji: "🇨🇱", + aliases: ["chile"], + tags: [], + category: "Flags", + description: "flag: Chile", + unicode_version: "6.0", + }, + { + emoji: "🇨🇲", + aliases: ["cameroon"], + tags: [], + category: "Flags", + description: "flag: Cameroon", + unicode_version: "6.0", + }, + { + emoji: "🇨🇳", + aliases: ["cn"], + tags: ["china"], + category: "Flags", + description: "flag: China", + unicode_version: "6.0", + }, + { + emoji: "🇨🇴", + aliases: ["colombia"], + tags: [], + category: "Flags", + description: "flag: Colombia", + unicode_version: "6.0", + }, + { + emoji: "🇨🇵", + aliases: ["clipperton_island"], + tags: [], + category: "Flags", + description: "flag: Clipperton Island", + unicode_version: "11.0", + }, + { + emoji: "🇨🇷", + aliases: ["costa_rica"], + tags: [], + category: "Flags", + description: "flag: Costa Rica", + unicode_version: "6.0", + }, + { + emoji: "🇨🇺", + aliases: ["cuba"], + tags: [], + category: "Flags", + description: "flag: Cuba", + unicode_version: "6.0", + }, + { + emoji: "🇨🇻", + aliases: ["cape_verde"], + tags: [], + category: "Flags", + description: "flag: Cape Verde", + unicode_version: "6.0", + }, + { + emoji: "🇨🇼", + aliases: ["curacao"], + tags: [], + category: "Flags", + description: "flag: Curaçao", + unicode_version: "6.0", + }, + { + emoji: "🇨🇽", + aliases: ["christmas_island"], + tags: [], + category: "Flags", + description: "flag: Christmas Island", + unicode_version: "6.0", + }, + { + emoji: "🇨🇾", + aliases: ["cyprus"], + tags: [], + category: "Flags", + description: "flag: Cyprus", + unicode_version: "6.0", + }, + { + emoji: "🇨🇿", + aliases: ["czech_republic"], + tags: [], + category: "Flags", + description: "flag: Czechia", + unicode_version: "6.0", + }, + { + emoji: "🇩🇪", + aliases: ["de"], + tags: ["flag", "germany"], + category: "Flags", + description: "flag: Germany", + unicode_version: "6.0", + }, + { + emoji: "🇩🇬", + aliases: ["diego_garcia"], + tags: [], + category: "Flags", + description: "flag: Diego Garcia", + unicode_version: "11.0", + }, + { + emoji: "🇩🇯", + aliases: ["djibouti"], + tags: [], + category: "Flags", + description: "flag: Djibouti", + unicode_version: "6.0", + }, + { + emoji: "🇩🇰", + aliases: ["denmark"], + tags: [], + category: "Flags", + description: "flag: Denmark", + unicode_version: "6.0", + }, + { + emoji: "🇩🇲", + aliases: ["dominica"], + tags: [], + category: "Flags", + description: "flag: Dominica", + unicode_version: "6.0", + }, + { + emoji: "🇩🇴", + aliases: ["dominican_republic"], + tags: [], + category: "Flags", + description: "flag: Dominican Republic", + unicode_version: "6.0", + }, + { + emoji: "🇩🇿", + aliases: ["algeria"], + tags: [], + category: "Flags", + description: "flag: Algeria", + unicode_version: "6.0", + }, + { + emoji: "🇪🇦", + aliases: ["ceuta_melilla"], + tags: [], + category: "Flags", + description: "flag: Ceuta & Melilla", + unicode_version: "11.0", + }, + { + emoji: "🇪🇨", + aliases: ["ecuador"], + tags: [], + category: "Flags", + description: "flag: Ecuador", + unicode_version: "6.0", + }, + { + emoji: "🇪🇪", + aliases: ["estonia"], + tags: [], + category: "Flags", + description: "flag: Estonia", + unicode_version: "6.0", + }, + { + emoji: "🇪🇬", + aliases: ["egypt"], + tags: [], + category: "Flags", + description: "flag: Egypt", + unicode_version: "6.0", + }, + { + emoji: "🇪🇭", + aliases: ["western_sahara"], + tags: [], + category: "Flags", + description: "flag: Western Sahara", + unicode_version: "6.0", + }, + { + emoji: "🇪🇷", + aliases: ["eritrea"], + tags: [], + category: "Flags", + description: "flag: Eritrea", + unicode_version: "6.0", + }, + { + emoji: "🇪🇸", + aliases: ["es"], + tags: ["spain"], + category: "Flags", + description: "flag: Spain", + unicode_version: "6.0", + }, + { + emoji: "🇪🇹", + aliases: ["ethiopia"], + tags: [], + category: "Flags", + description: "flag: Ethiopia", + unicode_version: "6.0", + }, + { + emoji: "🇪🇺", + aliases: ["eu", "european_union"], + tags: [], + category: "Flags", + description: "flag: European Union", + unicode_version: "6.0", + }, + { + emoji: "🇫🇮", + aliases: ["finland"], + tags: [], + category: "Flags", + description: "flag: Finland", + unicode_version: "6.0", + }, + { + emoji: "🇫🇯", + aliases: ["fiji"], + tags: [], + category: "Flags", + description: "flag: Fiji", + unicode_version: "6.0", + }, + { + emoji: "🇫🇰", + aliases: ["falkland_islands"], + tags: [], + category: "Flags", + description: "flag: Falkland Islands", + unicode_version: "6.0", + }, + { + emoji: "🇫🇲", + aliases: ["micronesia"], + tags: [], + category: "Flags", + description: "flag: Micronesia", + unicode_version: "6.0", + }, + { + emoji: "🇫🇴", + aliases: ["faroe_islands"], + tags: [], + category: "Flags", + description: "flag: Faroe Islands", + unicode_version: "6.0", + }, + { + emoji: "🇫🇷", + aliases: ["fr"], + tags: ["france", "french"], + category: "Flags", + description: "flag: France", + unicode_version: "6.0", + }, + { + emoji: "🇬🇦", + aliases: ["gabon"], + tags: [], + category: "Flags", + description: "flag: Gabon", + unicode_version: "6.0", + }, + { + emoji: "🇬🇧", + aliases: ["gb", "uk"], + tags: ["flag", "british"], + category: "Flags", + description: "flag: United Kingdom", + unicode_version: "6.0", + }, + { + emoji: "🇬🇩", + aliases: ["grenada"], + tags: [], + category: "Flags", + description: "flag: Grenada", + unicode_version: "6.0", + }, + { + emoji: "🇬🇪", + aliases: ["georgia"], + tags: [], + category: "Flags", + description: "flag: Georgia", + unicode_version: "6.0", + }, + { + emoji: "🇬🇫", + aliases: ["french_guiana"], + tags: [], + category: "Flags", + description: "flag: French Guiana", + unicode_version: "6.0", + }, + { + emoji: "🇬🇬", + aliases: ["guernsey"], + tags: [], + category: "Flags", + description: "flag: Guernsey", + unicode_version: "6.0", + }, + { + emoji: "🇬🇭", + aliases: ["ghana"], + tags: [], + category: "Flags", + description: "flag: Ghana", + unicode_version: "6.0", + }, + { + emoji: "🇬🇮", + aliases: ["gibraltar"], + tags: [], + category: "Flags", + description: "flag: Gibraltar", + unicode_version: "6.0", + }, + { + emoji: "🇬🇱", + aliases: ["greenland"], + tags: [], + category: "Flags", + description: "flag: Greenland", + unicode_version: "6.0", + }, + { + emoji: "🇬🇲", + aliases: ["gambia"], + tags: [], + category: "Flags", + description: "flag: Gambia", + unicode_version: "6.0", + }, + { + emoji: "🇬🇳", + aliases: ["guinea"], + tags: [], + category: "Flags", + description: "flag: Guinea", + unicode_version: "6.0", + }, + { + emoji: "🇬🇵", + aliases: ["guadeloupe"], + tags: [], + category: "Flags", + description: "flag: Guadeloupe", + unicode_version: "6.0", + }, + { + emoji: "🇬🇶", + aliases: ["equatorial_guinea"], + tags: [], + category: "Flags", + description: "flag: Equatorial Guinea", + unicode_version: "6.0", + }, + { + emoji: "🇬🇷", + aliases: ["greece"], + tags: [], + category: "Flags", + description: "flag: Greece", + unicode_version: "6.0", + }, + { + emoji: "🇬🇸", + aliases: ["south_georgia_south_sandwich_islands"], + tags: [], + category: "Flags", + description: "flag: South Georgia & South Sandwich Islands", + unicode_version: "6.0", + }, + { + emoji: "🇬🇹", + aliases: ["guatemala"], + tags: [], + category: "Flags", + description: "flag: Guatemala", + unicode_version: "6.0", + }, + { + emoji: "🇬🇺", + aliases: ["guam"], + tags: [], + category: "Flags", + description: "flag: Guam", + unicode_version: "6.0", + }, + { + emoji: "🇬🇼", + aliases: ["guinea_bissau"], + tags: [], + category: "Flags", + description: "flag: Guinea-Bissau", + unicode_version: "6.0", + }, + { + emoji: "🇬🇾", + aliases: ["guyana"], + tags: [], + category: "Flags", + description: "flag: Guyana", + unicode_version: "6.0", + }, + { + emoji: "🇭🇰", + aliases: ["hong_kong"], + tags: [], + category: "Flags", + description: "flag: Hong Kong SAR China", + unicode_version: "6.0", + }, + { + emoji: "🇭🇲", + aliases: ["heard_mcdonald_islands"], + tags: [], + category: "Flags", + description: "flag: Heard & McDonald Islands", + unicode_version: "11.0", + }, + { + emoji: "🇭🇳", + aliases: ["honduras"], + tags: [], + category: "Flags", + description: "flag: Honduras", + unicode_version: "6.0", + }, + { + emoji: "🇭🇷", + aliases: ["croatia"], + tags: [], + category: "Flags", + description: "flag: Croatia", + unicode_version: "6.0", + }, + { + emoji: "🇭🇹", + aliases: ["haiti"], + tags: [], + category: "Flags", + description: "flag: Haiti", + unicode_version: "6.0", + }, + { + emoji: "🇭🇺", + aliases: ["hungary"], + tags: [], + category: "Flags", + description: "flag: Hungary", + unicode_version: "6.0", + }, + { + emoji: "🇮🇨", + aliases: ["canary_islands"], + tags: [], + category: "Flags", + description: "flag: Canary Islands", + unicode_version: "6.0", + }, + { + emoji: "🇮🇩", + aliases: ["indonesia"], + tags: [], + category: "Flags", + description: "flag: Indonesia", + unicode_version: "6.0", + }, + { + emoji: "🇮🇪", + aliases: ["ireland"], + tags: [], + category: "Flags", + description: "flag: Ireland", + unicode_version: "6.0", + }, + { + emoji: "🇮🇱", + aliases: ["israel"], + tags: [], + category: "Flags", + description: "flag: Israel", + unicode_version: "6.0", + }, + { + emoji: "🇮🇲", + aliases: ["isle_of_man"], + tags: [], + category: "Flags", + description: "flag: Isle of Man", + unicode_version: "6.0", + }, + { + emoji: "🇮🇳", + aliases: ["india"], + tags: [], + category: "Flags", + description: "flag: India", + unicode_version: "6.0", + }, + { + emoji: "🇮🇴", + aliases: ["british_indian_ocean_territory"], + tags: [], + category: "Flags", + description: "flag: British Indian Ocean Territory", + unicode_version: "6.0", + }, + { + emoji: "🇮🇶", + aliases: ["iraq"], + tags: [], + category: "Flags", + description: "flag: Iraq", + unicode_version: "6.0", + }, + { + emoji: "🇮🇷", + aliases: ["iran"], + tags: [], + category: "Flags", + description: "flag: Iran", + unicode_version: "6.0", + }, + { + emoji: "🇮🇸", + aliases: ["iceland"], + tags: [], + category: "Flags", + description: "flag: Iceland", + unicode_version: "6.0", + }, + { + emoji: "🇮🇹", + aliases: ["it"], + tags: ["italy"], + category: "Flags", + description: "flag: Italy", + unicode_version: "6.0", + }, + { + emoji: "🇯🇪", + aliases: ["jersey"], + tags: [], + category: "Flags", + description: "flag: Jersey", + unicode_version: "6.0", + }, + { + emoji: "🇯🇲", + aliases: ["jamaica"], + tags: [], + category: "Flags", + description: "flag: Jamaica", + unicode_version: "6.0", + }, + { + emoji: "🇯🇴", + aliases: ["jordan"], + tags: [], + category: "Flags", + description: "flag: Jordan", + unicode_version: "6.0", + }, + { + emoji: "🇯🇵", + aliases: ["jp"], + tags: ["japan"], + category: "Flags", + description: "flag: Japan", + unicode_version: "6.0", + }, + { + emoji: "🇰🇪", + aliases: ["kenya"], + tags: [], + category: "Flags", + description: "flag: Kenya", + unicode_version: "6.0", + }, + { + emoji: "🇰🇬", + aliases: ["kyrgyzstan"], + tags: [], + category: "Flags", + description: "flag: Kyrgyzstan", + unicode_version: "6.0", + }, + { + emoji: "🇰🇭", + aliases: ["cambodia"], + tags: [], + category: "Flags", + description: "flag: Cambodia", + unicode_version: "6.0", + }, + { + emoji: "🇰🇮", + aliases: ["kiribati"], + tags: [], + category: "Flags", + description: "flag: Kiribati", + unicode_version: "6.0", + }, + { + emoji: "🇰🇲", + aliases: ["comoros"], + tags: [], + category: "Flags", + description: "flag: Comoros", + unicode_version: "6.0", + }, + { + emoji: "🇰🇳", + aliases: ["st_kitts_nevis"], + tags: [], + category: "Flags", + description: "flag: St. Kitts & Nevis", + unicode_version: "6.0", + }, + { + emoji: "🇰🇵", + aliases: ["north_korea"], + tags: [], + category: "Flags", + description: "flag: North Korea", + unicode_version: "6.0", + }, + { + emoji: "🇰🇷", + aliases: ["kr"], + tags: ["korea"], + category: "Flags", + description: "flag: South Korea", + unicode_version: "6.0", + }, + { + emoji: "🇰🇼", + aliases: ["kuwait"], + tags: [], + category: "Flags", + description: "flag: Kuwait", + unicode_version: "6.0", + }, + { + emoji: "🇰🇾", + aliases: ["cayman_islands"], + tags: [], + category: "Flags", + description: "flag: Cayman Islands", + unicode_version: "6.0", + }, + { + emoji: "🇰🇿", + aliases: ["kazakhstan"], + tags: [], + category: "Flags", + description: "flag: Kazakhstan", + unicode_version: "6.0", + }, + { + emoji: "🇱🇦", + aliases: ["laos"], + tags: [], + category: "Flags", + description: "flag: Laos", + unicode_version: "6.0", + }, + { + emoji: "🇱🇧", + aliases: ["lebanon"], + tags: [], + category: "Flags", + description: "flag: Lebanon", + unicode_version: "6.0", + }, + { + emoji: "🇱🇨", + aliases: ["st_lucia"], + tags: [], + category: "Flags", + description: "flag: St. Lucia", + unicode_version: "6.0", + }, + { + emoji: "🇱🇮", + aliases: ["liechtenstein"], + tags: [], + category: "Flags", + description: "flag: Liechtenstein", + unicode_version: "6.0", + }, + { + emoji: "🇱🇰", + aliases: ["sri_lanka"], + tags: [], + category: "Flags", + description: "flag: Sri Lanka", + unicode_version: "6.0", + }, + { + emoji: "🇱🇷", + aliases: ["liberia"], + tags: [], + category: "Flags", + description: "flag: Liberia", + unicode_version: "6.0", + }, + { + emoji: "🇱🇸", + aliases: ["lesotho"], + tags: [], + category: "Flags", + description: "flag: Lesotho", + unicode_version: "6.0", + }, + { + emoji: "🇱🇹", + aliases: ["lithuania"], + tags: [], + category: "Flags", + description: "flag: Lithuania", + unicode_version: "6.0", + }, + { + emoji: "🇱🇺", + aliases: ["luxembourg"], + tags: [], + category: "Flags", + description: "flag: Luxembourg", + unicode_version: "6.0", + }, + { + emoji: "🇱🇻", + aliases: ["latvia"], + tags: [], + category: "Flags", + description: "flag: Latvia", + unicode_version: "6.0", + }, + { + emoji: "🇱🇾", + aliases: ["libya"], + tags: [], + category: "Flags", + description: "flag: Libya", + unicode_version: "6.0", + }, + { + emoji: "🇲🇦", + aliases: ["morocco"], + tags: [], + category: "Flags", + description: "flag: Morocco", + unicode_version: "6.0", + }, + { + emoji: "🇲🇨", + aliases: ["monaco"], + tags: [], + category: "Flags", + description: "flag: Monaco", + unicode_version: "6.0", + }, + { + emoji: "🇲🇩", + aliases: ["moldova"], + tags: [], + category: "Flags", + description: "flag: Moldova", + unicode_version: "6.0", + }, + { + emoji: "🇲🇪", + aliases: ["montenegro"], + tags: [], + category: "Flags", + description: "flag: Montenegro", + unicode_version: "6.0", + }, + { + emoji: "🇲🇫", + aliases: ["st_martin"], + tags: [], + category: "Flags", + description: "flag: St. Martin", + unicode_version: "11.0", + }, + { + emoji: "🇲🇬", + aliases: ["madagascar"], + tags: [], + category: "Flags", + description: "flag: Madagascar", + unicode_version: "6.0", + }, + { + emoji: "🇲🇭", + aliases: ["marshall_islands"], + tags: [], + category: "Flags", + description: "flag: Marshall Islands", + unicode_version: "6.0", + }, + { + emoji: "🇲🇰", + aliases: ["macedonia"], + tags: [], + category: "Flags", + description: "flag: North Macedonia", + unicode_version: "6.0", + }, + { + emoji: "🇲🇱", + aliases: ["mali"], + tags: [], + category: "Flags", + description: "flag: Mali", + unicode_version: "6.0", + }, + { + emoji: "🇲🇲", + aliases: ["myanmar"], + tags: ["burma"], + category: "Flags", + description: "flag: Myanmar (Burma)", + unicode_version: "6.0", + }, + { + emoji: "🇲🇳", + aliases: ["mongolia"], + tags: [], + category: "Flags", + description: "flag: Mongolia", + unicode_version: "6.0", + }, + { + emoji: "🇲🇴", + aliases: ["macau"], + tags: [], + category: "Flags", + description: "flag: Macao SAR China", + unicode_version: "6.0", + }, + { + emoji: "🇲🇵", + aliases: ["northern_mariana_islands"], + tags: [], + category: "Flags", + description: "flag: Northern Mariana Islands", + unicode_version: "6.0", + }, + { + emoji: "🇲🇶", + aliases: ["martinique"], + tags: [], + category: "Flags", + description: "flag: Martinique", + unicode_version: "6.0", + }, + { + emoji: "🇲🇷", + aliases: ["mauritania"], + tags: [], + category: "Flags", + description: "flag: Mauritania", + unicode_version: "6.0", + }, + { + emoji: "🇲🇸", + aliases: ["montserrat"], + tags: [], + category: "Flags", + description: "flag: Montserrat", + unicode_version: "6.0", + }, + { + emoji: "🇲🇹", + aliases: ["malta"], + tags: [], + category: "Flags", + description: "flag: Malta", + unicode_version: "6.0", + }, + { + emoji: "🇲🇺", + aliases: ["mauritius"], + tags: [], + category: "Flags", + description: "flag: Mauritius", + unicode_version: "6.0", + }, + { + emoji: "🇲🇻", + aliases: ["maldives"], + tags: [], + category: "Flags", + description: "flag: Maldives", + unicode_version: "6.0", + }, + { + emoji: "🇲🇼", + aliases: ["malawi"], + tags: [], + category: "Flags", + description: "flag: Malawi", + unicode_version: "6.0", + }, + { + emoji: "🇲🇽", + aliases: ["mexico"], + tags: [], + category: "Flags", + description: "flag: Mexico", + unicode_version: "6.0", + }, + { + emoji: "🇲🇾", + aliases: ["malaysia"], + tags: [], + category: "Flags", + description: "flag: Malaysia", + unicode_version: "6.0", + }, + { + emoji: "🇲🇿", + aliases: ["mozambique"], + tags: [], + category: "Flags", + description: "flag: Mozambique", + unicode_version: "6.0", + }, + { + emoji: "🇳🇦", + aliases: ["namibia"], + tags: [], + category: "Flags", + description: "flag: Namibia", + unicode_version: "6.0", + }, + { + emoji: "🇳🇨", + aliases: ["new_caledonia"], + tags: [], + category: "Flags", + description: "flag: New Caledonia", + unicode_version: "6.0", + }, + { + emoji: "🇳🇪", + aliases: ["niger"], + tags: [], + category: "Flags", + description: "flag: Niger", + unicode_version: "6.0", + }, + { + emoji: "🇳🇫", + aliases: ["norfolk_island"], + tags: [], + category: "Flags", + description: "flag: Norfolk Island", + unicode_version: "6.0", + }, + { + emoji: "🇳🇬", + aliases: ["nigeria"], + tags: [], + category: "Flags", + description: "flag: Nigeria", + unicode_version: "6.0", + }, + { + emoji: "🇳🇮", + aliases: ["nicaragua"], + tags: [], + category: "Flags", + description: "flag: Nicaragua", + unicode_version: "6.0", + }, + { + emoji: "🇳🇱", + aliases: ["netherlands"], + tags: [], + category: "Flags", + description: "flag: Netherlands", + unicode_version: "6.0", + }, + { + emoji: "🇳🇴", + aliases: ["norway"], + tags: [], + category: "Flags", + description: "flag: Norway", + unicode_version: "6.0", + }, + { + emoji: "🇳🇵", + aliases: ["nepal"], + tags: [], + category: "Flags", + description: "flag: Nepal", + unicode_version: "6.0", + }, + { + emoji: "🇳🇷", + aliases: ["nauru"], + tags: [], + category: "Flags", + description: "flag: Nauru", + unicode_version: "6.0", + }, + { + emoji: "🇳🇺", + aliases: ["niue"], + tags: [], + category: "Flags", + description: "flag: Niue", + unicode_version: "6.0", + }, + { + emoji: "🇳🇿", + aliases: ["new_zealand"], + tags: [], + category: "Flags", + description: "flag: New Zealand", + unicode_version: "6.0", + }, + { + emoji: "🇴🇲", + aliases: ["oman"], + tags: [], + category: "Flags", + description: "flag: Oman", + unicode_version: "6.0", + }, + { + emoji: "🇵🇦", + aliases: ["panama"], + tags: [], + category: "Flags", + description: "flag: Panama", + unicode_version: "6.0", + }, + { + emoji: "🇵🇪", + aliases: ["peru"], + tags: [], + category: "Flags", + description: "flag: Peru", + unicode_version: "6.0", + }, + { + emoji: "🇵🇫", + aliases: ["french_polynesia"], + tags: [], + category: "Flags", + description: "flag: French Polynesia", + unicode_version: "6.0", + }, + { + emoji: "🇵🇬", + aliases: ["papua_new_guinea"], + tags: [], + category: "Flags", + description: "flag: Papua New Guinea", + unicode_version: "6.0", + }, + { + emoji: "🇵🇭", + aliases: ["philippines"], + tags: [], + category: "Flags", + description: "flag: Philippines", + unicode_version: "6.0", + }, + { + emoji: "🇵🇰", + aliases: ["pakistan"], + tags: [], + category: "Flags", + description: "flag: Pakistan", + unicode_version: "6.0", + }, + { + emoji: "🇵🇱", + aliases: ["poland"], + tags: [], + category: "Flags", + description: "flag: Poland", + unicode_version: "6.0", + }, + { + emoji: "🇵🇲", + aliases: ["st_pierre_miquelon"], + tags: [], + category: "Flags", + description: "flag: St. Pierre & Miquelon", + unicode_version: "6.0", + }, + { + emoji: "🇵🇳", + aliases: ["pitcairn_islands"], + tags: [], + category: "Flags", + description: "flag: Pitcairn Islands", + unicode_version: "6.0", + }, + { + emoji: "🇵🇷", + aliases: ["puerto_rico"], + tags: [], + category: "Flags", + description: "flag: Puerto Rico", + unicode_version: "6.0", + }, + { + emoji: "🇵🇸", + aliases: ["palestinian_territories"], + tags: [], + category: "Flags", + description: "flag: Palestinian Territories", + unicode_version: "6.0", + }, + { + emoji: "🇵🇹", + aliases: ["portugal"], + tags: [], + category: "Flags", + description: "flag: Portugal", + unicode_version: "6.0", + }, + { + emoji: "🇵🇼", + aliases: ["palau"], + tags: [], + category: "Flags", + description: "flag: Palau", + unicode_version: "6.0", + }, + { + emoji: "🇵🇾", + aliases: ["paraguay"], + tags: [], + category: "Flags", + description: "flag: Paraguay", + unicode_version: "6.0", + }, + { + emoji: "🇶🇦", + aliases: ["qatar"], + tags: [], + category: "Flags", + description: "flag: Qatar", + unicode_version: "6.0", + }, + { + emoji: "🇷🇪", + aliases: ["reunion"], + tags: [], + category: "Flags", + description: "flag: Réunion", + unicode_version: "6.0", + }, + { + emoji: "🇷🇴", + aliases: ["romania"], + tags: [], + category: "Flags", + description: "flag: Romania", + unicode_version: "6.0", + }, + { + emoji: "🇷🇸", + aliases: ["serbia"], + tags: [], + category: "Flags", + description: "flag: Serbia", + unicode_version: "6.0", + }, + { + emoji: "🇷🇺", + aliases: ["ru"], + tags: ["russia"], + category: "Flags", + description: "flag: Russia", + unicode_version: "6.0", + }, + { + emoji: "🇷🇼", + aliases: ["rwanda"], + tags: [], + category: "Flags", + description: "flag: Rwanda", + unicode_version: "6.0", + }, + { + emoji: "🇸🇦", + aliases: ["saudi_arabia"], + tags: [], + category: "Flags", + description: "flag: Saudi Arabia", + unicode_version: "6.0", + }, + { + emoji: "🇸🇧", + aliases: ["solomon_islands"], + tags: [], + category: "Flags", + description: "flag: Solomon Islands", + unicode_version: "6.0", + }, + { + emoji: "🇸🇨", + aliases: ["seychelles"], + tags: [], + category: "Flags", + description: "flag: Seychelles", + unicode_version: "6.0", + }, + { + emoji: "🇸🇩", + aliases: ["sudan"], + tags: [], + category: "Flags", + description: "flag: Sudan", + unicode_version: "6.0", + }, + { + emoji: "🇸🇪", + aliases: ["sweden"], + tags: [], + category: "Flags", + description: "flag: Sweden", + unicode_version: "6.0", + }, + { + emoji: "🇸🇬", + aliases: ["singapore"], + tags: [], + category: "Flags", + description: "flag: Singapore", + unicode_version: "6.0", + }, + { + emoji: "🇸🇭", + aliases: ["st_helena"], + tags: [], + category: "Flags", + description: "flag: St. Helena", + unicode_version: "6.0", + }, + { + emoji: "🇸🇮", + aliases: ["slovenia"], + tags: [], + category: "Flags", + description: "flag: Slovenia", + unicode_version: "6.0", + }, + { + emoji: "🇸🇯", + aliases: ["svalbard_jan_mayen"], + tags: [], + category: "Flags", + description: "flag: Svalbard & Jan Mayen", + unicode_version: "11.0", + }, + { + emoji: "🇸🇰", + aliases: ["slovakia"], + tags: [], + category: "Flags", + description: "flag: Slovakia", + unicode_version: "6.0", + }, + { + emoji: "🇸🇱", + aliases: ["sierra_leone"], + tags: [], + category: "Flags", + description: "flag: Sierra Leone", + unicode_version: "6.0", + }, + { + emoji: "🇸🇲", + aliases: ["san_marino"], + tags: [], + category: "Flags", + description: "flag: San Marino", + unicode_version: "6.0", + }, + { + emoji: "🇸🇳", + aliases: ["senegal"], + tags: [], + category: "Flags", + description: "flag: Senegal", + unicode_version: "6.0", + }, + { + emoji: "🇸🇴", + aliases: ["somalia"], + tags: [], + category: "Flags", + description: "flag: Somalia", + unicode_version: "6.0", + }, + { + emoji: "🇸🇷", + aliases: ["suriname"], + tags: [], + category: "Flags", + description: "flag: Suriname", + unicode_version: "6.0", + }, + { + emoji: "🇸🇸", + aliases: ["south_sudan"], + tags: [], + category: "Flags", + description: "flag: South Sudan", + unicode_version: "6.0", + }, + { + emoji: "🇸🇹", + aliases: ["sao_tome_principe"], + tags: [], + category: "Flags", + description: "flag: São Tomé & Príncipe", + unicode_version: "6.0", + }, + { + emoji: "🇸🇻", + aliases: ["el_salvador"], + tags: [], + category: "Flags", + description: "flag: El Salvador", + unicode_version: "6.0", + }, + { + emoji: "🇸🇽", + aliases: ["sint_maarten"], + tags: [], + category: "Flags", + description: "flag: Sint Maarten", + unicode_version: "6.0", + }, + { + emoji: "🇸🇾", + aliases: ["syria"], + tags: [], + category: "Flags", + description: "flag: Syria", + unicode_version: "6.0", + }, + { + emoji: "🇸🇿", + aliases: ["swaziland"], + tags: [], + category: "Flags", + description: "flag: Eswatini", + unicode_version: "6.0", + }, + { + emoji: "🇹🇦", + aliases: ["tristan_da_cunha"], + tags: [], + category: "Flags", + description: "flag: Tristan da Cunha", + unicode_version: "11.0", + }, + { + emoji: "🇹🇨", + aliases: ["turks_caicos_islands"], + tags: [], + category: "Flags", + description: "flag: Turks & Caicos Islands", + unicode_version: "6.0", + }, + { + emoji: "🇹🇩", + aliases: ["chad"], + tags: [], + category: "Flags", + description: "flag: Chad", + unicode_version: "6.0", + }, + { + emoji: "🇹🇫", + aliases: ["french_southern_territories"], + tags: [], + category: "Flags", + description: "flag: French Southern Territories", + unicode_version: "6.0", + }, + { + emoji: "🇹🇬", + aliases: ["togo"], + tags: [], + category: "Flags", + description: "flag: Togo", + unicode_version: "6.0", + }, + { + emoji: "🇹🇭", + aliases: ["thailand"], + tags: [], + category: "Flags", + description: "flag: Thailand", + unicode_version: "6.0", + }, + { + emoji: "🇹🇯", + aliases: ["tajikistan"], + tags: [], + category: "Flags", + description: "flag: Tajikistan", + unicode_version: "6.0", + }, + { + emoji: "🇹🇰", + aliases: ["tokelau"], + tags: [], + category: "Flags", + description: "flag: Tokelau", + unicode_version: "6.0", + }, + { + emoji: "🇹🇱", + aliases: ["timor_leste"], + tags: [], + category: "Flags", + description: "flag: Timor-Leste", + unicode_version: "6.0", + }, + { + emoji: "🇹🇲", + aliases: ["turkmenistan"], + tags: [], + category: "Flags", + description: "flag: Turkmenistan", + unicode_version: "6.0", + }, + { + emoji: "🇹🇳", + aliases: ["tunisia"], + tags: [], + category: "Flags", + description: "flag: Tunisia", + unicode_version: "6.0", + }, + { + emoji: "🇹🇴", + aliases: ["tonga"], + tags: [], + category: "Flags", + description: "flag: Tonga", + unicode_version: "6.0", + }, + { + emoji: "🇹🇷", + aliases: ["tr"], + tags: ["turkey"], + category: "Flags", + description: "flag: Turkey", + unicode_version: "8.0", + }, + { + emoji: "🇹🇹", + aliases: ["trinidad_tobago"], + tags: [], + category: "Flags", + description: "flag: Trinidad & Tobago", + unicode_version: "6.0", + }, + { + emoji: "🇹🇻", + aliases: ["tuvalu"], + tags: [], + category: "Flags", + description: "flag: Tuvalu", + unicode_version: "6.0", + }, + { + emoji: "🇹🇼", + aliases: ["taiwan"], + tags: [], + category: "Flags", + description: "flag: Taiwan", + unicode_version: "6.0", + }, + { + emoji: "🇹🇿", + aliases: ["tanzania"], + tags: [], + category: "Flags", + description: "flag: Tanzania", + unicode_version: "6.0", + }, + { + emoji: "🇺🇦", + aliases: ["ukraine"], + tags: [], + category: "Flags", + description: "flag: Ukraine", + unicode_version: "6.0", + }, + { + emoji: "🇺🇬", + aliases: ["uganda"], + tags: [], + category: "Flags", + description: "flag: Uganda", + unicode_version: "6.0", + }, + { + emoji: "🇺🇲", + aliases: ["us_outlying_islands"], + tags: [], + category: "Flags", + description: "flag: U.S. Outlying Islands", + unicode_version: "11.0", + }, + { + emoji: "🇺🇳", + aliases: ["united_nations"], + tags: [], + category: "Flags", + description: "flag: United Nations", + unicode_version: "11.0", + }, + { + emoji: "🇺🇸", + aliases: ["us"], + tags: ["flag", "united", "america"], + category: "Flags", + description: "flag: United States", + unicode_version: "6.0", + }, + { + emoji: "🇺🇾", + aliases: ["uruguay"], + tags: [], + category: "Flags", + description: "flag: Uruguay", + unicode_version: "6.0", + }, + { + emoji: "🇺🇿", + aliases: ["uzbekistan"], + tags: [], + category: "Flags", + description: "flag: Uzbekistan", + unicode_version: "6.0", + }, + { + emoji: "🇻🇦", + aliases: ["vatican_city"], + tags: [], + category: "Flags", + description: "flag: Vatican City", + unicode_version: "6.0", + }, + { + emoji: "🇻🇨", + aliases: ["st_vincent_grenadines"], + tags: [], + category: "Flags", + description: "flag: St. Vincent & Grenadines", + unicode_version: "6.0", + }, + { + emoji: "🇻🇪", + aliases: ["venezuela"], + tags: [], + category: "Flags", + description: "flag: Venezuela", + unicode_version: "6.0", + }, + { + emoji: "🇻🇬", + aliases: ["british_virgin_islands"], + tags: [], + category: "Flags", + description: "flag: British Virgin Islands", + unicode_version: "6.0", + }, + { + emoji: "🇻🇮", + aliases: ["us_virgin_islands"], + tags: [], + category: "Flags", + description: "flag: U.S. Virgin Islands", + unicode_version: "6.0", + }, + { + emoji: "🇻🇳", + aliases: ["vietnam"], + tags: [], + category: "Flags", + description: "flag: Vietnam", + unicode_version: "6.0", + }, + { + emoji: "🇻🇺", + aliases: ["vanuatu"], + tags: [], + category: "Flags", + description: "flag: Vanuatu", + unicode_version: "6.0", + }, + { + emoji: "🇼🇫", + aliases: ["wallis_futuna"], + tags: [], + category: "Flags", + description: "flag: Wallis & Futuna", + unicode_version: "6.0", + }, + { + emoji: "🇼🇸", + aliases: ["samoa"], + tags: [], + category: "Flags", + description: "flag: Samoa", + unicode_version: "6.0", + }, + { + emoji: "🇽🇰", + aliases: ["kosovo"], + tags: [], + category: "Flags", + description: "flag: Kosovo", + unicode_version: "6.0", + }, + { + emoji: "🇾🇪", + aliases: ["yemen"], + tags: [], + category: "Flags", + description: "flag: Yemen", + unicode_version: "6.0", + }, + { + emoji: "🇾🇹", + aliases: ["mayotte"], + tags: [], + category: "Flags", + description: "flag: Mayotte", + unicode_version: "6.0", + }, + { + emoji: "🇿🇦", + aliases: ["south_africa"], + tags: [], + category: "Flags", + description: "flag: South Africa", + unicode_version: "6.0", + }, + { + emoji: "🇿🇲", + aliases: ["zambia"], + tags: [], + category: "Flags", + description: "flag: Zambia", + unicode_version: "6.0", + }, + { + emoji: "🇿🇼", + aliases: ["zimbabwe"], + tags: [], + category: "Flags", + description: "flag: Zimbabwe", + unicode_version: "6.0", + }, + { + emoji: "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + aliases: ["england"], + tags: [], + category: "Flags", + description: "flag: England", + unicode_version: "11.0", + }, + { + emoji: "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + aliases: ["scotland"], + tags: [], + category: "Flags", + description: "flag: Scotland", + unicode_version: "11.0", + }, + { + emoji: "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + aliases: ["wales"], + tags: [], + category: "Flags", + description: "flag: Wales", + unicode_version: "11.0", + }, +]; diff --git a/web/src/app/utils.js b/web/src/app/utils.js index fa324ca1..6a783cf8 100644 --- a/web/src/app/utils.js +++ b/web/src/app/utils.js @@ -1,4 +1,4 @@ -import {rawEmojis} from "./emojis"; +import { rawEmojis } from "./emojis"; import beep from "../sounds/beep.mp3"; import juntos from "../sounds/juntos.mp3"; import pristine from "../sounds/pristine.mp3"; @@ -7,245 +7,256 @@ import dadum from "../sounds/dadum.mp3"; import pop from "../sounds/pop.mp3"; import popSwoosh from "../sounds/pop-swoosh.mp3"; import config from "./config"; -import {Base64} from 'js-base64'; +import { Base64 } from "js-base64"; export const topicUrl = (baseUrl, topic) => `${baseUrl}/${topic}`; -export const topicUrlWs = (baseUrl, topic) => `${topicUrl(baseUrl, topic)}/ws` +export const topicUrlWs = (baseUrl, topic) => + `${topicUrl(baseUrl, topic)}/ws` .replaceAll("https://", "wss://") .replaceAll("http://", "ws://"); -export const topicUrlJson = (baseUrl, topic) => `${topicUrl(baseUrl, topic)}/json`; -export const topicUrlJsonPoll = (baseUrl, topic) => `${topicUrlJson(baseUrl, topic)}?poll=1`; -export const topicUrlJsonPollWithSince = (baseUrl, topic, since) => `${topicUrlJson(baseUrl, topic)}?poll=1&since=${since}`; -export const topicUrlAuth = (baseUrl, topic) => `${topicUrl(baseUrl, topic)}/auth`; -export const topicShortUrl = (baseUrl, topic) => shortUrl(topicUrl(baseUrl, topic)); +export const topicUrlJson = (baseUrl, topic) => + `${topicUrl(baseUrl, topic)}/json`; +export const topicUrlJsonPoll = (baseUrl, topic) => + `${topicUrlJson(baseUrl, topic)}?poll=1`; +export const topicUrlJsonPollWithSince = (baseUrl, topic, since) => + `${topicUrlJson(baseUrl, topic)}?poll=1&since=${since}`; +export const topicUrlAuth = (baseUrl, topic) => + `${topicUrl(baseUrl, topic)}/auth`; +export const topicShortUrl = (baseUrl, topic) => + shortUrl(topicUrl(baseUrl, topic)); export const userStatsUrl = (baseUrl) => `${baseUrl}/user/stats`; export const shortUrl = (url) => url.replaceAll(/https?:\/\//g, ""); export const expandUrl = (url) => [`https://${url}`, `http://${url}`]; export const expandSecureUrl = (url) => `https://${url}`; export const validUrl = (url) => { - return url.match(/^https?:\/\/.+/); -} + return url.match(/^https?:\/\/.+/); +}; export const validTopic = (topic) => { - if (disallowedTopic(topic)) { - return false; - } - return topic.match(/^([-_a-zA-Z0-9]{1,64})$/); // Regex must match Go & Android app! -} + if (disallowedTopic(topic)) { + return false; + } + return topic.match(/^([-_a-zA-Z0-9]{1,64})$/); // Regex must match Go & Android app! +}; export const disallowedTopic = (topic) => { - return config.disallowedTopics.includes(topic); -} + return config.disallowedTopics.includes(topic); +}; export const topicDisplayName = (subscription) => { - if (subscription.displayName) { - return subscription.displayName; - } else if (subscription.baseUrl === window.location.origin) { - return subscription.topic; - } - return topicShortUrl(subscription.baseUrl, subscription.topic); + if (subscription.displayName) { + return subscription.displayName; + } else if (subscription.baseUrl === window.location.origin) { + return subscription.topic; + } + return topicShortUrl(subscription.baseUrl, subscription.topic); }; // Format emojis (see emoji.js) const emojis = {}; -rawEmojis.forEach(emoji => { - emoji.aliases.forEach(alias => { - emojis[alias] = emoji.emoji; - }); +rawEmojis.forEach((emoji) => { + emoji.aliases.forEach((alias) => { + emojis[alias] = emoji.emoji; + }); }); const toEmojis = (tags) => { - if (!tags) return []; - else return tags.filter(tag => tag in emojis).map(tag => emojis[tag]); -} + if (!tags) return []; + else return tags.filter((tag) => tag in emojis).map((tag) => emojis[tag]); +}; export const formatTitleWithDefault = (m, fallback) => { - if (m.title) { - return formatTitle(m); - } - return fallback; + if (m.title) { + return formatTitle(m); + } + return fallback; }; export const formatTitle = (m) => { - const emojiList = toEmojis(m.tags); - if (emojiList.length > 0) { - return `${emojiList.join(" ")} ${m.title}`; - } else { - return m.title; - } + const emojiList = toEmojis(m.tags); + if (emojiList.length > 0) { + return `${emojiList.join(" ")} ${m.title}`; + } else { + return m.title; + } }; export const formatMessage = (m) => { - if (m.title) { - return m.message; + if (m.title) { + return m.message; + } else { + const emojiList = toEmojis(m.tags); + if (emojiList.length > 0) { + return `${emojiList.join(" ")} ${m.message}`; } else { - const emojiList = toEmojis(m.tags); - if (emojiList.length > 0) { - return `${emojiList.join(" ")} ${m.message}`; - } else { - return m.message; - } + return m.message; } + } }; export const unmatchedTags = (tags) => { - if (!tags) return []; - else return tags.filter(tag => !(tag in emojis)); -} + if (!tags) return []; + else return tags.filter((tag) => !(tag in emojis)); +}; export const maybeWithBasicAuth = (headers, user) => { - if (user) { - headers['Authorization'] = `Basic ${encodeBase64(`${user.username}:${user.password}`)}`; - } - return headers; -} + if (user) { + headers["Authorization"] = `Basic ${encodeBase64( + `${user.username}:${user.password}`, + )}`; + } + return headers; +}; export const basicAuth = (username, password) => { - return `Basic ${encodeBase64(`${username}:${password}`)}`; -} + return `Basic ${encodeBase64(`${username}:${password}`)}`; +}; export const encodeBase64 = (s) => { - return Base64.encode(s); -} + return Base64.encode(s); +}; export const encodeBase64Url = (s) => { - return Base64.encodeURI(s); -} + return Base64.encodeURI(s); +}; export const maybeAppendActionErrors = (message, notification) => { - const actionErrors = (notification.actions ?? []) - .map(action => action.error) - .filter(action => !!action) - .join("\n") - if (actionErrors.length === 0) { - return message; - } else { - return `${message}\n\n${actionErrors}`; - } -} + const actionErrors = (notification.actions ?? []) + .map((action) => action.error) + .filter((action) => !!action) + .join("\n"); + if (actionErrors.length === 0) { + return message; + } else { + return `${message}\n\n${actionErrors}`; + } +}; export const shuffle = (arr) => { - let j, x; - for (let index = arr.length - 1; index > 0; index--) { - j = Math.floor(Math.random() * (index + 1)); - x = arr[index]; - arr[index] = arr[j]; - arr[j] = x; - } - return arr; -} + let j, x; + for (let index = arr.length - 1; index > 0; index--) { + j = Math.floor(Math.random() * (index + 1)); + x = arr[index]; + arr[index] = arr[j]; + arr[j] = x; + } + return arr; +}; export const splitNoEmpty = (s, delimiter) => { - return s - .split(delimiter) - .map(x => x.trim()) - .filter(x => x !== ""); -} + return s + .split(delimiter) + .map((x) => x.trim()) + .filter((x) => x !== ""); +}; /** Non-cryptographic hash function, see https://stackoverflow.com/a/8831937/1440785 */ export const hashCode = async (s) => { - let hash = 0; - for (let i = 0; i < s.length; i++) { - const char = s.charCodeAt(i); - hash = ((hash<<5)-hash)+char; - hash = hash & hash; // Convert to 32bit integer - } - return hash; -} + let hash = 0; + for (let i = 0; i < s.length; i++) { + const char = s.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; // Convert to 32bit integer + } + return hash; +}; export const formatShortDateTime = (timestamp) => { - return new Intl.DateTimeFormat('default', {dateStyle: 'short', timeStyle: 'short'}) - .format(new Date(timestamp * 1000)); -} + return new Intl.DateTimeFormat("default", { + dateStyle: "short", + timeStyle: "short", + }).format(new Date(timestamp * 1000)); +}; export const formatBytes = (bytes, decimals = 2) => { - if (bytes === 0) return '0 bytes'; - const k = 1024; - const dm = decimals < 0 ? 0 : decimals; - const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; -} + if (bytes === 0) return "0 bytes"; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ["bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i]; +}; export const openUrl = (url) => { - window.open(url, "_blank", "noopener,noreferrer"); + window.open(url, "_blank", "noopener,noreferrer"); }; export const sounds = { - "ding": { - file: ding, - label: "Ding" - }, - "juntos": { - file: juntos, - label: "Juntos" - }, - "pristine": { - file: pristine, - label: "Pristine" - }, - "dadum": { - file: dadum, - label: "Dadum" - }, - "pop": { - file: pop, - label: "Pop" - }, - "pop-swoosh": { - file: popSwoosh, - label: "Pop swoosh" - }, - "beep": { - file: beep, - label: "Beep" - } + ding: { + file: ding, + label: "Ding", + }, + juntos: { + file: juntos, + label: "Juntos", + }, + pristine: { + file: pristine, + label: "Pristine", + }, + dadum: { + file: dadum, + label: "Dadum", + }, + pop: { + file: pop, + label: "Pop", + }, + "pop-swoosh": { + file: popSwoosh, + label: "Pop swoosh", + }, + beep: { + file: beep, + label: "Beep", + }, }; export const playSound = async (id) => { - const audio = new Audio(sounds[id].file); - return audio.play(); + const audio = new Audio(sounds[id].file); + return audio.play(); }; // From: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch export async function* fetchLinesIterator(fileURL, headers) { - const utf8Decoder = new TextDecoder('utf-8'); - const response = await fetch(fileURL, { - headers: headers - }); - const reader = response.body.getReader(); - let { value: chunk, done: readerDone } = await reader.read(); - chunk = chunk ? utf8Decoder.decode(chunk) : ''; + const utf8Decoder = new TextDecoder("utf-8"); + const response = await fetch(fileURL, { + headers: headers, + }); + const reader = response.body.getReader(); + let { value: chunk, done: readerDone } = await reader.read(); + chunk = chunk ? utf8Decoder.decode(chunk) : ""; - const re = /\n|\r|\r\n/gm; - let startIndex = 0; + const re = /\n|\r|\r\n/gm; + let startIndex = 0; - for (;;) { - let result = re.exec(chunk); - if (!result) { - if (readerDone) { - break; - } - let remainder = chunk.substr(startIndex); - ({ value: chunk, done: readerDone } = await reader.read()); - chunk = remainder + (chunk ? utf8Decoder.decode(chunk) : ''); - startIndex = re.lastIndex = 0; - continue; - } - yield chunk.substring(startIndex, result.index); - startIndex = re.lastIndex; - } - if (startIndex < chunk.length) { - yield chunk.substr(startIndex); // last line didn't end in a newline char + for (;;) { + let result = re.exec(chunk); + if (!result) { + if (readerDone) { + break; + } + let remainder = chunk.substr(startIndex); + ({ value: chunk, done: readerDone } = await reader.read()); + chunk = remainder + (chunk ? utf8Decoder.decode(chunk) : ""); + startIndex = re.lastIndex = 0; + continue; } + yield chunk.substring(startIndex, result.index); + startIndex = re.lastIndex; + } + if (startIndex < chunk.length) { + yield chunk.substr(startIndex); // last line didn't end in a newline char + } } export const randomAlphanumericString = (len) => { - const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - let id = ""; - for (let i = 0; i < len; i++) { - id += alphabet[(Math.random() * alphabet.length) | 0]; - } - return id; -} + const alphabet = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + let id = ""; + for (let i = 0; i < len; i++) { + id += alphabet[(Math.random() * alphabet.length) | 0]; + } + return id; +}; diff --git a/web/src/components/ActionBar.js b/web/src/components/ActionBar.js index e284f922..6fb0f88b 100644 --- a/web/src/components/ActionBar.js +++ b/web/src/components/ActionBar.js @@ -5,236 +5,296 @@ import IconButton from "@mui/material/IconButton"; import MenuIcon from "@mui/icons-material/Menu"; import Typography from "@mui/material/Typography"; import * as React from "react"; -import {useEffect, useRef, useState} from "react"; +import { useEffect, useRef, useState } from "react"; import Box from "@mui/material/Box"; -import {formatShortDateTime, shuffle, topicDisplayName, topicShortUrl} from "../app/utils"; -import {useLocation, useNavigate} from "react-router-dom"; -import ClickAwayListener from '@mui/material/ClickAwayListener'; -import Grow from '@mui/material/Grow'; -import Paper from '@mui/material/Paper'; -import Popper from '@mui/material/Popper'; -import MenuItem from '@mui/material/MenuItem'; -import MenuList from '@mui/material/MenuList'; +import { + formatShortDateTime, + shuffle, + topicDisplayName, + topicShortUrl, +} from "../app/utils"; +import { useLocation, useNavigate } from "react-router-dom"; +import ClickAwayListener from "@mui/material/ClickAwayListener"; +import Grow from "@mui/material/Grow"; +import Paper from "@mui/material/Paper"; +import Popper from "@mui/material/Popper"; +import MenuItem from "@mui/material/MenuItem"; +import MenuList from "@mui/material/MenuList"; import MoreVertIcon from "@mui/icons-material/MoreVert"; -import NotificationsIcon from '@mui/icons-material/Notifications'; -import NotificationsOffIcon from '@mui/icons-material/NotificationsOff'; +import NotificationsIcon from "@mui/icons-material/Notifications"; +import NotificationsOffIcon from "@mui/icons-material/NotificationsOff"; import api from "../app/Api"; import routes from "./routes"; import subscriptionManager from "../app/SubscriptionManager"; import logo from "../img/ntfy.svg"; -import {useTranslation} from "react-i18next"; -import {Portal, Snackbar} from "@mui/material"; +import { useTranslation } from "react-i18next"; +import { Portal, Snackbar } from "@mui/material"; import SubscriptionSettingsDialog from "./SubscriptionSettingsDialog"; const ActionBar = (props) => { - const { t } = useTranslation(); - const location = useLocation(); - let title = "ntfy"; - if (props.selected) { - title = topicDisplayName(props.selected); - } else if (location.pathname === "/settings") { - title = t("action_bar_settings"); - } - return ( - Navigation (1200), but < Dialog (1300) - ml: { sm: `${Navigation.width}px` } - }}> - - - - - - - {title} - - {props.selected && - } - - - ); + const { t } = useTranslation(); + const location = useLocation(); + let title = "ntfy"; + if (props.selected) { + title = topicDisplayName(props.selected); + } else if (location.pathname === "/settings") { + title = t("action_bar_settings"); + } + return ( + Navigation (1200), but < Dialog (1300) + ml: { sm: `${Navigation.width}px` }, + }} + > + + + + + + + {title} + + {props.selected && ( + + )} + + + ); }; // Originally from https://mui.com/components/menus/#MenuListComposition.js const SettingsIcons = (props) => { - const { t } = useTranslation(); - const navigate = useNavigate(); - const [open, setOpen] = useState(false); - const [snackOpen, setSnackOpen] = useState(false); - const [subscriptionSettingsOpen, setSubscriptionSettingsOpen] = useState(false); - const anchorRef = useRef(null); - const subscription = props.subscription; + const { t } = useTranslation(); + const navigate = useNavigate(); + const [open, setOpen] = useState(false); + const [snackOpen, setSnackOpen] = useState(false); + const [subscriptionSettingsOpen, setSubscriptionSettingsOpen] = + useState(false); + const anchorRef = useRef(null); + const subscription = props.subscription; - const handleToggleOpen = () => { - setOpen((prevOpen) => !prevOpen); - }; + const handleToggleOpen = () => { + setOpen((prevOpen) => !prevOpen); + }; - const handleToggleMute = async () => { - const mutedUntil = (subscription.mutedUntil) ? 0 : 1; // Make this a timestamp in the future - await subscriptionManager.setMutedUntil(subscription.id, mutedUntil); + const handleToggleMute = async () => { + const mutedUntil = subscription.mutedUntil ? 0 : 1; // Make this a timestamp in the future + await subscriptionManager.setMutedUntil(subscription.id, mutedUntil); + }; + + const handleClose = (event) => { + if (anchorRef.current && anchorRef.current.contains(event.target)) { + return; } + setOpen(false); + }; - const handleClose = (event) => { - if (anchorRef.current && anchorRef.current.contains(event.target)) { - return; - } - setOpen(false); - }; - - const handleClearAll = async (event) => { - handleClose(event); - console.log(`[ActionBar] Deleting all notifications from ${props.subscription.id}`); - await subscriptionManager.deleteNotifications(props.subscription.id); - }; - - const handleUnsubscribe = async (event) => { - console.log(`[ActionBar] Unsubscribing from ${props.subscription.id}`); - handleClose(event); - await subscriptionManager.remove(props.subscription.id); - const newSelected = await subscriptionManager.first(); // May be undefined - if (newSelected) { - navigate(routes.forSubscription(newSelected)); - } else { - navigate(routes.root); - } - }; - - const handleSubscriptionSettings = async () => { - setSubscriptionSettingsOpen(true); - } - - const handleSendTestMessage = async () => { - const baseUrl = props.subscription.baseUrl; - const topic = props.subscription.topic; - const tags = shuffle([ - "grinning", "octopus", "upside_down_face", "palm_tree", "maple_leaf", "apple", "skull", "warning", "jack_o_lantern", - "de-server-1", "backups", "cron-script", "script-error", "phils-automation", "mouse", "go-rocks", "hi-ben"]) - .slice(0, Math.round(Math.random() * 4)); - const priority = shuffle([1, 2, 3, 4, 5])[0]; - const title = shuffle([ - "", - "", - "", // Higher chance of no title - "Oh my, another test message?", - "Titles are optional, did you know that?", - "ntfy is open source, and will always be free. Cool, right?", - "I don't really like apples", - "My favorite TV show is The Wire. You should watch it!", - "You can attach files and URLs to messages too", - "You can delay messages up to 3 days" - ])[0]; - const nowSeconds = Math.round(Date.now()/1000); - const message = shuffle([ - `Hello friend, this is a test notification from ntfy web. It's ${formatShortDateTime(nowSeconds)} right now. Is that early or late?`, - `So I heard you like ntfy? If that's true, go to GitHub and star it, or to the Play store and rate it. Thanks! Oh yeah, this is a test notification.`, - `It's almost like you want to hear what I have to say. I'm not even a machine. I'm just a sentence that Phil typed on a random Thursday.`, - `Alright then, it's ${formatShortDateTime(nowSeconds)} already. Boy oh boy, where did the time go? I hope you're alright, friend.`, - `There are nine million bicycles in Beijing That's a fact; It's a thing we can't deny. I wonder if that's true ...`, - `I'm really excited that you're trying out ntfy. Did you know that there are a few public topics, such as ntfy.sh/stats and ntfy.sh/announcements.`, - `It's interesting to hear what people use ntfy for. I've heard people talk about using it for so many cool things. What do you use it for?` - ])[0]; - try { - await api.publish(baseUrl, topic, message, { - title: title, - priority: priority, - tags: tags - }); - } catch (e) { - console.log(`[ActionBar] Error publishing message`, e); - setSnackOpen(true); - } - setOpen(false); - } - - const handleListKeyDown = (event) => { - if (event.key === 'Tab') { - event.preventDefault(); - setOpen(false); - } else if (event.key === 'Escape') { - setOpen(false); - } - } - - // return focus to the button when we transitioned from !open -> open - const prevOpen = useRef(open); - useEffect(() => { - if (prevOpen.current === true && open === false) { - anchorRef.current.focus(); - } - prevOpen.current = open; - }, [open]); - - return ( - <> - - {subscription.mutedUntil ? : } - - - - - - {({TransitionProps, placement}) => ( - - - - - {t("action_bar_subscription_settings")} - {t("action_bar_send_test_notification")} - {t("action_bar_clear_notifications")} - {t("action_bar_unsubscribe")} - - - - - )} - - - setSnackOpen(false)} - message={t("message_bar_error_publishing")} - /> - - - setSubscriptionSettingsOpen(false)} - /> - - + const handleClearAll = async (event) => { + handleClose(event); + console.log( + `[ActionBar] Deleting all notifications from ${props.subscription.id}`, ); + await subscriptionManager.deleteNotifications(props.subscription.id); + }; + + const handleUnsubscribe = async (event) => { + console.log(`[ActionBar] Unsubscribing from ${props.subscription.id}`); + handleClose(event); + await subscriptionManager.remove(props.subscription.id); + const newSelected = await subscriptionManager.first(); // May be undefined + if (newSelected) { + navigate(routes.forSubscription(newSelected)); + } else { + navigate(routes.root); + } + }; + + const handleSubscriptionSettings = async () => { + setSubscriptionSettingsOpen(true); + }; + + const handleSendTestMessage = async () => { + const baseUrl = props.subscription.baseUrl; + const topic = props.subscription.topic; + const tags = shuffle([ + "grinning", + "octopus", + "upside_down_face", + "palm_tree", + "maple_leaf", + "apple", + "skull", + "warning", + "jack_o_lantern", + "de-server-1", + "backups", + "cron-script", + "script-error", + "phils-automation", + "mouse", + "go-rocks", + "hi-ben", + ]).slice(0, Math.round(Math.random() * 4)); + const priority = shuffle([1, 2, 3, 4, 5])[0]; + const title = shuffle([ + "", + "", + "", // Higher chance of no title + "Oh my, another test message?", + "Titles are optional, did you know that?", + "ntfy is open source, and will always be free. Cool, right?", + "I don't really like apples", + "My favorite TV show is The Wire. You should watch it!", + "You can attach files and URLs to messages too", + "You can delay messages up to 3 days", + ])[0]; + const nowSeconds = Math.round(Date.now() / 1000); + const message = shuffle([ + `Hello friend, this is a test notification from ntfy web. It's ${formatShortDateTime( + nowSeconds, + )} right now. Is that early or late?`, + `So I heard you like ntfy? If that's true, go to GitHub and star it, or to the Play store and rate it. Thanks! Oh yeah, this is a test notification.`, + `It's almost like you want to hear what I have to say. I'm not even a machine. I'm just a sentence that Phil typed on a random Thursday.`, + `Alright then, it's ${formatShortDateTime( + nowSeconds, + )} already. Boy oh boy, where did the time go? I hope you're alright, friend.`, + `There are nine million bicycles in Beijing That's a fact; It's a thing we can't deny. I wonder if that's true ...`, + `I'm really excited that you're trying out ntfy. Did you know that there are a few public topics, such as ntfy.sh/stats and ntfy.sh/announcements.`, + `It's interesting to hear what people use ntfy for. I've heard people talk about using it for so many cool things. What do you use it for?`, + ])[0]; + try { + await api.publish(baseUrl, topic, message, { + title: title, + priority: priority, + tags: tags, + }); + } catch (e) { + console.log(`[ActionBar] Error publishing message`, e); + setSnackOpen(true); + } + setOpen(false); + }; + + const handleListKeyDown = (event) => { + if (event.key === "Tab") { + event.preventDefault(); + setOpen(false); + } else if (event.key === "Escape") { + setOpen(false); + } + }; + + // return focus to the button when we transitioned from !open -> open + const prevOpen = useRef(open); + useEffect(() => { + if (prevOpen.current === true && open === false) { + anchorRef.current.focus(); + } + prevOpen.current = open; + }, [open]); + + return ( + <> + + {subscription.mutedUntil ? ( + + ) : ( + + )} + + + + + + {({ TransitionProps, placement }) => ( + + + + + + {t("action_bar_subscription_settings")} + + + {t("action_bar_send_test_notification")} + + + {t("action_bar_clear_notifications")} + + + {t("action_bar_unsubscribe")} + + + + + + )} + + + setSnackOpen(false)} + message={t("message_bar_error_publishing")} + /> + + + setSubscriptionSettingsOpen(false)} + /> + + + ); }; export default ActionBar; diff --git a/web/src/components/App.js b/web/src/components/App.js index 1ecf878c..2935dc45 100644 --- a/web/src/components/App.js +++ b/web/src/components/App.js @@ -1,146 +1,179 @@ -import * as React from 'react'; +import * as React from "react"; import { Suspense } from "react"; -import {useEffect, useState} from 'react'; -import Box from '@mui/material/Box'; -import {ThemeProvider} from '@mui/material/styles'; -import CssBaseline from '@mui/material/CssBaseline'; -import Toolbar from '@mui/material/Toolbar'; +import { useEffect, useState } from "react"; +import Box from "@mui/material/Box"; +import { ThemeProvider } from "@mui/material/styles"; +import CssBaseline from "@mui/material/CssBaseline"; +import Toolbar from "@mui/material/Toolbar"; import Notifications from "./Notifications"; import theme from "./theme"; import Navigation from "./Navigation"; import ActionBar from "./ActionBar"; import notifier from "../app/Notifier"; import Preferences from "./Preferences"; -import {useLiveQuery} from "dexie-react-hooks"; +import { useLiveQuery } from "dexie-react-hooks"; import subscriptionManager from "../app/SubscriptionManager"; import userManager from "../app/UserManager"; -import {BrowserRouter, Outlet, Route, Routes, useOutletContext, useParams} from "react-router-dom"; -import {expandUrl} from "../app/utils"; +import { + BrowserRouter, + Outlet, + Route, + Routes, + useOutletContext, + useParams, +} from "react-router-dom"; +import { expandUrl } from "../app/utils"; import ErrorBoundary from "./ErrorBoundary"; import routes from "./routes"; -import {useAutoSubscribe, useBackgroundProcesses, useConnectionListeners} from "./hooks"; +import { + useAutoSubscribe, + useBackgroundProcesses, + useConnectionListeners, +} from "./hooks"; import PublishDialog from "./PublishDialog"; import Messaging from "./Messaging"; import "./i18n"; // Translations! -import {Backdrop, CircularProgress} from "@mui/material"; +import { Backdrop, CircularProgress } from "@mui/material"; // TODO races when two tabs are open // TODO investigate service workers const App = () => { - return ( - }> - - - - - - }> - }/> - }/> - }/> - }/> - - - - - - - ); -} + return ( + }> + + + + + + }> + } /> + } /> + } + /> + } + /> + + + + + + + ); +}; const AllSubscriptions = () => { - const { subscriptions } = useOutletContext(); - return ; + const { subscriptions } = useOutletContext(); + return ; }; const SingleSubscription = () => { - const { subscriptions, selected } = useOutletContext(); - useAutoSubscribe(subscriptions, selected); - return ; + const { subscriptions, selected } = useOutletContext(); + useAutoSubscribe(subscriptions, selected); + return ; }; const Layout = () => { - const params = useParams(); - const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false); - const [notificationsGranted, setNotificationsGranted] = useState(notifier.granted()); - const [sendDialogOpenMode, setSendDialogOpenMode] = useState(""); - const users = useLiveQuery(() => userManager.all()); - const subscriptions = useLiveQuery(() => subscriptionManager.all()); - const newNotificationsCount = subscriptions?.reduce((prev, cur) => prev + cur.new, 0) || 0; - const [selected] = (subscriptions || []).filter(s => { - return (params.baseUrl && expandUrl(params.baseUrl).includes(s.baseUrl) && params.topic === s.topic) - || (window.location.origin === s.baseUrl && params.topic === s.topic) - }); - - useConnectionListeners(subscriptions, users); - useBackgroundProcesses(); - useEffect(() => updateTitle(newNotificationsCount), [newNotificationsCount]); - + const params = useParams(); + const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false); + const [notificationsGranted, setNotificationsGranted] = useState( + notifier.granted(), + ); + const [sendDialogOpenMode, setSendDialogOpenMode] = useState(""); + const users = useLiveQuery(() => userManager.all()); + const subscriptions = useLiveQuery(() => subscriptionManager.all()); + const newNotificationsCount = + subscriptions?.reduce((prev, cur) => prev + cur.new, 0) || 0; + const [selected] = (subscriptions || []).filter((s) => { return ( - - - setMobileDrawerOpen(!mobileDrawerOpen)} - /> - setMobileDrawerOpen(!mobileDrawerOpen)} - onNotificationGranted={setNotificationsGranted} - onPublishMessageClick={() => setSendDialogOpenMode(PublishDialog.OPEN_MODE_DEFAULT)} - /> -
- - -
- -
+ (params.baseUrl && + expandUrl(params.baseUrl).includes(s.baseUrl) && + params.topic === s.topic) || + (window.location.origin === s.baseUrl && params.topic === s.topic) ); -} + }); + + useConnectionListeners(subscriptions, users); + useBackgroundProcesses(); + useEffect(() => updateTitle(newNotificationsCount), [newNotificationsCount]); + + return ( + + + setMobileDrawerOpen(!mobileDrawerOpen)} + /> + setMobileDrawerOpen(!mobileDrawerOpen)} + onNotificationGranted={setNotificationsGranted} + onPublishMessageClick={() => + setSendDialogOpenMode(PublishDialog.OPEN_MODE_DEFAULT) + } + /> +
+ + +
+ +
+ ); +}; const Main = (props) => { - return ( - theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[900] - }} - > - {props.children} - - ); + return ( + + theme.palette.mode === "light" + ? theme.palette.grey[100] + : theme.palette.grey[900], + }} + > + {props.children} + + ); }; const Loader = () => ( - theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[900] - }} - > - - + + theme.palette.mode === "light" + ? theme.palette.grey[100] + : theme.palette.grey[900], + }} + > + + ); const updateTitle = (newNotificationsCount) => { - document.title = (newNotificationsCount > 0) ? `(${newNotificationsCount}) ntfy` : "ntfy"; -} + document.title = + newNotificationsCount > 0 ? `(${newNotificationsCount}) ntfy` : "ntfy"; +}; export default App; diff --git a/web/src/components/AttachmentIcon.js b/web/src/components/AttachmentIcon.js index 337760b7..9939b3b3 100644 --- a/web/src/components/AttachmentIcon.js +++ b/web/src/components/AttachmentIcon.js @@ -5,43 +5,43 @@ import fileImage from "../img/file-image.svg"; import fileVideo from "../img/file-video.svg"; import fileAudio from "../img/file-audio.svg"; import fileApp from "../img/file-app.svg"; -import {useTranslation} from "react-i18next"; +import { useTranslation } from "react-i18next"; const AttachmentIcon = (props) => { - const { t } = useTranslation(); - const type = props.type; - let imageFile, imageLabel; - if (!type) { - imageFile = fileDocument; - imageLabel = t("notifications_attachment_file_image"); - } else if (type.startsWith('image/')) { - imageFile = fileImage; - imageLabel = t("notifications_attachment_file_video"); - } else if (type.startsWith('video/')) { - imageFile = fileVideo; - imageLabel = t("notifications_attachment_file_video"); - } else if (type.startsWith('audio/')) { - imageFile = fileAudio; - imageLabel = t("notifications_attachment_file_audio"); - } else if (type === "application/vnd.android.package-archive") { - imageFile = fileApp; - imageLabel = t("notifications_attachment_file_app"); - } else { - imageFile = fileDocument; - imageLabel = t("notifications_attachment_file_document"); - } - return ( - - ); -} + const { t } = useTranslation(); + const type = props.type; + let imageFile, imageLabel; + if (!type) { + imageFile = fileDocument; + imageLabel = t("notifications_attachment_file_image"); + } else if (type.startsWith("image/")) { + imageFile = fileImage; + imageLabel = t("notifications_attachment_file_video"); + } else if (type.startsWith("video/")) { + imageFile = fileVideo; + imageLabel = t("notifications_attachment_file_video"); + } else if (type.startsWith("audio/")) { + imageFile = fileAudio; + imageLabel = t("notifications_attachment_file_audio"); + } else if (type === "application/vnd.android.package-archive") { + imageFile = fileApp; + imageLabel = t("notifications_attachment_file_app"); + } else { + imageFile = fileDocument; + imageLabel = t("notifications_attachment_file_document"); + } + return ( + + ); +}; export default AttachmentIcon; diff --git a/web/src/components/DialogFooter.js b/web/src/components/DialogFooter.js index 68d17c73..5a2bd7aa 100644 --- a/web/src/components/DialogFooter.js +++ b/web/src/components/DialogFooter.js @@ -4,30 +4,30 @@ import DialogContentText from "@mui/material/DialogContentText"; import DialogActions from "@mui/material/DialogActions"; const DialogFooter = (props) => { - return ( - - - {props.status} - - - {props.children} - - - ); + return ( + + + {props.status} + + {props.children} + + ); }; export default DialogFooter; diff --git a/web/src/components/EmojiPicker.js b/web/src/components/EmojiPicker.js index 9b29e8f0..4ba50c01 100644 --- a/web/src/components/EmojiPicker.js +++ b/web/src/components/EmojiPicker.js @@ -1,15 +1,15 @@ -import * as React from 'react'; -import {useRef, useState} from 'react'; -import Typography from '@mui/material/Typography'; -import {rawEmojis} from '../app/emojis'; +import * as React from "react"; +import { useRef, useState } from "react"; +import Typography from "@mui/material/Typography"; +import { rawEmojis } from "../app/emojis"; import Box from "@mui/material/Box"; import TextField from "@mui/material/TextField"; -import {ClickAwayListener, Fade, InputAdornment, styled} from "@mui/material"; +import { ClickAwayListener, Fade, InputAdornment, styled } from "@mui/material"; import IconButton from "@mui/material/IconButton"; -import {Close} from "@mui/icons-material"; +import { Close } from "@mui/icons-material"; import Popper from "@mui/material/Popper"; -import {splitNoEmpty} from "../app/utils"; -import {useTranslation} from "react-i18next"; +import { splitNoEmpty } from "../app/utils"; +import { useTranslation } from "react-i18next"; // Create emoji list by category and create a search base (string with all search words) // @@ -17,163 +17,185 @@ import {useTranslation} from "react-i18next"; // This is a hack, but on Ubuntu 18.04, with Chrome 99, only Emoji <= 11 are supported. const emojisByCategory = {}; -const isDesktopChrome = /Chrome/.test(navigator.userAgent) && !/Mobile/.test(navigator.userAgent); +const isDesktopChrome = + /Chrome/.test(navigator.userAgent) && !/Mobile/.test(navigator.userAgent); const maxSupportedVersionForDesktopChrome = 11; -rawEmojis.forEach(emoji => { - if (!emojisByCategory[emoji.category]) { - emojisByCategory[emoji.category] = []; - } - try { - const unicodeVersion = parseFloat(emoji.unicode_version); - const supportedEmoji = unicodeVersion <= maxSupportedVersionForDesktopChrome || !isDesktopChrome; - if (supportedEmoji) { - const searchBase = `${emoji.description.toLowerCase()} ${emoji.aliases.join(" ")} ${emoji.tags.join(" ")}`; - const emojiWithSearchBase = { ...emoji, searchBase: searchBase }; - emojisByCategory[emoji.category].push(emojiWithSearchBase); - } - } catch (e) { - // Nothing. Ignore. +rawEmojis.forEach((emoji) => { + if (!emojisByCategory[emoji.category]) { + emojisByCategory[emoji.category] = []; + } + try { + const unicodeVersion = parseFloat(emoji.unicode_version); + const supportedEmoji = + unicodeVersion <= maxSupportedVersionForDesktopChrome || !isDesktopChrome; + if (supportedEmoji) { + const searchBase = `${emoji.description.toLowerCase()} ${emoji.aliases.join( + " ", + )} ${emoji.tags.join(" ")}`; + const emojiWithSearchBase = { ...emoji, searchBase: searchBase }; + emojisByCategory[emoji.category].push(emojiWithSearchBase); } + } catch (e) { + // Nothing. Ignore. + } }); const EmojiPicker = (props) => { - const { t } = useTranslation(); - const open = Boolean(props.anchorEl); - const [search, setSearch] = useState(""); - const searchRef = useRef(null); - const searchFields = splitNoEmpty(search.toLowerCase(), " "); + const { t } = useTranslation(); + const open = Boolean(props.anchorEl); + const [search, setSearch] = useState(""); + const searchRef = useRef(null); + const searchFields = splitNoEmpty(search.toLowerCase(), " "); - const handleSearchClear = () => { - setSearch(""); - searchRef.current?.focus(); - }; + const handleSearchClear = () => { + setSearch(""); + searchRef.current?.focus(); + }; - return ( - - {({ TransitionProps }) => ( - - - - setSearch(ev.target.value)} - type="text" - variant="standard" - fullWidth - sx={{ marginTop: 0, marginBottom: "12px", paddingRight: 2 }} - inputProps={{ - role: "searchbox", - "aria-label": t("emoji_picker_search_placeholder") - }} - InputProps={{ - endAdornment: - - - - - - }} - /> - - {Object.keys(emojisByCategory).map(category => - - )} - - - - - )} - - ); + return ( + + {({ TransitionProps }) => ( + + + + setSearch(ev.target.value)} + type="text" + variant="standard" + fullWidth + sx={{ marginTop: 0, marginBottom: "12px", paddingRight: 2 }} + inputProps={{ + role: "searchbox", + "aria-label": t("emoji_picker_search_placeholder"), + }} + InputProps={{ + endAdornment: ( + + + + + + ), + }} + /> + + {Object.keys(emojisByCategory).map((category) => ( + + ))} + + + + + )} + + ); }; const Category = (props) => { - const showTitle = props.search.length === 0; - return ( - <> - {showTitle && - - {props.title} - - } - {props.emojis.map(emoji => - props.onPick(emoji.aliases[0])} - /> - )} - - ); + const showTitle = props.search.length === 0; + return ( + <> + {showTitle && ( + + {props.title} + + )} + {props.emojis.map((emoji) => ( + props.onPick(emoji.aliases[0])} + /> + ))} + + ); }; const Emoji = (props) => { - const emoji = props.emoji; - const matches = emojiMatches(emoji, props.search); - const title = `${emoji.description} (${emoji.aliases[0]})`; - return ( - - {props.emoji.emoji} - - ); + const emoji = props.emoji; + const matches = emojiMatches(emoji, props.search); + const title = `${emoji.description} (${emoji.aliases[0]})`; + return ( + + {props.emoji.emoji} + + ); }; const EmojiDiv = styled("div")({ - fontSize: "30px", - width: "30px", - height: "30px", - marginTop: "8px", - marginBottom: "8px", - marginRight: "8px", - lineHeight: "30px", - cursor: "pointer", - opacity: 0.85, - "&:hover": { - opacity: 1 - } + fontSize: "30px", + width: "30px", + height: "30px", + marginTop: "8px", + marginBottom: "8px", + marginRight: "8px", + lineHeight: "30px", + cursor: "pointer", + opacity: 0.85, + "&:hover": { + opacity: 1, + }, }); const emojiMatches = (emoji, words) => { - if (words.length === 0) { - return true; - } - for (const word of words) { - if (emoji.searchBase.indexOf(word) === -1) { - return false; - } - } + if (words.length === 0) { return true; -} + } + for (const word of words) { + if (emoji.searchBase.indexOf(word) === -1) { + return false; + } + } + return true; +}; export default EmojiPicker; diff --git a/web/src/components/ErrorBoundary.js b/web/src/components/ErrorBoundary.js index c6d789a3..f74fbfc7 100644 --- a/web/src/components/ErrorBoundary.js +++ b/web/src/components/ErrorBoundary.js @@ -1,128 +1,151 @@ import * as React from "react"; import StackTrace from "stacktrace-js"; -import {CircularProgress, Link} from "@mui/material"; +import { CircularProgress, Link } from "@mui/material"; import Button from "@mui/material/Button"; -import {Trans, withTranslation} from "react-i18next"; +import { Trans, withTranslation } from "react-i18next"; class ErrorBoundaryImpl extends React.Component { - constructor(props) { - super(props); - this.state = { - error: false, - originalStack: null, - niceStack: null, - unsupportedIndexedDB: false - }; + constructor(props) { + super(props); + this.state = { + error: false, + originalStack: null, + niceStack: null, + unsupportedIndexedDB: false, + }; + } + + componentDidCatch(error, info) { + console.error("[ErrorBoundary] Error caught", error, info); + + // Special case for unsupported IndexedDB in Private Browsing mode (Firefox, Safari), see + // - https://github.com/dexie/Dexie.js/issues/312 + // - https://bugzilla.mozilla.org/show_bug.cgi?id=781982 + const isUnsupportedIndexedDB = + error?.name === "InvalidStateError" || + (error?.name === "DatabaseClosedError" && + error?.message?.indexOf("InvalidStateError") !== -1); + + if (isUnsupportedIndexedDB) { + this.handleUnsupportedIndexedDB(); + } else { + this.handleError(error, info); } + } - componentDidCatch(error, info) { - console.error("[ErrorBoundary] Error caught", error, info); + handleError(error, info) { + // Immediately render original stack trace + const prettierOriginalStack = info.componentStack + .trim() + .split("\n") + .map((line) => ` at ${line}`) + .join("\n"); + this.setState({ + error: true, + originalStack: `${error.toString()}\n${prettierOriginalStack}`, + }); - // Special case for unsupported IndexedDB in Private Browsing mode (Firefox, Safari), see - // - https://github.com/dexie/Dexie.js/issues/312 - // - https://bugzilla.mozilla.org/show_bug.cgi?id=781982 - const isUnsupportedIndexedDB = error?.name === "InvalidStateError" || - (error?.name === "DatabaseClosedError" && error?.message?.indexOf("InvalidStateError") !== -1); + // Fetch additional info and a better stack trace + StackTrace.fromError(error).then((stack) => { + console.error("[ErrorBoundary] Stacktrace fetched", stack); + const niceStack = + `${error.toString()}\n` + + stack + .map( + (el) => + ` at ${el.functionName} (${el.fileName}:${el.columnNumber}:${el.lineNumber})`, + ) + .join("\n"); + this.setState({ niceStack }); + }); + } - if (isUnsupportedIndexedDB) { - this.handleUnsupportedIndexedDB(); - } else { - this.handleError(error, info); - } + handleUnsupportedIndexedDB() { + this.setState({ + error: true, + unsupportedIndexedDB: true, + }); + } + + copyStack() { + let stack = ""; + if (this.state.niceStack) { + stack += `${this.state.niceStack}\n\n`; } + stack += `${this.state.originalStack}\n`; + navigator.clipboard.writeText(stack); + } - handleError(error, info) { - // Immediately render original stack trace - const prettierOriginalStack = info.componentStack - .trim() - .split("\n") - .map(line => ` at ${line}`) - .join("\n"); - this.setState({ - error: true, - originalStack: `${error.toString()}\n${prettierOriginalStack}` - }); - - // Fetch additional info and a better stack trace - StackTrace.fromError(error).then(stack => { - console.error("[ErrorBoundary] Stacktrace fetched", stack); - const niceStack = `${error.toString()}\n` + stack.map( el => ` at ${el.functionName} (${el.fileName}:${el.columnNumber}:${el.lineNumber})`).join("\n"); - this.setState({ niceStack }); - }); + render() { + if (this.state.error) { + if (this.state.unsupportedIndexedDB) { + return this.renderUnsupportedIndexedDB(); + } else { + return this.renderError(); + } } + return this.props.children; + } - handleUnsupportedIndexedDB() { - this.setState({ - error: true, - unsupportedIndexedDB: true - }); - } + renderUnsupportedIndexedDB() { + const { t } = this.props; + return ( +
+

{t("error_boundary_unsupported_indexeddb_title")} 😮

+

+ + ), + discordLink: , + matrixLink: , + }} + /> +

+
+ ); + } - copyStack() { - let stack = ""; - if (this.state.niceStack) { - stack += `${this.state.niceStack}\n\n`; - } - stack += `${this.state.originalStack}\n`; - navigator.clipboard.writeText(stack); - } - - render() { - if (this.state.error) { - if (this.state.unsupportedIndexedDB) { - return this.renderUnsupportedIndexedDB(); - } else { - return this.renderError(); - } - } - return this.props.children; - } - - renderUnsupportedIndexedDB() { - const { t } = this.props; - return ( -
-

{t("error_boundary_unsupported_indexeddb_title")} 😮

-

- , - discordLink: , - matrixLink: - }} - /> -

-
- ); - } - - renderError() { - const { t } = this.props; - return ( -
-

{t("error_boundary_title")} 😮

-

- , - discordLink: , - matrixLink: - }} - /> -

-

- -

-

{t("error_boundary_stack_trace")}

- {this.state.niceStack - ?
{this.state.niceStack}
- : <> {t("error_boundary_gathering_info")}} -
{this.state.originalStack}
-
- ); - } + renderError() { + const { t } = this.props; + return ( +
+

{t("error_boundary_title")} 😮

+

+ + ), + discordLink: , + matrixLink: , + }} + /> +

+

+ +

+

{t("error_boundary_stack_trace")}

+ {this.state.niceStack ? ( +
{this.state.niceStack}
+ ) : ( + <> + {" "} + {t("error_boundary_gathering_info")} + + )} +
{this.state.originalStack}
+
+ ); + } } const ErrorBoundary = withTranslation()(ErrorBoundaryImpl); // Adds props.t diff --git a/web/src/components/Messaging.js b/web/src/components/Messaging.js index 4ba1203f..f1fa106c 100644 --- a/web/src/components/Messaging.js +++ b/web/src/components/Messaging.js @@ -1,5 +1,5 @@ -import * as React from 'react'; -import {useState} from 'react'; +import * as React from "react"; +import { useState } from "react"; import Navigation from "./Navigation"; import Paper from "@mui/material/Paper"; import IconButton from "@mui/material/IconButton"; @@ -7,108 +7,135 @@ import TextField from "@mui/material/TextField"; import SendIcon from "@mui/icons-material/Send"; import api from "../app/Api"; import PublishDialog from "./PublishDialog"; -import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import {Portal, Snackbar} from "@mui/material"; -import {useTranslation} from "react-i18next"; +import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; +import { Portal, Snackbar } from "@mui/material"; +import { useTranslation } from "react-i18next"; const Messaging = (props) => { - const [message, setMessage] = useState(""); - const [dialogKey, setDialogKey] = useState(0); + const [message, setMessage] = useState(""); + const [dialogKey, setDialogKey] = useState(0); - const dialogOpenMode = props.dialogOpenMode; - const subscription = props.selected; + const dialogOpenMode = props.dialogOpenMode; + const subscription = props.selected; - const handleOpenDialogClick = () => { - props.onDialogOpenModeChange(PublishDialog.OPEN_MODE_DEFAULT); - }; + const handleOpenDialogClick = () => { + props.onDialogOpenModeChange(PublishDialog.OPEN_MODE_DEFAULT); + }; - const handleDialogClose = () => { - props.onDialogOpenModeChange(""); - setDialogKey(prev => prev+1); - }; + const handleDialogClose = () => { + props.onDialogOpenModeChange(""); + setDialogKey((prev) => prev + 1); + }; - return ( - <> - {subscription && } - props.onDialogOpenModeChange(prev => (prev) ? prev : PublishDialog.OPEN_MODE_DRAG)} // Only update if not already open - onResetOpenMode={() => props.onDialogOpenModeChange(PublishDialog.OPEN_MODE_DEFAULT)} - /> - - ); -} + return ( + <> + {subscription && ( + + )} + + props.onDialogOpenModeChange((prev) => + prev ? prev : PublishDialog.OPEN_MODE_DRAG, + ) + } // Only update if not already open + onResetOpenMode={() => + props.onDialogOpenModeChange(PublishDialog.OPEN_MODE_DEFAULT) + } + /> + + ); +}; const MessageBar = (props) => { - const { t } = useTranslation(); - const subscription = props.subscription; - const [snackOpen, setSnackOpen] = useState(false); - const handleSendClick = async () => { - try { - await api.publish(subscription.baseUrl, subscription.topic, props.message); - } catch (e) { - console.log(`[MessageBar] Error publishing message`, e); - setSnackOpen(true); - } - props.onMessageChange(""); - }; - return ( - theme.palette.mode === 'light' ? theme.palette.grey[100] : theme.palette.grey[900] - }} - > - - - - props.onMessageChange(ev.target.value)} - onKeyPress={(ev) => { - if (ev.key === 'Enter') { - ev.preventDefault(); - handleSendClick(); - } - }} - /> - - - - - setSnackOpen(false)} - message={t("message_bar_error_publishing")} - /> - - - ); + const { t } = useTranslation(); + const subscription = props.subscription; + const [snackOpen, setSnackOpen] = useState(false); + const handleSendClick = async () => { + try { + await api.publish( + subscription.baseUrl, + subscription.topic, + props.message, + ); + } catch (e) { + console.log(`[MessageBar] Error publishing message`, e); + setSnackOpen(true); + } + props.onMessageChange(""); + }; + return ( + + theme.palette.mode === "light" + ? theme.palette.grey[100] + : theme.palette.grey[900], + }} + > + + + + props.onMessageChange(ev.target.value)} + onKeyPress={(ev) => { + if (ev.key === "Enter") { + ev.preventDefault(); + handleSendClick(); + } + }} + /> + + + + + setSnackOpen(false)} + message={t("message_bar_error_publishing")} + /> + + + ); }; export default Messaging; diff --git a/web/src/components/Navigation.js b/web/src/components/Navigation.js index 694da59e..ee4e40a6 100644 --- a/web/src/components/Navigation.js +++ b/web/src/components/Navigation.js @@ -1,6 +1,6 @@ import Drawer from "@mui/material/Drawer"; import * as React from "react"; -import {useState} from "react"; +import { useState } from "react"; import ListItemButton from "@mui/material/ListItemButton"; import ListItemIcon from "@mui/material/ListItemIcon"; import ChatBubbleOutlineIcon from "@mui/icons-material/ChatBubbleOutline"; @@ -11,238 +11,324 @@ import List from "@mui/material/List"; import SettingsIcon from "@mui/icons-material/Settings"; import AddIcon from "@mui/icons-material/Add"; import SubscribeDialog from "./SubscribeDialog"; -import {Alert, AlertTitle, Badge, CircularProgress, Link, ListSubheader} from "@mui/material"; +import { + Alert, + AlertTitle, + Badge, + CircularProgress, + Link, + ListSubheader, +} from "@mui/material"; import Button from "@mui/material/Button"; import Typography from "@mui/material/Typography"; -import {openUrl, topicDisplayName, topicUrl} from "../app/utils"; +import { openUrl, topicDisplayName, topicUrl } from "../app/utils"; import routes from "./routes"; -import {ConnectionState} from "../app/Connection"; -import {useLocation, useNavigate} from "react-router-dom"; +import { ConnectionState } from "../app/Connection"; +import { useLocation, useNavigate } from "react-router-dom"; import subscriptionManager from "../app/SubscriptionManager"; -import {ChatBubble, NotificationsOffOutlined, Send} from "@mui/icons-material"; +import { + ChatBubble, + NotificationsOffOutlined, + Send, +} from "@mui/icons-material"; import Box from "@mui/material/Box"; import notifier from "../app/Notifier"; import config from "../app/config"; -import ArticleIcon from '@mui/icons-material/Article'; -import {Trans, useTranslation} from "react-i18next"; +import ArticleIcon from "@mui/icons-material/Article"; +import { Trans, useTranslation } from "react-i18next"; const navWidth = 280; const Navigation = (props) => { - const navigationList = ; - return ( - - {/* Mobile drawer; only shown if menu icon clicked (mobile open) and display is small */} - - {navigationList} - - {/* Big screen drawer; persistent, shown if screen is big */} - - {navigationList} - - - ); + const navigationList = ; + return ( + + {/* Mobile drawer; only shown if menu icon clicked (mobile open) and display is small */} + + {navigationList} + + {/* Big screen drawer; persistent, shown if screen is big */} + + {navigationList} + + + ); }; Navigation.width = navWidth; const NavList = (props) => { - const { t } = useTranslation(); - const navigate = useNavigate(); - const location = useLocation(); - const [subscribeDialogKey, setSubscribeDialogKey] = useState(0); - const [subscribeDialogOpen, setSubscribeDialogOpen] = useState(false); + const { t } = useTranslation(); + const navigate = useNavigate(); + const location = useLocation(); + const [subscribeDialogKey, setSubscribeDialogKey] = useState(0); + const [subscribeDialogOpen, setSubscribeDialogOpen] = useState(false); - const handleSubscribeReset = () => { - setSubscribeDialogOpen(false); - setSubscribeDialogKey(prev => prev+1); - } + const handleSubscribeReset = () => { + setSubscribeDialogOpen(false); + setSubscribeDialogKey((prev) => prev + 1); + }; - const handleSubscribeSubmit = (subscription) => { - console.log(`[Navigation] New subscription: ${subscription.id}`, subscription); - handleSubscribeReset(); - navigate(routes.forSubscription(subscription)); - handleRequestNotificationPermission(); - } - - const handleRequestNotificationPermission = () => { - notifier.maybeRequestPermission(granted => props.onNotificationGranted(granted)) - }; - - const showSubscriptionsList = props.subscriptions?.length > 0; - const showNotificationBrowserNotSupportedBox = !notifier.browserSupported(); - const showNotificationContextNotSupportedBox = notifier.browserSupported() && !notifier.contextSupported(); // Only show if notifications are generally supported in the browser - const showNotificationGrantBox = notifier.supported() && props.subscriptions?.length > 0 && !props.notificationsGranted; - const navListPadding = (showNotificationGrantBox || showNotificationBrowserNotSupportedBox || showNotificationContextNotSupportedBox) ? '0' : ''; - - return ( - <> - - - {showNotificationBrowserNotSupportedBox && } - {showNotificationContextNotSupportedBox && } - {showNotificationGrantBox && } - {!showSubscriptionsList && - navigate(routes.root)} selected={location.pathname === config.appRoot}> - - - } - {showSubscriptionsList && - <> - {t("nav_topics_title")} - navigate(routes.root)} selected={location.pathname === config.appRoot}> - - - - - - } - navigate(routes.settings)} selected={location.pathname === routes.settings}> - - - - openUrl("/docs")}> - - - - props.onPublishMessageClick()}> - - - - setSubscribeDialogOpen(true)}> - - - - - - + const handleSubscribeSubmit = (subscription) => { + console.log( + `[Navigation] New subscription: ${subscription.id}`, + subscription, ); + handleSubscribeReset(); + navigate(routes.forSubscription(subscription)); + handleRequestNotificationPermission(); + }; + + const handleRequestNotificationPermission = () => { + notifier.maybeRequestPermission((granted) => + props.onNotificationGranted(granted), + ); + }; + + const showSubscriptionsList = props.subscriptions?.length > 0; + const showNotificationBrowserNotSupportedBox = !notifier.browserSupported(); + const showNotificationContextNotSupportedBox = + notifier.browserSupported() && !notifier.contextSupported(); // Only show if notifications are generally supported in the browser + const showNotificationGrantBox = + notifier.supported() && + props.subscriptions?.length > 0 && + !props.notificationsGranted; + const navListPadding = + showNotificationGrantBox || + showNotificationBrowserNotSupportedBox || + showNotificationContextNotSupportedBox + ? "0" + : ""; + + return ( + <> + + + {showNotificationBrowserNotSupportedBox && ( + + )} + {showNotificationContextNotSupportedBox && ( + + )} + {showNotificationGrantBox && ( + + )} + {!showSubscriptionsList && ( + navigate(routes.root)} + selected={location.pathname === config.appRoot} + > + + + + + + )} + {showSubscriptionsList && ( + <> + {t("nav_topics_title")} + navigate(routes.root)} + selected={location.pathname === config.appRoot} + > + + + + + + + + + )} + navigate(routes.settings)} + selected={location.pathname === routes.settings} + > + + + + + + openUrl("/docs")}> + + + + + + props.onPublishMessageClick()}> + + + + + + setSubscribeDialogOpen(true)}> + + + + + + + + + ); }; const SubscriptionList = (props) => { - const sortedSubscriptions = props.subscriptions.sort( (a, b) => { - return (topicUrl(a.baseUrl, a.topic) < topicUrl(b.baseUrl, b.topic)) ? -1 : 1; - }); - return ( - <> - {sortedSubscriptions.map(subscription => - )} - - ); -} + const sortedSubscriptions = props.subscriptions.sort((a, b) => { + return topicUrl(a.baseUrl, a.topic) < topicUrl(b.baseUrl, b.topic) ? -1 : 1; + }); + return ( + <> + {sortedSubscriptions.map((subscription) => ( + + ))} + + ); +}; const SubscriptionItem = (props) => { - const { t } = useTranslation(); - const navigate = useNavigate(); - const subscription = props.subscription; - const iconBadge = (subscription.new <= 99) ? subscription.new : "99+"; - const icon = (subscription.state === ConnectionState.Connecting) - ? - : ; - const displayName = topicDisplayName(subscription); - const ariaLabel = (subscription.state === ConnectionState.Connecting) - ? `${displayName} (${t("nav_button_connecting")})` - : displayName; - const handleClick = async () => { - navigate(routes.forSubscription(subscription)); - await subscriptionManager.markNotificationsRead(subscription.id); - }; - return ( - - {icon} - - {subscription.mutedUntil > 0 && - } - + const { t } = useTranslation(); + const navigate = useNavigate(); + const subscription = props.subscription; + const iconBadge = subscription.new <= 99 ? subscription.new : "99+"; + const icon = + subscription.state === ConnectionState.Connecting ? ( + + ) : ( + + + ); + const displayName = topicDisplayName(subscription); + const ariaLabel = + subscription.state === ConnectionState.Connecting + ? `${displayName} (${t("nav_button_connecting")})` + : displayName; + const handleClick = async () => { + navigate(routes.forSubscription(subscription)); + await subscriptionManager.markNotificationsRead(subscription.id); + }; + return ( + + {icon} + + {subscription.mutedUntil > 0 && ( + + + + )} + + ); }; const NotificationGrantAlert = (props) => { - const { t } = useTranslation(); - return ( - <> - - {t("alert_grant_title")} - {t("alert_grant_description")} - - - - - ); + const { t } = useTranslation(); + return ( + <> + + {t("alert_grant_title")} + {t("alert_grant_description")} + + + + + ); }; const NotificationBrowserNotSupportedAlert = () => { - const { t } = useTranslation(); - return ( - <> - - {t("alert_not_supported_title")} - {t("alert_not_supported_description")} - - - - ); + const { t } = useTranslation(); + return ( + <> + + {t("alert_not_supported_title")} + + {t("alert_not_supported_description")} + + + + + ); }; const NotificationContextNotSupportedAlert = () => { - const { t } = useTranslation(); - return ( - <> - - {t("alert_not_supported_title")} - - - }} - /> - - - - - ); + const { t } = useTranslation(); + return ( + <> + + {t("alert_not_supported_title")} + + + ), + }} + /> + + + + + ); }; export default Navigation; diff --git a/web/src/components/Notifications.js b/web/src/components/Notifications.js index 9a4baf7c..09ac5790 100644 --- a/web/src/components/Notifications.js +++ b/web/src/components/Notifications.js @@ -1,35 +1,40 @@ import Container from "@mui/material/Container"; import { - ButtonBase, - CardActions, - CardContent, - CircularProgress, - Fade, - Link, - Modal, - Snackbar, - Stack, - Tooltip + ButtonBase, + CardActions, + CardContent, + CircularProgress, + Fade, + Link, + Modal, + Snackbar, + Stack, + Tooltip, } from "@mui/material"; import Card from "@mui/material/Card"; import Typography from "@mui/material/Typography"; import * as React from "react"; -import {useEffect, useState} from "react"; +import { useEffect, useState } from "react"; import { - formatBytes, - formatMessage, - formatShortDateTime, - formatTitle, maybeAppendActionErrors, - openUrl, - shortUrl, - topicShortUrl, - unmatchedTags + formatBytes, + formatMessage, + formatShortDateTime, + formatTitle, + maybeAppendActionErrors, + openUrl, + shortUrl, + topicShortUrl, + unmatchedTags, } from "../app/utils"; import IconButton from "@mui/material/IconButton"; -import CheckIcon from '@mui/icons-material/Check'; -import CloseIcon from '@mui/icons-material/Close'; -import {LightboxBackdrop, Paragraph, VerticallyCenteredContainer} from "./styles"; -import {useLiveQuery} from "dexie-react-hooks"; +import CheckIcon from "@mui/icons-material/Check"; +import CloseIcon from "@mui/icons-material/Close"; +import { + LightboxBackdrop, + Paragraph, + VerticallyCenteredContainer, +} from "./styles"; +import { useLiveQuery } from "dexie-react-hooks"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import subscriptionManager from "../app/SubscriptionManager"; @@ -40,172 +45,256 @@ import priority4 from "../img/priority-4.svg"; import priority5 from "../img/priority-5.svg"; import logoOutline from "../img/ntfy-outline.svg"; import AttachmentIcon from "./AttachmentIcon"; -import {Trans, useTranslation} from "react-i18next"; +import { Trans, useTranslation } from "react-i18next"; const Notifications = (props) => { - if (props.mode === "all") { - return (props.subscriptions) ? : ; - } - return (props.subscription) ? : ; -} + if (props.mode === "all") { + return props.subscriptions ? ( + + ) : ( + + ); + } + return props.subscription ? ( + + ) : ( + + ); +}; const AllSubscriptions = (props) => { - const subscriptions = props.subscriptions; - const notifications = useLiveQuery(() => subscriptionManager.getAllNotifications(), []); - if (notifications === null || notifications === undefined) { - return ; - } else if (subscriptions.length === 0) { - return ; - } else if (notifications.length === 0) { - return ; - } - return ; -} + const subscriptions = props.subscriptions; + const notifications = useLiveQuery( + () => subscriptionManager.getAllNotifications(), + [], + ); + if (notifications === null || notifications === undefined) { + return ; + } else if (subscriptions.length === 0) { + return ; + } else if (notifications.length === 0) { + return ; + } + return ( + + ); +}; const SingleSubscription = (props) => { - const subscription = props.subscription; - const notifications = useLiveQuery(() => subscriptionManager.getNotifications(subscription.id), [subscription]); - if (notifications === null || notifications === undefined) { - return ; - } else if (notifications.length === 0) { - return ; - } - return ; -} + const subscription = props.subscription; + const notifications = useLiveQuery( + () => subscriptionManager.getNotifications(subscription.id), + [subscription], + ); + if (notifications === null || notifications === undefined) { + return ; + } else if (notifications.length === 0) { + return ; + } + return ( + + ); +}; const NotificationList = (props) => { - const { t } = useTranslation(); - const pageSize = 20; - const notifications = props.notifications; - const [snackOpen, setSnackOpen] = useState(false); - const [maxCount, setMaxCount] = useState(pageSize); - const count = Math.min(notifications.length, maxCount); + const { t } = useTranslation(); + const pageSize = 20; + const notifications = props.notifications; + const [snackOpen, setSnackOpen] = useState(false); + const [maxCount, setMaxCount] = useState(pageSize); + const count = Math.min(notifications.length, maxCount); - useEffect(() => { - return () => { - setMaxCount(pageSize); - document.getElementById("main").scrollTo(0, 0); - } - }, [props.id]); + useEffect(() => { + return () => { + setMaxCount(pageSize); + document.getElementById("main").scrollTo(0, 0); + }; + }, [props.id]); - return ( - setMaxCount(prev => prev + pageSize)} - hasMore={count < notifications.length} - loader={<>Loading ...} - scrollThreshold={0.7} - scrollableTarget="main" - > - - - {notifications.slice(0, count).map(notification => - setSnackOpen(true)} - />)} - setSnackOpen(false)} - message={t("notifications_copied_to_clipboard")} - /> - - - - ); -} + return ( + setMaxCount((prev) => prev + pageSize)} + hasMore={count < notifications.length} + loader={<>Loading ...} + scrollThreshold={0.7} + scrollableTarget="main" + > + + + {notifications.slice(0, count).map((notification) => ( + setSnackOpen(true)} + /> + ))} + setSnackOpen(false)} + message={t("notifications_copied_to_clipboard")} + /> + + + + ); +}; const NotificationItem = (props) => { - const { t } = useTranslation(); - const notification = props.notification; - const attachment = notification.attachment; - const date = formatShortDateTime(notification.time); - const otherTags = unmatchedTags(notification.tags); - const tags = (otherTags.length > 0) ? otherTags.join(', ') : null; - const handleDelete = async () => { - console.log(`[Notifications] Deleting notification ${notification.id}`); - await subscriptionManager.deleteNotification(notification.id) - } - const handleMarkRead = async () => { - console.log(`[Notifications] Marking notification ${notification.id} as read`); - await subscriptionManager.markNotificationRead(notification.id) - } - const handleCopy = (s) => { - navigator.clipboard.writeText(s); - props.onShowSnack(); - }; - const expired = attachment && attachment.expires && attachment.expires < Date.now()/1000; - const hasAttachmentActions = attachment && !expired; - const hasClickAction = notification.click; - const hasUserActions = notification.actions && notification.actions.length > 0; - const showActions = hasAttachmentActions || hasClickAction || hasUserActions; - return ( - - - - - - - - {notification.new === 1 && - - - - - } - - {date} - {[1,2,4,5].includes(notification.priority) && - {t("notifications_priority_x",} - {notification.new === 1 && - - - } - - {notification.title && {formatTitle(notification)}} - - {autolink(maybeAppendActionErrors(formatMessage(notification), notification))} - - {attachment && } - {tags && {t("notifications_tags")}: {tags}} - - {showActions && - - {hasAttachmentActions && <> - - - - - - - } - {hasClickAction && <> - - - - - - - } - {hasUserActions && } - } - + const { t } = useTranslation(); + const notification = props.notification; + const attachment = notification.attachment; + const date = formatShortDateTime(notification.time); + const otherTags = unmatchedTags(notification.tags); + const tags = otherTags.length > 0 ? otherTags.join(", ") : null; + const handleDelete = async () => { + console.log(`[Notifications] Deleting notification ${notification.id}`); + await subscriptionManager.deleteNotification(notification.id); + }; + const handleMarkRead = async () => { + console.log( + `[Notifications] Marking notification ${notification.id} as read`, ); -} + await subscriptionManager.markNotificationRead(notification.id); + }; + const handleCopy = (s) => { + navigator.clipboard.writeText(s); + props.onShowSnack(); + }; + const expired = + attachment && attachment.expires && attachment.expires < Date.now() / 1000; + const hasAttachmentActions = attachment && !expired; + const hasClickAction = notification.click; + const hasUserActions = + notification.actions && notification.actions.length > 0; + const showActions = hasAttachmentActions || hasClickAction || hasUserActions; + return ( + + + + + + + + {notification.new === 1 && ( + + + + + + )} + + {date} + {[1, 2, 4, 5].includes(notification.priority) && ( + {t("notifications_priority_x", + )} + {notification.new === 1 && ( + + + + )} + + {notification.title && ( + + {formatTitle(notification)} + + )} + + {autolink( + maybeAppendActionErrors(formatMessage(notification), notification), + )} + + {attachment && } + {tags && ( + + {t("notifications_tags")}: {tags} + + )} + + {showActions && ( + + {hasAttachmentActions && ( + <> + + + + + + + + )} + {hasClickAction && ( + <> + + + + + + + + )} + {hasUserActions && } + + )} + + ); +}; /** * Replace links with components; this is a combination of the genius function @@ -215,320 +304,417 @@ const NotificationItem = (props) => { * [2] https://github.com/bryanwoods/autolink-js/blob/master/autolink.js#L9 */ const autolink = (s) => { - const parts = s.split(/(\bhttps?:\/\/[\-A-Z0-9+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|]\b)/gi); - for (let i = 1; i < parts.length; i += 2) { - parts[i] = {shortUrl(parts[i])}; - } - return <>{parts}; + const parts = s.split( + /(\bhttps?:\/\/[\-A-Z0-9+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|]\b)/gi, + ); + for (let i = 1; i < parts.length; i += 2) { + parts[i] = ( + + {shortUrl(parts[i])} + + ); + } + return <>{parts}; }; const priorityFiles = { - 1: priority1, - 2: priority2, - 4: priority4, - 5: priority5 + 1: priority1, + 2: priority2, + 4: priority4, + 5: priority5, }; const Attachment = (props) => { - const { t } = useTranslation(); - const attachment = props.attachment; - const expired = attachment.expires && attachment.expires < Date.now()/1000; - const expires = attachment.expires && attachment.expires > Date.now()/1000; - const displayableImage = !expired && attachment.type && attachment.type.startsWith("image/"); + const { t } = useTranslation(); + const attachment = props.attachment; + const expired = attachment.expires && attachment.expires < Date.now() / 1000; + const expires = attachment.expires && attachment.expires > Date.now() / 1000; + const displayableImage = + !expired && attachment.type && attachment.type.startsWith("image/"); - // Unexpired image - if (displayableImage) { - return ; - } + // Unexpired image + if (displayableImage) { + return ; + } - // Anything else: Show box - const infos = []; - if (attachment.size) { - infos.push(formatBytes(attachment.size)); - } - if (expires) { - infos.push(t("notifications_attachment_link_expires", { date: formatShortDateTime(attachment.expires) })); - } - if (expired) { - infos.push(t("notifications_attachment_link_expired")); - } - const maybeInfoText = (infos.length > 0) ? <>
{infos.join(", ")} : null; - - // If expired, just show infos without click target - if (expired) { - return ( - - - - {attachment.name} - {maybeInfoText} - - - ); - } - - // Not expired - return ( - - - - - {attachment.name} - {maybeInfoText} - - - + // Anything else: Show box + const infos = []; + if (attachment.size) { + infos.push(formatBytes(attachment.size)); + } + if (expires) { + infos.push( + t("notifications_attachment_link_expires", { + date: formatShortDateTime(attachment.expires), + }), ); + } + if (expired) { + infos.push(t("notifications_attachment_link_expired")); + } + const maybeInfoText = + infos.length > 0 ? ( + <> +
+ {infos.join(", ")} + + ) : null; + + // If expired, just show infos without click target + if (expired) { + return ( + + + + {attachment.name} + {maybeInfoText} + + + ); + } + + // Not expired + return ( + + + + + {attachment.name} + {maybeInfoText} + + + + ); }; const Image = (props) => { - const { t } = useTranslation(); - const [open, setOpen] = useState(false); - return ( - <> - setOpen(true)} - sx={{ - marginTop: 2, - borderRadius: '4px', - boxShadow: 2, - width: 1, - maxHeight: '400px', - objectFit: 'cover', - cursor: 'pointer' - }} - /> - setOpen(false)} - BackdropComponent={LightboxBackdrop} - > - - - - - - ); -} + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + return ( + <> + setOpen(true)} + sx={{ + marginTop: 2, + borderRadius: "4px", + boxShadow: 2, + width: 1, + maxHeight: "400px", + objectFit: "cover", + cursor: "pointer", + }} + /> + setOpen(false)} + BackdropComponent={LightboxBackdrop} + > + + + + + + ); +}; const UserActions = (props) => { - return ( - <>{props.notification.actions.map(action => - )} - ); + return ( + <> + {props.notification.actions.map((action) => ( + + ))} + + ); }; const UserAction = (props) => { - const { t } = useTranslation(); - const notification = props.notification; - const action = props.action; - if (action.action === "broadcast") { - return ( - - - - ); - } else if (action.action === "view") { - return ( - - - - ); - } else if (action.action === "http") { - const method = action.method ?? "POST"; - const label = action.label + (ACTION_LABEL_SUFFIX[action.progress ?? 0] ?? ""); - return ( - - - - ); - } - return null; // Others + const { t } = useTranslation(); + const notification = props.notification; + const action = props.action; + if (action.action === "broadcast") { + return ( + + + + + + ); + } else if (action.action === "view") { + return ( + + + + ); + } else if (action.action === "http") { + const method = action.method ?? "POST"; + const label = + action.label + (ACTION_LABEL_SUFFIX[action.progress ?? 0] ?? ""); + return ( + + + + ); + } + return null; // Others }; const performHttpAction = async (notification, action) => { - console.log(`[Notifications] Performing HTTP user action`, action); - try { - updateActionStatus(notification, action, ACTION_PROGRESS_ONGOING, null); - const response = await fetch(action.url, { - method: action.method ?? "POST", - headers: action.headers ?? {}, - // This must not null-coalesce to a non nullish value. Otherwise, the fetch API - // will reject it for "having a body" - body: action.body - }); - console.log(`[Notifications] HTTP user action response`, response); - const success = response.status >= 200 && response.status <= 299; - if (success) { - updateActionStatus(notification, action, ACTION_PROGRESS_SUCCESS, null); - } else { - updateActionStatus(notification, action, ACTION_PROGRESS_FAILED, `${action.label}: Unexpected response HTTP ${response.status}`); - } - } catch (e) { - console.log(`[Notifications] HTTP action failed`, e); - updateActionStatus(notification, action, ACTION_PROGRESS_FAILED, `${action.label}: ${e} Check developer console for details.`); + console.log(`[Notifications] Performing HTTP user action`, action); + try { + updateActionStatus(notification, action, ACTION_PROGRESS_ONGOING, null); + const response = await fetch(action.url, { + method: action.method ?? "POST", + headers: action.headers ?? {}, + // This must not null-coalesce to a non nullish value. Otherwise, the fetch API + // will reject it for "having a body" + body: action.body, + }); + console.log(`[Notifications] HTTP user action response`, response); + const success = response.status >= 200 && response.status <= 299; + if (success) { + updateActionStatus(notification, action, ACTION_PROGRESS_SUCCESS, null); + } else { + updateActionStatus( + notification, + action, + ACTION_PROGRESS_FAILED, + `${action.label}: Unexpected response HTTP ${response.status}`, + ); } + } catch (e) { + console.log(`[Notifications] HTTP action failed`, e); + updateActionStatus( + notification, + action, + ACTION_PROGRESS_FAILED, + `${action.label}: ${e} Check developer console for details.`, + ); + } }; const updateActionStatus = (notification, action, progress, error) => { - notification.actions = notification.actions.map(a => { - if (a.id !== action.id) { - return a; - } - return { ...a, progress: progress, error: error }; - }); - subscriptionManager.updateNotification(notification); -} + notification.actions = notification.actions.map((a) => { + if (a.id !== action.id) { + return a; + } + return { ...a, progress: progress, error: error }; + }); + subscriptionManager.updateNotification(notification); +}; const ACTION_PROGRESS_ONGOING = 1; const ACTION_PROGRESS_SUCCESS = 2; const ACTION_PROGRESS_FAILED = 3; const ACTION_LABEL_SUFFIX = { - [ACTION_PROGRESS_ONGOING]: " …", - [ACTION_PROGRESS_SUCCESS]: " ✔", - [ACTION_PROGRESS_FAILED]: " ❌" + [ACTION_PROGRESS_ONGOING]: " …", + [ACTION_PROGRESS_SUCCESS]: " ✔", + [ACTION_PROGRESS_FAILED]: " ❌", }; const NoNotifications = (props) => { - const { t } = useTranslation(); - const shortUrl = topicShortUrl(props.subscription.baseUrl, props.subscription.topic); - return ( - - - {t("action_bar_logo_alt")}/
- {t("notifications_none_for_topic_title")} -
- - {t("notifications_none_for_topic_description")} - - - {t("notifications_example")}:
- - $ curl -d "Hi" {shortUrl} - -
- - - -
- ); + const { t } = useTranslation(); + const shortUrl = topicShortUrl( + props.subscription.baseUrl, + props.subscription.topic, + ); + return ( + + + {t("action_bar_logo_alt")} +
+ {t("notifications_none_for_topic_title")} +
+ {t("notifications_none_for_topic_description")} + + {t("notifications_example")}:
+ $ curl -d "Hi" {shortUrl} +
+ + + +
+ ); }; const NoNotificationsWithoutSubscription = (props) => { - const { t } = useTranslation(); - const subscription = props.subscriptions[0]; - const shortUrl = topicShortUrl(subscription.baseUrl, subscription.topic); - return ( - - - {t("action_bar_logo_alt")}/
- {t("notifications_none_for_any_title")} -
- - {t("notifications_none_for_any_description")} - - - {t("notifications_example")}:
- - $ curl -d "Hi" {shortUrl} - -
- - - -
- ); + const { t } = useTranslation(); + const subscription = props.subscriptions[0]; + const shortUrl = topicShortUrl(subscription.baseUrl, subscription.topic); + return ( + + + {t("action_bar_logo_alt")} +
+ {t("notifications_none_for_any_title")} +
+ {t("notifications_none_for_any_description")} + + {t("notifications_example")}:
+ $ curl -d "Hi" {shortUrl} +
+ + + +
+ ); }; const NoSubscriptions = () => { - const { t } = useTranslation(); - return ( - - - {t("action_bar_logo_alt")}/
- {t("notifications_no_subscriptions_title")} -
- - {t("notifications_no_subscriptions_description", { - linktext: t("nav_button_subscribe") - })} - - - - -
- ); + const { t } = useTranslation(); + return ( + + + {t("action_bar_logo_alt")} +
+ {t("notifications_no_subscriptions_title")} +
+ + {t("notifications_no_subscriptions_description", { + linktext: t("nav_button_subscribe"), + })} + + + + +
+ ); }; const ForMoreDetails = () => { - return ( - , - docsLink: - }} - /> - ); + return ( + + ), + docsLink: ( + + ), + }} + /> + ); }; const Loading = () => { - const { t } = useTranslation(); - return ( - - -
- {t("notifications_loading")} -
-
- ); + const { t } = useTranslation(); + return ( + + + +
+ {t("notifications_loading")} +
+
+ ); }; export default Notifications; diff --git a/web/src/components/Preferences.js b/web/src/components/Preferences.js index 2bafa7e9..4451582b 100644 --- a/web/src/components/Preferences.js +++ b/web/src/components/Preferences.js @@ -1,476 +1,604 @@ -import * as React from 'react'; -import {useEffect, useState} from 'react'; +import * as React from "react"; +import { useEffect, useState } from "react"; import { - CardActions, - CardContent, - FormControl, - Select, - Stack, - Table, - TableBody, - TableCell, - TableHead, - TableRow, - useMediaQuery + CardActions, + CardContent, + FormControl, + Select, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + useMediaQuery, } from "@mui/material"; import Typography from "@mui/material/Typography"; import prefs from "../app/Prefs"; -import {Paragraph} from "./styles"; -import EditIcon from '@mui/icons-material/Edit'; +import { Paragraph } from "./styles"; +import EditIcon from "@mui/icons-material/Edit"; import CloseIcon from "@mui/icons-material/Close"; import IconButton from "@mui/material/IconButton"; -import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import PlayArrowIcon from "@mui/icons-material/PlayArrow"; import Container from "@mui/material/Container"; import TextField from "@mui/material/TextField"; import MenuItem from "@mui/material/MenuItem"; import Card from "@mui/material/Card"; import Button from "@mui/material/Button"; -import {useLiveQuery} from "dexie-react-hooks"; +import { useLiveQuery } from "dexie-react-hooks"; import theme from "./theme"; import Dialog from "@mui/material/Dialog"; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; import userManager from "../app/UserManager"; -import {playSound, shuffle, sounds, validUrl} from "../app/utils"; -import {useTranslation} from "react-i18next"; +import { playSound, shuffle, sounds, validUrl } from "../app/utils"; +import { useTranslation } from "react-i18next"; const Preferences = () => { - return ( - - - - - - - - ); + return ( + + + + + + + + ); }; const Notifications = () => { - const { t } = useTranslation(); - return ( - - - {t("prefs_notifications_title")} - - - - - - - - ); + const { t } = useTranslation(); + return ( + + + {t("prefs_notifications_title")} + + + + + + + + ); }; const Sound = () => { - const { t } = useTranslation(); - const labelId = "prefSound"; - const sound = useLiveQuery(async () => prefs.sound()); - const handleChange = async (ev) => { - await prefs.setSound(ev.target.value); - } - if (!sound) { - return null; // While loading - } - let description; - if (sound === "none") { - description = t("prefs_notifications_sound_description_none"); - } else { - description = t("prefs_notifications_sound_description_some", { sound: sounds[sound].label }); - } - return ( - -
- - - - playSound(sound)} disabled={sound === "none"} aria-label={t("prefs_notifications_sound_play")}> - - -
-
- ) + const { t } = useTranslation(); + const labelId = "prefSound"; + const sound = useLiveQuery(async () => prefs.sound()); + const handleChange = async (ev) => { + await prefs.setSound(ev.target.value); + }; + if (!sound) { + return null; // While loading + } + let description; + if (sound === "none") { + description = t("prefs_notifications_sound_description_none"); + } else { + description = t("prefs_notifications_sound_description_some", { + sound: sounds[sound].label, + }); + } + return ( + +
+ + + + playSound(sound)} + disabled={sound === "none"} + aria-label={t("prefs_notifications_sound_play")} + > + + +
+
+ ); }; const MinPriority = () => { - const { t } = useTranslation(); - const labelId = "prefMinPriority"; - const minPriority = useLiveQuery(async () => prefs.minPriority()); - const handleChange = async (ev) => { - await prefs.setMinPriority(ev.target.value); - } - if (!minPriority) { - return null; // While loading - } - const priorities = { - 1: t("priority_min"), - 2: t("priority_low"), - 3: t("priority_default"), - 4: t("priority_high"), - 5: t("priority_max") - } - let description; - if (minPriority === 1) { - description = t("prefs_notifications_min_priority_description_any"); - } else if (minPriority === 5) { - description = t("prefs_notifications_min_priority_description_max"); - } else { - description = t("prefs_notifications_min_priority_description_x_or_higher", { - number: minPriority, - name: priorities[minPriority] - }); - } - return ( - - - - - - ) + const { t } = useTranslation(); + const labelId = "prefMinPriority"; + const minPriority = useLiveQuery(async () => prefs.minPriority()); + const handleChange = async (ev) => { + await prefs.setMinPriority(ev.target.value); + }; + if (!minPriority) { + return null; // While loading + } + const priorities = { + 1: t("priority_min"), + 2: t("priority_low"), + 3: t("priority_default"), + 4: t("priority_high"), + 5: t("priority_max"), + }; + let description; + if (minPriority === 1) { + description = t("prefs_notifications_min_priority_description_any"); + } else if (minPriority === 5) { + description = t("prefs_notifications_min_priority_description_max"); + } else { + description = t( + "prefs_notifications_min_priority_description_x_or_higher", + { + number: minPriority, + name: priorities[minPriority], + }, + ); + } + return ( + + + + + + ); }; const DeleteAfter = () => { - const { t } = useTranslation(); - const labelId = "prefDeleteAfter"; - const deleteAfter = useLiveQuery(async () => prefs.deleteAfter()); - const handleChange = async (ev) => { - await prefs.setDeleteAfter(ev.target.value); + const { t } = useTranslation(); + const labelId = "prefDeleteAfter"; + const deleteAfter = useLiveQuery(async () => prefs.deleteAfter()); + const handleChange = async (ev) => { + await prefs.setDeleteAfter(ev.target.value); + }; + if (deleteAfter === null || deleteAfter === undefined) { + // !deleteAfter will not work with "0" + return null; // While loading + } + const description = (() => { + switch (deleteAfter) { + case 0: + return t("prefs_notifications_delete_after_never_description"); + case 10800: + return t("prefs_notifications_delete_after_three_hours_description"); + case 86400: + return t("prefs_notifications_delete_after_one_day_description"); + case 604800: + return t("prefs_notifications_delete_after_one_week_description"); + case 2592000: + return t("prefs_notifications_delete_after_one_month_description"); } - if (deleteAfter === null || deleteAfter === undefined) { // !deleteAfter will not work with "0" - return null; // While loading - } - const description = (() => { - switch (deleteAfter) { - case 0: return t("prefs_notifications_delete_after_never_description"); - case 10800: return t("prefs_notifications_delete_after_three_hours_description"); - case 86400: return t("prefs_notifications_delete_after_one_day_description"); - case 604800: return t("prefs_notifications_delete_after_one_week_description"); - case 2592000: return t("prefs_notifications_delete_after_one_month_description"); - } - })(); - return ( - - - - - - ) + })(); + return ( + + + + + + ); }; const PrefGroup = (props) => { - return ( -
- {props.children} -
- ) + return
{props.children}
; }; const Pref = (props) => { - return ( -
-
-
{props.title}
- {props.description &&
{props.description}
} -
-
- {props.children} -
+ return ( +
+
+
+ {props.title}
- ); + {props.description && ( +
+ {props.description} +
+ )} +
+
+ {props.children} +
+
+ ); }; const Users = () => { - const { t } = useTranslation(); - const [dialogKey, setDialogKey] = useState(0); - const [dialogOpen, setDialogOpen] = useState(false); - const users = useLiveQuery(() => userManager.all()); - const handleAddClick = () => { - setDialogKey(prev => prev+1); - setDialogOpen(true); - }; - const handleDialogCancel = () => { - setDialogOpen(false); - }; - const handleDialogSubmit = async (user) => { - setDialogOpen(false); - try { - await userManager.save(user); - console.debug(`[Preferences] User ${user.username} for ${user.baseUrl} added`); - } catch (e) { - console.log(`[Preferences] Error adding user.`, e); - } - }; - return ( - - - - {t("prefs_users_title")} - - - {t("prefs_users_description")} - - {users?.length > 0 && } - - - - - - - ); + const { t } = useTranslation(); + const [dialogKey, setDialogKey] = useState(0); + const [dialogOpen, setDialogOpen] = useState(false); + const users = useLiveQuery(() => userManager.all()); + const handleAddClick = () => { + setDialogKey((prev) => prev + 1); + setDialogOpen(true); + }; + const handleDialogCancel = () => { + setDialogOpen(false); + }; + const handleDialogSubmit = async (user) => { + setDialogOpen(false); + try { + await userManager.save(user); + console.debug( + `[Preferences] User ${user.username} for ${user.baseUrl} added`, + ); + } catch (e) { + console.log(`[Preferences] Error adding user.`, e); + } + }; + return ( + + + + {t("prefs_users_title")} + + {t("prefs_users_description")} + {users?.length > 0 && } + + + + + + + ); }; const UserTable = (props) => { - const { t } = useTranslation(); - const [dialogKey, setDialogKey] = useState(0); - const [dialogOpen, setDialogOpen] = useState(false); - const [dialogUser, setDialogUser] = useState(null); - const handleEditClick = (user) => { - setDialogKey(prev => prev+1); - setDialogUser(user); - setDialogOpen(true); - }; - const handleDialogCancel = () => { - setDialogOpen(false); - }; - const handleDialogSubmit = async (user) => { - setDialogOpen(false); - try { - await userManager.save(user); - console.debug(`[Preferences] User ${user.username} for ${user.baseUrl} updated`); - } catch (e) { - console.log(`[Preferences] Error updating user.`, e); - } - }; - const handleDeleteClick = async (user) => { - try { - await userManager.delete(user.baseUrl); - console.debug(`[Preferences] User ${user.username} for ${user.baseUrl} deleted`); - } catch (e) { - console.error(`[Preferences] Error deleting user for ${user.baseUrl}`, e); - } - }; - return ( - - - - {t("prefs_users_table_user_header")} - {t("prefs_users_table_base_url_header")} - - - - - {props.users?.map(user => ( - - {user.username} - {user.baseUrl} - - handleEditClick(user)} aria-label={t("prefs_users_edit_button")}> - - - handleDeleteClick(user)} aria-label={t("prefs_users_delete_button")}> - - - - - ))} - - -
- ); + const { t } = useTranslation(); + const [dialogKey, setDialogKey] = useState(0); + const [dialogOpen, setDialogOpen] = useState(false); + const [dialogUser, setDialogUser] = useState(null); + const handleEditClick = (user) => { + setDialogKey((prev) => prev + 1); + setDialogUser(user); + setDialogOpen(true); + }; + const handleDialogCancel = () => { + setDialogOpen(false); + }; + const handleDialogSubmit = async (user) => { + setDialogOpen(false); + try { + await userManager.save(user); + console.debug( + `[Preferences] User ${user.username} for ${user.baseUrl} updated`, + ); + } catch (e) { + console.log(`[Preferences] Error updating user.`, e); + } + }; + const handleDeleteClick = async (user) => { + try { + await userManager.delete(user.baseUrl); + console.debug( + `[Preferences] User ${user.username} for ${user.baseUrl} deleted`, + ); + } catch (e) { + console.error(`[Preferences] Error deleting user for ${user.baseUrl}`, e); + } + }; + return ( + + + + + {t("prefs_users_table_user_header")} + + {t("prefs_users_table_base_url_header")} + + + + + {props.users?.map((user) => ( + + + {user.username} + + + {user.baseUrl} + + + handleEditClick(user)} + aria-label={t("prefs_users_edit_button")} + > + + + handleDeleteClick(user)} + aria-label={t("prefs_users_delete_button")} + > + + + + + ))} + + +
+ ); }; const UserDialog = (props) => { - const { t } = useTranslation(); - const [baseUrl, setBaseUrl] = useState(""); - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); - const editMode = props.user !== null; - const addButtonEnabled = (() => { - if (editMode) { - return username.length > 0 && password.length > 0; - } - const baseUrlValid = validUrl(baseUrl); - const baseUrlExists = props.users?.map(user => user.baseUrl).includes(baseUrl); - return baseUrlValid - && !baseUrlExists - && username.length > 0 - && password.length > 0; - })(); - const handleSubmit = async () => { - props.onSubmit({ - baseUrl: baseUrl, - username: username, - password: password - }) - }; - useEffect(() => { - if (editMode) { - setBaseUrl(props.user.baseUrl); - setUsername(props.user.username); - setPassword(props.user.password); - } - }, [editMode, props.user]); + const { t } = useTranslation(); + const [baseUrl, setBaseUrl] = useState(""); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); + const editMode = props.user !== null; + const addButtonEnabled = (() => { + if (editMode) { + return username.length > 0 && password.length > 0; + } + const baseUrlValid = validUrl(baseUrl); + const baseUrlExists = props.users + ?.map((user) => user.baseUrl) + .includes(baseUrl); return ( - - {editMode ? t("prefs_users_dialog_title_edit") : t("prefs_users_dialog_title_add")} - - {!editMode && setBaseUrl(ev.target.value)} - type="url" - fullWidth - variant="standard" - />} - setUsername(ev.target.value)} - type="text" - fullWidth - variant="standard" - /> - setPassword(ev.target.value)} - fullWidth - variant="standard" - /> - - - - - - + baseUrlValid && + !baseUrlExists && + username.length > 0 && + password.length > 0 ); + })(); + const handleSubmit = async () => { + props.onSubmit({ + baseUrl: baseUrl, + username: username, + password: password, + }); + }; + useEffect(() => { + if (editMode) { + setBaseUrl(props.user.baseUrl); + setUsername(props.user.username); + setPassword(props.user.password); + } + }, [editMode, props.user]); + return ( + + + {editMode + ? t("prefs_users_dialog_title_edit") + : t("prefs_users_dialog_title_add")} + + + {!editMode && ( + setBaseUrl(ev.target.value)} + type="url" + fullWidth + variant="standard" + /> + )} + setUsername(ev.target.value)} + type="text" + fullWidth + variant="standard" + /> + setPassword(ev.target.value)} + fullWidth + variant="standard" + /> + + + + + + + ); }; const Appearance = () => { - const { t } = useTranslation(); - return ( - - - {t("prefs_appearance_title")} - - - - - - ); + const { t } = useTranslation(); + return ( + + + {t("prefs_appearance_title")} + + + + + + ); }; const Language = () => { - const { t, i18n } = useTranslation(); - const labelId = "prefLanguage"; - const randomFlags = shuffle(["🇬🇧", "🇺🇸", "🇪🇸", "🇫🇷", "🇧🇬", "🇨🇿", "🇩🇪", "🇵🇱", "🇺🇦", "🇨🇳", "🇮🇹", "🇭🇺", "🇧🇷", "🇳🇱", "🇮🇩", "🇯🇵", "🇷🇺", "🇹🇷"]).slice(0, 3); - const title = t("prefs_appearance_language_title") + " " + randomFlags.join(" "); - const lang = i18n.language ?? "en"; + const { t, i18n } = useTranslation(); + const labelId = "prefLanguage"; + const randomFlags = shuffle([ + "🇬🇧", + "🇺🇸", + "🇪🇸", + "🇫🇷", + "🇧🇬", + "🇨🇿", + "🇩🇪", + "🇵🇱", + "🇺🇦", + "🇨🇳", + "🇮🇹", + "🇭🇺", + "🇧🇷", + "🇳🇱", + "🇮🇩", + "🇯🇵", + "🇷🇺", + "🇹🇷", + ]).slice(0, 3); + const title = + t("prefs_appearance_language_title") + " " + randomFlags.join(" "); + const lang = i18n.language ?? "en"; - // Remember: Flags are not languages. Don't put flags next to the language in the list. - // Languages names from: https://www.omniglot.com/language/names.htm - // Better: Sidebar in Wikipedia: https://en.wikipedia.org/wiki/Bokm%C3%A5l + // Remember: Flags are not languages. Don't put flags next to the language in the list. + // Languages names from: https://www.omniglot.com/language/names.htm + // Better: Sidebar in Wikipedia: https://en.wikipedia.org/wiki/Bokm%C3%A5l - return ( - - - - - - ) + return ( + + + + + + ); }; export default Preferences; diff --git a/web/src/components/PublishDialog.js b/web/src/components/PublishDialog.js index 99db9af2..f84b7c43 100644 --- a/web/src/components/PublishDialog.js +++ b/web/src/components/PublishDialog.js @@ -1,8 +1,17 @@ -import * as React from 'react'; -import {useEffect, useRef, useState} from 'react'; -import {NotificationItem} from "./Notifications"; +import * as React from "react"; +import { useEffect, useRef, useState } from "react"; +import { NotificationItem } from "./Notifications"; import theme from "./theme"; -import {Checkbox, Chip, FormControl, FormControlLabel, InputLabel, Link, Select, useMediaQuery} from "@mui/material"; +import { + Checkbox, + Chip, + FormControl, + FormControlLabel, + InputLabel, + Link, + Select, + useMediaQuery, +} from "@mui/material"; import TextField from "@mui/material/TextField"; import priority1 from "../img/priority-1.svg"; import priority2 from "../img/priority-2.svg"; @@ -15,717 +24,894 @@ import DialogContent from "@mui/material/DialogContent"; import Button from "@mui/material/Button"; import Typography from "@mui/material/Typography"; import IconButton from "@mui/material/IconButton"; -import InsertEmoticonIcon from '@mui/icons-material/InsertEmoticon'; -import {Close} from "@mui/icons-material"; +import InsertEmoticonIcon from "@mui/icons-material/InsertEmoticon"; +import { Close } from "@mui/icons-material"; import MenuItem from "@mui/material/MenuItem"; -import {basicAuth, formatBytes, maybeWithBasicAuth, topicShortUrl, topicUrl, validTopic, validUrl} from "../app/utils"; +import { + basicAuth, + formatBytes, + maybeWithBasicAuth, + topicShortUrl, + topicUrl, + validTopic, + validUrl, +} from "../app/utils"; import Box from "@mui/material/Box"; import AttachmentIcon from "./AttachmentIcon"; import DialogFooter from "./DialogFooter"; import api from "../app/Api"; import userManager from "../app/UserManager"; import EmojiPicker from "./EmojiPicker"; -import {Trans, useTranslation} from "react-i18next"; +import { Trans, useTranslation } from "react-i18next"; const PublishDialog = (props) => { - const { t } = useTranslation(); - const [baseUrl, setBaseUrl] = useState(""); - const [topic, setTopic] = useState(""); - const [message, setMessage] = useState(""); - const [messageFocused, setMessageFocused] = useState(true); - const [title, setTitle] = useState(""); - const [tags, setTags] = useState(""); - const [priority, setPriority] = useState(3); - const [clickUrl, setClickUrl] = useState(""); - const [attachUrl, setAttachUrl] = useState(""); - const [attachFile, setAttachFile] = useState(null); - const [filename, setFilename] = useState(""); - const [filenameEdited, setFilenameEdited] = useState(false); - const [email, setEmail] = useState(""); - const [delay, setDelay] = useState(""); - const [publishAnother, setPublishAnother] = useState(false); + const { t } = useTranslation(); + const [baseUrl, setBaseUrl] = useState(""); + const [topic, setTopic] = useState(""); + const [message, setMessage] = useState(""); + const [messageFocused, setMessageFocused] = useState(true); + const [title, setTitle] = useState(""); + const [tags, setTags] = useState(""); + const [priority, setPriority] = useState(3); + const [clickUrl, setClickUrl] = useState(""); + const [attachUrl, setAttachUrl] = useState(""); + const [attachFile, setAttachFile] = useState(null); + const [filename, setFilename] = useState(""); + const [filenameEdited, setFilenameEdited] = useState(false); + const [email, setEmail] = useState(""); + const [delay, setDelay] = useState(""); + const [publishAnother, setPublishAnother] = useState(false); - const [showTopicUrl, setShowTopicUrl] = useState(""); - const [showClickUrl, setShowClickUrl] = useState(false); - const [showAttachUrl, setShowAttachUrl] = useState(false); - const [showEmail, setShowEmail] = useState(false); - const [showDelay, setShowDelay] = useState(false); + const [showTopicUrl, setShowTopicUrl] = useState(""); + const [showClickUrl, setShowClickUrl] = useState(false); + const [showAttachUrl, setShowAttachUrl] = useState(false); + const [showEmail, setShowEmail] = useState(false); + const [showDelay, setShowDelay] = useState(false); - const showAttachFile = !!attachFile && !showAttachUrl; - const attachFileInput = useRef(); - const [attachFileError, setAttachFileError] = useState(""); + const showAttachFile = !!attachFile && !showAttachUrl; + const attachFileInput = useRef(); + const [attachFileError, setAttachFileError] = useState(""); - const [activeRequest, setActiveRequest] = useState(null); - const [status, setStatus] = useState(""); - const disabled = !!activeRequest; + const [activeRequest, setActiveRequest] = useState(null); + const [status, setStatus] = useState(""); + const disabled = !!activeRequest; - const [emojiPickerAnchorEl, setEmojiPickerAnchorEl] = useState(null); + const [emojiPickerAnchorEl, setEmojiPickerAnchorEl] = useState(null); - const [dropZone, setDropZone] = useState(false); - const [sendButtonEnabled, setSendButtonEnabled] = useState(true); + const [dropZone, setDropZone] = useState(false); + const [sendButtonEnabled, setSendButtonEnabled] = useState(true); - const open = !!props.openMode; - const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); + const open = !!props.openMode; + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); - useEffect(() => { - window.addEventListener('dragenter', () => { - props.onDragEnter(); - setDropZone(true); - }); - }, []); + useEffect(() => { + window.addEventListener("dragenter", () => { + props.onDragEnter(); + setDropZone(true); + }); + }, []); - useEffect(() => { - setBaseUrl(props.baseUrl); - setTopic(props.topic); - setShowTopicUrl(!props.baseUrl || !props.topic); - setMessageFocused(!!props.topic); // Focus message only if topic is set - }, [props.baseUrl, props.topic]); + useEffect(() => { + setBaseUrl(props.baseUrl); + setTopic(props.topic); + setShowTopicUrl(!props.baseUrl || !props.topic); + setMessageFocused(!!props.topic); // Focus message only if topic is set + }, [props.baseUrl, props.topic]); - useEffect(() => { - const valid = validUrl(baseUrl) && validTopic(topic) && !attachFileError; - setSendButtonEnabled(valid); - }, [baseUrl, topic, attachFileError]); + useEffect(() => { + const valid = validUrl(baseUrl) && validTopic(topic) && !attachFileError; + setSendButtonEnabled(valid); + }, [baseUrl, topic, attachFileError]); - useEffect(() => { - setMessage(props.message); - }, [props.message]); + useEffect(() => { + setMessage(props.message); + }, [props.message]); - const updateBaseUrl = (newVal) => { - if (validUrl(newVal)) { - setBaseUrl(newVal.replace(/\/$/, '')); // strip traililng slash after https?:// + const updateBaseUrl = (newVal) => { + if (validUrl(newVal)) { + setBaseUrl(newVal.replace(/\/$/, "")); // strip traililng slash after https?:// + } else { + setBaseUrl(newVal); + } + }; + + const handleSubmit = async () => { + const url = new URL(topicUrl(baseUrl, topic)); + if (title.trim()) { + url.searchParams.append("title", title.trim()); + } + if (tags.trim()) { + url.searchParams.append("tags", tags.trim()); + } + if (priority && priority !== 3) { + url.searchParams.append("priority", priority.toString()); + } + if (clickUrl.trim()) { + url.searchParams.append("click", clickUrl.trim()); + } + if (attachUrl.trim()) { + url.searchParams.append("attach", attachUrl.trim()); + } + if (filename.trim()) { + url.searchParams.append("filename", filename.trim()); + } + if (email.trim()) { + url.searchParams.append("email", email.trim()); + } + if (delay.trim()) { + url.searchParams.append("delay", delay.trim()); + } + if (attachFile && message.trim()) { + url.searchParams.append( + "message", + message.replaceAll("\n", "\\n").trim(), + ); + } + const body = attachFile ? attachFile : message; + try { + const user = await userManager.get(baseUrl); + const headers = maybeWithBasicAuth({}, user); + const progressFn = (ev) => { + if (ev.loaded > 0 && ev.total > 0) { + setStatus( + t("publish_dialog_progress_uploading_detail", { + loaded: formatBytes(ev.loaded), + total: formatBytes(ev.total), + percent: Math.round((ev.loaded * 100.0) / ev.total), + }), + ); } else { - setBaseUrl(newVal); + setStatus(t("publish_dialog_progress_uploading")); } - }; + }; + const request = api.publishXHR(url, body, headers, progressFn); + setActiveRequest(request); + await request; + if (!publishAnother) { + props.onClose(); + } else { + setStatus(t("publish_dialog_message_published")); + setActiveRequest(null); + } + } catch (e) { + setStatus( + + {e} + , + ); + setActiveRequest(null); + } + }; - const handleSubmit = async () => { - const url = new URL(topicUrl(baseUrl, topic)); - if (title.trim()) { - url.searchParams.append("title", title.trim()); - } - if (tags.trim()) { - url.searchParams.append("tags", tags.trim()); - } - if (priority && priority !== 3) { - url.searchParams.append("priority", priority.toString()); - } - if (clickUrl.trim()) { - url.searchParams.append("click", clickUrl.trim()); - } - if (attachUrl.trim()) { - url.searchParams.append("attach", attachUrl.trim()); - } - if (filename.trim()) { - url.searchParams.append("filename", filename.trim()); - } - if (email.trim()) { - url.searchParams.append("email", email.trim()); - } - if (delay.trim()) { - url.searchParams.append("delay", delay.trim()); - } - if (attachFile && message.trim()) { - url.searchParams.append("message", message.replaceAll("\n", "\\n").trim()); - } - const body = (attachFile) ? attachFile : message; - try { - const user = await userManager.get(baseUrl); - const headers = maybeWithBasicAuth({}, user); - const progressFn = (ev) => { - if (ev.loaded > 0 && ev.total > 0) { - setStatus(t("publish_dialog_progress_uploading_detail", { - loaded: formatBytes(ev.loaded), - total: formatBytes(ev.total), - percent: Math.round(ev.loaded * 100.0 / ev.total) - })); - } else { - setStatus(t("publish_dialog_progress_uploading")); + const checkAttachmentLimits = async (file) => { + try { + const stats = await api.userStats(baseUrl); + const fileSizeLimit = stats.attachmentFileSizeLimit ?? 0; + const remainingBytes = stats.visitorAttachmentBytesRemaining ?? 0; + const fileSizeLimitReached = + fileSizeLimit > 0 && file.size > fileSizeLimit; + const quotaReached = remainingBytes > 0 && file.size > remainingBytes; + if (fileSizeLimitReached && quotaReached) { + return setAttachFileError( + t("publish_dialog_attachment_limits_file_and_quota_reached", { + fileSizeLimit: formatBytes(fileSizeLimit), + remainingBytes: formatBytes(remainingBytes), + }), + ); + } else if (fileSizeLimitReached) { + return setAttachFileError( + t("publish_dialog_attachment_limits_file_reached", { + fileSizeLimit: formatBytes(fileSizeLimit), + }), + ); + } else if (quotaReached) { + return setAttachFileError( + t("publish_dialog_attachment_limits_quota_reached", { + remainingBytes: formatBytes(remainingBytes), + }), + ); + } + setAttachFileError(""); + } catch (e) { + console.log(`[SendDialog] Retrieving attachment limits failed`, e); + setAttachFileError(""); // Reset error (rely on server-side checking) + } + }; + + const handleAttachFileClick = () => { + attachFileInput.current.click(); + }; + + const handleAttachFileChanged = async (ev) => { + await updateAttachFile(ev.target.files[0]); + }; + + const handleAttachFileDrop = async (ev) => { + ev.preventDefault(); + setDropZone(false); + await updateAttachFile(ev.dataTransfer.files[0]); + }; + + const updateAttachFile = async (file) => { + setAttachFile(file); + setFilename(file.name); + props.onResetOpenMode(); + await checkAttachmentLimits(file); + }; + + const handleAttachFileDragLeave = () => { + setDropZone(false); + if (props.openMode === PublishDialog.OPEN_MODE_DRAG) { + props.onClose(); // Only close dialog if it was not open before dragging file in + } + }; + + const handleEmojiClick = (ev) => { + setEmojiPickerAnchorEl(ev.currentTarget); + }; + + const handleEmojiPick = (emoji) => { + setTags((tags) => (tags.trim() ? `${tags.trim()}, ${emoji}` : emoji)); + }; + + const handleEmojiClose = () => { + setEmojiPickerAnchorEl(null); + }; + + const priorities = { + 1: { label: t("publish_dialog_priority_min"), file: priority1 }, + 2: { label: t("publish_dialog_priority_low"), file: priority2 }, + 3: { label: t("publish_dialog_priority_default"), file: priority3 }, + 4: { label: t("publish_dialog_priority_high"), file: priority4 }, + 5: { label: t("publish_dialog_priority_max"), file: priority5 }, + }; + + return ( + <> + {dropZone && ( + + )} + + + {baseUrl && topic + ? t("publish_dialog_title_topic", { + topic: topicShortUrl(baseUrl, topic), + }) + : t("publish_dialog_title_no_topic")} + + + {dropZone && } + {showTopicUrl && ( + { + setBaseUrl(props.baseUrl); + setTopic(props.topic); + setShowTopicUrl(false); + }} + > + updateBaseUrl(ev.target.value)} + disabled={disabled} + type="url" + variant="standard" + sx={{ flexGrow: 1, marginRight: 1 }} + inputProps={{ + "aria-label": t("publish_dialog_base_url_label"), + }} + /> + setTopic(ev.target.value)} + disabled={disabled} + type="text" + variant="standard" + autoFocus={!messageFocused} + sx={{ flexGrow: 1 }} + inputProps={{ + "aria-label": t("publish_dialog_topic_label"), + }} + /> + + )} + setTitle(ev.target.value)} + disabled={disabled} + type="text" + fullWidth + variant="standard" + inputProps={{ + "aria-label": t("publish_dialog_title_label"), + }} + /> + setMessage(ev.target.value)} + disabled={disabled} + type="text" + variant="standard" + rows={5} + autoFocus={messageFocused} + fullWidth + multiline + inputProps={{ + "aria-label": t("publish_dialog_message_label"), + }} + /> +
+ + + + + setTags(ev.target.value)} + disabled={disabled} + type="text" + variant="standard" + sx={{ flexGrow: 1, marginRight: 1 }} + inputProps={{ + "aria-label": t("publish_dialog_tags_label"), + }} + /> + + + + +
+ {showClickUrl && ( + { + setClickUrl(""); + setShowClickUrl(false); + }} + > + setClickUrl(ev.target.value)} + disabled={disabled} + type="url" + fullWidth + variant="standard" + inputProps={{ + "aria-label": t("publish_dialog_click_label"), + }} + /> + + )} + {showEmail && ( + { + setEmail(""); + setShowEmail(false); + }} + > + setEmail(ev.target.value)} + disabled={disabled} + type="email" + variant="standard" + fullWidth + inputProps={{ + "aria-label": t("publish_dialog_email_label"), + }} + /> + + )} + {showAttachUrl && ( + { + setAttachUrl(""); + setFilename(""); + setFilenameEdited(false); + setShowAttachUrl(false); + }} + > + { + const url = ev.target.value; + setAttachUrl(url); + if (!filenameEdited) { + try { + const u = new URL(url); + const parts = u.pathname.split("/"); + if (parts.length > 0) { + setFilename(parts[parts.length - 1]); + } + } catch (e) { + // Do nothing + } + } + }} + disabled={disabled} + type="url" + variant="standard" + sx={{ flexGrow: 5, marginRight: 1 }} + inputProps={{ + "aria-label": t("publish_dialog_attach_label"), + }} + /> + { + setFilename(ev.target.value); + setFilenameEdited(true); + }} + disabled={disabled} + type="text" + variant="standard" + sx={{ flexGrow: 1 }} + inputProps={{ + "aria-label": t("publish_dialog_filename_label"), + }} + /> + + )} + + {showAttachFile && ( + setFilename(f)} + onClose={() => { + setAttachFile(null); + setAttachFileError(""); + setFilename(""); + }} + /> + )} + {showDelay && ( + { + setDelay(""); + setShowDelay(false); + }} + > + setDelay(ev.target.value)} + disabled={disabled} + type="text" + variant="standard" + fullWidth + inputProps={{ + "aria-label": t("publish_dialog_delay_label"), + }} + /> + + )} + + {t("publish_dialog_other_features")} + +
+ {!showClickUrl && ( + setShowClickUrl(true)} + sx={{ marginRight: 1, marginBottom: 1 }} + /> + )} + {!showEmail && ( + setShowEmail(true)} + sx={{ marginRight: 1, marginBottom: 1 }} + /> + )} + {!showAttachUrl && !showAttachFile && ( + setShowAttachUrl(true)} + sx={{ marginRight: 1, marginBottom: 1 }} + /> + )} + {!showAttachFile && !showAttachUrl && ( + handleAttachFileClick()} + sx={{ marginRight: 1, marginBottom: 1 }} + /> + )} + {!showDelay && ( + setShowDelay(true)} + sx={{ marginRight: 1, marginBottom: 1 }} + /> + )} + {!showTopicUrl && ( + setShowTopicUrl(true)} + sx={{ marginRight: 1, marginBottom: 1 }} + /> + )} +
+ + + ), + }} + /> + +
+ + {activeRequest && ( + + )} + {!activeRequest && ( + <> + setPublishAnother(ev.target.checked)} + inputProps={{ + "aria-label": t( + "publish_dialog_checkbox_publish_another", + ), + }} + /> } - }; - const request = api.publishXHR(url, body, headers, progressFn); - setActiveRequest(request); - await request; - if (!publishAnother) { - props.onClose(); - } else { - setStatus(t("publish_dialog_message_published")); - setActiveRequest(null); - } - } catch (e) { - setStatus({e}); - setActiveRequest(null); - } - }; - - const checkAttachmentLimits = async (file) => { - try { - const stats = await api.userStats(baseUrl); - const fileSizeLimit = stats.attachmentFileSizeLimit ?? 0; - const remainingBytes = stats.visitorAttachmentBytesRemaining ?? 0; - const fileSizeLimitReached = fileSizeLimit > 0 && file.size > fileSizeLimit; - const quotaReached = remainingBytes > 0 && file.size > remainingBytes; - if (fileSizeLimitReached && quotaReached) { - return setAttachFileError(t("publish_dialog_attachment_limits_file_and_quota_reached", { - fileSizeLimit: formatBytes(fileSizeLimit), - remainingBytes: formatBytes(remainingBytes) - })); - } else if (fileSizeLimitReached) { - return setAttachFileError(t("publish_dialog_attachment_limits_file_reached", { fileSizeLimit: formatBytes(fileSizeLimit) })); - } else if (quotaReached) { - return setAttachFileError(t("publish_dialog_attachment_limits_quota_reached", { remainingBytes: formatBytes(remainingBytes) })); - } - setAttachFileError(""); - } catch (e) { - console.log(`[SendDialog] Retrieving attachment limits failed`, e); - setAttachFileError(""); // Reset error (rely on server-side checking) - } - }; - - const handleAttachFileClick = () => { - attachFileInput.current.click(); - }; - - const handleAttachFileChanged = async (ev) => { - await updateAttachFile(ev.target.files[0]); - }; - - const handleAttachFileDrop = async (ev) => { - ev.preventDefault(); - setDropZone(false); - await updateAttachFile(ev.dataTransfer.files[0]); - }; - - const updateAttachFile = async (file) => { - setAttachFile(file); - setFilename(file.name); - props.onResetOpenMode(); - await checkAttachmentLimits(file); - }; - - const handleAttachFileDragLeave = () => { - setDropZone(false); - if (props.openMode === PublishDialog.OPEN_MODE_DRAG) { - props.onClose(); // Only close dialog if it was not open before dragging file in - } - }; - - const handleEmojiClick = (ev) => { - setEmojiPickerAnchorEl(ev.currentTarget); - }; - - const handleEmojiPick = (emoji) => { - setTags(tags => (tags.trim()) ? `${tags.trim()}, ${emoji}` : emoji); - }; - - const handleEmojiClose = () => { - setEmojiPickerAnchorEl(null); - }; - - const priorities = { - 1: { label: t("publish_dialog_priority_min"), file: priority1 }, - 2: { label: t("publish_dialog_priority_low"), file: priority2 }, - 3: { label: t("publish_dialog_priority_default"), file: priority3 }, - 4: { label: t("publish_dialog_priority_high"), file: priority4 }, - 5: { label: t("publish_dialog_priority_max"), file: priority5 } - }; - - return ( - <> - {dropZone && - } - - {(baseUrl && topic) ? t("publish_dialog_title_topic", { topic: topicShortUrl(baseUrl, topic) }) : t("publish_dialog_title_no_topic")} - - {dropZone && } - {showTopicUrl && - { - setBaseUrl(props.baseUrl); - setTopic(props.topic); - setShowTopicUrl(false); - }}> - updateBaseUrl(ev.target.value)} - disabled={disabled} - type="url" - variant="standard" - sx={{flexGrow: 1, marginRight: 1}} - inputProps={{ - "aria-label": t("publish_dialog_base_url_label") - }} - /> - setTopic(ev.target.value)} - disabled={disabled} - type="text" - variant="standard" - autoFocus={!messageFocused} - sx={{flexGrow: 1}} - inputProps={{ - "aria-label": t("publish_dialog_topic_label") - }} - /> - - } - setTitle(ev.target.value)} - disabled={disabled} - type="text" - fullWidth - variant="standard" - inputProps={{ - "aria-label": t("publish_dialog_title_label") - }} - /> - setMessage(ev.target.value)} - disabled={disabled} - type="text" - variant="standard" - rows={5} - autoFocus={messageFocused} - fullWidth - multiline - inputProps={{ - "aria-label": t("publish_dialog_message_label") - }} - /> -
- - - - - setTags(ev.target.value)} - disabled={disabled} - type="text" - variant="standard" - sx={{flexGrow: 1, marginRight: 1}} - inputProps={{ - "aria-label": t("publish_dialog_tags_label") - }} - /> - - - - -
- {showClickUrl && - { - setClickUrl(""); - setShowClickUrl(false); - }}> - setClickUrl(ev.target.value)} - disabled={disabled} - type="url" - fullWidth - variant="standard" - inputProps={{ - "aria-label": t("publish_dialog_click_label") - }} - /> - - } - {showEmail && - { - setEmail(""); - setShowEmail(false); - }}> - setEmail(ev.target.value)} - disabled={disabled} - type="email" - variant="standard" - fullWidth - inputProps={{ - "aria-label": t("publish_dialog_email_label") - }} - /> - - } - {showAttachUrl && - { - setAttachUrl(""); - setFilename(""); - setFilenameEdited(false); - setShowAttachUrl(false); - }}> - { - const url = ev.target.value; - setAttachUrl(url); - if (!filenameEdited) { - try { - const u = new URL(url); - const parts = u.pathname.split("/"); - if (parts.length > 0) { - setFilename(parts[parts.length-1]); - } - } catch (e) { - // Do nothing - } - } - }} - disabled={disabled} - type="url" - variant="standard" - sx={{flexGrow: 5, marginRight: 1}} - inputProps={{ - "aria-label": t("publish_dialog_attach_label") - }} - /> - { - setFilename(ev.target.value); - setFilenameEdited(true); - }} - disabled={disabled} - type="text" - variant="standard" - sx={{flexGrow: 1}} - inputProps={{ - "aria-label": t("publish_dialog_filename_label") - }} - /> - - } - - {showAttachFile && setFilename(f)} - onClose={() => { - setAttachFile(null); - setAttachFileError(""); - setFilename(""); - }} - />} - {showDelay && - { - setDelay(""); - setShowDelay(false); - }}> - setDelay(ev.target.value)} - disabled={disabled} - type="text" - variant="standard" - fullWidth - inputProps={{ - "aria-label": t("publish_dialog_delay_label") - }} - /> - - } - - {t("publish_dialog_other_features")} - -
- {!showClickUrl && setShowClickUrl(true)} sx={{marginRight: 1, marginBottom: 1}}/>} - {!showEmail && setShowEmail(true)} sx={{marginRight: 1, marginBottom: 1}}/>} - {!showAttachUrl && !showAttachFile && setShowAttachUrl(true)} sx={{marginRight: 1, marginBottom: 1}}/>} - {!showAttachFile && !showAttachUrl && handleAttachFileClick()} sx={{marginRight: 1, marginBottom: 1}}/>} - {!showDelay && setShowDelay(true)} sx={{marginRight: 1, marginBottom: 1}}/>} - {!showTopicUrl && setShowTopicUrl(true)} sx={{marginRight: 1, marginBottom: 1}}/>} -
- - - }} - /> - -
- - {activeRequest && } - {!activeRequest && - <> - setPublishAnother(ev.target.checked)} - inputProps={{ - "aria-label": t("publish_dialog_checkbox_publish_another") - }} /> - } /> - - - - } - -
- - ); + /> + + + + )} +
+
+ + ); }; const Row = (props) => { - return ( -
- {props.children} -
- ); + return ( +
+ {props.children} +
+ ); }; const ClosableRow = (props) => { - const closable = (props.hasOwnProperty("closable")) ? props.closable : true; - return ( - - {props.children} - {closable && - - - - } - - ); + const closable = props.hasOwnProperty("closable") ? props.closable : true; + return ( + + {props.children} + {closable && ( + + + + )} + + ); }; const DialogIconButton = (props) => { - const sx = props.sx || {}; - return ( - - {props.children} - - ); + const sx = props.sx || {}; + return ( + + {props.children} + + ); }; const AttachmentBox = (props) => { - const { t } = useTranslation(); - const file = props.file; - return ( - <> - - {t("publish_dialog_attached_file_title")} - - - - - props.onChangeFilename(ev.target.value)} - disabled={props.disabled} - /> -
- - {formatBytes(file.size)} - {props.error && - - {" "}({props.error}) - - } - -
- - - -
- - ); + const { t } = useTranslation(); + const file = props.file; + return ( + <> + + {t("publish_dialog_attached_file_title")} + + + + + props.onChangeFilename(ev.target.value)} + disabled={props.disabled} + /> +
+ + {formatBytes(file.size)} + {props.error && ( + + {" "} + ({props.error}) + + )} + +
+ + + +
+ + ); }; const ExpandingTextField = (props) => { - const invisibleFieldRef = useRef(); - const [textWidth, setTextWidth] = useState(props.minWidth); - const determineTextWidth = () => { - const boundingRect = invisibleFieldRef?.current?.getBoundingClientRect(); - if (!boundingRect) { - return props.minWidth; - } - return (boundingRect.width >= props.minWidth) ? Math.round(boundingRect.width) : props.minWidth; - }; - useEffect(() => { - setTextWidth(determineTextWidth() + 5); - }, [props.value]); - return ( - <> - - {props.value} - - - - ) + const invisibleFieldRef = useRef(); + const [textWidth, setTextWidth] = useState(props.minWidth); + const determineTextWidth = () => { + const boundingRect = invisibleFieldRef?.current?.getBoundingClientRect(); + if (!boundingRect) { + return props.minWidth; + } + return boundingRect.width >= props.minWidth + ? Math.round(boundingRect.width) + : props.minWidth; + }; + useEffect(() => { + setTextWidth(determineTextWidth() + 5); + }, [props.value]); + return ( + <> + + {props.value} + + + + ); }; const DropArea = (props) => { - const allowDrag = (ev) => { - // This is where we could disallow certain files to be dragged in. - // For now we allow all files. + const allowDrag = (ev) => { + // This is where we could disallow certain files to be dragged in. + // For now we allow all files. - ev.dataTransfer.dropEffect = 'copy'; - ev.preventDefault(); - }; + ev.dataTransfer.dropEffect = "copy"; + ev.preventDefault(); + }; - return ( - - ); + return ( + + ); }; const DropBox = () => { - const { t } = useTranslation(); - return ( - - - {t("publish_dialog_drop_file_here")} - - - ); -} + const { t } = useTranslation(); + return ( + + + + {t("publish_dialog_drop_file_here")} + + + + ); +}; PublishDialog.OPEN_MODE_DEFAULT = "default"; PublishDialog.OPEN_MODE_DRAG = "drag"; diff --git a/web/src/components/SubscribeDialog.js b/web/src/components/SubscribeDialog.js index 9e591c55..c3e16749 100644 --- a/web/src/components/SubscribeDialog.js +++ b/web/src/components/SubscribeDialog.js @@ -1,224 +1,289 @@ -import * as React from 'react'; -import {useState} from 'react'; -import Button from '@mui/material/Button'; -import TextField from '@mui/material/TextField'; -import Dialog from '@mui/material/Dialog'; -import DialogContent from '@mui/material/DialogContent'; -import DialogContentText from '@mui/material/DialogContentText'; -import DialogTitle from '@mui/material/DialogTitle'; -import {Autocomplete, Checkbox, FormControlLabel, useMediaQuery} from "@mui/material"; +import * as React from "react"; +import { useState } from "react"; +import Button from "@mui/material/Button"; +import TextField from "@mui/material/TextField"; +import Dialog from "@mui/material/Dialog"; +import DialogContent from "@mui/material/DialogContent"; +import DialogContentText from "@mui/material/DialogContentText"; +import DialogTitle from "@mui/material/DialogTitle"; +import { + Autocomplete, + Checkbox, + FormControlLabel, + useMediaQuery, +} from "@mui/material"; import theme from "./theme"; import api from "../app/Api"; -import {randomAlphanumericString, topicUrl, validTopic, validUrl} from "../app/utils"; +import { + randomAlphanumericString, + topicUrl, + validTopic, + validUrl, +} from "../app/utils"; import userManager from "../app/UserManager"; import subscriptionManager from "../app/SubscriptionManager"; import poller from "../app/Poller"; import DialogFooter from "./DialogFooter"; -import {useTranslation} from "react-i18next"; +import { useTranslation } from "react-i18next"; const publicBaseUrl = "https://ntfy.sh"; const SubscribeDialog = (props) => { - const [baseUrl, setBaseUrl] = useState(""); - const [topic, setTopic] = useState(""); - const [showLoginPage, setShowLoginPage] = useState(false); - const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); - const handleSuccess = async () => { - const actualBaseUrl = (baseUrl) ? baseUrl : window.location.origin; - const subscription = await subscriptionManager.add(actualBaseUrl, topic); - poller.pollInBackground(subscription); // Dangle! - props.onSuccess(subscription); - } - return ( - - {!showLoginPage && setShowLoginPage(true)} - onSuccess={handleSuccess} - />} - {showLoginPage && setShowLoginPage(false)} - onSuccess={handleSuccess} - />} - - ); + const [baseUrl, setBaseUrl] = useState(""); + const [topic, setTopic] = useState(""); + const [showLoginPage, setShowLoginPage] = useState(false); + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); + const handleSuccess = async () => { + const actualBaseUrl = baseUrl ? baseUrl : window.location.origin; + const subscription = await subscriptionManager.add(actualBaseUrl, topic); + poller.pollInBackground(subscription); // Dangle! + props.onSuccess(subscription); + }; + return ( + + {!showLoginPage && ( + setShowLoginPage(true)} + onSuccess={handleSuccess} + /> + )} + {showLoginPage && ( + setShowLoginPage(false)} + onSuccess={handleSuccess} + /> + )} + + ); }; const SubscribePage = (props) => { - const { t } = useTranslation(); - const [anotherServerVisible, setAnotherServerVisible] = useState(false); - const [errorText, setErrorText] = useState(""); - const baseUrl = (anotherServerVisible) ? props.baseUrl : window.location.origin; - const topic = props.topic; - const existingTopicUrls = props.subscriptions.map(s => topicUrl(s.baseUrl, s.topic)); - const existingBaseUrls = Array.from(new Set([publicBaseUrl, ...props.subscriptions.map(s => s.baseUrl)])) - .filter(s => s !== window.location.origin); - const handleSubscribe = async () => { - const user = await userManager.get(baseUrl); // May be undefined - const username = (user) ? user.username : t("subscribe_dialog_error_user_anonymous"); - const success = await api.auth(baseUrl, topic, user); - if (!success) { - console.log(`[SubscribeDialog] Login to ${topicUrl(baseUrl, topic)} failed for user ${username}`); - if (user) { - setErrorText(t("subscribe_dialog_error_user_not_authorized", { username: username })); - return; - } else { - props.onNeedsLogin(); - return; - } - } - console.log(`[SubscribeDialog] Successful login to ${topicUrl(baseUrl, topic)} for user ${username}`); - props.onSuccess(); - }; - const handleUseAnotherChanged = (e) => { - props.setBaseUrl(""); - setAnotherServerVisible(e.target.checked); - }; - const subscribeButtonEnabled = (() => { - if (anotherServerVisible) { - const isExistingTopicUrl = existingTopicUrls.includes(topicUrl(baseUrl, topic)); - return validTopic(topic) && validUrl(baseUrl) && !isExistingTopicUrl; - } else { - const isExistingTopicUrl = existingTopicUrls.includes(topicUrl(window.location.origin, topic)); - return validTopic(topic) && !isExistingTopicUrl; - } - })(); - const updateBaseUrl = (ev, newVal) => { - if (validUrl(newVal)) { - props.setBaseUrl(newVal.replace(/\/$/, '')); // strip trailing slash after https?:// - } else { - props.setBaseUrl(newVal); - } - }; - return ( - <> - {t("subscribe_dialog_subscribe_title")} - - - {t("subscribe_dialog_subscribe_description")} - -
- props.setTopic(ev.target.value)} - type="text" - fullWidth - variant="standard" - inputProps={{ - maxLength: 64, - "aria-label": t("subscribe_dialog_subscribe_topic_placeholder") - }} - /> - -
- - } - label={t("subscribe_dialog_subscribe_use_another_label")} /> - {anotherServerVisible && - - } - />} -
- - - - - + const { t } = useTranslation(); + const [anotherServerVisible, setAnotherServerVisible] = useState(false); + const [errorText, setErrorText] = useState(""); + const baseUrl = anotherServerVisible ? props.baseUrl : window.location.origin; + const topic = props.topic; + const existingTopicUrls = props.subscriptions.map((s) => + topicUrl(s.baseUrl, s.topic), + ); + const existingBaseUrls = Array.from( + new Set([publicBaseUrl, ...props.subscriptions.map((s) => s.baseUrl)]), + ).filter((s) => s !== window.location.origin); + const handleSubscribe = async () => { + const user = await userManager.get(baseUrl); // May be undefined + const username = user + ? user.username + : t("subscribe_dialog_error_user_anonymous"); + const success = await api.auth(baseUrl, topic, user); + if (!success) { + console.log( + `[SubscribeDialog] Login to ${topicUrl( + baseUrl, + topic, + )} failed for user ${username}`, + ); + if (user) { + setErrorText( + t("subscribe_dialog_error_user_not_authorized", { + username: username, + }), + ); + return; + } else { + props.onNeedsLogin(); + return; + } + } + console.log( + `[SubscribeDialog] Successful login to ${topicUrl( + baseUrl, + topic, + )} for user ${username}`, ); + props.onSuccess(); + }; + const handleUseAnotherChanged = (e) => { + props.setBaseUrl(""); + setAnotherServerVisible(e.target.checked); + }; + const subscribeButtonEnabled = (() => { + if (anotherServerVisible) { + const isExistingTopicUrl = existingTopicUrls.includes( + topicUrl(baseUrl, topic), + ); + return validTopic(topic) && validUrl(baseUrl) && !isExistingTopicUrl; + } else { + const isExistingTopicUrl = existingTopicUrls.includes( + topicUrl(window.location.origin, topic), + ); + return validTopic(topic) && !isExistingTopicUrl; + } + })(); + const updateBaseUrl = (ev, newVal) => { + if (validUrl(newVal)) { + props.setBaseUrl(newVal.replace(/\/$/, "")); // strip trailing slash after https?:// + } else { + props.setBaseUrl(newVal); + } + }; + return ( + <> + {t("subscribe_dialog_subscribe_title")} + + + {t("subscribe_dialog_subscribe_description")} + +
+ props.setTopic(ev.target.value)} + type="text" + fullWidth + variant="standard" + inputProps={{ + maxLength: 64, + "aria-label": t("subscribe_dialog_subscribe_topic_placeholder"), + }} + /> + +
+ + } + label={t("subscribe_dialog_subscribe_use_another_label")} + /> + {anotherServerVisible && ( + ( + + )} + /> + )} +
+ + + + + + ); }; const LoginPage = (props) => { - const { t } = useTranslation(); - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - const [errorText, setErrorText] = useState(""); - const baseUrl = (props.baseUrl) ? props.baseUrl : window.location.origin; - const topic = props.topic; - const handleLogin = async () => { - const user = {baseUrl, username, password}; - const success = await api.auth(baseUrl, topic, user); - if (!success) { - console.log(`[SubscribeDialog] Login to ${topicUrl(baseUrl, topic)} failed for user ${username}`); - setErrorText(t("subscribe_dialog_error_user_not_authorized", { username: username })); - return; - } - console.log(`[SubscribeDialog] Successful login to ${topicUrl(baseUrl, topic)} for user ${username}`); - await userManager.save(user); - props.onSuccess(); - }; - return ( - <> - {t("subscribe_dialog_login_title")} - - - {t("subscribe_dialog_login_description")} - - setUsername(ev.target.value)} - type="text" - fullWidth - variant="standard" - inputProps={{ - "aria-label": t("subscribe_dialog_login_username_label") - }} - /> - setPassword(ev.target.value)} - fullWidth - variant="standard" - inputProps={{ - "aria-label": t("subscribe_dialog_login_password_label") - }} - /> - - - - - - + const { t } = useTranslation(); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [errorText, setErrorText] = useState(""); + const baseUrl = props.baseUrl ? props.baseUrl : window.location.origin; + const topic = props.topic; + const handleLogin = async () => { + const user = { baseUrl, username, password }; + const success = await api.auth(baseUrl, topic, user); + if (!success) { + console.log( + `[SubscribeDialog] Login to ${topicUrl( + baseUrl, + topic, + )} failed for user ${username}`, + ); + setErrorText( + t("subscribe_dialog_error_user_not_authorized", { username: username }), + ); + return; + } + console.log( + `[SubscribeDialog] Successful login to ${topicUrl( + baseUrl, + topic, + )} for user ${username}`, ); + await userManager.save(user); + props.onSuccess(); + }; + return ( + <> + {t("subscribe_dialog_login_title")} + + + {t("subscribe_dialog_login_description")} + + setUsername(ev.target.value)} + type="text" + fullWidth + variant="standard" + inputProps={{ + "aria-label": t("subscribe_dialog_login_username_label"), + }} + /> + setPassword(ev.target.value)} + fullWidth + variant="standard" + inputProps={{ + "aria-label": t("subscribe_dialog_login_password_label"), + }} + /> + + + + + + + ); }; export default SubscribeDialog; diff --git a/web/src/components/SubscriptionSettingsDialog.js b/web/src/components/SubscriptionSettingsDialog.js index a31fe0fd..907575db 100644 --- a/web/src/components/SubscriptionSettingsDialog.js +++ b/web/src/components/SubscriptionSettingsDialog.js @@ -1,59 +1,74 @@ -import * as React from 'react'; -import {useState} from 'react'; -import Button from '@mui/material/Button'; -import TextField from '@mui/material/TextField'; -import Dialog from '@mui/material/Dialog'; -import DialogContent from '@mui/material/DialogContent'; -import DialogContentText from '@mui/material/DialogContentText'; -import DialogTitle from '@mui/material/DialogTitle'; -import {Autocomplete, Checkbox, FormControlLabel, useMediaQuery} from "@mui/material"; +import * as React from "react"; +import { useState } from "react"; +import Button from "@mui/material/Button"; +import TextField from "@mui/material/TextField"; +import Dialog from "@mui/material/Dialog"; +import DialogContent from "@mui/material/DialogContent"; +import DialogContentText from "@mui/material/DialogContentText"; +import DialogTitle from "@mui/material/DialogTitle"; +import { + Autocomplete, + Checkbox, + FormControlLabel, + useMediaQuery, +} from "@mui/material"; import theme from "./theme"; import api from "../app/Api"; -import {topicUrl, validTopic, validUrl} from "../app/utils"; +import { topicUrl, validTopic, validUrl } from "../app/utils"; import userManager from "../app/UserManager"; import subscriptionManager from "../app/SubscriptionManager"; import poller from "../app/Poller"; import DialogFooter from "./DialogFooter"; -import {useTranslation} from "react-i18next"; +import { useTranslation } from "react-i18next"; const SubscriptionSettingsDialog = (props) => { - const { t } = useTranslation(); - const subscription = props.subscription; - const [displayName, setDisplayName] = useState(subscription.displayName ?? ""); - const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); - const handleSave = async () => { - await subscriptionManager.setDisplayName(subscription.id, displayName); - props.onClose(); - } - return ( - - {t("subscription_settings_dialog_title")} - - - {t("subscription_settings_dialog_description")} - - setDisplayName(ev.target.value)} - type="text" - fullWidth - variant="standard" - inputProps={{ - maxLength: 64, - "aria-label": t("subscription_settings_dialog_display_name_placeholder") - }} - /> - - - - - - - ); + const { t } = useTranslation(); + const subscription = props.subscription; + const [displayName, setDisplayName] = useState( + subscription.displayName ?? "", + ); + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); + const handleSave = async () => { + await subscriptionManager.setDisplayName(subscription.id, displayName); + props.onClose(); + }; + return ( + + {t("subscription_settings_dialog_title")} + + + {t("subscription_settings_dialog_description")} + + setDisplayName(ev.target.value)} + type="text" + fullWidth + variant="standard" + inputProps={{ + maxLength: 64, + "aria-label": t( + "subscription_settings_dialog_display_name_placeholder", + ), + }} + /> + + + + + + + ); }; export default SubscriptionSettingsDialog; diff --git a/web/src/components/hooks.js b/web/src/components/hooks.js index 3714a9d0..daddeecc 100644 --- a/web/src/components/hooks.js +++ b/web/src/components/hooks.js @@ -1,7 +1,7 @@ -import {useNavigate, useParams} from "react-router-dom"; -import {useEffect, useState} from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { useEffect, useState } from "react"; import subscriptionManager from "../app/SubscriptionManager"; -import {disallowedTopic, expandSecureUrl, topicUrl} from "../app/utils"; +import { disallowedTopic, expandSecureUrl, topicUrl } from "../app/utils"; import notifier from "../app/Notifier"; import routes from "./routes"; import connectionManager from "../app/ConnectionManager"; @@ -14,31 +14,40 @@ import pruner from "../app/Pruner"; * to the connection being re-established). */ export const useConnectionListeners = (subscriptions, users) => { - const navigate = useNavigate(); + const navigate = useNavigate(); - useEffect(() => { - const handleNotification = async (subscriptionId, notification) => { - const added = await subscriptionManager.addNotification(subscriptionId, notification); - if (added) { - const defaultClickAction = (subscription) => navigate(routes.forSubscription(subscription)); - await notifier.notify(subscriptionId, notification, defaultClickAction) - } - }; - connectionManager.registerStateListener(subscriptionManager.updateState); - connectionManager.registerNotificationListener(handleNotification); - return () => { - connectionManager.resetStateListener(); - connectionManager.resetNotificationListener(); - } - }, - // We have to disable dep checking for "navigate". This is fine, it never changes. - // eslint-disable-next-line - [] - ); + useEffect( + () => { + const handleNotification = async (subscriptionId, notification) => { + const added = await subscriptionManager.addNotification( + subscriptionId, + notification, + ); + if (added) { + const defaultClickAction = (subscription) => + navigate(routes.forSubscription(subscription)); + await notifier.notify( + subscriptionId, + notification, + defaultClickAction, + ); + } + }; + connectionManager.registerStateListener(subscriptionManager.updateState); + connectionManager.registerNotificationListener(handleNotification); + return () => { + connectionManager.resetStateListener(); + connectionManager.resetNotificationListener(); + }; + }, + // We have to disable dep checking for "navigate". This is fine, it never changes. + // eslint-disable-next-line + [], + ); - useEffect(() => { - connectionManager.refresh(subscriptions, users); // Dangle - }, [subscriptions, users]); + useEffect(() => { + connectionManager.refresh(subscriptions, users); // Dangle + }, [subscriptions, users]); }; /** @@ -46,25 +55,33 @@ export const useConnectionListeners = (subscriptions, users) => { * This will only be run once after the initial page load. */ export const useAutoSubscribe = (subscriptions, selected) => { - const [hasRun, setHasRun] = useState(false); - const params = useParams(); + const [hasRun, setHasRun] = useState(false); + const params = useParams(); - useEffect(() => { - const loaded = subscriptions !== null && subscriptions !== undefined; - if (!loaded || hasRun) { - return; - } - setHasRun(true); - const eligible = params.topic && !selected && !disallowedTopic(params.topic); - if (eligible) { - const baseUrl = (params.baseUrl) ? expandSecureUrl(params.baseUrl) : window.location.origin; - console.log(`[App] Auto-subscribing to ${topicUrl(baseUrl, params.topic)}`); - (async () => { - const subscription = await subscriptionManager.add(baseUrl, params.topic); - poller.pollInBackground(subscription); // Dangle! - })(); - } - }, [params, subscriptions, selected, hasRun]); + useEffect(() => { + const loaded = subscriptions !== null && subscriptions !== undefined; + if (!loaded || hasRun) { + return; + } + setHasRun(true); + const eligible = + params.topic && !selected && !disallowedTopic(params.topic); + if (eligible) { + const baseUrl = params.baseUrl + ? expandSecureUrl(params.baseUrl) + : window.location.origin; + console.log( + `[App] Auto-subscribing to ${topicUrl(baseUrl, params.topic)}`, + ); + (async () => { + const subscription = await subscriptionManager.add( + baseUrl, + params.topic, + ); + poller.pollInBackground(subscription); // Dangle! + })(); + } + }, [params, subscriptions, selected, hasRun]); }; /** @@ -73,8 +90,8 @@ export const useAutoSubscribe = (subscriptions, selected) => { * up "unused" imports. See https://github.com/binwiederhier/ntfy/issues/186. */ export const useBackgroundProcesses = () => { - useEffect(() => { - poller.startWorker(); - pruner.startWorker(); - }, []); -} + useEffect(() => { + poller.startWorker(); + pruner.startWorker(); + }, []); +}; diff --git a/web/src/components/i18n.js b/web/src/components/i18n.js index 42eb5721..2bc315c0 100644 --- a/web/src/components/i18n.js +++ b/web/src/components/i18n.js @@ -1,7 +1,7 @@ -import i18n from 'i18next'; -import Backend from 'i18next-http-backend'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import { initReactI18next } from 'react-i18next'; +import i18n from "i18next"; +import Backend from "i18next-http-backend"; +import LanguageDetector from "i18next-browser-languagedetector"; +import { initReactI18next } from "react-i18next"; // Translations using i18next // - Options: https://www.i18next.com/overview/configuration-options @@ -12,18 +12,18 @@ import { initReactI18next } from 'react-i18next'; // https://github.com/i18next/react-i18next/tree/master/example/react i18n - .use(Backend) - .use(LanguageDetector) - .use(initReactI18next) - .init({ - fallbackLng: 'en', - debug: true, - interpolation: { - escapeValue: false, // not needed for react as it escapes by default - }, - backend: { - loadPath: '/static/langs/{{lng}}.json', - } - }); + .use(Backend) + .use(LanguageDetector) + .use(initReactI18next) + .init({ + fallbackLng: "en", + debug: true, + interpolation: { + escapeValue: false, // not needed for react as it escapes by default + }, + backend: { + loadPath: "/static/langs/{{lng}}.json", + }, + }); export default i18n; diff --git a/web/src/components/routes.js b/web/src/components/routes.js index 7a7a7857..d71638e1 100644 --- a/web/src/components/routes.js +++ b/web/src/components/routes.js @@ -1,17 +1,17 @@ import config from "../app/config"; -import {shortUrl} from "../app/utils"; +import { shortUrl } from "../app/utils"; const routes = { - root: config.appRoot, - settings: "/settings", - subscription: "/:topic", - subscriptionExternal: "/:baseUrl/:topic", - forSubscription: (subscription) => { - if (subscription.baseUrl !== window.location.origin) { - return `/${shortUrl(subscription.baseUrl)}/${subscription.topic}`; - } - return `/${subscription.topic}`; + root: config.appRoot, + settings: "/settings", + subscription: "/:topic", + subscriptionExternal: "/:baseUrl/:topic", + forSubscription: (subscription) => { + if (subscription.baseUrl !== window.location.origin) { + return `/${shortUrl(subscription.baseUrl)}/${subscription.topic}`; } + return `/${subscription.topic}`; + }, }; export default routes; diff --git a/web/src/components/styles.js b/web/src/components/styles.js index d6127941..6f1e30b8 100644 --- a/web/src/components/styles.js +++ b/web/src/components/styles.js @@ -1,7 +1,7 @@ import Typography from "@mui/material/Typography"; import theme from "./theme"; import Container from "@mui/material/Container"; -import {Backdrop, styled} from "@mui/material"; +import { Backdrop, styled } from "@mui/material"; export const Paragraph = styled(Typography)({ paddingTop: 8, @@ -9,14 +9,14 @@ export const Paragraph = styled(Typography)({ }); export const VerticallyCenteredContainer = styled(Container)({ - display: 'flex', + display: "flex", flexGrow: 1, - flexDirection: 'column', - justifyContent: 'center', - alignContent: 'center', - color: theme.palette.text.primary + flexDirection: "column", + justifyContent: "center", + alignContent: "center", + color: theme.palette.text.primary, }); export const LightboxBackdrop = styled(Backdrop)({ - backgroundColor: 'rgba(0, 0, 0, 0.8)' // was: 0.5 + backgroundColor: "rgba(0, 0, 0, 0.8)", // was: 0.5 }); diff --git a/web/src/components/theme.js b/web/src/components/theme.js index 3fdafae8..ca77cdc8 100644 --- a/web/src/components/theme.js +++ b/web/src/components/theme.js @@ -1,13 +1,13 @@ -import { red } from '@mui/material/colors'; -import { createTheme } from '@mui/material/styles'; +import { red } from "@mui/material/colors"; +import { createTheme } from "@mui/material/styles"; const theme = createTheme({ palette: { primary: { - main: '#338574', + main: "#338574", }, secondary: { - main: '#6cead0', + main: "#6cead0", }, error: { main: red.A400, @@ -17,19 +17,19 @@ const theme = createTheme({ MuiListItemIcon: { styleOverrides: { root: { - minWidth: '36px', + minWidth: "36px", }, }, }, MuiCardContent: { styleOverrides: { root: { - ':last-child': { - paddingBottom: '16px' - } - } - } - } + ":last-child": { + paddingBottom: "16px", + }, + }, + }, + }, }, }); diff --git a/web/src/img/file-app.svg b/web/src/img/file-app.svg index b66fca2c..47f4f947 100644 --- a/web/src/img/file-app.svg +++ b/web/src/img/file-app.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/file-audio.svg b/web/src/img/file-audio.svg index cf1962d6..7a29ea23 100644 --- a/web/src/img/file-audio.svg +++ b/web/src/img/file-audio.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/file-document.svg b/web/src/img/file-document.svg index a0bab319..abc802cc 100644 --- a/web/src/img/file-document.svg +++ b/web/src/img/file-document.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/file-image.svg b/web/src/img/file-image.svg index 3ddb0e0a..2f269660 100644 --- a/web/src/img/file-image.svg +++ b/web/src/img/file-image.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/file-video.svg b/web/src/img/file-video.svg index 89e43dac..473d4b77 100644 --- a/web/src/img/file-video.svg +++ b/web/src/img/file-video.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/ntfy-outline.svg b/web/src/img/ntfy-outline.svg index 2e215c5a..9b9d4370 100644 --- a/web/src/img/ntfy-outline.svg +++ b/web/src/img/ntfy-outline.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/ntfy.svg b/web/src/img/ntfy.svg index 9e5b5136..3f09979c 100644 --- a/web/src/img/ntfy.svg +++ b/web/src/img/ntfy.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/priority-1.svg b/web/src/img/priority-1.svg index 51d8f833..3fc31eeb 100644 --- a/web/src/img/priority-1.svg +++ b/web/src/img/priority-1.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/priority-2.svg b/web/src/img/priority-2.svg index 854038e7..df641146 100644 --- a/web/src/img/priority-2.svg +++ b/web/src/img/priority-2.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/priority-3.svg b/web/src/img/priority-3.svg index 428900f3..e4629c9c 100644 --- a/web/src/img/priority-3.svg +++ b/web/src/img/priority-3.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/priority-4.svg b/web/src/img/priority-4.svg index 976d23ca..2c1c1962 100644 --- a/web/src/img/priority-4.svg +++ b/web/src/img/priority-4.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/img/priority-5.svg b/web/src/img/priority-5.svg index f4e060ad..e19a1e18 100644 --- a/web/src/img/priority-5.svg +++ b/web/src/img/priority-5.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/web/src/index.js b/web/src/index.js index 659bcb8f..d60c05a4 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -1,6 +1,6 @@ -import * as React from 'react'; -import { createRoot } from 'react-dom/client'; -import App from './components/App'; +import * as React from "react"; +import { createRoot } from "react-dom/client"; +import App from "./components/App"; -const root = createRoot(document.querySelector('#root')); +const root = createRoot(document.querySelector("#root")); root.render();