├── .editorconfig ├── .gitattributes ├── .github ├── dependabot.yml └── workflows │ ├── cron.yml │ ├── main.yml │ └── pull_request.yml ├── .gitignore ├── .npmrc ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── bin ├── flush.js ├── get.js ├── update.js └── util.js ├── package.json ├── src ├── desktop.js ├── desktop.json ├── index.d.ts ├── index.js ├── index.json ├── mobile.js └── mobile.json ├── stats.png └── test └── index.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | max_line_length = 80 13 | indent_brace_style = 1TBS 14 | spaces_around_operators = true 15 | quote_type = auto 16 | 17 | [package.json] 18 | indent_style = space 19 | indent_size = 2 20 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: '/' 5 | schedule: 6 | interval: daily 7 | - package-ecosystem: 'github-actions' 8 | directory: '/' 9 | schedule: 10 | # Check for updates to GitHub Actions every weekday 11 | interval: 'daily' 12 | -------------------------------------------------------------------------------- /.github/workflows/cron.yml: -------------------------------------------------------------------------------- 1 | name: cron 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | # Cron job every monday 7 | # https://crontab.guru/every-monday 8 | - cron: '0 0 * * MON' 9 | 10 | jobs: 11 | update: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v4 16 | with: 17 | token: ${{ secrets.GH_TOKEN }} 18 | - name: Setup Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: lts/* 22 | - name: Setup PNPM 23 | uses: pnpm/action-setup@v4 24 | with: 25 | version: latest 26 | run_install: true 27 | - name: Update 28 | env: 29 | REDIS_UA_URI: ${{ secrets.REDIS_UA_URI }} 30 | run: | 31 | git config --global user.email ${{ secrets.GIT_EMAIL }} 32 | git config --global user.name ${{ secrets.GIT_USERNAME }} 33 | DEBUG="ua*" node bin/update.js 34 | git add src/index.json src/desktop.json src/mobile.json 35 | git diff-index --quiet HEAD || git commit -m 'build(update): user agents' --no-verify 36 | git push origin ${{ github.head_ref }} || true 37 | curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/2345b25e-fe7d-4efd-b085-5886e6c85cc7 38 | flush: 39 | needs: [update] 40 | runs-on: ubuntu-latest 41 | steps: 42 | - name: Checkout 43 | uses: actions/checkout@v4 44 | with: 45 | token: ${{ secrets.GITHUB_TOKEN }} 46 | - name: Setup Node.js 47 | uses: actions/setup-node@v4 48 | with: 49 | node-version: lts/* 50 | - name: Setup PNPM 51 | uses: pnpm/action-setup@v4 52 | with: 53 | version: latest 54 | run_install: true 55 | - name: Update 56 | env: 57 | REDIS_UA_URI: ${{ secrets.REDIS_UA_URI }} 58 | run: node bin/flush.js 59 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: main 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | contributors: 10 | if: "${{ github.event.head_commit.message != 'build: contributors' }}" 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | token: ${{ secrets.GITHUB_TOKEN }} 18 | - name: Setup Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: lts/* 22 | - name: Contributors 23 | run: | 24 | git config --global user.email ${{ secrets.GIT_EMAIL }} 25 | git config --global user.name ${{ secrets.GIT_USERNAME }} 26 | npm run contributors 27 | - name: Push changes 28 | run: | 29 | git push origin ${{ github.head_ref }} 30 | 31 | release: 32 | if: | 33 | !startsWith(github.event.head_commit.message, 'chore(release):') && 34 | !startsWith(github.event.head_commit.message, 'docs:') && 35 | !startsWith(github.event.head_commit.message, 'ci:') 36 | needs: [contributors] 37 | runs-on: ubuntu-latest 38 | steps: 39 | - name: Checkout 40 | uses: actions/checkout@v4 41 | with: 42 | token: ${{ secrets.GITHUB_TOKEN }} 43 | - name: Setup Node.js 44 | uses: actions/setup-node@v4 45 | with: 46 | node-version: lts/* 47 | - name: Setup PNPM 48 | uses: pnpm/action-setup@v4 49 | with: 50 | version: latest 51 | run_install: true 52 | - name: Test 53 | run: npm test 54 | # - name: Report 55 | # run: npx c8 report --reporter=text-lcov > coverage/lcov.info 56 | # - name: Coverage 57 | # uses: coverallsapp/github-action@main 58 | # with: 59 | # github-token: ${{ secrets.GITHUB_TOKEN }} 60 | - name: Release 61 | env: 62 | GH_TOKEN: ${{ secrets.GH_TOKEN }} 63 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 64 | run: | 65 | git config --global user.email ${{ secrets.GIT_EMAIL }} 66 | git config --global user.name ${{ secrets.GIT_USERNAME }} 67 | git pull origin master 68 | npm run release 69 | -------------------------------------------------------------------------------- /.github/workflows/pull_request.yml: -------------------------------------------------------------------------------- 1 | name: pull_request 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | test: 13 | if: github.ref != 'refs/heads/master' 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@v4 18 | with: 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | - name: Setup Node.js 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: lts/* 24 | - name: Setup PNPM 25 | uses: pnpm/action-setup@v4 26 | with: 27 | version: latest 28 | run_install: true 29 | - name: Test 30 | run: npm test 31 | # - name: Report 32 | # run: npx c8 report --reporter=text-lcov > coverage/lcov.info 33 | # - name: Coverage 34 | # uses: coverallsapp/github-action@main 35 | # with: 36 | # github-token: ${{ secrets.GITHUB_TOKEN }} 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ############################ 2 | # npm 3 | ############################ 4 | node_modules 5 | npm-debug.log 6 | .node_history 7 | yarn.lock 8 | package-lock.json 9 | 10 | ############################ 11 | # tmp, editor & OS files 12 | ############################ 13 | .tmp 14 | *.swo 15 | *.swp 16 | *.swn 17 | *.swm 18 | .DS_Store 19 | *# 20 | *~ 21 | .idea 22 | *sublime* 23 | nbproject 24 | 25 | ############################ 26 | # Tests 27 | ############################ 28 | testApp 29 | coverage 30 | .nyc_output 31 | 32 | ############################ 33 | # Other 34 | ############################ 35 | .env 36 | .envrc 37 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | unsafe-perm=true 2 | save-prefix=~ 3 | save=false 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ### 2.1.53 (2025-06-02) 6 | 7 | ### 2.1.52 (2025-05-26) 8 | 9 | ### 2.1.51 (2025-05-19) 10 | 11 | ### 2.1.50 (2025-05-12) 12 | 13 | ### 2.1.49 (2025-05-05) 14 | 15 | ### 2.1.48 (2025-05-05) 16 | 17 | ### 2.1.47 (2025-05-05) 18 | 19 | ### 2.1.46 (2025-04-28) 20 | 21 | ### 2.1.45 (2025-04-21) 22 | 23 | ### 2.1.44 (2025-04-14) 24 | 25 | ### 2.1.43 (2025-04-07) 26 | 27 | ### 2.1.42 (2025-03-31) 28 | 29 | ### 2.1.41 (2025-03-24) 30 | 31 | ### 2.1.40 (2025-03-17) 32 | 33 | ### 2.1.39 (2025-03-10) 34 | 35 | ### 2.1.38 (2025-03-03) 36 | 37 | ### 2.1.37 (2025-02-24) 38 | 39 | ### 2.1.36 (2025-02-17) 40 | 41 | 42 | ### Bug Fixes 43 | 44 | * exclude Cloudinary ([#42](https://github.com/Kikobeats/top-user-agents/issues/42)) ([6ad721c](https://github.com/Kikobeats/top-user-agents/commit/6ad721c9a8fe0bf44e5a7ca1fa17e8dcfeae85f4)), closes [#41](https://github.com/Kikobeats/top-user-agents/issues/41) 45 | 46 | ### 2.1.35 (2025-02-17) 47 | 48 | ### 2.1.34 (2025-02-10) 49 | 50 | ### 2.1.33 (2025-02-03) 51 | 52 | ### 2.1.32 (2025-02-02) 53 | 54 | 55 | ### Bug Fixes 56 | 57 | * remove NetworkingExtension ([9aba987](https://github.com/Kikobeats/top-user-agents/commit/9aba9875930e5c069ef27c0749a5102388cfc894)) 58 | 59 | ### 2.1.31 (2025-01-27) 60 | 61 | ### 2.1.30 (2025-01-20) 62 | 63 | ### 2.1.29 (2025-01-13) 64 | 65 | ### 2.1.28 (2025-01-07) 66 | 67 | ### 2.1.27 (2025-01-06) 68 | 69 | ### 2.1.26 (2025-01-02) 70 | 71 | ### 2.1.25 (2025-01-02) 72 | 73 | ### 2.1.24 (2024-10-03) 74 | 75 | ### 2.1.23 (2024-08-29) 76 | 77 | ### 2.1.22 (2024-05-09) 78 | 79 | ### 2.1.21 (2024-05-02) 80 | 81 | ### 2.1.20 (2024-04-13) 82 | 83 | ### 2.1.19 (2024-04-08) 84 | 85 | ### 2.1.18 (2024-04-01) 86 | 87 | ### 2.1.17 (2024-03-25) 88 | 89 | ### 2.1.16 (2024-03-18) 90 | 91 | ### 2.1.15 (2024-03-11) 92 | 93 | ### 2.1.14 (2024-03-10) 94 | 95 | ### 2.1.13 (2024-03-04) 96 | 97 | ### 2.1.12 (2024-02-26) 98 | 99 | ### 2.1.11 (2024-02-19) 100 | 101 | ### 2.1.10 (2024-02-12) 102 | 103 | ### 2.1.9 (2024-02-08) 104 | 105 | ### 2.1.8 (2024-02-05) 106 | 107 | ### 2.1.7 (2024-01-29) 108 | 109 | ### 2.1.6 (2024-01-22) 110 | 111 | ### 2.1.5 (2024-01-15) 112 | 113 | ### 2.1.4 (2024-01-13) 114 | 115 | ### 2.1.3 (2024-01-10) 116 | 117 | ### 2.1.2 (2024-01-10) 118 | 119 | ### 2.1.1 (2024-01-08) 120 | 121 | ## 2.1.0 (2024-01-03) 122 | 123 | 124 | ### Features 125 | 126 | * add mobile & desktop lists ([#35](https://github.com/Kikobeats/top-user-agents/issues/35)) ([ac01554](https://github.com/Kikobeats/top-user-agents/commit/ac01554e51bbaa5a579ba9ee857d12828a3cfdff)) 127 | 128 | ### 2.0.6 (2024-01-01) 129 | 130 | ### 2.0.5 (2024-01-01) 131 | 132 | ### 2.0.4 (2024-01-01) 133 | 134 | ### 2.0.3 (2023-12-28) 135 | 136 | ### 2.0.2 (2023-12-28) 137 | 138 | ### 2.0.1 (2023-12-27) 139 | 140 | ## 2.0.0 (2023-12-27) 141 | 142 | 143 | ### ⚠ BREAKING CHANGES 144 | 145 | * use microlink data (#31) 146 | 147 | ### Features 148 | 149 | * use microlink data ([#31](https://github.com/Kikobeats/top-user-agents/issues/31)) ([66e1e03](https://github.com/Kikobeats/top-user-agents/commit/66e1e031c5b378fa2bf2b0c847aa8ede2542ed28)) 150 | 151 | ### 1.0.66 (2023-11-09) 152 | 153 | ### 1.0.65 (2023-10-24) 154 | 155 | ### 1.0.64 (2023-10-11) 156 | 157 | ### 1.0.63 (2023-10-11) 158 | 159 | ### 1.0.62 (2023-09-28) 160 | 161 | ### 1.0.61 (2023-09-06) 162 | 163 | ### 1.0.60 (2023-08-06) 164 | 165 | ### 1.0.59 (2023-07-15) 166 | 167 | ### 1.0.58 (2023-07-15) 168 | 169 | ### 1.0.57 (2023-05-31) 170 | 171 | ### 1.0.56 (2023-05-31) 172 | 173 | ### 1.0.55 (2023-05-30) 174 | 175 | ### 1.0.54 (2023-05-30) 176 | 177 | ### 1.0.53 (2023-05-30) 178 | 179 | ### 1.0.52 (2023-02-13) 180 | 181 | ### 1.0.51 (2023-02-06) 182 | 183 | ### 1.0.50 (2022-12-07) 184 | 185 | ### 1.0.49 (2022-11-14) 186 | 187 | 188 | ### Bug Fixes 189 | 190 | * file extension ([f97cef6](https://github.com/Kikobeats/top-user-agents/commit/f97cef6dcfa7eb0d0e14103c09b749404790dd90)) 191 | 192 | ### 1.0.48 (2022-11-14) 193 | 194 | ### 1.0.47 (2022-09-20) 195 | 196 | ### 1.0.46 (2022-06-27) 197 | 198 | ### 1.0.45 (2022-06-03) 199 | 200 | ### 1.0.44 (2022-05-09) 201 | 202 | ### 1.0.43 (2022-03-02) 203 | 204 | ### 1.0.42 (2022-02-25) 205 | 206 | ### 1.0.41 (2022-02-25) 207 | 208 | ### 1.0.40 (2021-12-12) 209 | 210 | ### 1.0.39 (2021-11-04) 211 | 212 | ### 1.0.38 (2021-08-24) 213 | 214 | 215 | ### Bug Fixes 216 | 217 | * prevent being stuck forever ([7f7f337](https://github.com/Kikobeats/top-user-agents/commit/7f7f3379eb72b162b7ea2921bdf06a7655906e46)) 218 | 219 | ### 1.0.37 (2021-08-07) 220 | 221 | ### 1.0.36 (2021-07-29) 222 | 223 | ### 1.0.35 (2021-07-26) 224 | 225 | ### 1.0.34 (2021-07-20) 226 | 227 | ### 1.0.33 (2021-07-14) 228 | 229 | ### 1.0.32 (2021-07-14) 230 | 231 | ### 1.0.31 (2021-07-14) 232 | 233 | ### 1.0.30 (2021-07-14) 234 | 235 | ### 1.0.29 (2021-07-04) 236 | 237 | ### 1.0.28 (2021-07-04) 238 | 239 | ### 1.0.27 (2021-07-04) 240 | 241 | ### [1.0.26](https://github.com/Kikobeats/top-user-agents/compare/v1.0.25...v1.0.26) (2021-05-18) 242 | 243 | ### [1.0.25](https://github.com/Kikobeats/top-user-agents/compare/v1.0.24...v1.0.25) (2021-04-23) 244 | 245 | ### [1.0.24](https://github.com/Kikobeats/top-user-agents/compare/v1.0.23...v1.0.24) (2021-04-13) 246 | 247 | ### [1.0.23](https://github.com/Kikobeats/top-user-agents/compare/v1.0.22...v1.0.23) (2021-04-04) 248 | 249 | ### [1.0.22](https://github.com/Kikobeats/top-user-agents/compare/v1.0.21...v1.0.22) (2021-04-04) 250 | 251 | ### [1.0.21](https://github.com/Kikobeats/top-user-agents/compare/v1.0.20...v1.0.21) (2021-02-09) 252 | 253 | ### [1.0.20](https://github.com/Kikobeats/top-user-agents/compare/v1.0.19...v1.0.20) (2021-02-08) 254 | 255 | ### [1.0.19](https://github.com/Kikobeats/top-user-agents/compare/v1.0.18...v1.0.19) (2020-11-27) 256 | 257 | ### [1.0.18](https://github.com/Kikobeats/top-user-agents/compare/v1.0.17...v1.0.18) (2020-11-12) 258 | 259 | ### [1.0.17](https://github.com/Kikobeats/top-user-agents/compare/v1.0.16...v1.0.17) (2020-11-12) 260 | 261 | ### [1.0.16](https://github.com/Kikobeats/top-user-agents/compare/v1.0.15...v1.0.16) (2020-10-25) 262 | 263 | ### [1.0.15](https://github.com/Kikobeats/top-user-agents/compare/v1.0.14...v1.0.15) (2020-10-21) 264 | 265 | ### [1.0.14](https://github.com/Kikobeats/top-user-agents/compare/v1.0.13...v1.0.14) (2020-09-20) 266 | 267 | ### [1.0.13](https://github.com/Kikobeats/top-user-agents/compare/v1.0.12...v1.0.13) (2020-09-04) 268 | 269 | ### [1.0.12](https://github.com/Kikobeats/top-user-agents/compare/v1.0.11...v1.0.12) (2020-07-20) 270 | 271 | ### [1.0.11](https://github.com/Kikobeats/top-user-agents/compare/v1.0.10...v1.0.11) (2020-07-08) 272 | 273 | ### [1.0.10](https://github.com/Kikobeats/top-user-agents/compare/v1.0.9...v1.0.10) (2020-07-04) 274 | 275 | ### [1.0.9](https://github.com/Kikobeats/top-user-agents/compare/v1.0.8...v1.0.9) (2020-06-06) 276 | 277 | ### [1.0.8](https://github.com/Kikobeats/top-user-agents/compare/v1.0.7...v1.0.8) (2020-06-01) 278 | 279 | ### [1.0.7](https://github.com/Kikobeats/top-user-agents/compare/v1.0.6...v1.0.7) (2020-06-01) 280 | 281 | ### [1.0.6](https://github.com/Kikobeats/top-user-agents/compare/v1.0.5...v1.0.6) (2020-05-31) 282 | 283 | ### [1.0.5](https://github.com/Kikobeats/top-user-agents/compare/v1.0.4...v1.0.5) (2020-05-15) 284 | 285 | ### [1.0.4](https://github.com/Kikobeats/top-user-agents/compare/v1.0.3...v1.0.4) (2020-05-07) 286 | 287 | ### [1.0.3](https://github.com/Kikobeats/top-user-agents/compare/v1.0.2...v1.0.3) (2020-05-04) 288 | 289 | ### [1.0.2](https://github.com/Kikobeats/top-user-agents/compare/v1.0.1...v1.0.2) (2020-04-22) 290 | 291 | ### [1.0.1](https://github.com/Kikobeats/top-user-agents/compare/v1.0.0...v1.0.1) (2020-02-20) 292 | 293 | ## 1.0.0 (2020-02-19) 294 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2020 Kiko Beats (kikobeats.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | microlink logo 3 | microlink logo 4 |
5 | 6 | ![Last version](https://img.shields.io/github/tag/microlinkhq/top-user-agents.svg?style=flat-square) 7 | [![NPM Status](https://img.shields.io/npm/dm/top-user-agents.svg?style=flat-square)](https://www.npmjs.org/package/top-user-agents) 8 | 9 | > An always up-to-date list of the top 100 HTTP [user-agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent)'s most used over the Internet. 10 | 11 | **Download**: [All](https://cdn.jsdelivr.net/gh/microlinkhq/top-user-agents@master/src/index.json) / [Desktop](https://cdn.jsdelivr.net/gh/microlinkhq/top-user-agents@master/src/desktop.json) / [Mobile](https://cdn.jsdelivr.net/gh/microlinkhq/top-user-agents@master/src/mobile.json) 12 | 13 | ## Background 14 | 15 | There are some scenarios where you need to perform browser-like requests, meaning you need to use an HTTP `user-agent` as much accurate as possible with the real world™️. 16 | 17 | ![](/stats.png) 18 | 19 | You can find many list of browser user agents on the Internet, but they are outdated or quickly unmaintained. 20 | 21 | This list is created collecting user agent from [microlink.io](https://microlink.io) products, that receives [+300M requests every month](https://analytics.microlink.io/). 22 | 23 | ## Install 24 | 25 | ```bash 26 | $ npm install top-user-agents --save 27 | ``` 28 | 29 | ## Usage 30 | 31 | ```js 32 | const uniqueRandomArray = require('unique-random-array') 33 | const userAgents = require('top-user-agents') 34 | 35 | const randomUserAgent = uniqueRandomArray(userAgents) 36 | 37 | console.log(randomUserAgent()) 38 | // => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36' 39 | ``` 40 | 41 | You can also `require('top-user-agents/mobile')` or `require('top-user-agents/desktop')` to get the list based on the device. 42 | 43 | ## About Privacy 44 | 45 | The information exposed to the user-agent only relies on coarse details. 46 | 47 | In practice, anyone can put whatever they want in the user-agent string, and send it to the web server. 48 | 49 | Because that, The user-agent cannot be sufficient condition to identify or reproduce the original request. 50 | 51 | ## Related 52 | 53 | - [https-tls](https://github.com/Kikobeats/https-tls) – Setup TLS details according to `user-agent`. 54 | - [top-crawler-agents](https://github.com/Kikobeats/top-crawler-agents) – A list of common crawler user agents useful for retrieving metadata from links. 55 | - [@microlink/ua](https://github.com/microlinkhq/ua) – A simple redis primitives to incr() and top() user agents. 56 | 57 | ## License 58 | 59 | **top-user-agents** © [microlink.io](https://microlink.io), released under the [MIT](https://github.com/microlinkhq/top-user-agents/blob/master/LICENSE.md) License.
60 | Authored and maintained by [Kiko Beats](https://kikobeats.com) with help from [contributors](https://github.com/microlinkhq/top-user-agents/contributors). 61 | 62 | > [microlink.io](https://microlink.io) · GitHub [microlink.io](https://github.com/microlinkhq) · X [@microlinkhq](https://x.com/microlinkhq) 63 | -------------------------------------------------------------------------------- /bin/flush.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const Redis = require('ioredis') 4 | 5 | async function main () { 6 | const redis = new Redis(process.env.REDIS_UA_URI) 7 | const ua = require('@microlink/ua')(redis) 8 | return ua.flush() 9 | } 10 | 11 | main() 12 | .then(() => process.exit(0)) 13 | .catch(err => { 14 | console.error(err) 15 | process.exit(1) 16 | }) 17 | -------------------------------------------------------------------------------- /bin/get.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const { top } = require('./util') 4 | 5 | const percentage = (count, total) => `${((count / total) * 100).toFixed(2)}%` 6 | 7 | async function main (n) { 8 | const userAgents = await top(n) 9 | const total = userAgents.reduce((acc, [_, count]) => acc + count, 0) 10 | userAgents.forEach(([userAgent, count], index) => 11 | console.log( 12 | `${index + 1} (${count} / ${percentage(count, total)})\t– ${userAgent}` 13 | ) 14 | ) 15 | } 16 | 17 | main(Number(process.argv[2] ?? 50)) 18 | .then(() => process.exit(0)) 19 | .catch(error => { 20 | console.error(error) 21 | process.exit(1) 22 | }) 23 | -------------------------------------------------------------------------------- /bin/update.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const { writeFile } = require('fs/promises') 4 | const uaParser = require('ua-parser-js') 5 | const { top } = require('./util') 6 | 7 | const stringify = data => JSON.stringify(data, null, 2) 8 | 9 | async function main (n) { 10 | const userAgents = (await top(n)).map(([userAgent]) => userAgent) 11 | await writeFile('src/index.json', stringify(userAgents)) 12 | 13 | const { mobile, desktop } = userAgents.reduce( 14 | (acc, userAgent) => { 15 | const device = uaParser(userAgent).device.type 16 | if (device === 'tablet' || device === 'mobile') { 17 | acc.mobile.push(userAgent) 18 | } else { 19 | acc.desktop.push(userAgent) 20 | } 21 | return acc 22 | }, 23 | { mobile: [], desktop: [] } 24 | ) 25 | 26 | await writeFile('src/desktop.json', stringify(desktop)) 27 | await writeFile('src/mobile.json', stringify(mobile)) 28 | } 29 | 30 | main(100) 31 | .then(() => process.exit(0)) 32 | .catch(error => { 33 | console.error(error) 34 | process.exit(1) 35 | }) 36 | -------------------------------------------------------------------------------- /bin/util.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const debug = require('debug-logfmt')('ua:isbot') 4 | const { isbot } = require('isbot') 5 | const Redis = require('ioredis') 6 | 7 | const connect = () => 8 | this.instance || 9 | (this.instance = require('@microlink/ua')( 10 | new Redis(process.env.REDIS_UA_URI) 11 | )) 12 | 13 | const EXCLUSIONS = [ 14 | 'Dart/', 15 | 'cfnetwork', 16 | 'cloudinary', 17 | 'networkingextension', 18 | 'retweet' 19 | ] 20 | 21 | const isBot = userAgent => { 22 | const result = 23 | isbot(userAgent) || 24 | EXCLUSIONS.some(str => userAgent.toLowerCase().includes(str)) 25 | if (result) debug(userAgent) 26 | return result 27 | } 28 | 29 | const top = async n => { 30 | const ua = connect() 31 | const limit = n + Math.round(n * 0.3) 32 | const data = await ua.top(limit, { withScore: true }) 33 | return data.filter(userAgent => !isBot(userAgent[0])).slice(0, n) 34 | } 35 | 36 | module.exports = { top } 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "top-user-agents", 3 | "description": "A list of most common User Agent.", 4 | "homepage": "https://microlink.io/user-agents", 5 | "version": "2.1.53", 6 | "types": "./src/index.d.ts", 7 | "exports": { 8 | ".": { 9 | "types": "./src/index.d.ts", 10 | "default": "./src/index.js" 11 | }, 12 | "./desktop": { 13 | "types": "./src/index.d.ts", 14 | "default": "./src/desktop.js" 15 | }, 16 | "./mobile": { 17 | "types": "./src/index.d.ts", 18 | "default": "./src/mobile.js" 19 | } 20 | }, 21 | "author": { 22 | "email": "hello@microlink.io", 23 | "name": "microlink.io", 24 | "url": "https://microlink.io" 25 | }, 26 | "contributors": [ 27 | { 28 | "name": "Kiko", 29 | "email": "josefrancisco.verdu@gmail.com" 30 | }, 31 | { 32 | "name": "Karl Horky", 33 | "email": "karl.horky@gmail.com" 34 | }, 35 | { 36 | "name": "Kevin van Rijn", 37 | "email": "6368561+kevinvanrijn@users.noreply.github.com" 38 | }, 39 | { 40 | "name": "Sukka", 41 | "email": "isukkaw@gmail.com" 42 | } 43 | ], 44 | "repository": { 45 | "type": "git", 46 | "url": "git+https://github.com/Kikobeats/top-user-agents.git" 47 | }, 48 | "bugs": { 49 | "url": "https://github.com/Kikobeats/top-user-agents/issues" 50 | }, 51 | "keywords": [ 52 | "agent", 53 | "common", 54 | "popular", 55 | "string", 56 | "top", 57 | "ua", 58 | "user", 59 | "useragent" 60 | ], 61 | "devDependencies": { 62 | "@commitlint/cli": "latest", 63 | "@commitlint/config-conventional": "latest", 64 | "@ksmithut/prettier-standard": "latest", 65 | "@microlink/ua": "latest", 66 | "ava": "latest", 67 | "ci-publish": "latest", 68 | "debug-logfmt": "latest", 69 | "finepack": "latest", 70 | "git-authors-cli": "latest", 71 | "github-generate-release": "latest", 72 | "ioredis": "latest", 73 | "isbot": "latest", 74 | "nano-staged": "latest", 75 | "simple-git-hooks": "latest", 76 | "standard": "latest", 77 | "standard-markdown": "latest", 78 | "standard-version": "latest", 79 | "ua-parser-js": "latest" 80 | }, 81 | "files": [ 82 | "src" 83 | ], 84 | "scripts": { 85 | "clean": "rm -rf node_modules", 86 | "contributors": "(npx git-authors-cli && npx finepack && git add package.json && git commit -m 'build: contributors' --no-verify) || true", 87 | "lint": "standard-markdown README.md && standard", 88 | "postrelease": "npm run release:tags && npm run release:github && (ci-publish || npm publish --access=public)", 89 | "pretest": "npm run lint", 90 | "release": "standard-version -a", 91 | "release:github": "github-generate-release", 92 | "release:tags": "git push --follow-tags origin HEAD:master", 93 | "test": "ava" 94 | }, 95 | "license": "MIT", 96 | "commitlint": { 97 | "extends": [ 98 | "@commitlint/config-conventional" 99 | ], 100 | "rules": { 101 | "body-max-line-length": [ 102 | 0 103 | ] 104 | } 105 | }, 106 | "nano-staged": { 107 | "*.js": [ 108 | "prettier-standard", 109 | "standard --fix" 110 | ], 111 | "*.md": [ 112 | "standard-markdown" 113 | ], 114 | "package.json": [ 115 | "finepack" 116 | ] 117 | }, 118 | "simple-git-hooks": { 119 | "commit-msg": "npx commitlint --edit", 120 | "pre-commit": "npx nano-staged" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/desktop.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./desktop.json') 2 | -------------------------------------------------------------------------------- /src/desktop.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", 3 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", 4 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", 5 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", 6 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.6.5 Chrome/124.0.6367.243 Electron/30.1.2 Safari/537.36", 7 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0", 8 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15", 9 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", 10 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", 11 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", 12 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", 13 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", 14 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", 15 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0", 16 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", 17 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", 18 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:138.0) Gecko/20100101 Firefox/138.0", 19 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", 20 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", 21 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", 22 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", 23 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", 24 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 OPR/118.0.0.0", 25 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", 26 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.9 Chrome/132.0.6834.210 Electron/34.3.0 Safari/537.36", 27 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 YaBrowser/25.4.0.0 Safari/537.36", 28 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", 29 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Safari/605.1.15", 30 | "Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0", 31 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 OPR/119.0.0.0", 32 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", 33 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", 34 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", 35 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", 36 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", 37 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0", 38 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", 39 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0", 40 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", 41 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", 42 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", 43 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15", 44 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", 45 | "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0", 46 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", 47 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", 48 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0", 49 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15", 50 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.10 Chrome/132.0.6834.196 Electron/34.2.0 Safari/537.36", 51 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15", 52 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0", 53 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36", 54 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", 55 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0", 56 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", 57 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", 58 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", 59 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", 60 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0", 61 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.6.5 Chrome/124.0.6367.243 Electron/30.1.2 Safari/537.36", 62 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.4 Chrome/130.0.6723.191 Electron/33.3.2 Safari/537.36", 63 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.3 Chrome/130.0.6723.191 Electron/33.3.2 Safari/537.36", 64 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0", 65 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", 66 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0", 67 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0", 68 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0", 69 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.10 Chrome/132.0.6834.196 Electron/34.2.0 Safari/537.36", 70 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0", 71 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15", 72 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15", 73 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:137.0) Gecko/20100101 Firefox/137.0", 74 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15", 75 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 OPR/117.0.0.0", 76 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.9 Chrome/132.0.6834.210 Electron/34.3.0 Safari/537.36", 77 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0" 78 | ] -------------------------------------------------------------------------------- /src/index.d.ts: -------------------------------------------------------------------------------- 1 | declare const topUserAgents: string[]; 2 | export = topUserAgents; 3 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./index.json') 2 | -------------------------------------------------------------------------------- /src/index.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", 3 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", 4 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36", 5 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", 6 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", 7 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.6.5 Chrome/124.0.6367.243 Electron/30.1.2 Safari/537.36", 8 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0", 9 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15", 10 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", 11 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1", 12 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", 13 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36", 14 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", 15 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", 16 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36", 17 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", 18 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/28.0 Chrome/130.0.0.0 Mobile Safari/537.36", 19 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0", 20 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", 21 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", 22 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:138.0) Gecko/20100101 Firefox/138.0", 23 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", 24 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Mobile/15E148 Safari/604.1", 25 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", 26 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", 27 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", 28 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", 29 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 OPR/118.0.0.0", 30 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", 31 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.9 Chrome/132.0.6834.210 Electron/34.3.0 Safari/537.36", 32 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 YaBrowser/25.4.0.0 Safari/537.36", 33 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", 34 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Safari/605.1.15", 35 | "Mozilla/5.0 (X11; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0", 36 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 OPR/119.0.0.0", 37 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", 38 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36", 39 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", 40 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", 41 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", 42 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Mobile/15E148 Safari/604.1", 43 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", 44 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0", 45 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/27.0 Chrome/125.0.0.0 Mobile Safari/537.36", 46 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1", 47 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0", 48 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1", 49 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36", 50 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:138.0) Gecko/20100101 Firefox/138.0", 51 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Mobile/15E148 Safari/604.1", 52 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", 53 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36", 54 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", 55 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", 56 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Mobile Safari/537.36", 57 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15", 58 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Mobile/15E148 Safari/604.1", 59 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", 60 | "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0", 61 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", 62 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", 63 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0", 64 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15", 65 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.10 Chrome/132.0.6834.196 Electron/34.2.0 Safari/537.36", 66 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15", 67 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Mobile Safari/537.36", 68 | "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1", 69 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", 70 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0", 71 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36", 72 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", 73 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0", 74 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", 75 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/136.0.7103.91 Mobile/15E148 Safari/604.1", 76 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36", 77 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", 78 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36", 79 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0", 80 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile Safari/537.36", 81 | "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_10 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", 82 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1", 83 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.6.5 Chrome/124.0.6367.243 Electron/30.1.2 Safari/537.36", 84 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.4 Chrome/130.0.6723.191 Electron/33.3.2 Safari/537.36", 85 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.3 Chrome/130.0.6723.191 Electron/33.3.2 Safari/537.36", 86 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0", 87 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", 88 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", 89 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0", 90 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0", 91 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0", 92 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.10 Chrome/132.0.6834.196 Electron/34.2.0 Safari/537.36", 93 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0", 94 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15", 95 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15", 96 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1", 97 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:137.0) Gecko/20100101 Firefox/137.0", 98 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15", 99 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 OPR/117.0.0.0", 100 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.8.9 Chrome/132.0.6834.210 Electron/34.3.0 Safari/537.36", 101 | "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:137.0) Gecko/20100101 Firefox/137.0" 102 | ] -------------------------------------------------------------------------------- /src/mobile.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./mobile.json') 2 | -------------------------------------------------------------------------------- /src/mobile.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36", 3 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1", 4 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36", 5 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/28.0 Chrome/130.0.0.0 Mobile Safari/537.36", 6 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.4 Mobile/15E148 Safari/604.1", 7 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36", 8 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Mobile/15E148 Safari/604.1", 9 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/27.0 Chrome/125.0.0.0 Mobile Safari/537.36", 10 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1", 11 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1", 12 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36", 13 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Mobile/15E148 Safari/604.1", 14 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36", 15 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Mobile Safari/537.36", 16 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Mobile/15E148 Safari/604.1", 17 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Mobile Safari/537.36", 18 | "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1", 19 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", 20 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/136.0.7103.91 Mobile/15E148 Safari/604.1", 21 | "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile Safari/537.36", 22 | "Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_10 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", 23 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1", 24 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_3_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", 25 | "Mozilla/5.0 (iPhone; CPU iPhone OS 18_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Mobile/15E148 Safari/604.1" 26 | ] -------------------------------------------------------------------------------- /stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microlinkhq/top-user-agents/3e537a8b301fb3af12f3b474dfa6459289f394d9/stats.png -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const test = require('ava') 4 | 5 | test('all', t => { 6 | t.deepEqual(require('top-user-agents'), require('../src/index.json')) 7 | }) 8 | 9 | test('mobile', t => { 10 | t.deepEqual(require('top-user-agents/mobile'), require('../src/mobile.json')) 11 | }) 12 | 13 | test('desktop', t => { 14 | t.deepEqual( 15 | require('top-user-agents/desktop'), 16 | require('../src/desktop.json') 17 | ) 18 | }) 19 | --------------------------------------------------------------------------------