header-generator 2.0.0-beta.7 → 2.0.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -178,7 +178,7 @@
178
178
  APPENDIX: How to apply the Apache License to your work.
179
179
 
180
180
  To apply the Apache License to your work, attach the following
181
- boilerplate notice, with the fields enclosed by brackets "[]"
181
+ boilerplate notice, with the fields enclosed by brackets "{}"
182
182
  replaced with your own identifying information. (Don't include
183
183
  the brackets!) The text should be enclosed in the appropriate
184
184
  comment syntax for the file format. We also recommend that a
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright [yyyy] [name of copyright owner]
189
+ Copyright 2018 Apify Technologies s.r.o.
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
package/README.md CHANGED
@@ -1,155 +1,3 @@
1
- # Header generator
2
- NodeJs package for generating browser-like headers.
3
-
4
- <!-- toc -->
5
-
6
- - [Installation](#installation)
7
- - [Usage](#usage)
8
- - [Presets](#presets)
9
- - [Result example](#result-example)
10
- - [API Reference](#api-reference)
11
-
12
- <!-- tocstop -->
13
-
14
- ## Installation
15
- Run the `npm install header-generator` command. No further setup is needed afterwards.
16
- ## Usage
17
- To use the generator, you need to create an instance of the `HeaderGenerator` class which is exported from this package. Constructor of this class accepts a `HeaderGeneratorOptions` object, which can be used to globally specify what kind of headers you are looking for:
18
- ```js
19
- const { HeaderGenerator } = require('header-generator');
20
- let headerGenerator = new HeaderGenerator({
21
- browsers: [
22
- {name: "firefox", minVersion: 80},
23
- {name: "chrome", minVersion: 87},
24
- "safari"
25
- ],
26
- devices: [
27
- "desktop"
28
- ],
29
- operatingSystems: [
30
- "windows"
31
- ]
32
- });
33
- ```
34
- You can then get the headers using the `getHeaders` method, either with no argument, or with another `HeaderGeneratorOptions` object, this time specifying the options only for this call (overwriting the global options when in conflict) and using the global options specified beforehands for the unspecified options:
35
- ```js
36
- let headers = headersGenerator.getHeaders({
37
- operatingSystems: [
38
- "linux"
39
- ],
40
- locales: ["en-US", "en"]
41
- });
42
- ```
43
- This method always generates a random realistic set of headers, excluding the request dependant headers, which need to be filled in afterwards. Since the generation is randomized, multiple calls to this method with the same parameters can generate multiple different outputs.
44
-
45
- ## Presets
46
- Presets are setting templates for common use cases. It saves time writing the same configuration over and over.
47
- ```js
48
- const { HeaderGenerator, PRESETS } = require('header-generator');
49
- let headerGenerator = new HeaderGenerator(PRESETS.MODERN_WINDOWS_CHROME);
50
- ```
51
-
52
- This preset will fill the configuration for the latest five versions of chrome for windows desktops. Checkout the available presets list [here](https://github.com/apify/header-generator/blob/master/src/presets.ts).
53
- ## Result example
54
- A result that can be generated for the usage example above:
55
- ```json
56
- {
57
- "sec-ch-ua-mobile": "?0",
58
- "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36",
59
- "accept-encoding": "gzip, deflate, br",
60
- "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
61
- "upgrade-insecure-requests": "1",
62
- "accept-language": "en-US,en;0.9",
63
- "sec-fetch-site": "same-site",
64
- "sec-fetch-mode": "navigate",
65
- "sec-fetch-user": "?1",
66
- "sec-fetch-dest": "document"
67
- }
68
- ```
69
- ## API Reference
70
- All public classes, methods and their parameters can be inspected in this API reference.
71
-
72
- <a name="HeaderGenerator"></a>
73
-
74
- ### HeaderGenerator
75
- HeaderGenerator randomly generates realistic browser headers based on specified options.
76
-
77
-
78
- * [HeaderGenerator](#HeaderGenerator)
79
- * [`new HeaderGenerator(options)`](#new_HeaderGenerator_new)
80
- * [`.getHeaders(options, requestDependentHeaders)`](#HeaderGenerator+getHeaders)
81
- * [`.orderHeaders(headers, order)`](#HeaderGenerator+orderHeaders)
82
-
83
-
84
- * * *
85
-
86
- <a name="new_HeaderGenerator_new"></a>
87
-
88
- #### `new HeaderGenerator(options)`
89
-
90
- | Param | Type | Description |
91
- | --- | --- | --- |
92
- | options | [<code>HeaderGeneratorOptions</code>](#HeaderGeneratorOptions) | default header generation options used unless overridden |
93
-
94
-
95
- * * *
96
-
97
- <a name="HeaderGenerator+getHeaders"></a>
98
-
99
- #### `headerGenerator.getHeaders(options, requestDependentHeaders)`
100
- Generates a single set of ordered headers using a combination of the default options specified in the constructor
101
- and their possible overrides provided here.
102
-
103
-
104
- | Param | Type | Description |
105
- | --- | --- | --- |
106
- | options | [<code>HeaderGeneratorOptions</code>](#HeaderGeneratorOptions) | specifies options that should be overridden for this one call |
107
- | requestDependentHeaders | <code>Object</code> | specifies known values of headers dependent on the particular request |
108
-
109
-
110
- * * *
111
-
112
- <a name="HeaderGenerator+orderHeaders"></a>
113
-
114
- #### `headerGenerator.orderHeaders(headers, order)`
115
- Returns a new object that contains ordered headers.
116
-
117
-
118
- | Param | Type | Description |
119
- | --- | --- | --- |
120
- | headers | <code>object</code> | specifies known values of headers dependent on the particular request |
121
- | order | <code>Array.&lt;string&gt;</code> | an array of ordered header names, optional (will be deducted from `user-agent`) |
122
-
123
-
124
- * * *
125
-
126
- <a name="BrowserSpecification"></a>
127
-
128
- ### `BrowserSpecification`
129
-
130
- | Param | Type | Description |
131
- | --- | --- | --- |
132
- | name | <code>string</code> | One of `chrome`, `firefox` and `safari`. |
133
- | minVersion | <code>number</code> | Minimal version of browser used. |
134
- | maxVersion | <code>number</code> | Maximal version of browser used. |
135
- | httpVersion | <code>string</code> | Http version to be used to generate headers (the headers differ depending on the version). Either 1 or 2. If none specified the httpVersion specified in `HeaderGeneratorOptions` is used. |
136
-
137
-
138
- * * *
139
-
140
- <a name="HeaderGeneratorOptions"></a>
141
-
142
- ### `HeaderGeneratorOptions`
143
-
144
- | Param | Type | Description |
145
- | --- | --- | --- |
146
- | browsers | <code>Array.&lt;(BrowserSpecification\|string)&gt;</code> | List of BrowserSpecifications to generate the headers for, or one of `chrome`, `firefox` and `safari`. |
147
- | browserListQuery | <code>string</code> | Browser generation query based on the real world data. For more info see the [query docs](https://github.com/browserslist/browserslist#full-list). If `browserListQuery` is passed the `browsers` array is ignored. |
148
- | operatingSystems | <code>Array.&lt;string&gt;</code> | List of operating systems to generate the headers for. The options are `windows`, `macos`, `linux`, `android` and `ios`. |
149
- | devices | <code>Array.&lt;string&gt;</code> | List of devices to generate the headers for. Options are `desktop` and `mobile`. |
150
- | locales | <code>Array.&lt;string&gt;</code> | List of at most 10 languages to include in the [Accept-Language](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language) request header in the language format accepted by that header, for example `en`, `en-US` or `de`. |
151
- | httpVersion | <code>string</code> | Http version to be used to generate headers (the headers differ depending on the version). Can be either 1 or 2. Default value is 2. |
152
-
153
-
154
- * * *
1
+ # Fingerprint suite
155
2
 
3
+ This repository contains a set of fingerprinting tools developed by Apify.
package/index.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRESETS = void 0;
4
+ const tslib_1 = require("tslib");
5
+ tslib_1.__exportStar(require("./header-generator"), exports);
6
+ exports.PRESETS = tslib_1.__importStar(require("./presets"));
7
+ //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,66 +1,47 @@
1
1
  {
2
- "name": "header-generator",
3
- "version": "2.0.0-beta.7",
4
- "description": "NodeJs package for generating browser-like headers.",
5
- "author": {
6
- "name": "Apify",
7
- "email": "support@apify.com",
8
- "url": "https://apify.com"
9
- },
10
- "homepage": "https://github.com/apify/header-generator#readme",
11
- "license": "Apache-2.0",
12
- "engines": {
13
- "node": ">=15.10.0"
14
- },
15
- "files": [
16
- "dist"
17
- ],
18
- "main": "dist/index.js",
19
- "module": "dist/index.mjs",
20
- "types": "dist/index.d.ts",
21
- "exports": {
22
- ".": {
23
- "import": "./dist/index.mjs",
24
- "require": "./dist/index.js"
25
- }
26
- },
27
- "dependencies": {
28
- "browserslist": "^4.19.1",
29
- "generative-bayesian-network": "0.1.0-beta.1",
30
- "ow": "^0.23.0",
31
- "tslib": "^2.3.1"
32
- },
33
- "devDependencies": {
34
- "@apify/eslint-config-ts": "^0.1.4",
35
- "@apify/tsconfig": "^0.1.0",
36
- "@types/jest": "^27.0.2",
37
- "@typescript-eslint/eslint-plugin": "^4.32.0",
38
- "@typescript-eslint/parser": "^4.32.0",
39
- "eslint": "^7.0.0",
40
- "gen-esm-wrapper": "^1.1.3",
41
- "jest": "^27.2.5",
42
- "jest-circus": "^27.2.4",
43
- "jsdoc-to-markdown": "^7.0.0",
44
- "markdown-toc": "^1.2.0",
45
- "ts-jest": "^27.0.5",
46
- "ts-node": "^10.2.1",
47
- "typescript": "^4.4.3"
48
- },
49
- "scripts": {
50
- "build": "rimraf dist && tsc",
51
- "postbuild": "gen-esm-wrapper dist/index.js dist/index.mjs",
52
- "prepublishOnly": "npm run build",
53
- "lint": "eslint src test",
54
- "lint:fix": "eslint src test --fix",
55
- "test": "jest",
56
- "build-docs": "npm run build && npm run build-toc && node docs/build-docs.js",
57
- "build-toc": "markdown-toc docs/README.md -i"
58
- },
59
- "bugs": {
60
- "url": "https://github.com/apify/header-generator/issues"
61
- },
62
- "repository": {
63
- "type": "git",
64
- "url": "git+https://github.com/apify/header-generator.git"
65
- }
2
+ "name": "header-generator",
3
+ "version": "2.0.0-dev.0",
4
+ "description": "NodeJs package for generating browser-like headers.",
5
+ "author": {
6
+ "name": "Apify",
7
+ "email": "support@apify.com",
8
+ "url": "https://apify.com"
9
+ },
10
+ "homepage": "https://github.com/apify/header-generator#readme",
11
+ "license": "Apache-2.0",
12
+ "engines": {
13
+ "node": ">=16.0.0"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "main": "index.js",
19
+ "module": "index.mjs",
20
+ "types": "index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "import": "./index.mjs",
24
+ "require": "./index.js"
25
+ }
26
+ },
27
+ "dependencies": {
28
+ "browserslist": "^4.19.1",
29
+ "generative-bayesian-network": "^2.0.0",
30
+ "ow": "^0.28.1"
31
+ },
32
+ "scripts": {
33
+ "build": "npm run clean && npm run compile",
34
+ "postbuild": "cp -r src/data_files/ ",
35
+ "clean": "rimraf ./dist",
36
+ "compile": "tsc -p tsconfig.build.json && gen-esm-wrapper ./index.js ./index.mjs",
37
+ "copy": "ts-node -T ../../scripts/copy.ts"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/apify/header-generator/issues"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/apify/header-generator.git"
45
+ },
46
+ "gitHead": "2dd3d8c9ced1a14cb74ef16ebdd50b349bb5971b"
66
47
  }
@@ -1,21 +0,0 @@
1
- export declare const SUPPORTED_BROWSERS: readonly ["chrome", "firefox", "safari"];
2
- export declare const SUPPORTED_OPERATING_SYSTEMS: readonly ["windows", "macos", "linux", "android", "ios"];
3
- export declare const SUPPORTED_DEVICES: readonly ["desktop", "mobile"];
4
- export declare const SUPPORTED_HTTP_VERSIONS: readonly ["1", "2"];
5
- export declare const BROWSER_HTTP_NODE_NAME: "*BROWSER_HTTP";
6
- export declare const OPERATING_SYSTEM_NODE_NAME: "*OPERATING_SYSTEM";
7
- export declare const DEVICE_NODE_NAME: "*DEVICE";
8
- export declare const MISSING_VALUE_DATASET_TOKEN: "*MISSING_VALUE*";
9
- export declare const HTTP1_SEC_FETCH_ATTRIBUTES: {
10
- readonly mode: "Sec-Fetch-Mode";
11
- readonly dest: "Sec-Fetch-Dest";
12
- readonly site: "Sec-Fetch-Site";
13
- readonly user: "Sec-Fetch-User";
14
- };
15
- export declare const HTTP2_SEC_FETCH_ATTRIBUTES: {
16
- readonly mode: "sec-fetch-mode";
17
- readonly dest: "sec-fetch-dest";
18
- readonly site: "sec-fetch-site";
19
- readonly user: "sec-fetch-user";
20
- };
21
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,0CAIrB,CAAC;AACX,eAAO,MAAM,2BAA2B,0DAA2D,CAAC;AACpG,eAAO,MAAM,iBAAiB,gCAAiC,CAAC;AAChE,eAAO,MAAM,uBAAuB,qBAAsB,CAAC;AAE3D,eAAO,MAAM,sBAAsB,iBAA2B,CAAC;AAC/D,eAAO,MAAM,0BAA0B,qBAA+B,CAAC;AACvE,eAAO,MAAM,gBAAgB,WAAqB,CAAC;AACnD,eAAO,MAAM,2BAA2B,mBAA6B,CAAC;AAEtE,eAAO,MAAM,0BAA0B;;;;;CAK7B,CAAC;AAEX,eAAO,MAAM,0BAA0B;;;;;CAK7B,CAAC"}
package/dist/constants.js DELETED
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HTTP2_SEC_FETCH_ATTRIBUTES = exports.HTTP1_SEC_FETCH_ATTRIBUTES = exports.MISSING_VALUE_DATASET_TOKEN = exports.DEVICE_NODE_NAME = exports.OPERATING_SYSTEM_NODE_NAME = exports.BROWSER_HTTP_NODE_NAME = exports.SUPPORTED_HTTP_VERSIONS = exports.SUPPORTED_DEVICES = exports.SUPPORTED_OPERATING_SYSTEMS = exports.SUPPORTED_BROWSERS = void 0;
4
- exports.SUPPORTED_BROWSERS = [
5
- 'chrome',
6
- 'firefox',
7
- 'safari',
8
- ];
9
- exports.SUPPORTED_OPERATING_SYSTEMS = ['windows', 'macos', 'linux', 'android', 'ios'];
10
- exports.SUPPORTED_DEVICES = ['desktop', 'mobile'];
11
- exports.SUPPORTED_HTTP_VERSIONS = ['1', '2'];
12
- exports.BROWSER_HTTP_NODE_NAME = '*BROWSER_HTTP';
13
- exports.OPERATING_SYSTEM_NODE_NAME = '*OPERATING_SYSTEM';
14
- exports.DEVICE_NODE_NAME = '*DEVICE';
15
- exports.MISSING_VALUE_DATASET_TOKEN = '*MISSING_VALUE*';
16
- exports.HTTP1_SEC_FETCH_ATTRIBUTES = {
17
- mode: 'Sec-Fetch-Mode',
18
- dest: 'Sec-Fetch-Dest',
19
- site: 'Sec-Fetch-Site',
20
- user: 'Sec-Fetch-User',
21
- };
22
- exports.HTTP2_SEC_FETCH_ATTRIBUTES = {
23
- mode: 'sec-fetch-mode',
24
- dest: 'sec-fetch-dest',
25
- site: 'sec-fetch-site',
26
- user: 'sec-fetch-user',
27
- };
28
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kBAAkB,GAAG;IAC9B,QAAQ;IACR,SAAS;IACT,QAAQ;CACF,CAAC;AACE,QAAA,2BAA2B,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AACvF,QAAA,iBAAiB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AACnD,QAAA,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,CAAU,CAAC;AAE9C,QAAA,sBAAsB,GAAG,eAAwB,CAAC;AAClD,QAAA,0BAA0B,GAAG,mBAA4B,CAAC;AAC1D,QAAA,gBAAgB,GAAG,SAAkB,CAAC;AACtC,QAAA,2BAA2B,GAAG,iBAA0B,CAAC;AAEzD,QAAA,0BAA0B,GAAG;IACtC,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;CAChB,CAAC;AAEE,QAAA,0BAA0B,GAAG;IACtC,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;CAChB,CAAC"}
@@ -1 +0,0 @@
1
- ["chrome/87.0.4280.66|2", "chrome/48.0.2564.116|2", "chrome/69.0.3497.100|2", "chrome/60.0.3112.90|2", "chrome/79.0.3945.79|2", "chrome/86.0.4240.75|2", "chrome/94.0.4590.2|2", "chrome/92.0.4512.0|2", "chrome/76.0.3809.71|2", "chrome/93.0.4577.63|1", "chrome/79.0.3945.130|2", "firefox/44.0|2", "chrome/71.0.3578.80|2", "chrome/75.0.3765.0|2", "chrome/93.0.4577.63|2", "firefox/38.0|2", "*MISSING_VALUE*|2", "safari/601.4.4|2", "chrome/56.0.2924.87|2", "chrome/84.0.4147.125|2", "chrome/80.0.3987.122|2", "chrome/91.0.4472.101|2", "firefox/91.0|2", "chrome/47.0.2526.106|2", "chrome/88.0.4324.182|2", "chrome/92.0.4515.115|2", "chrome/90.0.4430.212|2", "chrome/91.0.4472.164|2", "chrome/90.0.4430.85|1", "chrome/87.0.4280.67|2", "chrome/91.0.4472.88|2", "chrome/61.0.3163.100|2", "chrome/61.0.3163.79|1", "chrome/93.0.4577.0|2", "chrome/91.0.4472.124|2", "safari/601.3.9|2", "chrome/48.0.2564.103|2", "chrome/86.0.4240.193|2", "firefox/90.0|2", "firefox/91.0|1", "chrome/92.0.4515.159|1", "firefox/90.0|1", "chrome/91.0.4472.77|2", "chrome/88.0.4298.0|2", "safari/604.1|2", "chrome/91.0.4472.114|2", "chrome/46.0.2486.0|2", "chrome/92.0.4515.131|2", "chrome/64.0.3282.140|2", "chrome/48.0.2564.109|2", "firefox/43.0|2", "chrome/48.0.2564.97|2", "chrome/90.0.4430.91|2", "chrome/60.0.3694.1234|2", "chrome/92.0.4515.159|2", "firefox/57.0|2", "chrome/73.0.3683.75|2", "chrome/80.0.3987.132|2", "chrome/83.0.4103.116|2", "chrome/80.0.3987.116|2", "chrome/57.0.2987.108|1", "chrome/65.0.3325.146|2", "chrome/83.0.4103.97|2", "chrome/68.0.3440.106|2", "safari/605.1.15|2", "chrome/87.0.4280.141|2", "chrome/62.0.3202.9|2", "chrome/91.0.4472.120|2", "chrome/86.0.4240.198|2", "chrome/80.0.3987.149|2", "chrome/89.0.4389.128|2", "chrome/92.0.4515.107|2", "chrome/60.0.3112.113|2", "chrome/90.0.4430.229|2", "chrome/90.0.4430.210|2", "firefox/92.0|2", "chrome/90.0.4430.93|2", "chrome/89.0.4389.105|2", "firefox/89.0|2", "chrome/91.0.4472.81|2", "chrome/92.0.4515.157|2", "chrome/70.0.3538.102|2", "chrome/75.0.3770.142|2", "chrome/92.0.4515.131|1", "chrome/94.0.4595.0|2", "chrome/90.0.4430.85|2", "chrome/80.0.3987.87|2", "chrome/69.2.0.1713|2", "chrome/90.0.4420.0|2", "chrome/81.0.4044.138|2", "firefox/71.0|2", "chrome/81.0.4044.92|2", "chrome/91.0.4472.114|1", "chrome/90.0.4430.86|2", "chrome/79.0.3945.88|2", "firefox/88.0|2", "chrome/86.0.4|2", "firefox/85.0|2", "chrome/93.0.4577.51|2", "chrome/87.0.4280.101|2", "chrome/89.0.4389.82|2", "chrome/81.0.4044.129|2", "chrome/88.0.4324.187|2", "firefox/78.0|2", "chrome/83.0.4103.106|2", "firefox/87.0|2", "chrome/92.0.4515.126|2", "chrome/93.0.4577.18|2", "chrome/74.0.3729.169|2", "safari/537.36|2", "chrome/92.0.4515.134|2", "chrome/92.0.0.0|2", "firefox/93.0|2", "firefox/68.0|2", "chrome/89.0.4389.114|2", "chrome/94.0.4606.12|2", "chrome/70.0.3538.110|2", "chrome/93.0.4577.42|2", "chrome/85.0.4183.93|2", "chrome/74.0.3729.108|2", "chrome/94.0.4603.0|2", "chrome/94.0.4592.0|2", "firefox/80.0|2", "firefox/56.0|2", "chrome/95.0.4609.6|2", "chrome/90.0.4430.214|2", "chrome/86.0.4240.80|2", "chrome/91.0.4472.106|2", "chrome/80.0.3987.100|2", "chrome/89.0.4389.90|2", "chrome/80.0.3987.99|2", "chrome/93.0.4577.39|2", "chrome/72.0.3626.109|2", "chrome/49.0.2623.75|2", "chrome/91.0.4472.167|2", "chrome/89.0.4389.72|2", "chrome/92.0.4515.107|1", "firefox/86.0|2", "chrome/77.0.3865.116|2", "chrome/85.0.4183.102|2", "chrome/86.0.4240.183|2", "chrome/79.0.3945.136|2", "chrome/79.0.3945.116|2", "chrome/81.0.4044.111|2", "chrome/91.0.4472.124|1", "chrome/75.0.3770.100|2", "chrome/91.0.4472.102|2", "chrome/91.0.4472.77|1", "firefox/60.0|2", "chrome/90.0.4430.218|2", "chrome/71.0.3578.141|2", "chrome/88.0.4324.146|2", "chrome/90.0.0.0|2", "chrome/91.0.4472.106|1", "chrome/90.0.4430.72|2", "chrome/87.0.4280.88|2", "chrome/89.0.4389.114|1", "chrome/63.0.3235.0|2", "chrome/72.0.3626.121|2", "chrome/86.0.4240.111|2", "chrome/55.0.2883.91|2", "chrome/80.0.3987.145|1", "chrome/77.0.3865.92|2", "chrome/88.0.4324.181|2", "chrome/92.0.4515.130|2", "chrome/91.0.4472.135|2", "chrome/94.0.4606.3|2", "chrome/95.0.4609.3|2", "chrome/61.0.3163.91|2", "firefox/72.0|2", "chrome/90.0.4403.0|2", "chrome/93.0.4577.37|2", "chrome/62.0.3202.84|2", "chrome/93.0.4577.22|2", "chrome/74.0.3729.136|2", "chrome/88.0.4324.192|2", "chrome/55.0.4874.1831|2", "chrome/93.0.4577.36|2", "chrome/72.0.3626.81|2", "chrome/57.0.2987.137|2", "chrome/91.0.4472.164|1", "chrome/86.0.4240.277|2", "chrome/81.0.4044.117|2", "chrome/81.0.4044.122|2", "chrome/71.0.3578.98|2", "chrome/91.0.4472.194|2", "chrome/94.0.4596.0|2", "chrome/92.0.4515.93|2", "chrome/78.0.3904.97|2", "chrome/80.0.3987.119|2", "firefox/84.0|2", "chrome/94.0.4604.0|2", "chrome/71.0.3578.99|2", "safari/601.2.7|2", "chrome/93.0.4577.15|2", "chrome/85.0.4183.121|1", "chrome/70.0.3538.80|2", "firefox/79.0|2", "chrome/85.0.4183.83|2", "chrome/67.0.3396.87|2", "chrome/93.0.4577.25|2", "chrome/70.0.3538.77|2", "firefox/78.0|1", "firefox/63.0|2", "chrome/88.0.4324.152|2", "chrome/74.0.3729.157|2", "chrome/49.0.2623.87|2", "chrome/93.0.4531.0|2", "firefox/69.0|2", "chrome/77.0.3835.0|2", "chrome/99.0.3538.77|2", "chrome/84.0.4147.122|2", "chrome/87.0.4280.88|1", "chrome/91.0.4472.166|2", "chrome/85.0.4183.121|2", "chrome/91.0.4472.147|2", "chrome/85.0.4183.127|2", "safari/602.1|2", "chrome/59.0.3071.125|2", "chrome/48.0.2564.82|2", "chrome/94.0.4585.0|2", "chrome/88.0.4324.93|2", "chrome/63.0.3237.0|2", "firefox/81.0|2", "firefox/83.0|2", "chrome/91.0.4472.101|1", "chrome/80.0.3987.88|2", "firefox/82.0|2", "chrome/94.0.4600.0|2", "chrome/49.0.2623.112|2", "chrome/76.0.3809.132|1", "chrome/63.0.3239.132|2", "chrome/89.0.4389.128|1", "firefox/74.0|2", "chrome/71.0.3563.0|2", "chrome/59.0.3071.115|2", "chrome/44.0.2403.119|2", "chrome/50.0.2661.89|2", "chrome/86.0.4240.111|1", "chrome/88.0.4324.190|2", "chrome/89.0.4389.130|2", "chrome/78.0.3904.108|2", "chrome/84.0.4147.89|2", "chrome/87.0.4280.144|2", "chrome/88.0.4324.150|2", "chrome/90.0.4430.230|2", "chrome/79.0.3945.147|2", "firefox/47.0|2", "chrome/54.0.2862.63|2", "firefox/51.0|2", "chrome/68.0.3440.91|2", "chrome/92.0.4515.115|1", "chrome/90.0.4430.82|2", "chrome/94.0.4590.0|2", "chrome/94.0.4595.3|2", "chrome/70.0.3538.67|2", "chrome/83.0.4103.119|2", "chrome/83.0.4103.61|1", "chrome/84.0.4147.135|2", "chrome/88.0.4324.104|2", "chrome/88.0.4324.96|2", "chrome/92.0.4515.80|2", "firefox/89.0|1", "safari/604.1|1", "*MISSING_VALUE*|1", "chrome/93.0.4558.0|2", "chrome/64.0.3282.39|2", "chrome/87.0.4280.142|2", "chrome/86.0.4240.272|2", "chrome/61.0.3163.128|2", "chrome/91.0.4464.0|2", "chrome/94.0.4589.2|2", "chrome/91.0.0.0|2", "chrome/76.0.3809.132|2", "chrome/91.0.4472.146|2", "chrome/93.0.4566.0|2", "chrome/92.0.4515.111|2", "chrome/76.0.3809.136|2", "chrome/84.0.4147.111|1", "chrome/55.0.2883.91|1", "chrome/55.0.2883.95|2", "chrome/57.0.8883.1194|2", "chrome/85.0.4183.81|1", "chrome/78.0.3904.70|2", "chrome/85.0.4183.101|1", "chrome/87.0.4280.66|1", "chrome/86.0.4240.198|1", "chrome/90.0.4430.93|1", "chrome/92.0.4515.105|2", "chrome/52.0.2743.116|1", "chrome/94.0.4589.0|2", "chrome/84.0.4147.105|2", "chrome/90.0.4430.0|2", "chrome/92.0.4515.51|2", "chrome/92.0.4515.101|2", "chrome/81.0.4044.93|2", "chrome/90.0.4430.212|1", "chrome/78.0.3904.87|2", "chrome/57.0.2987.108|2", "chrome/94.0.4588.0|2", "chrome/87.0.4280.152|2", "safari/605.1.15|1", "chrome/67.0.3396.99|2", "chrome/91.0.4472.135|1", "chrome/84.0.4147.89|1", "chrome/85.0.4183.127|1", "chrome/93.0.4577.8|2", "chrome/94.0.4587.0|2", "chrome/90.0.4430.66|2", "chrome/77.0.3865.90|2", "chrome/50.0.2661.102|2", "chrome/49.0.2991.1751|2", "chrome/42.0.2311.135|2", "chrome/86.0.4240.77|1", "chrome/79.0.3945.117|1", "chrome/77.0.3865.116|1", "chrome/92.0.4515.76|2", "chrome/43.0.3835.1044|2", "chrome/91.0.4472.120|1", "chrome/93.0.4563.0|2", "chrome/79.0.3945.117|2", "chrome/85.0.4183.101|2", "chrome/84.0.4147.111|2", "chrome/92.0.4515.105|1", "chrome/89.0.4389.72|1", "firefox/52.0|2", "chrome/80.0.3987.163|2", "chrome/89.0.4389.86|2", "chrome/80.0.3987.99|1", "chrome/81.0.4044.152|2", "chrome/85.0.4183.81|2", "chrome/83.0.4103.87|2", "chrome/94.0.4583.0|2", "chrome/90.0.4430.216|2", "chrome/77.0.3865.120|2", "chrome/61.0.3163.98|2", "chrome/86.0.4240.185|2", "firefox/45.0|2"]