├── web_server
├── client
│ ├── src
│ │ ├── NewsPanel
│ │ │ ├── NewsPanel.css
│ │ │ └── NewsPanel.js
│ │ ├── Base
│ │ │ ├── Base.css
│ │ │ └── Base.js
│ │ ├── App
│ │ │ ├── logo.png
│ │ │ ├── App.css
│ │ │ └── App.js
│ │ ├── login
│ │ │ ├── LoginForm.css
│ │ │ ├── LoginForm.js
│ │ │ └── LoginPage.js
│ │ ├── signup
│ │ │ ├── SignUpForm.css
│ │ │ ├── SignUpForm.js
│ │ │ └── SignUpPage.js
│ │ ├── index.js
│ │ ├── Auth
│ │ │ └── Auth.js
│ │ ├── NewsCard
│ │ │ ├── NewsCard.css
│ │ │ └── NewsCard.js
│ │ └── routes.js
│ ├── public
│ │ ├── favicon.ico
│ │ ├── manifest.json
│ │ └── index.html
│ ├── .gitignore
│ └── package.json
└── server
│ ├── views
│ ├── index.jade
│ ├── error.jade
│ └── layout.jade
│ ├── config
│ └── config.json
│ ├── public
│ └── stylesheets
│ │ └── style.css
│ ├── rpc_sclient
│ ├── rpc_client_test.js
│ └── rpc_client.js
│ ├── routes
│ ├── index.js
│ ├── news.js
│ └── auth.js
│ ├── models
│ ├── main.js
│ └── user.js
│ ├── .gitignore
│ ├── passport
│ ├── signup_passport.js
│ └── login_passport.js
│ ├── package.json
│ ├── middleware
│ └── auth_checker.js
│ ├── app.js
│ └── bin
│ └── www
├── README.md
├── requirements.txt
├── news_recommendation_service
├── news_classes.py
├── recommendation_service.py
└── click_log_processor.py
├── common
├── mongodb_client.py
├── news_api_client_test.py
├── news_recommendation_service_client.py
├── mongodb_client_test.py
├── cloudAMQP_client_test.py
├── news_api_client.py
└── cloudAMQP_client.py
├── launcher_mac.sh
├── news_pipeline_launcher.sh
├── news_pipeline
├── tf_idf_deduper_test_1.py
├── scrapers
│ ├── cnn_news_scraper_test.py
│ ├── cnn_news_scraper.py
│ └── user_agents.txt
├── queue_helper.py
├── news_fetcher_with_newspaper.py
├── news_fetcher.py
├── news_monitor.py
├── news_deduper.py
└── tf_idf_deduper_test_2.py
└── backend_server
├── operations_test.py
├── service.py
└── operations.py
/web_server/client/src/NewsPanel/NewsPanel.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web_server/client/src/Base/Base.css:
--------------------------------------------------------------------------------
1 | .nav-wrapper {
2 | background-color: transparent;
3 | }
--------------------------------------------------------------------------------
/web_server/client/src/App/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YiminCong/Tap-News/HEAD/web_server/client/src/App/logo.png
--------------------------------------------------------------------------------
/web_server/server/views/index.jade:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | h1= title
5 | p Welcome to #{title}
6 |
--------------------------------------------------------------------------------
/web_server/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YiminCong/Tap-News/HEAD/web_server/client/public/favicon.ico
--------------------------------------------------------------------------------
/web_server/server/views/error.jade:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | h1= message
5 | h2= error.status
6 | pre #{error.stack}
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Tap-News
2 | ⚡️news recommendation system
3 |
4 |
5 |
--------------------------------------------------------------------------------
/web_server/server/config/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "mongoDbUri": "mongodb://test:test@ds058579.mlab.com:58579/cs503",
3 | "jwtSecret": "a secret phrase!!"
4 | }
--------------------------------------------------------------------------------
/web_server/server/views/layout.jade:
--------------------------------------------------------------------------------
1 | doctype html
2 | html
3 | head
4 | title= title
5 | link(rel='stylesheet', href='/stylesheets/style.css')
6 | body
7 | block content
8 |
--------------------------------------------------------------------------------
/web_server/client/src/login/LoginForm.css:
--------------------------------------------------------------------------------
1 | .login-panel {
2 | margin: auto;
3 | width: 40%;
4 | }
5 |
6 | .error-message {
7 | padding-left: 20px;
8 | color: red;
9 | }
--------------------------------------------------------------------------------
/web_server/server/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 50px;
3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | a {
7 | color: #00B7FF;
8 | }
9 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | newspaper3k
2 | jsonrpclib-pelix
3 | numpy
4 | pandas
5 | pika
6 | python-dateutil
7 | pymongo
8 | redis
9 | requests
10 | scipy
11 | sklearn
12 | tensorflow
13 | watchdog
--------------------------------------------------------------------------------
/web_server/client/src/signup/SignUpForm.css:
--------------------------------------------------------------------------------
1 | .signup-panel {
2 | margin: auto;
3 | width: 40%;
4 | }
5 |
6 | .error-message {
7 | padding-left: 20px;
8 | color: red;
9 | }
--------------------------------------------------------------------------------
/news_recommendation_service/news_classes.py:
--------------------------------------------------------------------------------
1 | classes = [
2 | "World",
3 | "US",
4 | "Business",
5 | "Technology",
6 | "Entertainment",
7 | "Sports",
8 | "Health",
9 | "Crime",
10 | ]
--------------------------------------------------------------------------------
/web_server/client/src/App/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .logo {
6 | display: block;
7 | margin-left: auto;
8 | margin-right: auto;
9 | padding-top: 30px;
10 | width: 20%;
11 | }
--------------------------------------------------------------------------------
/common/mongodb_client.py:
--------------------------------------------------------------------------------
1 | from pymongo import MongoClient
2 |
3 | MONGO_DB_HOST = "localhost"
4 | MONGO_DB_PORT = 27017
5 | DB_NAME = "news"
6 |
7 | client = MongoClient(MONGO_DB_HOST, MONGO_DB_PORT)
8 |
9 | def get_db(db=DB_NAME):
10 | db = client[db]
11 | return db
--------------------------------------------------------------------------------
/common/news_api_client_test.py:
--------------------------------------------------------------------------------
1 | import news_api_client as client
2 |
3 | def test_basic():
4 | news = client.getNewsFromSource()
5 | assert len(news) > 0
6 | news = client.getNewsFromSource(sources=['cnn'], sortBy='top')
7 | assert len(news) > 0
8 |
9 | if __name__ == "__main__":
10 | test_basic()
--------------------------------------------------------------------------------
/web_server/client/src/index.js:
--------------------------------------------------------------------------------
1 | import ReactDom from 'react-dom';
2 | import React from 'react';
3 |
4 | import { browserHistory, Router } from 'react-router';
5 | import routes from './routes';
6 |
7 | ReactDom.render(
8 | ,
9 | document.getElementById('root')
10 | );
--------------------------------------------------------------------------------
/common/news_recommendation_service_client.py:
--------------------------------------------------------------------------------
1 | import jsonrpclib
2 |
3 | URL = "http://localhost:5050/"
4 |
5 | client = jsonrpclib.ServerProxy(URL)
6 |
7 | def getPreferenceForUser(userId):
8 | preference = client.getPreferenceForUser(userId)
9 | # print("Preference list: %s" % str(preference))
10 | return preference
--------------------------------------------------------------------------------
/web_server/server/rpc_sclient/rpc_client_test.js:
--------------------------------------------------------------------------------
1 | var client = require('./rpc_client');
2 |
3 | // mongoexport --db news --collection news --out a.json
4 | // mongoinmport --db --test --collection test --file /Users/congyimin/Desktop/a.js
5 | // invoke 'add'
6 | client.add(1, 2, function(response) {
7 | console.assert(response == 3);
8 | });
--------------------------------------------------------------------------------
/web_server/server/routes/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 | var path = require('path');
4 |
5 | /* GET home page. */
6 | router.get('/', function(req, res, next) {
7 | res.sendFile("index.html", { root: path.join(__dirname, '../../client/build')} );
8 | });
9 |
10 | module.exports = router;
11 |
--------------------------------------------------------------------------------
/launcher_mac.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | redis-server
3 | mongod start
4 |
5 | pip install -r requirements.txt
6 |
7 | cd news_pipeline
8 | python news_monitor.py &
9 | python news_fetcher.py &
10 | python news_deduper.py &
11 |
12 | echo "=================================================="
13 | read -p "PRESS [ENTER] TO TERMINATE PROCESSES." PRESSKEY
14 |
15 | kill $(jobs -p)
--------------------------------------------------------------------------------
/web_server/server/models/main.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 | module.exports.connect = (uri) => {
4 | mongoose.connect(uri);
5 |
6 | mongoose.connection.on('error', (err) => {
7 | console.error(`Mongoose connection error: ${err}`);
8 | process.exit(1);
9 | });
10 |
11 | // load models
12 | require('./user');
13 | };
--------------------------------------------------------------------------------
/news_pipeline_launcher.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | service redis_6379 start
3 | service mongod start
4 |
5 | pip install -r requirements.txt
6 |
7 | cd news_pipeline
8 | python news_monitor.py &
9 | python news_fetcher.py &
10 | python news_deduper.py &
11 |
12 | echo "=================================================="
13 | read -p "PRESS [ENTER] TO TERMINATE PROCESSES." PRESSKEY
14 |
15 | kill $(jobs -p)
--------------------------------------------------------------------------------
/web_server/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env.local
15 | .env.development.local
16 | .env.test.local
17 | .env.production.local
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
--------------------------------------------------------------------------------
/web_server/server/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env.local
15 | .env.development.local
16 | .env.test.local
17 | .env.production.local
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
--------------------------------------------------------------------------------
/web_server/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/common/mongodb_client_test.py:
--------------------------------------------------------------------------------
1 | import mongodb_client as client
2 |
3 | def test_basic():
4 | db = client.get_db('test')
5 | db.test.drop()
6 | assert db.test.count() == 0
7 |
8 | db.test.insert({'test': 1})
9 | assert db.test.count() == 1
10 |
11 | db.test.drop()
12 | assert db.test.count() == 0
13 |
14 | print('test_basic passed!')
15 |
16 | if __name__ == "__main__":
17 | test_basic()
--------------------------------------------------------------------------------
/news_pipeline/tf_idf_deduper_test_1.py:
--------------------------------------------------------------------------------
1 | from sklearn.feature_extraction.text import TfidfVectorizer
2 |
3 | doc1 = "I like apples. I like oranges too"
4 | doc2 = "I love apples. I hate doctors"
5 | doc3 = "An apple a day keeps the doctor away"
6 | doc4 = "Never compare an apple to an orang"
7 |
8 | documents = [doc1, doc2, doc3, doc4]
9 |
10 | tfidf = TfidfVectorizer().fit_transform(documents)
11 | pairwise_sim = tfidf * tfidf.T
12 |
13 | print(pairwise_sim.A)
--------------------------------------------------------------------------------
/news_pipeline/scrapers/cnn_news_scraper_test.py:
--------------------------------------------------------------------------------
1 | import cnn_news_scraper as scraper
2 |
3 | EXPECTED_NEWS = "Santiago is charged with using and carrying a firearm during and in relation to a crime of violence"
4 | CNN_NEWS_URL = "http://edition.cnn.com/2017/01/17/us/fort-lauderdale-shooter-isis-claim/index.html"
5 |
6 | def test_basic():
7 | news = scraper.extract_news(CNN_NEWS_URL)
8 |
9 | print(news)
10 | assert EXPECTED_NEWS in news
11 | print('test_basic passed!')
12 |
13 | if __name__ == "__main__":
14 | test_basic()
--------------------------------------------------------------------------------
/web_server/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tap-news",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "lodash": "^4.17.4",
7 | "materialize-css": "^0.100.2",
8 | "react": "^16.2.0",
9 | "react-dom": "^16.2.0",
10 | "react-router": "^3.2.0",
11 | "react-scripts": "1.0.17"
12 | },
13 | "scripts": {
14 | "start": "react-scripts start",
15 | "build": "react-scripts build",
16 | "test": "react-scripts test --env=jsdom",
17 | "eject": "react-scripts eject"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/web_server/client/src/App/App.js:
--------------------------------------------------------------------------------
1 | import 'materialize-css/dist/css/materialize.min.css'
2 | import 'materialize-css/dist/js/materialize.min.js';
3 | import React from 'react';
4 | import './App.css';
5 | import logo from './logo.png';
6 | import NewsPanel from '../NewsPanel/NewsPanel';
7 | class App extends React.Component{
8 | render(){
9 | return(
10 |
11 |

12 |
13 |
14 |
15 |
16 | );
17 | }
18 | }
19 |
20 | export default App;
--------------------------------------------------------------------------------
/web_server/server/passport/signup_passport.js:
--------------------------------------------------------------------------------
1 | const User = require('mongoose').model('User');
2 | const PassportLocalStrategy = require('passport-local').Strategy;
3 |
4 | module.exports = new PassportLocalStrategy({
5 | usernameField: 'email',
6 | passwordField: 'password',
7 | passReqToCallback: true
8 | }, (req, email, password, done) => {
9 | const userData = {
10 | email: email.trim(),
11 | password: password
12 | };
13 |
14 | const newUser = new User(userData);
15 | newUser.save((err) => {
16 | console.log('Save new user!');
17 | if (err) {
18 | return done(err);
19 | }
20 |
21 | return done(null);
22 | });
23 | });
--------------------------------------------------------------------------------
/web_server/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "nodemon ./bin/www"
7 | },
8 | "dependencies": {
9 | "bcrypt": "^1.0.3",
10 | "body-parser": "^1.18.2",
11 | "cookie-parser": "~1.4.3",
12 | "cors": "^2.8.4",
13 | "debug": "~2.6.9",
14 | "express": "~4.15.5",
15 | "jade": "~1.11.0",
16 | "jayson": "^2.0.5",
17 | "jsonwebtoken": "^8.1.0",
18 | "mongoose": "^4.13.9",
19 | "morgan": "~1.9.0",
20 | "passport": "^0.4.0",
21 | "passport-local": "^1.0.0",
22 | "serve-favicon": "~2.4.5",
23 | "validator": "^9.2.0"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/web_server/client/src/Auth/Auth.js:
--------------------------------------------------------------------------------
1 | class Auth {
2 | static authenticateUser(token, email) {
3 | localStorage.setItem('token', token);
4 | localStorage.setItem('email', email);
5 | }
6 |
7 | static isUserAuthenticated() {
8 | return localStorage.getItem('token')!==null;
9 | }
10 |
11 | static deauthenticateUser() {
12 | localStorage.removeItem('token');
13 | localStorage.removeItem('email');
14 | }
15 |
16 | static getToken() {
17 | return localStorage.getItem('token');
18 | }
19 |
20 | static getEmail() {
21 | return localStorage.getItem('email');
22 | }
23 | }
24 |
25 | export default Auth;
--------------------------------------------------------------------------------
/web_server/server/routes/news.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var rpc_client = require('../rpc_client/rpc_client');
3 | var router = express.Router();
4 |
5 | /* GET users listing. */
6 | router.get('/userId/:userId/pageNum/:pageNum', function(req, res, next) {
7 | user_id = req.params['userId'];
8 | page_num = req.params['pageNum'];
9 |
10 | rpc_client.getNewsSummariesForUser(user_id, page_num, function(response) {
11 | res.json(response);
12 | });
13 | });
14 |
15 | router.post('/userId/:userId/newsId/:newsId', function(req, res, next) {
16 | user_id = req.params['userId'];
17 | newsId = req.params['newsId'];
18 |
19 | rpc_client.logNewsClickForUser(user_id, newsId);
20 | res.status(200);
21 | });
22 |
23 | module.exports = router;
24 |
--------------------------------------------------------------------------------
/common/cloudAMQP_client_test.py:
--------------------------------------------------------------------------------
1 | from cloudAMQP_client import CloudAMQPClient
2 |
3 | # CLOUDAMQP_URL = "amqp://cbzkwlek:4louH2OEYrE66kGmwv8RmLiOC2JZyhSi@donkey.rmq.cloudamqp.com/cbzkwlek"
4 | # CLOUDAMQP_URL2 = "amqp://zzccaypk:iy5nHlQMyvqvt7e46xqHLZ8WeJrF_R-h@porpoise.rmq.cloudamqp.com/zzccaypk"
5 | CLOUDAMQP_URL = "amqp://hsebgbga:ODPWzuu-WcPTGQo8zGgRgZ16ZkoHwtSU@termite.rmq.cloudamqp.com/hsebgbga"
6 | TEST_QUEUE_NAME = "test"
7 |
8 | def test_basic():
9 | client = CloudAMQPClient(CLOUDAMQP_URL, TEST_QUEUE_NAME)
10 |
11 | sentMsg = {"test":"test"}
12 | client.sendMessage(sentMsg)
13 | receivedMsg = client.getMessage()
14 |
15 | assert sentMsg == receivedMsg
16 | print("test_basic passed!")
17 |
18 | if __name__ == "__main__":
19 | test_basic()
--------------------------------------------------------------------------------
/web_server/client/src/NewsCard/NewsCard.css:
--------------------------------------------------------------------------------
1 | .news-intro-col {
2 | display: inline-flex;
3 | color: black;
4 | height: 100%;
5 | }
6 |
7 | .news-intro-panel {
8 | margin: auto 5px;
9 | text-align: left;
10 | }
11 |
12 | .news-description {
13 | text-align: left;
14 | }
15 |
16 | .news-description p {
17 | font-size: 18px;
18 | }
19 |
20 | .news-chip {
21 | font-size: 18px;
22 | }
23 |
24 | .fill {
25 | display: flex;
26 | justify-content: center;
27 | align-items: center;
28 | overflow: hidden;
29 | }
30 |
31 | .fill img {
32 | padding-left: 20px;
33 | padding-right: 20px;
34 | flex-shrink: 0;
35 | min-width: 100%;
36 | max-height: 250px;
37 | object-fit: cover;
38 | }
--------------------------------------------------------------------------------
/web_server/client/src/Base/Base.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Auth from '../Auth/Auth';
3 | import { Link } from 'react-router'
4 | import './Base.css';
5 |
6 | const Base = ({ children }) => (
7 |
8 |
26 |
27 | {children}
28 |
29 | );
30 |
31 | export default Base;
--------------------------------------------------------------------------------
/web_server/server/rpc_sclient/rpc_client.js:
--------------------------------------------------------------------------------
1 | var jayson = require('jayson');
2 |
3 | // create a client
4 | var client = jayson.client.http({
5 | hostname: 'localhost',
6 | port: 4040
7 | });
8 |
9 | // Test Rpc method
10 | function add(a, b, callback) {
11 | client.request('add', [a, b], function(err, response) {
12 | if(err) throw err;
13 | callback(response.result);
14 | });
15 | };
16 |
17 |
18 | function getNewsSummariesForUser(user_id, page_num, callback) {
19 | client.request('getNewsSummariesForUser', [user_id, page_num], function(err, response) {
20 | if(err) throw err;
21 | callback(response.result);
22 | });
23 | };
24 |
25 | function logNewsClickForUser(user_id, news_id) {
26 | client.request('logNewsClickForUser', [user_id, news_id], function(err, response) {
27 | if(err) throw err;
28 | });
29 | };
30 |
31 | module.exports = {
32 | add : add,
33 | getNewsSummariesForUser : getNewsSummariesForUser,
34 | logNewsClickForUser : logNewsClickForUser
35 | };
--------------------------------------------------------------------------------
/web_server/client/src/routes.js:
--------------------------------------------------------------------------------
1 | import Base from './Base/Base';
2 | import App from './App/App';
3 | import LoginPage from './login/LoginPage';
4 | import SignUpPage from './signup/SignUpPage';
5 | import Auth from './Auth/Auth';
6 |
7 | const routes = {
8 | component: Base,
9 | childRoutes: [
10 | {
11 | path: '/',
12 | getComponent: (location, callback) => {
13 | if (Auth.isUserAuthenticated()) {
14 | callback(null, App);
15 | } else {
16 | callback(null, LoginPage);
17 | }
18 | }
19 | },
20 |
21 | {
22 | path: "/login",
23 | component: LoginPage
24 | },
25 |
26 | {
27 | path: "/signup",
28 | component: SignUpPage
29 | },
30 |
31 | {
32 | path: '/logout',
33 | onEnter: (nextState, replace) => {
34 | Auth.deauthenticateUser();
35 | replace('/')
36 | }
37 | }
38 | ]
39 | };
40 |
41 | export default routes;
--------------------------------------------------------------------------------
/web_server/server/middleware/auth_checker.js:
--------------------------------------------------------------------------------
1 | const jwt = require('jsonwebtoken');
2 | const User = require('mongoose').model('User');
3 | const config = require('../config/config.json');
4 |
5 | module.exports = (req, res, next) => {
6 | console.log('auth_checker: req: ' + req.headers);
7 |
8 | if (!req.headers.authorization) {
9 | return res.status(401).end();
10 | }
11 |
12 | // get the last part from a authorization header string like "bearer token-value"
13 | const token = req.headers.authorization.split(' ')[1];
14 |
15 | console.log('auth_checker: token: ' + token);
16 |
17 | // decode the token using a secret key-phrase
18 | return jwt.verify(token, config.jwtSecret, (err, decoded) => {
19 | // the 401 code is for unauthorized status
20 | if (err) { return res.status(401).end(); }
21 |
22 | const id = decoded.sub;
23 |
24 | // check if a user exists
25 | return User.findById(id, (userErr, user) => {
26 | if (userErr || !user) {
27 | return res.status(401).end();
28 | }
29 |
30 | return next();
31 | });
32 | });
33 | };
--------------------------------------------------------------------------------
/backend_server/operations_test.py:
--------------------------------------------------------------------------------
1 | import operations
2 |
3 | def test_getOneNews_basic():
4 | news = operations.getOneNews()
5 | print(news)
6 | assert news is not None
7 | print("test_getOneNews_basic passed!")
8 |
9 | def test_getNewsSummariesForUser_basic():
10 | news = operations.getNewsSummariesForUser('news', 1)
11 | assert len(news) > 0
12 | print('test_getNewsSummariesForUser_basic passed')
13 |
14 | def test_getNewsSummariesForUser_pagination():
15 | news_page_1 = operations.getNewsSummariesForUser('news', 1)
16 | news_page_2 = operations.getNewsSummariesForUser('news', 2)
17 |
18 | assert len(news_page_1) > 0
19 | assert len(news_page_2) > 0
20 |
21 | digests_page_1_set = set([news['digest'] for news in news_page_1])
22 | digests_page_2_set = set([news['digest'] for news in news_page_2])
23 |
24 | assert len(digests_page_1_set.intersection(digests_page_2_set)) == 0
25 |
26 | print('test_getNewsSummariesForUser_pagination passed!')
27 |
28 | if __name__ == "__main__":
29 | test_getOneNews_basic()
30 | test_getNewsSummariesForUser_basic()
31 | test_getNewsSummariesForUser_pagination()
--------------------------------------------------------------------------------
/web_server/server/models/user.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const bcrypt = require('bcrypt');
3 |
4 | const UserSchema = new mongoose.Schema({
5 | email: {
6 | type: String,
7 | index: { unique: true }
8 | },
9 | password: String
10 | });
11 |
12 | UserSchema.methods.comparePassword = function comparePassword(password, callback) {
13 | bcrypt.compare(password, this.password, callback);
14 | };
15 |
16 | UserSchema.pre('save', function saveHook(next) {
17 | const user = this;
18 |
19 | // proceed furhter only if the password is modified or the user is new.
20 | if (!user.isModified('password')) return next();
21 |
22 | return bcrypt.genSalt((saltError, salt) => {
23 | if (saltError) { return next(saltError); }
24 |
25 | return bcrypt.hash(user.password, salt, (hashError, hash) => {
26 | if (hashError) { return next(hashError); }
27 |
28 | // replace a password string with hashed value.
29 | user.password = hash;
30 |
31 | return next();
32 | });
33 | });
34 | });
35 |
36 | module.exports = mongoose.model('User', UserSchema);
--------------------------------------------------------------------------------
/news_pipeline/scrapers/cnn_news_scraper.py:
--------------------------------------------------------------------------------
1 | import os
2 | import random
3 | import requests
4 |
5 | from lxml import html
6 |
7 | GET_CNN_NEWS_XPATH = """//p[contains(@class, 'zn-body__paragraph')]//text() | //div[contains(@class, 'zn-body__paragraph')]//text()"""
8 |
9 | # Load user agents
10 | USER_AGENTS_FILE = os.path.join(os.path.dirname(__file__), 'user_agents.txt')
11 | USER_AGENTS = []
12 |
13 | with open(USER_AGENTS_FILE, 'rb') as uaf:
14 | for ua in uaf.readlines():
15 | if ua:
16 | USER_AGENTS.append(ua.strip()[1:-1])
17 | random.shuffle(USER_AGENTS)
18 |
19 | def _get_headers():
20 | ua = random.choice(USER_AGENTS)
21 | headers = {
22 | "Connection" : "close",
23 | "User-Agent" : ua
24 | }
25 | return headers
26 |
27 | def extract_news(news_url):
28 | session_requests = requests.session()
29 | response = session_requests.get(news_url, headers=_get_headers())
30 | news = {}
31 |
32 | try:
33 | tree = html.fromstring(response.content)
34 | news = tree.xpath(GET_CNN_NEWS_XPATH)
35 | news = ''.join(news) # change list into string
36 | except Exception:
37 | return {}
38 |
39 | return news
--------------------------------------------------------------------------------
/common/news_api_client.py:
--------------------------------------------------------------------------------
1 | import requests
2 |
3 | from json import loads
4 |
5 | NEWS_API_ENDPOINT = 'https://newsapi.org/v1/'
6 | NEWS_API_KEY = '227c9751a8bb46d88175f37dbea5dfff'
7 |
8 | ARTICLES_API = 'articles'
9 |
10 | CNN = 'cnn'
11 |
12 | DEFAULT_SOURCES = [CNN]
13 | SORT_BY_TOP = 'top'
14 |
15 | def _buildUrl(endPoint=NEWS_API_ENDPOINT, apiName=ARTICLES_API):
16 | return endPoint + apiName
17 |
18 | def getNewsFromSource(sources=DEFAULT_SOURCES, sortBy=SORT_BY_TOP):
19 | articles = []
20 |
21 | for source in sources:
22 | payload = {'apiKey':NEWS_API_KEY,
23 | 'source':source,
24 | 'sortBy':sortBy}
25 |
26 | response = requests.get(_buildUrl(), params=payload)
27 | res_json = loads(response.content.decode('utf-8'))
28 |
29 | # Extract news from response
30 | if (res_json is not None and
31 | res_json['status'] == 'ok' and
32 | res_json['source'] is not None):
33 | # populate news source in each articles
34 | for news in res_json['articles']:
35 | news['source'] = res_json['source']
36 |
37 | articles.extend(res_json['articles'])
38 |
39 | return articles
--------------------------------------------------------------------------------
/news_pipeline/queue_helper.py:
--------------------------------------------------------------------------------
1 | """clear queue"""
2 | import os
3 | import sys
4 |
5 | # import common package in parent directory
6 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
7 |
8 | from cloudAMQP_client import CloudAMQPClient
9 |
10 | SCRAPE_NEWS_TASK_QUEUE_URL = "amqp://zzccaypk:iy5nHlQMyvqvt7e46xqHLZ8WeJrF_R-h@porpoise.rmq.cloudamqp.com/zzccaypk"
11 | SCRAPE_NEWS_TASK_QUEUE_NAME = "tmp1"
12 |
13 | DEDUPE_NEWS_TASK_QUEUE_URL = "amqp://hsebgbga:ODPWzuu-WcPTGQo8zGgRgZ16ZkoHwtSU@termite.rmq.cloudamqp.com/hsebgbga"
14 | DEDUPE_NEWS_TASK_QUEUE_NAME = "tmp"
15 |
16 | def clear_queue(queue_url, queue_name):
17 | """clear queue"""
18 | scrape_news_queue_client = CloudAMQPClient(queue_url, queue_name)
19 |
20 | num_of_messages = 0
21 |
22 | while True:
23 | if scrape_news_queue_client is not None:
24 | msg = scrape_news_queue_client.getMessage()
25 | if msg is None:
26 | # print("Cleared %d messages." % num_of_messages)
27 | return
28 | num_of_messages += 1
29 |
30 | if __name__ == "__main__":
31 | clear_queue(SCRAPE_NEWS_TASK_QUEUE_URL, SCRAPE_NEWS_TASK_QUEUE_NAME)
32 | clear_queue(DEDUPE_NEWS_TASK_QUEUE_URL, DEDUPE_NEWS_TASK_QUEUE_NAME)
33 |
--------------------------------------------------------------------------------
/backend_server/service.py:
--------------------------------------------------------------------------------
1 | """serivce backend"""
2 | import os
3 | import sys
4 | from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
5 | import operations
6 | sys.path.append(os.path.join(os.path.dirname(__file__), "utils"))
7 | # import mongodb_client # pylint: disable=import-error, wrong-import-position
8 |
9 | SERVER_HOST = 'localhost'
10 | SERVER_PORT = 4040
11 |
12 | def add(num1, num2):
13 | """Test"""
14 | return num1 + num2
15 |
16 | def get_one_news():
17 | """getonenews"""
18 | # news = mongodb_client.get_db()['news'].find_one()
19 | return operations.getOneNews()
20 |
21 | def get_news_summaries_for_user(user_id, page_num):
22 | """getNewsSummariesForUser"""
23 | return operations.getNewsSummariesForUser(user_id, page_num)
24 |
25 | def log_news_click_for_user(user_id, news_id):
26 | """logNewsClickForUser"""
27 | print("log_news_click_for_user is called with %s and %s" % (user_id, news_id))
28 | operations.logNewsClickForUser(user_id, news_id)
29 |
30 | RPC_SERVER = SimpleJSONRPCServer((SERVER_HOST, SERVER_PORT))
31 | RPC_SERVER.register_function(add, 'add')
32 | RPC_SERVER.register_function(get_one_news, 'get_one_news')
33 | RPC_SERVER.register_function(get_news_summaries_for_user, 'getNewsSummariesForUser')
34 | RPC_SERVER.register_function(log_news_click_for_user, 'logNewsClickForUser')
35 | RPC_SERVER.serve_forever()
36 |
--------------------------------------------------------------------------------
/web_server/server/app.js:
--------------------------------------------------------------------------------
1 | var bodyParser = require('body-parser');
2 | var express = require('express');
3 | var path = require('path');
4 | var cors = require('cors');
5 | var index = require('./routes/index');
6 | var passport = require('passport');
7 | var news = require('./routes/news');
8 | var app = express();
9 | var auth = require('./routes/auth');
10 | var config = require('./config/config.json');
11 |
12 | app.use(bodyParser.json());
13 | require('./models/main.js').connect(config.mongoDbUri);
14 |
15 | app.set('views', path.join(__dirname, '../client/build'));
16 | app.set('view engine', 'jade');
17 |
18 | // uncomment after placing your favicon in /public
19 | //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
20 | app.use("/static", express.static(path.join(__dirname, '../client/build/static/')));
21 |
22 | app.use(cors());
23 |
24 | app.use(passport.initialize());
25 | var localSignUpStrategy = require('./passport/signup_passport');
26 | var localLoginStrategy = require('./passport/login_passport');
27 | passport.use('local-signup', localSignUpStrategy);
28 | passport.use('local-login', localLoginStrategy);
29 |
30 | const authChecker = require('./middleware/auth_checker');
31 |
32 | app.use('/', index);
33 | app.use('/auth', auth);
34 | app.use('/news', authChecker);
35 | app.use('/news', news);
36 |
37 | // catch 404 and forward to error handler
38 | app.use(function(req, res, next) {
39 | res.status(404);
40 | });
41 |
42 | module.exports = app;
43 |
--------------------------------------------------------------------------------
/common/cloudAMQP_client.py:
--------------------------------------------------------------------------------
1 | import json
2 | import pika
3 |
4 | class CloudAMQPClient:
5 | def __init__(self, cloud_amqp_url, queue_name):
6 | self.cloud_amqp_url = cloud_amqp_url
7 | self.queue_name = queue_name
8 | self.parms = pika.URLParameters(cloud_amqp_url)
9 | self.parms.socket_timeout = 3
10 | self.connection = pika.BlockingConnection(self.parms)
11 | self.channel = self.connection.channel()
12 | self.channel.queue_declare(queue=queue_name)
13 |
14 | # send a message
15 | def sendMessage(self, message):
16 | self.channel.basic_publish(exchange='',
17 | routing_key=self.queue_name,
18 | body=json.dumps(message))
19 | print("[x] Sent message to %s:%s" % (self.queue_name, message))
20 |
21 | # get a message
22 | def getMessage(self):
23 | method_frame, header_frame, body = self.channel.basic_get(self.queue_name)
24 | if method_frame:
25 | print("[x] Received message from %s:%s" % (self.queue_name, body))
26 | self.channel.basic_ack(method_frame.delivery_tag)
27 | return json.loads(body.decode('utf-8'))
28 | else:
29 | print("No message returned.")
30 | return None
31 |
32 | # BlockingConnection.sleep is a safer way to sleep than time.sleep(). This
33 | # will repond to server's heartbeat.
34 | def sleep(self, seconds):
35 | self.connection.sleep(seconds)
--------------------------------------------------------------------------------
/web_server/server/passport/login_passport.js:
--------------------------------------------------------------------------------
1 | const jwt = require('jsonwebtoken');
2 | const User = require('mongoose').model('User');
3 | const PassportLocalStrategy = require('passport-local').Strategy;
4 | const config = require('../config/config.json');
5 |
6 | module.exports = new PassportLocalStrategy({
7 | usernameField: 'email',
8 | passwordField: 'password',
9 | session: false,
10 | passReqToCallback: true
11 | }, (req, email, password, done) => {
12 | const userData = {
13 | email: email.trim(),
14 | password: password
15 | };
16 |
17 | // find a user by email address
18 | return User.findOne({ email: userData.email }, (err, user) => {
19 | if (err) { return done(err); }
20 |
21 | if (!user) {
22 | const error = new Error('Incorrect email or password');
23 | error.name = 'IncorrectCredentialsError';
24 |
25 | return done(error);
26 | }
27 |
28 | // check if a hashed user's password is equal to a value saved in the database
29 | return user.comparePassword(userData.password, (passwordErr, isMatch) => {
30 | if (passwordErr) { return done(passwordErr); }
31 |
32 | if (!isMatch) {
33 | const error = new Error('Incorrect email or password');
34 | error.name = 'IncorrectCredentialsError';
35 |
36 | return done(error);
37 | }
38 |
39 | const payload = {
40 | sub: user._id
41 | };
42 |
43 | // create a token string
44 | const token = jwt.sign(payload, config.jwtSecret);
45 | const data = {
46 | name: user.email
47 | };
48 |
49 | return done(null, token, data);
50 | });
51 | });
52 | });
--------------------------------------------------------------------------------
/news_pipeline/news_fetcher_with_newspaper.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 |
4 | # from newspaper import Article
5 |
6 | # import common package in parent directory
7 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
8 |
9 | from cloudAMQP_client import CloudAMQPClient
10 |
11 | DEDUPE_NEWS_TASK_QUEUE_URL = "amqp://hsebgbga:ODPWzuu-WcPTGQo8zGgRgZ16ZkoHwtSU@termite.rmq.cloudamqp.com/hsebgbga"
12 | DEDUPE_NEWS_TASK_QUEUE_NAME = "tmp"
13 | SCRAPE_NEWS_TASK_QUEUE_URL = "amqp://zzccaypk:iy5nHlQMyvqvt7e46xqHLZ8WeJrF_R-h@porpoise.rmq.cloudamqp.com/zzccaypk"
14 | SCRAPE_NEWS_TASK_QUEUE_NAME = "tmp1"
15 |
16 | SLEEP_TIME_IN_SECONDS = 5
17 |
18 | dedupe_news_queue_client = CloudAMQPClient(DEDUPE_NEWS_TASK_QUEUE_URL, DEDUPE_NEWS_TASK_QUEUE_NAME)
19 | scrape_news_queue_client = CloudAMQPClient(SCRAPE_NEWS_TASK_QUEUE_URL, SCRAPE_NEWS_TASK_QUEUE_NAME)
20 |
21 |
22 | def handle_message(msg):
23 | if msg is None or not isinstance(msg, dict):
24 | print('message is broken')
25 | return
26 |
27 | task = msg
28 | text = None
29 |
30 | article = Article(task['url'])
31 | article.download()
32 | article.parse()
33 | task['text'] = article.text
34 |
35 | dedupe_news_queue_client.sendMessage(task)
36 |
37 | while True:
38 | if scrape_news_queue_client is not None:
39 | msg = scrape_news_queue_client.getMessage()
40 | if msg is not None:
41 | # Parse and process the task
42 | try:
43 | handle_message(msg)
44 | except Exception as e:
45 | print(e)
46 | pass
47 | scrape_news_queue_client.sleep(SLEEP_TIME_IN_SECONDS)
--------------------------------------------------------------------------------
/news_recommendation_service/recommendation_service.py:
--------------------------------------------------------------------------------
1 | import operator
2 | import os
3 | import sys
4 |
5 | from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
6 |
7 | # import common package in parent directory
8 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
9 |
10 | import mongodb_client
11 |
12 | PREFERENCE_MODEL_TABLE_NAME = "user_preference_model"
13 |
14 | SERVER_HOST = 'localhost'
15 | SERVER_PORT = 5050
16 |
17 | # Ref: https://www.python.org/dev/peps/pep-0485/#proposed-implementation
18 | # Ref: http://stackoverflow.com/questions/5595425/what-is-the-best-way-to-compare-floats-for-almost-equality-in-python
19 | def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
20 | return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
21 |
22 | def getPreferenceForUser(user_id):
23 | """ Get user's preference in an ordered class list """
24 | db = mongodb_client.get_db()
25 | model = db[PREFERENCE_MODEL_TABLE_NAME].find_one({'userId':user_id})
26 | if model is None:
27 | return []
28 |
29 | sorted_tuples = sorted(list(model['preference'].items()), key=operator.itemgetter(1), reverse=True)
30 | sorted_list = [x[0] for x in sorted_tuples]
31 | sorted_value_list = [x[1] for x in sorted_tuples]
32 |
33 | # If the first preference is same as the last one, the preference makes
34 | # no sense.
35 | if isclose(float(sorted_value_list[0]), float(sorted_value_list[-1])):
36 | return []
37 |
38 | return sorted_list
39 |
40 |
41 | # Threading HTTP Server
42 | RPC_SERVER = SimpleJSONRPCServer((SERVER_HOST, SERVER_PORT))
43 | RPC_SERVER.register_function(getPreferenceForUser, 'getPreferenceForUser')
44 |
45 | print("Starting HTTP server on %s:%d" % (SERVER_HOST, SERVER_PORT))
46 |
47 | RPC_SERVER.serve_forever()
--------------------------------------------------------------------------------
/news_pipeline/news_fetcher.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 |
4 | # from newspaper import Article
5 |
6 | # import common package in parent directory
7 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
8 | sys.path.append(os.path.join(os.path.dirname(__file__), 'scrapers'))
9 |
10 | import cnn_news_scraper
11 | from cloudAMQP_client import CloudAMQPClient
12 |
13 | DEDUPE_NEWS_TASK_QUEUE_URL = "amqp://hsebgbga:ODPWzuu-WcPTGQo8zGgRgZ16ZkoHwtSU@termite.rmq.cloudamqp.com/hsebgbga"
14 | DEDUPE_NEWS_TASK_QUEUE_NAME = "tmp"
15 | SCRAPE_NEWS_TASK_QUEUE_URL = "amqp://zzccaypk:iy5nHlQMyvqvt7e46xqHLZ8WeJrF_R-h@porpoise.rmq.cloudamqp.com/zzccaypk"
16 | SCRAPE_NEWS_TASK_QUEUE_NAME = "tmp1"
17 |
18 | SLEEP_TIME_IN_SECONDS = 5
19 |
20 | dedupe_news_queue_client = CloudAMQPClient(DEDUPE_NEWS_TASK_QUEUE_URL, DEDUPE_NEWS_TASK_QUEUE_NAME)
21 | scrape_news_queue_client = CloudAMQPClient(SCRAPE_NEWS_TASK_QUEUE_URL, SCRAPE_NEWS_TASK_QUEUE_NAME)
22 |
23 |
24 | def handle_message(msg):
25 | if msg is None or not isinstance(msg, dict):
26 | print('message is broken')
27 | return
28 |
29 | task = msg
30 | text = None
31 |
32 | if task['source'] == 'cnn':
33 | text = cnn_news_scraper.extractNews(task['url'])
34 | else:
35 | print task['source']
36 |
37 | task['text'] = text
38 |
39 | dedupe_news_queue_client.sendMessage(task)
40 |
41 | while True:
42 | if scrape_news_queue_client is not None:
43 | msg = scrape_news_queue_client.getMessage()
44 | if msg is not None:
45 | # Parse and process the task
46 | try:
47 | handle_message(msg)
48 | except Exception as e:
49 | print(e)
50 | pass
51 | scrape_news_queue_client.sleep(SLEEP_TIME_IN_SECONDS)
--------------------------------------------------------------------------------
/web_server/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
12 |
13 |
14 |
23 | tap news
24 |
25 |
26 |
29 |
30 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/news_pipeline/news_monitor.py:
--------------------------------------------------------------------------------
1 | import datetime
2 | import hashlib
3 | import redis
4 | import os
5 | import sys
6 |
7 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
8 |
9 | import news_api_client
10 | from cloudAMQP_client import CloudAMQPClient
11 |
12 | SLEEP_TIME_IN_SECONDS = 10
13 | NEWS_TIME_OUT_IN_SECONDS = 3600 * 24 * 3
14 |
15 | REDIS_HOST = 'localhost'
16 | REDIS_PORT = 6379
17 |
18 | SCRAPE_NEWS_TASK_QUEUE_URL = "amqp://zzccaypk:iy5nHlQMyvqvt7e46xqHLZ8WeJrF_R-h@porpoise.rmq.cloudamqp.com/zzccaypk"
19 | SCRAPE_NEWS_TASK_QUEUE_NAME = 'tmp1'#tap-news-scrape-news-task-queue'
20 |
21 | NEWS_SOURCES = [
22 | 'cnn'
23 | 'bbc-news',
24 | 'bbc-sport',
25 | 'bloomberg',
26 | 'cnn',
27 | 'entertainment-weekly',
28 | 'espn',
29 | 'ign',
30 | 'techcrunch',
31 | 'the-new-york-times',
32 | 'the-wall-street-journal',
33 | 'the-washington-post'
34 | ]
35 |
36 | redis_client = redis.StrictRedis(REDIS_HOST, REDIS_PORT)
37 | cloudAMQP_client = CloudAMQPClient(SCRAPE_NEWS_TASK_QUEUE_URL, SCRAPE_NEWS_TASK_QUEUE_NAME)
38 |
39 | while True:
40 | news_list = news_api_client.getNewsFromSource(NEWS_SOURCES)
41 |
42 | num_of_news_news = 0
43 |
44 | for news in news_list:
45 | news_digest = hashlib.md5(news['title'].encode('utf-8')).hexdigest()
46 |
47 | if redis_client.get(news_digest) is None:
48 | num_of_news_news = num_of_news_news + 1
49 | news['digest'] = news_digest
50 |
51 | if news['publishedAt'] is None:
52 | news['publishedAt'] = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
53 |
54 | redis_client.set(news_digest, "True")
55 | redis_client.expire(news_digest, NEWS_TIME_OUT_IN_SECONDS)
56 |
57 | cloudAMQP_client.sendMessage(news)
58 |
59 | print("Fetched %d news." % num_of_news_news)
60 |
61 | cloudAMQP_client.sleep(SLEEP_TIME_IN_SECONDS)
--------------------------------------------------------------------------------
/web_server/client/src/login/LoginForm.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Link } from 'react-router'
3 | import './LoginForm.css'
4 | import PropTypes from 'prop-types';
5 | const LoginForm = ({
6 | onSubmit,
7 | onChange,
8 | errors,
9 | user
10 | }) => (
11 |
39 | );
40 |
41 | LoginForm.propTypes = {
42 | onSubmit: PropTypes.func.isRequired,
43 | onChange: PropTypes.func.isRequired,
44 | errors: PropTypes.object.isRequired,
45 | user: PropTypes.object.isRequired
46 | };
47 |
48 | export default LoginForm;
--------------------------------------------------------------------------------
/web_server/server/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 |
7 | var app = require('../app');
8 | var debug = require('debug')('server:server');
9 | var http = require('http');
10 |
11 | /**
12 | * Get port from environment and store in Express.
13 | */
14 |
15 | var port = normalizePort(process.env.PORT || '3000');
16 | app.set('port', port);
17 |
18 | /**
19 | * Create HTTP server.
20 | */
21 |
22 | var server = http.createServer(app);
23 |
24 | /**
25 | * Listen on provided port, on all network interfaces.
26 | */
27 |
28 | server.listen(port);
29 | server.on('error', onError);
30 | server.on('listening', onListening);
31 |
32 | /**
33 | * Normalize a port into a number, string, or false.
34 | */
35 |
36 | function normalizePort(val) {
37 | var port = parseInt(val, 10);
38 |
39 | if (isNaN(port)) {
40 | // named pipe
41 | return val;
42 | }
43 |
44 | if (port >= 0) {
45 | // port number
46 | return port;
47 | }
48 |
49 | return false;
50 | }
51 |
52 | /**
53 | * Event listener for HTTP server "error" event.
54 | */
55 |
56 | function onError(error) {
57 | if (error.syscall !== 'listen') {
58 | throw error;
59 | }
60 |
61 | var bind = typeof port === 'string'
62 | ? 'Pipe ' + port
63 | : 'Port ' + port;
64 |
65 | // handle specific listen errors with friendly messages
66 | switch (error.code) {
67 | case 'EACCES':
68 | console.error(bind + ' requires elevated privileges');
69 | process.exit(1);
70 | break;
71 | case 'EADDRINUSE':
72 | console.error(bind + ' is already in use');
73 | process.exit(1);
74 | break;
75 | default:
76 | throw error;
77 | }
78 | }
79 |
80 | /**
81 | * Event listener for HTTP server "listening" event.
82 | */
83 |
84 | function onListening() {
85 | var addr = server.address();
86 | var bind = typeof addr === 'string'
87 | ? 'pipe ' + addr
88 | : 'port ' + addr.port;
89 | debug('Listening on ' + bind);
90 | }
91 |
--------------------------------------------------------------------------------
/web_server/client/src/NewsCard/NewsCard.js:
--------------------------------------------------------------------------------
1 | import './NewsCard.css';
2 | import React from 'react';
3 | import Auth from '../Auth/Auth';
4 |
5 | class NewsCard extends React.Component{
6 | redirectToUrl(url, event){
7 | event.preventDefault();
8 | this.sendClickLog();
9 | window.open(url, '_');
10 | }
11 | sendClickLog() {
12 | const url = 'http://' + window.location.hostname + ':3000' +
13 | '/news/userId/' + Auth.getEmail() + '/newsId/' + this.props.news.digest;
14 | const request = new Request(
15 | encodeURI(url),
16 | {
17 | method: 'POST',
18 | headers: { 'Authorization': 'bearer ' + Auth.getToken()},
19 | });
20 |
21 | fetch(request);
22 | }
23 | render() {
24 | return(
25 | this.redirectToUrl(this.props.news.url, event)}>
27 |
28 |
29 |

30 |
31 |
32 |
33 |
34 |
{this.props.news.title}
35 |
36 |
{this.props.news.description}
37 |
38 | {this.props.news.source != null &&
{this.props.news.source}
}
39 | {this.props.news.reason != null &&
{this.props.news.reason}
}
40 | {this.props.news.time != null &&
{this.props.news.time}
}
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | );
49 | }
50 | }
51 |
52 | export default NewsCard;
--------------------------------------------------------------------------------
/web_server/client/src/signup/SignUpForm.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router'
3 | import PropTypes from 'prop-types';
4 | import './SignUpForm.css';
5 | const SignUpForm = ({
6 | onSubmit,
7 | onChange,
8 | errors,
9 | user,
10 | }) => (
11 |
45 | );
46 |
47 | SignUpForm.propTypes = {
48 | onSubmit: PropTypes.func.isRequired,
49 | onChange: PropTypes.func.isRequired,
50 | errors: PropTypes.object.isRequired,
51 | user: PropTypes.object.isRequired
52 | };
53 |
54 | export default SignUpForm;
--------------------------------------------------------------------------------
/news_pipeline/news_deduper.py:
--------------------------------------------------------------------------------
1 | import datetime
2 | import os
3 | import sys
4 |
5 | from dateutil import parser
6 | from sklearn.feature_extraction.text import TfidfVectorizer
7 |
8 | # import common package in parent directory
9 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
10 |
11 | import mongodb_client
12 | from cloudAMQP_client import CloudAMQPClient
13 |
14 | DEDUPE_NEWS_TASK_QUEUE_URL = "amqp://hsebgbga:ODPWzuu-WcPTGQo8zGgRgZ16ZkoHwtSU@termite.rmq.cloudamqp.com/hsebgbga"
15 | DEDUPE_NEWS_TASK_QUEUE_NAME = "tmp"
16 |
17 | SLEEP_TIME_IN_SECONDS = 1
18 |
19 | NEWS_TABLE_NAME = "news-test"
20 |
21 | SAME_NEWS_SIMILARITY_THRESHOLD = 0.9
22 |
23 | cloudAMQP_client = CloudAMQPClient(DEDUPE_NEWS_TASK_QUEUE_URL, DEDUPE_NEWS_TASK_QUEUE_NAME)
24 |
25 | def handle_message(msg):
26 | if msg is None or not isinstance(msg, dict) :
27 | return
28 | task = msg
29 | text = task['text']
30 | if text is None:
31 | return
32 |
33 | # get all recent news based on publishedAt
34 | published_at = parser.parse(task['publishedAt'])
35 | published_at_day_begin = datetime.datetime(published_at.year, published_at.month, published_at.day, 0, 0, 0, 0)
36 | published_at_day_end = published_at_day_begin + datetime.timedelta(days=1)
37 |
38 | db = mongodb_client.get_db()
39 | same_day_news_list = list(db[NEWS_TABLE_NAME].find({'publishedAt': {'$gte': published_at_day_begin, '$lt': published_at_day_end}}))
40 |
41 | if same_day_news_list is not None and len(same_day_news_list) > 0:
42 | documents = [news['text'] for news in same_day_news_list]
43 | documents.insert(0, text)
44 |
45 | # Calculate similarity matrix
46 | tfidf = TfidfVectorizer().fit_transform(documents)
47 | pairwise_sim = tfidf * tfidf.T
48 |
49 | print(pairwise_sim)
50 |
51 | rows, _ = pairwise_sim.shape
52 |
53 | for row in range(1, rows):
54 | if pairwise_sim[row, 0] > SAME_NEWS_SIMILARITY_THRESHOLD:
55 | # Duplicated news. Ignore.
56 | print("Duplicated news. Ignore.")
57 | return
58 | task['publishedAt'] = parser.parse(task['publishedAt'])
59 |
60 | db[NEWS_TABLE_NAME].replace_one({'digest': task['digest']}, task, upsert=True)
61 |
62 | while True:
63 | if cloudAMQP_client is not None:
64 | msg = cloudAMQP_client.getMessage()
65 | if msg is not None:
66 | # Parse and process the task
67 | try:
68 | handle_message(msg)
69 | except Exception as e:
70 | print(e)
71 | pass
72 |
73 | cloudAMQP_client.sleep(SLEEP_TIME_IN_SECONDS)
--------------------------------------------------------------------------------
/web_server/client/src/NewsPanel/NewsPanel.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './NewsPanel.css';
3 | import NewsCard from '../NewsCard/NewsCard';
4 | import _ from 'lodash';
5 | import Auth from '../Auth/Auth';
6 | class NewsPanel extends React.Component{
7 | constructor(){
8 | super();
9 | //loadedAll: check if db has more news
10 | this.state = { news:null, pageNum: 1, loadedAll: false };
11 | }
12 | handleScroll() {
13 | const scrollY = window.scrollY
14 | || window.pageYOffset
15 | || document.documentElement.scrollYTop;
16 | if ((window.innerHeight + scrollY) >= (document.body.offsetHeight - 50)) {
17 | this.loadMoreNews();
18 | }
19 | }
20 |
21 | componentDidMount(){
22 | this.loadMoreNews();
23 | this.loadMoreNews = _.debounce(this.loadMoreNews, 1000);
24 | window.addEventListener('scroll', () => this.handleScroll());
25 | }
26 | loadMoreNews(){
27 | if(this.state.loadedAll == true)
28 | return;
29 | const news_url = 'http://' + window.location.hostname + ':3000' +
30 | '/news/userId/' + Auth.getEmail() + '/pageNum/' + this.state.pageNum;
31 | const request = new Request(
32 | news_url,
33 | {
34 | method:'GET',
35 | headers: {
36 | 'Authorization': 'bearer ' + Auth.getToken(),
37 | }
38 | });
39 | fetch(request)
40 | .then(res => res.json())
41 | .then(news => {
42 | if(!news || news.length == 0){
43 | this.setState({loadedAll:true});
44 | }
45 | this.setState({
46 | news: this.state.news ? this.state.news.concat(news) : news,
47 | pageNum: this.state.pageNum + 1
48 | });
49 | });
50 | }
51 | renderNews(){
52 | const news_list = this.state.news.map( news => {
53 | return (
54 |
55 |
56 |
57 | );
58 | });
59 | return (
60 |
63 | )
64 | }
65 | render(){
66 | if(this.state.news){
67 | return (
68 |
69 | {this.renderNews()}
70 |
71 | )
72 | } else {
73 | return (
74 | loading...
75 | )
76 | }
77 | }
78 | }
79 |
80 | export default NewsPanel;
--------------------------------------------------------------------------------
/web_server/client/src/signup/SignUpPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import PropTypes from 'prop-types';
3 | import SignUpForm from './SignUpForm';
4 |
5 | class SignUpPage extends React.Component {
6 | constructor(props, context) {
7 | super(props, context);
8 |
9 | this.state = {
10 | errors: {},
11 | user: {
12 | email: '',
13 | password: '',
14 | confirm_password: ''
15 | }
16 | };
17 | }
18 |
19 | processForm(event) {
20 | event.preventDefault();
21 |
22 | const email = this.state.user.email;
23 | const password = this.state.user.password;
24 | const confirm_password = this.state.user.confirm_password;
25 |
26 | console.log(password)
27 | if (password !== confirm_password) {
28 | return;
29 | }
30 |
31 | const url = 'http://' + window.location.hostname + ':3000' + '/auth/signup';
32 | const request = new Request(
33 | url,
34 | {method:'POST', headers: {
35 | 'Accept': 'application/json',
36 | 'Content-Type': 'application/json',
37 | },
38 | body: JSON.stringify({
39 | email: this.state.user.email,
40 | password: this.state.user.password
41 | })
42 | });
43 |
44 | fetch(request).then(response => {
45 | if (response.status === 200) {
46 | this.setState({
47 | errors: {}
48 | });
49 | // change the current URL to /login
50 | this.context.router.replace('/login');
51 | } else {
52 | response.json().then(json => {
53 | // console.log(json);
54 | const errors = json.errors ? json.errors : {};
55 | errors.summary = json.message;
56 | // console.log(this.state.errors);
57 | this.setState({errors});
58 | });
59 | }
60 | });
61 | }
62 |
63 | changeUser(event) {
64 | const field = event.target.name;
65 | const user = this.state.user;
66 | user[field] = event.target.value;
67 |
68 | this.setState({user});
69 |
70 | const errors = this.state.errors;
71 | if (this.state.user.password !== this.state.user.confirm_password) {
72 | errors.password = "Password and Confirm Password don't match.";
73 | } else {
74 | errors.password = '';
75 | }
76 | this.setState({errors});
77 | }
78 |
79 | render() {
80 | return (
81 | this.processForm(e)}
83 | onChange={(e) => this.changeUser(e)}
84 | errors={this.state.errors}
85 | user={this.state.user}
86 | />
87 | );
88 | }
89 | }
90 |
91 | SignUpPage.contextTypes = {
92 | router: PropTypes.object.isRequired
93 | };
94 |
95 | export default SignUpPage;
--------------------------------------------------------------------------------
/web_server/client/src/login/LoginPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import Auth from '../Auth/Auth';
3 | import LoginForm from './LoginForm';
4 | import PropTypes from 'prop-types';
5 | class LoginPage extends React.Component {
6 | constructor(props, context){
7 | super(props, context);
8 | this.state = {
9 | errors: {},
10 | user: {
11 | email: '',
12 | password: ''
13 | }
14 | };
15 | }
16 | processForm(event) {
17 | event.preventDefault();
18 | const email = this.state.user.email;
19 | const password = this.state.user.password;
20 | console.log(email,password);
21 |
22 | const url = 'http://' + window.location.hostname + ':3000' + '/auth/login';
23 | const request = new Request(
24 | url,
25 | {
26 | method: 'Post',
27 | headers: {
28 | 'Accept': 'application/json',
29 | 'Content-Type': 'application/json',
30 | },
31 | body: JSON.stringify({
32 | email: this.state.user.email,
33 | password: this.state.user.password
34 | })
35 | }
36 | );
37 |
38 | fetch(request).then(response => {
39 | if (response.status === 200) {
40 | this.setState({
41 | errors: {}
42 | });
43 |
44 | response.json().then(json => {
45 | // console.log(json);
46 | Auth.authenticateUser(json.token, email);
47 | this.context.router.replace('/');
48 | });
49 | } else {
50 | console.log('Login failed.');
51 | response.json().then(json => {
52 | const errors = json.errors? json.errors : {};
53 | errors.summmary = json.message;
54 | this.setState({errors});
55 | });
56 | }
57 | });
58 | }
59 |
60 | changeUser(event) {
61 | const field = event.target.name;
62 | const user = this.state.user;
63 | user[field] = event.target.value;
64 | this.setState({user});
65 | }
66 |
67 | render() {
68 | return (
69 | this.processForm(e)}
71 | onChange={(e) => this.changeUser(e)}
72 | errors={this.state.errors}
73 | user={this.state.user}
74 | />
75 | );
76 | }
77 | }
78 |
79 | LoginPage.contextTypes = {
80 | router: PropTypes.object.isRequired
81 | };
82 |
83 | export default LoginPage
--------------------------------------------------------------------------------
/backend_server/operations.py:
--------------------------------------------------------------------------------
1 | import json
2 | import os
3 | import sys
4 | import pickle # convert dictionary or json into string that redis can process
5 | from datetime import datetime
6 | from bson.json_util import dumps
7 | import redis
8 |
9 | # import common package in parent directory
10 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
11 | import mongodb_client # pylint: disable=import-error, wrong-import-position
12 | import news_recommendation_service_client
13 | from cloudAMQP_client import CloudAMQPClient # pylint: disable=import-error, wrong-import-position
14 |
15 | REDIS_HOST = "localhost"
16 | REDIS_PORT = 6379
17 |
18 | NEWS_TABLE_NAME = "news"
19 |
20 | NEWS_LIST_BATCH_SIZE = 10
21 | NEWS_LIMIT = 100
22 |
23 | USER_NEWS_TIME_OUT_IN_SECONDS = 60
24 | LOG_CLICKS_TASK_QUEUE_URL = 'amqp://inrzmluv:orVtIggEw3ANTJ8O90Fjhyyq0ZXUjRdz@termite.rmq.cloudamqp.com/inrzmluv'
25 | LOG_CLICKS_TASK_QUEUE_NAME = 'preference'
26 |
27 | redis_client = redis.StrictRedis(REDIS_HOST, REDIS_PORT, db=0)
28 | cloudAMQP_client = CloudAMQPClient(LOG_CLICKS_TASK_QUEUE_URL, LOG_CLICKS_TASK_QUEUE_NAME)
29 |
30 | def getOneNews():
31 | db = mongodb_client.get_db()
32 | news = db[NEWS_TABLE_NAME].find_one()
33 | return json.loads(dumps(news))
34 |
35 | def getNewsSummariesForUser(user_id, page_num):
36 | page_num = int(page_num)
37 | begin_index = (page_num - 1) * NEWS_LIST_BATCH_SIZE
38 | end_index = page_num * NEWS_LIST_BATCH_SIZE
39 |
40 | sliced_news = []
41 |
42 | if redis_client.get(user_id) is not None:
43 | total_news_digests = pickle.loads(redis_client.get(user_id))
44 |
45 | # If begin_index is out of range, this will return empty list;
46 | # If end_index is out of range (begin_index is within the range), this
47 | # will return all remaining news ids.
48 | sliced_news_digests = total_news_digests[begin_index:end_index]
49 | db = mongodb_client.get_db()
50 | sliced_news = list(db[NEWS_TABLE_NAME].find({'digest':{'$in':sliced_news_digests}}))
51 | else:
52 | db = mongodb_client.get_db()
53 | total_news = list(db[NEWS_TABLE_NAME].find().sort([('publishedAt', -1)]).limit(NEWS_LIMIT))
54 | total_news_digests = [x['digest'] for x in total_news]
55 |
56 | redis_client.set(user_id, pickle.dumps(total_news_digests))
57 | redis_client.expire(user_id, USER_NEWS_TIME_OUT_IN_SECONDS)
58 |
59 | sliced_news = total_news[begin_index: end_index]
60 |
61 | # Get preference for the user
62 | preference = news_recommendation_service_client.getPreferenceForUser(user_id)
63 | topPreference = None
64 |
65 | if preference is not None and len(preference) > 0:
66 | topPreference = preference[0]
67 |
68 | for news in sliced_news:
69 | # Remove text field to save bandwidth.
70 | del news['text']
71 | if news['class'] == topPreference:
72 | news['reason'] = 'Recommend'
73 | if news['publishedAt'].date() == datetime.today().date():
74 | news['time'] = 'today'
75 | return json.loads(dumps(sliced_news))
76 |
77 | def logNewsClickForUser(user_id, news_id):
78 | # Send log task to machine learning service for prediction
79 | message = {'userId': user_id, 'newsId': news_id, 'timestamp': str(datetime.utcnow())}
80 | cloudAMQP_client.sendMessage(message)
--------------------------------------------------------------------------------
/news_recommendation_service/click_log_processor.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | '''
3 | Time decay model:
4 | If selected:
5 | p = (1-α)p + α
6 | If not:
7 | p = (1-α)p
8 | Where p is the selection probability, and α is the degree of weight decrease.
9 | The result of this is that the nth most recent selection will have a weight of
10 | (1-α)^n. Using a coefficient value of 0.05 as an example, the 10th most recent
11 | selection would only have half the weight of the most recent. Increasing epsilon
12 | would bias towards more recent results more.
13 | '''
14 |
15 | import news_classes
16 | import os
17 | import sys
18 |
19 | # import common package in parent directory
20 | sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
21 |
22 | import mongodb_client
23 | from cloudAMQP_client import CloudAMQPClient
24 |
25 | # Don't modify this value unless you know what you are doing.
26 | NUM_OF_CLASSES = len(news_classes.classes)
27 | INITIAL_P = 1.0 / NUM_OF_CLASSES
28 | ALPHA = 0.1
29 |
30 | SLEEP_TIME_IN_SECONDS = 1
31 |
32 | LOG_CLICKS_TASK_QUEUE_URL = 'amqp://inrzmluv:orVtIggEw3ANTJ8O90Fjhyyq0ZXUjRdz@termite.rmq.cloudamqp.com/inrzmluv'
33 | LOG_CLICKS_TASK_QUEUE_NAME = 'preference'
34 |
35 | PREFERENCE_MODEL_TABLE_NAME = "user_preference_model"
36 | NEWS_TABLE_NAME = "news"
37 |
38 | cloudAMQP_client = CloudAMQPClient(LOG_CLICKS_TASK_QUEUE_URL, LOG_CLICKS_TASK_QUEUE_NAME)
39 |
40 | def handle_message(msg):
41 | if msg is None or not isinstance(msg, dict) :
42 | return
43 |
44 | if ('userId' not in msg
45 | or 'newsId' not in msg
46 | or 'timestamp' not in msg):
47 | return
48 |
49 | userId = msg['userId']
50 | newsId = msg['newsId']
51 |
52 | # Update user's preference
53 | db = mongodb_client.get_db()
54 | model = db[PREFERENCE_MODEL_TABLE_NAME].find_one({'userId': userId})
55 |
56 | # If model not exists, create a new one
57 | if model is None:
58 | # print('Creating preference model for new user: %s' % userId)
59 | new_model = {'userId' : userId}
60 | preference = {}
61 | for i in news_classes.classes:
62 | preference[i] = float(INITIAL_P)
63 | new_model['preference'] = preference
64 | model = new_model
65 |
66 | # print('Updating preference model for new user: %s' % userId)
67 |
68 | # Update model using time decaying method
69 | news = db[NEWS_TABLE_NAME].find_one({'digest': newsId})
70 | if (news is None
71 | or 'class' not in news
72 | or news['class'] not in news_classes.classes):
73 | # print('Skipping processing...')
74 | return
75 |
76 | click_class = news['class']
77 |
78 | # Update the clicked one.
79 | old_p = model['preference'][click_class]
80 | model['preference'][click_class] = float((1 - ALPHA) * old_p + ALPHA)
81 |
82 | # Update not clicked classes.
83 | for i, prob in model['preference'].items():
84 | if not i == click_class:
85 | model['preference'][i] = float((1 - ALPHA) * model['preference'][i])
86 |
87 | # print(model)
88 | db[PREFERENCE_MODEL_TABLE_NAME].replace_one({'userId': userId}, model, upsert=True)
89 |
90 | def run():
91 | while True:
92 | if cloudAMQP_client is not None:
93 | msg = cloudAMQP_client.getMessage()
94 | if msg is not None:
95 | # Parse and process the task
96 | try:
97 | handle_message(msg)
98 | except Exception as e:
99 | print(e)
100 | pass
101 | # Remove this if this becomes a bottleneck.
102 | cloudAMQP_client.sleep(SLEEP_TIME_IN_SECONDS)
103 |
104 | if __name__ == "__main__":
105 | run()
--------------------------------------------------------------------------------
/web_server/server/routes/auth.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const passport = require('passport');
3 | const router = express.Router();
4 | const validator = require('validator');
5 |
6 | router.post('/signup', (req, res, next) => {
7 | const validationResult = validateSignupForm(req.body);
8 | if (!validationResult.success) {
9 | console.log('validationResult failed');
10 | return res.status(400).json({
11 | success: false,
12 | message: validationResult.message,
13 | errors: validationResult.errors
14 | });
15 | }
16 |
17 | return passport.authenticate('local-signup', (err) => {
18 | if (err) {
19 | console.log(err);
20 | if (err.name === 'MongoError' && err.code === 11000) {
21 | // the 11000 Mongo code is for a duplication email error
22 | // the 409 HTTP status code is for conflict error
23 | return res.status(409).json({
24 | success: false,
25 | message: 'Check the form for errors.',
26 | errors: {
27 | email: 'This email is already taken.'
28 | }
29 | });
30 | }
31 |
32 | return res.status(400).json({
33 | success: false,
34 | message: 'Could not process the form.'
35 | });
36 | }
37 |
38 | return res.status(200).json({
39 | success: true,
40 | message: 'You have successfully signed up! Now you should be able to log in.'
41 | });
42 | })(req, res, next);
43 | });
44 |
45 | router.post('/login', (req, res, next) => {
46 | const validationResult = validateLoginForm(req.body);
47 | if (!validationResult.success) {
48 | return res.status(400).json({
49 | success: false,
50 | message: validationResult.message,
51 | errors: validationResult.errors
52 | });
53 | }
54 |
55 | return passport.authenticate('local-login', (err, token, userData) => {
56 | if (err) {
57 | if (err.name === 'IncorrectCredentialsError') {
58 | return res.status(400).json({
59 | success: false,
60 | message: err.message
61 | });
62 | }
63 |
64 | return res.status(400).json({
65 | success: false,
66 | message: 'Could not process the form: ' + err.message
67 | });
68 | }
69 |
70 | return res.json({
71 | success: true,
72 | message: 'You have successfully logged in!',
73 | token,
74 | user: userData
75 | });
76 | })(req, res, next);
77 | });
78 |
79 | function validateSignupForm(payload) {
80 | console.log(payload);
81 | const errors = {};
82 | let isFormValid = true;
83 | let message = '';
84 |
85 | if (!payload || typeof payload.email !== 'string' || !validator.isEmail(payload.email)) {
86 | isFormValid = false;
87 | errors.email = 'Please provide a correct email address.';
88 | }
89 |
90 | if (!payload || typeof payload.password !== 'string' || payload.password.length < 8) {
91 | isFormValid = false;
92 | errors.password = 'Password must have at least 8 characters.';
93 | }
94 |
95 | if (!isFormValid) {
96 | message = 'Check the form for errors.';
97 | }
98 |
99 | return {
100 | success: isFormValid,
101 | message,
102 | errors
103 | };
104 | }
105 |
106 | function validateLoginForm(payload) {
107 | console.log(payload);
108 | const errors = {};
109 | let isFormValid = true;
110 | let message = '';
111 |
112 | if (!payload || typeof payload.email !== 'string' || payload.email.trim().length === 0) {
113 | isFormValid = false;
114 | errors.email = 'Please provide your email address.';
115 | }
116 |
117 | if (!payload || typeof payload.password !== 'string' || payload.password.trim().length === 0) {
118 | isFormValid = false;
119 | errors.password = 'Please provide your password.';
120 | }
121 |
122 | if (!isFormValid) {
123 | message = 'Check the form for errors.';
124 | }
125 |
126 | return {
127 | success: isFormValid,
128 | message,
129 | errors
130 | };
131 | }
132 |
133 | module.exports = router;
--------------------------------------------------------------------------------
/news_pipeline/tf_idf_deduper_test_2.py:
--------------------------------------------------------------------------------
1 | # .*.coiding: utf-8 .*.
2 | from sklearn.feature_extraction.text import TfidfVectorizer
3 |
4 | news1 = """
5 | (CNN)President Donald Trump on Saturday again attacked a federal judge whose decision he disliked, blasting Judge James Robart, a George W. Bush appointee who temporarily stopped his controversial travel ban Friday night.
6 | Trump's increasingly heated responses quickly drew objections from Democrats, who said he was improperly attacking an independent judiciary. By Saturday afternoon, Trump had stepped up his criticism: "Because the ban was lifted by a judge, many very bad and dangerous people may be pouring into our country. A terrible decision."
7 | Shortly after 8 a.m. ET, the President tweeted, "The opinion of this so-called judge, which essentially takes law-enforcement away from our country, is ridiculous and will be overturned."
8 | The opinion of this so-called judge, which essentially takes law-enforcement away from our country, is ridiculous and will be overturned!
9 | Donald J. Trump (@realDonaldTrump) February 4, 2017
10 | That tweet was one of several Trump issued Saturday morning in which he defended his executive order on immigration, which bars citizens of seven Muslim-majority countries from entering the US for 90 days, all refugees for 120 days and indefinitely halts refugees from Syria.
11 | RELATED: James Robart: 5 things to know about judge who blocked travel ban
12 | "When a country is no longer able to say who can, and who cannot , come in & out, especially for reasons of safety &.security - big trouble," Trump next tweeted.
13 | When a country is no longer able to say who can, and who cannot , come in & out, especially for reasons of safety &.security - big trouble!
14 | Donald J. Trump (@realDonaldTrump) February 4, 2017
15 | "Interesting that certain Middle-Eastern countries agree with the ban. They know if certain people are allowed in it's death & destruction," he added, though he didn't name any countries.
16 | Interesting that certain Middle-Eastern countries agree with the ban. They know if certain people are allowed in it's death & destruction!
17 | Donald J. Trump (@realDonaldTrump) February 4, 2017
18 | Saturday afternoon, Trump resumed his criticism, tweeting: "What is our country coming to when a judge can halt a Homeland Security travel ban and anyone, even with bad intentions, can come into U.S.?"
19 | What is our country coming to when a judge can halt a Homeland Security travel ban and anyone, even with bad intentions, can come into U.S.?
20 | Donald J. Trump (@realDonaldTrump) February 4, 2017
21 | He followed up with, "Because the ban was lifted by a judge, many very bad and dangerous people may be pouring into our country. A terrible decision."
22 | Because the ban was lifted by a judge, many very bad and dangerous people may be pouring into our country. A terrible decision
23 | Donald J. Trump (@realDonaldTrump) February 4, 2017
24 | And he was still tweeting about it early Saturday evening: "Why aren't the lawyers looking at and using the Federal Court decision in Boston, which is at conflict with ridiculous lift ban decision?"
25 | Why aren't the lawyers looking at and using the Federal Court decision in Boston, which is at conflict with ridiculous lift ban decision?
26 | Donald J. Trump (@realDonaldTrump) February 4, 2017
27 | Trump was referring to a decision by a federal judge in Boston earlier Friday, a more limited ruling that declined to renew a temporary restraining order in Massachusetts. It would have prohibited the detention or removal of foreign travelers legally authorized to come to the Boston area, and the decision represented the Trump administration's first court victory regarding the order.
28 | Unusual criticism
29 | It is highly unusual for a President to publicly criticize a federal judge, but during the campaign, Trump memorably railed against Judge Gonzalo Curiel, who was overseeing a lawsuit against Trump University. Trump said Curiel, who was born in Indiana, was unable to fairly preside over the lawsuit because of his "Mexican heritage." Trump had introduced plans to build a wall along the Mexican border and take a hard stance on immigration.
30 | Vice President Mike Pence later defended Trump in an interview with ABC News' George Stephanopoulos.
31 | "Is it right for the President to say 'so-called' judge'? Doesn't that undermine the separation of powers in the Constitution?" Stephanopoulos asked Pence on "This Week" in a clip released Saturday afternoon.
32 | "I don't think it does," Pence replied. "I think the American people are very accustomed to this president speaking his mind and speaking very straight with them."
33 | ABC Breaking News | Latest News Videos
34 | But Democrats pounced on Trump's criticism of Robart, with Democratic senators flatly saying the President's comments will factor into the confirmation hearings for Supreme Court nominee Neil Gorsuch.
35 | "Attack on federal judge from POTUS is beneath the dignity of that office. That attitude can lead America to calamity," Washington Gov. Jay Inslee tweeted Saturday.
36 | Attack on federal judge from POTUS is beneath the dignity of that office. That attitude can lead America to calamity.
37 | Governor Jay Inslee (@GovInslee) February 4, 2017
38 | "The President's attack on Judge James Robart, a Bush appointee who passed with 99 votes, shows a disdain for an independent judiciary that doesn't always bend to his wishes and a continued lack of respect for the Constitution, making it more important that the Supreme Court serve as an independent check on the administration," Senate Minority Leader Chuck Schumer said in a statement.
39 | "With each action testing the Constitution, and each personal attack on a judge, President Trump raises the bar even higher for Judge Gorsuch's nomination to serve on the Supreme Court. His ability to be an independent check will be front and center throughout the confirmation process."
40 | Vermont. Sen. Patrick Leahy, the ranking member of the Judiciary Committee, said Trump's "hostility toward the rule of law is not just embarrassing, it is dangerous."
41 | "We need a nominee for the Supreme Court willing to demonstrate he or she will not cower to an overreaching executive. This makes it even more important that Judge Gorsuch, and every other judge this president may nominate, demonstrates the ability to be an independent check and balance on an administration that shamefully and harmfully seems to reject the very concept."
42 | Robart's order on Friday was a significant setback to Trump's ban and set up the nation for a second straight weekend of confusion about the policy's legality.
43 | The White House said Friday the Department of Justice will challenge the decision. In a statement, White House press secretary Sean Spicer initially called Robart's order "outrageous" before quickly issuing another statement that dropped that word.
44 | Robart has presided in the US District Court for the Western District of Washington state since 2004. He assumed senior status in 2016.
45 | """
46 | news2 = """
47 | President Donald Trump on Saturday again attacked a federal judge whose decision he disliked, criticizing Judge James Robart, a George W. Bush appointee who temporarily stopped his controversial travel ban Friday night.
48 | President Trump’s attacks quickly drew objections from Democrats, who said he was attacking an independent judiciary. And by Saturday afternoon, President Trump was openly accusing Robart of potentially allowing “many very bad and dangerous people” to flow into the US and warning of dire consequences if the executive order is not enforced.
49 | He also said, “What is our country coming to when a judge can halt a Homeland Security ban and anyone, even with bad intentions, can come into the U.S.?”
50 | What is our country coming to when a judge can halt a Homeland Security travel ban and anyone, even with bad intentions, can come into U.S.?
51 | Donald J. Trump (@realDonaldTrump) February 4, 2017
52 | Shortly after 8 a.m. ET, the President tweeted, “The opinion of this so-called judge, which essentially takes law-enforcement away from our country, is ridiculous and will be overturned.”
53 | The opinion of this so-called judge, which essentially takes law-enforcement away from our country, is ridiculous and will be overturned!
54 | Donald J. Trump (@realDonaldTrump) February 4, 2017
55 | The tweet was one of several President Trump issued Saturday morning in which he defended his executive order on immigration, which bars citizens of seven Muslim-majority countries from entering the US for 90 days, all refugees for 120 days and indefinitely halts refugees from Syria.
56 | “When a country is no longer able to say who can, and who cannot , come in & out, especially for reasons of safety &.security – big trouble,” President Trump next tweeted.
57 | When a country is no longer able to say who can, and who cannot , come in & out, especially for reasons of safety &.security – big trouble!
58 | Donald J. Trump (@realDonaldTrump) February 4, 2017
59 | “Interesting that certain Middle-Eastern countries agree with the ban. They know if certain people are allowed in it’s death & destruction,” he added, though he didn’t name any countries.
60 | Interesting that certain Middle-Eastern countries agree with the ban. They know if certain people are allowed in it's death & destruction!
61 | Donald J. Trump (@realDonaldTrump) February 4, 2017
62 | Saturday afternoon, President Trump resumed his criticism, tweeting: “What is our country coming to when a judge can halt a Homeland Security travel ban and anyone, even with bad intentions, can come into U.S.?”
63 | He followed up with, “Because the ban was lifted by a judge, many very bad and dangerous people may be pouring into our country. A terrible decision.”
64 | Because the ban was lifted by a judge, many very bad and dangerous people may be pouring into our country. A terrible decision
65 | Donald J. Trump (@realDonaldTrump) February 4, 2017
66 | It is highly unusual for a President to publicly criticize a federal judge, but during the campaign, President Trump memorably railed against Judge Gonzalo Curiel, who was overseeing a lawsuit against Trump University. President Trump said Curiel, who was born in Indiana, was unable to fairly preside over the lawsuit because of his “Mexican heritage.” President Trump had introduced plans to build a wall along the Mexican border and take a hard stance on immigration.
67 | Democrats pounced on President Trump’s criticism of Robart, with Democratic senators flatly saying the President’s comments will factor into the confirmation hearings for Supreme Court nominee Neil Gorsuch.
68 | “Attack on federal judge from POTUS is beneath the dignity of that office. That attitude can lead America to calamity,” Washington Gov. Jay Inslee tweeted Saturday.
69 | Attack on federal judge from POTUS is beneath the dignity of that office. That attitude can lead America to calamity.
70 | Governor Jay Inslee (@GovInslee) February 4, 2017
71 | “The President’s attack on Judge James Robart, a Bush appointee who passed with 99 votes, shows a disdain for an independent judiciary that doesn’t always bend to his wishes and a continued lack of respect for the Constitution, making it more important that the Supreme Court serve as an independent check on the administration,” Senate Minority Leader Chuck Schumer said in a statement.
72 | “With each action testing the Constitution, and each personal attack on a judge, President Trump raises the bar even higher for Judge Gorsuch’s nomination to serve on the Supreme Court. His ability to be an independent check will be front and center throughout the confirmation process.”
73 | Vermont. Sen. Patrick Leahy, the ranking member of the Judiciary Committee, said President Trump’s “hostility toward the rule of law is not just embarrassing, it is dangerous.”
74 | “We need a nominee for the Supreme Court willing to demonstrate he or she will not cower to an overreaching executive. This makes it even more important that Judge Gorsuch, and every other judge this president may nominate, demonstrates the ability to be an independent check and balance on an administration that shamefully and harmfully seems to reject the very concept.”
75 | Robart’s order on Friday was a significant setback to President Trump’s ban and set up the nation for a second straight weekend of confusion about the policy’s legality.
76 | The White House said Friday the Department of Justice will challenge the decision. In a statement, White House press secretary Sean Spicer initially called Robart’s order “outrageous” before quickly issuing another statement that dropped that word.
77 | Robart has presided in the US District Court for the Western District of Washington state since 2004. He assumed senior status in 2016.
78 | """
79 |
80 | documents = [news1, news2]
81 |
82 | tfidf = TfidfVectorizer().fit_transform(documents)
83 | pairwise_sim = tfidf * tfidf.T
84 |
85 | print(pairwise_sim.A)
--------------------------------------------------------------------------------
/news_pipeline/scrapers/user_agents.txt:
--------------------------------------------------------------------------------
1 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
2 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"
3 | "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)"
4 | "Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)"
5 | "Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)"
6 | "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))"
7 | "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)"
8 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)"
9 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)"
10 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7"
11 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)"
12 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"
13 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"
14 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)"
15 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0"
16 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57)"
17 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205"
18 | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)"
19 | "Mozilla/5.0 ( ; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
20 | "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 5.1; Trident/5.0)"
21 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 7.1; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C)"
22 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTB5.5)"
23 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
24 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C)"
25 | "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; FDM; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E; Tablet PC 2.0)"
26 | "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)"
27 | "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)"
28 | "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)"
29 | "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
30 | "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30)"
31 | "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS)"
32 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)"
33 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)"
34 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8"
35 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)"
36 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8)"
37 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)"
38 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)"
39 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; msn OptimizedIE8;ZHCN)"
40 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; InfoPath.3; .NET4.0C; .NET4.0E) chromeframe/8.0.552.224"
41 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3)"
42 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; .NET4.0C; .NET4.0E; Zune 4.7)"
43 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8)"
44 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; Zune 4.0)"
45 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MS-RTC LM 8; Zune 4.7)"
46 | "Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre"
47 | "Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20100101 Firefox/4.2a1pre"
48 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre"
49 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110323 Firefox/4.2a1pre"
50 | "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre"
51 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b9pre) Gecko/20101228 Firefox/4.0b9pre"
52 | "Mozilla/5.0 (Windows NT 5.1; rv:2.0b9pre) Gecko/20110105 Firefox/4.0b9pre"
53 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre"
54 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101213 Firefox/4.0b8pre"
55 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101128 Firefox/4.0b8pre"
56 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre"
57 | "Mozilla/5.0 (Windows NT 5.1; rv:2.0b8pre) Gecko/20101127 Firefox/4.0b8pre"
58 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8"
59 | "Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre"
60 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20101111 Firefox/4.0b7"
61 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20100101 Firefox/4.0b7"
62 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre"
63 | "Mozilla/5.0 (Windows NT 6.1; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre Firefox/4.0b6pre"
64 | "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b4) Gecko/20100818 Firefox/4.0b4"
65 | "Mozilla/5.0 (X11; Linux i686; rv:2.0b3pre) Gecko/20100731 Firefox/4.0b3pre"
66 | "Mozilla/5.0 (Windows NT 5.2; rv:2.0b13pre) Gecko/20110304 Firefox/4.0b13pre"
67 | "Mozilla/5.0 (Windows NT 5.1; rv:2.0b13pre) Gecko/20110223 Firefox/4.0b13pre"
68 | "Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20110204 Firefox/4.0b12pre"
69 | "Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20100101 Firefox/4.0b12pre"
70 | "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre"
71 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110131 Firefox/4.0b11pre"
72 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110129 Firefox/4.0b11pre"
73 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre"
74 | "Mozilla/5.0 (Windows NT 6.1; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre"
75 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre"
76 | "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b10pre) Gecko/20110118 Firefox/4.0b10pre"
77 | "Mozilla/5.0 (Windows NT 6.1; rv:2.0b10pre) Gecko/20110113 Firefox/4.0b10pre"
78 | "Mozilla/5.0 (X11; Linux i686; rv:2.0b10) Gecko/20100101 Firefox/4.0b10"
79 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:2.0b10) Gecko/20110126 Firefox/4.0b10"
80 | "Mozilla/5.0 (Windows NT 6.1; rv:2.0b10) Gecko/20110126 Firefox/4.0b10"
81 | "Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:2.0) Gecko/20110307 Firefox/4.0"
82 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:2.0) Gecko/20110404 Fedora/16-dev Firefox/4.0"
83 | "Mozilla/5.0 (X11; Arch Linux i686; rv:2.0) Gecko/20110321 Firefox/4.0"
84 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
85 | "Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20110319 Firefox/4.0"
86 | "Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0"
87 | "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8"
88 | "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8"
89 | "Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8"
90 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8"
91 | "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.3a5pre) Gecko/20100526 Firefox/3.7a5pre"
92 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5"
93 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5"
94 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5"
95 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20091218 Firefox 3.6b5"
96 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 (.NET CLR 3.5.30729)"
97 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4"
98 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b1) Gecko/20091014 Firefox/3.6b1 GTB5"
99 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090428 Firefox/3.6a1pre"
100 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090405 Firefox/3.6a1pre"
101 | "Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.2a1pre) Gecko/20090405 Ubuntu/9.04 (jaunty) Firefox/3.6a1pre"
102 | "Mozilla/5.0 (Windows; Windows NT 5.1; es-ES; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre"
103 | "Mozilla/5.0 (Windows; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre"
104 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre (.NET CLR 3.5.30729)"
105 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9"
106 | "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.2.9) Gecko/20100913 Firefox/3.6.9"
107 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 ( .NET CLR 3.5.30729; .NET CLR 4.0.20506)"
108 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9"
109 | "Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.2.8) Gecko/20101230 Firefox/3.6.8"
110 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100804 Gentoo Firefox/3.6.8"
111 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100723 SUSE/3.6.8-0.1.1 Firefox/3.6.8"
112 | "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100722 Ubuntu/10.04 (lucid) Firefox/3.6.8"
113 | "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8"
114 | "Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8"
115 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100727 Firefox/3.6.8"
116 | "Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.2.8) Gecko/20100725 Gentoo Firefox/3.6.8"
117 | "Mozilla/5.0 (X11; U; FreeBSD i386; de-CH; rv:1.9.2.8) Gecko/20100729 Firefox/3.6.8"
118 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
119 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1"
120 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.8) Gecko/20100722 AskTbADAP/3.9.1.14019 Firefox/3.6.8"
121 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
122 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 GTB7.1"
123 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0C)"
124 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8"
125 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20121221 Firefox/3.6.8"
126 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-TW; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
127 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"
128 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E"
129 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100809 Fedora/3.6.7-1.fc14 Firefox/3.6.7"
130 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100723 Fedora/3.6.7-1.fc13 Firefox/3.6.7"
131 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.7) Gecko/20100726 CentOS/3.6-3.el5.centos Firefox/3.6.7"
132 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 GTB7.1"
133 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.7 (.NET CLR 3.5.30729)"
134 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 (.NET CLR 3.5.30729)"
135 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1"
136 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.0"
137 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 (.NET CLR 3.5.30729)"
138 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6"
139 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-PT; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6"
140 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729)"
141 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)"
142 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 GTB7.1"
143 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6"
144 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729; .NET4.0E)"
145 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.4) Gecko/20100614 Ubuntu/10.04 (lucid) Firefox/3.6.4"
146 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.4) Gecko/20100625 Gentoo Firefox/3.6.4"
147 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 ( .NET CLR 3.5.30729)"
148 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4"
149 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.1"
150 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729)"
151 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4"
152 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 ( .NET CLR 3.5.30729)"
153 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729)"
154 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 (.NET CLR 3.5.30729)"
155 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4"
156 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729)"
157 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729)"
158 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4"
159 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.0 ( .NET CLR 3.5.30729)"
160 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729)"
161 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100503 Firefox/3.6.4 ( .NET CLR 3.5.30729)"
162 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729)"
163 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4"
164 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4"
165 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3pre) Gecko/20100405 Firefox/3.6.3plugin1 ( .NET CLR 3.5.30729)"
166 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.3) Gecko/20100403 Fedora/3.6.3-4.fc13 Firefox/3.6.3"
167 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3"
168 | "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.3) Gecko/20100401 SUSE/3.6.3-1.1 Firefox/3.6.3"
169 | "Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3"
170 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100404 Ubuntu/10.04 (lucid) Firefox/3.6.3"
171 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1"
172 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.3"
173 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3"
174 | "Mozilla/5.0 (X11; U; Linux AMD64; en-US; rv:1.9.2.3) Gecko/20100403 Ubuntu/10.10 (maverick) Firefox/3.6.3"
175 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
176 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
177 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
178 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
179 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1"
180 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1"
181 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0 ( .NET CLR 3.5.30729)"
182 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
183 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
184 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)"
185 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ca; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)"
186 | "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"
187 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB7.0"
188 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 AskTbSPC2/3.9.1.14019 Firefox/3.6.2"
189 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
190 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.5.30729)"
191 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB6 (.NET CLR 3.5.30729)"
192 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.0.04506.648)"
193 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.0.04506.30)"
194 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.7; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"
195 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10pre) Gecko/20100902 Ubuntu/9.10 (karmic) Firefox/3.6.1pre"
196 | "Mozilla/5.0 (X11; U; Linux x86_64; ja-JP; rv:1.9.2.16) Gecko/20110323 Ubuntu/10.10 (maverick) Firefox/3.6.16"
197 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16) Gecko/20110323 Ubuntu/9.10 (karmic) Firefox/3.6.16 FirePHP/0.5"
198 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"
199 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"
200 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16"
201 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729; .NET4.0E)"
202 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729)"
203 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.1.13) Gecko/20100914 Firefox/3.6.16"
204 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.16) Gecko/20110319 AskTbUTR/3.11.3.15590 Firefox/3.6.16"
205 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16pre) Gecko/20110304 Ubuntu/10.10 (maverick) Firefox/3.6.15pre"
206 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15 FirePHP/0.5"
207 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.15) Gecko/20110330 CentOS/3.6-1.el5.centos Firefox/3.6.15"
208 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"
209 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0C) FirePHP/0.5"
210 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.15) Gecko/20110303 AskTbBT4/3.11.3.15590 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0C)"
211 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 (.NET CLR 3.5.30729)"
212 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14pre) Gecko/20110105 Firefox/3.6.14pre"
213 | "Mozilla/5.0 (X11; U; Linux armv7l; en-US; rv:1.9.2.14) Gecko/20110224 Firefox/3.6.14 MB860/Version.0.43.3.MB860.AmericaMovil.en.MX"
214 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14"
215 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-AU; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14"
216 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 GTB7.1 ( .NET CLR 3.5.30729)"
217 | "Mozilla/5.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Firefox/3.6.13"
218 | "Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13"
219 | "Mozilla/5.0 (X11; U; Linux x86_64; nb-NO; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13"
220 | "Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 (.NET CLR 3.5.30729)"
221 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13"
222 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
223 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101223 Gentoo Firefox/3.6.13"
224 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101219 Gentoo Firefox/3.6.13"
225 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-3.el4 Firefox/3.6.13"
226 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Firefox/3.6.13"
227 | "Mozilla/5.0 (X11; U; Linux x86_64; en-NZ; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13"
228 | "Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13"
229 | "Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-2.el5 Firefox/3.6.13"
230 | "Mozilla/5.0 (X11; U; Linux x86_64; da-DK; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13"
231 | "Mozilla/5.0 (X11; U; Linux MIPS32 1074Kf CPS QuadCore; en-US; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13"
232 | "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13"
233 | "Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.13) Gecko/20101209 Fedora/3.6.13-1.fc13 Firefox/3.6.13"
234 | "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13"
235 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101209 CentOS/3.6-2.el5.centos Firefox/3.6.13"
236 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13"
237 | "Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.9.2.12) Gecko/20101030 Firefox/3.6.12"
238 | "Mozilla/5.0 (X11; U; Linux x86_64; es-MX; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12"
239 | "Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12"
240 | "Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101026 SUSE/3.6.12-0.7.1 Firefox/3.6.12"
241 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Gentoo Firefox/3.6.12"
242 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Firefox/3.6.12"
243 | "Mozilla/5.0 (X11; U; Linux ppc; fr; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12"
244 | "Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12"
245 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 GTB7.1"
246 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12"
247 | "Mozilla/5.0 (X11; FreeBSD x86_64; rv:2.0) Gecko/20100101 Firefox/3.6.12"
248 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)"
249 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"
250 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET CLR 3.5.21022)"
251 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB5"
252 | "Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.11) Gecko/20101028 CentOS/3.6-2.el5.centos Firefox/3.6.11"
253 | "Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2.3pre) Gecko/20100723 Firefox/3.6.11"
254 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11"
255 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 ( .NET CLR 3.5.30729)"
256 | "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
257 | "Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
258 | "Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
259 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1"
260 | "Mozilla/5.0 (X11; U; Linux x86_64; el-GR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
261 | "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1"
262 | "Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10"
263 | "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10"
264 | "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
265 | "Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
266 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.04 (jaunty) Firefox/3.6.10"
267 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.11) Gecko/20101013 Ubuntu/10.10 (maverick) Firefox/3.6.10"
268 | "Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
269 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
270 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.10 (karmic) Firefox/3.6.10"
271 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10"
272 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100914 SUSE/3.6.10-0.3.1 Firefox/3.6.10"
273 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ro; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
274 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 ( .NET CLR 3.5.30729)"
275 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729)"
276 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1"
277 | "Mozilla/5.0(Windows; U; Windows NT 7.0; rv:1.9.2) Gecko/20100101 Firefox/3.6"
278 | "Mozilla/5.0(Windows; U; Windows NT 5.2; rv:1.9.2) Gecko/20100101 Firefox/3.6"
279 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100222 Ubuntu/10.04 (lucid) Firefox/3.6"
280 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100130 Gentoo Firefox/3.6"
281 | "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/3.6"
282 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100312 Ubuntu/9.04 (jaunty) Firefox/3.6"
283 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100128 Gentoo Firefox/3.6"
284 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Ubuntu/10.04 (lucid) Firefox/3.6"
285 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 FirePHP/0.4"
286 | "Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6"
287 | "Mozilla/5.0 (X11; FreeBSD i686) Firefox/3.6"
288 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU; rv:1.9.2) Gecko/20100105 MRA 5.6 (build 03278) Firefox/3.6 (.NET CLR 3.5.30729)"
289 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; lt; rv:1.9.2) Gecko/20100115 Firefox/3.6"
290 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100306 Firefox3.6 (.NET CLR 3.5.30729)"
291 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100806 Firefox/3.6"
292 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.3) Gecko/20100401 Firefox/3.6;MEGAUPLOAD 1.0"
293 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ar; rv:1.9.2) Gecko/20100115 Firefox/3.6"
294 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6"
295 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2) Gecko/20100105 Firefox/3.6 (.NET CLR 3.5.30729)"
296 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2) Gecko/20100115 Firefox/3.6 ( .NET CLR 3.5.30729)"
297 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b5pre) Gecko/20090517 Firefox/3.5b4pre (.NET CLR 3.5.30729)"
298 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090409 Firefox/3.5b4pre"
299 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090401 Firefox/3.5b4pre"
300 | "Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4"
301 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 (.NET CLR 3.5.30729)"
302 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729)"
303 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729)"
304 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4"
305 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729)"
306 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4"
307 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4"
308 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5"
309 | "Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 (.NET CLR 3.5.30729)"
310 | "Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-2.fc12 Firefox/3.5.9"
311 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 GTB7.0"
312 | "Mozilla/5.0 (X11; U; Linux x86_64; es-CL; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9"
313 | "Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9"
314 | "Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9"
315 | "Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-1.fc12 Firefox/3.5.9"
316 | "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1 Firefox/3.5.9"
317 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 GTB7.1"
318 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100315 Ubuntu/9.10 (karmic) Firefox/3.5.9"
319 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.9"
320 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; tr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.1"
321 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 (.NET CLR 3.5.30729)"
322 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9"
323 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; et; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9"
324 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9"
325 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 ( .NET CLR 3.5.30729)"
326 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB5 (.NET CLR 3.5.30729)"
327 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.5.9 (de)"
328 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618)"
329 | "Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8"
330 | "Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc11 Firefox/3.5.8"
331 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100318 Gentoo Firefox/3.5.8"
332 | "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8"
333 | "Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8"
334 | "Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8"
335 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8"
336 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"
337 | "Mozilla/5.0 (X11; U; FreeBSD i386; ja-JP; rv:1.9.1.8) Gecko/20100305 Firefox/3.5.8"
338 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; sl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"
339 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4"
340 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6"
341 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB7.0 (.NET CLR 3.5.30729)"
342 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100305 Gentoo Firefox/3.5.7"
343 | "Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7"
344 | "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.7) Gecko/20091222 SUSE/3.5.7-1.1.1 Firefox/3.5.7"
345 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6"
346 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)"
347 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.0.04506.648)"
348 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; fa; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"
349 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.5.7 (.NET CLR 3.5.30729)"
350 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6"
351 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.6) Gecko/20100117 Gentoo Firefox/3.5.6"
352 | "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.6) Gecko/20091216 Fedora/3.5.6-1.fc11 Firefox/3.5.6 GTB6"
353 | "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 GTB6"
354 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20100118 Gentoo Firefox/3.5.6"
355 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB6"
356 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB7.0"
357 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6"
358 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6"
359 | "Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.9.1.6) Gecko/20100107 Fedora/3.5.6-1.fc12 Firefox/3.5.6"
360 | "Mozilla/5.0 (X11; U; Linux i686; ca; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6"
361 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6"
362 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 ( .NET CLR 3.5.30729)"
363 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; id; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)"
364 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.4 (build 02647) Firefox/3.5.6 (.NET CLR 3.5.30729)"
365 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
366 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 (.NET CLR 3.5.30729)"
367 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6"
368 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB6 (.NET CLR 3.5.30729) FBSMTWB"
369 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) FBSMTWB"
370 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5"
371 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8pre) Gecko/20091227 Ubuntu/9.10 (karmic) Firefox/3.5.5"
372 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091114 Gentoo Firefox/3.5.5"
373 | "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"
374 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; uk; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5"
375 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5"
376 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5"
377 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 ( .NET CLR 3.5.30729)"
378 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.5) Gecko/Firefox/3.5.5"
379 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 (.NET CLR 3.5.30729)"
380 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5"
381 | "Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.8.1) Gecko/20091102 Firefox/3.5.5"
382 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 FBSMTWB"
383 | "Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.4) Gecko/20091016 SUSE/3.5.4-1.1.2 Firefox/3.5.4"
384 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) FBSMTWB"
385 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4"
386 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729)"
387 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 ( .NET CLR 3.5.30729; .NET4.0E)"
388 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4"
389 | "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.3pre"
390 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090914 Slackware/13.0_stable Firefox/3.5.3"
391 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3"
392 | "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3"
393 | "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3"
394 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090919 Firefox/3.5.3"
395 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090912 Gentoo Firefox/3.5.3 FirePHP/0.3"
396 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB5"
397 | "Mozilla/5.0 (X11; U; FreeBSD i386; ru-RU; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3"
398 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"
399 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 ( .NET CLR 3.5.30729)"
400 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
401 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.5.3;MEGAUPLOAD 1.0 ( .NET CLR 3.5.30729)"
402 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"
403 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"
404 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
405 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; fi; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"
406 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 2.0.50727; .NET CLR 3.0.30618; .NET CLR 3.5.21022; .NET CLR 3.5.30729)"
407 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; bg; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
408 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
409 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)"
410 | "Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.9.1.2) Gecko/20090911 Slackware Firefox/3.5.2"
411 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Slackware Firefox/3.5.2"
412 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Firefox/3.5.2 Slackware"
413 | "Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.1.2) Gecko/20090804 Firefox/3.5.2"
414 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Slackware/13.0 Firefox/3.5.2"
415 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
416 | "Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
417 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"
418 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"
419 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB7.1 ( .NET CLR 3.5.30729)"
420 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; es-MX; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"
421 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
422 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"
423 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
424 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
425 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; uk; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
426 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
427 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"
428 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"
429 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"
430 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 FirePHP/0.4"
431 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.16) Gecko/20101130 AskTbMYC/3.9.1.14019 Firefox/3.5.16"
432 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729)"
433 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.16) Gecko/20101130 MRA 5.4 (build 02647) Firefox/3.5.16 ( .NET CLR 3.5.30729; .NET4.0C)"
434 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1"
435 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 AskTbPLTV5/3.8.0.12304 Firefox/3.5.16 (.NET CLR 3.5.30729)"
436 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729)"
437 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1"
438 | "Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15"
439 | "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15"
440 | "Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13"
441 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.5.12"
442 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.12) Gecko/20100824 MRA 5.7 (build 03755) Firefox/3.5.12"
443 | "Mozilla/5.0 (X11; U; Linux; en-US; rv:1.9.1.11) Gecko/20100720 Firefox/3.5.11"
444 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 ( .NET CLR 3.5.30729; .NET4.0C)"
445 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 ( .NET CLR 3.5.30729)"
446 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11"
447 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.11 (.NET CLR 3.5.30729)"
448 | "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.10) Gecko/20100506 SUSE/3.5.10-0.1.1 Firefox/3.5.10"
449 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.10 GTB7.0 ( .NET CLR 3.5.30729)"
450 | "Mozilla/5.0 (X11; U; Linux x86_64; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1"
451 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100524 Firefox/3.5.1"
452 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Linux Mint/7 (Gloria) Firefox/3.5.1"
453 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Firefox/3.5.1"
454 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1"
455 | "Mozilla/5.0 (X11; U; Linux x86; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1"
456 | "Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1"
457 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2pre) Gecko/20090729 Ubuntu/9.04 (jaunty) Firefox/3.5.1"
458 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5"
459 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090722 Gentoo Firefox/3.5.1"
460 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1"
461 | "Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1) Gecko/20090720 Firefox/3.5.1"
462 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1"
463 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1"
464 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; tr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
465 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)"
466 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1"
467 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 4.0.20506)"
468 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729)"
469 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729)"
470 | "Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5"
471 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1) Gecko/20090630 Firefox/3.5 GTB6"
472 | "Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)"
473 | "Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5"
474 | "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1) Gecko/20090624 Firefox/3.5"
475 | "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5"
476 | "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Ubuntu/9.04 (jaunty) Firefox/3.5"
477 | "Mozilla/5.0 (X11; U; Linux i686; en-us; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5"
478 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Ubuntu/8.04 (hardy) Firefox/3.5"
479 | "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Firefox/3.5"
480 | "Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.9.1) Gecko/20090624 Firefox/3.5"
481 | "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1) Gecko/20090703 Firefox/3.5"
482 | "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.0.10) Gecko/20090624 Firefox/3.5"
483 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)"
484 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)"
485 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 (.NET CLR 4.0.20506)"
486 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5"
487 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 4.0.20506)"
488 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5"
489 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)"
490 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.25 (KHTML, like Gecko) Chrome/12.0.706.0 Safari/534.25"
491 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24"
492 | "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.702.0 Chrome/12.0.702.0 Safari/534.24"
493 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24"
494 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24"
495 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24"
496 | "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24"
497 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.698.0 Safari/534.24"
498 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.697.0 Safari/534.24"
499 | "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.43 Safari/534.24"
500 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24"
501 | "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24"
502 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24"
503 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24"
504 | "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24"
505 | "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.14 Safari/534.24"
506 | "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24"
507 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24"
508 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.04 Chromium/11.0.696.0 Chrome/11.0.696.0 Safari/534.24"
509 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.0 Safari/534.24"
510 | "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.694.0 Safari/534.24"
511 | "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.23 (KHTML, like Gecko) Chrome/11.0.686.3 Safari/534.23"
512 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.682.0 Safari/534.21"
513 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21"
514 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21"
515 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20"
516 | "Mozilla/5.0 (Windows NT) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20"
517 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20"
518 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.669.0 Safari/534.20"
519 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.19 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.19"
520 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.18"
521 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.660.0 Safari/534.18"
522 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17"
523 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17"
524 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.654.0 Safari/534.17"
525 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.652.0 Safari/534.17"
526 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17"
527 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17"
528 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.82 Safari/534.16"
529 | "Mozilla/5.0 (X11; U; Linux armv7l; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
530 | "Mozilla/5.0 (X11; U; FreeBSD x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
531 | "Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
532 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204"
533 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16"
534 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16"
535 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16"
536 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16"
537 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16"
538 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
539 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16"
540 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
541 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
542 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
543 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
544 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.127 Chrome/10.0.648.127 Safari/534.16"
545 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16"
546 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16"
547 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16"
548 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16"
549 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16"
550 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16"
551 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16"
552 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16"
553 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.0 Safari/534.16"
554 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.642.0 Chrome/10.0.642.0 Safari/534.16"
555 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.639.0 Safari/534.16"
556 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.638.0 Safari/534.16"
557 | "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16"
558 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16"
559 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 SUSE/10.0.626.0 (KHTML, like Gecko) Chrome/10.0.626.0 Safari/534.16"
560 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.613.0 Safari/534.15"
561 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.613.0 Chrome/10.0.613.0 Safari/534.15"
562 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.04 Chromium/10.0.612.3 Chrome/10.0.612.3 Safari/534.15"
563 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.612.1 Safari/534.15"
564 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.611.0 Chrome/10.0.611.0 Safari/534.15"
565 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.602.0 Safari/534.14"
566 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14"
567 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14"
568 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/9.1.0.0 Safari/540.0"
569 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0"
570 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14"
571 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Ubuntu/10.10 Chromium/9.0.600.0 Chrome/9.0.600.0 Safari/534.14"
572 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.600.0 Safari/534.14"
573 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.599.0 Safari/534.13"
574 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13"
575 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.44 Safari/534.13"
576 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.19 Safari/534.13"
577 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13"
578 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13"
579 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13"
580 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13"
581 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13"
582 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13"
583 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13"
584 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13"
585 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.596.0 Safari/534.13"
586 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/10.04 Chromium/9.0.595.0 Chrome/9.0.595.0 Safari/534.13"
587 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/9.10 Chromium/9.0.592.0 Chrome/9.0.592.0 Safari/534.13"
588 | "Mozilla/5.0 (X11; U; Windows NT 6; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12"
589 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.579.0 Safari/534.12"
590 | "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12"
591 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/8.1.0.0 Safari/540.0"
592 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.558.0 Safari/534.10"
593 | "Mozilla/5.0 (X11; U; CrOS i686 0.9.130; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.344 Safari/534.10"
594 | "Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.343 Safari/534.10"
595 | "Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.341 Safari/534.10"
596 | "Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 Safari/534.10"
597 | "Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339"
598 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Ubuntu/10.10 Chromium/8.0.552.237 Chrome/8.0.552.237 Safari/534.10"
599 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10"
600 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/533.3"
601 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10"
602 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10"
603 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10"
604 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10"
605 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.210 Safari/534.10"
606 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.200 Safari/534.10"
607 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.551.0 Safari/534.10"
608 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.548.0 Safari/534.10"
609 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.544.0 Safari/534.10"
610 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10"
611 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10"
612 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10"
613 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10"
614 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.9 (KHTML, like Gecko) Chrome/7.0.531.0 Safari/534.9"
615 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.521.0 Safari/534.8"
616 | "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.24 Safari/534.7"
617 | "Mozilla/5.0 (X11; U; Linux x86_64; fr-FR) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7"
618 | "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7"
619 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7"
620 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6"
621 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
622 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
623 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
624 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
625 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
626 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
627 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
628 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
629 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
630 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
631 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
632 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
633 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
634 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
635 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
636 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
637 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
638 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
639 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
640 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27"
641 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
642 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
643 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
644 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
645 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
646 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
647 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
648 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
649 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
650 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
651 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
652 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
653 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
654 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
655 | "Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
656 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
657 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
658 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
659 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
660 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
661 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
662 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
663 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
664 | "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5"
665 | "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_2_1 like Mac OS X; he-il) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5"
666 | "Mozilla/5.0 (iPhone; U; fr; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5"
667 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-tw) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5"
668 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; pl-pl) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5"
669 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; fr-fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5"
670 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; en-gb) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5"
671 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; nb-no) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5"
672 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; it-it) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5"
673 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5"
674 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; fi-fi) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5"
675 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; fi-fi) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5"
676 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"
677 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"
678 | "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+"
679 | "Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+"
680 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
681 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16"
682 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16"
683 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
684 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
685 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
686 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; zh-cn) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
687 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ru-ru) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
688 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ko-kr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
689 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
690 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/534.1+ (KHTML, like Gecko) Version/5.0 Safari/533.16"
691 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-au) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
692 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; el-gr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
693 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ca-es) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
694 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-tw) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
695 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
696 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
697 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fr-fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16"
698 | "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-en) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16"
699 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; nl-nl) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16"
700 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16"
701 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de-de) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16"
702 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7; en-us) AppleWebKit/533.4 (KHTML, like Gecko) Version/4.1 Safari/533.4"
703 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8"
704 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; tr) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2"
705 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2"
706 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2"
707 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081212 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8"
708 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-gb) AppleWebKit/528.10+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2"
709 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2"
710 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2"
711 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
712 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
713 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
714 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-gb) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
715 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
716 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
717 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; da-dk) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
718 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
719 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.4+ (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
720 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
721 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; de-de) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
722 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
723 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7"
724 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B5097d Safari/6531.22.7"
725 | "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7"
726 | "Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc"
727 | "Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10"
728 | "Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/123"
729 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
730 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
731 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
732 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
733 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
734 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; hu-hu) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
735 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.21.11 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
736 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ru-ru) AppleWebKit/533.2+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
737 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
738 | "Mozilla/5.0 (iPhone; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10"
739 | "Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7D11 Safari/531.21.10"
740 | "Mozilla/5.0 (iPad; U; CPU OS 3_2_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B500 Safari/53"
741 | "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10"
742 | "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B360 Safari/531.21.10"
743 | "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.1021.10gin_lib.cc"
744 | "Mozilla/5.0 (iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314"
745 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9"
746 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9.2009"
747 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9"
748 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; nl-nl) AppleWebKit/532.3+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9"
749 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fi-fi) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9"
750 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.3 Safari/531.21.10"
751 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
752 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
753 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
754 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl-PL) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
755 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
756 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
757 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
758 | "Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
759 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
760 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1"
761 | "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19"
762 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19"
763 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/4.0.1 Safari/530.18"
764 | "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.1 Safari/530.18"
765 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
766 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
767 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
768 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
769 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528+ (KHTML, like Gecko) Version/4.0 Safari/528.16"
770 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
771 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; es-es) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
772 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
773 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
774 | "Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
775 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
776 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
777 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
778 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
779 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
780 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
781 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
782 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
783 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
784 | "Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16"
785 | "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10"
786 | "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10"
787 | "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01"
788 | "Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01"
789 | "Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01"
790 | "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01"
791 | "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01"
792 | "Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01"
793 | "Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01"
794 | "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01"
795 | "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01"
796 | "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01"
797 | "Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01"
798 | "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01"
799 | "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01"
800 | "Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01"
801 | "Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01"
802 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01"
803 | "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00"
804 | "Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00"
805 | "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00"
806 | "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00"
807 | "Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00"
808 | "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00"
809 | "Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00"
810 | "Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00"
811 | "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"
812 | "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.39 Version/11.00"
813 | "Opera/9.80 (Windows NT 5.1; U; MRA 5.5 (build 02842); ru) Presto/2.7.62 Version/11.00"
814 | "Opera/9.80 (Windows NT 5.1; U; it) Presto/2.7.62 Version/11.00"
815 | "Mozilla/5.0 (Windows NT 6.0; U; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00"
816 | "Mozilla/5.0 (Windows NT 5.1; U; pl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00"
817 | "Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00"
818 | "Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; pl) Opera 11.00"
819 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; fr) Opera 11.00"
820 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; ja) Opera 11.00"
821 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00"
822 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; pl) Opera 11.00"
823 | "Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70"
824 | "Mozilla/5.0 (Windows NT 5.2; U; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70"
825 | "Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70"
826 | "Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63"
827 | "Opera/9.80 (Windows NT 5.2; U; en) Presto/2.6.30 Version/10.63"
828 | "Opera/9.80 (Windows NT 5.1; U; MRA 5.6 (build 03278); ru) Presto/2.6.30 Version/10.63"
829 | "Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.62"
830 | "Mozilla/5.0 (X11; Linux x86_64; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.62"
831 | "Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; de) Opera 10.62"
832 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; en) Opera 10.62"
833 | "Opera/9.80 (X11; Linux i686; U; pl) Presto/2.6.30 Version/10.61"
834 | "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.6.30 Version/10.61"
835 | "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.30 Version/10.61"
836 | "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.61"
837 | "Opera/9.80 (Windows NT 6.0; U; it) Presto/2.6.30 Version/10.61"
838 | "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.6.30 Version/10.61"
839 | "Opera/9.80 (Windows 98; U; de) Presto/2.6.30 Version/10.61"
840 | "Opera/9.80 (Macintosh; Intel Mac OS X; U; nl) Presto/2.6.30 Version/10.61"
841 | "Opera/9.80 (X11; Linux i686; U; en) Presto/2.5.27 Version/10.60"
842 | "Opera/9.80 (Windows NT 6.0; U; nl) Presto/2.6.30 Version/10.60"
843 | "Opera/10.60 (Windows NT 5.1; U; zh-cn) Presto/2.6.30 Version/10.60"
844 | "Opera/10.60 (Windows NT 5.1; U; en-US) Presto/2.6.30 Version/10.60"
845 | "Opera/9.80 (X11; Linux i686; U; it) Presto/2.5.24 Version/10.54"
846 | "Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.5.24 Version/10.53"
847 | "Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53"
848 | "Mozilla/5.0 (Windows NT 5.1; U; Firefox/5.0; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53"
849 | "Mozilla/5.0 (Windows NT 5.1; U; Firefox/4.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53"
850 | "Mozilla/5.0 (Windows NT 5.1; U; Firefox/3.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53"
851 | "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; ko) Opera 10.53"
852 | "Opera/9.80 (Windows NT 6.1; U; fr) Presto/2.5.24 Version/10.52"
853 | "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.5.22 Version/10.51"
854 | "Opera/9.80 (Windows NT 6.0; U; cs) Presto/2.5.22 Version/10.51"
855 | "Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51"
856 | "Opera/9.80 (Linux i686; U; en) Presto/2.5.22 Version/10.51"
857 | "Mozilla/5.0 (Windows NT 6.1; U; en-GB; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51"
858 | "Mozilla/5.0 (Linux i686; U; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51"
859 | "Mozilla/4.0 (compatible; MSIE 8.0; Linux i686; en) Opera 10.51"
860 | "Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.5.22 Version/10.50"
861 | "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.5.22 Version/10.50"
862 | "Opera/9.80 (Windows NT 6.1; U; sk) Presto/2.6.22 Version/10.50"
863 | "Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.5.22 Version/10.50"
864 | "Opera/9.80 (Windows NT 6.0; U; zh-cn) Presto/2.5.22 Version/10.50"
865 | "Opera/9.80 (Windows NT 5.1; U; sk) Presto/2.5.22 Version/10.50"
866 | "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.50"
867 | "Opera/10.50 (Windows NT 6.1; U; en-GB) Presto/2.2.2"
868 | "Opera/9.80 (S60; SymbOS; Opera Tablet/9174; U; en) Presto/2.7.81 Version/10.5"
869 | "Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10"
870 | "Opera/9.80 (X11; Linux x86_64; U; it) Presto/2.2.15 Version/10.10"
871 | "Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.10"
872 | "Opera/9.80 (Windows NT 6.0; U; Gecko/20100115; pl) Presto/2.2.15 Version/10.10"
873 | "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.10"
874 | "Opera/9.80 (Windows NT 5.1; U; de) Presto/2.2.15 Version/10.10"
875 | "Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.10"
876 | "Mozilla/5.0 (Windows NT 6.0; U; tr; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 10.10"
877 | "Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; de) Opera 10.10"
878 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0; tr) Opera 10.10"
879 | "Opera/9.80 (X11; Linux x86_64; U; en-GB) Presto/2.2.15 Version/10.01"
880 | "Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.00"
881 | "Opera/9.80 (X11; Linux x86_64; U; de) Presto/2.2.15 Version/10.00"
882 | "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.2.15 Version/10.00"
883 | "Opera/9.80 (X11; Linux i686; U; pt-BR) Presto/2.2.15 Version/10.00"
884 | "Opera/9.80 (X11; Linux i686; U; pl) Presto/2.2.15 Version/10.00"
885 | "Opera/9.80 (X11; Linux i686; U; nb) Presto/2.2.15 Version/10.00"
886 | "Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.2.15 Version/10.00"
887 | "Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.00"
888 | "Opera/9.80 (X11; Linux i686; U; Debian; pl) Presto/2.2.15 Version/10.00"
889 | "Opera/9.80 (X11; Linux i686; U; de) Presto/2.2.15 Version/10.00"
890 | "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.2.15 Version/10.00"
891 | "Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.2.15 Version/10.00"
892 | "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00"
893 | "Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.00"
894 | "Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.2.15 Version/10.00"
895 | "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.00"
896 | "Opera/9.80 (Windows NT 6.0; U; de) Presto/2.2.15 Version/10.00"
897 | "Opera/9.80 (Windows NT 5.2; U; en) Presto/2.2.15 Version/10.00"
898 | "Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/10.00"
899 | "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00"
--------------------------------------------------------------------------------