diff --git a/.gitignore b/.gitignore index b3dca0c..585443d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,8 @@ node_modules # Secret stuff -config/env* -!config/env-sample.js +config/env/* +!config/env/sample.js # Minified static files (can be built with `npm run minify`) static/**/*.min.* diff --git a/LICENSE.md b/LICENSE.md index 266fc85..3486f81 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -200,42 +200,3 @@ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY C ### 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -## END OF TERMS AND CONDITIONS - -#### How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - -The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/PRIVACY.md b/PRIVACY.md deleted file mode 100644 index ff05347..0000000 --- a/PRIVACY.md +++ /dev/null @@ -1,13 +0,0 @@ -# Privacy Policy for Tracman 0.3.1 - -In lieu of legalease, which I don't speak, here is a quick rundown of what Tracman does with your data (such as location). - -## Location history - -Your location is saved on the database as long as you have it "set" or "tracking". If you "clear" the data, it will be deleted from the database too. This doesn't mean all copies are destroyed. Our servers keep occasional backups, and caches could exist on other servers (google index, wayback archive, etc). - -This means that all public access to your location is essentially deleted when you clear it. But anyone could record your location while it's publicly available and rebroadcast it. Tracman doesn't store location histories (except as mentioned above), but histories may exist elsewhere! If you have (or plan to have) trouble with the law, don't use Tracman. Authorities have easy access to those histories. - -## Email addresses - -Tracman stores email addresses so we can contact users for important stuff (urgent security updates, deletion requests, lost passwords). We will never subscribe you to anything else by default. diff --git a/README.md b/README.md index 2b589e5..1daafb0 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,58 @@ -# Tracman -###### v 0.5.1 +# []Tracman +###### v 0.6.0 -node.js application to display a map with user's location. +node.js application to display a sharable map with user's location. ## Installation + ```sh $ git clone https://github.com/Tracman-org/Server.git && (cd Server && exec npm install) ``` -## Running +You will need to set up a configuration file at `config/env/env.js`. Use `config/env/sample.js` for an example. You can get API keys at the [google developer's console](https://console.developers.google.com/apis/credentials). You will need to set up approved hosts and auth callbacks. There is more information in [their documentation](https://support.google.com/googleapi/answer/6158857?hl=en). + +A good method is to simply copy the sample configuration and point `config/env/env.js` to the new version: ```sh -$ npm start +$ cp config/env/sample.js config/env/my-config.js +$ echo "module.exports = require('./my-config.js');" > config/env/env.js ``` +Then edit `config/env/my-config.js` to match your local environment. + +## Usage + +Run Tracman with npm: + +```sh +$ npm run minify && npm start +``` + +...or with [nodemon](https://nodemon.io/): + +```sh +$ npm run nodemon +``` + +Nodemon will automatically minify files and restart the app when you make changes. Check out the `nodemon.json` configuration. + ## Contributing -Tracman will be updated according to [this branching model](http://nvie.com/posts/a-successful-git-branching-model). +Tracman will be updated according to [this branching model](http://nvie.com/posts/a-successful-git-branching-model)... more or less. If you know anything about programming Android, [the Tracman android app](https://github.com/Tracman-org/Android) is more desperate for help. ## Changelog -#### v 0.5.1 +#### v0.6.0 + +* [#32](https://github.com/Tracman-org/Server/issues/32), [#57](https://github.com/Tracman-org/Server/issues/57), [#58](https://github.com/Tracman-org/Server/issues/58), [#60](https://github.com/Tracman-org/Server/issues/60) Added more login options +* [#50](https://github.com/Tracman-org/Server/issues/50) Replaced some callbacks with promises +* Minified static files +* [#51](https://github.com/Tracman-org/Server/issues/51), [#52](https://github.com/Tracman-org/Server/issues/52) Added settings validations +* [#54](https://github.com/Tracman-org/Server/issues/54), [#55](https://github.com/Tracman-org/Server/issues/55) Made map work better +* [#61](https://github.com/Tracman-org/Server/issues/61) New MongoDB security +* [#62](https://github.com/Tracman-org/Server/issues/62) Fixed error handling + +#### v0.5.1 * Fixed broken controls @@ -28,7 +60,7 @@ Tracman will be updated according to [this branching model](http://nvie.com/post * Updated libraries * Fixed recognition of attached clients [#34](https://github.com/Tracman-org/Server/issues/21) -* Moved socket.io code to own file. +* Moved socket.io code to own file. * Many minor fixes #### v0.4.3 @@ -56,4 +88,17 @@ Tracman will be updated according to [this branching model](http://nvie.com/post * Unified map and dashboard UI * Security updates * New admin UI -* \ No newline at end of file + + +## License + +###### see [LICENSE.md](https://github.com/Tracman-org/Server/blob/master/LICENSE.md) + +Tracman: GPS tracking service in node.js +Copyright © 2017 [Keith Irwin](https://keithirwin.us/) + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see <[http://www.gnu.org/licenses/](http://www.gnu.org/licenses/)>. \ No newline at end of file diff --git a/config/auth.js b/config/auth.js deleted file mode 100644 index c2f4cbf..0000000 --- a/config/auth.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -const passport = require('passport'), - slug = require('slug'), - crypto = require('crypto'), - secret = require('./secrets.js'), - User = require('./models/user.js'), - GoogleStrategy = require('passport-google-oauth2').Strategy, - GoogleTokenStrategy = require('passport-google-id-token'); - -passport.use(new GoogleStrategy({ - clientID: secret.googleClientId, - clientSecret: secret.googleClientSecret, - callbackURL: secret.url+'/auth/google/callback', - passReqToCallback: true -}, function(req, accessToken, refreshToken, profile, done) { - - // Check for user - User.findOne({googleID: profile.id}, function(err, user){ - - // Error - if (err) { console.log('Error finding user with google ID: '+profile.id+'\n'+err); } - - // User found - if (!err && user !== null) /* Log user in */ { - if (!user.name) { user.name=profile.displayName; } - user.lastLogin = Date.now(); - user.save(function (err, raw) { - if (err) { throwErr(req,err); } - }); done(null, user); - } - - // User not found - else /* create user */ { - user = new User(); - user.googleID = profile.id; - user.name = profile.displayName; - user.email = profile.emails[0].value; - user.slug = slug(profile.displayName).toLowerCase(); - user.created = Date.now(); - user.lastLogin = Date.now(); - // user.settings = { units:'standard', defaultMap:'road', defaultZoom:11, showSpeed:false, showTemp:false, showAlt:false, showStreetview:false }, - // user.last = { lat:0, lon:0, dir:0, alt:0, spd:0 }, - // user.isPro = false; - // user.isAdmin = false; - var cbc = 2; - var successMessage, failMessage; - - // Generate slug - (function checkSlug(s,cb) { - //console.log('checking ',s); - User.findOne({slug:s}, function(err, existingUser){ - if (err) { console.log('No user found for ',slug,':',err); } - if (existingUser){ - s = ''; - while (s.length<6) { - s+='abcdefghijkmnpqrtuvwxy346789'.charAt(Math.floor(Math.random()*28)); - } - checkSlug(s,cb); - } else { cb(s); } - }); - })(user.slug, function(newSlug){ - user.slug = newSlug; - if (cbc>1) /* waiting on other calls */ { cbc--; } - else { done(null, user, { success:successMessage, failure:failMessage }); } - }); - - // Generate sk32 - crypto.randomBytes(32, function(err,buf) { - if (err) {console.log('Unable to get random bytes:',err);} - if (!buf) {console.log('Unable to get random buffer');} - else { - user.sk32 = buf.toString('hex'); - user.save(function(err) { - if (err) { - console.log('Error saving new user '+err); - var failMessage = 'Something went wrong creating your account. Would you like to report this error?'; - } else { successMessage = 'Your account has been created. Next maybe you should download the android app. ' } - if (cbc>1) /* waiting on other calls */ { cbc--; } - else { done(null, user, { success:successMessage, failure:failMessage }); } - }); - } - }); - - } - - }); - -})); - -passport.use(new GoogleTokenStrategy({ - clientID: secret.googleClientId -}, function(parsedToken, googleId, done) { - User.findOne({googleID:googleId}, function(err, user) { - if (err) { - console.log('Error finding user for gToken login with google profile ID: '+googleId+'\n'+err); } - if (!err && user !== null) { // Log in - user.lastLogin = Date.now(); - user.save(function (err) { - if (err) { - console.log('Error saving user\'s lastLogin for gToken login with google profile ID: '+googleId+'\n'+err); } - }); - return done(err, user); - } else { // No such user - done(null, false); - } - }); -})); diff --git a/config/env/sample.js b/config/env/sample.js new file mode 100644 index 0000000..8a3d2f4 --- /dev/null +++ b/config/env/sample.js @@ -0,0 +1,32 @@ +'use strict'; + +module.exports = { + + // Local variables + mode: 'development', // or production + + // Random strings to prevent hijacking + session: 'SomeSecret', + cookie: 'SomeOtherSecret', + + // Location of your mongoDB + mongoSetup: 'mongodb://localhost:27017/tracman', + // Or use the test database from mLab + //mongoSetup: 'mongodb://tracman:MUPSLXQ34f9cQTc5@ds113841.mlab.com:13841/tracman-dev', + + // URL and port where this will run + url: 'https://localhost:8080', + port: 8080, + + // OAuth API keys + facebookAppId: 'XXXXXXXXXXXXXXXX', + facebookAppSecret: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', + twitterConsumerKey: 'XXXXXXXXXXXXXXXXXXXXXXXXX', + twitterConsumerSecret: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', + googleClientId: '############-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com', + googleClientSecret: 'XXXXXXXXX_XXXXXXXXXXXXXX', + + // Google maps API key + googleMapsAPI: 'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXXXX' + +}; diff --git a/config/mail.js b/config/mail.js new file mode 100644 index 0000000..fe4a578 --- /dev/null +++ b/config/mail.js @@ -0,0 +1,43 @@ +'use strict'; + +const nodemailer = require('nodemailer'), + env = require('./env/env.js'); + +let transporter = nodemailer.createTransport({ + host: 'keithirwin.us', + port: 587, + secure: false, + requireTLS: true, + auth: { + user: 'NoReply@tracman.org', + pass: 'Ei0UwfrZuE' + }, + // logger: true, + // debug: true +}); + +/* Confirm login */ +// transporter.verify( (err,success)=>{ +// if (err){ console.error(`SMTP Error: ${err}`); } +// console.log(`SMTP ${!success?'not ':''}ready...`); +// } ); + +module.exports = { + + send: transporter.sendMail.bind(transporter), + + text: (text)=>{ + return `Tracman\n\n${text}\n\nDo not reply to this email\nFor information about why you received this email, see the privacy policy at ${env.url}/privacyy#email`; + }, + + html: (text)=>{ + return `

+Tracman

${text}

Do not reply to this email. For information about why you recieved this email, see our privacy policy.

`; + }, + + from: `"Tracman" `, + + to: (user)=>{ + return `"${user.name}" <${user.email}>`; + } + +}; \ No newline at end of file diff --git a/config/middleware.js b/config/middleware.js index 4d6b03e..12192be 100644 --- a/config/middleware.js +++ b/config/middleware.js @@ -1,41 +1,41 @@ 'use strict'; -const secret = require('./secrets.js'); - -var throwErr = function(req,err){ - console.log('middleware.js:5 '+typeof err); - console.log('Middleware error:'+err+'\nfor request:\n'+req); - if (secret.env==='production') { - req.flash('error', 'An error occured.
Would you like to report it?'); - req.flash('error-message',err); - } else { // development - req.flash('error',err); - req.flash('error-message',err); - } -}; - -var ensureAuth = function(req,res,next){ - if (req.isAuthenticated()) { return next(); } - else { res.redirect('/login'); } -}; - -var ensureAdmin = function(req,res,next){ - ensureAuth(req,res,function(){ - if (req.user.isAdmin){ return next(); } - else { next(); } - //TODO: test this by logging in as !isAdmin and go to /admin - // else if (!res.headersSent) { // 404 to users (not admin) - // var err = new Error('404: Not found: '+req.url); - // err.status = 404; - // res.render('error.html', { - // code: err.status - // }); - // } - }); -}; +const env = require('./env/env.js'); module.exports = { - throwErr, - ensureAuth, - ensureAdmin + + // Throw error + throwErr: (err,req=null)=>{ + console.error(`❌️ ${err.stack}`); + if (req){ + if (env.mode==='production') { + req.flash('danger', 'An error occured.
Would you like to report it?'); + } else { // development + req.flash('danger', err.message); + } + } + }, + + // Capitalize the first letter of a string + capitalize: (str)=>{ + return str.charAt(0).toUpperCase() + str.slice(1); + }, + + // Ensure authentication + ensureAuth: (req,res,next)=>{ + if (req.isAuthenticated()) { return next(); } + else { res.redirect('/login'); } + }, + + // Ensure administrator + ensureAdmin: (req,res,next)=>{ + if (req.user.isAdmin){ return next(); } + else { + let err = new Error("Unauthorized"); + err.status = 401; + next(err); + } + //TODO: test this by logging in as !isAdmin and go to /admin + } + }; \ No newline at end of file diff --git a/config/models.js b/config/models.js new file mode 100644 index 0000000..9edb081 --- /dev/null +++ b/config/models.js @@ -0,0 +1,133 @@ +'use strict'; + +const mongoose = require('mongoose'), + unique = require('mongoose-unique-validator'), + bcrypt = require('bcrypt-nodejs'), + crypto = require('crypto'); + +const userSchema = new mongoose.Schema({ + name: {type:String}, + email: {type:String, unique:true}, + newEmail: String, + emailToken: String, + slug: {type:String, required:true, unique:true}, + auth: { + password: String, + passToken: String, + passTokenExpires: Date, + google: {type:String, unique:true}, + facebook: {type:String, unique:true}, + twitter: {type:String, unique:true}, + }, + isAdmin: {type:Boolean, required:true, default:false}, + isPro: {type:Boolean, required:true, default:false}, + created: {type:Date, required:true}, + lastLogin: Date, + settings: { + units: {type:String, default:'standard'}, + defaultMap: {type:String, default:'road'}, + defaultZoom: {type:Number, default:11}, + showScale: {type:Boolean, default:false}, + showSpeed: {type:Boolean, default:false}, + showTemp: {type:Boolean, default:false}, + showAlt: {type:Boolean, default:false}, + showStreetview: {type:Boolean, default:false} + }, + last: { + time: Date, + lat: {type:Number, default:0}, + lon: {type:Number, default:0}, + dir: {type:Number, default:0}, + alt: {type:Number, default:0}, + spd: {type:Number, default:0} + }, + sk32: {type:String, required:true, unique:true} +}).plugin(unique); + +/* User methods */ { + + //TODO: Return promises instead of taking callbacks + // See https://gist.github.com/7h1b0/5154fda207e68ad1cefc#file-random-js + // For an example + + // Create email confirmation token + userSchema.methods.createEmailToken = function(next){ // next(err,token) + //console.log('user.createEmailToken() called'); + var user = this; + + crypto.randomBytes(16, (err,buf)=>{ + if (err){ next(err,null); } + if (buf){ + //console.log(`Buffer ${buf.toString('hex')} created`); + user.emailToken = buf.toString('hex'); + user.save() + .then( ()=>{ + return next(null,user.emailToken); + }) + .catch( (err)=>{ + return next(err,null); + }); + + } + }); + + }; + + // Create password reset token + userSchema.methods.createPassToken = function(next){ // next(err,token,expires) + var user = this; + + // Reuse old token, resetting clock + if ( user.auth.passTokenExpires >= Date.now() ){ + console.log(`Reusing old password token...`); + user.auth.passTokenExpires = Date.now() + 3600000; // 1 hour + user.save() + .then( ()=>{ + return next(null,user.auth.passToken,user.auth.passTokenExpires); + }) + .catch( (err)=>{ + return next(err,null,null); + }); + } + + // Create new token + else { + console.log(`Creating new password token...`); + crypto.randomBytes(16, (err,buf)=>{ + if (err){ return next(err,null,null); } + if (buf) { + user.auth.passToken = buf.toString('hex'); + user.auth.passTokenExpires = Date.now() + 3600000; // 1 hour + user.save() + .then( ()=>{ + return next(null,user.auth.passToken,user.auth.passTokenExpires); + }) + .catch( (err)=>{ + return next(err,null,null); + }); + } + }); + } + + }; + + // Generate hash for new password + userSchema.methods.generateHash = function(password,next){ + // next(err,hash); + bcrypt.genSalt(8) + .then( (salt)=>{ + bcrypt.hash(password, salt, null, next); + }) + .catch( (err)=>{ return next(err,null); }); + }; + + // Check for valid password + userSchema.methods.validPassword = function(password,next){ + bcrypt.compare(password, this.auth.password, next); + }; + +} + +module.exports = { + 'user': mongoose.model('User', userSchema) +}; diff --git a/config/models/user.js b/config/models/user.js deleted file mode 100644 index 1b7151c..0000000 --- a/config/models/user.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -const mongoose = require('mongoose'); - -const userSchema = new mongoose.Schema({ - name: {type:String, required:true}, - email: String, - slug: {type:String, required:true, unique:true}, - requestId: String, - isAdmin: {type:Boolean, required:true, default:false}, - isPro: {type:Boolean, required:true, default:false}, - created: Date, - lastLogin: Date, - googleID: {type:Number, unique:true}, - settings: { - units: {type:String, default:'standard'}, - defaultMap: {type:String, default:'road'}, - defaultZoom: {type:Number, default:11}, - showSpeed: {type:Boolean, default:false}, - showTemp: {type:Boolean, default:false}, - showAlt: {type:Boolean, default:false}, - showStreetview: {type:Boolean, default:false} - }, - last: { - time: Date, - lat: {type:Number, default:0}, - lon: {type:Number, default:0}, - dir: {type:Number, default:0}, - alt: {type:Number, default:0}, - spd: {type:Number, default:0} - }, - sk32: {type:String, required:true, unique:true} -}); - -module.exports = mongoose.model('User', userSchema); diff --git a/config/passport.js b/config/passport.js new file mode 100644 index 0000000..ccf4c04 --- /dev/null +++ b/config/passport.js @@ -0,0 +1,244 @@ +'use strict'; + +const + LocalStrategy = require('passport-local').Strategy, + GoogleStrategy = require('passport-google-oauth20').Strategy, + FacebookStrategy = require('passport-facebook').Strategy, + TwitterStrategy = require('passport-twitter').Strategy, + GoogleTokenStrategy = require('passport-google-id-token'), + FacebookTokenStrategy = require('passport-facebook-token'), + TwitterTokenStrategy = require('passport-twitter-token'), + env = require('./env/env.js'), + mw = require('./middleware.js'), + User = require('./models.js').user; + +module.exports = (passport)=>{ + + // Serialize/deserialize users + passport.serializeUser((user,done)=>{ + done(null, user.id); + }); + passport.deserializeUser((id,done)=>{ + User.findById(id, (err,user)=>{ + if(!err){ done(null, user); } + else { done(err, null); } + }); + }); + + // Local + passport.use('local', new LocalStrategy({ + usernameField: 'email', + passwordField: 'password', + passReqToCallback: true + }, (req,email,password,done)=>{ + //console.log(`Perfoming local login for ${email}`); + User.findOne({'email':email}) + .then( (user)=>{ + + // No user with that email + if (!user) { + req.session.next = undefined; + return done( null, false, req.flash('warning','Incorrect email or password.') ); + } + + // User exists + else { + + // Check password + user.validPassword( password, (err,res)=>{ + if (err){ return done(err); } + + // Password incorrect + if (!res) { + req.session.next = undefined; + return done( null, false, req.flash('warning','Incorrect email or password.') ); + } + + // Successful login + else { + user.lastLogin = Date.now(); + user.save(); + return done(null,user); + } + + } ); + } + + }) + .catch( (err)=>{ + return done(err); + }); + } + )); + + // Social login + function socialLogin(req, service, profileId, done) { + //console.log(`socialLogin() called`); + let query = {}; + query['auth.'+service] = profileId; + + // Intent to log in + if (!req.user) { + //console.log(`Logging in with ${service}...`); + User.findOne(query) + .then( (user)=>{ + + // Can't find user + if (!user){ + + // Lazy update from old googleId field + if (service==='google') { + User.findOne({ 'googleID': parseInt(profileId) }) + .then( (user)=>{ + + // User exists with old schema + if (user) { + user.auth.google = profileId; + user.googleId = undefined; + user.save() + .then( ()=>{ + console.info(`🗂️ Lazily updated schema for ${user.name}.`); + req.session.flashType = 'success'; + req.session.flashMessage = "You have been logged in. "; + return done(null, user); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + return done(err); + }); + } + + // No such user + else { + req.session.flashType = 'warning'; + req.session.flashMessage = `There's no user for that ${service} account. `; + return done(); + } + + }) + .catch ( (err)=>{ + mw.throwErr(err,req); + return done(err); + }); + } + + // No googleId either + else { + //console.log(`Couldn't find ${service} user.`); + req.session.flashType = 'warning'; + req.session.flashMessage = `There's no user for that ${service} account. `; + return done(); + } + } + + // Successfull social login + else { + //console.log(`Found user: ${user}`); + req.session.flashType = 'success'; + req.session.flashMessage = "You have been logged in."; + return done(null, user); + } + + }) + .catch( (err)=>{ + mw.throwErr(err,req); + return done(err); + }); + } + + // Intent to connect account + else { + //console.log(`Attempting to connect ${service} account...`); + + // Check for unique profileId + User.findOne(query) + .then( (existingUser)=>{ + + // Social account already in use + if (existingUser) { + //console.log(`${service} account already in use.`); + req.session.flashType = 'warning'; + req.session.flashMessage = `Another user is already connected to that ${service} account. `; + return done(); + } + + // Connect to account + else { + //console.log(`Connecting ${service} account.`); + req.user.auth[service] = profileId; + req.user.save() + .then( ()=>{ + req.session.flashType = 'success'; + req.session.flashMessage = `${mw.capitalize(service)} account connected. `; + return done(null,req.user); + } ) + .catch( (err)=>{ + return done(err); + } ); + } + + }) + .catch( (err)=>{ + mw.throwErr(err,req); + return done(err); + }); + + } + + } + + // Google + passport.use('google', new GoogleStrategy({ + clientID: env.googleClientId, + clientSecret: env.googleClientSecret, + callbackURL: env.url+'/login/google/cb', + passReqToCallback: true + }, (req, accessToken, refreshToken, profile, done)=>{ + socialLogin(req, 'google', profile.id, done); + } + )).use('google-token', new GoogleTokenStrategy({ + clientID: env.googleClientId, + passReqToCallback: true + }, (req, parsedToken, googleId, done)=>{ + socialLogin(req,'google', googleId, done); + } + )); + + // Facebook + passport.use('facebook', new FacebookStrategy({ + clientID: env.facebookAppId, + clientSecret: env.facebookAppSecret, + callbackURL: env.url+'/login/facebook/cb', + passReqToCallback: true + }, (req, accessToken, refreshToken, profile, done)=>{ + socialLogin(req, 'facebook', profile.id, done); + } + )).use('facebook-token', new FacebookTokenStrategy({ + clientID: env.facebookAppId, + clientSecret: env.facebookAppSecret, + passReqToCallback: true + }, (req, accessToken, refreshToken, profile, done)=>{ + socialLogin(req,'facebook', profile.id, done); + } + )); + + // Twitter + passport.use(new TwitterStrategy({ + consumerKey: env.twitterConsumerKey, + consumerSecret: env.twitterConsumerSecret, + callbackURL: env.url+'/login/twitter/cb', + passReqToCallback: true + }, (req, token, tokenSecret, profile, done)=>{ + socialLogin(req, 'twitter', profile.id, done); + } + )).use('twitter-token', new TwitterTokenStrategy({ + consumerKey: env.twitterConsumerKey, + consumerSecret: env.twitterConsumerSecret, + passReqToCallback: true + }, (req, token, tokenSecret, profile, done)=>{ + socialLogin(req,'twitter', profile.id, done); + } + )); + + return passport; +}; \ No newline at end of file diff --git a/config/routes/admin.js b/config/routes/admin.js index 2b20322..a32ab64 100644 --- a/config/routes/admin.js +++ b/config/routes/admin.js @@ -2,52 +2,43 @@ const router = require('express').Router(), mw = require('../middleware.js'), - User = require('../models/user.js'); + User = require('../models.js').user; router.route('/') - .all(mw.ensureAdmin, function(req,res,next){ + .all(mw.ensureAdmin, (req,res,next)=>{ next(); - }).get(function(req,res){ - - var cbc = 0; - var checkCBC = function(req,res,err){ - if (err) { - req.flash('error', err.message); - console.log(err); - } - if (cbc<1){ cbc++; } - else { // done - res.render('admin.html', { - noFooter: '1', - success:req.flash('success')[0], - error:req.flash('error')[0] - }); - } - }; - - User.findById(req.session.passport.user, function(err, found) { - res.locals.user = found; - checkCBC(req,res,err); - }); - - User.find({}).sort({lastLogin:-1}).exec(function(err, found){ - res.locals.users = found; - checkCBC(req,res,err); - }); - - }); + } ) -router.route('/users') - .all(mw.ensureAdmin, function(req,res,next){ - next(); - }).post(function(req,res,next){ + .get( (req,res)=>{ + + User.find({}).sort({lastLogin:-1}) + .then( (found)=>{ + res.render('admin', { + noFooter: '1', + users: found + }); + }) + .catch( (err)=>{ mw.throwErr(err,req); }); + + } ) + + .post( (req,res,next)=>{ if (req.body.delete) { - User.findOneAndRemove({'_id':req.body.delete}, function(err,user){ - if (err){ req.flash('error', err.message); } - else { req.flash('success', ''+user.name+' deleted.'); } + User.findOneAndRemove({'_id':req.body.delete}) + .then( (user)=>{ + req.flash('success', ''+user.name+' deleted.'); + res.redirect('/admin#users'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); res.redirect('/admin#users'); }); - } else { console.log('ERROR! POST without action sent. '); next(); } - }); - + } + else { + let err = new Error('POST without action sent. '); + err.status = 500; + next(); + } + } ); + module.exports = router; \ No newline at end of file diff --git a/config/routes/auth.js b/config/routes/auth.js index 72fd4f6..f028cde 100644 --- a/config/routes/auth.js +++ b/config/routes/auth.js @@ -1,30 +1,287 @@ 'use strict'; -const router = require('express').Router(), - passport = require('passport'); - -router.get('/login', function(req,res){ - res.redirect('/auth/google'); -}); -router.get('/logout', function(req,res){ - req.logout(); // Needs to clear cookies? - res.redirect('/'); -}); +const + mw = require('../middleware.js'), + mail = require('../mail.js'), + User = require('../models.js').user, + crypto = require('crypto'), + env = require('../env/env.js'); -router.get('/auth/google', passport.authenticate('google', { scope: [ - 'https://www.googleapis.com/auth/plus.login', - 'https://www.googleapis.com/auth/plus.profile.emails.read' -] })); -router.get('/auth/google/callback', passport.authenticate('google', { - failureRedirect: '/', - failureFlash: true, - successRedirect: '/', - successFlash: true -} )); +module.exports = (app, passport) => { -router.get('/auth/google/idtoken', passport.authenticate('google-id-token'), function (req,res) { - if (!req.user) { res.sendStatus(401); } - else { res.send(req.user); } -} ); - -module.exports = router; \ No newline at end of file + // Methods for success and failure + const + loginOutcome = { + failureRedirect: '/login', + failureFlash: true + }, + loginCallback = (req,res)=>{ + //console.log(`Login callback called... redirecting to ${req.session.next}`); + req.flash(req.session.flashType,req.session.flashMessage); + req.session.flashType = undefined; + req.session.flashMessage = undefined; + res.redirect( req.session.next || '/map' ); + }, + appLoginCallback = (req,res,next)=>{ + //console.log('appLoginCallback called.'); + if (req.user){ res.send(req.user); } + else { + let err = new Error("Unauthorized"); + err.status = 401; + next(err); + } + }; + + // Login/-out + app.route('/login') + .get( (req,res)=>{ + + // Already logged in + if (req.isAuthenticated()) { loginCallback(req,res); } + + // Show login page + else { res.render('login'); } + + }) + .post( passport.authenticate('local',loginOutcome), loginCallback ); + app.get('/logout', (req,res)=>{ + req.logout(); + req.flash('success',`You have been logged out.`); + res.redirect( req.session.next || '/' ); + }); + + // Signup + app.route('/signup') + .get( (req,res)=>{ + res.redirect('/login#signup'); + }) + .post( (req,res,next)=>{ + + // Send token and alert user + function sendToken(user){ + + // Create a password token + user.createPassToken((err,token)=>{ + if (err){ mw.throwErr(err,req); } + + // Email the instructions to continue + mail.send({ + from: mail.from, + to: `<${user.email}>`, + subject: 'Complete your Tracman registration', + text: mail.text(`Welcome to Tracman! \n\nTo complete your registration, follow this link and set your password:\n${env.url}/settings/password/${token}`), + html: mail.html(`

Welcome to Tracman!

To complete your registration, follow this link and set your password:
${env.url}/settings/password/${token}

`) + }) + .then(()=>{ + req.flash('success', `An email has been sent to ${user.email}. Check your inbox to complete your registration. `); + res.redirect('/login'); + }) + .catch((err)=>{ + mw.throwErr(err,req); + res.redirect('/login#signup'); + }); + + }); + + } + + // Validate email + req.checkBody('email', 'Please enter a valid email address.').isEmail(); + req.sanitizeBody('email').normalizeEmail({remove_dots:false}); + + // Check if somebody already has that email + User.findOne({'email':req.body.email}) + .then( (user)=>{ + + // User already exists + if (user && user.auth.password) { + req.flash('warning','A user with that email already exists! If you forgot your password, you can reset it here.'); + res.redirect('/login#login'); + next(); + } + + // User exists but hasn't created a password yet + else if (user) { + // Send another token (or the same one if it hasn't expired) + sendToken(user); + } + + // Create user + else { + + user = new User(); + user.created = Date.now(); + user.email = req.body.email; + user.slug = slug(user.email.substring(0, user.email.indexOf('@'))); + + // Generate unique slug + const slug = new Promise((resolve,reject) => { + (function checkSlug(s,cb){ + + User.findOne({slug:s}) + .then((existingUser)=>{ + + // Slug in use: generate a random one and retry + if (existingUser){ + crypto.randomBytes(6) + .then( (buf)=>{ + s = buf.toString('hex'); + checkSlug(s,cb); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + reject(); + }); + } + + // Unique slug: proceed + else { cb(s); } + + }) + .catch((err)=>{ + mw.throwErr(err,req); + reject(); + }); + + })(user.slug, (newSlug)=>{ + user.slug = newSlug; + resolve(); + }); + }); + + // Generate sk32 + const sk32 = new Promise((resolve,reject) => { + crypto.randomBytes(32) + .then( (buf)=>{ + user.sk32 = buf.toString('hex'); + resolve(); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + reject(); + }); + }); + + // Save user and send the token by email + Promise.all([slug, sk32]) + .then( ()=>{ user.save(); }) + .then( ()=>{ sendToken(user); }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/login#signup'); + }); + + } + + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/signup'); + }); + + }); + + // Forgot password + app.route('/login/forgot') + .all( (req,res,next)=>{ + if (req.isAuthenticated()){ loginCallback(req,res); } + else { next(); } + } ) + .get( (req,res,next)=>{ + res.render('forgot'); + } ) + .post( (req,res,next)=>{ + + // Validate email + req.checkBody('email', 'Please enter a valid email address.').isEmail(); + req.sanitizeBody('email').normalizeEmail({remove_dots:false}); + + User.findOne({'email':req.body.email}) + .then( (user)=>{ + + // No user with that email + if (!user) { + // Don't let on that no such user exists, to prevent dictionary attacks + req.flash('success', `If an account exists with the email ${req.body.email}, an email has been sent there with a password reset link. `); + res.redirect('/login'); + } + + // User with that email does exist + else { + + // Create reset token + user.createPassToken( (err,token)=>{ + if (err){ next(err); } + + // Email reset link + mail.send({ + from: mail.from, + to: mail.to(user), + subject: 'Reset your Tracman password', + text: mail.text(`Hi, \n\nDid you request to reset your Tracman password? If so, follow this link to do so:\n${env.url}/settings/password/${token}\n\nIf you didn't initiate this request, just ignore this email. `), + html: mail.html(`

Hi,

Did you request to reset your Tracman password? If so, follow this link to do so:
${env.url}/settings/password/${token}

If you didn't initiate this request, just ignore this email.

`) + }).then(()=>{ + req.flash('success', `If an account exists with the email ${req.body.email}, an email has been sent there with a password reset link. `); + res.redirect('/login'); + }).catch((err)=>{ + mw.throwErr(err,req); + res.redirect('/login'); + }); + + }); + + } + + }).catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/login/forgot'); + }); + + } ); + + // Android + app.post('/login/app', passport.authenticate('local'), appLoginCallback); + + // Token-based (android social) + app.get(['/login/app/google','/auth/google/idtoken'], passport.authenticate('google-token'), appLoginCallback); + // app.get('/login/app/facebook', passport.authenticate('facebook-token'), appLoginCallback); + // app.get('/login/app/twitter', passport.authenticate('twitter-token'), appLoginCallback); + + // Social + app.get('/login/:service', (req,res,next)=>{ + let service = req.params.service, + sendParams = (service==='google')?{scope:['https://www.googleapis.com/auth/userinfo.profile']}:null; + + // Social login + if (!req.user) { + //console.log(`Attempting to login with ${service} with params: ${JSON.stringify(sendParams)}...`); + passport.authenticate(service, sendParams)(req,res,next); + } + + // Connect social account + else if (!req.user.auth[service]) { + //console.log(`Attempting to connect ${service} account...`); + passport.authorize(service, sendParams)(req,res,next); + } + + // Disconnect social account + else { + //console.log(`Attempting to disconnect ${service} account...`); + req.user.auth[service] = undefined; + req.user.save() + .then(()=>{ + req.flash('success', `${mw.capitalize(service)} account disconnected. `); + res.redirect('/settings'); + }) + .catch((err)=>{ + mw.throwErr(err,req); + res.redirect('/settings'); + }); + } + + }); + app.get('/login/google/cb', passport.authenticate('google',loginOutcome), loginCallback ); + app.get('/login/facebook/cb', passport.authenticate('facebook',loginOutcome), loginCallback ); + app.get('/login/twitter/cb', passport.authenticate('twitter',loginOutcome), loginCallback ); + +}; diff --git a/config/routes/index.js b/config/routes/index.js index 3b42446..44fa002 100644 --- a/config/routes/index.js +++ b/config/routes/index.js @@ -1,96 +1,101 @@ 'use strict'; -const slug = require('slug'), - mw = require('../middleware.js'), - User = require('../models/user.js'), - router = require('express').Router(); +const mw = require('../middleware.js'), + router = require('express').Router(), + slug = require('slug'), + xss = require('xss'), + User = require('../models.js').user; -// Shortcut to favicon.ico -router.get('/favicon.ico', function(req,res){ - res.redirect('/static/img/icon/by/16-32-48.ico'); -}); - -// Index route -router.route('/') - .get(function(req,res,next){ +module.exports = router - // Logged in - if ( req.session.passport && req.session.passport.user ){ - // Get user - User.findById(req.session.passport.user, function(err, user){ - if (err){ mw.throwErr(req,err); } - if (!user){ console.log('Already logged in user not found:', req.session.passport); next(); } - // If user found: - else { - // Open index - res.render('index.html', { - user: user, - error: req.flash('error')[0], - success: req.flash('succcess')[0] - }); - } - }); - } - - // Not logged in - else { - res.render('index.html', { - error: req.flash('error')[0], - success: req.flash('success')[0] - }); - } - -}); - -// Settings -router.route('/settings') - - // Get settings form - .get(mw.ensureAuth, function(req,res,next){ - User.findById(req.session.passport.user, function(err,user){ - if (err){ console.log('Error finding settings for user:',err); mw.throwErr(req,err); } - res.render('settings.html', {user:user}); - }); - - // Set new settings - }).post(mw.ensureAuth, function(req,res,next){ - User.findByIdAndUpdate(req.session.passport.user, {$set:{ - name: req.body.name, - slug: slug(req.body.slug), - email: req.body.email, - settings: { - units: req.body.units, - defaultMap: req.body.map, - defaultZoom: req.body.zoom, - showSpeed: (req.body.showSpeed)?true:false, - showAlt: (req.body.showAlt)?true:false, - showStreetview: (req.body.showStreet)?true:false - } - }}, function(err, user){ - if (err) { console.log('Error updating user settings:',err); mw.throwErr(req,err); } - else { req.flash('success', 'Settings updated. '); } - res.redirect('/map#'); - }); + // Index + .get('/', (req,res,next)=>{ + res.render('index'); }) - // Delete user account - .delete(mw.ensureAuth, function(req,res,next){ - User.findByIdAndRemove( req.session.passport.user, - function(err) { - if (err) { - console.log('Error deleting user:',err); - mw.throwErr(req,err); - } else { - req.flash('success', 'Your account has been deleted. '); - res.redirect('/'); - } - } - ); - }); + // Help + .get('/help', (req,res)=>{ + res.render('help'); + }) -router.route('/help') - .get(mw.ensureAuth, function(req,res){ - res.render('help.html', {user:req.session.passport.user}); - }); + // Terms of Service and Privacy Policy + .get('/terms', (req,res)=>{ + res.render('terms'); + }) + .get('/privacy', (req,res)=>{ + res.render('privacy'); + }) + + // robots.txt + .get('/robots.txt', (req,res)=>{ + res.type('text/plain'); + res.send("User-agent: *\n"+ + "Disallow: /map/*\n" + ); + }) + + // favicon.ico + .get('/favicon.ico', (req,res)=>{ + res.redirect('/static/img/icon/by/16-32-48.ico'); + }) + + // Endpoint to validate forms + .get('/validate', (req,res,next)=>{ + + // Validate unique slug + if (req.query.slug) { + User.findOne({ slug: slug(req.query.slug) }) + .then( (existingUser)=>{ + if (existingUser && existingUser.id!==req.user.id) { + res.sendStatus(400); + } + else { res.sendStatus(200); } + }) + .catch( (err)=>{ + console.error(err); + res.sendStatus(500); + }); + } + + // Validate unique email + else if (req.query.email) { + User.findOne({ email: req.query.email }) + .then( (existingUser)=>{ + if (existingUser && existingUser.id!==req.user.id) { + res.sendStatus(400); + } + else { res.sendStatus(200); } + }) + .catch( (err)=>{ + console.error(err); + res.sendStatus(500); + }); + } + + // Create slug + else if (req.query.slugify) { + res.send(slug(xss(req.query.slugify))); + } + + // Sanitize for XSS + else if (req.query.xss) { + res.send(xss(req.query.xss)); + } + + // 404 + else { next(); } + + }) + + // Link to androidapp in play store + .get('/android', (req,res)=>{ + res.redirect('https://play.google.com/store/apps/details?id=us.keithirwin.tracman'); + }) + + // Link to iphone app in the apple store + // ... maybe someday + .get('/ios', (req,res)=>{ + res.redirect('/help#why-is-there-no-ios-app'); + }) -module.exports = router; \ No newline at end of file +; diff --git a/config/routes/map.js b/config/routes/map.js index ae3daee..3c657b3 100644 --- a/config/routes/map.js +++ b/config/routes/map.js @@ -2,58 +2,33 @@ const router = require('express').Router(), mw = require('../middleware.js'), - secrets = require('../secrets.js'), - User = require('../models/user.js'); + env = require('../env/env.js'), + User = require('../models.js').user; + +// Redirect to real slug +router.get('/', mw.ensureAuth, (req,res)=>{ + res.redirect(`/map/${req.user.slug}`); +}); // Show map -router.get('/:slug?', function(req,res,next){ - var mapuser='', user='', cbc=0; +router.get('/:slug?', (req,res,next)=>{ - // Confirm sucessful queries - function checkQuery(err,found) { - if (err){ mw.throwErr(req,err); } - if (found){ return found; } - } - - // Call renderMap() on completion - function checkCBC() { - cbc+=1; - if (cbc>1){ renderMap(); } - } - - // QUERIES - // Get logged in user -> user - if (req.isAuthenticated()) { - User.findById(req.session.passport.user, function(err, found) { - user = checkQuery(err,found); - checkCBC(); - }); - } else { checkCBC(); } - // Get tracked user -> mapuser - if (req.params.slug) { - User.findOne({slug:req.params.slug}, function(err, found) { - mapuser = checkQuery(err,found); - checkCBC(); - }); - } else { checkCBC(); } - - // Show map - function renderMap() { - // GET /map shows logged-in user's map - if (!mapuser && !user) { - res.redirect('/'); - } else { - if (user && !mapuser) { mapuser = user; } - res.render('map.html', { + User.findOne({slug:req.params.slug}) + .then( (mapuser)=>{ + if (!mapuser){ next(); } //404 + else { + res.render('map', { mapuser: mapuser, - mapApi: secrets.mapAPI, - user: user, + mapApi: env.googleMapsAPI, + user: req.user, noFooter: '1', - noHeader: (req.query.noheader)?req.query.noheader.match(/\d/)[0]:'', - disp: (req.query.disp)?req.query.disp.match(/\d/)[0]:'' // 0=map, 1=streetview, 2=both + noHeader: (req.query.noheader)?req.query.noheader.match(/\d/)[0]:0, + disp: (req.query.disp)?req.query.disp.match(/\d/)[0]:2 // 0=map, 1=streetview, 2=both }); } - } + }).catch( (err)=>{ + mw.throwErr(err,req); + }); }); diff --git a/config/routes/misc.js b/config/routes/misc.js deleted file mode 100644 index 15aafe6..0000000 --- a/config/routes/misc.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -const router = require('express').Router(), - mw = require('../middleware.js'), - slug = require('slug'), - User = require('../models/user.js'); - -router.get('/robots.txt', function(req,res){ - res.type('text/plain'); - res.send("User-agent: *\n"+ - "Disallow: /map\n" - ); -}); - -router.get('/validate', function(req,res){ - if (req.query.slug) { // validate unique slug - User.findOne({slug:slug(req.query.slug)}, function(err, existingUser){ - if (err) { console.log('/validate error:',err); } - if (existingUser && existingUser.id!==req.session.passport.user) { res.sendStatus(400); } - else { res.sendStatus(200); } - }); - } -}); - -router.get('/android', function(req,res){ - res.redirect('https://play.google.com/store/apps/details?id=us.keithirwin.tracman'); -}); - -router.get('/license', function(req,res){ - res.render('license.html', {user:req.user}); -}); - -router.route('/pro') - .all(mw.ensureAuth, function(req,res,next){ - next(); - }).get(function(req,res,next){ - User.findById(req.session.passport.user, function(err, user){ - if (err){ mw.throwErr(req,err); } - if (!user){ next(); } - else { res.render('pro.html', {user:user}); } - }); - }).post(function(req,res){ - User.findByIdAndUpdate(req.session.passport.user, - {$set:{ isPro:true }}, - function(err, user){ - if (err){ mw.throwErr(req,err); } - else { req.flash('success','You have been signed up for pro. '); } - res.redirect('/map'); - } - ); - }); - -module.exports = router; \ No newline at end of file diff --git a/config/routes/settings.js b/config/routes/settings.js new file mode 100644 index 0000000..ad5d147 --- /dev/null +++ b/config/routes/settings.js @@ -0,0 +1,359 @@ +'use strict'; + +const slug = require('slug'), + xss = require('xss'), + mellt = require('mellt'), + moment = require('moment'), + mw = require('../middleware.js'), + User = require('../models.js').user, + mail = require('../mail.js'), + env = require('../env/env.js'), + router = require('express').Router(); + +// Validate email addresses +function validateEmail(email) { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(email); +} + +// Settings form +router.route('/') + .all( mw.ensureAuth, (req,res,next)=>{ + next(); + } ) + + // Get settings form + .get( (req,res)=>{ + res.render('settings'); + } ) + + // Set new settings + .post( (req,res,next)=>{ + + // Validate email + const checkEmail = new Promise( (resolve,reject)=>{ + + // Check validity + if (!validateEmail(req.body.email)) { + req.flash('warning', `${req.body.email} is not a valid email address. `); + resolve(); + } + + // Check if unchanged + else if (req.user.email===req.body.email) { + resolve(); + } + + // Check uniqueness + else { + User.findOne({ email: req.body.email }) + .then( (existingUser)=>{ + + // Not unique! + if (existingUser && existingUser.id!==req.user.id) { + //console.log("Email not unique!"); + req.flash('warning', `That email, ${req.body.email}, is already in use by another user! `); + resolve(); + } + + // It's unique + else { + //console.log("Email is unique"); + req.user.newEmail = req.body.email; + + // Create token + //console.log(`Creating email token...`); + req.user.createEmailToken((err,token)=>{ + if (err){ reject(err); } + + // Send token to user by email + //console.log(`Mailing new email token to ${req.body.email}...`); + mail.send({ + to: `"${req.user.name}" <${req.body.email}>`, + from: mail.from, + subject: 'Confirm your new email address for Tracman', + text: mail.text(`A request has been made to change your Tracman email address. If you did not initiate this request, please disregard it. \n\nTo confirm your email, follow this link:\n${env.url}/settings/email/${token}. `), + html: mail.html(`

A request has been made to change your Tracman email address. If you did not initiate this request, please disregard it.

To confirm your email, follow this link:
${env.url}/settings/email/${token}.

`) + }) + .then( ()=>{ + req.flash('warning',`An email has been sent to ${req.body.email}. Check your inbox to confirm your new email address. `); + resolve(); + }) + .catch(reject); + + }); + + } + + }) + .catch(reject); + } + + }); + + // Validate slug + const checkSlug = new Promise( (resolve,reject)=>{ + + // Check existence + if (req.body.slug==='') { + req.flash('warning', `You must supply a slug. `); + resolve(); + } + + // Check if unchanged + else if (req.user.slug===slug(xss(req.body.slug))) { + resolve(); + } + + // Check uniqueness + else { + + User.findOne({ slug: req.body.slug }) + .then( (existingUser)=>{ + + // Not unique! + if (existingUser && existingUser.id!==req.user.id) { + req.flash('warning', `That slug, ${req.body.slug}, is already in use by another user! `); + } + + // It's unique + else { + req.user.slug = slug(xss(req.body.slug)); + } + + }) + .then(resolve) + .catch(reject); + + } + + }); + + // Set settings when done + Promise.all([checkEmail, checkSlug]) + .then( ()=>{ + //console.log('Setting settings... '); + + // Set values + req.user.name = xss(req.body.name); + req.user.settings = { + units: req.body.units, + defaultMap: req.body.map, + defaultZoom: req.body.zoom, + showScale: (req.body.showScale)?true:false, + showSpeed: (req.body.showSpeed)?true:false, + showAlt: (req.body.showAlt)?true:false, + showStreetview: (req.body.showStreet)?true:false + }; + + // Save user and send response + //console.log(`Saving new settings for user ${req.user.name}...`); + req.user.save() + .then( ()=>{ + //console.log(`DONE! Redirecting user...`); + req.flash('success', 'Settings updated. '); + res.redirect('/settings'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/settings'); + }); + + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/settings'); + }); + + } ) + + // Delete user account + .delete( (req,res,next)=>{ + + User.findByIdAndRemove(req.user) + .then( ()=>{ + req.flash('success', 'Your account has been deleted. '); + res.redirect('/'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/settings'); + }); + + } ); + +// Confirm email address +router.get('/email/:token', mw.ensureAuth, (req,res,next)=>{ + + // Check token + if ( req.user.emailToken===req.params.token) { + + // Set new email + req.user.email = req.user.newEmail; + req.user.save() + .then( ()=>{ + // Delete token and newEmail + req.user.emailToken = undefined; + req.user.newEmail = undefined; + req.user.save(); + }) + .then( ()=>{ + // Report success + req.flash('success',`Your email has been set to ${req.user.email}. `); + res.redirect('/settings'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect(req.session.next||'/settings'); + }); + + } + + // Invalid token + else { + req.flash('danger', 'Email confirmation token is invalid. '); + res.redirect('/settings'); + } + + } ); + +// Set password +router.route('/password') + .all( mw.ensureAuth, (req,res,next)=>{ + next(); + } ) + + // Email user a token, proceed at /password/:token + .get( (req,res,next)=>{ + + // Create token for password change + req.user.createPassToken( (err,token,expires)=>{ + if (err){ + mw.throwErr(err,req); + res.redirect((req.user)?'/settings':'/login'); + } + + // Figure out expiration time + let expirationTimeString = (req.query.tz)? + moment(expires).utcOffset(req.query.tz).toDate().toLocaleTimeString(req.acceptsLanguages[0]): + moment(expires).toDate().toLocaleTimeString(req.acceptsLanguages[0])+" UTC"; + + // Confirm password change request by email. + mail.send({ + to: mail.to(req.user), + from: mail.from, + subject: 'Request to change your Tracman password', + text: mail.text(`A request has been made to change your tracman password. If you did not initiate this request, please contact support at keith@tracman.org. \n\nTo change your password, follow this link:\n${env.url}/settings/password/${token}. \n\nThis request will expire at ${expirationTimeString}. `), + html: mail.html(`

A request has been made to change your tracman password. If you did not initiate this request, please contact support at keith@tracman.org.

To change your password, follow this link:
${env.url}/settings/password/${token}.

This request will expire at ${expirationTimeString}.

`) + }) + .then( ()=>{ + // Alert user to check email. + req.flash('success',`An link has been sent to ${req.user.email}. Click on the link to complete your password change. This link will expire in one hour (${expirationTimeString}). `); + res.redirect((req.user)?'/settings':'/login'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect((req.user)?'/settings':'/login'); + }); + + }); + + } ); + +router.route('/password/:token') + + // Check token + .all( (req,res,next)=>{ + User + .findOne({'auth.passToken': req.params.token}) + .where('auth.passTokenExpires').gt(Date.now()) + .then((user) => { + if (!user) { + req.flash('danger', 'Password reset token is invalid or has expired. '); + res.redirect( (req.isAuthenticated)?'/settings':'/login' ); + } else { + res.locals.passwordUser = user; + next(); + } + }) + .catch((err)=>{ + mw.throwErr(err,req); + res.redirect('/password'); + }); + } ) + + // Show password change form + .get( (req,res)=>{ + res.render('password'); + } ) + + // Set new password + .post( (req,res,next)=>{ + + // Validate password + let daysToCrack = mellt.CheckPassword(req.body.password); + if (daysToCrack<10) { + mw.throwErr(new Error(`That password could be cracked in ${daysToCrack} days! Come up with a more complex password that would take at least 10 days to crack. `)); + res.redirect(`/settings/password/${req.params.token}`); + } + + else { + + // Delete token + res.locals.passwordUser.auth.passToken = undefined; + res.locals.passwordUser.auth.passTokenExpires = undefined; + + // Create hash + res.locals.passwordUser.generateHash( req.body.password, (err,hash)=>{ + if (err){ + mw.throwErr(err,req); + res.redirect(`/password/${req.params.token}`); + } + else { + + // Save new password to db + res.locals.passwordUser.auth.password = hash; + res.locals.passwordUser.save() + .then( ()=>{ + req.flash('success', 'Password set. You can use it to log in now. '); + res.redirect('/login#login'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/login#signup'); + }); + + } + } ); + + } + + } ); + + +// Tracman pro +router.route('/pro') + .all( mw.ensureAuth, (req,res,next)=>{ + next(); + } ) + + // Get info about pro + .get( (req,res,next)=>{ + res.render('pro'); + } ) + + // Join Tracman pro + .post( (req,res)=>{ + User.findByIdAndUpdate(req.user.id, + {$set:{ isPro:true }}) + .then( (user)=>{ + req.flash('success','You have been signed up for pro. '); + res.redirect(req.session.next||'/settings'); + }) + .catch( (err)=>{ + mw.throwErr(err,req); + res.redirect('/pro'); + }); + } ); + +module.exports = router; diff --git a/config/routes/test.js b/config/routes/test.js new file mode 100644 index 0000000..bbb4d18 --- /dev/null +++ b/config/routes/test.js @@ -0,0 +1,52 @@ +'use strict'; + +const router = require('express').Router(), + mellt = require('mellt'), + mw = require('../middleware.js'), + mail = require('../mail.js'); + +router + + .get('/mail', (req,res,next)=>{ + mail.send({ + to: `"Keith Irwin" `, + from: mail.from, + subject: 'Test email', + text: mail.text("Looks like everything's working! "), + html: mail.html("

Looks like everything's working!

") + }) + .then(()=>{ + console.log("Test email should have sent..."); + res.sendStatus(200); + }) + .catch((err)=>{ + mw.throwErr(err,req); + res.sendStatus(500); + }); + }) + + .get('/password', (req,res)=>{ + res.render('password'); + }) + .post('/password', (req,res,next)=>{ + let daysToCrack = mellt.CheckPassword(req.body.password); + if (daysToCrack<10) { + let err = new Error(`That password could be cracked in ${daysToCrack} days! Come up with a more complex password that would take at least 10 days to crack. `); + mw.throwErr(err,req); + next(err); + } + else { + res.sendStatus(200); + } + }) + + .get('/settings', (req,res)=>{ + res.render('settings'); + }) + .post('/settings', (req,res)=>{ + + //TODO: Test validation here? + + }); + +module.exports = router; \ No newline at end of file diff --git a/config/sockets.js b/config/sockets.js index dd3562b..1150edf 100644 --- a/config/sockets.js +++ b/config/sockets.js @@ -1,7 +1,7 @@ 'use strict'; // Imports -const User = require('./models/user.js'); +const User = require('./models.js').user; // Check for tracking clients function checkForUsers(io, user) { @@ -9,10 +9,14 @@ function checkForUsers(io, user) { // Checks if any sockets are getting updates for this user //TODO: Use Object.values() after upgrading to node v7 - if (Object.keys(io.sockets.connected).map( function(id){ - return io.sockets.connected[id]; - }).some( function(socket){ - return socket.gets==user; + /* if (Object.values(io.sockets.connected).some( (socket)=>{ + * return socket.gets==user; + * })) { + */ + if (Object.keys(io.sockets.connected).map( (key)=>{ + return io.sockets.connected[key]; + }).some( (socket)=>{ + return socket.gets===user; })) { //console.log(`Activating updates for ${user}.`); io.to(user).emit('activate','true'); @@ -26,77 +30,85 @@ module.exports = { checkForUsers: checkForUsers, - init: function(io){ - io.on('connection', function(socket) { + init: (io)=>{ + io.on('connection', (socket)=>{ //console.log(`${socket.id} connected.`); - // Log - //socket.on('log', function(text){ + // Set a few variables + //socket.ip = socket.client.request.headers['x-real-ip']; + //socket.ua = socket.client.request.headers['user-agent']; + + /* Log */ + //socket.on('log', (text)=>{ //console.log(`LOG: ${text}`); //}); // This socket can set location (app) - socket.on('can-set', function(userId){ + socket.on('can-set', (userId)=>{ //console.log(`${socket.id} can set updates for ${userId}.`); - socket.join(userId, function(){ + socket.join(userId, ()=>{ //console.log(`${socket.id} joined ${userId}`); }); checkForUsers( io, userId ); }); // This socket can receive location (map) - socket.on('can-get', function(userId){ + socket.on('can-get', (userId)=>{ socket.gets = userId; //console.log(`${socket.id} can get updates for ${userId}.`); - socket.join(userId, function(){ + socket.join(userId, ()=>{ //console.log(`${socket.id} joined ${userId}`); socket.to(userId).emit('activate', 'true'); }); }); // Set location - socket.on('set', function(loc){ + socket.on('set', (loc)=>{ //console.log(`${socket.id} set location for ${loc.usr}`); loc.time = Date.now(); - // Check for sk32 token - if (!loc.tok) { console.log('!loc.tok for loc:',loc) } + // Check for user and sk32 token + if (!loc.usr){ + console.error("❌", new Error(`Recieved an update from ${socket.ip} without a usr!`).message); + } + else if (!loc.tok){ + console.error("❌", new Error(`Recieved an update from ${socket.ip} for usr ${loc.usr} without an sk32!`).message); + } else { // Get loc.usr - User.findById(loc.usr, function(err, user) { - if (err) { console.log('Error finding user:',err); } - if (!user) { console.log('User not found for loc:',loc); } + User.findById(loc.usr) + .where('sk32').equals(loc.tok) + .then( (user)=>{ + if (!user){ + console.error("❌", new Error(`Recieved an update from ${socket.ip} for ${loc.usr} with tok of ${loc.tok}, but no such user was found in the db!`).message); + } else { - // Confirm sk32 token - if (loc.tok!=user.sk32) { console.log('loc.tok!=user.sk32 || ',loc.tok,'!=',user.sk32); } - else { + // Broadcast location + io.to(loc.usr).emit('get', loc); + //console.log(`Broadcasting ${loc.lat}, ${loc.lon} to ${loc.usr}`); + + // Save in db as last seen + user.last = { + lat: parseFloat(loc.lat), + lon: parseFloat(loc.lon), + dir: parseFloat(loc.dir||0), + spd: parseFloat(loc.spd||0), + time: loc.time + }; + user.save() + .catch( (err)=>{ console.error("❌", err.stack); }); - // Broadcast location - io.to(loc.usr).emit('get', loc); - //console.log(`Broadcasting ${loc.lat}, ${loc.lon} to ${loc.usr}`); - // Save in db as last seen - user.last = { - lat: parseFloat(loc.lat), - lon: parseFloat(loc.lon), - dir: parseFloat(loc.dir||0), - spd: parseFloat(loc.spd||0), - time: loc.time - }; - user.save(function(err) { - if (err) { console.log('Error saving user last location:'+loc.user+'\n'+err); } - }); - - } } - }); + }) + .catch( (err)=>{ console.error("❌", err.stack); }); } }); // Shutdown (check for remaining clients) - socket.on('disconnect', function(reason){ + socket.on('disconnect', (reason)=>{ //console.log(`${socket.id} disconnected because of a ${reason}.`); // Check if client was receiving updates @@ -108,9 +120,7 @@ module.exports = { }); // Log errors - socket.on('error', function(err){ - console.log('Socket error! ',err); - }); + socket.on('error', (err)=>{ console.error('❌', err.stack); }); }); } diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..b80527a --- /dev/null +++ b/nodemon.json @@ -0,0 +1,7 @@ +{ + "verbose": true, + "ext": "html, js, json, css", + "events": { + "start": "npm run minify" + } +} \ No newline at end of file diff --git a/package.json b/package.json index 6989ed1..bf76c38 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,38 @@ { "name": "tracman", - "version": "0.5.1", + "version": "0.6.0", "description": "Tracks user's GPS location", "main": "server.js", "dependencies": { + "bcrypt-nodejs": "0.0.3", "body-parser": "^1.17.1", "connect-flash": "^0.1.1", + "connect-flash-plus": "^0.2.1", "cookie-parser": "^1.4.1", "cookie-session": "^2.0.0-alpha.1", "express": "^4.15.2", + "express-validator": "^3.1.3", + "firebase": "^3.7.2", "kerberos": "0.0.17", + "mellt": "^1.0.0", "moment": "^2.12.0", "mongodb": "^2.1.4", "mongoose": "^4.9.0", + "mongoose-unique-validator": "^1.0.5", "node-jose": "^0.8.0", + "nodemailer": "^3.1.8", "nunjucks": "^2.3.0", "passport": "^0.3.2", + "passport-facebook": "^2.1.1", + "passport-facebook-token": "^3.3.0", "passport-google-id-token": "^0.4.0", - "passport-google-oauth2": "^0.1.6", + "passport-google-oauth20": "^1.0.0", + "passport-local": "^1.0.0", + "passport-twitter": "^1.0.4", + "passport-twitter-token": "^1.3.0", "slug": "^0.9.1", - "socket.io": "^1.4.4" + "socket.io": "^1.4.4", + "xss": "^0.3.3" }, "devDependencies": { "chai": "^3.5.0", @@ -29,6 +42,7 @@ "karma-chrome-launcher": "^1.0.1", "karma-firefox-launcher": "^1.0.0", "karma-mocha": "^1.1.1", + "minifier": "^0.8.1", "mocha": "^2.5.3", "nodemon": "^1.10.2", "supertest": "^1.2.0" @@ -36,7 +50,8 @@ "scripts": { "test": "mocha test.js", "start": "node server.js", - "dev": "nodemon server.js", + "nodemon": "nodemon --ignore 'static/**/*.min.*' server.js", + "minify": "minify --template .{{filename}}.min.{{ext}} --clean static", "update": "sudo n stable && sudo npm update --save && sudo npm prune" }, "repository": { @@ -50,7 +65,7 @@ "map" ], "author": "Keith Irwin", - "license": "MIT", + "license": "GPL-3.0", "README": "README.md", "bugs": { "url": "https://github.com/Tracman-org/Server/issues" diff --git a/server.js b/server.js index fc7ca0c..40b33c9 100755 --- a/server.js +++ b/server.js @@ -1,17 +1,18 @@ 'use strict'; -/* IMPORTS */ -const +/* IMPORTS */ +const express = require('express'), bodyParser = require('body-parser'), + expressValidator = require('express-validator'), cookieParser = require('cookie-parser'), cookieSession = require('cookie-session'), mongoose = require('mongoose'), nunjucks = require('nunjucks'), passport = require('passport'), - flash = require('connect-flash'), - secret = require('./config/secrets.js'), - User = require('./config/models/user.js'), + flash = require('connect-flash-plus'), + env = require('./config/env/env.js'), + User = require('./config/models.js').user, app = express(), http = require('http').Server(app), io = require('socket.io')(http), @@ -19,24 +20,37 @@ const /* SETUP */ { - /* Database */ mongoose.connect(secret.mongoSetup, { - server:{socketOptions:{ - keepAlive:1, connectTimeoutMS:30000 }}, - replset:{socketOptions:{ - keepAlive:1, connectTimeoutMS:30000 }} - }); - - /* Templates */ nunjucks.configure(__dirname+'/views', { - autoescape: true, - express: app - }); - + + /* Database */ { + + // Setup with native ES6 promises + mongoose.Promise = global.Promise; + + // Connect to database + mongoose.connect(env.mongoSetup, { + server:{socketOptions:{ + keepAlive:1, connectTimeoutMS:30000 }}, + replset:{socketOptions:{ + keepAlive:1, connectTimeoutMS:30000 }} + }) + .then( ()=>{ console.log(`💿 Mongoose connected to mongoDB`); }) + .catch( (err)=>{ console.error(`❌ ${err.stack}`); }); + + } + + /* Templates */ { + nunjucks.configure(__dirname+'/views', { + autoescape: true, + express: app + }); + app.set('view engine','html'); + } + /* Session */ { - app.use(cookieParser(secret.cookie)); - // app.use(expressSession({ + app.use(cookieParser(env.cookie)); app.use(cookieSession({ cookie: {maxAge:60000}, - secret: secret.session, + secret: env.session, saveUninitialized: true, resave: true })); @@ -44,70 +58,104 @@ const app.use(bodyParser.urlencoded({ extended: true })); + app.use(expressValidator()); app.use(flash()); } /* Auth */ { + require('./config/passport.js')(passport); app.use(passport.initialize()); app.use(passport.session()); - require('./config/auth.js'); - passport.serializeUser(function(user,done) { - done(null, user.id); - }); - passport.deserializeUser(function(id,done) { - User.findById(id, function(err, user) { - if(!err) done(null, user); - else done(err, null); - }); - }); } /* Routes */ { - app.get('/favicon.ico', function(req,res){ - res.redirect('/static/img/icon/by/16-32-48.ico'); - }); - app.use('/', - require('./config/routes/index.js'), - require('./config/routes/auth.js'), - require('./config/routes/misc.js') - ); - app.use(['/map','/trac'], require('./config/routes/map.js')); - app.use('/admin', require('./config/routes/admin.js')); - app.use('/static', express.static(__dirname+'/static')); + + // Static files (keep this before setting default locals) + app.use('/static', express.static( __dirname+'/static', {dotfiles:'allow'} )); + + // Set default locals available to all views (keep this after static files) + app.get( '*', (req,res,next)=>{ + + // Path for redirects + let nextPath = ( req.path.substring(0, req.path.indexOf('#')) || req.path ); + if ( nextPath.substring(0,6)!=='/login' && nextPath.substring(0,7)!=='/logout' ){ + req.session.next = nextPath+'#'; + //console.log(`Set redirect path to ${nextPath}#`); + } + + // User account + res.locals.user = req.user; + + // Flash messages + res.locals.successes = req.flash('success'); + res.locals.dangers = req.flash('danger'); + res.locals.warnings = req.flash('warning'); + + next(); + } ); + + // Auth routes + require('./config/routes/auth.js')(app, passport); + + // Main routes + app.use( '/', require('./config/routes/index.js') ); + + // Settings + app.use( '/settings', require('./config/routes/settings.js') ); + + // Map + app.use( ['/map','/trac'], require('./config/routes/map.js') ); + + // Site administration + app.use( '/admin', require('./config/routes/admin.js') ); + + // Testing + if (env.mode == 'development') { + app.use( '/test', require('./config/routes/test.js' ) ); + } + } /* Errors */ { + // Catch-all for 404s - app.use(function(req,res,next) { + app.use( (req,res,next)=>{ if (!res.headersSent) { - var err = new Error('404: Not found: '+req.url); + var err = new Error(`Not found: ${req.url}`); err.status = 404; next(err); } - }); + } ); + + // Production handlers + if (env.mode!=='development') { + app.use( (err,req,res,next)=>{ + if (err.status!==404){ console.error(`❌ ${err.stack}`); } + if (res.headersSent) { return next(err); } + res.status(err.status||500); + res.render('error', { + code: err.status||500, + message: (err.status<=499)?err.message:"Server error" + }); + } ); + } - // Handlers - if (secret.env=='production') { - app.use(function(err,req,res,next) { + // Development handlers + else { + app.use( (err,req,res,next)=>{ + if (err.status!==404) { + console.error(`❌ ${err.stack}`); + } if (res.headersSent) { return next(err); } res.status(err.status||500); - res.render('error.html', { - code: err.status - }); - }); - } - else /* Development */{ - app.use(function(err,req,res,next) { - console.log(err); - if (res.headersSent) { return next(err); } - res.status(err.status||500); - res.render('error.html', { - code: err.status, + res.render('error', { + code: err.status||500, message: err.message, - error: err + stack: err.stack }); - }); + } ); } + } /* Sockets */ { @@ -117,24 +165,25 @@ const } /* RUNTIME */ { + console.log('🖥 Starting Tracman server...'); // Listen - http.listen(secret.port, function(){ - console.log( - '==========================================\n'+ - 'Listening at '+secret.url+ - '\n==========================================' - ); + http.listen( env.port, ()=>{ + console.log(`🌐 Listening in ${env.mode} mode on port ${env.port}... `); // Check for clients for each user - User.find({}, function(err, users){ - if (err) { console.log(`DB error finding all users: ${err.message}`); } - users.forEach( function(user){ + User.find({}) + .then( (users)=>{ + users.forEach( (user)=>{ sockets.checkForUsers( io, user.id ); }); + }) + .catch( (err)=>{ + console.error(`❌ ${err.stack}`); }); }); + } module.exports = app; diff --git a/static/css/base.css b/static/css/base.css index e06b8c5..83e4d07 100644 --- a/static/css/base.css +++ b/static/css/base.css @@ -1,94 +1,66 @@ -/* Resets, Clears & Defaults */ -*, *:after, *:before { +/* Global */ +div, footer, .fa, +.container, .container:before, .container:after { box-sizing: border-box; -}::-webkit-scrollbar { - width: 5vw; - min-width:10px; - max-width:40px; -}::-webkit-scrollbar-track { - background-color: #080808; -}::-webkit-scrollbar-thumb { - border-radius: .2vw; - background: #333; -} - -body { - background-color: #080808; - color: #eee; } body, input, textarea { padding: 0; margin: 0; font-family: 'Open Sans', sans-serif; font-size: 18px; color: #eee; - font-weight: 600; } -.flexbox { - width:100%; - display:flex; - justify-content:space-around; +body { + background-color: #080808; } -.flexbox.stretch { justify-content:space-between; } -pre { - white-space: pre-wrap; - white-space: -moz-pre-wrap; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; +::-webkit-scrollbar { + width: 5vw; + min-width:10px; + max-width:40px; +}::-webkit-scrollbar-track { + background-color: #080808; + background-color: rgba(8,8,8,0); +}::-webkit-scrollbar-thumb { + border-radius: .2vw; + background: #333; } -.dark pre { - -moz-box-shadow: 2px 2px 4px #000; - -webkit-box-shadow: 2px 2px 4px #000; - box-shadow: 2px 2px 4px #000; - background-color: rgba(255,255,255,.03); - color: #aaa; - padding: 1%; - border: 1px solid #ccc; - border-radius: .25rem; +::selection { + background: #999; } -.dark .form-control:disabled, .dark .form-control:disabled { - background-color: rgba(255,255,255,0.1); -} -.input-group { - margin-bottom:30px; -} -input[type="checkbox"] { - margin: 8px 0; -} -.form-group#buttons { - width: 100%; - display: flex; - justify-content: space-around; -} -input[type="checkbox"] { - display: inline-block; -} -.help-block {margin-top:-20px;} -.alert { - z-index:10; -} -.alert:not(.alert-dismissible) { - text-align: center; -} -.alert a { - color: inherit; - text-decoration: underline; -} -.alert a:hover { - color: inherit; - text-decoration: none; -} -input:focus, textarea:focus { - outline: 0; +::-moz-selection { + background: #999; } -h1, h2, h3, p { - margin: 0 0 20px 0; +/* Elements */ +main { + top: 59px; + position: absolute; + left: 0px; + right: 0px; + bottom: 0px; + overflow-y: auto; +} +.container { + padding-right: 5%; + padding-left: 5%; + width: 100%; + margin: 0 auto; +} +.container:after { + content: ""; + display: block; + clear: both; +} +section { + padding: 10vh 0 5vh; +} + +h1, h2, h3 { + margin: 0 0 5% 0; position: relative; z-index: 6; } - -h1,h2,h3,h4 { font-weight: 600; } +/* Font sizes */ +h1, h2, h3, h4 { font-weight: 600; } h1 { font-size: 48px; line-height: 46px; } @@ -98,25 +70,14 @@ h2 { h3 { font-size: 28px; } h4 { font-size: 20px; } -.red { color: #fb6e3d; } - -a { - color: #fbc93d; - text-decoration: none; +p, main ul { + margin-top: 0; + margin-bottom: 10vh; } -a:hover { - color: #fbc93d; - text-decoration: underline; +hr { + width: 90%; + margin: 10% auto; } -.light a { - color:#111; - text-decoration: underline; -} -.light a:hover { - color:#111; - text-decoration: none; -} - img { max-width: 100%; } @@ -124,84 +85,102 @@ p img { display: block; margin: auto; } - -input[type="checkbox"] { - width: auto; - margin: 8px; -} -.with-errors { - color: #d9534f; +pre { + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; } -::selection { - background: #999; -} -::-moz-selection { - background: #999; -} - -/* End Resets, Clears & Defaults */ - -.container { - width: 100%; - max-width: 1000px; - margin: 0 auto; -} -.container:after { - content: ""; - display: block; - clear: both; -} -section { - padding: 100px 0 50px; -} - -.btn { +a { + color: #fbc93d; text-decoration: none; +} +main a:hover:not(.btn) { + color: #fbc93d; + text-decoration: underline; +} +a.underline { + text-decoration: underline; +} +a.underline:hover:not(.btn) { + text-decoration: none; +} + +/* Modifiers */ +.hide { display: none !important; } +.red, .red:hover { color: #fb6e3d !important; } +.yellow, .yellow:hover { color: #fbc93d !important; } +.green, .green:hover { color: #8ae137 !important; } +.inline { display: inline; } +.inline-block { display: inline-block; } + +.shadow { + -moz-box-shadow: .18vw .18vw .36vw #000; + -webkit-box-shadow: .18vw .18vw .36vw #000; + box-shadow: .18vw .18vw .36vw #000; +} .shadow:active { + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.inline { display: inline-block; } +.flex { + width: 100%; + display: flex; + justify-content: space-around; +} +.flex.stretch { justify-content: space-between; } +.left { float: left; } +.right { float: right; } + + +/* Buttons */ +.btn { font-weight:600; display: inline-block; padding: 15px 30px; - transition: 200ms; - background: transparent; - cursor: pointer; - -moz-box-shadow: 2px 2px 4px #000; - -webkit-box-shadow: 2px 2px 4px #000; - box-shadow: 2px 2px 4px #000; -} -.dark .btn { - color: #fff; - border: 1px solid #fff; -} -.dark .btn:hover:not(.disabled), -.dark .btn:active:not(.disabled), -.dark .btn:focus:not(.disabled) { background: rgba(255,255,255,0.1); -}.dark.btn:active:not(.disabled) { - -moz-box-shadow: 0; - -webkit-box-shadow: 0; - box-shadow: 0; -} -.light .btn { - color: #222; + color: #eee; + border-radius: .5vw; +} .btn:not(:disabled) { + border: 1px solid #666; + transition: 100ms; + cursor: pointer; + -moz-box-shadow: + inset .11vw .18vw .52vw rgba(255,255,255,.2), + inset -.11vw -.18vw .52vw rgba(0,0,0,.4), + .1vw .1vw .52vw #000; + -webkit-box-shadow: + inset .11vw .18vw .52vw rgba(255,255,255,.2), + inset -.11vw -.18vw .52vw rgba(0,0,0,.4), + .1vw .1vw .36vw #000; + box-shadow: + inset .11vw .18vw .52vw rgba(255,255,255,.2), + inset -.11vw -.18vw .52vw rgba(0,0,0,.4), + .1vw .1vw .36vw #000; +} .btn:disabled { + color: #aaa; + border: 1px solid #444; +} .btn:hover:not(:disabled) { text-decoration: none; - border: 1px solid #222; -} -.light .btn:hover:not(.disabled), -.light .btn:active:not(.disabled), -.light .btn:focus:not(.disabled) { - background: rgba(0,0,0,0.1); -} -.btn.yellow { - color: #fbc93d; + background: rgba(255,255,255,0.2); +} .btn:active:not(:disabled) { + -moz-box-shadow: + inset .11vw .18vw .52vw rgba(0,0,0,.4), + inset -.11vw -.18vw .52vw rgba(255,255,255,.2); + -webkit-box-shadow: + inset .11vw .18vw .52vw rgba(0,0,0,.4), + inset -.11vw -.18vw .52vw rgba(255,255,255,.2); + box-shadow: + inset .11vw .18vw .52vw rgba(0,0,0,.4), + inset -.11vw -.18vw .52vw rgba(255,255,255,.2); +} .btn:focus:not(:disabled){ border: 1px solid #fbc93d; } -.dark .btn.yellow:hover:not(.disabled), -.dark .btn.yellow:active:not(.disabled), -.dark .btn.yellow:focus:not(.disabled) { - background: rgba(251,201,61,0.1); -} -.btn.smaller { - padding: 10px 25px; +.btn.main:not(:disabled) { + color: #fbc93d; } .btn .fa { margin-left: 10px; diff --git a/static/css/bootstrap.css b/static/css/bootstrap.css deleted file mode 100644 index 8875db2..0000000 --- a/static/css/bootstrap.css +++ /dev/null @@ -1,6229 +0,0 @@ -/*! - * Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden], -template { - display: none; -} - -a { - background-color: transparent; -} - -a:active { - outline: 0; -} - -a:hover { - outline: 0; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -h1 { - margin: .67em 0; - font-size: 2em; -} - -mark { - color: #000; - background: #ff0; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -.5em; -} - -sub { - bottom: -.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 1em 40px; -} - -hr { - height: 0; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} - -pre { - overflow: auto; -} - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} - -button { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -input { - line-height: normal; -} - -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} - -legend { - padding: 0; - border: 0; -} - -textarea { - overflow: auto; -} - -optgroup { - font-weight: bold; -} - -table { - border-spacing: 0; - border-collapse: collapse; -} - -td, -th { - padding: 0; -} - -@media print { - *, - *::before, - *::after { - text-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - abbr[title]::after { - content: " (" attr(title) ")"; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -html { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} - -*, -*::before, -*::after { - -webkit-box-sizing: inherit; - box-sizing: inherit; -} - -@-moz-viewport { - width: device-width; -} - -@-ms-viewport { - width: device-width; -} - -@-webkit-viewport { - width: device-width; -} - -@viewport { - width: device-width; -} - -html { - font-size: 16px; - - -webkit-tap-highlight-color: transparent; -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 1rem; - line-height: 1.5; - color: #373a3c; - background-color: #fff; -} - -[tabindex="-1"]:focus { - outline: none !important; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: .5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #818a91; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: bold; -} - -dd { - margin-bottom: .5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -a { - text-decoration: none; -} - -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; -} - -[role="button"] { - cursor: pointer; -} - -a, -area, -button, -[role="button"], -input, -label, -select, -summary, -textarea { - -ms-touch-action: manipulation; - touch-action: manipulation; -} - -table { - background-color: transparent; -} - -caption { - padding-top: .75rem; - padding-bottom: .75rem; - color: #818a91; - text-align: left; - caption-side: bottom; -} - -th { - text-align: left; -} - -label { - display: inline-block; - margin-bottom: .5rem; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -textarea { - margin: 0; - line-height: inherit; - border-radius: 0; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin: 2rem 0 1rem; - font-size: 1.5rem; - line-height: inherit; -} - -input[type="search"] { - -webkit-box-sizing: inherit; - box-sizing: inherit; - -webkit-appearance: none; -} - -output { - display: inline-block; -} - -[hidden] { - display: none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: .5rem; - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -h1 { - font-size: 2.5rem; -} - -h2 { - font-size: 2rem; -} - -h3 { - font-size: 1.75rem; -} - -h4 { - font-size: 1.5rem; -} - -h5 { - font-size: 1.25rem; -} - -h6 { - font-size: 1rem; -} - -.h1 { - font-size: 2.5rem; -} - -.h2 { - font-size: 2rem; -} - -.h3 { - font-size: 1.75rem; -} - -.h4 { - font-size: 1.5rem; -} - -.h5 { - font-size: 1.25rem; -} - -.h6 { - font-size: 1rem; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: 6rem; - font-weight: 300; -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, .1); -} - -small, -.small { - font-size: 80%; - font-weight: normal; -} - -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} - -.list-inline-item:not(:last-child) { - margin-right: 5px; -} - -.dl-horizontal { - margin-right: -1.875rem; - margin-left: -1.875rem; -} - -.dl-horizontal::after { - display: table; - clear: both; - content: ""; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -.blockquote { - padding: .5rem 1rem; - margin-bottom: 1rem; - font-size: 1.25rem; - border-left: .25rem solid #eceeef; -} - -.blockquote-footer { - display: block; - font-size: 80%; - line-height: 1.5; - color: #818a91; -} - -.blockquote-footer::before { - content: "\2014 \00A0"; -} - -.blockquote-reverse { - padding-right: 1rem; - padding-left: 0; - text-align: right; - border-right: .25rem solid #eceeef; - border-left: 0; -} - -.blockquote-reverse .blockquote-footer::before { - content: ""; -} - -.blockquote-reverse .blockquote-footer::after { - content: "\00A0 \2014"; -} - -.img-fluid, .carousel-inner > .carousel-item > img, -.carousel-inner > .carousel-item > a > img { - display: block; - max-width: 100%; - height: auto; -} - -.img-rounded { - border-radius: .3rem; -} - -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: .25rem; - line-height: 1.5; - background-color: #fff; - border: 1px solid #ddd; - border-radius: .25rem; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} - -.img-circle { - border-radius: 50%; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: .5rem; - line-height: 1; -} - -.figure-caption { - font-size: 90%; - color: #818a91; -} - -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} - -code { - padding: .2rem .4rem; - font-size: 90%; - color: #bd4147; - background-color: #f7f7f9; - border-radius: .25rem; -} - -kbd { - padding: .2rem .4rem; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: .2rem; -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - font-size: 90%; - line-height: 1.5; - color: #373a3c; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - background-color: transparent; - border-radius: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - padding-right: .9375rem; - padding-left: .9375rem; - margin-right: auto; - margin-left: auto; -} - -.container::after { - display: table; - clear: both; - content: ""; -} - -@media (min-width: 544px) { - .container { - max-width: 576px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 720px; - } -} - -@media (min-width: 992px) { - .container { - max-width: 940px; - } -} - -@media (min-width: 1200px) { - .container { - max-width: 1140px; - } -} - -.container-fluid { - padding-right: .9375rem; - padding-left: .9375rem; - margin-right: auto; - margin-left: auto; -} - -.container-fluid::after { - display: table; - clear: both; - content: ""; -} - -.row { - margin-right: -.9375rem; - margin-left: -.9375rem; -} - -.row::after { - display: table; - clear: both; - content: ""; -} - -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { - position: relative; - min-height: 1px; -} - -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} - -.col-xs-1 { - width: 8.333333%; -} - -.col-xs-2 { - width: 16.666667%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-4 { - width: 33.333333%; -} - -.col-xs-5 { - width: 41.666667%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-7 { - width: 58.333333%; -} - -.col-xs-8 { - width: 66.666667%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-10 { - width: 83.333333%; -} - -.col-xs-11 { - width: 91.666667%; -} - -.col-xs-12 { - width: 100%; -} - -.col-xs-pull-0 { - right: auto; -} - -.col-xs-pull-1 { - right: 8.333333%; -} - -.col-xs-pull-2 { - right: 16.666667%; -} - -.col-xs-pull-3 { - right: 25%; -} - -.col-xs-pull-4 { - right: 33.333333%; -} - -.col-xs-pull-5 { - right: 41.666667%; -} - -.col-xs-pull-6 { - right: 50%; -} - -.col-xs-pull-7 { - right: 58.333333%; -} - -.col-xs-pull-8 { - right: 66.666667%; -} - -.col-xs-pull-9 { - right: 75%; -} - -.col-xs-pull-10 { - right: 83.333333%; -} - -.col-xs-pull-11 { - right: 91.666667%; -} - -.col-xs-pull-12 { - right: 100%; -} - -.col-xs-push-0 { - left: auto; -} - -.col-xs-push-1 { - left: 8.333333%; -} - -.col-xs-push-2 { - left: 16.666667%; -} - -.col-xs-push-3 { - left: 25%; -} - -.col-xs-push-4 { - left: 33.333333%; -} - -.col-xs-push-5 { - left: 41.666667%; -} - -.col-xs-push-6 { - left: 50%; -} - -.col-xs-push-7 { - left: 58.333333%; -} - -.col-xs-push-8 { - left: 66.666667%; -} - -.col-xs-push-9 { - left: 75%; -} - -.col-xs-push-10 { - left: 83.333333%; -} - -.col-xs-push-11 { - left: 91.666667%; -} - -.col-xs-push-12 { - left: 100%; -} - -.col-xs-offset-0 { - margin-left: 0; -} - -.col-xs-offset-1 { - margin-left: 8.333333%; -} - -.col-xs-offset-2 { - margin-left: 16.666667%; -} - -.col-xs-offset-3 { - margin-left: 25%; -} - -.col-xs-offset-4 { - margin-left: 33.333333%; -} - -.col-xs-offset-5 { - margin-left: 41.666667%; -} - -.col-xs-offset-6 { - margin-left: 50%; -} - -.col-xs-offset-7 { - margin-left: 58.333333%; -} - -.col-xs-offset-8 { - margin-left: 66.666667%; -} - -.col-xs-offset-9 { - margin-left: 75%; -} - -.col-xs-offset-10 { - margin-left: 83.333333%; -} - -.col-xs-offset-11 { - margin-left: 91.666667%; -} - -.col-xs-offset-12 { - margin-left: 100%; -} - -@media (min-width: 544px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-1 { - width: 8.333333%; - } - .col-sm-2 { - width: 16.666667%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-4 { - width: 33.333333%; - } - .col-sm-5 { - width: 41.666667%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-7 { - width: 58.333333%; - } - .col-sm-8 { - width: 66.666667%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-10 { - width: 83.333333%; - } - .col-sm-11 { - width: 91.666667%; - } - .col-sm-12 { - width: 100%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-pull-1 { - right: 8.333333%; - } - .col-sm-pull-2 { - right: 16.666667%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-4 { - right: 33.333333%; - } - .col-sm-pull-5 { - right: 41.666667%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-7 { - right: 58.333333%; - } - .col-sm-pull-8 { - right: 66.666667%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-10 { - right: 83.333333%; - } - .col-sm-pull-11 { - right: 91.666667%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-push-1 { - left: 8.333333%; - } - .col-sm-push-2 { - left: 16.666667%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-4 { - left: 33.333333%; - } - .col-sm-push-5 { - left: 41.666667%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-7 { - left: 58.333333%; - } - .col-sm-push-8 { - left: 66.666667%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-10 { - left: 83.333333%; - } - .col-sm-push-11 { - left: 91.666667%; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-offset-0 { - margin-left: 0; - } - .col-sm-offset-1 { - margin-left: 8.333333%; - } - .col-sm-offset-2 { - margin-left: 16.666667%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-4 { - margin-left: 33.333333%; - } - .col-sm-offset-5 { - margin-left: 41.666667%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-7 { - margin-left: 58.333333%; - } - .col-sm-offset-8 { - margin-left: 66.666667%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-10 { - margin-left: 83.333333%; - } - .col-sm-offset-11 { - margin-left: 91.666667%; - } - .col-sm-offset-12 { - margin-left: 100%; - } -} - -@media (min-width: 768px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-1 { - width: 8.333333%; - } - .col-md-2 { - width: 16.666667%; - } - .col-md-3 { - width: 25%; - } - .col-md-4 { - width: 33.333333%; - } - .col-md-5 { - width: 41.666667%; - } - .col-md-6 { - width: 50%; - } - .col-md-7 { - width: 58.333333%; - } - .col-md-8 { - width: 66.666667%; - } - .col-md-9 { - width: 75%; - } - .col-md-10 { - width: 83.333333%; - } - .col-md-11 { - width: 91.666667%; - } - .col-md-12 { - width: 100%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-pull-1 { - right: 8.333333%; - } - .col-md-pull-2 { - right: 16.666667%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-4 { - right: 33.333333%; - } - .col-md-pull-5 { - right: 41.666667%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-7 { - right: 58.333333%; - } - .col-md-pull-8 { - right: 66.666667%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-10 { - right: 83.333333%; - } - .col-md-pull-11 { - right: 91.666667%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-push-0 { - left: auto; - } - .col-md-push-1 { - left: 8.333333%; - } - .col-md-push-2 { - left: 16.666667%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-4 { - left: 33.333333%; - } - .col-md-push-5 { - left: 41.666667%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-7 { - left: 58.333333%; - } - .col-md-push-8 { - left: 66.666667%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-10 { - left: 83.333333%; - } - .col-md-push-11 { - left: 91.666667%; - } - .col-md-push-12 { - left: 100%; - } - .col-md-offset-0 { - margin-left: 0; - } - .col-md-offset-1 { - margin-left: 8.333333%; - } - .col-md-offset-2 { - margin-left: 16.666667%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-4 { - margin-left: 33.333333%; - } - .col-md-offset-5 { - margin-left: 41.666667%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-7 { - margin-left: 58.333333%; - } - .col-md-offset-8 { - margin-left: 66.666667%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-10 { - margin-left: 83.333333%; - } - .col-md-offset-11 { - margin-left: 91.666667%; - } - .col-md-offset-12 { - margin-left: 100%; - } -} - -@media (min-width: 992px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-1 { - width: 8.333333%; - } - .col-lg-2 { - width: 16.666667%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-4 { - width: 33.333333%; - } - .col-lg-5 { - width: 41.666667%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-7 { - width: 58.333333%; - } - .col-lg-8 { - width: 66.666667%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-10 { - width: 83.333333%; - } - .col-lg-11 { - width: 91.666667%; - } - .col-lg-12 { - width: 100%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-pull-1 { - right: 8.333333%; - } - .col-lg-pull-2 { - right: 16.666667%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-4 { - right: 33.333333%; - } - .col-lg-pull-5 { - right: 41.666667%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-7 { - right: 58.333333%; - } - .col-lg-pull-8 { - right: 66.666667%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-10 { - right: 83.333333%; - } - .col-lg-pull-11 { - right: 91.666667%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-push-1 { - left: 8.333333%; - } - .col-lg-push-2 { - left: 16.666667%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-4 { - left: 33.333333%; - } - .col-lg-push-5 { - left: 41.666667%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-7 { - left: 58.333333%; - } - .col-lg-push-8 { - left: 66.666667%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-10 { - left: 83.333333%; - } - .col-lg-push-11 { - left: 91.666667%; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-offset-0 { - margin-left: 0; - } - .col-lg-offset-1 { - margin-left: 8.333333%; - } - .col-lg-offset-2 { - margin-left: 16.666667%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-4 { - margin-left: 33.333333%; - } - .col-lg-offset-5 { - margin-left: 41.666667%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-7 { - margin-left: 58.333333%; - } - .col-lg-offset-8 { - margin-left: 66.666667%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-10 { - margin-left: 83.333333%; - } - .col-lg-offset-11 { - margin-left: 91.666667%; - } - .col-lg-offset-12 { - margin-left: 100%; - } -} - -@media (min-width: 1200px) { - .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12 { - float: left; - } - .col-xl-1 { - width: 8.333333%; - } - .col-xl-2 { - width: 16.666667%; - } - .col-xl-3 { - width: 25%; - } - .col-xl-4 { - width: 33.333333%; - } - .col-xl-5 { - width: 41.666667%; - } - .col-xl-6 { - width: 50%; - } - .col-xl-7 { - width: 58.333333%; - } - .col-xl-8 { - width: 66.666667%; - } - .col-xl-9 { - width: 75%; - } - .col-xl-10 { - width: 83.333333%; - } - .col-xl-11 { - width: 91.666667%; - } - .col-xl-12 { - width: 100%; - } - .col-xl-pull-0 { - right: auto; - } - .col-xl-pull-1 { - right: 8.333333%; - } - .col-xl-pull-2 { - right: 16.666667%; - } - .col-xl-pull-3 { - right: 25%; - } - .col-xl-pull-4 { - right: 33.333333%; - } - .col-xl-pull-5 { - right: 41.666667%; - } - .col-xl-pull-6 { - right: 50%; - } - .col-xl-pull-7 { - right: 58.333333%; - } - .col-xl-pull-8 { - right: 66.666667%; - } - .col-xl-pull-9 { - right: 75%; - } - .col-xl-pull-10 { - right: 83.333333%; - } - .col-xl-pull-11 { - right: 91.666667%; - } - .col-xl-pull-12 { - right: 100%; - } - .col-xl-push-0 { - left: auto; - } - .col-xl-push-1 { - left: 8.333333%; - } - .col-xl-push-2 { - left: 16.666667%; - } - .col-xl-push-3 { - left: 25%; - } - .col-xl-push-4 { - left: 33.333333%; - } - .col-xl-push-5 { - left: 41.666667%; - } - .col-xl-push-6 { - left: 50%; - } - .col-xl-push-7 { - left: 58.333333%; - } - .col-xl-push-8 { - left: 66.666667%; - } - .col-xl-push-9 { - left: 75%; - } - .col-xl-push-10 { - left: 83.333333%; - } - .col-xl-push-11 { - left: 91.666667%; - } - .col-xl-push-12 { - left: 100%; - } - .col-xl-offset-0 { - margin-left: 0; - } - .col-xl-offset-1 { - margin-left: 8.333333%; - } - .col-xl-offset-2 { - margin-left: 16.666667%; - } - .col-xl-offset-3 { - margin-left: 25%; - } - .col-xl-offset-4 { - margin-left: 33.333333%; - } - .col-xl-offset-5 { - margin-left: 41.666667%; - } - .col-xl-offset-6 { - margin-left: 50%; - } - .col-xl-offset-7 { - margin-left: 58.333333%; - } - .col-xl-offset-8 { - margin-left: 66.666667%; - } - .col-xl-offset-9 { - margin-left: 75%; - } - .col-xl-offset-10 { - margin-left: 83.333333%; - } - .col-xl-offset-11 { - margin-left: 91.666667%; - } - .col-xl-offset-12 { - margin-left: 100%; - } -} - -.table { - width: 100%; - max-width: 100%; - margin-bottom: 1rem; -} - -.table th, -.table td { - padding: .75rem; - line-height: 1.5; - vertical-align: top; - border-top: 1px solid #eceeef; -} - -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #eceeef; -} - -.table tbody + tbody { - border-top: 2px solid #eceeef; -} - -.table .table { - background-color: #fff; -} - -.table-sm th, -.table-sm td { - padding: .3rem; -} - -.table-bordered { - border: 1px solid #eceeef; -} - -.table-bordered th, -.table-bordered td { - border: 1px solid #eceeef; -} - -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover { - background-color: rgba(255,255,255,0.075); -} - -.table-active, -.table-active > th, -.table-active > td { - background-color: #050505; -} - -.table-hover .table-active:hover { - background-color: #181818; -} - -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: #181818; -} - -.table-success, -.table-success > th, -.table-success > td { - background-color: #003600; - color: #d0e9c6; -} -.table-hover .table-success:hover { - background-color: #0c460d; - color: #dff0d8; -} - -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #0c460d; - color: #dff0d8; -} - -.table-info, -.table-info > th, -.table-info > td { - background-color: #00304f; - color: #c4e3f3; -} - -.table-hover .table-info:hover { - background-color: #064564; - color: #d9edf7; -} - -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #064564; - color: #d9edf7; -} - -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #fcf8e3; -} - -.table-hover .table-warning:hover { - background-color: #faf2cc; -} - -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #faf2cc; -} - -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #691412; - color: #ebcccc; -} - -.table-hover .table-danger:hover { - background-color: #6e1917; - color: #f2dede; -} - -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #6e1917; - color: #f2dede; -} - -.table-responsive { - display: block; - width: 100%; - min-height: .01%; - overflow-x: auto; -} - -.thead-inverse th { - color: #fff; - background-color: #373a3c; -} - -.thead-default th { - color: #55595c; - background-color: #eceeef; -} - -.table-inverse { - color: #eceeef; - background-color: #373a3c; -} - -.table-inverse.table-bordered { - border: 0; -} - -.table-inverse th, -.table-inverse td, -.table-inverse thead th { - border-color: #55595c; -} - -.table-reflow thead { - float: left; -} - -.table-reflow tbody { - display: block; - white-space: nowrap; -} - -.table-reflow th, -.table-reflow td { - border-top: 1px solid #eceeef; - border-left: 1px solid #eceeef; -} - -.table-reflow th:last-child, -.table-reflow td:last-child { - border-right: 1px solid #eceeef; -} - -.table-reflow thead:last-child tr:last-child th, -.table-reflow thead:last-child tr:last-child td, -.table-reflow tbody:last-child tr:last-child th, -.table-reflow tbody:last-child tr:last-child td, -.table-reflow tfoot:last-child tr:last-child th, -.table-reflow tfoot:last-child tr:last-child td { - border-bottom: 1px solid #eceeef; -} - -.table-reflow tr { - float: left; -} - -.table-reflow tr th, -.table-reflow tr td { - display: block !important; - border: 1px solid #eceeef; -} - -.form-control { - display: block; - width: 100%; - padding: .375rem .75rem; - font-size: 1rem; - line-height: 1.5; - color: #eee; - background-color: transparent; - background-image: none; - border: 1px solid #ccc; - border-radius: .25rem; -} -input[type="checkbox"].form-control { - width: auto; -} - -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} - -.form-control:focus { - border-color: #66afe9; - color:#fff; - outline: none; -} - -.form-control::-webkit-input-placeholder { - color: #999; - opacity: 1; -} - -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} - -.form-control:-ms-input-placeholder { - color: #999; - opacity: 1; -} - -.form-control::placeholder { - color: #999; - opacity: 1; -} - -.form-control:disabled, .form-control[readonly] { - background-color: #eceeef; - opacity: 1; -} - -.form-control:disabled { - cursor: not-allowed; -} - -.form-control-file, -.form-control-range { - display: block; -} - -.form-control-label { - padding: .375rem .75rem; - margin-bottom: 0; -} - -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 2.25rem; - } - input[type="date"].input-sm, - .input-group-sm input[type="date"].form-control, - input[type="time"].input-sm, - .input-group-sm - input[type="time"].form-control, - input[type="datetime-local"].input-sm, - .input-group-sm - input[type="datetime-local"].form-control, - input[type="month"].input-sm, - .input-group-sm - input[type="month"].form-control { - line-height: 1.8625rem; - } - input[type="date"].input-lg, - .input-group-lg input[type="date"].form-control, - input[type="time"].input-lg, - .input-group-lg - input[type="time"].form-control, - input[type="datetime-local"].input-lg, - .input-group-lg - input[type="datetime-local"].form-control, - input[type="month"].input-lg, - .input-group-lg - input[type="month"].form-control { - line-height: 3.166667rem; - } -} - -.form-control-static { - min-height: 2.25rem; - padding-top: .375rem; - padding-bottom: .375rem; - margin-bottom: 0; -} - -.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control, -.input-group-sm > .form-control-static.input-group-addon, -.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control, -.input-group-lg > .form-control-static.input-group-addon, -.input-group-lg > .input-group-btn > .form-control-static.btn { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm, .input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - padding: .275rem .75rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem; -} - -.form-control-lg, .input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - padding: .75rem 1.25rem; - font-size: 1.25rem; - line-height: 1.333333; - border-radius: .3rem; -} - -.form-group:last { - margin-bottom: 1rem; -} - -.radio, -.checkbox { - position: relative; - display: block; - margin-bottom: .75rem; -} - -.radio label, -.checkbox label { - padding-left: 1.25rem; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio label input:only-child, -.checkbox label input:only-child { - position: static; -} - -/* -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: .25rem; - margin-left: -1.25rem; -} -*/ - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -.25rem; -} - -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - margin-bottom: 0; - padding-right: 1.25rem; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: .75rem; -} - -input[type="radio"]:disabled, input[type="radio"].disabled, -input[type="checkbox"]:disabled, -input[type="checkbox"].disabled { - cursor: not-allowed; -} - -.radio-inline.disabled, -.checkbox-inline.disabled { - cursor: not-allowed; -} - -.radio.disabled label, -.checkbox.disabled label { - cursor: not-allowed; -} - -.form-control-success, -.form-control-warning, -.form-control-danger { - padding-right: 2.25rem; - background-repeat: no-repeat; - background-position: center right .5625rem; - -webkit-background-size: 1.4625rem 1.4625rem; - background-size: 1.4625rem 1.4625rem; -} - -.has-success .text-help, -.has-success .form-control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #5cb85c; -} - -.has-success .form-control { - border-color: #5cb85c; -} - -.has-success .input-group-addon { - color: #5cb85c; - border-color: #5cb85c; -} - -.has-success .form-control-feedback { - color: #5cb85c; -} - -.has-success .form-control-success { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNzkyIj48cGF0aCBmaWxsPSIjNWNiODVjIiBkPSJNMjMzLjggNjEwYy0xMy4zIDAtMjYtNi0zNC0xNi44TDkwLjUgNDQ4LjhDNzYuMyA0MzAgODAgNDAzLjMgOTguOCAzODljMTguOC0xNC4yIDQ1LjUtMTAuNCA1OS44IDguNGw3MiA5NUw0NTEuMyAyNDJjMTIuNS0yMCAzOC44LTI2LjIgNTguOC0xMy43IDIwIDEyLjQgMjYgMzguNyAxMy43IDU4LjhMMjcwIDU5MGMtNy40IDEyLTIwLjIgMTkuNC0zNC4zIDIwaC0yeiIvPjwvc3ZnPg=="); -} - -.has-warning .text-help, -.has-warning .form-control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #f0ad4e; -} - -.has-warning .form-control { - border-color: #f0ad4e; -} - -.has-warning .input-group-addon { - color: #f0ad4e; - border-color: #f0ad4e; -} - -.has-warning .form-control-feedback { - color: #f0ad4e; -} - -.has-warning .form-control-warning { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNzkyIj48cGF0aCBmaWxsPSIjZjBhZDRlIiBkPSJNNjAzIDY0MC4ybC0yNzguNS01MDljLTMuOC02LjYtMTAuOC0xMC42LTE4LjUtMTAuNnMtMTQuNyA0LTE4LjUgMTAuNkw5IDY0MC4yYy0zLjcgNi41LTMuNiAxNC40LjIgMjAuOCAzLjggNi41IDEwLjggMTAuNCAxOC4zIDEwLjRoNTU3YzcuNiAwIDE0LjYtNCAxOC40LTEwLjQgMy41LTYuNCAzLjYtMTQuNCAwLTIwLjh6bS0yNjYuNC0zMGgtNjEuMlY1NDloNjEuMnY2MS4yem0wLTEwN2gtNjEuMlYzMDRoNjEuMnYxOTl6Ii8+PC9zdmc+"); -} - -.has-danger .text-help, -.has-danger .form-control-label, -.has-danger .radio, -.has-danger .checkbox, -.has-danger .radio-inline, -.has-danger .checkbox-inline, -.has-danger.radio label, -.has-danger.checkbox label, -.has-danger.radio-inline label, -.has-danger.checkbox-inline label { - color: #d9534f; -} - -.has-danger .form-control { - border-color: #d9534f; -} - -.has-danger .input-group-addon { - color: #d9534f; - border-color: #d9534f; -} - -.has-danger .form-control-feedback { - color: #d9534f; -} - -.has-danger .form-control-danger { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNzkyIj48cGF0aCBmaWxsPSIjZDk1MzRmIiBkPSJNNDQ3IDU0NC40Yy0xNC40IDE0LjQtMzcuNiAxNC40LTUyIDBsLTg5LTkyLjctODkgOTIuN2MtMTQuNSAxNC40LTM3LjcgMTQuNC01MiAwLTE0LjQtMTQuNC0xNC40LTM3LjYgMC01Mmw5Mi40LTk2LjMtOTIuNC05Ni4zYy0xNC40LTE0LjQtMTQuNC0zNy42IDAtNTJzMzcuNi0xNC4zIDUyIDBsODkgOTIuOCA4OS4yLTkyLjdjMTQuNC0xNC40IDM3LjYtMTQuNCA1MiAwIDE0LjMgMTQuNCAxNC4zIDM3LjYgMCA1MkwzNTQuNiAzOTZsOTIuNCA5Ni40YzE0LjQgMTQuNCAxNC40IDM3LjYgMCA1MnoiLz48L3N2Zz4="); -} - -@media (min-width: 544px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .form-control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} - -.btn { - display: inline-block; - padding: .375rem 1rem; - font-size: 1rem; - font-weight: normal; - line-height: 1.5; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - border: 1px solid transparent; - border-radius: .25rem; -} - -.btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn:focus, .btn:hover { - text-decoration: none; -} - -.btn.focus { - text-decoration: none; -} - -.btn:active, .btn.active { - background-image: none; - outline: 0; -} - -.btn.disabled, .btn:disabled { - cursor: not-allowed; - opacity: .65; -} - -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} - -.btn-primary { - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-primary:hover { - color: #fff; - background-color: #025aa5; - border-color: #01549b; -} - -.btn-primary:focus, .btn-primary.focus { - color: #fff; - background-color: #025aa5; - border-color: #01549b; -} - -.btn-primary:active, .btn-primary.active, -.open > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #025aa5; - background-image: none; - border-color: #01549b; -} - -.btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, -.open > .btn-primary.dropdown-toggle:hover, -.open > .btn-primary.dropdown-toggle:focus, -.open > .btn-primary.dropdown-toggle.focus { - color: #fff; - background-color: #014682; - border-color: #01315a; -} - -.btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary:disabled:focus, .btn-primary:disabled.focus { - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-primary.disabled:hover, .btn-primary:disabled:hover { - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-secondary { - color: #373a3c; - background-color: #fff; - border-color: #ccc; -} - -.btn-secondary:hover { - color: #373a3c; - background-color: #e6e6e6; - border-color: #adadad; -} - -.btn-secondary:focus, .btn-secondary.focus { - color: #373a3c; - background-color: #e6e6e6; - border-color: #adadad; -} - -.btn-secondary:active, .btn-secondary.active, -.open > .btn-secondary.dropdown-toggle { - color: #373a.form-group { - margin-bottom: 15px; -}3c; - background-color: #e6e6e6; - background-image: none; - border-color: #adadad; -} - -.btn-secondary:active:hover, .btn-secondary:active:focus, .btn-secondary:active.focus, .btn-secondary.active:hover, .btn-secondary.active:focus, .btn-secondary.active.focus, -.open > .btn-secondary.dropdown-toggle:hover, -.open > .btn-secondary.dropdown-toggle:focus, -.open > .btn-secondary.dropdown-toggle.focus { - color: #373a3c; - background-color: #d4d4d4; - border-color: #8c8c8c; -} - -.btn-secondary.disabled:focus, .btn-secondary.disabled.focus, .btn-secondary:disabled:focus, .btn-secondary:disabled.focus { - background-color: #fff; - border-color: #ccc; -} - -.btn-secondary.disabled:hover, .btn-secondary:disabled:hover { - background-color: #fff; - border-color: #ccc; -} - -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #2aabd2; -} - -.btn-info:focus, .btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #2aabd2; -} - -.btn-info:active, .btn-info.active, -.open > .btn-info.dropdown-toggle { - color: #fff; - background-color: #31b0d5; - background-image: none; - border-color: #2aabd2; -} - -.btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, -.open > .btn-info.dropdown-toggle:hover, -.open > .btn-info.dropdown-toggle:focus, -.open > .btn-info.dropdown-toggle.focus { - color: #fff; - background-color: #269abc; - border-color: #1f7e9a; -} - -.btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info:disabled:focus, .btn-info:disabled.focus { - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-info.disabled:hover, .btn-info:disabled:hover { - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #419641; -} - -.btn-success:focus, .btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #419641; -} - -.btn-success:active, .btn-success.active, -.open > .btn-success.dropdown-toggle { - color: #fff; - background-color: #449d44; - background-image: none; - border-color: #419641; -} - -.btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, -.open > .btn-success.dropdown-toggle:hover, -.open > .btn-success.dropdown-toggle:focus, -.open > .btn-success.dropdown-toggle.focus { - color: #fff; - background-color: #398439; - border-color: #2d672d; -} - -.btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success:disabled:focus, .btn-success:disabled.focus { - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-success.disabled:hover, .btn-success:disabled:hover { - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #eb9316; -} - -.btn-warning:focus, .btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #eb9316; -} - -.btn-warning:active, .btn-warning.active, -.open > .btn-warning.dropdown-toggle { - color: #fff; - background-color: #ec971f; - background-image: none; - border-color: #eb9316; -} - -.btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, -.open > .btn-warning.dropdown-toggle:hover, -.open > .btn-warning.dropdown-toggle:focus, -.open > .btn-warning.dropdown-toggle.focus { - color: #fff; - background-color: #d58512; - border-color: #b06d0f; -} - -.btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning:disabled:focus, .btn-warning:disabled.focus { - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-warning.disabled:hover, .btn-warning:disabled:hover { - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #c12e2a; -} - -.btn-danger:focus, .btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #c12e2a; -} - -.btn-danger:active, .btn-danger.active, -.open > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #c9302c; - background-image: none; - border-color: #c12e2a; -} - -.btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, -.open > .btn-danger.dropdown-toggle:hover, -.open > .btn-danger.dropdown-toggle:focus, -.open > .btn-danger.dropdown-toggle.focus { - color: #fff; - background-color: #ac2925; - border-color: #8b211e; -} - -.btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger:disabled:focus, .btn-danger:disabled.focus { - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-danger.disabled:hover, .btn-danger:disabled:hover { - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-primary-outline { - color: #0275d8; - background-color: transparent; - background-image: none; - border-color: #0275d8; -} - -.btn-primary-outline:focus, .btn-primary-outline.focus, .btn-primary-outline:active, .btn-primary-outline.active, -.open > .btn-primary-outline.dropdown-toggle { - color: #000; - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-primary-outline:hover { - color: #000; - background-color: #0275d8; - border-color: #0275d8; -} - -.btn-primary-outline.disabled:focus, .btn-primary-outline.disabled.focus, .btn-primary-outline:disabled:focus, .btn-primary-outline:disabled.focus { - border-color: #43a7fd; -} - -.btn-primary-outline.disabled:hover, .btn-primary-outline:disabled:hover { - border-color: #43a7fd; -} - -.btn-secondary-outline { - color: #ccc; - background-color: transparent; - background-image: none; - border-color: #ccc; -} - -.btn-secondary-outline:focus, .btn-secondary-outline.focus, .btn-secondary-outline:active, .btn-secondary-outline.active, -.open > .btn-secondary-outline.dropdown-toggle { - color: #000; - background-color: #ccc; - border-color: #ccc; -} - -.btn-secondary-outline:hover { - color: #000; - background-color: #ccc; - border-color: #ccc; -} - -.btn-secondary-outline.disabled:focus, .btn-secondary-outline.disabled.focus, .btn-secondary-outline:disabled:focus, .btn-secondary-outline:disabled.focus { - border-color: white; -} - -.btn-secondary-outline.disabled:hover, .btn-secondary-outline:disabled:hover { - border-color: white; -} - -.btn-info-outline { - color: #5bc0de; - background-color: transparent; - background-image: none; - border-color: #5bc0de; -} - -.btn-info-outline:focus, .btn-info-outline.focus, .btn-info-outline:active, .btn-info-outline.active, -.open > .btn-info-outline.dropdown-toggle { - color: #000; - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-info-outline:hover { - color: #000; - background-color: #5bc0de; - border-color: #5bc0de; -} - -.btn-info-outline.disabled:focus, .btn-info-outline.disabled.focus, .btn-info-outline:disabled:focus, .btn-info-outline:disabled.focus { - border-color: #b0e1ef; -} - -.btn-info-outline.disabled:hover, .btn-info-outline:disabled:hover { - border-color: #b0e1ef; -} - -.btn-success-outline { - color: #5cb85c; - background-color: transparent; - background-image: none; - border-color: #5cb85c; -} - -.btn-success-outline:focus, .btn-success-outline.focus, .btn-success-outline:active, .btn-success-outline.active, -.open > .btn-success-outline.dropdown-toggle { - color: #000; - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-success-outline:hover { - color: #000; - background-color: #5cb85c; - border-color: #5cb85c; -} - -.btn-success-outline.disabled:focus, .btn-success-outline.disabled.focus, .btn-success-outline:disabled:focus, .btn-success-outline:disabled.focus { - border-color: #a3d7a3; -} - -.btn-success-outline.disabled:hover, .btn-success-outline:disabled:hover { - border-color: #a3d7a3; -} - -.btn-warning-outline { - color: #f0ad4e; - background-color: transparent; - background-image: none; - border-color: #f0ad4e; -} - -.btn-warning-outline:focus, .btn-warning-outline.focus, .btn-warning-outline:active, .btn-warning-outline.active, -.open > .btn-warning-outline.dropdown-toggle { - color: #000; - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-warning-outline:hover { - color: #000; - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.btn-warning-outline.disabled:focus, .btn-warning-outline.disabled.focus, .btn-warning-outline:disabled:focus, .btn-warning-outline:disabled.focus { - border-color: #f8d9ac; -} - -.btn-warning-outline.disabled:hover, .btn-warning-outline:disabled:hover { - border-color: #f8d9ac; -} - -.btn-danger-outline { - color: #d9534f; - background-color: transparent; - background-image: none; - border-color: #d9534f; -} - -.btn-danger-outline:focus, .btn-danger-outline.focus, .btn-danger-outline:active, .btn-danger-outline.active, -.open > .btn-danger-outline.dropdown-toggle { - color: #000; - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-danger-outline:hover { - color: #000; - background-color: #d9534f; - border-color: #d9534f; -} - -.btn-danger-outline.disabled:focus, .btn-danger-outline.disabled.focus, .btn-danger-outline:disabled:focus, .btn-danger-outline:disabled.focus { - border-color: #eba5a3; -} - -.btn-danger-outline.disabled:hover, .btn-danger-outline:disabled:hover { - border-color: #eba5a3; -} - -.btn-link { - font-weight: normal; - color: #0275d8; - border-radius: 0; -} - -.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled { - background-color: transparent; -} - -.btn-link, .btn-link:focus, .btn-link:active { - border-color: transparent; -} - -.btn-link:hover { - border-color: transparent; -} - -.btn-link:focus, .btn-link:hover { - color: #014c8c; - text-decoration: underline; - background-color: transparent; -} - -.btn-link:disabled:focus, .btn-link:disabled:hover { - color: #818a91; - text-decoration: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: .75rem 1.25rem; - font-size: 1.25rem; - line-height: 1.333333; - border-radius: .3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: .25rem .75rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem; -} - -.btn-block { - display: block; - width: 100%; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.in { - display: block; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height; - -o-transition-property: height; - transition-property: height; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-right: .25rem; - margin-left: .25rem; - vertical-align: middle; - content: ""; - border-top: .3em solid; - border-right: .3em solid transparent; - border-left: .3em solid transparent; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropup .dropdown-toggle::after { - border-top: 0; - border-bottom: .3em solid; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 1rem; - color: #373a3c; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: .25rem; -} - -.dropdown-divider { - height: 1px; - margin: .5rem 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-item { - display: block; - width: 100%; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.5; - color: #373a3c; - text-align: inherit; - white-space: nowrap; - background: none; - border: 0; -} - -.dropdown-item:focus, .dropdown-item:hover { - color: #2b2d2f; - text-decoration: none; - background-color: #f5f5f5; -} - -.dropdown-item.active, .dropdown-item.active:focus, .dropdown-item.active:hover { - color: #fff; - text-decoration: none; - background-color: #0275d8; - outline: 0; -} - -.dropdown-item.disabled, .dropdown-item.disabled:focus, .dropdown-item.disabled:hover { - color: #818a91; -} - -.dropdown-item.disabled:focus, .dropdown-item.disabled:hover { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: "progid:DXImageTransform.Microsoft.gradient(enabled = false)"; -} - -.open > .dropdown-menu { - display: block; -} - -.open > a { - outline: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: .875rem; - line-height: 1.5; - color: #818a91; - white-space: nowrap; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: .3em solid; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} - -.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 2; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar { - margin-left: -5px; -} - -.btn-toolbar::after { - display: table; - clear: both; - content: ""; -} - -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} - -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret, .btn-group-lg > .btn .caret { - border-width: .3em .3em 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { - border-width: 0 .3em .3em; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} - -.btn-group-vertical > .btn-group::after { - display: table; - clear: both; - content: ""; -} - -.btn-group-vertical > .btn-group > .btn { - float: none; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: .25rem; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: .25rem; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} - -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} - -.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover { - z-index: 3; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: .375rem .5rem; - font-size: 1rem; - font-weight: normal; - line-height: 1; - background-color: #111; - text-align: center; - border: 1px solid #ccc; - border-radius: .25rem; -} - -.input-group-addon.form-control-sm, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: .275rem .75rem; - font-size: .875rem; - border-radius: .2rem; -} - -.input-group-addon.form-control-lg, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: .75rem 1.25rem; - font-size: 1.25rem; - border-radius: .3rem; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -/* -.input-group .form-control:first-child, -*/ -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -/* -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -*/ - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} - -.input-group-btn > .btn { - position: relative; -} - -.input-group-btn > .btn + .btn { - margin-left: -1px; -} - -.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover { - z-index: 3; -} - -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} - -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} - -.input-group-btn:last-child > .btn:focus, .input-group-btn:last-child > .btn:active, .input-group-btn:last-child > .btn:hover, -.input-group-btn:last-child > .btn-group:focus, -.input-group-btn:last-child > .btn-group:active, -.input-group-btn:last-child > .btn-group:hover { - z-index: 3; -} - -.c-input { - position: relative; - display: inline; - padding-left: 1.5rem; - color: #555; - cursor: pointer; -} - -.c-input > input { - position: absolute; - z-index: -1; - opacity: 0; -} - -.c-input > input:checked ~ .c-indicator { - color: #fff; - background-color: #0074d9; -} - -.c-input > input:focus ~ .c-indicator { - -webkit-box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9; - box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9; -} - -.c-input > input:active ~ .c-indicator { - color: #fff; - background-color: #84c6ff; -} - -.c-input + .c-input { - margin-left: 1rem; -} - -.c-indicator { - position: absolute; - top: 0; - left: 0; - display: block; - width: 1rem; - height: 1rem; - font-size: 65%; - line-height: 1rem; - color: #eee; - text-align: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #eee; - background-repeat: no-repeat; - background-position: center center; - -webkit-background-size: 50% 50%; - background-size: 50% 50%; -} - -.c-checkbox .c-indicator { - border-radius: .25rem; -} - -.c-checkbox input:checked ~ .c-indicator { - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgOCA4IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA4IDgiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTYuNCwxTDUuNywxLjdMMi45LDQuNUwyLjEsMy43TDEuNCwzTDAsNC40bDAuNywwLjdsMS41LDEuNWwwLjcsMC43bDAuNy0wLjdsMy41LTMuNWwwLjctMC43TDYuNCwxTDYuNCwxeiINCgkvPg0KPC9zdmc+DQo=); -} - -.c-checkbox input:indeterminate ~ .c-indicator { - background-color: #0074d9; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iOHB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDggOCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgOCA4IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0wLDN2Mmg4VjNIMHoiLz4NCjwvc3ZnPg0K); -} - -.c-radio .c-indicator { - border-radius: 50%; -} - -.c-radio input:checked ~ .c-indicator { - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgOCA4IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA4IDgiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTQsMUMyLjMsMSwxLDIuMywxLDRzMS4zLDMsMywzczMtMS4zLDMtM1M1LjcsMSw0LDF6Ii8+DQo8L3N2Zz4NCg==); -} - -.c-inputs-stacked .c-input { - display: inline; -} - -.c-inputs-stacked .c-input::after { - display: block; - margin-bottom: .25rem; - content: ""; -} - -.c-inputs-stacked .c-input + .c-input { - margin-left: 0; -} - -.c-select { - display: inline-block; - max-width: 100%; - -webkit-appearance: none; - -moz-appearance: none; - padding: .375rem 1.75rem .375rem .75rem; - padding-right: .75rem \9; - vertical-align: middle; - background: rgba(0,0,0,0) url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC) no-repeat right .75rem center; - background-image: none \9; - -webkit-background-size: 8px 10px; - background-size: 8px 10px; - border: 1px solid #ccc; - border-radius: .25rem; -} - -.c-select:focus { - border-color: #51a7e8; - outline: none; -} - -.c-select::-ms-expand { - opacity: 0; -} - -.c-select-sm { - padding-top: 3px; - padding-bottom: 3px; - font-size: 12px; -} - -.c-select-sm:not([multiple]) { - height: 26px; - min-height: 26px; -} - -.c-select option { - background-color: #000; - color: #fff; -} -.c-select option:checked { - background-color: #111; -} - -.file { - position: relative; - display: inline-block; - height: 2.5rem; - cursor: pointer; -} - -.file input { - min-width: 14rem; - margin: 0; - filter: alpha(opacity=0); - opacity: 0; -} - -.file-custom { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 5; - height: 2.5rem; - padding: .5rem 1rem; - line-height: 1.5; - color: #555; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #fff; - border: 1px solid #ddd; - border-radius: .25rem; -} - -.file-custom::after { - content: "Choose file..."; -} - -.file-custom::before { - position: absolute; - top: -.075rem; - right: -.075rem; - bottom: -.075rem; - z-index: 6; - display: block; - height: 2.5rem; - padding: .5rem 1rem; - line-height: 1.5; - color: #555; - content: "Browse"; - background-color: #eee; - border: 1px solid #ddd; - border-radius: 0 .25rem .25rem 0; -} - -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: inline-block; -} - -.nav-link:focus, .nav-link:hover { - text-decoration: none; -} - -.nav-link.disabled { - color: #818a91; -} - -.nav-link.disabled, .nav-link.disabled:focus, .nav-link.disabled:hover { - color: #818a91; - cursor: not-allowed; - background-color: transparent; -} - -.nav-inline .nav-item { - display: inline-block; -} - -.nav-inline .nav-item + .nav-item, -.nav-inline .nav-link + .nav-link { - margin-left: 1rem; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs::after { - display: table; - clear: both; - content: ""; -} - -.nav-tabs .nav-item { - float: left; - margin-bottom: -1px; -} - -.nav-tabs .nav-item + .nav-item { - margin-left: .2rem; -} - -.nav-tabs .nav-link { - display: block; - padding: .5em 1em; - border: 1px solid transparent; - border-radius: .25rem .25rem 0 0; -} - -.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { - border-color: #eceeef #eceeef #ddd; -} - -.nav-tabs .nav-link.disabled, .nav-tabs .nav-link.disabled:focus, .nav-tabs .nav-link.disabled:hover { - color: #818a91; - background-color: transparent; - border-color: transparent; -} - -.nav-tabs .nav-link.active, .nav-tabs .nav-link.active:focus, .nav-tabs .nav-link.active:hover, -.nav-tabs .nav-item.open .nav-link, -.nav-tabs .nav-item.open .nav-link:focus, -.nav-tabs .nav-item.open .nav-link:hover { - color: #55595c; - background-color: #fff; - border-color: #ddd #ddd transparent; -} - -.nav-pills::after { - display: table; - clear: both; - content: ""; -} - -.nav-pills .nav-item { - float: left; -} - -.nav-pills .nav-item + .nav-item { - margin-left: .2rem; -} - -.nav-pills .nav-link { - display: block; - padding: .5em 1em; - border-radius: .25rem; -} - -.nav-pills .nav-link.active, .nav-pills .nav-link.active:focus, .nav-pills .nav-link.active:hover, -.nav-pills .nav-item.open .nav-link, -.nav-pills .nav-item.open .nav-link:focus, -.nav-pills .nav-item.open .nav-link:hover { - color: #fff; - cursor: default; - background-color: #0275d8; -} - -.nav-stacked .nav-item { - display: block; - float: none; -} - -.nav-stacked .nav-item + .nav-item { - margin-top: .2rem; - margin-left: 0; -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.navbar { - position: relative; - padding: .5rem 1rem; -} - -.navbar::after { - display: table; - clear: both; - content: ""; -} - -@media (min-width: 544px) { - .navbar { - border-radius: .25rem; - } -} - -.navbar-full { - z-index: 1000; -} - -@media (min-width: 544px) { - .navbar-full { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} - -@media (min-width: 544px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1030; - width: 100%; -} - -@media (min-width: 544px) { - .navbar-sticky-top { - border-radius: 0; - } -} - -.navbar-brand { - float: left; - padding-top: .25rem; - padding-bottom: .25rem; - margin-right: 1rem; - font-size: 1.25rem; -} - -.navbar-brand:focus, .navbar-brand:hover { - text-decoration: none; -} - -.navbar-brand > img { - display: block; -} - -.navbar-divider { - float: left; - width: 1px; - padding-top: .425rem; - padding-bottom: .425rem; - margin-right: 1rem; - margin-left: 1rem; - overflow: hidden; -} - -.navbar-divider::before { - content: "\00a0"; -} - -.navbar-toggler { - padding: .5rem .75rem; - font-size: 1.25rem; - line-height: 1; - background: none; - border: 1px solid transparent; - border-radius: .25rem; -} - -.navbar-toggler:focus, .navbar-toggler:hover { - text-decoration: none; -} - -@media (min-width: 544px) { - .navbar-toggleable-xs { - display: block !important; - } -} - -@media (min-width: 768px) { - .navbar-toggleable-sm { - display: block !important; - } -} - -@media (min-width: 992px) { - .navbar-toggleable-md { - display: block !important; - } -} - -.navbar-nav .nav-item { - float: left; -} - -.navbar-nav .nav-link { - display: block; - padding-top: .425rem; - padding-bottom: .425rem; -} - -.navbar-nav .nav-link + .nav-link { - margin-left: 1rem; -} - -.navbar-nav .nav-item + .nav-item { - margin-left: 1rem; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, .8); -} - -.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover { - color: rgba(0, 0, 0, .8); -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, .3); -} - -.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { - color: rgba(0, 0, 0, .6); -} - -.navbar-light .navbar-nav .open > .nav-link, .navbar-light .navbar-nav .open > .nav-link:focus, .navbar-light .navbar-nav .open > .nav-link:hover, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .active > .nav-link:focus, -.navbar-light .navbar-nav .active > .nav-link:hover, -.navbar-light .navbar-nav .nav-link.open, -.navbar-light .navbar-nav .nav-link.open:focus, -.navbar-light .navbar-nav .nav-link.open:hover, -.navbar-light .navbar-nav .nav-link.active, -.navbar-light .navbar-nav .nav-link.active:focus, -.navbar-light .navbar-nav .nav-link.active:hover { - color: rgba(0, 0, 0, .8); -} - -.navbar-light .navbar-divider { - background-color: rgba(0, 0, 0, .075); -} - -.navbar-dark .navbar-brand { - color: white; -} - -.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover { - color: white; -} - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, .5); -} - -.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover { - color: rgba(255, 255, 255, .75); -} - -.navbar-dark .navbar-nav .open > .nav-link, .navbar-dark .navbar-nav .open > .nav-link:focus, .navbar-dark .navbar-nav .open > .nav-link:hover, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link:focus, -.navbar-dark .navbar-nav .active > .nav-link:hover, -.navbar-dark .navbar-nav .nav-link.open, -.navbar-dark .navbar-nav .nav-link.open:focus, -.navbar-dark .navbar-nav .nav-link.open:hover, -.navbar-dark .navbar-nav .nav-link.active, -.navbar-dark .navbar-nav .nav-link.active:focus, -.navbar-dark .navbar-nav .nav-link.active:hover { - color: white; -} - -.navbar-dark .navbar-divider { - background-color: rgba(255, 255, 255, .075); -} - -.card { - position: relative; - display: block; - margin-bottom: .75rem; - background-color: #fff; - border: 1px solid #e5e5e5; - border-radius: .25rem; -} - -.card-block { - padding: 1.25rem; -} - -.card-title { - margin-bottom: .75rem; -} - -.card-subtitle { - margin-top: -.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} - -.card-link + .card-link { - margin-left: 1.25rem; -} - -.card > .list-group:first-child .list-group-item:first-child { - border-radius: .25rem .25rem 0 0; -} - -.card > .list-group:last-child .list-group-item:last-child { - border-radius: 0 0 .25rem .25rem; -} - -.card-header { - padding: .75rem 1.25rem; - background-color: #f5f5f5; - border-bottom: 1px solid #e5e5e5; -} - -.card-header:first-child { - border-radius: .25rem .25rem 0 0; -} - -.card-footer { - padding: .75rem 1.25rem; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; -} - -.card-footer:last-child { - border-radius: 0 0 .25rem .25rem; -} - -.card-primary { - background-color: #0275d8; - border-color: #0275d8; -} - -.card-success { - background-color: #5cb85c; - border-color: #5cb85c; -} - -.card-info { - background-color: #5bc0de; - border-color: #5bc0de; -} - -.card-warning { - background-color: #f0ad4e; - border-color: #f0ad4e; -} - -.card-danger { - background-color: #d9534f; - border-color: #d9534f; -} - -.card-primary-outline { - background-color: transparent; - border-color: #0275d8; -} - -.card-secondary-outline { - background-color: transparent; - border-color: #ccc; -} - -.card-info-outline { - background-color: transparent; - border-color: #5bc0de; -} - -.card-success-outline { - background-color: transparent; - border-color: #5cb85c; -} - -.card-warning-outline { - background-color: transparent; - border-color: #f0ad4e; -} - -.card-danger-outline { - background-color: transparent; - border-color: #d9534f; -} - -.card-inverse .card-header, -.card-inverse .card-footer { - border-bottom: 1px solid rgba(255, 255, 255, .2); -} - -.card-inverse .card-header, -.card-inverse .card-footer, -.card-inverse .card-title, -.card-inverse .card-blockquote { - color: #fff; -} - -.card-inverse .card-link, -.card-inverse .card-text, -.card-inverse .card-blockquote > footer { - color: rgba(255, 255, 255, .65); -} - -.card-inverse .card-link:focus, .card-inverse .card-link:hover { - color: #fff; -} - -.card-blockquote { - padding: 0; - margin-bottom: 0; - border-left: 0; -} - -.card-img { - border-radius: .25rem; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; -} - -.card-img-top { - border-radius: .25rem .25rem 0 0; -} - -.card-img-bottom { - border-radius: 0 0 .25rem .25rem; -} - -@media (min-width: 544px) { - .card-deck { - display: table; - table-layout: fixed; - border-spacing: 1.25rem 0; - } - .card-deck .card { - display: table-cell; - width: 1%; - vertical-align: top; - } - .card-deck-wrapper { - margin-right: -1.25rem; - margin-left: -1.25rem; - } -} - -@media (min-width: 544px) { - .card-group { - display: table; - width: 100%; - table-layout: fixed; - } - .card-group .card { - display: table-cell; - vertical-align: top; - } - .card-group .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group .card:first-child { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group .card:first-child .card-img-top { - border-top-right-radius: 0; - } - .card-group .card:first-child .card-img-bottom { - border-bottom-right-radius: 0; - } - .card-group .card:last-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group .card:last-child .card-img-top { - border-top-left-radius: 0; - } - .card-group .card:last-child .card-img-bottom { - border-bottom-left-radius: 0; - } - .card-group .card:not(:first-child):not(:last-child) { - border-radius: 0; - } - .card-group .card:not(:first-child):not(:last-child) .card-img-top, - .card-group .card:not(:first-child):not(:last-child) .card-img-bottom { - border-radius: 0; - } -} - -@media (min-width: 544px) { - .card-columns { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - } - .card-columns .card { - display: inline-block; - width: 100%; - } -} - -.breadcrumb { - padding: .75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #eceeef; - border-radius: .25rem; -} - -.breadcrumb::after { - display: table; - clear: both; - content: ""; -} - -.breadcrumb > li { - float: left; -} - -.breadcrumb > li + li::before { - padding-right: .5rem; - padding-left: .5rem; - color: #818a91; - content: "/"; -} - -.breadcrumb > .active { - color: #818a91; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin-top: 1rem; - margin-bottom: 1rem; - border-radius: .25rem; -} - -.page-item { - display: inline; -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; -} - -.page-item:last-child .page-link { - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; -} - -.page-item.active .page-link, .page-item.active .page-link:focus, .page-item.active .page-link:hover { - z-index: 2; - color: #fff; - cursor: default; - background-color: #0275d8; - border-color: #0275d8; -} - -.page-item.disabled .page-link, .page-item.disabled .page-link:focus, .page-item.disabled .page-link:hover { - color: #818a91; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} - -.page-link { - position: relative; - float: left; - padding: .5rem .75rem; - margin-left: -1px; - line-height: 1.5; - color: #0275d8; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} - -.page-link:focus, .page-link:hover { - color: #014c8c; - background-color: #eceeef; - border-color: #ddd; -} - -.pagination-lg .page-link { - padding: .75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.333333; -} - -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: .3rem; - border-bottom-left-radius: .3rem; -} - -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: .3rem; - border-bottom-right-radius: .3rem; -} - -.pagination-sm .page-link { - padding: .275rem .75rem; - font-size: .875rem; - line-height: 1.5; -} - -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: .2rem; - border-bottom-left-radius: .2rem; -} - -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: .2rem; - border-bottom-right-radius: .2rem; -} - -.pager { - padding-left: 0; - margin-top: 1rem; - margin-bottom: 1rem; - text-align: center; - list-style: none; -} - -.pager::after { - display: table; - clear: both; - content: ""; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} - -.pager li > a:focus, .pager li > a:hover { - text-decoration: none; - background-color: #eceeef; -} - -.pager .disabled > a, .pager .disabled > a:focus, .pager .disabled > a:hover { - color: #818a91; - cursor: not-allowed; - background-color: #fff; -} - -.pager .disabled > span { - color: #818a91; - cursor: not-allowed; - background-color: #fff; -} - -.pager-next > a, -.pager-next > span { - float: right; -} - -.pager-prev > a, -.pager-prev > span { - float: left; -} - -.label { - display: inline-block; - padding: .25em .4em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25rem; -} - -.label:empty { - display: none; -} - -.btn .label { - position: relative; - top: -1px; -} - -a.label:focus, a.label:hover { - color: #fff; - text-decoration: none; - cursor: pointer; -} - -.label-pill { - padding-right: .6em; - padding-left: .6em; - border-radius: 10rem; -} - -.label-default { - background-color: #818a91; -} - -.label-default[href]:focus, .label-default[href]:hover { - background-color: #687077; -} - -.label-primary { - background-color: #0275d8; -} - -.label-primary[href]:focus, .label-primary[href]:hover { - background-color: #025aa5; -} - -.label-success { - background-color: #5cb85c; -} - -.label-success[href]:focus, .label-success[href]:hover { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} - -.label-info[href]:focus, .label-info[href]:hover { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} - -.label-warning[href]:focus, .label-warning[href]:hover { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} - -.label-danger[href]:focus, .label-danger[href]:hover { - background-color: #c9302c; -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #eceeef; - border-radius: .3rem; -} - -@media (min-width: 544px) { - .jumbotron { - padding: 4rem 2rem; - } -} - -.jumbotron-hr { - border-top-color: #d0d5d8; -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} - -.alert { - padding: 15px; - border: 1px solid transparent; - border-radius: .25rem; -} - -.alert > p, -.alert > ul { - margin-bottom: 0; -} - -.alert > p + p { - margin-top: 5px; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: bold; -} - -.alert-dismissible { - padding-right: 35px; -} - -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - color: #dff0d8; - background-color: #3c763d; - border-color: #3c763d; -} - -.alert-success hr { - border-top-color: #c1e2b3; -} - -.alert-success .alert-link { - color: #2b542c; -} - -.alert-info { - color: #d9edf7; - background-color: #31708f; - border-color: #d9edf7; -} - -.alert-info hr { - border-top-color: #a6d5ec; -} - -.alert-info .alert-link { - color: #245269; -} - -.alert-warning { - background-color: #8a6d3b; - color: #fcf8e3; - border-color: #8a6d3b; -} - -.alert-warning hr { - border-top-color: #f7ecb5; -} - -.alert-warning .alert-link { - color: #66512c; -} - -.alert-danger { - background-color: #a94442; - color: #ebcccc; - border-color: #a94442; -} -.alert .close { - color:inherit; -} - -.alert-danger hr { - border-top-color: #e4b9b9; -} - -.alert-danger .alert-link { - color: #843534; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -.progress { - display: block; - width: 100%; - height: 1rem; - margin-bottom: 1rem; -} - -.progress[value] { - -webkit-appearance: none; - color: #0074d9; - border: 0; - - -moz-appearance: none; - appearance: none; -} - -.progress[value]::-webkit-progress-bar { - background-color: #eee; - border-radius: .25rem; -} - -.progress[value]::-webkit-progress-value::before { - content: attr(value); -} - -.progress[value]::-webkit-progress-value { - background-color: #0074d9; - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; -} - -.progress[value="100"]::-webkit-progress-value { - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; -} - -@media screen and (min-width: 0\0) { - .progress { - background-color: #eee; - border-radius: .25rem; - } - .progress-bar { - display: inline-block; - height: 1rem; - text-indent: -999rem; - background-color: #0074d9; - border-top-left-radius: .25rem; - border-bottom-left-radius: .25rem; - } - .progress[width^="0"] { - min-width: 2rem; - color: #818a91; - background-color: transparent; - background-image: none; - } - .progress[width="100%"] { - border-top-right-radius: .25rem; - border-bottom-right-radius: .25rem; - } -} - -.progress-striped[value]::-webkit-progress-value { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 1rem 1rem; - background-size: 1rem 1rem; -} - -.progress-striped[value]::-moz-progress-bar { - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} - -@media screen and (min-width: 0\0) { - .progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 1rem 1rem; - background-size: 1rem 1rem; - } -} - -.progress-animated[value]::-webkit-progress-value { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-animated[value]::-moz-progress-bar { - animation: progress-bar-stripes 2s linear infinite; -} - -@media screen and (min-width: 0\0) { - .progress-animated .progress-bar-striped { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; - } -} - -.progress-success[value]::-webkit-progress-value { - background-color: #5cb85c; -} - -.progress-success[value]::-moz-progress-bar { - background-color: #5cb85c; -} - -@media screen and (min-width: 0\0) { - .progress-success .progress-bar { - background-color: #5cb85c; - } -} - -.progress-info[value]::-webkit-progress-value { - background-color: #5bc0de; -} - -.progress-info[value]::-moz-progress-bar { - background-color: #5bc0de; -} - -@media screen and (min-width: 0\0) { - .progress-info .progress-bar { - background-color: #5bc0de; - } -} - -.progress-warning[value]::-webkit-progress-value { - background-color: #f0ad4e; -} - -.progress-warning[value]::-moz-progress-bar { - background-color: #f0ad4e; -} - -@media screen and (min-width: 0\0) { - .progress-warning .progress-bar { - background-color: #f0ad4e; - } -} - -.progress-danger[value]::-webkit-progress-value { - background-color: #d9534f; -} - -.progress-danger[value]::-moz-progress-bar { - background-color: #d9534f; -} - -@media screen and (min-width: 0\0) { - .progress-danger .progress-bar { - background-color: #d9534f; - } -} - -.media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; -} - -.media-body { - width: 10000px; -} - -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} - -.media-middle { - vertical-align: middle; -} - -.media-bottom { - vertical-align: bottom; -} - -.media-object { - display: block; -} - -.media-object.img-thumbnail { - max-width: none; -} - -.media-right { - padding-left: 10px; -} - -.media-left { - padding-right: 10px; -} - -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - padding-left: 0; - margin-bottom: 0; -} - -.list-group-item { - position: relative; - display: block; - padding: .75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} - -.list-group-item:first-child { - border-top-left-radius: .25rem; - border-top-right-radius: .25rem; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: .25rem; - border-bottom-left-radius: .25rem; -} - -.list-group-flush .list-group-item { - border-width: 1px 0; - border-radius: 0; -} - -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0; -} - -.list-group-flush:last-child .list-group-item:last-child { - border-bottom: 0; -} - -a.list-group-item, -button.list-group-item { - width: 100%; - color: #555; - text-align: inherit; -} - -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} - -a.list-group-item:focus, a.list-group-item:hover, -button.list-group-item:focus, -button.list-group-item:hover { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} - -.list-group-item.disabled, .list-group-item.disabled:focus, .list-group-item.disabled:hover { - color: #818a91; - cursor: not-allowed; - background-color: #eceeef; -} - -.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading { - color: inherit; -} - -.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text { - color: #818a91; -} - -.list-group-item.active, .list-group-item.active:focus, .list-group-item.active:hover { - z-index: 2; - color: #fff; - background-color: #0275d8; - border-color: #0275d8; -} - -.list-group-item.active .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > .small { - color: inherit; -} - -.list-group-item.active .list-group-item-text, .list-group-item.active:focus .list-group-item-text, .list-group-item.active:hover .list-group-item-text { - color: #a8d6fe; -} - -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} - -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} - -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} - -a.list-group-item-success:focus, a.list-group-item-success:hover, -button.list-group-item-success:focus, -button.list-group-item-success:hover { - color: #3c763d; - background-color: #d0e9c6; -} - -a.list-group-item-success.active, a.list-group-item-success.active:focus, a.list-group-item-success.active:hover, -button.list-group-item-success.active, -button.list-group-item-success.active:focus, -button.list-group-item-success.active:hover { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} - -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} - -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} - -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} - -a.list-group-item-info:focus, a.list-group-item-info:hover, -button.list-group-item-info:focus, -button.list-group-item-info:hover { - color: #31708f; - background-color: #c4e3f3; -} - -a.list-group-item-info.active, a.list-group-item-info.active:focus, a.list-group-item-info.active:hover, -button.list-group-item-info.active, -button.list-group-item-info.active:focus, -button.list-group-item-info.active:hover { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} - -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} - -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} - -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} - -a.list-group-item-warning:focus, a.list-group-item-warning:hover, -button.list-group-item-warning:focus, -button.list-group-item-warning:hover { - color: #8a6d3b; - background-color: #faf2cc; -} - -a.list-group-item-warning.active, a.list-group-item-warning.active:focus, a.list-group-item-warning.active:hover, -button.list-group-item-warning.active, -button.list-group-item-warning.active:focus, -button.list-group-item-warning.active:hover { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} - -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} - -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} - -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} - -a.list-group-item-danger:focus, a.list-group-item-danger:hover, -button.list-group-item-danger:focus, -button.list-group-item-danger:hover { - color: #a94442; - background-color: #ebcccc; -} - -a.list-group-item-danger.active, a.list-group-item-danger.active:focus, a.list-group-item-danger.active:hover, -button.list-group-item-danger.active, -button.list-group-item-danger.active:focus, -button.list-group-item-danger.active:hover { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} - -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9 { - padding-bottom: 42.857143%; -} - -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} - -.embed-responsive-4by3 { - padding-bottom: 75%; -} - -.embed-responsive-1by1 { - padding-bottom: 100%; -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .2; -} - -.close:focus, .close:hover { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: .5; -} - -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} - -.modal-open { - overflow: hidden; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} - -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: transform .3s ease-out, -o-transform .3s ease-out; - transition: -webkit-transform .3s ease-out; - transition: transform .3s ease-out; - transition: transform .3s ease-out, -webkit-transform .3s ease-out, -o-transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} - -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} - -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: .3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop.in { - opacity: .5; -} - -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} - -.modal-header::after { - display: table; - clear: both; - content: ""; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - padding: 15px; -} - -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} - -.modal-footer::after { - display: table; - clear: both; - content: ""; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 544px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-sm { - width: 300px; - } -} - -@media (min-width: 768px) { - .modal-lg { - width: 900px; - } -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: .875rem; - font-style: normal; - font-weight: normal; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - opacity: 0; - - line-break: auto; -} - -.tooltip.in { - opacity: .9; -} - -.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.tooltip-top .tooltip-arrow, .tooltip.bs-tether-element-attached-bottom .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} - -.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.tooltip-right .tooltip-arrow, .tooltip.bs-tether-element-attached-left .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} - -.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.tooltip-bottom .tooltip-arrow, .tooltip.bs-tether-element-attached-top .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} - -.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip.tooltip-left .tooltip-arrow, .tooltip.bs-tether-element-attached-right .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: .25rem; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: .875rem; - font-style: normal; - font-weight: normal; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: .3rem; - - line-break: auto; -} - -.popover.popover-top, .popover.bs-tether-element-attached-bottom { - margin-top: -10px; -} - -.popover.popover-top .popover-arrow, .popover.bs-tether-element-attached-bottom .popover-arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} - -.popover.popover-top .popover-arrow::after, .popover.bs-tether-element-attached-bottom .popover-arrow::after { - bottom: 1px; - margin-left: -10px; - content: ""; - border-top-color: #fff; - border-bottom-width: 0; -} - -.popover.popover-right, .popover.bs-tether-element-attached-left { - margin-left: 10px; -} - -.popover.popover-right .popover-arrow, .popover.bs-tether-element-attached-left .popover-arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} - -.popover.popover-right .popover-arrow::after, .popover.bs-tether-element-attached-left .popover-arrow::after { - bottom: -10px; - left: 1px; - content: ""; - border-right-color: #fff; - border-left-width: 0; -} - -.popover.popover-bottom, .popover.bs-tether-element-attached-top { - margin-top: 10px; -} - -.popover.popover-bottom .popover-arrow, .popover.bs-tether-element-attached-top .popover-arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: rgba(0, 0, 0, .25); -} - -.popover.popover-bottom .popover-arrow::after, .popover.bs-tether-element-attached-top .popover-arrow::after { - top: 1px; - margin-left: -10px; - content: ""; - border-top-width: 0; - border-bottom-color: #fff; -} - -.popover.popover-left, .popover.bs-tether-element-attached-right { - margin-left: -10px; -} - -.popover.popover-left .popover-arrow, .popover.bs-tether-element-attached-right .popover-arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: rgba(0, 0, 0, .25); -} - -.popover.popover-left .popover-arrow::after, .popover.bs-tether-element-attached-right .popover-arrow::after { - right: 1px; - bottom: -10px; - content: ""; - border-right-width: 0; - border-left-color: #fff; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: -.7rem -.7rem 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover-arrow, .popover-arrow::after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover-arrow { - border-width: 11px; -} - -.popover-arrow::after { - content: ""; - border-width: 10px; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .carousel-item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} - -.carousel-inner > .carousel-item > img, -.carousel-inner > .carousel-item > a > img { - line-height: 1; -} - -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .carousel-item { - -webkit-transition: -webkit-transform .6s ease-in-out; - -o-transition: transform .6s ease-in-out, -o-transform .6s ease-in-out; - transition: -webkit-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out, -o-transform .6s ease-in-out; - - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .carousel-item.next, .carousel-inner > .carousel-item.active.right { - left: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-inner > .carousel-item.prev, .carousel-inner > .carousel-item.active.left { - left: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - .carousel-inner > .carousel-item.next.left, .carousel-inner > .carousel-item.prev.right, .carousel-inner > .carousel-item.active { - left: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - opacity: .5; -} - -.carousel-control.left { - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} - -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} - -.carousel-control:focus, .carousel-control:hover { - color: #fff; - text-decoration: none; - outline: 0; - opacity: .9; -} - -.carousel-control .icon-prev, -.carousel-control .icon-next { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; - line-height: 1; -} - -.carousel-control .icon-prev { - left: 50%; - margin-left: -10px; -} - -.carousel-control .icon-next { - right: 50%; - margin-right: -10px; -} - -.carousel-control .icon-prev::before { - content: "\2039"; -} - -.carousel-control .icon-next::before { - content: "\203a"; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} - -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: transparent; - border: 1px solid #fff; - border-radius: 10px; -} - -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} - -.carousel-caption .btn { - text-shadow: none; -} - -@media (min-width: 544px) { - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} - -.clearfix::after { - display: table; - clear: both; - content: ""; -} - -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} - -.pull-xs-left { - float: left !important; -} - -.pull-xs-right { - float: right !important; -} - -.pull-xs-none { - float: none !important; -} - -@media (min-width: 544px) { - .pull-sm-left { - float: left !important; - } - .pull-sm-right { - float: right !important; - } - .pull-sm-none { - float: none !important; - } -} - -@media (min-width: 768px) { - .pull-md-left { - float: left !important; - } - .pull-md-right { - float: right !important; - } - .pull-md-none { - float: none !important; - } -} - -@media (min-width: 992px) { - .pull-lg-left { - float: left !important; - } - .pull-lg-right { - float: right !important; - } - .pull-lg-none { - float: none !important; - } -} - -@media (min-width: 1200px) { - .pull-xl-left { - float: left !important; - } - .pull-xl-right { - float: right !important; - } - .pull-xl-none { - float: none !important; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} - -.invisible { - visibility: hidden !important; -} - -.text-hide { - font: "0/0" a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.text-justify { - text-align: justify !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-xs-left { - text-align: left !important; -} - -.text-xs-right { - text-align: right !important; -} - -.text-xs-center { - text-align: center !important; -} - -@media (min-width: 544px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} - -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} - -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} - -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-normal { - font-weight: normal; -} - -.font-weight-bold { - font-weight: bold; -} - -.font-italic { - font-style: italic; -} - -.text-muted { - color: #818a91; -} - -.text-primary { - color: #0275d8 !important; -} - -a.text-primary:focus, a.text-primary:hover { - color: #025aa5; -} - -.text-success { - color: #5cb85c !important; -} - -a.text-success:focus, a.text-success:hover { - color: #449d44; -} - -.text-info { - color: #5bc0de !important; -} - -a.text-info:focus, a.text-info:hover { - color: #31b0d5; -} - -.text-warning { - color: #f0ad4e !important; -} - -a.text-warning:focus, a.text-warning:hover { - color: #ec971f; -} - -.text-danger { - color: #d9534f !important; -} - -a.text-danger:focus, a.text-danger:hover { - color: #c9302c; -} - -.bg-inverse { - color: #eceeef; - background-color: #373a3c; -} - -.bg-faded { - background-color: #f7f7f9; -} - -.bg-primary { - color: #fff !important; - background-color: #0275d8 !important; -} - -a.bg-primary:focus, a.bg-primary:hover { - background-color: #025aa5; -} - -.bg-success { - color: #fff !important; - background-color: #5cb85c !important; -} - -a.bg-success:focus, a.bg-success:hover { - background-color: #449d44; -} - -.bg-info { - color: #fff !important; - background-color: #5bc0de !important; -} - -a.bg-info:focus, a.bg-info:hover { - background-color: #31b0d5; -} - -.bg-warning { - color: #fff !important; - background-color: #f0ad4e !important; -} - -a.bg-warning:focus, a.bg-warning:hover { - background-color: #ec971f; -} - -.bg-danger { - color: #fff !important; - background-color: #d9534f !important; -} - -a.bg-danger:focus, a.bg-danger:hover { - background-color: #c9302c; -} - -.m-x-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.m-a-0 { - margin: 0 0 !important; -} - -.m-t-0 { - margin-top: 0 !important; -} - -.m-r-0 { - margin-right: 0 !important; -} - -.m-b-0 { - margin-bottom: 0 !important; -} - -.m-l-0 { - margin-left: 0 !important; -} - -.m-x-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.m-y-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.m-a-1 { - margin: 1rem 1rem !important; -} - -.m-t-1 { - margin-top: 1rem !important; -} - -.m-r-1 { - margin-right: 1rem !important; -} - -.m-b-1 { - margin-bottom: 1rem !important; -} - -.m-l-1 { - margin-left: 1rem !important; -} - -.m-x-1 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.m-y-1 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.m-a-2 { - margin: 1.5rem 1.5rem !important; -} - -.m-t-2 { - margin-top: 1.5rem !important; -} - -.m-r-2 { - margin-right: 1.5rem !important; -} - -.m-b-2 { - margin-bottom: 1.5rem !important; -} - -.m-l-2 { - margin-left: 1.5rem !important; -} - -.m-x-2 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.m-y-2 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.m-a-3 { - margin: 3rem 3rem !important; -} - -.m-t-3 { - margin-top: 3rem !important; -} - -.m-r-3 { - margin-right: 3rem !important; -} - -.m-b-3 { - margin-bottom: 3rem !important; -} - -.m-l-3 { - margin-left: 3rem !important; -} - -.m-x-3 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.m-y-3 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.p-a-0 { - padding: 0 0 !important; -} - -.p-t-0 { - padding-top: 0 !important; -} - -.p-r-0 { - padding-right: 0 !important; -} - -.p-b-0 { - padding-bottom: 0 !important; -} - -.p-l-0 { - padding-left: 0 !important; -} - -.p-x-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.p-y-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.p-a-1 { - padding: 1rem 1rem !important; -} - -.p-t-1 { - padding-top: 1rem !important; -} - -.p-r-1 { - padding-right: 1rem !important; -} - -.p-b-1 { - padding-bottom: 1rem !important; -} - -.p-l-1 { - padding-left: 1rem !important; -} - -.p-x-1 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.p-y-1 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.p-a-2 { - padding: 1.5rem 1.5rem !important; -} - -.p-t-2 { - padding-top: 1.5rem !important; -} - -.p-r-2 { - padding-right: 1.5rem !important; -} - -.p-b-2 { - padding-bottom: 1.5rem !important; -} - -.p-l-2 { - padding-left: 1.5rem !important; -} - -.p-x-2 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.p-y-2 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.p-a-3 { - padding: 3rem 3rem !important; -} - -.p-t-3 { - padding-top: 3rem !important; -} - -.p-r-3 { - padding-right: 3rem !important; -} - -.p-b-3 { - padding-bottom: 3rem !important; -} - -.p-l-3 { - padding-left: 3rem !important; -} - -.p-x-3 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.p-y-3 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pos-f-t { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.hidden-xs-up { - display: none !important; -} - -@media (max-width: 543px) { - .hidden-xs-down { - display: none !important; - } -} - -@media (min-width: 544px) { - .hidden-sm-up { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-sm-down { - display: none !important; - } -} - -@media (min-width: 768px) { - .hidden-md-up { - display: none !important; - } -} - -@media (max-width: 991px) { - .hidden-md-down { - display: none !important; - } -} - -@media (min-width: 992px) { - .hidden-lg-up { - display: none !important; - } -} - -@media (max-width: 1199px) { - .hidden-lg-down { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xl-up { - display: none !important; - } -} - -.hidden-xl-down { - display: none !important; -} - -.visible-print-block { - display: none !important; -} - -@media print { - .visible-print-block { - display: block !important; - } -} - -.visible-print-inline { - display: none !important; -} - -@media print { - .visible-print-inline { - display: inline !important; - } -} - -.visible-print-inline-block { - display: none !important; -} - -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} - -@media print { - .hidden-print { - display: none !important; - } -} -/* sourceMappingURL=bootstrap.css.map */ diff --git a/static/css/footer.css b/static/css/footer.css index 5298efe..220f77f 100644 --- a/static/css/footer.css +++ b/static/css/footer.css @@ -1,10 +1,13 @@ footer { font-weight: 300; - width:100%; - overflow:auto; + width: 100%; + overflow: auto; background: #111; color: #ccc; padding: 0 20px; + -moz-box-shadow: inset 0 .25vw 1vw #222; + -webkit-box-shadow: inset 0 .25vw 1vw #222; + box-shadow: inset 0 .25vw 1vw #222; } footer .left { float: left; @@ -33,7 +36,6 @@ footer a .fa { footer .fa a:hover, footer .fa a:focus { color: inherit; } - @media (max-width: 800px) { footer { padding: 0 10px; @@ -49,4 +51,4 @@ footer .fa a:hover, footer .fa a:focus { footer .right { padding-top: 0; } -} +} \ No newline at end of file diff --git a/static/css/form.css b/static/css/form.css new file mode 100644 index 0000000..96c9ba6 --- /dev/null +++ b/static/css/form.css @@ -0,0 +1,138 @@ +form { + margin: auto; + max-width: 800px; +} + +.form-group { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin: 8% 0; +} + +/* Sizing */ +form label { + font-size: 1.2em; + margin-right: 3%; +} + +/* Input formatting */ +form input, form textarea, form select { + color: #eee; + background-color: #202020; + background-color: rgba(255,255,255,0.1); + padding: 1% 1.5%; + border-radius: .3vw; +} +form input:not(:disabled), form textarea:not(:disabled), form .input-addon { + border: 1px solid #666; + -moz-box-shadow: inset .11vw .18vw .25vw rgba(0,0,0,.5); + -webkit-box-shadow: inset .11vw .18vw .25vw rgba(0,0,0,.5); + box-shadow: inset .11vw .18vw .25vw rgba(0,0,0,.5); +} +form input:disabled:not(.input-addon), form textarea:disabled, +form select:disabled { + border: 1px solid #444; +} +form input:not(.input-addon):not(.input-with-addon):not([type="radio"]):not([type="checkbox"]), +form .input-with-addon-group { + min-width: 50%; +} +form input:active:not(.input-addon), form textarea:active, +form select:active, +form input:focus:not(.input-addon), form textarea:focus, +form select:focus { + outline: none; + border: 1px solid #fbc93d; +} + +form .input-with-addon-group { + display: flex; +} +form .input-addon, form .input-with-addon { + -moz-box-shadow: inset .11vw .18vw .25vw rgba(0,0,0,.5); + -webkit-box-shadow: inset .11vw .18vw .25vw rgba(0,0,0,.5); + box-shadow: inset .11vw .18vw .25vw rgba(0,0,0,.5); +} +form .input-addon { + text-align: center; + width: auto; +} +form .input-with-addon { + flex-grow: 1; +} +form .input-addon.left { + padding: 1% 0 1% 1.5%; + border-right-color: #202020; + border-right-color: rgba(102,102,102,0); + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +form .input-with-addon.left { + padding: 1% 1.5% 1% 0; + border-left-color: #202020; + border-left-color: rgba(102,102,102,0); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +form .input-addon.right { + padding: 1% 1.5% 1% 0; + border-left-color: #202020; + border-left-color: rgba(102,102,102,0); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +form .input-with-addon.right { + padding: 1% 0 1% 1.5%; + border-right-color: #202020; + border-right-color: rgba(102,102,102,0); + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +::-webkit-input-placeholder { + color: #666; +}:-moz-placeholder { + color: #666; + opacity: 1; +}::-moz-placeholder { + color: #666; + opacity: 1; +}:-ms-input-placeholder { + color: #666; +} + +form select:not(:disabled) { + -moz-box-shadow: inset 0.11vw 0.18vw 0.52vw rgba(255,255,255,.2), + inset -0.11vw -0.18vw 0.52vw rgba(0,0,0,.4), + 0.1vw 0.1vw 0.36vw #000; + -webkit-box-shadow: inset 0.11vw 0.18vw 0.52vw rgba(255,255,255,.2), + inset -0.11vw -0.18vw 0.52vw rgba(0,0,0,.4), + 0.1vw 0.1vw 0.36vw #000; + box-shadow: inset 0.11vw 0.18vw 0.52vw rgba(255,255,255,.2), + inset -0.11vw -0.18vw 0.52vw rgba(0,0,0,.4), + 0.1vw 0.1vw 0.36vw #000; +} +form select > option { + background: #222; + color: inherit; +} + +form .radio { + min-width: 150px; + display: flex; + justify-content: space-between; +} + +form input[type="checkbox"], form input[type="radio"] { + width: auto; + margin: 8px; +} +form input[type="checkbox"]:active, form input[type="radio"]:active, +form input[type="checkbox"]:focus, form input[type="radio"]:focus { + outline: 1px solid #fbc93d; +} + +form .btn { + font-size: 1.5em; +} diff --git a/static/css/header.css b/static/css/header.css index aa63c6a..1a4a7ac 100644 --- a/static/css/header.css +++ b/static/css/header.css @@ -1,3 +1,4 @@ +/* Main */ header { background: #222; padding: 0; @@ -5,9 +6,12 @@ header { top: 0; left: 0; width: 100%; z-index: 200; +} header a:hover, header a:focus { + color: #fbc93d; } + +/* Logo */ header .logo { - float: left; font-family: 'Open Sans', sans-serif; padding: 13px 23px; @@ -16,53 +20,43 @@ header .logo { font-size: 22px; line-height: 30px; margin: 0; -} -header a:hover, header a:focus { - color: #fbc93d; -} -header .logo a { +} header .logo a { color:inherit; font:inherit; text-decoration:inherit; cursor: pointer; -} -header .logo img { +} header .logo img { margin-right: 10px; - position: relative; - width:28px; - height:28px; + vertical-align: middle; +} header .logo:hover { + text-decoration: none; + background: rgba(255,255,255,0.1); } + +/* Navigation */ header nav { float: right; -} -header nav ul { +} header nav ul { padding: 0; margin: 0; -} -header nav ul li { +} header nav ul li { display: inline-block; float: left; -} -header nav ul li a, header nav ul li span { +} header nav ul li a, header nav ul li span { text-decoration:inherit; display: inline-block; padding: 15px 20px; color: #fff; - transition: 200ms; -} -header nav ul li a:hover, + transition: 100ms; +} header nav ul li a:hover, header nav ul li a:focus, header nav ul li a.active, header .logo:hover { text-decoration: none; background: rgba(255,255,255,0.1); } -.alert.header { - position: relative; - border-radius: 0; - top: 58px; - width: 100%; -} + +/* Hamburger */ header .hamburger { display: none; padding: 5px; @@ -70,18 +64,20 @@ header .hamburger { transition-property: opacity, -webkit-filter; transition-property: opacity, filter; transition-property: opacity, filter, -webkit-filter; - transition-duration: 0.15s; - transition-timing-function: linear; } - .hamburger:hover { - opacity: 0.7; } -header .hamburger-box { + transition-duration: 150ms; + transition-timing-function: linear; +} header .hamburger:hover { + opacity: 0.7; +} header .hamburger-box { width: 40px; height: 24px; - position: relative; } -header .hamburger-inner { + position: relative; +} header .hamburger-inner { top: 50%; - margin-top: -2px; } - header .hamburger-inner, header .hamburger-inner::before, header .hamburger-inner::after { + margin-top: -2px; +} header .hamburger-inner, +header .hamburger-inner::before, +header .hamburger-inner::after { width: 40px; height: 4px; background-color: #fff; @@ -90,42 +86,47 @@ header .hamburger-inner { transition-property: -webkit-transform; transition-property: transform; transition-property: transform, -webkit-transform; - transition-duration: 0.15s; - transition-timing-function: ease; } - header .hamburger-inner::before, header .hamburger-inner::after { + transition-duration: 150ms; + transition-timing-function: ease; +} header .hamburger-inner::before, header .hamburger-inner::after { content: ""; - display: block; } - header .hamburger-inner::before { - top: -10px; } - header .hamburger-inner::after { - bottom: -10px; } - -header .hamburger--slider .hamburger-inner { - top: 0; } - header .hamburger--slider .hamburger-inner::before { + display: block; +} header .hamburger-inner::before { + top: -10px; +} header .hamburger-inner::after { + bottom: -10px; + } header .hamburger--slider .hamburger-inner { + top: 0; + } header .hamburger--slider .hamburger-inner::before { top: 10px; transition-property: opacity, -webkit-transform; transition-property: transform, opacity; transition-property: transform, opacity, -webkit-transform; transition-timing-function: ease; - transition-duration: 0.2s; } - header .hamburger--slider .hamburger-inner::after { - top: 20px; } - -header .hamburger--slider.is-active .hamburger-inner { - -webkit-transform: translate3d(0, 10px, 0) rotate(45deg); - transform: translate3d(0, 10px, 0) rotate(45deg); } - header .hamburger--slider.is-active .hamburger-inner::before { + transition-duration: 200ms; + } header .hamburger--slider .hamburger-inner::after { + top: 20px; + } header .hamburger--slider.is-active .hamburger-inner { + -webkit-transform: translate3d(0, 10px, 0) rotate(45deg); + -moz-transform: translate3d(0, 10px, 0) rotate(45deg); + -md-transform: translate3d(0, 10px, 0) rotate(45deg); + -o-transform: translate3d(0, 10px, 0) rotate(45deg); + transform: translate3d(0, 10px, 0) rotate(45deg); + } header .hamburger--slider.is-active .hamburger-inner::before { -webkit-transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0); - transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0); - opacity: 0; } - header .hamburger--slider.is-active .hamburger-inner::after { + -moz-transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0); + -ms-transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0); + -o-transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0); + transform: rotate(-45deg) translate3d(-5.71429px, -6px, 0); + opacity: 0; + } header .hamburger--slider.is-active .hamburger-inner::after { -webkit-transform: translate3d(0, -20px, 0) rotate(-90deg); - transform: translate3d(0, -20px, 0) rotate(-90deg); } - - + -moz-transform: translate3d(0, -20px, 0) rotate(-90deg); + -ms-transform: translate3d(0, -20px, 0) rotate(-90deg); + -o-transform: translate3d(0, -20px, 0) rotate(-90deg); + transform: translate3d(0, -20px, 0) rotate(-90deg); + } @media (max-width: 800px) { - header { padding:0; } header nav ul li a { padding:15px; } } @media (max-width: 600px) { @@ -138,17 +139,14 @@ header .hamburger--slider.is-active .hamburger-inner { width: 100%; max-width: 300px; background: #333; - transition: 200ms; - } - header nav.visible { + transition: 100ms; + } header nav.visible { right: 0px; - } - header nav ul li { + } header nav ul li { display: block; float: none; width: 100%; - } - header nav ul li a { + } header nav ul li a { display: block; width: 100%; border-bottom: 1px solid rgba(255,255,255,0.1); @@ -161,3 +159,64 @@ header .hamburger--slider.is-active .hamburger-inner { top: 13px; } } + +/* Alerts */ +.alert { + padding: 15px; + border: 1px solid transparent; + border-radius: 4px; +} +noscript .alert-danger { + z-index: 40; +} +.alert-danger { + z-index: 30; + color: #f2dede; + background-color: #a94442; +} +.alert-warning { + z-index: 20; + color: #fcf8e3; + background-color: #8a6d3b; +} +.alert-success { + z-index: 10; + color: #dff0d8; + background-color: #3c763d; +} +.alert.alert-header { + position: relative; + border-radius: 0; + top: 58px; + width: 100%; +} +.alert a { + z-index: 10; + color: inherit; + font-weight: bold; + text-decoration: underline; +} +.alert a:hover { + color: inherit; + text-decoration: none; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable { + padding-right: 35px; +} +.alert .close, +.alert-dismissible .close { + cursor: pointer; + float: right; + color: inherit; +} diff --git a/static/css/index.css b/static/css/index.css index 36b90e9..0b78d2a 100644 --- a/static/css/index.css +++ b/static/css/index.css @@ -15,6 +15,7 @@ /* End Animations */ .btn { border-radius: 50px; } +.container > p { margin-bottom: 5vh; } .splash { background: #090909; @@ -165,6 +166,15 @@ .light h2 { margin-bottom: 40px; } +.light .btn { + color: #111; + background: rgba(0,0,0,0.1); +} +.light .btn:hover:not(.disabled) { + cursor: pointer; + text-decoration: none; + background: rgba(0,0,0,0.2); +} .disclaimer { color: #fb6e3d; diff --git a/static/css/login.css b/static/css/login.css new file mode 100644 index 0000000..8e9a71f --- /dev/null +++ b/static/css/login.css @@ -0,0 +1,105 @@ +/* More padding on the bottom */ +.container { + padding-bottom: 10vh; +} + +/* Sections */ +#login, #signup { + width: 50%; + margin: 0 2%; +} + +/* Form overrides */ +form .form-group { + margin: 8% 0 0; +} +form input:not(.input-addon):not(.input-with-addon), +form .input-with-addon-group { + width: 96%; + margin: 0 auto 5vh; +} +form .input-with-addon, form .input-addon { + margin: 0; +} +form .input-with-addon-group { + width: 100%; +} +p, input, #social-login { + margin-bottom: 5vh; +} +form input.btn[type="submit"] { + margin: 0 2% 5vh; +} +form #social-login { + justify-content: space-around; + flex-wrap: nowrap; + width: 100%; +} +#show { + padding: 1%; + cursor: pointer; +} + +/* Social buttons */ +#social-login .btn { + padding: 2%; + text-align: center; + margin: 0 3%; + color: #FFF; +} +#social-login .btn .fa { + position: relative; +} +#social-login .btn .text { + font-size: .6em; +} +#social-login .btn.gp { + background: #ce4d39; +} +#social-login .btn.gp:hover { + background: #fb7a66; +} +#social-login .btn.fb { + background: #305891; +} +#social-login .btn.fb:hover { + background: #5d85be; +} +#social-login .btn.tw { + background: #2ca8d2; +} +#social-login .btn.tw:hover { + background: #59d5ff; +} +/* Small buttons */ +@media (max-width:600px), (min-width:800px) and (max-width:1200px) { + #social-login .btn { + padding: 0; + width: 60px; + height: 60px; + } + #social-login .btn .text { + display: none; + } + #social-login .btn .fa { + margin: 18px auto; + } +} + +/* Single column */ +@media (max-width:800px) { + + #login, #signup { + width: 100%; + } + section > .flex { + flex-direction: column; + } + section > .flex > div { + width: 100%; + } + hr { + display: block !important; + } + +} diff --git a/static/css/map.css b/static/css/map.css index 3782ba5..cd4e9d0 100644 --- a/static/css/map.css +++ b/static/css/map.css @@ -2,11 +2,10 @@ body { color: #fff; width: 100%; height: 100%; - background: #000;} -.wrap { - position: absolute; - bottom: 0px; - width: 100%; + background: #000; +} +main { + overflow: hidden; } /* Alerts */ @@ -21,20 +20,34 @@ body { /* Map and streetview */ #map, #pano {position:relative;} #pano {float:right;} -img#panoImg { width:100%; height:100%; } +#panoImg { width:100%; height:100%; } #notset {display:none} /* Tracman logo */ -.map-logo { +#map-logo { margin-left: -75px; + background: #444; background: rgba(0,0,0,.7); padding: 0 10px 0 75px; font-size: 2em; } -.map-logo a { color: #fbc93d; } +#map-logo a:hover { + text-decoration: none; +} +#map-logo img { + position: relative; + top: 3px; + margin-left: 3px; +} +#map-logo .text { + color: #fbc93d; + position: relative; + top: -3px; + margin-left: 3px; +} /* Timestamp */ -.tim { +#timestamp { color: #000; font-size: 12px; padding-left: 5px; @@ -42,43 +55,112 @@ img#panoImg { width:100%; height:100%; } background-color: rgba(255,255,255,.7); } -/*TODO: Make signs smaller on mobile */ - -/* Speed sign */ -.spd { - font-size: 32px; - height: 40px;} -.spd-sign { +/* Signs */ +#spd-sign, #alt-sign { + text-align: center; + padding: 2%; + border-radius: 3px; + margin: 3%; +} +#spd-sign { color: #000; - text-align: center; - padding: 5px; - border: 2px solid #000; - border-radius: 3px; - margin: 10px; background-color: #FFF; + border: 2px solid #000; } -/* Altitude sign */ -.alt-unit, .spd-unit { font-size:12px; } -.alt-label, .spd-label { - font-size:18px; - height:18px;} -.alt { - font-size: 32px; - height: 40px;} -.alt-sign { +#alt-sign { color: #FFF; - text-align: center; - padding: 5px; - border: 2px solid #FFF; - border-radius: 3px; - margin: 10px; background-color: #009800; + border: 2px solid #FFF; } +@media (max-width:300px) { + #spd, #alt { + height: 20px; + font-size: 18px; + } + #alt-unit, #spd-unit { + font-size: 8px; + } + #alt-label, #spd-label { + font-size: 9px; + height: 9px; + } +} +@media (min-width:300px) and (max-width:350px) { + #spd, #alt { + height: 22px; + font-size: 20px; + } + #alt-unit, #spd-unit { + font-size: 9px; + } + #alt-label, #spd-label { + font-size: 11px; + height: 11px; + } +} +@media (min-width:350px) and (max-width:400px) { + #spd, #alt { + height: 30px; + font-size: 28px; + } + #alt-unit, #spd-unit { + font-size: 10px; + } + #alt-label, #spd-label { + font-size: 14px; + height: 14px; + } +} +@media (min-width:400px) { + #spd, #alt { + height: 40px; + font-size: 32px; + } + #alt-unit, #spd-unit { + font-size: 12px; + } + #alt-label, #spd-label { + font-size: 18px; + height: 18px; + } +} + /* Control buttons */ -.btn { +#controls { + width: 100vw; + position: absolute; + bottom: 50px; + display: flex; + justify-content: space-around; +} +#controls .btn { z-index: 50; background: #222; -} .btn:hover { + height: 10vh; + padding: 2vh 0; +} +#controls .btn .fa { + margin: 0 2vw; +} +#controls .btn:hover { background: #333; +} +#controls .btn.set, #controls .btn.clear { + width: 30vw; +} +#controls .btn.track { + width: 35vw; +} +@media (max-width:250px) { + #controls .btn { font-size:.8em; } +} +@media (min-width:250px) and (max-width:350px) { + #controls .btn { font-size:1em; } +} +@media (min-width:350px) and (max-width:450px) { + #controls .btn { font-size:1.15em; } +} +@media (min-width:450px) { + #controls .btn { font-size:1.3em; } } \ No newline at end of file diff --git a/static/css/settings.css b/static/css/settings.css new file mode 100644 index 0000000..50c4a5f --- /dev/null +++ b/static/css/settings.css @@ -0,0 +1,70 @@ +/* Social button styles */ +#social-connect { + flex-wrap: wrap; +} +#social-connect > .btn { + text-align: center; + display: flex; + align-items: center; + margin-left: 1vw; + margin-right: 1vw; + flex-grow: 1; + flex-basis: 0; + font-size: .9em; +} +#social-connect > .btn:hover { + color: #fff; +} +#social-connect > .btn .fa { + font-size: 1.1em; + margin-left: 0; + margin-right: 5%; +} + +/* Connected social button styles */ +#social-connect > .btn.gp.connected { + border: 2px solid rgb(206,77,57); +} +#social-connect > .btn.fb.connected { + border: 2px solid rgb(48,88,145); +} +#social-connect > .btn.tw.connected { + border: 2px solid rgb(44,168,210); +} + +/* Unconnected social button styles */ +#social-connect > .btn.gp:not(.connected) { + background: rgb(206,77,57); +} +#social-connect > .btn.gp:not(.connected):hover { + background: rgb(251,122,102); +} +#social-connect > .btn.fb:not(.connected) { + background: rgb(48,88,145); +} +#social-connect > .btn.fb:not(.connected):hover { + background: rgb(93,133,190); +} +#social-connect > .btn.tw:not(.connected) { + background: rgb(44,168,210); +} +#social-connect > .btn.tw:not(.connected):hover { + background: rgb(89,213,255); +} + +/* Submit buttons */ +#submit-group { + justify-content: space-around; +} +#submit-group .main { + width: 50%; +} + +/* Help */ +.help { + display: none; + width: 100%; + margin-top: 2%; + margin-bottom: 0; + text-align: right; +} \ No newline at end of file diff --git a/static/js/common-passwords.js b/static/js/common-passwords.js new file mode 100644 index 0000000..18a785d --- /dev/null +++ b/static/js/common-passwords.js @@ -0,0 +1,10002 @@ +Mellt.prototype.CommonPasswords = [ + 'password', + '123456', + '12345678', + '1234', + 'qwerty', + '12345', + 'dragon', + 'pussy', + 'baseball', + 'football', + 'letmein', + 'monkey', + '696969', + 'abc123', + 'mustang', + 'michael', + 'shadow', + 'master', + 'jennifer', + '111111', + '2000', + 'jordan', + 'superman', + 'harley', + '1234567', + 'fuckme', + 'hunter', + 'fuckyou', + 'trustno1', + 'ranger', + 'buster', + 'thomas', + 'tigger', + 'robert', + 'soccer', + 'fuck', + 'batman', + 'test', + 'pass', + 'killer', + 'hockey', + 'george', + 'charlie', + 'andrew', + 'michelle', + 'love', + 'sunshine', + 'jessica', + 'asshole', + '6969', + 'pepper', + 'daniel', + 'access', + '123456789', + '654321', + 'joshua', + 'maggie', + 'starwars', + 'silver', + 'william', + 'dallas', + 'yankees', + '123123', + 'ashley', + '666666', + 'hello', + 'amanda', + 'orange', + 'biteme', + 'freedom', + 'computer', + 'sexy', + 'thunder', + 'nicole', + 'ginger', + 'heather', + 'hammer', + 'summer', + 'corvette', + 'taylor', + 'fucker', + 'austin', + '1111', + 'merlin', + 'matthew', + '121212', + 'golfer', + 'cheese', + 'princess', + 'martin', + 'chelsea', + 'patrick', + 'richard', + 'diamond', + 'yellow', + 'bigdog', + 'secret', + 'asdfgh', + 'sparky', + 'cowboy', + 'camaro', + 'anthony', + 'matrix', + 'falcon', + 'iloveyou', + 'bailey', + 'guitar', + 'jackson', + 'purple', + 'scooter', + 'phoenix', + 'aaaaaa', + 'morgan', + 'tigers', + 'porsche', + 'mickey', + 'maverick', + 'cookie', + 'nascar', + 'peanut', + 'justin', + '131313', + 'money', + 'horny', + 'samantha', + 'panties', + 'steelers', + 'joseph', + 'snoopy', + 'boomer', + 'whatever', + 'iceman', + 'smokey', + 'gateway', + 'dakota', + 'cowboys', + 'eagles', + 'chicken', + 'dick', + 'black', + 'zxcvbn', + 'please', + 'andrea', + 'ferrari', + 'knight', + 'hardcore', + 'melissa', + 'compaq', + 'coffee', + 'booboo', + 'bitch', + 'johnny', + 'bulldog', + 'xxxxxx', + 'welcome', + 'james', + 'player', + 'ncc1701', + 'wizard', + 'scooby', + 'charles', + 'junior', + 'internet', + 'bigdick', + 'mike', + 'brandy', + 'tennis', + 'blowjob', + 'banana', + 'monster', + 'spider', + 'lakers', + 'miller', + 'rabbit', + 'enter', + 'mercedes', + 'brandon', + 'steven', + 'fender', + 'john', + 'yamaha', + 'diablo', + 'chris', + 'boston', + 'tiger', + 'marine', + 'chicago', + 'rangers', + 'gandalf', + 'winter', + 'bigtits', + 'barney', + 'edward', + 'raiders', + 'porn', + 'badboy', + 'blowme', + 'spanky', + 'bigdaddy', + 'johnson', + 'chester', + 'london', + 'midnight', + 'blue', + 'fishing', + '000000', + 'hannah', + 'slayer', + '11111111', + 'rachel', + 'sexsex', + 'redsox', + 'thx1138', + 'asdf', + 'marlboro', + 'panther', + 'zxcvbnm', + 'arsenal', + 'oliver', + 'qazwsx', + 'mother', + 'victoria', + '7777777', + 'jasper', + 'angel', + 'david', + 'winner', + 'crystal', + 'golden', + 'butthead', + 'viking', + 'jack', + 'iwantu', + 'shannon', + 'murphy', + 'angels', + 'prince', + 'cameron', + 'girls', + 'madison', + 'wilson', + 'carlos', + 'hooters', + 'willie', + 'startrek', + 'captain', + 'maddog', + 'jasmine', + 'butter', + 'booger', + 'angela', + 'golf', + 'lauren', + 'rocket', + 'tiffany', + 'theman', + 'dennis', + 'liverpoo', + 'flower', + 'forever', + 'green', + 'jackie', + 'muffin', + 'turtle', + 'sophie', + 'danielle', + 'redskins', + 'toyota', + 'jason', + 'sierra', + 'winston', + 'debbie', + 'giants', + 'packers', + 'newyork', + 'jeremy', + 'casper', + 'bubba', + '112233', + 'sandra', + 'lovers', + 'mountain', + 'united', + 'cooper', + 'driver', + 'tucker', + 'helpme', + 'fucking', + 'pookie', + 'lucky', + 'maxwell', + '8675309', + 'bear', + 'suckit', + 'gators', + '5150', + '222222', + 'shithead', + 'fuckoff', + 'jaguar', + 'monica', + 'fred', + 'happy', + 'hotdog', + 'tits', + 'gemini', + 'lover', + 'xxxxxxxx', + '777777', + 'canada', + 'nathan', + 'victor', + 'florida', + '88888888', + 'nicholas', + 'rosebud', + 'metallic', + 'doctor', + 'trouble', + 'success', + 'stupid', + 'tomcat', + 'warrior', + 'peaches', + 'apples', + 'fish', + 'qwertyui', + 'magic', + 'buddy', + 'dolphins', + 'rainbow', + 'gunner', + '987654', + 'freddy', + 'alexis', + 'braves', + 'cock', + '2112', + '1212', + 'cocacola', + 'xavier', + 'dolphin', + 'testing', + 'bond007', + 'member', + 'calvin', + 'voodoo', + '7777', + 'samson', + 'alex', + 'apollo', + 'fire', + 'tester', + 'walter', + 'beavis', + 'voyager', + 'peter', + 'porno', + 'bonnie', + 'rush2112', + 'beer', + 'apple', + 'scorpio', + 'jonathan', + 'skippy', + 'sydney', + 'scott', + 'red123', + 'power', + 'gordon', + 'travis', + 'beaver', + 'star', + 'jackass', + 'flyers', + 'boobs', + '232323', + 'zzzzzz', + 'steve', + 'rebecca', + 'scorpion', + 'doggie', + 'legend', + 'ou812', + 'yankee', + 'blazer', + 'bill', + 'runner', + 'birdie', + 'bitches', + '555555', + 'parker', + 'topgun', + 'asdfasdf', + 'heaven', + 'viper', + 'animal', + '2222', + 'bigboy', + '4444', + 'arthur', + 'baby', + 'private', + 'godzilla', + 'donald', + 'williams', + 'lifehack', + 'phantom', + 'dave', + 'rock', + 'august', + 'sammy', + 'cool', + 'brian', + 'platinum', + 'jake', + 'bronco', + 'paul', + 'mark', + 'frank', + 'heka6w2', + 'copper', + 'billy', + 'cumshot', + 'garfield', + 'willow', + 'cunt', + 'little', + 'carter', + 'slut', + 'albert', + '69696969', + 'kitten', + 'super', + 'jordan23', + 'eagle1', + 'shelby', + 'america', + '11111', + 'jessie', + 'house', + 'free', + '123321', + 'chevy', + 'bullshit', + 'white', + 'broncos', + 'horney', + 'surfer', + 'nissan', + '999999', + 'saturn', + 'airborne', + 'elephant', + 'marvin', + 'shit', + 'action', + 'adidas', + 'qwert', + 'kevin', + '1313', + 'explorer', + 'walker', + 'police', + 'christin', + 'december', + 'benjamin', + 'wolf', + 'sweet', + 'therock', + 'king', + 'online', + 'dickhead', + 'brooklyn', + 'teresa', + 'cricket', + 'sharon', + 'dexter', + 'racing', + 'penis', + 'gregory', + '0000', + 'teens', + 'redwings', + 'dreams', + 'michigan', + 'hentai', + 'magnum', + '87654321', + 'nothing', + 'donkey', + 'trinity', + 'digital', + '333333', + 'stella', + 'cartman', + 'guinness', + '123abc', + 'speedy', + 'buffalo', + 'kitty', + 'pimpin', + 'eagle', + 'einstein', + 'kelly', + 'nelson', + 'nirvana', + 'vampire', + 'xxxx', + 'playboy', + 'louise', + 'pumpkin', + 'snowball', + 'test123', + 'girl', + 'sucker', + 'mexico', + 'beatles', + 'fantasy', + 'ford', + 'gibson', + 'celtic', + 'marcus', + 'cherry', + 'cassie', + '888888', + 'natasha', + 'sniper', + 'chance', + 'genesis', + 'hotrod', + 'reddog', + 'alexande', + 'college', + 'jester', + 'passw0rd', + 'bigcock', + 'smith', + 'lasvegas', + 'carmen', + 'slipknot', + '3333', + 'death', + 'kimberly', + '1q2w3e', + 'eclipse', + '1q2w3e4r', + 'stanley', + 'samuel', + 'drummer', + 'homer', + 'montana', + 'music', + 'aaaa', + 'spencer', + 'jimmy', + 'carolina', + 'colorado', + 'creative', + 'hello1', + 'rocky', + 'goober', + 'friday', + 'bollocks', + 'scotty', + 'abcdef', + 'bubbles', + 'hawaii', + 'fluffy', + 'mine', + 'stephen', + 'horses', + 'thumper', + '5555', + 'pussies', + 'darkness', + 'asdfghjk', + 'pamela', + 'boobies', + 'buddha', + 'vanessa', + 'sandman', + 'naughty', + 'douglas', + 'honda', + 'matt', + 'azerty', + '6666', + 'shorty', + 'money1', + 'beach', + 'loveme', + '4321', + 'simple', + 'poohbear', + '444444', + 'badass', + 'destiny', + 'sarah', + 'denise', + 'vikings', + 'lizard', + 'melanie', + 'assman', + 'sabrina', + 'nintendo', + 'water', + 'good', + 'howard', + 'time', + '123qwe', + 'november', + 'xxxxx', + 'october', + 'leather', + 'bastard', + 'young', + '101010', + 'extreme', + 'hard', + 'password1', + 'vincent', + 'pussy1', + 'lacrosse', + 'hotmail', + 'spooky', + 'amateur', + 'alaska', + 'badger', + 'paradise', + 'maryjane', + 'poop', + 'crazy', + 'mozart', + 'video', + 'russell', + 'vagina', + 'spitfire', + 'anderson', + 'norman', + 'eric', + 'cherokee', + 'cougar', + 'barbara', + 'long', + '420420', + 'family', + 'horse', + 'enigma', + 'allison', + 'raider', + 'brazil', + 'blonde', + 'jones', + '55555', + 'dude', + 'drowssap', + 'jeff', + 'school', + 'marshall', + 'lovely', + '1qaz2wsx', + 'jeffrey', + 'caroline', + 'franklin', + 'booty', + 'molly', + 'snickers', + 'leslie', + 'nipples', + 'courtney', + 'diesel', + 'rocks', + 'eminem', + 'westside', + 'suzuki', + 'daddy', + 'passion', + 'hummer', + 'ladies', + 'zachary', + 'frankie', + 'elvis', + 'reggie', + 'alpha', + 'suckme', + 'simpson', + 'patricia', + '147147', + 'pirate', + 'tommy', + 'semperfi', + 'jupiter', + 'redrum', + 'freeuser', + 'wanker', + 'stinky', + 'ducati', + 'paris', + 'natalie', + 'babygirl', + 'bishop', + 'windows', + 'spirit', + 'pantera', + 'monday', + 'patches', + 'brutus', + 'houston', + 'smooth', + 'penguin', + 'marley', + 'forest', + 'cream', + '212121', + 'flash', + 'maximus', + 'nipple', + 'bobby', + 'bradley', + 'vision', + 'pokemon', + 'champion', + 'fireman', + 'indian', + 'softball', + 'picard', + 'system', + 'clinton', + 'cobra', + 'enjoy', + 'lucky1', + 'claire', + 'claudia', + 'boogie', + 'timothy', + 'marines', + 'security', + 'dirty', + 'admin', + 'wildcats', + 'pimp', + 'dancer', + 'hardon', + 'veronica', + 'fucked', + 'abcd1234', + 'abcdefg', + 'ironman', + 'wolverin', + 'remember', + 'great', + 'freepass', + 'bigred', + 'squirt', + 'justice', + 'francis', + 'hobbes', + 'kermit', + 'pearljam', + 'mercury', + 'domino', + '9999', + 'denver', + 'brooke', + 'rascal', + 'hitman', + 'mistress', + 'simon', + 'tony', + 'bbbbbb', + 'friend', + 'peekaboo', + 'naked', + 'budlight', + 'electric', + 'sluts', + 'stargate', + 'saints', + 'bondage', + 'brittany', + 'bigman', + 'zombie', + 'swimming', + 'duke', + 'qwerty1', + 'babes', + 'scotland', + 'disney', + 'rooster', + 'brenda', + 'mookie', + 'swordfis', + 'candy', + 'duncan', + 'olivia', + 'hunting', + 'blink182', + 'alicia', + '8888', + 'samsung', + 'bubba1', + 'whore', + 'virginia', + 'general', + 'passport', + 'aaaaaaaa', + 'erotic', + 'liberty', + 'arizona', + 'jesus', + 'abcd', + 'newport', + 'skipper', + 'rolltide', + 'balls', + 'happy1', + 'galore', + 'christ', + 'weasel', + '242424', + 'wombat', + 'digger', + 'classic', + 'bulldogs', + 'poopoo', + 'accord', + 'popcorn', + 'turkey', + 'jenny', + 'amber', + 'bunny', + 'mouse', + '007007', + 'titanic', + 'liverpool', + 'dreamer', + 'everton', + 'friends', + 'chevelle', + 'carrie', + 'gabriel', + 'psycho', + 'nemesis', + 'burton', + 'pontiac', + 'connor', + 'eatme', + 'lickme', + 'roland', + 'cumming', + 'mitchell', + 'ireland', + 'lincoln', + 'arnold', + 'spiderma', + 'patriots', + 'goblue', + 'devils', + 'eugene', + 'empire', + 'asdfg', + 'cardinal', + 'brown', + 'shaggy', + 'froggy', + 'qwer', + 'kawasaki', + 'kodiak', + 'people', + 'phpbb', + 'light', + '54321', + 'kramer', + 'chopper', + 'hooker', + 'honey', + 'whynot', + 'lesbian', + 'lisa', + 'baxter', + 'adam', + 'snake', + 'teen', + 'ncc1701d', + 'qqqqqq', + 'airplane', + 'britney', + 'avalon', + 'sandy', + 'sugar', + 'sublime', + 'stewart', + 'wildcat', + 'raven', + 'scarface', + 'elizabet', + '123654', + 'trucks', + 'wolfpack', + 'pervert', + 'lawrence', + 'raymond', + 'redhead', + 'american', + 'alyssa', + 'bambam', + 'movie', + 'woody', + 'shaved', + 'snowman', + 'tiger1', + 'chicks', + 'raptor', + '1969', + 'stingray', + 'shooter', + 'france', + 'stars', + 'madmax', + 'kristen', + 'sports', + 'jerry', + '789456', + 'garcia', + 'simpsons', + 'lights', + 'ryan', + 'looking', + 'chronic', + 'alison', + 'hahaha', + 'packard', + 'hendrix', + 'perfect', + 'service', + 'spring', + 'srinivas', + 'spike', + 'katie', + '252525', + 'oscar', + 'brother', + 'bigmac', + 'suck', + 'single', + 'cannon', + 'georgia', + 'popeye', + 'tattoo', + 'texas', + 'party', + 'bullet', + 'taurus', + 'sailor', + 'wolves', + 'panthers', + 'japan', + 'strike', + 'flowers', + 'pussycat', + 'chris1', + 'loverboy', + 'berlin', + 'sticky', + 'marina', + 'tarheels', + 'fisher', + 'russia', + 'connie', + 'wolfgang', + 'testtest', + 'mature', + 'bass', + 'catch22', + 'juice', + 'michael1', + 'nigger', + '159753', + 'women', + 'alpha1', + 'trooper', + 'hawkeye', + 'head', + 'freaky', + 'dodgers', + 'pakistan', + 'machine', + 'pyramid', + 'vegeta', + 'katana', + 'moose', + 'tinker', + 'coyote', + 'infinity', + 'inside', + 'pepsi', + 'letmein1', + 'bang', + 'control', + 'hercules', + 'morris', + 'james1', + 'tickle', + 'outlaw', + 'browns', + 'billybob', + 'pickle', + 'test1', + 'michele', + 'antonio', + 'sucks', + 'pavilion', + 'changeme', + 'caesar', + 'prelude', + 'tanner', + 'adrian', + 'darkside', + 'bowling', + 'wutang', + 'sunset', + 'robbie', + 'alabama', + 'danger', + 'zeppelin', + 'juan', + 'rusty', + 'pppppp', + 'nick', + '2001', + 'ping', + 'darkstar', + 'madonna', + 'qwe123', + 'bigone', + 'casino', + 'cheryl', + 'charlie1', + 'mmmmmm', + 'integra', + 'wrangler', + 'apache', + 'tweety', + 'qwerty12', + 'bobafett', + 'simone', + 'none', + 'business', + 'sterling', + 'trevor', + 'transam', + 'dustin', + 'harvey', + 'england', + '2323', + 'seattle', + 'ssssss', + 'rose', + 'harry', + 'openup', + 'pandora', + 'pussys', + 'trucker', + 'wallace', + 'indigo', + 'storm', + 'malibu', + 'weed', + 'review', + 'babydoll', + 'doggy', + 'dilbert', + 'pegasus', + 'joker', + 'catfish', + 'flipper', + 'valerie', + 'herman', + 'fuckit', + 'detroit', + 'kenneth', + 'cheyenne', + 'bruins', + 'stacey', + 'smoke', + 'joey', + 'seven', + 'marino', + 'fetish', + 'xfiles', + 'wonder', + 'stinger', + 'pizza', + 'babe', + 'pretty', + 'stealth', + 'manutd', + 'gracie', + 'gundam', + 'cessna', + 'longhorn', + 'presario', + 'mnbvcxz', + 'wicked', + 'mustang1', + 'victory', + '21122112', + 'shelly', + 'awesome', + 'athena', + 'q1w2e3r4', + 'help', + 'holiday', + 'knicks', + 'street', + 'redneck', + '12341234', + 'casey', + 'gizmo', + 'scully', + 'dragon1', + 'devildog', + 'triumph', + 'eddie', + 'bluebird', + 'shotgun', + 'peewee', + 'ronnie', + 'angel1', + 'daisy', + 'special', + 'metallica', + 'madman', + 'country', + 'impala', + 'lennon', + 'roscoe', + 'omega', + 'access14', + 'enterpri', + 'miranda', + 'search', + 'smitty', + 'blizzard', + 'unicorn', + 'tight', + 'rick', + 'ronald', + 'asdf1234', + 'harrison', + 'trigger', + 'truck', + 'danny', + 'home', + 'winnie', + 'beauty', + 'thailand', + '1234567890', + 'cadillac', + 'castle', + 'tyler', + 'bobcat', + 'buddy1', + 'sunny', + 'stones', + 'asian', + 'freddie', + 'chuck', + 'butt', + 'loveyou', + 'norton', + 'hellfire', + 'hotsex', + 'indiana', + 'short', + 'panzer', + 'lonewolf', + 'trumpet', + 'colors', + 'blaster', + '12121212', + 'fireball', + 'logan', + 'precious', + 'aaron', + 'elaine', + 'jungle', + 'atlanta', + 'gold', + 'corona', + 'curtis', + 'nikki', + 'polaris', + 'timber', + 'theone', + 'baller', + 'chipper', + 'orlando', + 'island', + 'skyline', + 'dragons', + 'dogs', + 'benson', + 'licker', + 'goldie', + 'engineer', + 'kong', + 'pencil', + 'basketba', + 'open', + 'hornet', + 'world', + 'linda', + 'barbie', + 'chan', + 'farmer', + 'valentin', + 'wetpussy', + 'indians', + 'larry', + 'redman', + 'foobar', + 'travel', + 'morpheus', + 'bernie', + 'target', + '141414', + 'hotstuff', + 'photos', + 'laura', + 'savage', + 'holly', + 'rocky1', + 'fuck_inside', + 'dollar', + 'turbo', + 'design', + 'newton', + 'hottie', + 'moon', + '202020', + 'blondes', + '4128', + 'lestat', + 'avatar', + 'future', + 'goforit', + 'random', + 'abgrtyu', + 'jjjjjj', + 'cancer', + 'q1w2e3', + 'smiley', + 'goldberg', + 'express', + 'virgin', + 'zipper', + 'wrinkle1', + 'stone', + 'andy', + 'babylon', + 'dong', + 'powers', + 'consumer', + 'dudley', + 'monkey1', + 'serenity', + 'samurai', + '99999999', + 'bigboobs', + 'skeeter', + 'lindsay', + 'joejoe', + 'master1', + 'aaaaa', + 'chocolat', + 'christia', + 'birthday', + 'stephani', + 'tang', + '1234qwer', + 'alfred', + 'ball', + '98765432', + 'maria', + 'sexual', + 'maxima', + '77777777', + 'sampson', + 'buckeye', + 'highland', + 'kristin', + 'seminole', + 'reaper', + 'bassman', + 'nugget', + 'lucifer', + 'airforce', + 'nasty', + 'watson', + 'warlock', + '2121', + 'philip', + 'always', + 'dodge', + 'chrissy', + 'burger', + 'bird', + 'snatch', + 'missy', + 'pink', + 'gang', + 'maddie', + 'holmes', + 'huskers', + 'piglet', + 'photo', + 'joanne', + 'hamilton', + 'dodger', + 'paladin', + 'christy', + 'chubby', + 'buckeyes', + 'hamlet', + 'abcdefgh', + 'bigfoot', + 'sunday', + 'manson', + 'goldfish', + 'garden', + 'deftones', + 'icecream', + 'blondie', + 'spartan', + 'julie', + 'harold', + 'charger', + 'brandi', + 'stormy', + 'sherry', + 'pleasure', + 'juventus', + 'rodney', + 'galaxy', + 'holland', + 'escort', + 'zxcvb', + 'planet', + 'jerome', + 'wesley', + 'blues', + 'song', + 'peace', + 'david1', + 'ncc1701e', + '1966', + '51505150', + 'cavalier', + 'gambit', + 'karen', + 'sidney', + 'ripper', + 'oicu812', + 'jamie', + 'sister', + 'marie', + 'martha', + 'nylons', + 'aardvark', + 'nadine', + 'minnie', + 'whiskey', + 'bing', + 'plastic', + 'anal', + 'babylon5', + 'chang', + 'savannah', + 'loser', + 'racecar', + 'insane', + 'yankees1', + 'mememe', + 'hansolo', + 'chiefs', + 'fredfred', + 'freak', + 'frog', + 'salmon', + 'concrete', + 'yvonne', + 'zxcv', + 'shamrock', + 'atlantis', + 'warren', + 'wordpass', + 'julian', + 'mariah', + 'rommel', + '1010', + 'harris', + 'predator', + 'sylvia', + 'massive', + 'cats', + 'sammy1', + 'mister', + 'stud', + 'marathon', + 'rubber', + 'ding', + 'trunks', + 'desire', + 'montreal', + 'justme', + 'faster', + 'kathleen', + 'irish', + '1999', + 'bertha', + 'jessica1', + 'alpine', + 'sammie', + 'diamonds', + 'tristan', + '00000', + 'swinger', + 'shan', + 'stallion', + 'pitbull', + 'letmein2', + 'roberto', + 'ready', + 'april', + 'palmer', + 'ming', + 'shadow1', + 'audrey', + 'chong', + 'clitoris', + 'wang', + 'shirley', + 'fuckers', + 'jackoff', + 'bluesky', + 'sundance', + 'renegade', + 'hollywoo', + '151515', + 'bernard', + 'wolfman', + 'soldier', + 'picture', + 'pierre', + 'ling', + 'goddess', + 'manager', + 'nikita', + 'sweety', + 'titans', + 'hang', + 'fang', + 'ficken', + 'niners', + 'bottom', + 'bubble', + 'hello123', + 'ibanez', + 'webster', + 'sweetpea', + 'stocking', + '323232', + 'tornado', + 'lindsey', + 'content', + 'bruce', + 'buck', + 'aragorn', + 'griffin', + 'chen', + 'campbell', + 'trojan', + 'christop', + 'newman', + 'wayne', + 'tina', + 'rockstar', + 'father', + 'geronimo', + 'pascal', + 'crimson', + 'brooks', + 'hector', + 'penny', + 'anna', + 'google', + 'camera', + 'chandler', + 'fatcat', + 'lovelove', + 'cody', + 'cunts', + 'waters', + 'stimpy', + 'finger', + 'cindy', + 'wheels', + 'viper1', + 'latin', + 'robin', + 'greenday', + '987654321', + 'creampie', + 'brendan', + 'hiphop', + 'willy', + 'snapper', + 'funtime', + 'duck', + 'trombone', + 'adult', + 'cotton', + 'cookies', + 'kaiser', + 'mulder', + 'westham', + 'latino', + 'jeep', + 'ravens', + 'aurora', + 'drizzt', + 'madness', + 'energy', + 'kinky', + '314159', + 'sophia', + 'stefan', + 'slick', + 'rocker', + '55555555', + 'freeman', + 'french', + 'mongoose', + 'speed', + 'dddddd', + 'hong', + 'henry', + 'hungry', + 'yang', + 'catdog', + 'cheng', + 'ghost', + 'gogogo', + 'randy', + 'tottenha', + 'curious', + 'butterfl', + 'mission', + 'january', + 'singer', + 'sherman', + 'shark', + 'techno', + 'lancer', + 'lalala', + 'autumn', + 'chichi', + 'orion', + 'trixie', + 'clifford', + 'delta', + 'bobbob', + 'bomber', + 'holden', + 'kang', + 'kiss', + '1968', + 'spunky', + 'liquid', + 'mary', + 'beagle', + 'granny', + 'network', + 'bond', + 'kkkkkk', + 'millie', + '1973', + 'biggie', + 'beetle', + 'teacher', + 'susan', + 'toronto', + 'anakin', + 'genius', + 'dream', + 'cocks', + 'dang', + 'bush', + 'karate', + 'snakes', + 'bangkok', + 'callie', + 'fuckyou2', + 'pacific', + 'daytona', + 'kelsey', + 'infantry', + 'skywalke', + 'foster', + 'felix', + 'sailing', + 'raistlin', + 'vanhalen', + 'huang', + 'herbert', + 'jacob', + 'blackie', + 'tarzan', + 'strider', + 'sherlock', + 'lang', + 'gong', + 'sang', + 'dietcoke', + 'ultimate', + 'tree', + 'shai', + 'sprite', + 'ting', + 'artist', + 'chai', + 'chao', + 'devil', + 'python', + 'ninja', + 'misty', + 'ytrewq', + 'sweetie', + 'superfly', + '456789', + 'tian', + 'jing', + 'jesus1', + 'freedom1', + 'dian', + 'drpepper', + 'potter', + 'chou', + 'darren', + 'hobbit', + 'violet', + 'yong', + 'shen', + 'phillip', + 'maurice', + 'gloria', + 'nolimit', + 'mylove', + 'biscuit', + 'yahoo', + 'shasta', + 'sex4me', + 'smoker', + 'smile', + 'pebbles', + 'pics', + 'philly', + 'tong', + 'tintin', + 'lesbians', + 'marlin', + 'cactus', + 'frank1', + 'tttttt', + 'chun', + 'danni', + 'emerald', + 'showme', + 'pirates', + 'lian', + 'dogg', + 'colleen', + 'xiao', + 'xian', + 'tazman', + 'tanker', + 'patton', + 'toshiba', + 'richie', + 'alberto', + 'gotcha', + 'graham', + 'dillon', + 'rang', + 'emily', + 'keng', + 'jazz', + 'bigguy', + 'yuan', + 'woman', + 'tomtom', + 'marion', + 'greg', + 'chaos', + 'fossil', + 'flight', + 'racerx', + 'tuan', + 'creamy', + 'boss', + 'bobo', + 'musicman', + 'warcraft', + 'window', + 'blade', + 'shuang', + 'sheila', + 'shun', + 'lick', + 'jian', + 'microsoft', + 'rong', + 'allen', + 'feng', + 'getsome', + 'sally', + 'quality', + 'kennedy', + 'morrison', + '1977', + 'beng', + 'wwwwww', + 'yoyoyo', + 'zhang', + 'seng', + 'teddy', + 'joanna', + 'andreas', + 'harder', + 'luke', + 'qazxsw', + 'qian', + 'cong', + 'chuan', + 'deng', + 'nang', + 'boeing', + 'keeper', + 'western', + 'isabelle', + '1963', + 'subaru', + 'sheng', + 'thuglife', + 'teng', + 'jiong', + 'miao', + 'martina', + 'mang', + 'maniac', + 'pussie', + 'tracey', + 'a1b2c3', + 'clayton', + 'zhou', + 'zhuang', + 'xing', + 'stonecol', + 'snow', + 'spyder', + 'liang', + 'jiang', + 'memphis', + 'regina', + 'ceng', + 'magic1', + 'logitech', + 'chuang', + 'dark', + 'million', + 'blow', + 'sesame', + 'shao', + 'poison', + 'titty', + 'terry', + 'kuan', + 'kuai', + 'kyle', + 'mian', + 'guan', + 'hamster', + 'guai', + 'ferret', + 'florence', + 'geng', + 'duan', + 'pang', + 'maiden', + 'quan', + 'velvet', + 'nong', + 'neng', + 'nookie', + 'buttons', + 'bian', + 'bingo', + 'biao', + 'zhong', + 'zeng', + 'xiong', + 'zhun', + 'ying', + 'zong', + 'xuan', + 'zang', + '0.0.000', + 'suan', + 'shei', + 'shui', + 'sharks', + 'shang', + 'shua', + 'small', + 'peng', + 'pian', + 'piao', + 'liao', + 'meng', + 'miami', + 'reng', + 'guang', + 'cang', + 'change', + 'ruan', + 'diao', + 'luan', + 'lucas', + 'qing', + 'chui', + 'chuo', + 'cuan', + 'nuan', + 'ning', + 'heng', + 'huan', + 'kansas', + 'muscle', + 'monroe', + 'weng', + 'whitney', + '1passwor', + 'bluemoon', + 'zhui', + 'zhua', + 'xiang', + 'zheng', + 'zhen', + 'zhei', + 'zhao', + 'zhan', + 'yomama', + 'zhai', + 'zhuo', + 'zuan', + 'tarheel', + 'shou', + 'shuo', + 'tiao', + 'lady', + 'leonard', + 'leng', + 'kuang', + 'jiao', + '13579', + 'basket', + 'qiao', + 'qiong', + 'qiang', + 'chuai', + 'nian', + 'niao', + 'niang', + 'huai', + '22222222', + 'bianca', + 'zhuan', + 'zhuai', + 'shuan', + 'shuai', + 'stardust', + 'jumper', + 'margaret', + 'archie', + '66666666', + 'charlott', + 'forget', + 'qwertz', + 'bones', + 'history', + 'milton', + 'waterloo', + '2002', + 'stuff', + '11223344', + 'office', + 'oldman', + 'preston', + 'trains', + 'murray', + 'vertigo', + '246810', + 'black1', + 'swallow', + 'smiles', + 'standard', + 'alexandr', + 'parrot', + 'luther', + 'user', + 'nicolas', + '1976', + 'surfing', + 'pioneer', + 'pete', + 'masters', + 'apple1', + 'asdasd', + 'auburn', + 'hannibal', + 'frontier', + 'panama', + 'lucy', + 'buffy', + 'brianna', + 'welcome1', + 'vette', + 'blue22', + 'shemale', + '111222', + 'baggins', + 'groovy', + 'global', + 'turner', + '181818', + '1979', + 'blades', + 'spanking', + 'life', + 'byteme', + 'lobster', + 'collins', + 'dawg', + 'hilton', + 'japanese', + '1970', + '1964', + '2424', + 'polo', + 'markus', + 'coco', + 'deedee', + 'mikey', + '1972', + '171717', + '1701', + 'strip', + 'jersey', + 'green1', + 'capital', + 'sasha', + 'sadie', + 'putter', + 'vader', + 'seven7', + 'lester', + 'marcel', + 'banshee', + 'grendel', + 'gilbert', + 'dicks', + 'dead', + 'hidden', + 'iloveu', + '1980', + 'sound', + 'ledzep', + 'michel', + '147258', + 'female', + 'bugger', + 'buffett', + 'bryan', + 'hell', + 'kristina', + 'molson', + '2020', + 'wookie', + 'sprint', + 'thanks', + 'jericho', + '102030', + 'grace', + 'fuckin', + 'mandy', + 'ranger1', + 'trebor', + 'deepthroat', + 'bonehead', + 'molly1', + 'mirage', + 'models', + '1984', + '2468', + 'stuart', + 'showtime', + 'squirrel', + 'pentium', + 'mario', + 'anime', + 'gator', + 'powder', + 'twister', + 'connect', + 'neptune', + 'bruno', + 'butts', + 'engine', + 'eatshit', + 'mustangs', + 'woody1', + 'shogun', + 'septembe', + 'pooh', + 'jimbo', + 'roger', + 'annie', + 'bacon', + 'center', + 'russian', + 'sabine', + 'damien', + 'mollie', + 'voyeur', + '2525', + '363636', + 'leonardo', + 'camel', + 'chair', + 'germany', + 'giant', + 'qqqq', + 'nudist', + 'bone', + 'sleepy', + 'tequila', + 'megan', + 'fighter', + 'garrett', + 'dominic', + 'obiwan', + 'makaveli', + 'vacation', + 'walnut', + '1974', + 'ladybug', + 'cantona', + 'ccbill', + 'satan', + 'rusty1', + 'passwor1', + 'columbia', + 'napoleon', + 'dusty', + 'kissme', + 'motorola', + 'william1', + '1967', + 'zzzz', + 'skater', + 'smut', + 'play', + 'matthew1', + 'robinson', + 'valley', + 'coolio', + 'dagger', + 'boner', + 'bull', + 'horndog', + 'jason1', + 'blake', + 'penguins', + 'rescue', + 'griffey', + '8j4ye3uz', + 'californ', + 'champs', + 'qwertyuiop', + 'portland', + 'queen', + 'colt45', + 'boat', + 'xxxxxxx', + 'xanadu', + 'tacoma', + 'mason', + 'carpet', + 'gggggg', + 'safety', + 'palace', + 'italia', + 'stevie', + 'picturs', + 'picasso', + 'thongs', + 'tempest', + 'ricardo', + 'roberts', + 'asd123', + 'hairy', + 'foxtrot', + 'gary', + 'nimrod', + 'hotboy', + '343434', + '1111111', + 'asdfghjkl', + 'goose', + 'overlord', + 'blood', + 'wood', + 'stranger', + '454545', + 'shaolin', + 'sooners', + 'socrates', + 'spiderman', + 'peanuts', + 'maxine', + 'rogers', + '13131313', + 'andrew1', + 'filthy', + 'donnie', + 'ohyeah', + 'africa', + 'national', + 'kenny', + 'keith', + 'monique', + 'intrepid', + 'jasmin', + 'pickles', + 'assass', + 'fright', + 'potato', + 'darwin', + 'hhhhhh', + 'kingdom', + 'weezer', + '424242', + 'pepsi1', + 'throat', + 'romeo', + 'gerard', + 'looker', + 'puppy', + 'butch', + 'monika', + 'suzanne', + 'sweets', + 'temple', + 'laurie', + 'josh', + 'megadeth', + 'analsex', + 'nymets', + 'ddddddd', + 'bigballs', + 'support', + 'stick', + 'today', + 'down', + 'oakland', + 'oooooo', + 'qweasd', + 'chucky', + 'bridge', + 'carrot', + 'chargers', + 'discover', + 'dookie', + 'condor', + 'night', + 'butler', + 'hoover', + 'horny1', + 'isabella', + 'sunrise', + 'sinner', + 'jojo', + 'megapass', + 'martini', + 'assfuck', + 'grateful', + 'ffffff', + 'abigail', + 'esther', + 'mushroom', + 'janice', + 'jamaica', + 'wright', + 'sims', + 'space', + 'there', + 'timmy', + '7654321', + '77777', + 'cccccc', + 'gizmodo', + 'roxanne', + 'ralph', + 'tractor', + 'cristina', + 'dance', + 'mypass', + 'hongkong', + 'helena', + '1975', + 'blue123', + 'pissing', + 'thomas1', + 'redred', + 'rich', + 'basketball', + 'attack', + 'cash', + 'satan666', + 'drunk', + 'dixie', + 'dublin', + 'bollox', + 'kingkong', + 'katrina', + 'miles', + '1971', + '22222', + '272727', + 'sexx', + 'penelope', + 'thompson', + 'anything', + 'bbbb', + 'battle', + 'grizzly', + 'passat', + 'porter', + 'tracy', + 'defiant', + 'bowler', + 'knickers', + 'monitor', + 'wisdom', + 'wild', + 'slappy', + 'thor', + 'letsgo', + 'robert1', + 'feet', + 'rush', + 'brownie', + 'hudson', + '098765', + 'playing', + 'playtime', + 'lightnin', + 'melvin', + 'atomic', + 'bart', + 'hawk', + 'goku', + 'glory', + 'llllll', + 'qwaszx', + 'cosmos', + 'bosco', + 'knights', + 'bentley', + 'beast', + 'slapshot', + 'lewis', + 'assword', + 'frosty', + 'gillian', + 'sara', + 'dumbass', + 'mallard', + 'dddd', + 'deanna', + 'elwood', + 'wally', + '159357', + 'titleist', + 'angelo', + 'aussie', + 'guest', + 'golfing', + 'doobie', + 'loveit', + 'chloe', + 'elliott', + 'werewolf', + 'vipers', + 'janine', + '1965', + 'blabla', + 'surf', + 'sucking', + 'tardis', + 'serena', + 'shelley', + 'thegame', + 'legion', + 'rebels', + 'fernando', + 'fast', + 'gerald', + 'sarah1', + 'double', + 'onelove', + 'loulou', + 'toto', + 'crash', + 'blackcat', + '0007', + 'tacobell', + 'soccer1', + 'jedi', + 'manuel', + 'method', + 'river', + 'chase', + 'ludwig', + 'poopie', + 'derrick', + 'boob', + 'breast', + 'kittycat', + 'isabel', + 'belly', + 'pikachu', + 'thunder1', + 'thankyou', + 'jose', + 'celeste', + 'celtics', + 'frances', + 'frogger', + 'scoobydo', + 'sabbath', + 'coltrane', + 'budman', + 'willis', + 'jackal', + 'bigger', + 'zzzzz', + 'silvia', + 'sooner', + 'licking', + 'gopher', + 'geheim', + 'lonestar', + 'primus', + 'pooper', + 'newpass', + 'brasil', + 'heather1', + 'husker', + 'element', + 'moomoo', + 'beefcake', + 'zzzzzzzz', + 'tammy', + 'shitty', + 'smokin', + 'personal', + 'jjjj', + 'anthony1', + 'anubis', + 'backup', + 'gorilla', + 'fuckface', + 'painter', + 'lowrider', + 'punkrock', + 'traffic', + 'claude', + 'daniela', + 'dale', + 'delta1', + 'nancy', + 'boys', + 'easy', + 'kissing', + 'kelley', + 'wendy', + 'theresa', + 'amazon', + 'alan', + 'fatass', + 'dodgeram', + 'dingdong', + 'malcolm', + 'qqqqqqqq', + 'breasts', + 'boots', + 'honda1', + 'spidey', + 'poker', + 'temp', + 'johnjohn', + 'miguel', + '147852', + 'archer', + 'asshole1', + 'dogdog', + 'tricky', + 'crusader', + 'weather', + 'syracuse', + 'spankme', + 'speaker', + 'meridian', + 'amadeus', + 'back', + 'harley1', + 'falcons', + 'dorothy', + 'turkey50', + 'kenwood', + 'keyboard', + 'ilovesex', + '1978', + 'blackman', + 'shazam', + 'shalom', + 'lickit', + 'jimbob', + 'richmond', + 'roller', + 'carson', + 'check', + 'fatman', + 'funny', + 'garbage', + 'sandiego', + 'loving', + 'magnus', + 'cooldude', + 'clover', + 'mobile', + 'bell', + 'payton', + 'plumber', + 'texas1', + 'tool', + 'topper', + 'jenna', + 'mariners', + 'rebel', + 'harmony', + 'caliente', + 'celica', + 'fletcher', + 'german', + 'diana', + 'oxford', + 'osiris', + 'orgasm', + 'punkin', + 'porsche9', + 'tuesday', + 'close', + 'breeze', + 'bossman', + 'kangaroo', + 'billie', + 'latinas', + 'judith', + 'astros', + 'scruffy', + 'donna', + 'qwertyu', + 'davis', + 'hearts', + 'kathy', + 'jammer', + 'java', + 'springer', + 'rhonda', + 'ricky', + '1122', + 'goodtime', + 'chelsea1', + 'freckles', + 'flyboy', + 'doodle', + 'city', + 'nebraska', + 'bootie', + 'kicker', + 'webmaster', + 'vulcan', + 'iverson', + '191919', + 'blueeyes', + 'stoner', + '321321', + 'farside', + 'rugby', + 'director', + 'pussy69', + 'power1', + 'bobbie', + 'hershey', + 'hermes', + 'monopoly', + 'west', + 'birdman', + 'blessed', + 'blackjac', + 'southern', + 'peterpan', + 'thumbs', + 'lawyer', + 'melinda', + 'fingers', + 'fuckyou1', + 'rrrrrr', + 'a1b2c3d4', + 'coke', + 'nicola', + 'bohica', + 'heart', + 'elvis1', + 'kids', + 'blacky', + 'stories', + 'sentinel', + 'snake1', + 'phoebe', + 'jesse', + 'richard1', + '1234abcd', + 'guardian', + 'candyman', + 'fisting', + 'scarlet', + 'dildo', + 'pancho', + 'mandingo', + 'lucky7', + 'condom', + 'munchkin', + 'billyboy', + 'summer1', + 'student', + 'sword', + 'skiing', + 'sergio', + 'site', + 'sony', + 'thong', + 'rootbeer', + 'assassin', + 'cassidy', + 'frederic', + 'fffff', + 'fitness', + 'giovanni', + 'scarlett', + 'durango', + 'postal', + 'achilles', + 'dawn', + 'dylan', + 'kisses', + 'warriors', + 'imagine', + 'plymouth', + 'topdog', + 'asterix', + 'hallo', + 'cameltoe', + 'fuckfuck', + 'bridget', + 'eeeeee', + 'mouth', + 'weird', + 'will', + 'sithlord', + 'sommer', + 'toby', + 'theking', + 'juliet', + 'avenger', + 'backdoor', + 'goodbye', + 'chevrole', + 'faith', + 'lorraine', + 'trance', + 'cosworth', + 'brad', + 'houses', + 'homers', + 'eternity', + 'kingpin', + 'verbatim', + 'incubus', + '1961', + 'blond', + 'zaphod', + 'shiloh', + 'spurs', + 'station', + 'jennie', + 'maynard', + 'mighty', + 'aliens', + 'hank', + 'charly', + 'running', + 'dogman', + 'omega1', + 'printer', + 'aggies', + 'chocolate', + 'deadhead', + 'hope', + 'javier', + 'bitch1', + 'stone55', + 'pineappl', + 'thekid', + 'lizzie', + 'rockets', + 'ashton', + 'camels', + 'formula', + 'forrest', + 'rosemary', + 'oracle', + 'rain', + 'pussey', + 'porkchop', + 'abcde', + 'clancy', + 'nellie', + 'mystic', + 'inferno', + 'blackdog', + 'steve1', + 'pauline', + 'alexander', + 'alice', + 'alfa', + 'grumpy', + 'flames', + 'scream', + 'lonely', + 'puffy', + 'proxy', + 'valhalla', + 'unreal', + 'cynthia', + 'herbie', + 'engage', + 'yyyyyy', + '010101', + 'solomon', + 'pistol', + 'melody', + 'celeb', + 'flying', + 'gggg', + 'santiago', + 'scottie', + 'oakley', + 'portugal', + 'a12345', + 'newbie', + 'mmmm', + 'venus', + '1qazxsw2', + 'beverly', + 'zorro', + 'work', + 'writer', + 'stripper', + 'sebastia', + 'spread', + 'phil', + 'tobias', + 'links', + 'members', + 'metal', + '1221', + 'andre', + '565656', + 'funfun', + 'trojans', + 'again', + 'cyber', + 'hurrican', + 'moneys', + '1x2zkg8w', + 'zeus', + 'thing', + 'tomato', + 'lion', + 'atlantic', + 'celine', + 'usa123', + 'trans', + 'account', + 'aaaaaaa', + 'homerun', + 'hyperion', + 'kevin1', + 'blacks', + '44444444', + 'skittles', + 'sean', + 'hastings', + 'fart', + 'gangbang', + 'fubar', + 'sailboat', + 'older', + 'oilers', + 'craig', + 'conrad', + 'church', + 'damian', + 'dean', + 'broken', + 'buster1', + 'hithere', + 'immortal', + 'sticks', + 'pilot', + 'peters', + 'lexmark', + 'jerkoff', + 'maryland', + 'anders', + 'cheers', + 'possum', + 'columbus', + 'cutter', + 'muppet', + 'beautiful', + 'stolen', + 'swordfish', + 'sport', + 'sonic', + 'peter1', + 'jethro', + 'rockon', + 'asdfghj', + 'pass123', + 'paper', + 'pornos', + 'ncc1701a', + 'bootys', + 'buttman', + 'bonjour', + 'escape', + '1960', + 'becky', + 'bears', + '362436', + 'spartans', + 'tinman', + 'threesom', + 'lemons', + 'maxmax', + '1414', + 'bbbbb', + 'camelot', + 'chad', + 'chewie', + 'gogo', + 'fusion', + 'saint', + 'dilligaf', + 'nopass', + 'myself', + 'hustler', + 'hunter1', + 'whitey', + 'beast1', + 'yesyes', + 'spank', + 'smudge', + 'pinkfloy', + 'patriot', + 'lespaul', + 'annette', + 'hammers', + 'catalina', + 'finish', + 'formula1', + 'sausage', + 'scooter1', + 'orioles', + 'oscar1', + 'over', + 'colombia', + 'cramps', + 'natural', + 'eating', + 'exotic', + 'iguana', + 'bella', + 'suckers', + 'strong', + 'sheena', + 'start', + 'slave', + 'pearl', + 'topcat', + 'lancelot', + 'angelica', + 'magelan', + 'racer', + 'ramona', + 'crunch', + 'british', + 'button', + 'eileen', + 'steph', + '456123', + 'skinny', + 'seeking', + 'rockhard', + 'chief', + 'filter', + 'first', + 'freaks', + 'sakura', + 'pacman', + 'poontang', + 'dalton', + 'newlife', + 'homer1', + 'klingon', + 'watcher', + 'walleye', + 'tasha', + 'tasty', + 'sinatra', + 'starship', + 'steel', + 'starbuck', + 'poncho', + 'amber1', + 'gonzo', + 'grover', + 'catherin', + 'carol', + 'candle', + 'firefly', + 'goblin', + 'scotch', + 'diver', + 'usmc', + 'huskies', + 'eleven', + 'kentucky', + 'kitkat', + 'israel', + 'beckham', + 'bicycle', + 'yourmom', + 'studio', + 'tara', + '33333333', + 'shane', + 'splash', + 'jimmy1', + 'reality', + '12344321', + 'caitlin', + 'focus', + 'sapphire', + 'mailman', + 'raiders1', + 'clark', + 'ddddd', + 'hopper', + 'excalibu', + 'more', + 'wilbur', + 'illini', + 'imperial', + 'phillips', + 'lansing', + 'maxx', + 'gothic', + 'golfball', + 'carlton', + 'camille', + 'facial', + 'front242', + 'macdaddy', + 'qwer1234', + 'vectra', + 'cowboys1', + 'crazy1', + 'dannyboy', + 'jane', + 'betty', + 'benny', + 'bennett', + 'leader', + 'martinez', + 'aquarius', + 'barkley', + 'hayden', + 'caught', + 'franky', + 'ffff', + 'floyd', + 'sassy', + 'pppp', + 'pppppppp', + 'prodigy', + 'clarence', + 'noodle', + 'eatpussy', + 'vortex', + 'wanking', + 'beatrice', + 'billy1', + 'siemens', + 'pedro', + 'phillies', + 'research', + 'groups', + 'carolyn', + 'chevy1', + 'cccc', + 'fritz', + 'gggggggg', + 'doughboy', + 'dracula', + 'nurses', + 'loco', + 'madrid', + 'lollipop', + 'trout', + 'utopia', + 'chrono', + 'cooler', + 'conner', + 'nevada', + 'wibble', + 'werner', + 'summit', + 'marco', + 'marilyn', + '1225', + 'babies', + 'capone', + 'fugazi', + 'panda', + 'mama', + 'qazwsxed', + 'puppies', + 'triton', + '9876', + 'command', + 'nnnnnn', + 'ernest', + 'momoney', + 'iforgot', + 'wolfie', + 'studly', + 'shawn', + 'renee', + 'alien', + 'hamburg', + '81fukkc', + '741852', + 'catman', + 'china', + 'forgot', + 'gagging', + 'scott1', + 'drew', + 'oregon', + 'qweqwe', + 'train', + 'crazybab', + 'daniel1', + 'cutlass', + 'brothers', + 'holes', + 'heidi', + 'mothers', + 'music1', + 'what', + 'walrus', + '1957', + 'bigtime', + 'bike', + 'xtreme', + 'simba', + 'ssss', + 'rookie', + 'angie', + 'bathing', + 'fresh', + 'sanchez', + 'rotten', + 'maestro', + 'luis', + 'look', + 'turbo1', + '99999', + 'butthole', + 'hhhh', + 'elijah', + 'monty', + 'bender', + 'yoda', + 'shania', + 'shock', + 'phish', + 'thecat', + 'rightnow', + 'reagan', + 'baddog', + 'asia', + 'greatone', + 'gateway1', + 'randall', + 'abstr', + 'napster', + 'brian1', + 'bogart', + 'high', + 'hitler', + 'emma', + 'kill', + 'weaver', + 'wildfire', + 'jackson1', + 'isaiah', + '1981', + 'belinda', + 'beaner', + 'yoyo', + '0.0.0.000', + 'super1', + 'select', + 'snuggles', + 'slutty', + 'some', + 'phoenix1', + 'technics', + 'toon', + 'raven1', + 'rayray', + '123789', + '1066', + 'albion', + 'greens', + 'fashion', + 'gesperrt', + 'santana', + 'paint', + 'powell', + 'credit', + 'darling', + 'mystery', + 'bowser', + 'bottle', + 'brucelee', + 'hehehe', + 'kelly1', + 'mojo', + '1998', + 'bikini', + 'woofwoof', + 'yyyy', + 'strap', + 'sites', + 'spears', + 'theodore', + 'julius', + 'richards', + 'amelia', + 'central', + 'f**k', + 'nyjets', + 'punisher', + 'username', + 'vanilla', + 'twisted', + 'bryant', + 'brent', + 'bunghole', + 'here', + 'elizabeth', + 'erica', + 'kimber', + 'viagra', + 'veritas', + 'pony', + 'pool', + 'titts', + 'labtec', + 'lifetime', + 'jenny1', + 'masterbate', + 'mayhem', + 'redbull', + 'govols', + 'gremlin', + '505050', + 'gmoney', + 'rupert', + 'rovers', + 'diamond1', + 'lorenzo', + 'trident', + 'abnormal', + 'davidson', + 'deskjet', + 'cuddles', + 'nice', + 'bristol', + 'karina', + 'milano', + 'vh5150', + 'jarhead', + '1982', + 'bigbird', + 'bizkit', + 'sixers', + 'slider', + 'star69', + 'starfish', + 'penetration', + 'tommy1', + 'john316', + 'meghan', + 'michaela', + 'market', + 'grant', + 'caligula', + 'carl', + 'flicks', + 'films', + 'madden', + 'railroad', + 'cosmo', + 'cthulhu', + 'bradford', + 'br0d3r', + 'military', + 'bearbear', + 'swedish', + 'spawn', + 'patrick1', + 'polly', + 'these', + 'todd', + 'reds', + 'anarchy', + 'groove', + 'franco', + 'fuckher', + 'oooo', + 'tyrone', + 'vegas', + 'airbus', + 'cobra1', + 'christine', + 'clips', + 'delete', + 'duster', + 'kitty1', + 'mouse1', + 'monkeys', + 'jazzman', + '1919', + '262626', + 'swinging', + 'stroke', + 'stocks', + 'sting', + 'pippen', + 'labrador', + 'jordan1', + 'justdoit', + 'meatball', + 'females', + 'saturday', + 'park', + 'vector', + 'cooter', + 'defender', + 'desert', + 'demon', + 'nike', + 'bubbas', + 'bonkers', + 'english', + 'kahuna', + 'wildman', + '4121', + 'sirius', + 'static', + 'piercing', + 'terror', + 'teenage', + 'leelee', + 'marissa', + 'microsof', + 'mechanic', + 'robotech', + 'rated', + 'hailey', + 'chaser', + 'sanders', + 'salsero', + 'nuts', + 'macross', + 'quantum', + 'rachael', + 'tsunami', + 'universe', + 'daddy1', + 'cruise', + 'nguyen', + 'newpass6', + 'nudes', + 'hellyeah', + 'vernon', + '1959', + 'zaq12wsx', + 'striker', + 'sixty', + 'steele', + 'spice', + 'spectrum', + 'smegma', + 'thumb', + 'jjjjjjjj', + 'mellow', + 'astrid', + 'cancun', + 'cartoon', + 'sabres', + 'samiam', + 'pants', + 'oranges', + 'oklahoma', + 'lust', + 'coleman', + 'denali', + 'nude', + 'noodles', + 'buzz', + 'brest', + 'hooter', + 'mmmmmmmm', + 'warthog', + 'bloody', + 'blueblue', + 'zappa', + 'wolverine', + 'sniffing', + 'lance', + 'jean', + 'jjjjj', + 'harper', + 'calico', + 'freee', + 'rover', + 'door', + 'pooter', + 'closeup', + 'bonsai', + 'evelyn', + 'emily1', + 'kathryn', + 'keystone', + 'iiii', + '1955', + 'yzerman', + 'theboss', + 'tolkien', + 'jill', + 'megaman', + 'rasta', + 'bbbbbbbb', + 'bean', + 'handsome', + 'hal9000', + 'goofy', + 'gringo', + 'gofish', + 'gizmo1', + 'samsam', + 'scuba', + 'onlyme', + 'tttttttt', + 'corrado', + 'clown', + 'clapton', + 'deborah', + 'boris', + 'bulls', + 'vivian', + 'jayhawk', + 'bethany', + 'wwww', + 'sharky', + 'seeker', + 'ssssssss', + 'somethin', + 'pillow', + 'thesims', + 'lighter', + 'lkjhgf', + 'melissa1', + 'marcius2', + 'barry', + 'guiness', + 'gymnast', + 'casey1', + 'goalie', + 'godsmack', + 'doug', + 'lolo', + 'rangers1', + 'poppy', + 'abby', + 'clemson', + 'clipper', + 'deeznuts', + 'nobody', + 'holly1', + 'elliot', + 'eeee', + 'kingston', + 'miriam', + 'belle', + 'yosemite', + 'sucked', + 'sex123', + 'sexy69', + 'pic\'s', + 'tommyboy', + 'lamont', + 'meat', + 'masterbating', + 'marianne', + 'marc', + 'gretzky', + 'happyday', + 'frisco', + 'scratch', + 'orchid', + 'orange1', + 'manchest', + 'quincy', + 'unbelievable', + 'aberdeen', + 'dawson', + 'nathalie', + 'ne1469', + 'boxing', + 'hill', + 'korn', + 'intercourse', + '161616', + '1985', + 'ziggy', + 'supersta', + 'stoney', + 'senior', + 'amature', + 'barber', + 'babyboy', + 'bcfields', + 'goliath', + 'hack', + 'hardrock', + 'children', + 'frodo', + 'scout', + 'scrappy', + 'rosie', + 'qazqaz', + 'tracker', + 'active', + 'craving', + 'commando', + 'cohiba', + 'deep', + 'cyclone', + 'dana', + 'bubba69', + 'katie1', + 'mpegs', + 'vsegda', + 'jade', + 'irish1', + 'better', + 'sexy1', + 'sinclair', + 'smelly', + 'squerting', + 'lions', + 'jokers', + 'jeanette', + 'julia', + 'jojojo', + 'meathead', + 'ashley1', + 'groucho', + 'cheetah', + 'champ', + 'firefox', + 'gandalf1', + 'packer', + 'magnolia', + 'love69', + 'tyler1', + 'typhoon', + 'tundra', + 'bobby1', + 'kenworth', + 'village', + 'volley', + 'beth', + 'wolf359', + '0420', + '000007', + 'swimmer', + 'skydive', + 'smokes', + 'patty', + 'peugeot', + 'pompey', + 'legolas', + 'kristy', + 'redhot', + 'rodman', + 'redalert', + 'having', + 'grapes', + '4runner', + 'carrera', + 'floppy', + 'dollars', + 'ou8122', + 'quattro', + 'adams', + 'cloud9', + 'davids', + 'nofear', + 'busty', + 'homemade', + 'mmmmm', + 'whisper', + 'vermont', + 'webmaste', + 'wives', + 'insertion', + 'jayjay', + 'philips', + 'phone', + 'topher', + 'tongue', + 'temptress', + 'midget', + 'ripken', + 'havefun', + 'gretchen', + 'canon', + 'celebrity', + 'five', + 'getting', + 'ghetto', + 'direct', + 'otto', + 'ragnarok', + 'trinidad', + 'usnavy', + 'conover', + 'cruiser', + 'dalshe', + 'nicole1', + 'buzzard', + 'hottest', + 'kingfish', + 'misfit', + 'moore', + 'milfnew', + 'warlord', + 'wassup', + 'bigsexy', + 'blackhaw', + 'zippy', + 'shearer', + 'tights', + 'thursday', + 'kungfu', + 'labia', + 'journey', + 'meatloaf', + 'marlene', + 'rider', + 'area51', + 'batman1', + 'bananas', + '636363', + 'cancel', + 'ggggg', + 'paradox', + 'mack', + 'lynn', + 'queens', + 'adults', + 'aikido', + 'cigars', + 'nova', + 'hoosier', + 'eeyore', + 'moose1', + 'warez', + 'interacial', + 'streaming', + '313131', + 'pertinant', + 'pool6123', + 'mayday', + 'rivers', + 'revenge', + 'animated', + 'banker', + 'baddest', + 'gordon24', + 'ccccc', + 'fortune', + 'fantasies', + 'touching', + 'aisan', + 'deadman', + 'homepage', + 'ejaculation', + 'whocares', + 'iscool', + 'jamesbon', + '1956', + '1pussy', + 'womam', + 'sweden', + 'skidoo', + 'spock', + 'sssss', + 'petra', + 'pepper1', + 'pinhead', + 'micron', + 'allsop', + 'amsterda', + 'army', + 'aside', + 'gunnar', + '666999', + 'chip', + 'foot', + 'fowler', + 'february', + 'face', + 'fletch', + 'george1', + 'sapper', + 'science', + 'sasha1', + 'luckydog', + 'lover1', + 'magick', + 'popopo', + 'public', + 'ultima', + 'derek', + 'cypress', + 'booker', + 'businessbabe', + 'brandon1', + 'edwards', + 'experience', + 'vulva', + 'vvvv', + 'jabroni', + 'bigbear', + 'yummy', + '010203', + 'searay', + 'secret1', + 'showing', + 'sinbad', + 'sexxxx', + 'soleil', + 'software', + 'piccolo', + 'thirteen', + 'leopard', + 'legacy', + 'jensen', + 'justine', + 'memorex', + 'marisa', + 'mathew', + 'redwing', + 'rasputin', + '134679', + 'anfield', + 'greenbay', + 'gore', + 'catcat', + 'feather', + 'scanner', + 'pa55word', + 'contortionist', + 'danzig', + 'daisy1', + 'hores', + 'erik', + 'exodus', + 'vinnie', + 'iiiiii', + 'zero', + '1001', + 'subway', + 'tank', + 'second', + 'snapple', + 'sneakers', + 'sonyfuck', + 'picks', + 'poodle', + 'test1234', + 'their', + 'llll', + 'junebug', + 'june', + 'marker', + 'mellon', + 'ronaldo', + 'roadkill', + 'amanda1', + 'asdfjkl', + 'beaches', + 'greene', + 'great1', + 'cheerleaers', + 'force', + 'doitnow', + 'ozzy', + 'madeline', + 'radio', + 'tyson', + 'christian', + 'daphne', + 'boxster', + 'brighton', + 'housewifes', + 'emmanuel', + 'emerson', + 'kkkk', + 'mnbvcx', + 'moocow', + 'vides', + 'wagner', + 'janet', + '1717', + 'bigmoney', + 'blonds', + '1000', + 'storys', + 'stereo', + '4545', + '420247', + 'seductive', + 'sexygirl', + 'lesbean', + 'live', + 'justin1', + '124578', + 'animals', + 'balance', + 'hansen', + 'cabbage', + 'canadian', + 'gangbanged', + 'dodge1', + 'dimas', + 'lori', + 'loud', + 'malaka', + 'puss', + 'probes', + 'adriana', + 'coolman', + 'crawford', + 'dante', + 'nacked', + 'hotpussy', + 'erotica', + 'kool', + 'mirror', + 'wearing', + 'implants', + 'intruder', + 'bigass', + 'zenith', + 'woohoo', + 'womans', + 'tanya', + 'tango', + 'stacy', + 'pisces', + 'laguna', + 'krystal', + 'maxell', + 'andyod22', + 'barcelon', + 'chainsaw', + 'chickens', + 'flash1', + 'downtown', + 'orgasms', + 'magicman', + 'profit', + 'pusyy', + 'pothead', + 'coconut', + 'chuckie', + 'contact', + 'clevelan', + 'designer', + 'builder', + 'budweise', + 'hotshot', + 'horizon', + 'hole', + 'experienced', + 'mondeo', + 'wifes', + '1962', + 'strange', + 'stumpy', + 'smiths', + 'sparks', + 'slacker', + 'piper', + 'pitchers', + 'passwords', + 'laptop', + 'jeremiah', + 'allmine', + 'alliance', + 'bbbbbbb', + 'asscock', + 'halflife', + 'grandma', + 'hayley', + '88888', + 'cecilia', + 'chacha', + 'saratoga', + 'sandy1', + 'santos', + 'doogie', + 'number', + 'positive', + 'qwert40', + 'transexual', + 'crow', + 'close-up', + 'darrell', + 'bonita', + 'ib6ub9', + 'volvo', + 'jacob1', + 'iiiii', + 'beastie', + 'sunnyday', + 'stoned', + 'sonics', + 'starfire', + 'snapon', + 'pictuers', + 'pepe', + 'testing1', + 'tiberius', + 'lisalisa', + 'lesbain', + 'litle', + 'retard', + 'ripple', + 'austin1', + 'badgirl', + 'golfgolf', + 'flounder', + 'garage', + 'royals', + 'dragoon', + 'dickie', + 'passwor', + 'ocean', + 'majestic', + 'poppop', + 'trailers', + 'dammit', + 'nokia', + 'bobobo', + 'br549', + 'emmitt', + 'knock', + 'minime', + 'mikemike', + 'whitesox', + '1954', + '3232', + '353535', + 'seamus', + 'solo', + 'sparkle', + 'sluttey', + 'pictere', + 'titten', + 'lback', + '1024', + 'angelina', + 'goodluck', + 'charlton', + 'fingerig', + 'gallaries', + 'goat', + 'ruby', + 'passme', + 'oasis', + 'lockerroom', + 'logan1', + 'rainman', + 'twins', + 'treasure', + 'absolutely', + 'club', + 'custom', + 'cyclops', + 'nipper', + 'bucket', + 'homepage-', + 'hhhhh', + 'momsuck', + 'indain', + '2345', + 'beerbeer', + 'bimmer', + 'susanne', + 'stunner', + 'stevens', + '456456', + 'shell', + 'sheba', + 'tootsie', + 'tiny', + 'testerer', + 'reefer', + 'really', + '1012', + 'harcore', + 'gollum', + '545454', + 'chico', + 'caveman', + 'carole', + 'fordf150', + 'fishes', + 'gaymen', + 'saleen', + 'doodoo', + 'pa55w0rd', + 'looney', + 'presto', + 'qqqqq', + 'cigar', + 'bogey', + 'brewer', + 'helloo', + 'dutch', + 'kamikaze', + 'monte', + 'wasser', + 'vietnam', + 'visa', + 'japanees', + '0123', + 'swords', + 'slapper', + 'peach', + 'jump', + 'marvel', + 'masterbaiting', + 'march', + 'redwood', + 'rolling', + '1005', + 'ametuer', + 'chiks', + 'cathy', + 'callaway', + 'fucing', + 'sadie1', + 'panasoni', + 'mamas', + 'race', + 'rambo', + 'unknown', + 'absolut', + 'deacon', + 'dallas1', + 'housewife', + 'kristi', + 'keywest', + 'kirsten', + 'kipper', + 'morning', + 'wings', + 'idiot', + '18436572', + '1515', + 'beating', + 'zxczxc', + 'sullivan', + '303030', + 'shaman', + 'sparrow', + 'terrapin', + 'jeffery', + 'masturbation', + 'mick', + 'redfish', + '1492', + 'angus', + 'barrett', + 'goirish', + 'hardcock', + 'felicia', + 'forfun', + 'galary', + 'freeporn', + 'duchess', + 'olivier', + 'lotus', + 'pornographic', + 'ramses', + 'purdue', + 'traveler', + 'crave', + 'brando', + 'enter1', + 'killme', + 'moneyman', + 'welder', + 'windsor', + 'wifey', + 'indon', + 'yyyyy', + 'stretch', + 'taylor1', + '4417', + 'shopping', + 'picher', + 'pickup', + 'thumbnils', + 'johnboy', + 'jets', + 'jess', + 'maureen', + 'anne', + 'ameteur', + 'amateurs', + 'apollo13', + 'hambone', + 'goldwing', + '5050', + 'charley', + 'sally1', + 'doghouse', + 'padres', + 'pounding', + 'quest', + 'truelove', + 'underdog', + 'trader', + 'crack', + 'climber', + 'bolitas', + 'bravo', + 'hohoho', + 'model', + 'italian', + 'beanie', + 'beretta', + 'wrestlin', + 'stroker', + 'tabitha', + 'sherwood', + 'sexyman', + 'jewels', + 'johannes', + 'mets', + 'marcos', + 'rhino', + 'bdsm', + 'balloons', + 'goodman', + 'grils', + 'happy123', + 'flamingo', + 'games', + 'route66', + 'devo', + 'dino', + 'outkast', + 'paintbal', + 'magpie', + 'llllllll', + 'twilight', + 'critter', + 'christie', + 'cupcake', + 'nickel', + 'bullseye', + 'krista', + 'knickerless', + 'mimi', + 'murder', + 'videoes', + 'binladen', + 'xerxes', + 'slim', + 'slinky', + 'pinky', + 'peterson', + 'thanatos', + 'meister', + 'menace', + 'ripley', + 'retired', + 'albatros', + 'balloon', + 'bank', + 'goten', + '5551212', + 'getsdown', + 'donuts', + 'divorce', + 'nwo4life', + 'lord', + 'lost', + 'underwear', + 'tttt', + 'comet', + 'deer', + 'damnit', + 'dddddddd', + 'deeznutz', + 'nasty1', + 'nonono', + 'nina', + 'enterprise', + 'eeeee', + 'misfit99', + 'milkman', + 'vvvvvv', + 'isaac', + '1818', + 'blueboy', + 'beans', + 'bigbutt', + 'wyatt', + 'tech', + 'solution', + 'poetry', + 'toolman', + 'laurel', + 'juggalo', + 'jetski', + 'meredith', + 'barefoot', + '50spanks', + 'gobears', + 'scandinavian', + 'original', + 'truman', + 'cubbies', + 'nitram', + 'briana', + 'ebony', + 'kings', + 'warner', + 'bilbo', + 'yumyum', + 'zzzzzzz', + 'stylus', + '321654', + 'shannon1', + 'server', + 'secure', + 'silly', + 'squash', + 'starman', + 'steeler', + 'staples', + 'phrases', + 'techniques', + 'laser', + '135790', + 'allan', + 'barker', + 'athens', + 'cbr600', + 'chemical', + 'fester', + 'gangsta', + 'fucku2', + 'freeze', + 'game', + 'salvador', + 'droopy', + 'objects', + 'passwd', + 'lllll', + 'loaded', + 'louis', + 'manchester', + 'losers', + 'vedder', + 'clit', + 'chunky', + 'darkman', + 'damage', + 'buckshot', + 'buddah', + 'boobed', + 'henti', + 'hillary', + 'webber', + 'winter1', + 'ingrid', + 'bigmike', + 'beta', + 'zidane', + 'talon', + 'slave1', + 'pissoff', + 'person', + 'thegreat', + 'living', + 'lexus', + 'matador', + 'readers', + 'riley', + 'roberta', + 'armani', + 'ashlee', + 'goldstar', + '5656', + 'cards', + 'fmale', + 'ferris', + 'fuking', + 'gaston', + 'fucku', + 'ggggggg', + 'sauron', + 'diggler', + 'pacers', + 'looser', + 'pounded', + 'premier', + 'pulled', + 'town', + 'trisha', + 'triangle', + 'cornell', + 'collin', + 'cosmic', + 'deeper', + 'depeche', + 'norway', + 'bright', + 'helmet', + 'kristine', + 'kendall', + 'mustard', + 'misty1', + 'watch', + 'jagger', + 'bertie', + 'berger', + 'word', + '3x7pxr', + 'silver1', + 'smoking', + 'snowboar', + 'sonny', + 'paula', + 'penetrating', + 'photoes', + 'lesbens', + 'lambert', + 'lindros', + 'lillian', + 'roadking', + 'rockford', + '1357', + '143143', + 'asasas', + 'goodboy', + '898989', + 'chicago1', + 'card', + 'ferrari1', + 'galeries', + 'godfathe', + 'gawker', + 'gargoyle', + 'gangster', + 'rubble', + 'rrrr', + 'onetime', + 'pussyman', + 'pooppoop', + 'trapper', + 'twenty', + 'abraham', + 'cinder', + 'company', + 'newcastl', + 'boricua', + 'bunny1', + 'boxer', + 'hotred', + 'hockey1', + 'hooper', + 'edward1', + 'evan', + 'kris', + 'misery', + 'moscow', + 'milk', + 'mortgage', + 'bigtit', + 'show', + 'snoopdog', + 'three', + 'lionel', + 'leanne', + 'joshua1', + 'july', + '1230', + 'assholes', + 'cedric', + 'fallen', + 'farley', + 'gene', + 'frisky', + 'sanity', + 'script', + 'divine', + 'dharma', + 'lucky13', + 'property', + 'tricia', + 'akira', + 'desiree', + 'broadway', + 'butterfly', + 'hunt', + 'hotbox', + 'hootie', + 'heat', + 'howdy', + 'earthlink', + 'karma', + 'kiteboy', + 'motley', + 'westwood', + '1988', + 'bert', + 'blackbir', + 'biggles', + 'wrench', + 'working', + 'wrestle', + 'slippery', + 'pheonix', + 'penny1', + 'pianoman', + 'tomorrow', + 'thedude', + 'jenn', + 'jonjon', + 'jones1', + 'mattie', + 'memory', + 'micheal', + 'roadrunn', + 'arrow', + 'attitude', + 'azzer', + 'seahawks', + 'diehard', + 'dotcom', + 'lola', + 'tunafish', + 'chivas', + 'cinnamon', + 'clouds', + 'deluxe', + 'northern', + 'nuclear', + 'north', + 'boom', + 'boobie', + 'hurley', + 'krishna', + 'momomo', + 'modles', + 'volume', + '23232323', + 'bluedog', + 'wwwwwww', + 'zerocool', + 'yousuck', + 'pluto', + 'limewire', + 'link', + 'joung', + 'marcia', + 'awnyce', + 'gonavy', + 'haha', + 'films+pic+galeries', + 'fabian', + 'francois', + 'girsl', + 'fuckthis', + 'girfriend', + 'rufus', + 'drive', + 'uncencored', + 'a123456', + 'airport', + 'clay', + 'chrisbln', + 'combat', + 'cygnus', + 'cupoi', + 'never', + 'netscape', + 'brett', + 'hhhhhhhh', + 'eagles1', + 'elite', + 'knockers', + 'kendra', + 'mommy', + '1958', + 'tazmania', + 'shonuf', + 'piano', + 'pharmacy', + 'thedog', + 'lips', + 'jillian', + 'jenkins', + 'midway', + 'arsenal1', + 'anaconda', + 'australi', + 'gromit', + 'gotohell', + '787878', + '66666', + 'carmex2', + 'camber', + 'gator1', + 'ginger1', + 'fuzzy', + 'seadoo', + 'dorian', + 'lovesex', + 'rancid', + 'uuuuuu', + '911911', + 'nature', + 'bulldog1', + 'helen', + 'health', + 'heater', + 'higgins', + 'kirk', + 'monalisa', + 'mmmmmmm', + 'whiteout', + 'virtual', + 'ventura', + 'jamie1', + 'japanes', + 'james007', + '2727', + '2469', + 'blam', + 'bitchass', + 'believe', + 'zephyr', + 'stiffy', + 'sweet1', + 'silent', + 'southpar', + 'spectre', + 'tigger1', + 'tekken', + 'lenny', + 'lakota', + 'lionking', + 'jjjjjjj', + 'medical', + 'megatron', + '1369', + 'hawaiian', + 'gymnastic', + 'golfer1', + 'gunners', + '7779311', + '515151', + 'famous', + 'glass', + 'screen', + 'rudy', + 'royal', + 'sanfran', + 'drake', + 'optimus', + 'panther1', + 'love1', + 'mail', + 'maggie1', + 'pudding', + 'venice', + 'aaron1', + 'delphi', + 'niceass', + 'bounce', + 'busted', + 'house1', + 'killer1', + 'miracle', + 'momo', + 'musashi', + 'jammin', + '2003', + '234567', + 'wp2003wp', + 'submit', + 'silence', + 'sssssss', + 'state', + 'spikes', + 'sleeper', + 'passwort', + 'toledo', + 'kume', + 'media', + 'meme', + 'medusa', + 'mantis', + 'remote', + 'reading', + 'reebok', + '1017', + 'artemis', + 'hampton', + 'harry1', + 'cafc91', + 'fettish', + 'friendly', + 'oceans', + 'oooooooo', + 'mango', + 'ppppp', + 'trainer', + 'troy', + 'uuuu', + '909090', + 'cross', + 'death1', + 'news', + 'bullfrog', + 'hokies', + 'holyshit', + 'eeeeeee', + 'mitch', + 'jasmine1', + '&', + '&', + 'sergeant', + 'spinner', + 'leon', + 'jockey', + 'records', + 'right', + 'babyblue', + 'hans', + 'gooner', + '474747', + 'cheeks', + 'cars', + 'candice', + 'fight', + 'glow', + 'pass1234', + 'parola', + 'okokok', + 'pablo', + 'magical', + 'major', + 'ramsey', + 'poseidon', + '989898', + 'confused', + 'circle', + 'crusher', + 'cubswin', + 'nnnn', + 'hollywood', + 'erin', + 'kotaku', + 'milo', + 'mittens', + 'whatsup', + 'vvvvv', + 'iomega', + 'insertions', + 'bengals', + 'bermuda', + 'biit', + 'yellow1', + '012345', + 'spike1', + 'south', + 'sowhat', + 'pitures', + 'peacock', + 'pecker', + 'theend', + 'juliette', + 'jimmie', + 'romance', + 'augusta', + 'hayabusa', + 'hawkeyes', + 'castro', + 'florian', + 'geoffrey', + 'dolly', + 'lulu', + 'qaz123', + 'usarmy', + 'twinkle', + 'cloud', + 'chuckles', + 'cold', + 'hounddog', + 'hover', + 'hothot', + 'europa', + 'ernie', + 'kenshin', + 'kojak', + 'mikey1', + 'water1', + '196969', + 'because', + 'wraith', + 'zebra', + 'wwwww', + '33333', + 'simon1', + 'spider1', + 'snuffy', + 'philippe', + 'thunderb', + 'teddy1', + 'lesley', + 'marino13', + 'maria1', + 'redline', + 'renault', + 'aloha', + 'antoine', + 'handyman', + 'cerberus', + 'gamecock', + 'gobucks', + 'freesex', + 'duffman', + 'ooooo', + 'papa', + 'nuggets', + 'magician', + 'longbow', + 'preacher', + 'porno1', + 'county', + 'chrysler', + 'contains', + 'dalejr', + 'darius', + 'darlene', + 'dell', + 'navy', + 'buffy1', + 'hedgehog', + 'hoosiers', + 'honey1', + 'hott', + 'heyhey', + 'europe', + 'dutchess', + 'everest', + 'wareagle', + 'ihateyou', + 'sunflowe', + '3434', + 'senators', + 'shag', + 'spoon', + 'sonoma', + 'stalker', + 'poochie', + 'terminal', + 'terefon', + 'laurence', + 'maradona', + 'maryann', + 'marty', + 'roman', + '1007', + '142536', + 'alibaba', + 'america1', + 'bartman', + 'astro', + 'goth', + 'century', + 'chicken1', + 'cheater', + 'four', + 'ghost1', + 'passpass', + 'oral', + 'r2d2c3po', + 'civic', + 'cicero', + 'myxworld', + 'kkkkk', + 'missouri', + 'wishbone', + 'infiniti', + 'jameson', + '1a2b3c', + '1qwerty', + 'wonderboy', + 'skip', + 'shojou', + 'stanford', + 'sparky1', + 'smeghead', + 'poiuy', + 'titanium', + 'torres', + 'lantern', + 'jelly', + 'jeanne', + 'meier', + '1213', + 'bayern', + 'basset', + 'gsxr750', + 'cattle', + 'charlene', + 'fishing1', + 'fullmoon', + 'gilles', + 'dima', + 'obelix', + 'popo', + 'prissy', + 'ramrod', + 'unique', + 'absolute', + 'bummer', + 'hotone', + 'dynasty', + 'entry', + 'konyor', + 'missy1', + 'moses', + '282828', + 'yeah', + 'xyz123', + 'stop', + '426hemi', + '404040', + 'seinfeld', + 'simmons', + 'pingpong', + 'lazarus', + 'matthews', + 'marine1', + 'manning', + 'recovery', + '12345a', + 'beamer', + 'babyface', + 'greece', + 'gustav', + '7007', + 'charity', + 'camilla', + 'ccccccc', + 'faggot', + 'foxy', + 'frozen', + 'gladiato', + 'duckie', + 'dogfood', + 'paranoid', + 'packers1', + 'longjohn', + 'radical', + 'tuna', + 'clarinet', + 'claudio', + 'circus', + 'danny1', + 'novell', + 'nights', + 'bonbon', + 'kashmir', + 'kiki', + 'mortimer', + 'modelsne', + 'moondog', + 'monaco', + 'vladimir', + 'insert', + '1953', + 'zxc123', + 'supreme', + '3131', + 'sexxx', + 'selena', + 'softail', + 'poipoi', + 'pong', + 'together', + 'mars', + 'martin1', + 'rogue', + 'alone', + 'avalanch', + 'audia4', + '55bgates', + 'cccccccc', + 'chick', + 'came11', + 'figaro', + 'geneva', + 'dogboy', + 'dnsadm', + 'dipshit', + 'paradigm', + 'othello', + 'operator', + 'officer', + 'malone', + 'post', + 'rafael', + 'valencia', + 'tripod', + 'choice', + 'chopin', + 'coucou', + 'coach', + 'cocksuck', + 'common', + 'creature', + 'borussia', + 'book', + 'browning', + 'heritage', + 'hiziad', + 'homerj', + 'eight', + 'earth', + 'millions', + 'mullet', + 'whisky', + 'jacques', + 'store', + '4242', + 'speedo', + 'starcraf', + 'skylar', + 'spaceman', + 'piggy', + 'pierce', + 'tiger2', + 'legos', + 'lala', + 'jezebel', + 'judy', + 'joker1', + 'mazda', + 'barton', + 'baker', + '727272', + 'chester1', + 'fishman', + 'food', + 'rrrrrrrr', + 'sandwich', + 'dundee', + 'lumber', + 'magazine', + 'radar', + 'ppppppp', + 'tranny', + 'aaliyah', + 'admiral', + 'comics', + 'cleo', + 'delight', + 'buttfuck', + 'homeboy', + 'eternal', + 'kilroy', + 'kellie', + 'khan', + 'violin', + 'wingman', + 'walmart', + 'bigblue', + 'blaze', + 'beemer', + 'beowulf', + 'bigfish', + 'yyyyyyy', + 'woodie', + 'yeahbaby', + '0123456', + 'tbone', + 'style', + 'syzygy', + 'starter', + 'lemon', + 'linda1', + 'merlot', + 'mexican', + '11235813', + 'anita', + 'banner', + 'bangbang', + 'badman', + 'barfly', + 'grease', + 'carla', + 'charles1', + 'ffffffff', + 'screw', + 'doberman', + 'diane', + 'dogshit', + 'overkill', + 'counter', + 'coolguy', + 'claymore', + 'demons', + 'demo', + 'nomore', + 'normal', + 'brewster', + 'hhhhhhh', + 'hondas', + 'iamgod', + 'enterme', + 'everett', + 'electron', + 'eastside', + 'kayla', + 'minimoni', + 'mybaby', + 'wildbill', + 'wildcard', + 'ipswich', + '200000', + 'bearcat', + 'zigzag', + 'yyyyyyyy', + 'xander', + 'sweetnes', + '369369', + 'skyler', + 'skywalker', + 'pigeon', + 'peyton', + 'tipper', + 'lilly', + 'asdf123', + 'alphabet', + 'asdzxc', + 'babybaby', + 'banane', + 'barnes', + 'guyver', + 'graphics', + 'grand', + 'chinook', + 'florida1', + 'flexible', + 'fuckinside', + 'otis', + 'ursitesux', + 'tototo', + 'trust', + 'tower', + 'adam12', + 'christma', + 'corey', + 'chrome', + 'buddie', + 'bombers', + 'bunker', + 'hippie', + 'keegan', + 'misfits', + 'vickie', + '292929', + 'woofer', + 'wwwwwwww', + 'stubby', + 'sheep', + 'secrets', + 'sparta', + 'stang', + 'spud', + 'sporty', + 'pinball', + 'jorge', + 'just4fun', + 'johanna', + 'maxxxx', + 'rebecca1', + 'gunther', + 'fatima', + 'fffffff', + 'freeway', + 'garion', + 'score', + 'rrrrr', + 'sancho', + 'outback', + 'maggot', + 'puddin', + 'trial', + 'adrienne', + '987456', + 'colton', + 'clyde', + 'brain', + 'brains', + 'hoops', + 'eleanor', + 'dwayne', + 'kirby', + 'mydick', + 'villa', + '19691969', + 'bigcat', + 'becker', + 'shiner', + 'silverad', + 'spanish', + 'templar', + 'lamer', + 'juicy', + 'marsha', + 'mike1', + 'maximum', + 'rhiannon', + 'real', + '1223', + '10101010', + 'arrows', + 'andres', + 'alucard', + 'baldwin', + 'baron', + 'avenue', + 'ashleigh', + 'haggis', + 'channel', + 'cheech', + 'safari', + 'ross', + 'dog123', + 'orion1', + 'paloma', + 'qwerasdf', + 'presiden', + 'vegitto', + 'trees', + '969696', + 'adonis', + 'colonel', + 'cookie1', + 'newyork1', + 'brigitte', + 'buddyboy', + 'hellos', + 'heineken', + 'dwight', + 'eraser', + 'kerstin', + 'motion', + 'moritz', + 'millwall', + 'visual', + 'jaybird', + '1983', + 'beautifu', + 'bitter', + 'yvette', + 'zodiac', + 'steven1', + 'sinister', + 'slammer', + 'smashing', + 'slick1', + 'sponge', + 'teddybea', + 'theater', + 'this', + 'ticklish', + 'lipstick', + 'jonny', + 'massage', + 'mann', + 'reynolds', + 'ring', + '1211', + 'amazing', + 'aptiva', + 'applepie', + 'bailey1', + 'guitar1', + 'chanel', + 'canyon', + 'gagged', + 'fuckme1', + 'rough', + 'digital1', + 'dinosaur', + 'punk', + '98765', + '90210', + 'clowns', + 'cubs', + 'daniels', + 'deejay', + 'nigga', + 'naruto', + 'boxcar', + 'icehouse', + 'hotties', + 'electra', + 'kent', + 'widget', + 'india', + 'insanity', + '1986', + '2004', + 'best', + 'bluefish', + 'bingo1', + '*****', + 'stratus', + 'strength', + 'sultan', + 'storm1', + '44444', + '4200', + 'sentnece', + 'season', + 'sexyboy', + 'sigma', + 'smokie', + 'spam', + 'point', + 'pippo', + 'ticket', + 'temppass', + 'joel', + 'manman', + 'medicine', + '1022', + 'anton', + 'almond', + 'bacchus', + 'aztnm', + 'axio', + 'awful', + 'bamboo', + 'hakr', + 'gregor', + 'hahahaha', + '5678', + 'casanova', + 'caprice', + 'camero1', + 'fellow', + 'fountain', + 'dupont', + 'dolphin1', + 'dianne', + 'paddle', + 'magnet', + 'qwert1', + 'pyon', + 'porsche1', + 'tripper', + 'vampires', + 'coming', + 'noway', + 'burrito', + 'bozo', + 'highheel', + 'hughes', + 'hookem', + 'eddie1', + 'ellie', + 'entropy', + 'kkkkkkkk', + 'kkkkkkk', + 'illinois', + 'jacobs', + '1945', + '1951', + '24680', + '21212121', + '100000', + 'stonecold', + 'taco', + 'subzero', + 'sharp', + 'sexxxy', + 'skolko', + 'shanna', + 'skyhawk', + 'spurs1', + 'sputnik', + 'piazza', + 'testpass', + 'letter', + 'lane', + 'kurt', + 'jiggaman', + 'matilda', + '1224', + 'harvard', + 'hannah1', + '525252', + '4ever', + 'carbon', + 'chef', + 'federico', + 'ghosts', + 'gina', + 'scorpio1', + 'rt6ytere', + 'madison1', + 'loki', + 'raquel', + 'promise', + 'coolness', + 'christina', + 'coldbeer', + 'citadel', + 'brittney', + 'highway', + 'evil', + 'monarch', + 'morgan1', + 'washingt', + '1997', + 'bella1', + 'berry', + 'yaya', + 'yolanda', + 'superb', + 'taxman', + 'studman', + 'stephanie', + '3636', + 'sherri', + 'sheriff', + 'shepherd', + 'poland', + 'pizzas', + 'tiffany1', + 'toilet', + 'latina', + 'lassie', + 'larry1', + 'joseph1', + 'mephisto', + 'meagan', + 'marian', + 'reptile', + 'rico', + 'razor', + '1013', + 'barron', + 'hammer1', + 'gypsy', + 'grande', + 'carroll', + 'camper', + 'chippy', + 'cat123', + 'call', + 'chimera', + 'fiesta', + 'glock', + 'glenn', + 'domain', + 'dieter', + 'dragonba', + 'onetwo', + 'nygiants', + 'odessa', + 'password2', + 'louie', + 'quartz', + 'prowler', + 'prophet', + 'towers', + 'ultra', + 'cocker', + 'corleone', + 'dakota1', + 'cumm', + 'nnnnnnn', + 'natalia', + 'boxers', + 'hugo', + 'heynow', + 'hollow', + 'iceberg', + 'elvira', + 'kittykat', + 'kate', + 'kitchen', + 'wasabi', + 'vikings1', + 'impact', + 'beerman', + 'string', + 'sleep', + 'splinter', + 'snoopy1', + 'pipeline', + 'pocket', + 'legs', + 'maple', + 'mickey1', + 'manuela', + 'mermaid', + 'micro', + 'meowmeow', + 'redbird', + 'alisha', + 'baura', + 'battery', + 'grass', + 'chevys', + 'chestnut', + 'caravan', + 'carina', + 'charmed', + 'fraser', + 'frogman', + 'diving', + 'dogger', + 'draven', + 'drifter', + 'oatmeal', + 'paris1', + 'longdong', + 'quant4307s', + 'rachel1', + 'vegitta', + 'cole', + 'cobras', + 'corsair', + 'dadada', + 'noelle', + 'mylife', + 'nine', + 'bowwow', + 'body', + 'hotrats', + 'eastwood', + 'moonligh', + 'modena', + 'wave', + 'illusion', + 'iiiiiii', + 'jayhawks', + 'birgit', + 'zone', + 'sutton', + 'susana', + 'swingers', + 'shocker', + 'shrimp', + 'sexgod', + 'squall', + 'stefanie', + 'squeeze', + 'soul', + 'patrice', + 'poiu', + 'players', + 'tigers1', + 'toejam', + 'tickler', + 'line', + 'julie1', + 'jimbo1', + 'jefferso', + 'juanita', + 'michael2', + 'rodeo', + 'robot', + '1023', + 'annie1', + 'bball', + 'guess', + 'happy2', + 'charter', + 'farm', + 'flasher', + 'falcon1', + 'fiction', + 'fastball', + 'gadget', + 'scrabble', + 'diaper', + 'dirtbike', + 'dinner', + 'oliver1', + 'partner', + 'paco', + 'lucille', + 'macman', + 'poopy', + 'popper', + 'postman', + 'ttttttt', + 'ursula', + 'acura', + 'cowboy1', + 'conan', + 'daewoo', + 'cyrus', + 'customer', + 'nation', + 'nemrac58', + 'nnnnn', + 'nextel', + 'bolton', + 'bobdylan', + 'hopeless', + 'eureka', + 'extra', + 'kimmie', + 'kcj9wx5n', + 'killbill', + 'musica', + 'volkswag', + 'wage', + 'windmill', + 'wert', + 'vintage', + 'iloveyou1', + 'itsme', + 'bessie', + 'zippo', + '311311', + 'starligh', + 'smokey1', + 'spot', + 'snappy', + 'soulmate', + 'plasma', + 'thelma', + 'tonight', + 'krusty', + 'just4me', + 'mcdonald', + 'marius', + 'rochelle', + 'rebel1', + '1123', + 'alfredo', + 'aubrey', + 'audi', + 'chantal', + 'fick', + 'goaway', + 'roses', + 'sales', + 'rusty2', + 'dirt', + 'dogbone', + 'doofus', + 'ooooooo', + 'oblivion', + 'mankind', + 'luck', + 'mahler', + 'lllllll', + 'pumper', + 'puck', + 'pulsar', + 'valkyrie', + 'tupac', + 'compass', + 'concorde', + 'costello', + 'cougars', + 'delaware', + 'niceguy', + 'nocturne', + 'bob123', + 'boating', + 'bronze', + 'hopkins', + 'herewego', + 'hewlett', + 'houhou', + 'hubert', + 'earnhard', + 'eeeeeeee', + 'keller', + 'mingus', + 'mobydick', + 'venture', + 'verizon', + 'imation', + '1950', + '1948', + '1949', + '223344', + 'bigbig', + 'blossom', + 'zack', + 'wowwow', + 'sissy', + 'skinner', + 'spiker', + 'square', + 'snooker', + 'sluggo', + 'player1', + 'junk', + 'jeannie', + 'jsbach', + 'jumbo', + 'jewel', + 'medic', + 'robins', + 'reddevil', + 'reckless', + '123456a', + '1125', + '1031', + 'beacon', + 'astra', + 'gumby', + 'hammond', + 'hassan', + '757575', + '585858', + 'chillin', + 'fuck1', + 'sander', + 'lowell', + 'radiohea', + 'upyours', + 'trek', + 'courage', + 'coolcool', + 'classics', + 'choochoo', + 'darryl', + 'nikki1', + 'nitro', + 'bugs', + 'boytoy', + 'ellen', + 'excite', + 'kirsty', + 'kane', + 'wingnut', + 'wireless', + 'icu812', + '1master', + 'beatle', + 'bigblock', + 'blanca', + 'wolfen', + 'summer99', + 'sugar1', + 'tartar', + 'sexysexy', + 'senna', + 'sexman', + 'sick', + 'someone', + 'soprano', + 'pippin', + 'platypus', + 'pixies', + 'telephon', + 'land', + 'laura1', + 'laurent', + 'rimmer', + 'road', + 'report', + '1020', + '12qwaszx', + 'arturo', + 'around', + 'hamish', + 'halifax', + 'fishhead', + 'forum', + 'dododo', + 'doit', + 'outside', + 'paramedi', + 'lonesome', + 'mandy1', + 'twist', + 'uuuuu', + 'uranus', + 'ttttt', + 'butcher', + 'bruce1', + 'helper', + 'hopeful', + 'eduard', + 'dusty1', + 'kathy1', + 'katherin', + 'moonbeam', + 'muscles', + 'monster1', + 'monkeybo', + 'morton', + 'windsurf', + 'vvvvvvv', + 'vivid', + 'install', + '1947', + '187187', + '1941', + '1952', + 'tatiana', + 'susan1', + '31415926', + 'sinned', + 'sexxy', + 'senator', + 'sebastian', + 'shadows', + 'smoothie', + 'snowflak', + 'playstat', + 'playa', + 'playboy1', + 'toaster', + 'jerry1', + 'marie1', + 'mason1', + 'merlin1', + 'roger1', + 'roadster', + '112358', + '1121', + 'andrea1', + 'bacardi', + 'auto', + 'hardware', + 'hardy', + '789789', + '5555555', + 'captain1', + 'flores', + 'fergus', + 'sascha', + 'rrrrrrr', + 'dome', + 'onion', + 'nutter', + 'lololo', + 'qqqqqqq', + 'quick', + 'undertak', + 'uuuuuuuu', + 'uuuuuuu', + 'criminal', + 'cobain', + 'cindy1', + 'coors', + 'dani', + 'descent', + 'nimbus', + 'nomad', + 'nanook', + 'norwich', + 'bomb', + 'bombay', + 'broker', + 'hookup', + 'kiwi', + 'winners', + 'jackpot', + '1a2b3c4d', + '1776', + 'beardog', + 'bighead', + 'blast', + 'bird33', + '0987', + 'stress', + 'shot', + 'spooge', + 'pelican', + 'peepee', + 'perry', + 'pointer', + 'titan', + 'thedoors', + 'jeremy1', + 'annabell', + 'altima', + 'baba', + 'hallie', + 'hate', + 'hardone', + '5454', + 'candace', + 'catwoman', + 'flip', + 'faithful', + 'finance', + 'farmboy', + 'farscape', + 'genesis1', + 'salomon', + 'destroy', + 'papers', + 'option', + 'page', + 'loser1', + 'lopez', + 'r2d2', + 'pumpkins', + 'training', + 'chriss', + 'cumcum', + 'ninjas', + 'ninja1', + 'hung', + 'erika', + 'eduardo', + 'killers', + 'miller1', + 'islander', + 'jamesbond', + 'intel', + 'jarvis', + '19841984', + '2626', + 'bizzare', + 'blue12', + 'biker', + 'yoyoma', + 'sushi', + 'styles', + 'shitface', + 'series', + 'shanti', + 'spanker', + 'steffi', + 'smart', + 'sphinx', + 'please1', + 'paulie', + 'pistons', + 'tiburon', + 'limited', + 'maxwell1', + 'mdogg', + 'rockies', + 'armstron', + 'alexia', + 'arlene', + 'alejandr', + 'arctic', + 'banger', + 'audio', + 'asimov', + 'augustus', + 'grandpa', + '753951', + '4you', + 'chilly', + 'care1839', + 'chapman', + 'flyfish', + 'fantasia', + 'freefall', + 'santa', + 'sandrine', + 'oreo', + 'ohshit', + 'macbeth', + 'madcat', + 'loveya', + 'mallory', + 'rage', + 'quentin', + 'qwerqwer', + 'project', + 'ramirez', + 'colnago', + 'citizen', + 'chocha', + 'cobalt', + 'crystal1', + 'dabears', + 'nevets', + 'nineinch', + 'broncos1', + 'helene', + 'huge', + 'edgar', + 'epsilon', + 'easter', + 'kestrel', + 'moron', + 'virgil', + 'winston1', + 'warrior1', + 'iiiiiiii', + 'iloveyou2', + '1616', + 'beat', + 'bettina', + 'woowoo', + 'zander', + 'straight', + 'shower', + 'sloppy', + 'specialk', + 'tinkerbe', + 'jellybea', + 'reader', + 'romero', + 'redsox1', + 'ride', + '1215', + '1112', + 'annika', + 'arcadia', + 'answer', + 'baggio', + 'base', + 'guido', + '555666', + 'carmel', + 'cayman', + 'cbr900rr', + 'chips', + 'gabriell', + 'gertrude', + 'glennwei', + 'roxy', + 'sausages', + 'disco', + 'pass1', + 'luna', + 'lovebug', + 'macmac', + 'queenie', + 'puffin', + 'vanguard', + 'trip', + 'trinitro', + 'airwolf', + 'abbott', + 'aaa111', + 'cocaine', + 'cisco', + 'cottage', + 'dayton', + 'deadly', + 'datsun', + 'bricks', + 'bumper', + 'eldorado', + 'kidrock', + 'wizard1', + 'whiskers', + 'wind', + 'wildwood', + 'istheman', + 'interest', + 'italy', + '25802580', + 'benoit', + 'bigones', + 'woodland', + 'wolfpac', + 'strawber', + 'suicide', + '3030', + 'sheba1', + 'sixpack', + 'peace1', + 'physics', + 'pearson', + 'tigger2', + 'toad', + 'megan1', + 'meow', + 'ringo', + 'roll', + 'amsterdam', + '717171', + '686868', + '5424', + 'catherine', + 'canuck', + 'football1', + 'footjob', + 'fulham', + 'seagull', + 'orgy', + 'lobo', + 'mancity', + 'truth', + 'trace', + 'vancouve', + 'vauxhall', + 'acidburn', + 'derf', + 'myspace1', + 'boozer', + 'buttercu', + 'howell', + 'hola', + 'easton', + 'minemine', + 'munch', + 'jared', + '1dragon', + 'biology', + 'bestbuy', + 'bigpoppa', + 'blackout', + 'blowfish', + 'bmw325', + 'bigbob', + 'stream', + 'talisman', + 'tazz', + 'sundevil', + '3333333', + 'skate', + 'shutup', + 'shanghai', + 'shop', + 'spencer1', + 'slowhand', + 'polish', + 'pinky1', + 'tootie', + 'thecrow', + 'leroy', + 'jonathon', + 'jubilee', + 'jingle', + 'martine', + 'matrix1', + 'manowar', + 'michaels', + 'messiah', + 'mclaren', + 'resident', + 'reilly', + 'redbaron', + 'rollins', + 'romans', + 'return', + 'rivera', + 'andromed', + 'athlon', + 'beach1', + 'badgers', + 'guitars', + 'harald', + 'harddick', + 'gotribe', + '6996', + '7grout', + '5wr2i7h8', + '635241', + 'chase1', + 'carver', + 'charlotte', + 'fallout', + 'fiddle', + 'fredrick', + 'fenris', + 'francesc', + 'fortuna', + 'ferguson', + 'fairlane', + 'felipe', + 'felix1', + 'forward', + 'gasman', + 'frost', + 'fucks', + 'sahara', + 'sassy1', + 'dogpound', + 'dogbert', + 'divx1', + 'manila', + 'loretta', + 'priest', + 'pornporn', + 'quasar', + 'venom', + '987987', + 'access1', + 'clippers', + 'daylight', + 'decker', + 'daman', + 'data', + 'dentist', + 'crusty', + 'nathan1', + 'nnnnnnnn', + 'bruno1', + 'bucks', + 'brodie', + 'budapest', + 'kittens', + 'kerouac', + 'mother1', + 'waldo1', + 'wedding', + 'whistler', + 'whatwhat', + 'wanderer', + 'idontkno', + '1942', + '1946', + 'bigdawg', + 'bigpimp', + 'zaqwsx', + '414141', + '3000gt', + '434343', + 'shoes', + 'serpent', + 'starr', + 'smurf', + 'pasword', + 'tommie', + 'thisisit', + 'lake', + 'john1', + 'robotics', + 'redeye', + 'rebelz', + '1011', + 'alatam', + 'asses', + 'asians', + 'bama', + 'banzai', + 'harvest', + 'gonzalez', + 'hair', + 'hanson', + '575757', + '5329', + 'cascade', + 'chinese', + 'fatty', + 'fender1', + 'flower2', + 'funky', + 'sambo', + 'drummer1', + 'dogcat', + 'dottie', + 'oedipus', + 'osama', + 'macleod', + 'prozac', + 'private1', + 'rampage', + 'punch', + 'presley', + 'concord', + 'cook', + 'cinema', + 'cornwall', + 'cleaner', + 'christopher', + 'ciccio', + 'corinne', + 'clutch', + 'corvet07', + 'daemon', + 'bruiser', + 'boiler', + 'hjkl', + 'eyes', + 'egghead', + 'expert', + 'ethan', + 'kasper', + 'mordor', + 'wasted', + 'jamess', + 'iverson3', + 'bluesman', + 'zouzou', + '090909', + '1002', + 'switch', + 'stone1', + '4040', + 'sisters', + 'sexo', + 'shawna', + 'smith1', + 'sperma', + 'sneaky', + 'polska', + 'thewho', + 'terminat', + 'krypton', + 'lawson', + 'library', + 'lekker', + 'jules', + 'johnson1', + 'johann', + 'justus', + 'rockie', + 'romano', + 'aspire', + 'bastards', + 'goodie', + 'cheese1', + 'fenway', + 'fishon', + 'fishin', + 'fuckoff1', + 'girls1', + 'sawyer', + 'dolores', + 'desmond', + 'duane', + 'doomsday', + 'pornking', + 'ramones', + 'rabbits', + 'transit', + 'aaaaa1', + 'clock', + 'delilah', + 'noel', + 'boyz', + 'bookworm', + 'bongo', + 'bunnies', + 'brady', + 'buceta', + 'highbury', + 'henry1', + 'heels', + 'eastern', + 'krissy', + 'mischief', + 'mopar', + 'ministry', + 'vienna', + 'weston', + 'wildone', + 'vodka', + 'jayson', + 'bigbooty', + 'beavis1', + 'betsy', + 'xxxxxx1', + 'yogibear', + '000001', + '0815', + 'zulu', + '420000', + 'september', + 'sigmar', + 'sprout', + 'stalin', + 'peggy', + 'patch', + 'lkjhgfds', + 'lagnaf', + 'rolex', + 'redfox', + 'referee', + '123123123', + '1231', + 'angus1', + 'ariana', + 'ballin', + 'attila', + 'hall', + 'greedy', + 'grunt', + '747474', + 'carpedie', + 'cecile', + 'caramel', + 'foxylady', + 'field', + 'gatorade', + 'gidget', + 'futbol', + 'frosch', + 'saiyan', + 'schmidt', + 'drums', + 'donner', + 'doggy1', + 'drum', + 'doudou', + 'pack', + 'pain', + 'nutmeg', + 'quebec', + 'valdepen', + 'trash', + 'triple', + 'tosser', + 'tuscl', + 'track', + 'comfort', + 'choke', + 'comein', + 'cola', + 'deputy', + 'deadpool', + 'bremen', + 'borders', + 'bronson', + 'break', + 'hotass', + 'hotmail1', + 'eskimo', + 'eggman', + 'koko', + 'kieran', + 'katrin', + 'kordell1', + 'komodo', + 'mone', + 'munich', + 'vvvvvvvv', + 'winger', + 'jaeger', + 'ivan', + 'jackson5', + '2222222', + 'bergkamp', + 'bennie', + 'bigben', + 'zanzibar', + 'worm', + 'xxx123', + 'sunny1', + '373737', + 'services', + 'sheridan', + 'slater', + 'slayer1', + 'snoop', + 'stacie', + 'peachy', + 'thecure', + 'times', + 'little1', + 'jennaj', + 'marquis', + 'middle', + 'rasta69', + '1114', + 'aries', + 'havana', + 'gratis', + 'calgary', + 'checkers', + 'flanker', + 'salope', + 'dirty1', + 'draco', + 'dogface', + 'luv2epus', + 'rainbow6', + 'qwerty123', + 'umpire', + 'turnip', + 'vbnm', + 'tucson', + 'troll', + 'aileen', + 'codered', + 'commande', + 'damon', + 'nana', + 'neon', + 'nico', + 'nightwin', + 'neil', + 'boomer1', + 'bushido', + 'hotmail0', + 'horace', + 'enternow', + 'kaitlyn', + 'keepout', + 'karen1', + 'mindy', + 'mnbv', + 'viewsoni', + 'volcom', + 'wizards', + 'wine', + '1995', + 'berkeley', + 'bite', + 'zach', + 'woodstoc', + 'tarpon', + 'shinobi', + 'starstar', + 'phat', + 'patience', + 'patrol', + 'toolbox', + 'julien', + 'johnny1', + 'joebob', + 'marble', + 'riders', + 'reflex', + '120676', + '1235', + 'angelus', + 'anthrax', + 'atlas', + 'hawks', + 'grandam', + 'harlem', + 'hawaii50', + 'gorgeous', + '655321', + 'cabron', + 'challeng', + 'callisto', + 'firewall', + 'firefire', + 'fischer', + 'flyer', + 'flower1', + 'factory', + 'federal', + 'gambler', + 'frodo1', + 'funk', + 'sand', + 'sam123', + 'scania', + 'dingo', + 'papito', + 'passmast', + 'olive', + 'palermo', + 'ou8123', + 'lock', + 'ranch', + 'pride', + 'randy1', + 'twiggy', + 'travis1', + 'transfer', + 'treetop', + 'addict', + 'admin1', + '963852', + 'aceace', + 'clarissa', + 'cliff', + 'cirrus', + 'clifton', + 'colin', + 'bobdole', + 'bonner', + 'bogus', + 'bonjovi', + 'bootsy', + 'boater', + 'elway7', + 'edison', + 'kelvin', + 'kenny1', + 'moonshin', + 'montag', + 'moreno', + 'wayne1', + 'white1', + 'jazzy', + 'jakejake', + '1994', + '1991', + '2828', + 'blunt', + 'bluejays', + 'beau', + 'belmont', + 'worthy', + 'systems', + 'sensei', + 'southpark', + 'stan', + 'peeper', + 'pharao', + 'pigpen', + 'tomahawk', + 'teensex', + 'leedsutd', + 'larkin', + 'jermaine', + 'jeepster', + 'jimjim', + 'josephin', + 'melons', + 'marlon', + 'matthias', + 'marriage', + 'robocop', + '1003', + '1027', + 'antelope', + 'azsxdc', + 'gordo', + 'hazard', + 'granada', + '8989', + '7894', + 'ceasar', + 'cabernet', + 'cheshire', + 'california', + 'chelle', + 'candy1', + 'fergie', + 'fanny', + 'fidelio', + 'giorgio', + 'fuckhead', + 'ruth', + 'sanford', + 'diego', + 'dominion', + 'devon', + 'panic', + 'longer', + 'mackie', + 'qawsed', + 'trucking', + 'twelve', + 'chloe1', + 'coral', + 'daddyo', + 'nostromo', + 'boyboy', + 'booster', + 'bucky', + 'honolulu', + 'esquire', + 'dynamite', + 'motor', + 'mollydog', + 'wilder', + 'windows1', + 'waffle', + 'wallet', + 'warning', + 'virus', + 'washburn', + 'wealth', + 'vincent1', + 'jabber', + 'jaguars', + 'javelin', + 'irishman', + 'idefix', + 'bigdog1', + 'blue42', + 'blanked', + 'blue32', + 'biteme1', + 'bearcats', + 'blaine', + 'yessir', + 'sylveste', + 'team', + 'stephan', + 'sunfire', + 'tbird', + 'stryker', + '3ip76k2', + 'sevens', + 'sheldon', + 'pilgrim', + 'tenchi', + 'titman', + 'leeds', + 'lithium', + 'lander', + 'linkin', + 'landon', + 'marijuan', + 'mariner', + 'markie', + 'midnite', + 'reddwarf', + '1129', + '123asd', + '12312312', + 'allstar', + 'albany', + 'asdf12', + 'antonia', + 'aspen', + 'hardball', + 'goldfing', + '7734', + '49ers', + 'carlo', + 'chambers', + 'cable', + 'carnage', + 'callum', + 'carlos1', + 'fitter', + 'fandango', + 'festival', + 'flame', + 'gofast', + 'gamma', + 'fucmy69', + 'scrapper', + 'dogwood', + 'django', + 'magneto', + 'loose', + 'premium', + 'addison', + '9999999', + 'abc1234', + 'cromwell', + 'newyear', + 'nichole', + 'bookie', + 'burns', + 'bounty', + 'brown1', + 'bologna', + 'earl', + 'entrance', + 'elway', + 'killjoy', + 'kerry', + 'keenan', + 'kick', + 'klondike', + 'mini', + 'mouser', + 'mohammed', + 'wayer', + 'impreza', + 'irene', + 'insomnia', + '24682468', + '2580', + '24242424', + 'billbill', + 'bellaco', + 'blessing', + 'blues1', + 'bedford', + 'blanco', + 'blunts', + 'stinks', + 'teaser', + 'streets', + 'sf49ers', + 'shovel', + 'solitude', + 'spikey', + 'sonia', + 'pimpdadd', + 'timeout', + 'toffee', + 'lefty', + 'johndoe', + 'johndeer', + 'mega', + 'manolo', + 'mentor', + 'margie', + 'ratman', + 'ridge', + 'record', + 'rhodes', + 'robin1', + '1124', + '1210', + '1028', + '1226', + 'another', + 'babylove', + 'barbados', + 'harbor', + 'gramma', + '646464', + 'carpente', + 'chaos1', + 'fishbone', + 'fireblad', + 'glasgow', + 'frogs', + 'scissors', + 'screamer', + 'salem', + 'scuba1', + 'ducks', + 'driven', + 'doggies', + 'dicky', + 'donovan', + 'obsidian', + 'rams', + 'progress', + 'tottenham', + 'aikman', + 'comanche', + 'corolla', + 'clarke', + 'conway', + 'cumslut', + 'cyborg', + 'dancing', + 'boston1', + 'bong', + 'houdini', + 'helmut', + 'elvisp', + 'edge', + 'keksa12', + 'misha', + 'monty1', + 'monsters', + 'wetter', + 'watford', + 'wiseguy', + 'veronika', + 'visitor', + 'janelle', + '1989', + '1987', + '20202020', + 'biatch', + 'beezer', + 'bigguns', + 'blueball', + 'bitchy', + 'wyoming', + 'yankees2', + 'wrestler', + 'stupid1', + 'sealteam', + 'sidekick', + 'simple1', + 'smackdow', + 'sporting', + 'spiral', + 'smeller', + 'sperm', + 'plato', + 'tophat', + 'test2', + 'theatre', + 'thick', + 'toomuch', + 'leigh', + 'jello', + 'jewish', + 'junkie', + 'maxim', + 'maxime', + 'meadow', + 'remingto', + 'roofer', + '124038', + '1018', + '1269', + '1227', + '123457', + 'arkansas', + 'alberta', + 'aramis', + 'andersen', + 'beaker', + 'barcelona', + 'baltimor', + 'googoo', + 'goochi', + '852456', + '4711', + 'catcher', + 'carman', + 'champ1', + 'chess', + 'fortress', + 'fishfish', + 'firefigh', + 'geezer', + 'rsalinas', + 'samuel1', + 'saigon', + 'scooby1', + 'doors', + 'dick1', + 'devin', + 'doom', + 'dirk', + 'doris', + 'dontknow', + 'load', + 'magpies', + 'manfred', + 'raleigh', + 'vader1', + 'universa', + 'tulips', + 'defense', + 'mygirl', + 'burn', + 'bowtie', + 'bowman', + 'holycow', + 'heinrich', + 'honeys', + 'enforcer', + 'katherine', + 'minerva', + 'wheeler', + 'witch', + 'waterboy', + 'jaime', + 'irving', + '1992', + '23skidoo', + 'bimbo', + 'blue11', + 'birddog', + 'woodman', + 'womble', + 'zildjian', + '030303', + 'stinker', + 'stoppedby', + 'sexybabe', + 'speakers', + 'slugger', + 'spotty', + 'smoke1', + 'polopolo', + 'perfect1', + 'things', + 'torpedo', + 'tender', + 'thrasher', + 'lakeside', + 'lilith', + 'jimmys', + 'jerk', + 'junior1', + 'marsh', + 'masamune', + 'rice', + 'root', + '1214', + 'april1', + 'allgood', + 'bambi', + 'grinch', + '767676', + '5252', + 'cherries', + 'chipmunk', + 'cezer121', + 'carnival', + 'capecod', + 'finder', + 'flint', + 'fearless', + 'goats', + 'funstuff', + 'gideon', + 'savior', + 'seabee', + 'sandro', + 'schalke', + 'salasana', + 'disney1', + 'duckman', + 'options', + 'pancake', + 'pantera1', + 'malice', + 'lookin', + 'love123', + 'lloyd', + 'qwert123', + 'puppet', + 'prayers', + 'union', + 'tracer', + 'crap', + 'creation', + 'cwoui', + 'nascar24', + 'hookers', + 'hollie', + 'hewitt', + 'estrella', + 'erection', + 'ernesto', + 'ericsson', + 'edthom', + 'kaylee', + 'kokoko', + 'kokomo', + 'kimball', + 'morales', + 'mooses', + 'monk', + 'walton', + 'weekend', + 'inter', + 'internal', + '1michael', + '1993', + '19781978', + '25252525', + 'worker', + 'summers', + 'surgery', + 'shibby', + 'shamus', + 'skibum', + 'sheepdog', + 'sex69', + 'spliff', + 'slipper', + 'spoons', + 'spanner', + 'snowbird', + 'slow', + 'toriamos', + 'temp123', + 'tennesse', + 'lakers1', + 'jomama', + 'julio', + 'mazdarx7', + 'rosario', + 'recon', + 'riddle', + 'room', + 'revolver', + '1025', + '1101', + 'barney1', + 'babycake', + 'baylor', + 'gotham', + 'gravity', + 'hallowee', + 'hancock', + '616161', + '515000', + 'caca', + 'cannabis', + 'castor', + 'chilli', + 'fdsa', + 'getout', + 'fuck69', + 'gators1', + 'sail', + 'sable', + 'rumble', + 'dolemite', + 'dork', + 'dickens', + 'duffer', + 'dodgers1', + 'painting', + 'onions', + 'logger', + 'lorena', + 'lookout', + 'magic32', + 'port', + 'poon', + 'prime', + 'twat', + 'coventry', + 'citroen', + 'christmas', + 'civicsi', + 'cocksucker', + 'coochie', + 'compaq1', + 'nancy1', + 'buzzer', + 'boulder', + 'butkus', + 'bungle', + 'hogtied', + 'honor', + 'hero', + 'hotgirls', + 'hilary', + 'heidi1', + 'eggplant', + 'mustang6', + 'mortal', + 'monkey12', + 'wapapapa', + 'wendy1', + 'volleyba', + 'vibrate', + 'vicky', + 'bledsoe', + 'blink', + 'birthday4', + 'woof', + 'xxxxx1', + 'talk', + 'stephen1', + 'suburban', + 'stock', + 'tabatha', + 'sheeba', + 'start1', + 'soccer10', + 'something', + 'starcraft', + 'soccer12', + 'peanut1', + 'plastics', + 'penthous', + 'peterbil', + 'tools', + 'tetsuo', + 'torino', + 'tennis1', + 'termite', + 'ladder', + 'last', + 'lemmein', + 'lakewood', + 'jughead', + 'melrose', + 'megane', + 'reginald', + 'redone', + 'request', + 'angela1', + 'alive', + 'alissa', + 'goodgirl', + 'gonzo1', + 'golden1', + 'gotyoass', + '656565', + '626262', + 'capricor', + 'chains', + 'calvin1', + 'foolish', + 'fallon', + 'getmoney', + 'godfather', + 'gabber', + 'gilligan', + 'runaway', + 'salami', + 'dummy', + 'dungeon', + 'dudedude', + 'dumb', + 'dope', + 'opus', + 'paragon', + 'oxygen', + 'panhead', + 'pasadena', + 'opendoor', + 'odyssey', + 'magellan', + 'lottie', + 'printing', + 'pressure', + 'prince1', + 'trustme', + 'christa', + 'court', + 'davies', + 'neville', + 'nono', + 'bread', + 'buffet', + 'hound', + 'kajak', + 'killkill', + 'mona', + 'moto', + 'mildred', + 'winner1', + 'vixen', + 'whiteboy', + 'versace', + 'winona', + 'voyager1', + 'instant', + 'indy', + 'jackjack', + 'bigal', + 'beech', + 'biggun', + 'blake1', + 'blue99', + 'big1', + 'woods', + 'synergy', + 'success1', + '336699', + 'sixty9', + 'shark1', + 'skin', + 'simba1', + 'sharpe', + 'sebring', + 'spongebo', + 'spunk', + 'springs', + 'sliver', + 'phialpha', + 'password9', + 'pizza1', + 'plane', + 'perkins', + 'pookey', + 'tickling', + 'lexingky', + 'lawman', + 'joe123', + 'jolly', + 'mike123', + 'romeo1', + 'redheads', + 'reserve', + 'apple123', + 'alanis', + 'ariane', + 'antony', + 'backbone', + 'aviation', + 'band', + 'hand', + 'green123', + 'haley', + 'carlitos', + 'byebye', + 'cartman1', + 'camden', + 'chewy', + 'camaross', + 'favorite6', + 'forumwp', + 'franks', + 'ginscoot', + 'fruity', + 'sabrina1', + 'devil666', + 'doughnut', + 'pantie', + 'oldone', + 'paintball', + 'lumina', + 'rainbow1', + 'prosper', + 'total', + 'true', + 'umbrella', + 'ajax', + '951753', + 'achtung', + 'abc12345', + 'compact', + 'color', + 'corn', + 'complete', + 'christi', + 'closer', + 'corndog', + 'deerhunt', + 'darklord', + 'dank', + 'nimitz', + 'brandy1', + 'bowl', + 'breanna', + 'holidays', + 'hetfield', + 'holein1', + 'hillbill', + 'hugetits', + 'east', + 'evolutio', + 'kenobi', + 'whiplash', + 'waldo', + 'wg8e3wjf', + 'wing', + 'istanbul', + 'invis', + '1996', + 'benton', + 'bigjohn', + 'bluebell', + 'beef', + 'beater', + 'benji', + 'bluejay', + 'xyzzy', + 'wrestling', + 'storage', + 'superior', + 'suckdick', + 'taichi', + 'stellar', + 'stephane', + 'shaker', + 'skirt', + 'seymour', + 'semper', + 'splurge', + 'squeak', + 'pearls', + 'playball', + 'pitch', + 'phyllis', + 'pooky', + 'piss', + 'tomas', + 'titfuck', + 'joemama', + 'johnny5', + 'marcello', + 'marjorie', + 'married', + 'maxi', + 'rhubarb', + 'rockwell', + 'ratboy', + 'reload', + 'rooney', + 'redd', + '1029', + '1030', + '1220', + 'anchor', + 'bbking', + 'baritone', + 'gryphon', + 'gone', + '57chevy', + '494949', + 'celeron', + 'fishy', + 'gladiator', + 'fucker1', + 'roswell', + 'dougie', + 'downer', + 'dicker', + 'diva', + 'domingo', + 'donjuan', + 'nympho', + 'omar', + 'praise', + 'racers', + 'trick', + 'trauma', + 'truck1', + 'trample', + 'acer', + 'corwin', + 'cricket1', + 'clemente', + 'climax', + 'denmark', + 'cuervo', + 'notnow', + 'nittany', + 'neutron', + 'native', + 'bosco1', + 'buffa', + 'breaker', + 'hello2', + 'hydro', + 'estelle', + 'exchange', + 'explore', + 'kisskiss', + 'kittys', + 'kristian', + 'montecar', + 'modem', + 'mississi', + 'mooney', + 'weiner', + 'washington', + '20012001', + 'bigdick1', + 'bibi', + 'benfica', + 'yahoo1', + 'striper', + 'tabasco', + 'supra', + '383838', + '456654', + 'seneca', + 'serious', + 'shuttle', + 'socks', + 'stanton', + 'penguin1', + 'pathfind', + 'testibil', + 'thethe', + 'listen', + 'lightning', + 'lighting', + 'jeter2', + 'marma', + 'mark1', + 'metoo', + 'republic', + 'rollin', + 'redleg', + 'redbone', + 'redskin', + 'rocco', + '1245', + 'armand', + 'anthony7', + 'altoids', + 'andrews', + 'barley', + 'away', + 'asswipe', + 'bauhaus', + 'bbbbbb1', + 'gohome', + 'harrier', + 'golfpro', + 'goldeney', + '818181', + '6666666', + '5000', + '5rxypn', + 'cameron1', + 'calling', + 'checker', + 'calibra', + 'fields', + 'freefree', + 'faith1', + 'fist', + 'fdm7ed', + 'finally', + 'giraffe', + 'glasses', + 'giggles', + 'fringe', + 'gate', + 'georgie', + 'scamper', + 'rrpass1', + 'screwyou', + 'duffy', + 'deville', + 'dimples', + 'pacino', + 'ontario', + 'passthie', + 'oberon', + 'quest1', + 'postov1000', + 'puppydog', + 'puffer', + 'raining', + 'protect', + 'qwerty7', + 'trey', + 'tribe', + 'ulysses', + 'tribal', + 'adam25', + 'a1234567', + 'compton', + 'collie', + 'cleopatr', + 'contract', + 'davide', + 'norris', + 'namaste', + 'myrtle', + 'buffalo1', + 'bonovox', + 'buckley', + 'bukkake', + 'burning', + 'burner', + 'bordeaux', + 'burly', + 'hun999', + 'emilie', + 'elmo', + 'enters', + 'enrique', + 'keisha', + 'mohawk', + 'willard', + 'vgirl', + 'whale', + 'vince', + 'jayden', + 'jarrett', + '1812', + '1943', + '222333', + 'bigjim', + 'bigd', + 'zoom', + 'wordup', + 'ziggy1', + 'yahooo', + 'workout', + 'young1', + 'written', + 'xmas', + 'zzzzzz1', + 'surfer1', + 'strife', + 'sunlight', + 'tasha1', + 'skunk', + 'shauna', + 'seth', + 'soft', + 'sprinter', + 'peaches1', + 'planes', + 'pinetree', + 'plum', + 'pimping', + 'theforce', + 'thedon', + 'toocool', + 'leeann', + 'laddie', + 'list', + 'lkjh', + 'lara', + 'joke', + 'jupiter1', + 'mckenzie', + 'matty', + 'rene', + 'redrose', + '1200', + '102938', + 'annmarie', + 'alexa', + 'antares', + 'austin31', + 'ground', + 'goose1', + '737373', + '78945612', + '789987', + '6464', + 'calimero', + 'caster', + 'casper1', + 'cement', + 'chevrolet', + 'chessie', + 'caddy', + 'chill', + 'child', + 'canucks', + 'feeling', + 'favorite', + 'fellatio', + 'f00tball', + 'francine', + 'gateway2', + 'gigi', + 'gamecube', + 'giovanna', + 'rugby1', + 'scheisse', + 'dshade', + 'dudes', + 'dixie1', + 'owen', + 'offshore', + 'olympia', + 'lucas1', + 'macaroni', + 'manga', + 'pringles', + 'puff', + 'tribble', + 'trouble1', + 'ussy', + 'core', + 'clint', + 'coolhand', + 'colonial', + 'colt', + 'debra', + 'darthvad', + 'dealer', + 'cygnusx1', + 'natalie1', + 'newark', + 'husband', + 'hiking', + 'errors', + 'eighteen', + 'elcamino', + 'emmett', + 'emilia', + 'koolaid', + 'knight1', + 'murphy1', + 'volcano', + 'idunno', + '2005', + '2233', + 'block', + 'benito', + 'blueberr', + 'biguns', + 'yamahar1', + 'zapper', + 'zorro1', + '0911', + '3006', + 'sixsix', + 'shopper', + 'siobhan', + 'sextoy', + 'stafford', + 'snowboard', + 'speedway', + 'sounds', + 'pokey', + 'peabody', + 'playboy2', + 'titi', + 'think', + 'toast', + 'toonarmy', + 'lister', + 'lambda', + 'joecool', + 'jonas', + 'joyce', + 'juniper', + 'mercer', + 'max123', + 'manny', + 'massimo', + 'mariposa', + 'met2002', + 'reggae', + 'ricky1', + '1236', + '1228', + '1016', + 'all4one', + 'arianna', + 'baberuth', + 'asgard', + 'gonzales', + '484848', + '5683', + '6669', + 'catnip', + 'chiquita', + 'charisma', + 'capslock', + 'cashmone', + 'chat', + 'figure', + 'galant', + 'frenchy', + 'gizmodo1', + 'girlies', + 'gabby', + 'garner', + 'screwy', + 'doubled', + 'divers', + 'dte4uw', + 'done', + 'dragonfl', + 'maker', + 'locks', + 'rachelle', + 'treble', + 'twinkie', + 'trailer', + 'tropical', + 'acid', + 'crescent', + 'cooking', + 'cococo', + 'cory', + 'dabomb', + 'daffy', + 'dandfa', + 'cyrano', + 'nathanie', + 'briggs', + 'boners', + 'helium', + 'horton', + 'hoffman', + 'hellas', + 'espresso', + 'emperor', + 'killa', + 'kikimora', + 'wanda', + 'w4g8at', + 'verona', + 'ilikeit', + 'iforget', + '1944', + '20002000', + 'birthday1', + 'beatles1', + 'blue1', + 'bigdicks', + 'beethove', + 'blacklab', + 'blazers', + 'benny1', + 'woodwork', + '0069', + '0101', + 'taffy', + 'susie', + 'survivor', + 'swim', + 'stokes', + '4567', + 'shodan', + 'spoiled', + 'steffen', + 'pissed', + 'pavlov', + 'pinnacle', + 'place', + 'petunia', + 'terrell', + 'thirty', + 'toni', + 'tito', + 'teenie', + 'lemonade', + 'lily', + 'lillie', + 'lalakers', + 'lebowski', + 'lalalala', + 'ladyboy', + 'jeeper', + 'joyjoy', + 'mercury1', + 'mantle', + 'mannn', + 'rocknrol', + 'riversid', + 'reeves', + '123aaa', + '11112222', + '121314', + '1021', + '1004', + '1120', + 'allen1', + 'ambers', + 'amstel', + 'ambrose', + 'alice1', + 'alleycat', + 'allegro', + 'ambrosia', + 'alley', + 'australia', + 'hatred', + 'gspot', + 'graves', + 'goodsex', + 'hattrick', + 'harpoon', + '878787', + '8inches', + '4wwvte', + 'cassandr', + 'charlie123', + 'case', + 'chavez', + 'fighting', + 'gabriela', + 'gatsby', + 'fudge', + 'gerry', + 'generic', + 'gareth', + 'fuckme2', + 'samm', + 'sage', + 'seadog', + 'satchmo', + 'scxakv', + 'santafe', + 'dipper', + 'dingle', + 'dizzy', + 'outoutout', + 'madmad', + 'london1', + 'qbg26i', + 'pussy123', + 'randolph', + 'vaughn', + 'tzpvaw', + 'vamp', + 'comedy', + 'comp', + 'cowgirl', + 'coldplay', + 'dawgs', + 'delaney', + 'nt5d27', + 'novifarm', + 'needles', + 'notredam', + 'newness', + 'mykids', + 'bryan1', + 'bouncer', + 'hihihi', + 'honeybee', + 'iceman1', + 'herring', + 'horn', + 'hook', + 'hotlips', + 'dynamo', + 'klaus', + 'kittie', + 'kappa', + 'kahlua', + 'muffy', + 'mizzou', + 'mohamed', + 'musical', + 'wannabe', + 'wednesda', + 'whatup', + 'weller', + 'waterfal', + 'willy1', + 'invest', + 'blanche', + 'bear1', + 'billabon', + 'youknow', + 'zelda', + 'yyyyyy1', + 'zachary1', + '01234567', + '070462', + 'zurich', + 'superstar', + 'storms', + 'tail', + 'stiletto', + 'strat', + '427900', + 'sigmachi', + 'shelter', + 'shells', + 'sexy123', + 'smile1', + 'sophie1', + 'stefano', + 'stayout', + 'somerset', + 'smithers', + 'playmate', + 'pinkfloyd', + 'phish1', + 'payday', + 'thebear', + 'telefon', + 'laetitia', + 'kswbdu', + 'larson', + 'jetta', + 'jerky', + 'melina', + 'metro', + 'revoluti', + 'retire', + 'respect', + '1216', + '1201', + '1204', + '1222', + '1115', + 'archange', + 'barry1', + 'handball', + '676767', + 'chandra', + 'chewbacc', + 'flesh', + 'furball', + 'gocubs', + 'fruit', + 'fullback', + 'gman', + 'gentle', + 'dunbar', + 'dewalt', + 'dominiqu', + 'diver1', + 'dhip6a', + 'olemiss', + 'ollie', + 'mandrake', + 'mangos', + 'pretzel', + 'pusssy', + 'tripleh', + 'valdez', + 'vagabond', + 'clean', + 'comment', + 'crew', + 'clovis', + 'deaths', + 'dandan', + 'csfbr5yy', + 'deadspin', + 'darrel', + 'ninguna', + 'noah', + 'ncc74656', + 'bootsie', + 'bp2002', + 'bourbon', + 'brennan', + 'bumble', + 'books', + 'hose', + 'heyyou', + 'houston1', + 'hemlock', + 'hippo', + 'hornets', + 'hurricane', + 'horseman', + 'hogan', + 'excess', + 'extensa', + 'muffin1', + 'virginie', + 'werdna', + 'idontknow', + 'info', + 'iron', + 'jack1', + '1bitch', + '151nxjmt', + 'bendover', + 'bmwbmw', + 'bills', + 'zaq123', + 'wxcvbn', + 'surprise', + 'supernov', + 'tahoe', + 'talbot', + 'simona', + 'shakur', + 'sexyone', + 'seviyi', + 'sonja', + 'smart1', + 'speed1', + 'pepito', + 'phantom1', + 'playoffs', + 'terry1', + 'terrier', + 'laser1', + 'lite', + 'lancia', + 'johngalt', + 'jenjen', + 'jolene', + 'midori', + 'message', + 'maserati', + 'matteo', + 'mental', + 'miami1', + 'riffraff', + 'ronald1', + 'reason', + 'rhythm', + '1218', + '1026', + '123987', + '1015', + '1103', + 'armada', + 'architec', + 'austria', + 'gotmilk', + 'hawkins', + 'gray', + 'camila', + 'camp', + 'cambridg', + 'charge', + 'camero', + 'flex', + 'foreplay', + 'getoff', + 'glacier', + 'glotest', + 'froggie', + 'gerbil', + 'rugger', + 'sanity72', + 'salesman', + 'donna1', + 'dreaming', + 'deutsch', + 'orchard', + 'oyster', + 'palmtree', + 'ophelia', + 'pajero', + 'm5wkqf', + 'magenta', + 'luckyone', + 'treefrog', + 'vantage', + 'usmarine', + 'tyvugq', + 'uptown', + 'abacab', + 'aaaaaa1', + 'advance', + 'chuck1', + 'delmar', + 'darkange', + 'cyclones', + 'nate', + 'navajo', + 'nope', + 'border', + 'bubba123', + 'building', + 'iawgk2', + 'hrfzlz', + 'dylan1', + 'enrico', + 'encore', + 'emilio', + 'eclipse1', + 'killian', + 'kayleigh', + 'mutant', + 'mizuno', + 'mustang2', + 'video1', + 'viewer', + 'weed420', + 'whales', + 'jaguar1', + 'insight', + '1990', + '159159', + '1love', + 'bliss', + 'bears1', + 'bigtruck', + 'binder', + 'bigboss', + 'blitz', + 'xqgann', + 'yeahyeah', + 'zeke', + 'zardoz', + 'stickman', + 'table', + '3825', + 'signal', + 'sentra', + 'side', + 'shiva', + 'skipper1', + 'singapor', + 'southpaw', + 'sonora', + 'squid', + 'slamdunk', + 'slimjim', + 'placid', + 'photon', + 'placebo', + 'pearl1', + 'test12', + 'therock1', + 'tiger123', + 'leinad', + 'legman', + 'jeepers', + 'joeblow', + 'mccarthy', + 'mike23', + 'redcar', + 'rhinos', + 'rjw7x4', + '1102', + '13576479', + '112211', + 'alcohol', + 'gwju3g', + 'greywolf', + '7bgiqk', + '7878', + '535353', + '4snz9g', + 'candyass', + 'cccccc1', + 'carola', + 'catfight', + 'cali', + 'fister', + 'fosters', + 'finland', + 'frankie1', + 'gizzmo', + 'fuller', + 'royalty', + 'rugrat', + 'sandie', + 'rudolf', + 'dooley', + 'dive', + 'doreen', + 'dodo', + 'drop', + 'oemdlg', + 'out3xf', + 'paddy', + 'opennow', + 'puppy1', + 'qazwsxedc', + 'pregnant', + 'quinn', + 'ramjet', + 'under', + 'uncle', + 'abraxas', + 'corner', + 'creed', + 'cocoa', + 'crown', + 'cows', + 'cn42qj', + 'dancer1', + 'death666', + 'damned', + 'nudity', + 'negative', + 'nimda2k', + 'buick', + 'bobb', + 'braves1', + 'brook', + 'henrik', + 'higher', + 'hooligan', + 'dust', + 'everlast', + 'karachi', + 'mortis', + 'mulligan', + 'monies', + 'motocros', + 'wally1', + 'weapon', + 'waterman', + 'view', + 'willie1', + 'vicki', + 'inspiron', + '1test', + '2929', + 'bigblack', + 'xytfu7', + 'yackwin', + 'zaq1xsw2', + 'yy5rbfsc', + '100100', + '0660', + 'tahiti', + 'takehana', + 'talks', + '332211', + '3535', + 'sedona', + 'seawolf', + 'skydiver', + 'shine', + 'spleen', + 'slash', + 'spjfet', + 'special1', + 'spooner', + 'slimshad', + 'sopranos', + 'spock1', + 'penis1', + 'patches1', + 'terri', + 'thierry', + 'thething', + 'toohot', + 'large', + 'limpone', + 'johnnie', + 'mash4077', + 'matchbox', + 'masterp', + 'maxdog', + 'ribbit', + 'reed', + 'rita', + 'rockin', + 'redhat', + 'rising', + '1113', + '14789632', + '1331', + 'allday', + 'aladin', + 'andrey', + 'amethyst', + 'ariel', + 'anytime', + 'baseball1', + 'athome', + 'basil', + 'goofy1', + 'greenman', + 'gustavo', + 'goofball', + 'ha8fyp', + 'goodday', + '778899', + 'charon', + 'chappy', + 'castillo', + 'caracas', + 'cardiff', + 'capitals', + 'canada1', + 'cajun', + 'catter', + 'freddy1', + 'favorite2', + 'frazier', + 'forme', + 'follow', + 'forsaken', + 'feelgood', + 'gavin', + 'gfxqx686', + 'garlic', + 'sarge', + 'saskia', + 'sanjose', + 'russ', + 'salsa', + 'dilbert1', + 'dukeduke', + 'downhill', + 'longhair', + 'loop', + 'locutus', + 'lockdown', + 'malachi', + 'mamacita', + 'lolipop', + 'rainyday', + 'pumpkin1', + 'punker', + 'prospect', + 'rambo1', + 'rainbows', + 'quake', + 'twin', + 'trinity1', + 'trooper1', + 'aimee', + 'citation', + 'coolcat', + 'crappy', + 'default', + 'dental', + 'deniro', + 'd9ungl', + 'daddys', + 'napoli', + 'nautica', + 'nermal', + 'bukowski', + 'brick', + 'bubbles1', + 'bogota', + 'board', + 'branch', + 'breath', + 'buds', + 'hulk', + 'humphrey', + 'hitachi', + 'evans', + 'ender', + 'export', + 'kikiki', + 'kcchiefs', + 'kram', + 'morticia', + 'montrose', + 'mongo', + 'waqw3p', + 'wizzard', + 'visited', + 'whdbtp', + 'whkzyc', + 'image', + '154ugeiu', + '1fuck', + 'binky', + 'blind', + 'bigred1', + 'blubber', + 'benz', + 'becky1', + 'year2005', + 'wonderfu', + 'wooden', + 'xrated', + '0001', + 'tampabay', + 'survey', + 'tammy1', + 'stuffer', + '3mpz4r', + '3000', + '3some', + 'selina', + 'sierra1', + 'shampoo', + 'silk', + 'shyshy', + 'slapnuts', + 'standby', + 'spartan1', + 'sprocket', + 'sometime', + 'stanley1', + 'poker1', + 'plus', + 'thought', + 'theshit', + 'torture', + 'thinking', + 'lavalamp', + 'light1', + 'laserjet', + 'jediknig', + 'jjjjj1', + 'jocelyn', + 'mazda626', + 'menthol', + 'maximo', + 'margaux', + 'medic1', + 'release', + 'richter', + 'rhino1', + 'roach', + 'renate', + 'repair', + 'reveal', + '1209', + '1234321', + 'amigos', + 'apricot', + 'alexandra', + 'asdfgh1', + 'hairball', + 'hatter', + 'graduate', + 'grimace', + '7xm5rq', + '6789', + 'cartoons', + 'capcom', + 'cheesy', + 'cashflow', + 'carrots', + 'camping', + 'fanatic', + 'fool', + 'format', + 'fleming', + 'girlie', + 'glover', + 'gilmore', + 'gardner', + 'safeway', + 'ruthie', + 'dogfart', + 'dondon', + 'diapers', + 'outsider', + 'odin', + 'opiate', + 'lollol', + 'love12', + 'loomis', + 'mallrats', + 'prague', + 'primetime21', + 'pugsley', + 'program', + 'r29hqq', + 'touch', + 'valleywa', + 'airman', + 'abcdefg1', + 'darkone', + 'cummer', + 'dempsey', + 'damn', + 'nadia', + 'natedogg', + 'nineball', + 'ndeyl5', + 'natchez', + 'newone', + 'normandy', + 'nicetits', + 'buddy123', + 'buddys', + 'homely', + 'husky', + 'iceland', + 'hr3ytm', + 'highlife', + 'holla', + 'earthlin', + 'exeter', + 'eatmenow', + 'kimkim', + 'karine', + 'k2trix', + 'kernel', + 'kirkland', + 'money123', + 'moonman', + 'miles1', + 'mufasa', + 'mousey', + 'wilma', + 'wilhelm', + 'whites', + 'warhamme', + 'instinct', + 'jackass1', + '2277', + '20spanks', + 'blobby', + 'blair', + 'blinky', + 'bikers', + 'blackjack', + 'becca', + 'blue23', + 'xman', + 'wyvern', + '085tzzqi', + 'zxzxzx', + 'zsmj2v', + 'suede', + 't26gn4', + 'sugars', + 'sylvie', + 'tantra', + 'swoosh', + 'swiss', + '4226', + '4271', + '321123', + '383pdjvl', + 'shoe', + 'shane1', + 'shelby1', + 'spades', + 'spain', + 'smother', + 'soup', + 'sparhawk', + 'pisser', + 'photo1', + 'pebble', + 'phones', + 'peavey', + 'picnic', + 'pavement', + 'terra', + 'thistle', + 'tokyo', + 'therapy', + 'lives', + 'linden', + 'kronos', + 'lilbit', + 'linux', + 'johnston', + 'material', + 'melanie1', + 'marbles', + 'redlight', + 'reno', + 'recall', + '1208', + '1138', + '1008', + 'alchemy', + 'aolsucks', + 'alexalex', + 'atticus', + 'auditt', + 'ballet', + 'b929ezzh', + 'goodyear', + 'hanna', + 'griffith', + 'gubber', + '863abgsg', + '7474', + '797979', + '464646', + '543210', + '4zqauf', + '4949', + 'ch5nmk', + 'carlito', + 'chewey', + 'carebear', + 'caleb', + 'checkmat', + 'cheddar', + 'chachi', + 'fever', + 'forgetit', + 'fine', + 'forlife', + 'giants1', + 'gates', + 'getit', + 'gamble', + 'gerhard', + 'galileo', + 'g3ujwg', + 'ganja', + 'rufus1', + 'rushmore', + 'scouts', + 'discus', + 'dudeman', + 'olympus', + 'oscars', + 'osprey', + 'madcow', + 'locust', + 'loyola', + 'mammoth', + 'proton', + 'rabbit1', + 'question', + 'ptfe3xxp', + 'pwxd5x', + 'purple1', + 'punkass', + 'prophecy', + 'uyxnyd', + 'tyson1', + 'aircraft', + 'access99', + 'abcabc', + 'cocktail', + 'colts', + 'civilwar', + 'cleveland', + 'claudia1', + 'contour', + 'clement', + 'dddddd1', + 'cypher', + 'denied', + 'dapzu455', + 'dagmar', + 'daisydog', + 'name', + 'noles', + 'butters', + 'buford', + 'hoochie', + 'hotel', + 'hoser', + 'eddy', + 'ellis', + 'eldiablo', + 'kingrich', + 'mudvayne', + 'motown', + 'mp8o6d', + 'wife', + 'vipergts', + 'italiano', + 'innocent', + '2055', + '2211', + 'beavers', + 'bloke', + 'blade1', + 'yamato', + 'zooropa', + 'yqlgr667', + '050505', + 'zxcvbnm1', + 'zw6syj', + 'suckcock', + 'tango1', + 'swing', + 'stern', + 'stephens', + 'swampy', + 'susanna', + 'tammie', + '445566', + '333666', + '380zliki', + 'sexpot', + 'sexylady', + 'sixtynin', + 'sickboy', + 'spiffy', + 'sleeping', + 'skylark', + 'sparkles', + 'slam', + 'pintail', + 'phreak', + 'places', + 'teller', + 'timtim', + 'tires', + 'thighs', + 'left', + 'latex', + 'llamas', + 'letsdoit', + 'lkjhg', + 'landmark', + 'letters', + 'lizzard', + 'marlins', + 'marauder', + 'metal1', + 'manu', + 'register', + 'righton', + '1127', + 'alain', + 'alcat', + 'amigo', + 'basebal1', + 'azertyui', + 'attract', + 'azrael', + 'hamper', + 'gotenks', + 'golfgti', + 'gutter', + 'hawkwind', + 'h2slca', + 'harman', + 'grace1', + '6chid8', + '789654', + 'canine', + 'casio', + 'cazzo', + 'chamber', + 'cbr900', + 'cabrio', + 'calypso', + 'capetown', + 'feline', + 'flathead', + 'fisherma', + 'flipmode', + 'fungus', + 'goal', + 'g9zns4', + 'full', + 'giggle', + 'gabriel1', + 'fuck123', + 'saffron', + 'dogmeat', + 'dreamcas', + 'dirtydog', + 'dunlop', + 'douche', + 'dresden', + 'dickdick', + 'destiny1', + 'pappy', + 'oaktree', + 'lydia', + 'luft4', + 'puta', + 'prayer', + 'ramada', + 'trumpet1', + 'vcradq', + 'tulip', + 'tracy71', + 'tycoon', + 'aaaaaaa1', + 'conquest', + 'click', + 'chitown', + 'corps', + 'creepers', + 'constant', + 'couples', + 'code', + 'cornhole', + 'danman', + 'dada', + 'density', + 'd9ebk7', + 'cummins', + 'darth', + 'cute', + 'nash', + 'nirvana1', + 'nixon', + 'norbert', + 'nestle', + 'brenda1', + 'bonanza', + 'bundy', + 'buddies', + 'hotspur', + 'heavy', + 'horror', + 'hufmqw', + 'electro', + 'erasure', + 'enough', + 'elisabet', + 'etvww4', + 'ewyuza', + 'eric1', + 'kinder', + 'kenken', + 'kismet', + 'klaatu', + 'musician', + 'milamber', + 'willi', + 'waiting', + 'isacs155', + 'igor', + '1million', + '1letmein', + 'x35v8l', + 'yogi', + 'ywvxpz', + 'xngwoj', + 'zippy1', + '020202', + '****', + 'stonewal', + 'sweeney', + 'story', + 'sentry', + 'sexsexsex', + 'spence', + 'sonysony', + 'smirnoff', + 'star12', + 'solace', + 'sledge', + 'states', + 'snyder', + 'star1', + 'paxton', + 'pentagon', + 'pkxe62', + 'pilot1', + 'pommes', + 'paulpaul', + 'plants', + 'tical', + 'tictac', + 'toes', + 'lighthou', + 'lemans', + 'kubrick', + 'letmein22', + 'letmesee', + 'jys6wz', + 'jonesy', + 'jjjjjj1', + 'jigga', + 'joelle', + 'mate', + 'merchant', + 'redstorm', + 'riley1', + 'rosa', + 'relief', + '14141414', + '1126', + 'allison1', + 'badboy1', + 'asthma', + 'auggie', + 'basement', + 'hartley', + 'hartford', + 'hardwood', + 'gumbo', + '616913', + '57np39', + '56qhxs', + '4mnveh', + 'cake', + 'forbes', + 'fatluvr69', + 'fqkw5m', + 'fidelity', + 'feathers', + 'fresno', + 'godiva', + 'gecko', + 'gladys', + 'gibson1', + 'gogators', + 'fridge', + 'general1', + 'saxman', + 'rowing', + 'sammys', + 'scotts', + 'scout1', + 'sasasa', + 'samoht', + 'dragon69', + 'ducky', + 'dragonball', + 'driller', + 'p3wqaw', + 'nurse', + 'papillon', + 'oneone', + 'openit', + 'optimist', + 'longshot', + 'portia', + 'rapier', + 'pussy2', + 'ralphie', + 'tuxedo', + 'ulrike', + 'undertow', + 'trenton', + 'copenhag', + 'come', + 'delldell', + 'culinary', + 'deltas', + 'mytime', + 'nicky', + 'nickie', + 'noname', + 'noles1', + 'bucker', + 'bopper', + 'bullock', + 'burnout', + 'bryce', + 'hedges', + 'ibilltes', + 'hihje863', + 'hitter', + 'ekim', + 'espana', + 'eatme69', + 'elpaso', + 'envelope', + 'express1', + 'eeeeee1', + 'eatme1', + 'karaoke', + 'kara', + 'mustang5', + 'misses', + 'wellingt', + 'willem', + 'waterski', + 'webcam', + 'jasons', + 'infinite', + 'iloveyou!', + 'jakarta', + 'belair', + 'bigdad', + 'beerme', + 'yoshi', + 'yinyang', + 'zimmer', + 'x24ik3', + '063dyjuy', + '0000007', + 'ztmfcq', + 'stopit', + 'stooges', + 'survival', + 'stockton', + 'symow8', + 'strato', + '2hot4u', + 'ship', + 'simons', + 'skins', + 'shakes', + 'sex1', + 'shield', + 'snacks', + 'softtail', + 'slimed123', + 'pizzaman', + 'pipe', + 'pitt', + 'pathetic', + 'pinto', + 'tigercat', + 'tonton', + 'lager', + 'lizzy', + 'juju', + 'john123', + 'jennings', + 'josiah', + 'jesse1', + 'jordon', + 'jingles', + 'martian', + 'mario1', + 'rootedit', + 'rochard', + 'redwine', + 'requiem', + 'riverrat', + 'rats', + '1117', + '1014', + '1205', + 'althea', + 'allie', + 'amor', + 'amiga', + 'alpina', + 'alert', + 'atreides', + 'banana1', + 'bahamut', + 'hart', + 'golfman', + 'happines', + '7uftyx', + '5432', + '5353', + '5151', + '4747', + 'byron', + 'chatham', + 'chadwick', + 'cherie', + 'foxfire', + 'ffvdj474', + 'freaked', + 'foreskin', + 'gayboy', + 'gggggg1', + 'glenda', + 'gameover', + 'glitter', + 'funny1', + 'scoobydoo', + 'scroll', + 'rudolph', + 'saddle', + 'saxophon', + 'dingbat', + 'digimon', + 'omicron', + 'parsons', + 'ohio', + 'panda1', + 'loloxx', + 'macintos', + 'lululu', + 'lollypop', + 'racer1', + 'queen1', + 'qwertzui', + 'prick', + 'upnfmc', + 'tyrant', + 'trout1', + '9skw5g', + 'aceman', + 'adelaide', + 'acls2h', + 'aaabbb', + 'acapulco', + 'aggie', + 'comcast', + 'craft', + 'crissy', + 'cloudy', + 'cq2kph', + 'custer', + 'd6o8pm', + 'cybersex', + 'davecole', + 'darian', + 'crumbs', + 'daisey', + 'davedave', + 'dasani', + 'needle', + 'mzepab', + 'myporn', + 'narnia', + 'nineteen', + 'booger1', + 'bravo1', + 'budgie', + 'btnjey', + 'highlander', + 'hotel6', + 'humbug', + 'edwin', + 'ewtosi', + 'kristin1', + 'kobe', + 'knuckles', + 'keith1', + 'katarina', + 'muff', + 'muschi', + 'montana1', + 'wingchun', + 'wiggle', + 'whatthe', + 'walking', + 'watching', + 'vette1', + 'vols', + 'virago', + 'intj3a', + 'ishmael', + 'intern', + 'jachin', + 'illmatic', + '199999', + '2010', + 'beck', + 'blender', + 'bigpenis', + 'bengal', + 'blue1234', + 'your', + 'zaqxsw', + 'xray', + 'xxxxxxx1', + 'zebras', + 'yanks', + 'worlds', + 'tadpole', + 'stripes', + 'svetlana', + '3737', + '4343', + '3728', + '4444444', + '368ejhih', + 'solar', + 'sonne', + 'smalls', + 'sniffer', + 'sonata', + 'squirts', + 'pitcher', + 'playstation', + 'pktmxr', + 'pescator', + 'points', + 'texaco', + 'lesbos', + 'lilian', + 'l8v53x', + 'jo9k2jw2', + 'jimbeam', + 'josie', + 'jimi', + 'jupiter2', + 'jurassic', + 'marines1', + 'maya', + 'rocket1', + 'ringer', + '14725836', + '12345679', + '1219', + '123098', + '1233', + 'alessand', + 'althor', + 'angelika', + 'arch', + 'armando', + 'alpha123', + 'basher', + 'barefeet', + 'balboa', + 'bbbbb1', + 'banks', + 'badabing', + 'harriet', + 'gopack', + 'golfnut', + 'gsxr1000', + 'gregory1', + '766rglqy', + '8520', + '753159', + '8dihc6', + '69camaro', + '666777', + 'cheeba', + 'chino', + 'calendar', + 'cheeky', + 'camel1', + 'fishcake', + 'falling', + 'flubber', + 'giuseppe', + 'gianni', + 'gloves', + 'gnasher23', + 'frisbee', + 'fuzzy1', + 'fuzzball', + 'sauce', + 'save13tx', + 'schatz', + 'russell1', + 'sandra1', + 'scrotum', + 'scumbag', + 'sabre', + 'samdog', + 'dripping', + 'dragon12', + 'dragster', + 'paige', + 'orwell', + 'mainland', + 'lunatic', + 'lonnie', + 'lotion', + 'maine', + 'maddux', + 'qn632o', + 'poophead', + 'rapper', + 'porn4life', + 'producer', + 'rapunzel', + 'tracks', + 'velocity', + 'vanessa1', + 'ulrich', + 'trueblue', + 'vampire1', + 'abacus', + '902100', + 'crispy', + 'corky', + 'crane', + 'chooch', + 'd6wnro', + 'cutie', + 'deal', + 'dabulls', + 'dehpye', + 'navyseal', + 'njqcw4', + 'nownow', + 'nigger1', + 'nightowl', + 'nonenone', + 'nightmar', + 'bustle', + 'buddy2', + 'boingo', + 'bugman', + 'bulletin', + 'bosshog', + 'bowie', + 'hybrid', + 'hillside', + 'hilltop', + 'hotlegs', + 'honesty', + 'hzze929b', + 'hhhhh1', + 'hellohel', + 'eloise', + 'evilone', + 'edgewise', + 'e5pftu', + 'eded', + 'embalmer', + 'excalibur', + 'elefant', + 'kenzie', + 'karl', + 'karin', + 'killah', + 'kleenex', + 'mouses', + 'mounta1n', + 'motors', + 'mutley', + 'muffdive', + 'vivitron', + 'winfield', + 'wednesday', + 'w00t88', + 'iloveit', + 'jarjar', + 'incest', + 'indycar', + '17171717', + '1664', + '17011701', + '222777', + '2663', + 'beelch', + 'benben', + 'yitbos', + 'yyyyy1', + 'yasmin', + 'zapata', + 'zzzzz1', + 'stooge', + 'tangerin', + 'taztaz', + 'stewart1', + 'summer69', + 'sweetness', + 'system1', + 'surveyor', + 'stirling', + '3qvqod', + '3way', + '456321', + 'sizzle', + 'simhrq', + 'shrink', + 'shawnee', + 'someday', + 'sparty', + 'ssptx452', + 'sphere', + 'spark', + 'slammed', + 'sober', + 'persian', + 'peppers', + 'ploppy', + 'pn5jvw', + 'poobear', + 'pianos', + 'plaster', + 'testme', + 'tiff', + 'thriller', + 'larissa', + 'lennox', + 'jewell', + 'master12', + 'messier', + 'rockey', + '1229', + '1217', + '1478', + '1009', + 'anastasi', + 'almighty', + 'amonra', + 'aragon', + 'argentin', + 'albino', + 'azazel', + 'grinder', + '6uldv8', + '83y6pv', + '8888888', + '4tlved', + '515051', + 'carsten', + 'changes', + 'flanders', + 'flyers88', + 'ffffff1', + 'firehawk', + 'foreman', + 'firedog', + 'flashman', + 'ggggg1', + 'gerber', + 'godspeed', + 'galway', + 'giveitup', + 'funtimes', + 'gohan', + 'giveme', + 'geryfe', + 'frenchie', + 'sayang', + 'rudeboy', + 'savanna', + 'sandals', + 'devine', + 'dougal', + 'drag0n', + 'dga9la', + 'disaster', + 'desktop', + 'only', + 'onlyone', + 'otter', + 'pandas', + 'mafia', + 'lombard', + 'luckys', + 'lovejoy', + 'lovelife', + 'manders', + 'product', + 'qqh92r', + 'qcmfd454', + 'pork', + 'radar1', + 'punani', + 'ptbdhw', + 'turtles', + 'undertaker', + 'trs8f7', + 'tramp', + 'ugejvp', + 'abba', + '911turbo', + 'acdc', + 'abcd123', + 'clever', + 'corina', + 'cristian', + 'create', + 'crash1', + 'colony', + 'crosby', + 'delboy', + 'daniele', + 'davinci', + 'daughter', + 'notebook', + 'niki', + 'nitrox', + 'borabora', + 'bonzai', + 'budd', + 'brisbane', + 'hotter', + 'heeled', + 'heroes', + 'hooyah', + 'hotgirl', + 'i62gbq', + 'horse1', + 'hills', + 'hpk2qc', + 'epvjb6', + 'echo', + 'korean', + 'kristie', + 'mnbvc', + 'mohammad', + 'mind', + 'mommy1', + 'munster', + 'wade', + 'wiccan', + 'wanted', + 'jacket', + '2369', + 'bettyboo', + 'blondy', + 'bismark', + 'beanbag', + 'bjhgfi', + 'blackice', + 'yvtte545', + 'ynot', + 'yess', + 'zlzfrh', + 'wolvie', + '007bond', + '******', + 'tailgate', + 'tanya1', + 'sxhq65', + 'stinky1', + '3234412', + '3ki42x', + 'seville', + 'shimmer', + 'sheryl', + 'sienna', + 'shitshit', + 'skillet', + 'seaman', + 'sooners1', + 'solaris', + 'smartass', + 'pastor', + 'pasta', + 'pedros', + 'pennywis', + 'pfloyd', + 'tobydog', + 'thetruth', + 'lethal', + 'letme1n', + 'leland', + 'jenifer', + 'mario66', + 'micky', + 'rocky2', + 'rewq', + 'ripped', + 'reindeer', + '1128', + '1207', + '1104', + '1432', + 'aprilia', + 'allstate', + 'alyson', + 'bagels', + 'basic', + 'baggies', + 'barb', + 'barrage', + 'greatest', + 'gomez', + 'guru', + 'guard', + '72d5tn', + '606060', + '4wcqjn', + 'caldwell', + 'chance1', + 'catalog', + 'faust', + 'film', + 'flange', + 'fran', + 'fartman', + 'geil', + 'gbhcf2', + 'fussball', + 'glen', + 'fuaqz4', + 'gameboy', + 'garnet', + 'geneviev', + 'rotary', + 'seahawk', + 'russel', + 'saab', + 'seal', + 'samadams', + 'devlt4', + 'ditto', + 'drevil', + 'drinker', + 'deuce', + 'dipstick', + 'donut', + 'octopus', + 'ottawa', + 'losangel', + 'loverman', + 'porky', + 'q9umoz', + 'rapture', + 'pump', + 'pussy4me', + 'university', + 'triplex', + 'ue8fpw', + 'trent', + 'trophy', + 'turbos', + 'troubles', + 'agent', + 'aaa340', + 'churchil', + 'crazyman', + 'consult', + 'creepy', + 'craven', + 'class', + 'cutiepie', + 'ddddd1', + 'dejavu', + 'cuxldv', + 'nettie', + 'nbvibt', + 'nikon', + 'niko', + 'norwood', + 'nascar1', + 'nolan', + 'bubba2', + 'boobear', + 'boogers', + 'buff', + 'bullwink', + 'bully', + 'bulldawg', + 'horsemen', + 'escalade', + 'editor', + 'eagle2', + 'dynamic', + 'ella', + 'efyreg', + 'edition', + 'kidney', + 'minnesot', + 'mogwai', + 'morrow', + 'msnxbi', + 'moonlight', + 'mwq6qlzo', + 'wars', + 'werder', + 'verygood', + 'voodoo1', + 'wheel', + 'iiiiii1', + '159951', + '1624', + '1911a1', + '2244', + 'bellagio', + 'bedlam', + 'belkin', + 'bill1', + 'woodrow', + 'xirt2k', + 'worship', + '??????', + 'tanaka', + 'swift', + 'susieq', + 'sundown', + 'sukebe', + 'tales', + 'swifty', + '2fast4u', + 'senate', + 'sexe', + 'sickness', + 'shroom', + 'shaun', + 'seaweed', + 'skeeter1', + 'status', + 'snicker', + 'sorrow', + 'spanky1', + 'spook', + 'patti', + 'phaedrus', + 'pilots', + 'pinch', + 'peddler', + 'theo', + 'thumper1', + 'tessie', + 'tiger7', + 'tmjxn151', + 'thematri', + 'l2g7k3', + 'letmeinn', + 'lazy', + 'jeffjeff', + 'joan', + 'johnmish', + 'mantra', + 'mariana', + 'mike69', + 'marshal', + 'mart', + 'mazda6', + 'riptide', + 'robots', + 'rental', + '1107', + '1130', + '142857', + '11001001', + '1134', + 'armored', + 'alvin', + 'alec', + 'allnight', + 'alright', + 'amatuers', + 'bartok', + 'attorney', + 'astral', + 'baboon', + 'bahamas', + 'balls1', + 'bassoon', + 'hcleeb', + 'happyman', + 'granite', + 'graywolf', + 'golf1', + 'gomets', + '8vjzus', + '7890', + '789123', + '8uiazp', + '5757', + '474jdvff', + '551scasi', + '50cent', + 'camaro1', + 'cherry1', + 'chemist', + 'final', + 'firenze', + 'fishtank', + 'farrell', + 'freewill', + 'glendale', + 'frogfrog', + 'gerhardt', + 'ganesh', + 'same', + 'scirocco', + 'devilman', + 'doodles', + 'dinger', + 'okinawa', + 'olympic', + 'nursing', + 'orpheus', + 'ohmygod', + 'paisley', + 'pallmall', + 'null', + 'lounge', + 'lunchbox', + 'manhatta', + 'mahalo', + 'mandarin', + 'qwqwqw', + 'qguvyt', + 'pxx3eftp', + 'president', + 'rambler', + 'puzzle', + 'poppy1', + 'turk182', + 'trotter', + 'vdlxuc', + 'trish', + 'tugboat', + 'valiant', + 'tracie', + 'uwrl7c', + 'chris123', + 'coaster', + 'cmfnpu', + 'decimal', + 'debbie1', + 'dandy', + 'daedalus', + 'dede', + 'natasha1', + 'nissan1', + 'nancy123', + 'nevermin', + 'napalm', + 'newcastle', + 'boats', + 'branden', + 'britt', + 'bonghit', + 'hester', + 'ibxnsm', + 'hhhhhh1', + 'holger', + 'durham', + 'edmonton', + 'erwin', + 'equinox', + 'dvader', + 'kimmy', + 'knulla', + 'mustafa', + 'monsoon', + 'mistral', + 'morgana', + 'monica1', + 'mojave', + 'month', + 'monterey', + 'mrbill', + 'vkaxcs', + 'victor1', + 'wacker', + 'wendell', + 'violator', + 'vfdhif', + 'wilson1', + 'wavpzt', + 'verena', + 'wildstar', + 'winter99', + 'iqzzt580', + 'jarrod', + 'imback', + '1914', + '19741974', + '1monkey', + '1q2w3e4r5t', + '2500', + '2255', + 'blank', + 'bigshow', + 'bigbucks', + 'blackcoc', + 'zoomer', + 'wtcacq', + 'wobble', + 'xmen', + 'xjznq5', + 'yesterda', + 'yhwnqc', + 'zzzxxx', + 'streak', + '393939', + '2fchbg', + 'skinhead', + 'skilled', + 'shakira', + 'shaft', + 'shadow12', + 'seaside', + 'sigrid', + 'sinful', + 'silicon', + 'smk7366', + 'snapshot', + 'sniper1', + 'soccer11', + 'staff', + 'slap', + 'smutty', + 'peepers', + 'pleasant', + 'plokij', + 'pdiddy', + 'pimpdaddy', + 'thrust', + 'terran', + 'topaz', + 'today1', + 'lionhear', + 'littlema', + 'lauren1', + 'lincoln1', + 'lgnu9d', + 'laughing', + 'juneau', + 'methos', + 'medina', + 'merlyn', + 'rogue1', + 'romulus', + 'redshift', + '1202', + '1469', + '12locked', + 'arizona1', + 'alfarome', + 'al9agd', + 'aol123', + 'altec', + 'apollo1', + 'arse', + 'baker1', + 'bbb747', + 'bach', + 'axeman', + 'astro1', + 'hawthorn', + 'goodfell', + 'hawks1', + 'gstring', + 'hannes', + '8543852', + '868686', + '4ng62t', + '554uzpad', + '5401', + '567890', + '5232', + 'catfood', + 'frame', + 'flow', + 'fire1', + 'flipflop', + 'fffff1', + 'fozzie', + 'fluff', + 'garrison', + 'fzappa', + 'furious', + 'round', + 'rustydog', + 'sandberg', + 'scarab', + 'satin', + 'ruger', + 'samsung1', + 'destin', + 'diablo2', + 'dreamer1', + 'detectiv', + 'dominick', + 'doqvq3', + 'drywall', + 'paladin1', + 'papabear', + 'offroad', + 'panasonic', + 'nyyankee', + 'luetdi', + 'qcfmtz', + 'pyf8ah', + 'puddles', + 'privacy', + 'rainer', + 'pussyeat', + 'ralph1', + 'princeto', + 'trivia', + 'trewq', + 'tri5a3', + 'advent', + '9898', + 'agyvorc', + 'clarkie', + 'coach1', + 'courier', + 'contest', + 'christo', + 'corinna', + 'chowder', + 'concept', + 'climbing', + 'cyzkhw', + 'davidb', + 'dad2ownu', + 'days', + 'daredevi', + 'de7mdf', + 'nose', + 'necklace', + 'nazgul', + 'booboo1', + 'broad', + 'bonzo', + 'brenna', + 'boot', + 'butch1', + 'huskers1', + 'hgfdsa', + 'hornyman', + 'elmer', + 'elektra', + 'england1', + 'elodie', + 'kermit1', + 'knife', + 'kaboom', + 'minute', + 'modern', + 'motherfucker', + 'morten', + 'mocha', + 'monday1', + 'morgoth', + 'ward', + 'weewee', + 'weenie', + 'walters', + 'vorlon', + 'website', + 'wahoo', + 'ilovegod', + 'insider', + 'jayman', + '1911', + '1dallas', + '1900', + '1ranger', + '201jedlz', + '2501', + '1qaz', + 'bertram', + 'bignuts', + 'bigbad', + 'beebee', + 'billows', + 'belize', + 'bebe', + 'wvj5np', + 'wu4etd', + 'yamaha1', + 'wrinkle5', + 'zebra1', + 'yankee1', + 'zoomzoom', + '09876543', + '0311', + '?????', + 'stjabn', + 'tainted', + '3tmnej', + 'shoot', + 'skooter', + 'skelter', + 'sixteen', + 'starlite', + 'smack', + 'spice1', + 'stacey1', + 'smithy', + 'perrin', + 'pollux', + 'peternorth', + 'pixie', + 'paulina', + 'piston', + 'pick', + 'poets', + 'pine', + 'toons', + 'tooth', + 'topspin', + 'kugm7b', + 'legends', + 'jeepjeep', + 'juliana', + 'joystick', + 'junkmail', + 'jojojojo', + 'jonboy', + 'judge', + 'midland', + 'meteor', + 'mccabe', + 'matter', + 'mayfair', + 'meeting', + 'merrill', + 'raul', + 'riches', + 'reznor', + 'rockrock', + 'reboot', + 'reject', + 'robyn', + 'renee1', + 'roadway', + 'rasta220', + '1411', + '1478963', + '1019', + 'archery', + 'allman', + 'andyandy', + 'barks', + 'bagpuss', + 'auckland', + 'gooseman', + 'hazmat', + 'gucci', + 'guns', + 'grammy', + 'happydog', + 'greek', + '7kbe9d', + '7676', + '6bjvpe', + '5lyedn', + '5858', + '5291', + 'charlie2', + 'chas', + 'c7lrwu', + 'candys', + 'chateau', + 'ccccc1', + 'cardinals', + 'fear', + 'fihdfv', + 'fortune12', + 'gocats', + 'gaelic', + 'fwsadn', + 'godboy', + 'gldmeo', + 'fx3tuo', + 'fubar1', + 'garland', + 'generals', + 'gforce', + 'rxmtkp', + 'rulz', + 'sairam', + 'dunhill', + 'division', + 'dogggg', + 'detect', + 'details', + 'doll', + 'drinks', + 'ozlq6qwm', + 'ov3ajy', + 'lockout', + 'makayla', + 'macgyver', + 'mallorca', + 'loves', + 'prima', + 'pvjegu', + 'qhxbij', + 'raphael', + 'prelude1', + 'totoro', + 'tusymo', + 'trousers', + 'tunnel', + 'valeria', + 'tulane', + 'turtle1', + 'tracy1', + 'aerosmit', + 'abbey1', + 'address', + 'clticic', + 'clueless', + 'cooper1', + 'comets', + 'collect', + 'corbin', + 'delpiero', + 'derick', + 'cyprus', + 'dante1', + 'dave1', + 'nounours', + 'neal', + 'nexus6', + 'nero', + 'nogard', + 'norfolk', + 'brent1', + 'booyah', + 'bootleg', + 'buckaroo', + 'bulls23', + 'bulls1', + 'booper', + 'heretic', + 'icecube', + 'hellno', + 'hounds', + 'honeydew', + 'hooters1', + 'hoes', + 'howie', + 'hevnm4', + 'hugohugo', + 'eighty', + 'epson', + 'evangeli', + 'eeeee1', + 'eyphed' +]; \ No newline at end of file diff --git a/static/js/footer.js b/static/js/footer.js new file mode 100644 index 0000000..ba40624 --- /dev/null +++ b/static/js/footer.js @@ -0,0 +1,17 @@ +'use strict'; +/* global $ */ + +// Push footer to bottom on pages with little content +function setFooter(){ + var windowHeight = $(window).height(), + footerBottom = $("footer").offset().top + $("footer").height(); + if (windowHeight > footerBottom){ + $("footer").css( "margin-top", windowHeight-footerBottom ); + } +} + +// Execute on page load +$(function(){ setFooter(); }); + +// Execute on window resize +$(window).resize(function(){ setFooter(); }); \ No newline at end of file diff --git a/static/js/header.js b/static/js/header.js index 95223c4..d47f5d7 100644 --- a/static/js/header.js +++ b/static/js/header.js @@ -1,3 +1,4 @@ +/* global $ */ 'use strict'; $(document).ready(function(){ @@ -20,4 +21,9 @@ $(document).ready(function(){ $('nav').removeClass('visible'); }); + // Close alerts + $('.alert-dismissible .close').click(function() { + $(this).parent().slideUp(500); + }); + }); diff --git a/static/js/index.js b/static/js/index.js deleted file mode 100644 index 27c0a71..0000000 --- a/static/js/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -jQuery.extend(jQuery.easing,{ - easeInOutExpo: function(x, t, b, c, d){ - if (t==0) return b; - if (t==d) return b+c; - if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; - return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; - } -}); - -$(document).ready(function(){ - - $('a[href=#]').click(function(e){ - e.preventDefault(); - $('nav').removeClass('visible'); - $('html,body').stop().animate({scrollTop: $('.'+$(this).data('scrollto')).offset().top-65 }, 700, 'easeInOutExpo', function(){}); - }); - -}); diff --git a/static/js/map-controls.js b/static/js/map-controls.js new file mode 100644 index 0000000..6542466 --- /dev/null +++ b/static/js/map-controls.js @@ -0,0 +1,117 @@ +'use strict'; +/* global navigator $ socket userid token mapuser toggleMaps */ + +$(function(){ + + var wpid, newloc; + + // Set location + $('#set-loc').click(function(){ + if (!userid===mapuser._id){ alert('You are not logged in! '); } + else { if (!navigator.geolocation){ alert('Geolocation not enabled. '); } + + else { navigator.geolocation.getCurrentPosition( + + // Success callback + function(pos){ + var newloc = { + tok: token, + usr: userid, + lat: pos.coords.latitude, + lon: pos.coords.longitude, + spd: (pos.coords.speed||0) + }; + socket.emit('set', newloc); + toggleMaps(newloc); + console.log('⚜ Set location:',newloc.lat+", "+newloc.lon); + }, + + // Error callback + function(err) { + alert("Unable to set location."); + console.error('❌️',err.message); + }, + + // Options + { enableHighAccuracy:true } + + ); } } + + }); + + // Track location + $('#track-loc').click(function(){ + if (!userid===mapuser._id) { alert('You are not logged in! '); } + else { + + // Start tracking + if (!wpid) { + if (!navigator.geolocation) { alert('Unable to track location. '); } + else { + $('#track-loc').html('Stop').prop('title',"Click here to stop tracking your location. "); + wpid = navigator.geolocation.watchPosition( + + // Success callback + function(pos) { + newloc = { + tok: token, + usr: userid, + lat: pos.coords.latitude, + lon: pos.coords.longitude, + spd: (pos.coords.speed||0) + }; socket.emit('set',newloc); + toggleMaps(newloc); + console.log('⚜ Set location:',newloc.lat+", "+newloc.lon); + }, + + // Error callback + function(err){ + alert("Unable to track location."); + console.error(err.message); + }, + + // Options + { enableHighAccuracy:true } + + ); + } + + } + + // Stop tracking + else { + $('#track-loc').html('Track').prop('title',"Click here to track your location. "); + navigator.geolocation.clearWatch(wpid); + wpid = undefined; + } + + + + } + }); + + // Clear location + $('#clear-loc').click(function(){ + if (!userid===mapuser._id) { alert('You are not logged in! '); } + else { + // Stop tracking + if (wpid) { + $('#track-loc').html(' Track'); + navigator.geolocation.clearWatch(wpid); + wpid = undefined; + } + + // Clear location + newloc = { + tok: token, + usr: userid, + lat:0, lon:0, spd:0 + }; socket.emit('set',newloc); + + // Turn off map + toggleMaps(newloc); + console.log('⚜ Cleared location'); + } + }); + +}); \ No newline at end of file diff --git a/static/js/map.js b/static/js/map.js new file mode 100644 index 0000000..4dbdcb6 --- /dev/null +++ b/static/js/map.js @@ -0,0 +1,313 @@ +'use strict'; +/* global $ io google mapuser userid disp noHeader */ + + +// Variables +var map, pano, marker, elevator; +const mapElem = document.getElementById('map'), + panoElem = document.getElementById('pano'), + socket = io('//'+window.location.hostname); + +function waitForElements(vars,cb){ + if ( vars.every(function(v){ return v!==undefined; }) ){ + cb(); + } else { + setTimeout(waitForElements(vars,cb), 100); + } +} + +function onConnect(socket,userid,mapuserid) { + + // Can get location + socket.emit('can-get', mapuserid ); + console.log("🚹 Receiving updates for",mapuserid); + + // Can set location too + if (mapuserid===userid) { + socket.emit('can-set', userid ); + console.log("🚹 Sending updates for",userid); + } + +} + +// socket.io stuff +socket + .on('connect', function(){ + console.log("⬆️ Connected!"); + waitForElements([mapuser,userid], function() { + onConnect(socket,userid,mapuser._id); + }); + }) + .on('disconnect', function(){ + console.log("⬇️ Disconnected!"); + }) + .on('error', function (err){ + console.error('❌️',err.message); + }); + +// Parse location +function parseLoc(loc) { + loc.spd = (mapuser.settings.units=='standard')?parseFloat(loc.spd)*2.23694:parseFloat(loc.spd); + loc.dir = parseFloat(loc.dir); + loc.lat = parseFloat(loc.lat); + loc.lon = parseFloat(loc.lon); + loc.time = new Date(loc.time).toLocaleString(); + loc.glatlng = new google.maps.LatLng(loc.lat, loc.lon); + return loc; +} + +// Show/hide map if location is set/unset +function toggleMaps(loc) { + if (loc.lat===0&&loc.lon===0) { + $('#map').hide(); + $('#pano').hide(); + $('#notset').show(); + } else { + $('#map').show(); + $('#pano').show(); + $('#notset').hide(); + } +} +// Toggle maps on page load +$(function() { + toggleMaps(mapuser.last); +}); + +// Google maps API callback +window.gmapsCb = function() { + //console.log("gmapsCb() called"); + + // Make sure everything's ready... + waitForElements([mapuser,disp,noHeader], function() { + + // Create map + if (disp!=='1') { + //console.log("Creating map..."); + map = new google.maps.Map( mapElem, { + center: new google.maps.LatLng( mapuser.last.lat, mapuser.last.lon ), + panControl: false, + scaleControl: mapuser.settings.showScale, + draggable: false, + zoom: mapuser.settings.defaultZoom, + streetViewControl: false, + zoomControlOptions: {position: google.maps.ControlPosition.LEFT_TOP}, + mapTypeId: (mapuser.settings.defaultMap=='road')?google.maps.MapTypeId.ROADMAP:google.maps.MapTypeId.HYBRID + }); + marker = new google.maps.Marker({ + position: { lat:mapuser.last.lat, lng:mapuser.last.lon }, + title: mapuser.name, + map: map, + draggable: false + }); + map.addListener('zoom_changed',function(){ + map.setCenter(marker.getPosition()); + }); + + // Create iFrame logo + if (noHeader!=='0') { + //console.log("Creating iFrame logo..."); + const logoDiv = document.createElement('div'); + logoDiv.id = 'map-logo'; + logoDiv.innerHTML = ''+ + '[]'+ + "Tracman"; + map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(logoDiv); + } + + // Create update time block + //console.log("Creating time block..."); + const timeDiv = document.createElement('div'); + timeDiv.id = 'timestamp'; + if (mapuser.last.time) { + timeDiv.innerHTML = 'location updated '+new Date(mapuser.last.time).toLocaleString(); + } + map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(timeDiv); + + // Create speed block + if (mapuser.settings.showSpeed) { + //console.log("Creating speed sign..."); + const speedSign = document.createElement('div'), + speedLabel = document.createElement('div'), + speedText = document.createElement('div'), + speedUnit = document.createElement('div'); + speedLabel.id = 'spd-label'; + speedLabel.innerHTML = 'SPEED'; + speedText.id = 'spd'; + speedText.innerHTML = (mapuser.settings.units=='standard')?(parseFloat(mapuser.last.spd)*2.23694).toFixed():mapuser.last.spd.toFixed(); + speedUnit.id = 'spd-unit'; + speedUnit.innerHTML = (mapuser.settings.units=='standard')?'m.p.h.':'k.p.h.'; + speedSign.id = 'spd-sign'; + speedSign.appendChild(speedLabel); + speedSign.appendChild(speedText); + speedSign.appendChild(speedUnit); + map.controls[google.maps.ControlPosition.TOP_RIGHT].push(speedSign); + } + + // Create altitude block + if (mapuser.settings.showAlt) { + //console.log("Creating altitude sign..."); + const elevator = new google.maps.ElevationService, + altitudeSign = document.createElement('div'), + altitudeLabel = document.createElement('div'), + altitudeText = document.createElement('div'), + altitudeUnit = document.createElement('div'); + altitudeLabel.id = 'alt-label'; + altitudeText.id = 'alt'; + altitudeUnit.id = 'alt-unit'; + altitudeSign.id = 'alt-sign'; + altitudeText.innerHTML = ''; + altitudeLabel.innerHTML = 'ALTITUDE'; + getAltitude(new google.maps.LatLng(mapuser.last.lat,mapuser.last.lon), elevator, function(alt) { + if (alt) { altitudeText.innerHTML = (mapuser.settings.units=='standard')?(alt*3.28084).toFixed():alt.toFixed(); } + }); + altitudeUnit.innerHTML = (mapuser.settings.units=='standard')?'feet':'meters'; + altitudeSign.appendChild(altitudeLabel); + altitudeSign.appendChild(altitudeText); + altitudeSign.appendChild(altitudeUnit); + map.controls[google.maps.ControlPosition.TOP_RIGHT].push(altitudeSign); + } + + } + + // Create streetview + if (disp!=='0' && mapuser.settings.showStreetview) { + //console.log("Creating streetview..."); + updateStreetView(parseLoc(mapuser.last),10); + } + + }); + +}; + +// Got location +socket.on('get', function(loc) { + console.log("🌐️ Got location:",loc.lat+", "+loc.lon); + + // Parse location + loc = parseLoc(loc); + + // Update map + if (disp!=='1') { + + // Update time + $('#timestamp').text('location updated '+loc.time); + + // Show or hide map + toggleMaps(loc); + + // Update marker and map center + map.setCenter({ lat:loc.lat, lng:loc.lon }); + marker.setPosition({ lat:loc.lat, lng:loc.lon }); + + // Update speed + if (mapuser.settings.showSpeed) { + $('#spd').text( loc.spd.toFixed() ); + } + + // Update altitude + if (mapuser.settings.showAlt) { + getAltitude({ + lat:loc.lat, + lng:loc.lon + }, elevator, function(alt) { + if (alt) { + $('#alt').text( (mapuser.settings.units=='standard')?(alt*3.28084).toFixed():alt.toFixed() ); + } + }); + } + + } + + // Update street view + if (disp!=='0' && mapuser.settings.showStreetview) { + updateStreetView(loc,10); + } + +}); + +// Check altitude +function getAltitude(loc,elev,cb){ + //console.log("Getting altitude..."); + elev = elev || new google.maps.ElevationService; + elev.getElevationForLocations({ + 'locations': [loc] + }, function(results, status) { + if (status === google.maps.ElevationStatus.OK && results[0]) { + cb(results[0].elevation); + } + }); +} + +// Get street view imagery +//TODO: Use global loc object? +function getStreetViewData(loc,rad,cb) { + if (!sv) { var sv=new google.maps.StreetViewService(); } + sv.getPanorama({ + location: { + lat: loc.lat, + lng: loc.lon + }, + radius:rad + }, function(data,status){ switch (status){ + // Success + case google.maps.StreetViewStatus.OK: + cb(data); + break; + // No results in that radius + case google.maps.StreetViewStatus.ZERO_RESULTS: + // Square the radius and try again + getStreetViewData(loc,rad*rad*.5,cb); + break; + // Error + default: + console.error(new Error('❌️ Street view not available: '+status).message); + } }); +} + +// Update streetview +function updateStreetView(loc) { + //console.log("Updating streetview..."); + + // Moving + if (loc.spd>1) { + var imgElem = document.getElementById('panoImg'); + getStreetViewData(loc, 50, function(data){ + if (!imgElem) { + // Create image + pano = undefined; + $('#pano').empty(); + $('#pano').append($('',{ + alt: 'Street view image', + src: 'https://maps.googleapis.com/maps/api/streetview?size=800x800&location='+loc.lat+','+loc.lon+'&fov=90&heading='+loc.dir+'&key={{api}}', + id: 'panoImg' + })); + } + // Set image + $('#panoImg').attr('src','https://maps.googleapis.com/maps/api/streetview?size='+$('#pano').width()+'x'+$('#pano').height()+'&location='+data.location.latLng.lat()+','+data.location.latLng.lng()+'&fov=90&heading='+loc.dir+'&key={{api}}'); + }); + } + + // Not moving and pano not set + else if (pano==null) { + getStreetViewData(loc, 10, function(data){ + // Create panorama + $('#pano').empty(); + const panoOptions = { + panControl: false, + zoomControl: false, + addressControl: false, + linksControl: false, + motionTracking: false, + motionTrackingControl: false + }; + pano = new google.maps.StreetViewPanorama(panoElem, panoOptions); + // Set panorama + pano.setPano(data.location.pano); + pano.setPov({ + pitch: 0, + heading: Math.atan((loc.lon-data.location.latLng.lng())/(loc.lat-data.location.latLng.lat()))*(180/Math.PI) + }); + }); + } + +} diff --git a/static/js/mellt.js b/static/js/mellt.js new file mode 100644 index 0000000..eb9da99 --- /dev/null +++ b/static/js/mellt.js @@ -0,0 +1,209 @@ +'use strict'; +/** + * Mellt + * + * Tests the strength of a password by calculating how long it would take to + * brute force it. + * + * @version 0.1.0 + * @link http://mel.lt/ The homepage for this script. + * @link http://www.hammerofgod.com/passwordcheck.aspx Much of this is based + * on the description of Thor's Godly Privacy password strength checker, + * however the actual code below is all my own. + * @link http://xato.net/passwords/more-top-worst-passwords/ The included + * common passwords list is from Mark Burnett's password collection (which + * is excellent). You can of course use your own password file instead. + */ +var Mellt = function() { + + /** + * @var integer HashesPerSecond The number of attempts per second you expect + * an attacker to be able to attempt. Set to 1 billion by default. + */ + this.HashesPerSecond = 1000000000; + + /** + * @var string CommonPasswords A variable containing an array of common + * passwords to check against. If you include common-passwords.js in your + * HTML after including Mellt.js, the contents of that file will be used + * if this isn't set. + * Set this to null (and don't include common-passwords.js) to skip + * checking common passwords. + */ + this.CommonPasswords = null; + + /** + * @var array $CharacterSets An array of strings, each string containing a + * character set. These should proceed in the order of simplest (0-9) to most + * complex (all characters). More complex = more characters. + */ + this.CharacterSets = [ + // We're making some guesses here about human nature (again much of this is + // based on the TGP password strength checker, and Timothy "Thor" Mullen + // deserves the credit for the thinking behind this). Basically we're combining + // what we know about users (SHIFT+numbers are more common than other + // punctuation for example) combined with how an attacker will attack a + // password (most common letters first, expanding outwards). + // + // If you want to support passwords that use non-english characters, and + // your attacker knows this (for example, a Russian site would be expected + // to contain passwords in Russian characters) add your characters to one of + // the sets below, or create new sets and insert them in the right places. + "0123456789", + "abcdefghijklmnopqrstuvwxyz", + "abcdefghijklmnopqrstuvwxyz0123456789", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-=_+", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-=_+[]\"{}|;':,./<>?`~" + ]; +}; +Mellt.prototype = { + + CommonPasswords: null, + + /** + * Tests password strength by simulating how long it would take a cracker to + * brute force your password. + * + * Also optionally tests against a list of common passwords (contained in an + * external file) to weed out things like "password", which from a pure brute + * force perspective would be harder to break if it wasn't so common. + * + * The character sets being used in this checker assume English (ASCII) + * characters (no umlauts for example). If you run a non-english site, and you + * suspect the crackers will realize this, you may want to modify the + * character set to include the characters in your language. + * + * @param string $password The password to test the strength of + * @return integer Returns an integer specifying how many days it would take + * to brute force the password (at 1 billion checks a second) or -1 to + * indicate the password was found in the common passwords file. Obviously if + * they don't have direct access to the hashed passwords this time would be + * longer, and even then most computers (at the time of this writing) won't be + * able to test 1 billion hashes a second, but this function measures worst + * case scenario, so... I would recommend you require at least 30 days to brute + * force a password, obviously more if you're a bank or other secure system. + * @throws Exception If an error is encountered. + */ + CheckPassword: function(password) { + + // First check passwords in the common password file if available. + // We do this because "password" takes 129 seconds, but is the first + // thing an attacker will try. + if (!this.CommonPasswords && Mellt.prototype.CommonPasswords) { + this.CommonPasswords = Mellt.prototype.CommonPasswords; + } + if (this.CommonPasswords) { + + var text = password.toLowerCase(); + for (var t=0; t-1) { + baseKey = characterSetKey; + base = characterSet; + foundChar = true; + break; + } + } + // If the character we were looking for wasn't anywhere in any of the + // character sets, assign the largest (last) character set as default. + if (!foundChar) { + base = this.CharacterSets[this.CharacterSets.length-1]; + break; + } + } + + // Starting at the first character, figure out it's position in the character set + // and how many attempts will take to get there. For example, say your password + // was an integer (a bank card PIN number for example): + // 0 (or 0000 if you prefer) would be the very first password they attempted by the attacker. + // 9999 would be the last password they attempted (assuming 4 characters). + // Thus a password/PIN of 6529 would take 6529 attempts until the attacker found + // the proper combination. The same logic words for alphanumeric passwords, just + // with a larger number of possibilities for each position in the password. The + // key thing to note is the attacker doesn't need to test the entire range (every + // possible combination of all characters) they just need to get to the point in + // the list of possibilities that is your password. They can (in this example) + // ignore anything between 6530 and 9999. Using this logic, 'aaa' would be a worse + // password than 'zzz', because the attacker would encounter 'aaa' first. + var attempts = 0; + var charactersInBase = base.length; + var charactersInPassword = password.length; + for (var position=0; position1000000000) { + return 1000000000; + } + + return Math.round(days); + + } + +}; diff --git a/static/js/moment.min.js b/static/js/moment.min.js deleted file mode 100644 index ba38995..0000000 --- a/static/js/moment.min.js +++ /dev/null @@ -1,7 +0,0 @@ -//! moment.js -//! version : 2.12.0 -//! authors : Tim Wood, Iskren Chernev, Moment.js contributors -//! license : MIT -//! momentjs.com -!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return Zc.apply(null,arguments)}function b(a){Zc=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function e(a,b){var c,d=[];for(c=0;c0)for(c in $c)d=$c[c],e=b[d],m(e)||(a[d]=e);return a}function o(b){n(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),_c===!1&&(_c=!0,a.updateOffset(this),_c=!1)}function p(a){return a instanceof o||null!=a&&null!=a._isAMomentObject}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=q(b)),c}function s(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&r(a[d])!==r(b[d]))&&g++;return g+f}function t(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function u(a,b){var c=!0;return g(function(){return c&&(t(a+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),c=!1),b.apply(this,arguments)},b)}function v(a,b){ad[a]||(t(b),ad[a]=!0)}function w(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function x(a){return"[object Object]"===Object.prototype.toString.call(a)}function y(a){var b,c;for(c in a)b=a[c],w(b)?this[c]=b:this["_"+c]=b;this._config=a,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function z(a,b){var c,d=g({},a);for(c in b)f(b,c)&&(x(a[c])&&x(b[c])?(d[c]={},g(d[c],a[c]),g(d[c],b[c])):null!=b[c]?d[c]=b[c]:delete d[c]);return d}function A(a){null!=a&&this.set(a)}function B(a){return a?a.toLowerCase().replace("_","-"):a}function C(a){for(var b,c,d,e,f=0;f0;){if(d=D(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&s(e,c,!0)>=b-1)break;b--}f++}return null}function D(a){var b=null;if(!cd[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=bd._abbr,require("./locale/"+a),E(b)}catch(c){}return cd[a]}function E(a,b){var c;return a&&(c=m(b)?H(a):F(a,b),c&&(bd=c)),bd._abbr}function F(a,b){return null!==b?(b.abbr=a,null!=cd[a]?(v("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),b=z(cd[a]._config,b)):null!=b.parentLocale&&(null!=cd[b.parentLocale]?b=z(cd[b.parentLocale]._config,b):v("parentLocaleUndefined","specified parentLocale is not defined yet")),cd[a]=new A(b),E(a),cd[a]):(delete cd[a],null)}function G(a,b){if(null!=b){var c;null!=cd[a]&&(b=z(cd[a]._config,b)),c=new A(b),c.parentLocale=cd[a],cd[a]=c,E(a)}else null!=cd[a]&&(null!=cd[a].parentLocale?cd[a]=cd[a].parentLocale:null!=cd[a]&&delete cd[a]);return cd[a]}function H(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return bd;if(!c(a)){if(b=D(a))return b;a=[a]}return C(a)}function I(){return Object.keys(cd)}function J(a,b){var c=a.toLowerCase();dd[c]=dd[c+"s"]=dd[b]=a}function K(a){return"string"==typeof a?dd[a]||dd[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)f(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(b,c){return function(d){return null!=d?(O(this,b,d),a.updateOffset(this,c),this):N(this,b)}}function N(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function O(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function P(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=K(a),w(this[a]))return this[a](b);return this}function Q(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function R(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(hd[a]=e),b&&(hd[b[0]]=function(){return Q(e.apply(this,arguments),b[1],b[2])}),c&&(hd[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function S(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function T(a){var b,c,d=a.match(ed);for(b=0,c=d.length;c>b;b++)hd[d[b]]?d[b]=hd[d[b]]:d[b]=S(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function U(a,b){return a.isValid()?(b=V(b,a.localeData()),gd[b]=gd[b]||T(b),gd[b](a)):a.localeData().invalidDate()}function V(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(fd.lastIndex=0;d>=0&&fd.test(a);)a=a.replace(fd,c),fd.lastIndex=0,d-=1;return a}function W(a,b,c){zd[a]=w(b)?b:function(a,d){return a&&c?c:b}}function X(a,b){return f(zd,a)?zd[a](b._strict,b._locale):new RegExp(Y(a))}function Y(a){return Z(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function Z(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=r(a)}),c=0;cd;d++){if(e=h([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function fa(a,b){var c;if(!a.isValid())return a;if("string"==typeof b)if(/^\d+$/.test(b))b=r(b);else if(b=a.localeData().monthsParse(b),"number"!=typeof b)return a;return c=Math.min(a.date(),ba(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ga(b){return null!=b?(fa(this,b),a.updateOffset(this,!0),this):N(this,"Month")}function ha(){return ba(this.year(),this.month())}function ia(a){return this._monthsParseExact?(f(this,"_monthsRegex")||ka.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex}function ja(a){return this._monthsParseExact?(f(this,"_monthsRegex")||ka.call(this),a?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex}function ka(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=h([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=Z(d[b]),e[b]=Z(e[b]),f[b]=Z(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")$","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")$","i")}function la(a){var b,c=a._a;return c&&-2===j(a).overflow&&(b=c[Cd]<0||c[Cd]>11?Cd:c[Dd]<1||c[Dd]>ba(c[Bd],c[Cd])?Dd:c[Ed]<0||c[Ed]>24||24===c[Ed]&&(0!==c[Fd]||0!==c[Gd]||0!==c[Hd])?Ed:c[Fd]<0||c[Fd]>59?Fd:c[Gd]<0||c[Gd]>59?Gd:c[Hd]<0||c[Hd]>999?Hd:-1,j(a)._overflowDayOfYear&&(Bd>b||b>Dd)&&(b=Dd),j(a)._overflowWeeks&&-1===b&&(b=Id),j(a)._overflowWeekday&&-1===b&&(b=Jd),j(a).overflow=b),a}function ma(a){var b,c,d,e,f,g,h=a._i,i=Pd.exec(h)||Qd.exec(h);if(i){for(j(a).iso=!0,b=0,c=Sd.length;c>b;b++)if(Sd[b][1].exec(i[1])){e=Sd[b][0],d=Sd[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Td.length;c>b;b++)if(Td[b][1].exec(i[3])){f=(i[2]||" ")+Td[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!Rd.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),Ba(a)}else a._isValid=!1}function na(b){var c=Ud.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(ma(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function oa(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function pa(a){var b=new Date(Date.UTC.apply(null,arguments));return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function qa(a){return ra(a)?366:365}function ra(a){return a%4===0&&a%100!==0||a%400===0}function sa(){return ra(this.year())}function ta(a,b,c){var d=7+b-c,e=(7+pa(a,0,d).getUTCDay()-b)%7;return-e+d-1}function ua(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ta(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=qa(f)+j):j>qa(a)?(f=a+1,g=j-qa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function va(a,b,c){var d,e,f=ta(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+wa(e,b,c)):g>wa(a.year(),b,c)?(d=g-wa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function wa(a,b,c){var d=ta(a,b,c),e=ta(a+1,b,c);return(qa(a)-d+e)/7}function xa(a,b,c){return null!=a?a:null!=b?b:c}function ya(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function za(a){var b,c,d,e,f=[];if(!a._d){for(d=ya(a),a._w&&null==a._a[Dd]&&null==a._a[Cd]&&Aa(a),a._dayOfYear&&(e=xa(a._a[Bd],d[Bd]),a._dayOfYear>qa(e)&&(j(a)._overflowDayOfYear=!0),c=pa(e,0,a._dayOfYear),a._a[Cd]=c.getUTCMonth(),a._a[Dd]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[Ed]&&0===a._a[Fd]&&0===a._a[Gd]&&0===a._a[Hd]&&(a._nextDay=!0,a._a[Ed]=0),a._d=(a._useUTC?pa:oa).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Ed]=24)}}function Aa(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=xa(b.GG,a._a[Bd],va(Ja(),1,4).year),d=xa(b.W,1),e=xa(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=xa(b.gg,a._a[Bd],va(Ja(),f,g).year),d=xa(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>wa(c,f,g)?j(a)._overflowWeeks=!0:null!=i?j(a)._overflowWeekday=!0:(h=ua(c,d,e,f,g),a._a[Bd]=h.year,a._dayOfYear=h.dayOfYear)}function Ba(b){if(b._f===a.ISO_8601)return void ma(b);b._a=[],j(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,k=0;for(e=V(b._f,b._locale).match(ed)||[],c=0;c0&&j(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),k+=d.length),hd[f]?(d?j(b).empty=!1:j(b).unusedTokens.push(f),aa(f,d,b)):b._strict&&!d&&j(b).unusedTokens.push(f);j(b).charsLeftOver=i-k,h.length>0&&j(b).unusedInput.push(h),j(b).bigHour===!0&&b._a[Ed]<=12&&b._a[Ed]>0&&(j(b).bigHour=void 0),b._a[Ed]=Ca(b._locale,b._a[Ed],b._meridiem),za(b),la(b)}function Ca(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function Da(a){var b,c,d,e,f;if(0===a._f.length)return j(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;ef)&&(d=f,c=b));g(a,c||b)}function Ea(a){if(!a._d){var b=L(a._i);a._a=e([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),za(a)}}function Fa(a){var b=new o(la(Ga(a)));return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function Ga(a){var b=a._i,e=a._f;return a._locale=a._locale||H(a._l),null===b||void 0===e&&""===b?l({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),p(b)?new o(la(b)):(c(e)?Da(a):e?Ba(a):d(b)?a._d=b:Ha(a),k(a)||(a._d=null),a))}function Ha(b){var f=b._i;void 0===f?b._d=new Date(a.now()):d(f)?b._d=new Date(+f):"string"==typeof f?na(b):c(f)?(b._a=e(f.slice(0),function(a){return parseInt(a,10)}),za(b)):"object"==typeof f?Ea(b):"number"==typeof f?b._d=new Date(f):a.createFromInputFallback(b)}function Ia(a,b,c,d,e){var f={};return"boolean"==typeof c&&(d=c,c=void 0),f._isAMomentObject=!0,f._useUTC=f._isUTC=e,f._l=c,f._i=a,f._f=b,f._strict=d,Fa(f)}function Ja(a,b,c,d){return Ia(a,b,c,d,!1)}function Ka(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return Ja();for(d=b[0],e=1;ea&&(a=-a,c="-"),c+Q(~~(a/60),2)+b+Q(~~a%60,2)})}function Qa(a,b){var c=(b||"").match(a)||[],d=c[c.length-1]||[],e=(d+"").match(Zd)||["-",0,0],f=+(60*e[1])+r(e[2]);return"+"===e[0]?f:-f}function Ra(b,c){var e,f;return c._isUTC?(e=c.clone(),f=(p(b)||d(b)?+b:+Ja(b))-+e,e._d.setTime(+e._d+f),a.updateOffset(e,!1),e):Ja(b).local()}function Sa(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Ta(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?("string"==typeof b?b=Qa(wd,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Sa(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?ib(this,cb(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Sa(this):null!=b?this:NaN}function Ua(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Va(a){return this.utcOffset(0,a)}function Wa(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Sa(this),"m")),this}function Xa(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Qa(vd,this._i)),this}function Ya(a){return this.isValid()?(a=a?Ja(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function Za(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function $a(){if(!m(this._isDSTShifted))return this._isDSTShifted;var a={};if(n(a,this),a=Ga(a),a._a){var b=a._isUTC?h(a._a):Ja(a._a);this._isDSTShifted=this.isValid()&&s(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function _a(){return this.isValid()?!this._isUTC:!1}function ab(){return this.isValid()?this._isUTC:!1}function bb(){return this.isValid()?this._isUTC&&0===this._offset:!1}function cb(a,b){var c,d,e,g=a,h=null;return Oa(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(g={},b?g[b]=a:g.milliseconds=a):(h=$d.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:r(h[Dd])*c,h:r(h[Ed])*c,m:r(h[Fd])*c,s:r(h[Gd])*c,ms:r(h[Hd])*c}):(h=_d.exec(a))?(c="-"===h[1]?-1:1,g={y:db(h[2],c),M:db(h[3],c),w:db(h[4],c),d:db(h[5],c),h:db(h[6],c),m:db(h[7],c),s:db(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=fb(Ja(g.from),Ja(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new Na(g),Oa(a)&&f(a,"_locale")&&(d._locale=a._locale),d}function db(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function eb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function fb(a,b){var c;return a.isValid()&&b.isValid()?(b=Ra(b,a),a.isBefore(b)?c=eb(a,b):(c=eb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function gb(a){return 0>a?-1*Math.round(-1*a):Math.round(a)}function hb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(v(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=cb(c,d),ib(this,e,a),this}}function ib(b,c,d,e){var f=c._milliseconds,g=gb(c._days),h=gb(c._months);b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(+b._d+f*d),g&&O(b,"Date",N(b,"Date")+g*d),h&&fa(b,N(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function jb(a,b){var c=a||Ja(),d=Ra(c,this).startOf("day"),e=this.diff(d,"days",!0),f=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse",g=b&&(w(b[f])?b[f]():b[f]);return this.format(g||this.localeData().calendar(f,this,Ja(c)))}function kb(){return new o(this)}function lb(a,b){var c=p(a)?a:Ja(a);return this.isValid()&&c.isValid()?(b=K(m(b)?"millisecond":b),"millisecond"===b?+this>+c:+c<+this.clone().startOf(b)):!1}function mb(a,b){var c=p(a)?a:Ja(a);return this.isValid()&&c.isValid()?(b=K(m(b)?"millisecond":b),"millisecond"===b?+c>+this:+this.clone().endOf(b)<+c):!1}function nb(a,b,c){return this.isAfter(a,c)&&this.isBefore(b,c)}function ob(a,b){var c,d=p(a)?a:Ja(a);return this.isValid()&&d.isValid()?(b=K(b||"millisecond"),"millisecond"===b?+this===+d:(c=+d,+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))):!1}function pb(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function qb(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function rb(a,b,c){var d,e,f,g;return this.isValid()?(d=Ra(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=K(b),"year"===b||"month"===b||"quarter"===b?(g=sb(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:q(g)):NaN):NaN}function sb(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function tb(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ub(){var a=this.clone().utc();return 0f&&(b=f),Ub.call(this,a,b,c,d,e))}function Ub(a,b,c,d,e){var f=ua(a,b,c,d,e),g=pa(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Vb(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Wb(a){return va(a,this._week.dow,this._week.doy).week}function Xb(){return this._week.dow}function Yb(){return this._week.doy}function Zb(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function $b(a){var b=va(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function _b(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function ac(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]}function bc(a){return this._weekdaysShort[a.day()]}function cc(a){return this._weekdaysMin[a.day()]}function dc(a,b,c){var d,e,f;for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){if(e=Ja([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function ec(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=_b(a,this.localeData()),this.add(a-b,"d")):b}function fc(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function gc(a){return this.isValid()?null==a?this.day()||7:this.day(this.day()%7?a:a-7):null!=a?this:NaN}function hc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function ic(){return this.hours()%12||12}function jc(a,b){R(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function kc(a,b){return b._meridiemParse}function lc(a){return"p"===(a+"").toLowerCase().charAt(0)}function mc(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function nc(a,b){b[Hd]=r(1e3*("0."+a))}function oc(){return this._isUTC?"UTC":""}function pc(){return this._isUTC?"Coordinated Universal Time":""}function qc(a){return Ja(1e3*a)}function rc(){return Ja.apply(null,arguments).parseZone()}function sc(a,b,c){var d=this._calendar[a];return w(d)?d.call(b,c):d}function tc(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function uc(){return this._invalidDate}function vc(a){return this._ordinal.replace("%d",a)}function wc(a){return a}function xc(a,b,c,d){var e=this._relativeTime[c];return w(e)?e(a,b,c,d):e.replace(/%d/i,a)}function yc(a,b){var c=this._relativeTime[a>0?"future":"past"];return w(c)?c(b):c.replace(/%s/i,b)}function zc(a,b,c,d){var e=H(),f=h().set(d,b);return e[c](f,a)}function Ac(a,b,c,d,e){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return zc(a,b,c,e);var f,g=[];for(f=0;d>f;f++)g[f]=zc(a,f,c,e);return g}function Bc(a,b){return Ac(a,b,"months",12,"month")}function Cc(a,b){return Ac(a,b,"monthsShort",12,"month")}function Dc(a,b){return Ac(a,b,"weekdays",7,"day")}function Ec(a,b){return Ac(a,b,"weekdaysShort",7,"day")}function Fc(a,b){return Ac(a,b,"weekdaysMin",7,"day")}function Gc(){var a=this._data;return this._milliseconds=xe(this._milliseconds),this._days=xe(this._days),this._months=xe(this._months),a.milliseconds=xe(a.milliseconds),a.seconds=xe(a.seconds),a.minutes=xe(a.minutes),a.hours=xe(a.hours),a.months=xe(a.months),a.years=xe(a.years),this}function Hc(a,b,c,d){var e=cb(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function Ic(a,b){return Hc(this,a,b,1)}function Jc(a,b){return Hc(this,a,b,-1)}function Kc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Lc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Kc(Nc(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=q(f/1e3),i.seconds=a%60,b=q(a/60),i.minutes=b%60,c=q(b/60),i.hours=c%24,g+=q(c/24),e=q(Mc(g)),h+=e,g-=Kc(Nc(e)),d=q(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function Mc(a){return 4800*a/146097}function Nc(a){return 146097*a/4800}function Oc(a){var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+Mc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(Nc(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function Pc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*r(this._months/12)}function Qc(a){return function(){return this.as(a)}}function Rc(a){return a=K(a),this[a+"s"]()}function Sc(a){return function(){return this._data[a]}}function Tc(){return q(this.days()/7)}function Uc(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function Vc(a,b,c){var d=cb(a).abs(),e=Ne(d.as("s")),f=Ne(d.as("m")),g=Ne(d.as("h")),h=Ne(d.as("d")),i=Ne(d.as("M")),j=Ne(d.as("y")),k=e=f&&["m"]||f=g&&["h"]||g=h&&["d"]||h=i&&["M"]||i=j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,Uc.apply(null,k)}function Wc(a,b){return void 0===Oe[a]?!1:void 0===b?Oe[a]:(Oe[a]=b,!0)}function Xc(a){var b=this.localeData(),c=Vc(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function Yc(){var a,b,c,d=Pe(this._milliseconds)/1e3,e=Pe(this._days),f=Pe(this._months);a=q(d/60),b=q(a/60),d%=60,a%=60,c=q(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var Zc,$c=a.momentProperties=[],_c=!1,ad={};a.suppressDeprecationWarnings=!1;var bd,cd={},dd={},ed=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,fd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,gd={},hd={},id=/\d/,jd=/\d\d/,kd=/\d{3}/,ld=/\d{4}/,md=/[+-]?\d{6}/,nd=/\d\d?/,od=/\d\d\d\d?/,pd=/\d\d\d\d\d\d?/,qd=/\d{1,3}/,rd=/\d{1,4}/,sd=/[+-]?\d{1,6}/,td=/\d+/,ud=/[+-]?\d+/,vd=/Z|[+-]\d\d:?\d\d/gi,wd=/Z|[+-]\d\d(?::?\d\d)?/gi,xd=/[+-]?\d+(\.\d{1,3})?/,yd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,zd={},Ad={},Bd=0,Cd=1,Dd=2,Ed=3,Fd=4,Gd=5,Hd=6,Id=7,Jd=8;R("M",["MM",2],"Mo",function(){return this.month()+1}),R("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),R("MMMM",0,0,function(a){return this.localeData().months(this,a)}),J("month","M"),W("M",nd),W("MM",nd,jd),W("MMM",function(a,b){return b.monthsShortRegex(a)}),W("MMMM",function(a,b){return b.monthsRegex(a)}),$(["M","MM"],function(a,b){b[Cd]=r(a)-1}),$(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[Cd]=e:j(c).invalidMonth=a});var Kd=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,Ld="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Md="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Nd=yd,Od=yd,Pd=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Qd=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,Rd=/Z|[+-]\d\d(?::?\d\d)?/,Sd=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Td=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ud=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=u("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),R("Y",0,0,function(){var a=this.year();return 9999>=a?""+a:"+"+a}),R(0,["YY",2],0,function(){return this.year()%100}),R(0,["YYYY",4],0,"year"),R(0,["YYYYY",5],0,"year"),R(0,["YYYYYY",6,!0],0,"year"),J("year","y"),W("Y",ud),W("YY",nd,jd),W("YYYY",rd,ld),W("YYYYY",sd,md),W("YYYYYY",sd,md),$(["YYYYY","YYYYYY"],Bd),$("YYYY",function(b,c){c[Bd]=2===b.length?a.parseTwoDigitYear(b):r(b); -}),$("YY",function(b,c){c[Bd]=a.parseTwoDigitYear(b)}),$("Y",function(a,b){b[Bd]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return r(a)+(r(a)>68?1900:2e3)};var Vd=M("FullYear",!1);a.ISO_8601=function(){};var Wd=u("moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=Ja.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:l()}),Xd=u("moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=Ja.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:l()}),Yd=function(){return Date.now?Date.now():+new Date};Pa("Z",":"),Pa("ZZ",""),W("Z",wd),W("ZZ",wd),$(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Qa(wd,a)});var Zd=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var $d=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,_d=/^(-)?P(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)W)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?$/;cb.fn=Na.prototype;var ae=hb(1,"add"),be=hb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var ce=u("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});R(0,["gg",2],0,function(){return this.weekYear()%100}),R(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ob("gggg","weekYear"),Ob("ggggg","weekYear"),Ob("GGGG","isoWeekYear"),Ob("GGGGG","isoWeekYear"),J("weekYear","gg"),J("isoWeekYear","GG"),W("G",ud),W("g",ud),W("GG",nd,jd),W("gg",nd,jd),W("GGGG",rd,ld),W("gggg",rd,ld),W("GGGGG",sd,md),W("ggggg",sd,md),_(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=r(a)}),_(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),R("Q",0,"Qo","quarter"),J("quarter","Q"),W("Q",id),$("Q",function(a,b){b[Cd]=3*(r(a)-1)}),R("w",["ww",2],"wo","week"),R("W",["WW",2],"Wo","isoWeek"),J("week","w"),J("isoWeek","W"),W("w",nd),W("ww",nd,jd),W("W",nd),W("WW",nd,jd),_(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=r(a)});var de={dow:0,doy:6};R("D",["DD",2],"Do","date"),J("date","D"),W("D",nd),W("DD",nd,jd),W("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),$(["D","DD"],Dd),$("Do",function(a,b){b[Dd]=r(a.match(nd)[0],10)});var ee=M("Date",!0);R("d",0,"do","day"),R("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),R("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),R("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),R("e",0,0,"weekday"),R("E",0,0,"isoWeekday"),J("day","d"),J("weekday","e"),J("isoWeekday","E"),W("d",nd),W("e",nd),W("E",nd),W("dd",yd),W("ddd",yd),W("dddd",yd),_(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:j(c).invalidWeekday=a}),_(["d","e","E"],function(a,b,c,d){b[d]=r(a)});var fe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ge="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),he="Su_Mo_Tu_We_Th_Fr_Sa".split("_");R("DDD",["DDDD",3],"DDDo","dayOfYear"),J("dayOfYear","DDD"),W("DDD",qd),W("DDDD",kd),$(["DDD","DDDD"],function(a,b,c){c._dayOfYear=r(a)}),R("H",["HH",2],0,"hour"),R("h",["hh",2],0,ic),R("hmm",0,0,function(){return""+ic.apply(this)+Q(this.minutes(),2)}),R("hmmss",0,0,function(){return""+ic.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),R("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),R("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)}),jc("a",!0),jc("A",!1),J("hour","h"),W("a",kc),W("A",kc),W("H",nd),W("h",nd),W("HH",nd,jd),W("hh",nd,jd),W("hmm",od),W("hmmss",pd),W("Hmm",od),W("Hmmss",pd),$(["H","HH"],Ed),$(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),$(["h","hh"],function(a,b,c){b[Ed]=r(a),j(c).bigHour=!0}),$("hmm",function(a,b,c){var d=a.length-2;b[Ed]=r(a.substr(0,d)),b[Fd]=r(a.substr(d)),j(c).bigHour=!0}),$("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Ed]=r(a.substr(0,d)),b[Fd]=r(a.substr(d,2)),b[Gd]=r(a.substr(e)),j(c).bigHour=!0}),$("Hmm",function(a,b,c){var d=a.length-2;b[Ed]=r(a.substr(0,d)),b[Fd]=r(a.substr(d))}),$("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Ed]=r(a.substr(0,d)),b[Fd]=r(a.substr(d,2)),b[Gd]=r(a.substr(e))});var ie=/[ap]\.?m?\.?/i,je=M("Hours",!0);R("m",["mm",2],0,"minute"),J("minute","m"),W("m",nd),W("mm",nd,jd),$(["m","mm"],Fd);var ke=M("Minutes",!1);R("s",["ss",2],0,"second"),J("second","s"),W("s",nd),W("ss",nd,jd),$(["s","ss"],Gd);var le=M("Seconds",!1);R("S",0,0,function(){return~~(this.millisecond()/100)}),R(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),R(0,["SSS",3],0,"millisecond"),R(0,["SSSS",4],0,function(){return 10*this.millisecond()}),R(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),R(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),R(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),R(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),R(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),J("millisecond","ms"),W("S",qd,id),W("SS",qd,jd),W("SSS",qd,kd);var me;for(me="SSSS";me.length<=9;me+="S")W(me,td);for(me="S";me.length<=9;me+="S")$(me,nc);var ne=M("Milliseconds",!1);R("z",0,0,"zoneAbbr"),R("zz",0,0,"zoneName");var oe=o.prototype;oe.add=ae,oe.calendar=jb,oe.clone=kb,oe.diff=rb,oe.endOf=Db,oe.format=vb,oe.from=wb,oe.fromNow=xb,oe.to=yb,oe.toNow=zb,oe.get=P,oe.invalidAt=Mb,oe.isAfter=lb,oe.isBefore=mb,oe.isBetween=nb,oe.isSame=ob,oe.isSameOrAfter=pb,oe.isSameOrBefore=qb,oe.isValid=Kb,oe.lang=ce,oe.locale=Ab,oe.localeData=Bb,oe.max=Xd,oe.min=Wd,oe.parsingFlags=Lb,oe.set=P,oe.startOf=Cb,oe.subtract=be,oe.toArray=Hb,oe.toObject=Ib,oe.toDate=Gb,oe.toISOString=ub,oe.toJSON=Jb,oe.toString=tb,oe.unix=Fb,oe.valueOf=Eb,oe.creationData=Nb,oe.year=Vd,oe.isLeapYear=sa,oe.weekYear=Pb,oe.isoWeekYear=Qb,oe.quarter=oe.quarters=Vb,oe.month=ga,oe.daysInMonth=ha,oe.week=oe.weeks=Zb,oe.isoWeek=oe.isoWeeks=$b,oe.weeksInYear=Sb,oe.isoWeeksInYear=Rb,oe.date=ee,oe.day=oe.days=ec,oe.weekday=fc,oe.isoWeekday=gc,oe.dayOfYear=hc,oe.hour=oe.hours=je,oe.minute=oe.minutes=ke,oe.second=oe.seconds=le,oe.millisecond=oe.milliseconds=ne,oe.utcOffset=Ta,oe.utc=Va,oe.local=Wa,oe.parseZone=Xa,oe.hasAlignedHourOffset=Ya,oe.isDST=Za,oe.isDSTShifted=$a,oe.isLocal=_a,oe.isUtcOffset=ab,oe.isUtc=bb,oe.isUTC=bb,oe.zoneAbbr=oc,oe.zoneName=pc,oe.dates=u("dates accessor is deprecated. Use date instead.",ee),oe.months=u("months accessor is deprecated. Use month instead",ga),oe.years=u("years accessor is deprecated. Use year instead",Vd),oe.zone=u("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Ua);var pe=oe,qe={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},re={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},se="Invalid date",te="%d",ue=/\d{1,2}/,ve={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},we=A.prototype;we._calendar=qe,we.calendar=sc,we._longDateFormat=re,we.longDateFormat=tc,we._invalidDate=se,we.invalidDate=uc,we._ordinal=te,we.ordinal=vc,we._ordinalParse=ue,we.preparse=wc,we.postformat=wc,we._relativeTime=ve,we.relativeTime=xc,we.pastFuture=yc,we.set=y,we.months=ca,we._months=Ld,we.monthsShort=da,we._monthsShort=Md,we.monthsParse=ea,we._monthsRegex=Od,we.monthsRegex=ja,we._monthsShortRegex=Nd,we.monthsShortRegex=ia,we.week=Wb,we._week=de,we.firstDayOfYear=Yb,we.firstDayOfWeek=Xb,we.weekdays=ac,we._weekdays=fe,we.weekdaysMin=cc,we._weekdaysMin=he,we.weekdaysShort=bc,we._weekdaysShort=ge,we.weekdaysParse=dc,we.isPM=lc,we._meridiemParse=ie,we.meridiem=mc,E("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===r(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=u("moment.lang is deprecated. Use moment.locale instead.",E),a.langData=u("moment.langData is deprecated. Use moment.localeData instead.",H);var xe=Math.abs,ye=Qc("ms"),ze=Qc("s"),Ae=Qc("m"),Be=Qc("h"),Ce=Qc("d"),De=Qc("w"),Ee=Qc("M"),Fe=Qc("y"),Ge=Sc("milliseconds"),He=Sc("seconds"),Ie=Sc("minutes"),Je=Sc("hours"),Ke=Sc("days"),Le=Sc("months"),Me=Sc("years"),Ne=Math.round,Oe={s:45,m:45,h:22,d:26,M:11},Pe=Math.abs,Qe=Na.prototype;Qe.abs=Gc,Qe.add=Ic,Qe.subtract=Jc,Qe.as=Oc,Qe.asMilliseconds=ye,Qe.asSeconds=ze,Qe.asMinutes=Ae,Qe.asHours=Be,Qe.asDays=Ce,Qe.asWeeks=De,Qe.asMonths=Ee,Qe.asYears=Fe,Qe.valueOf=Pc,Qe._bubble=Lc,Qe.get=Rc,Qe.milliseconds=Ge,Qe.seconds=He,Qe.minutes=Ie,Qe.hours=Je,Qe.days=Ke,Qe.weeks=Tc,Qe.months=Le,Qe.years=Me,Qe.humanize=Xc,Qe.toISOString=Yc,Qe.toString=Yc,Qe.toJSON=Yc,Qe.locale=Ab,Qe.localeData=Bb,Qe.toIsoString=u("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Yc),Qe.lang=ce,R("X",0,0,"unix"),R("x",0,0,"valueOf"),W("x",ud),W("X",xd),$("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),$("x",function(a,b,c){c._d=new Date(r(a))}),a.version="2.12.0",b(Ja),a.fn=pe,a.min=La,a.max=Ma,a.now=Yd,a.utc=h,a.unix=qc,a.months=Bc,a.isDate=d,a.locale=E,a.invalid=l,a.duration=cb,a.isMoment=p,a.weekdays=Dc,a.parseZone=rc,a.localeData=H,a.isDuration=Oa,a.monthsShort=Cc,a.weekdaysMin=Fc,a.defineLocale=F,a.updateLocale=G,a.locales=I,a.weekdaysShort=Ec,a.normalizeUnits=K,a.relativeTimeThreshold=Wc,a.prototype=pe;var Re=a;return Re}); \ No newline at end of file diff --git a/static/js/password.js b/static/js/password.js new file mode 100644 index 0000000..7702963 --- /dev/null +++ b/static/js/password.js @@ -0,0 +1,98 @@ +'use strict'; +/* global $ Mellt */ + +const mellt = new Mellt(); + +function checkMatch(){ + $('#submit').prop('title',"You need to type your password again before you can save it. "); + + // They match + if ( $('#p1').val() === $('#p2').val() ) { + $('#submit').prop('disabled',false).prop('title',"Click here to save your password. "); + } + + // User has retyped, but they don't match yet + else if ($('#p2').val()!=='') { + $('#password-help').text("Those passwords don't match... ").css({'color':'#fb6e3d'}); + $('#submit').prop('disabled',true).prop('title',"You need to type the same password twice before you can save it. "); + } + +} + +// On page load +$(function(){ + + // On typing password + $('.password').keyup(function(){ + + // Nothing entered + if ( $('#p1').val()==='' && $('#p2').val()==='' ){ + $('#password-help').hide(); + $('#submit').prop('disabled',true).prop('title',"You need to enter a password first. "); + } + + // Only second password entered + else if ($('#p1').val()==='') { + $('#password-help').show().text("Those passwords don't match... "); + $('#submit').prop('disabled',true).prop('title',"You need to type the same password twice correctly before you can save it. "); + } + + // At least first password entered + else { + $('#password-help').show(); + + // Check first password + var daysToCrack = mellt.CheckPassword($('#p1').val()); + + // Not good enough + if (daysToCrack<0) { + $('#password-help').text("That's is one of the world's most commonly used passwords. You may not use it for Tracman and should not use it anywhere. ").css({'color':'#fb6e3d'}); + $('#submit').prop('disabled',true).prop('title',"You need to come up with a better password. "); + } + else if (daysToCrack<1) { + $('#password-help').text("That password is pretty bad. It could be cracked in less than a day. Try adding more words, numbers, or symbols. ").css({'color':'#fb6e3d'}); + $('#submit').prop('disabled',true).prop('title',"You need to come up with a better password. "); + } + else if (daysToCrack<10) { + $('#password-help').text("That password isn't good enough. It could be cracked in "+daysToCrack+" day"+(daysToCrack!=1?'s':'')+". Try adding another word, number, or symbol. ").css({'color':'#fb6e3d'}); + $('#submit').prop('disabled',true).prop('title',"You need to come up with a better password. "); + } + + // Good enough + else if (daysToCrack<=30) { + $('#password-help').text("That password is good enough, but it could still be cracked in "+daysToCrack+" days. ").css({'color':'#eee'}); + checkMatch(); + } + else if (daysToCrack<=365) { + $('#password-help').text("That password is good. It would take "+daysToCrack+" days to crack. ").css({'color':'#8ae137'}); + checkMatch(); + } + else if (daysToCrack<1000000000) { + var years = Math.round(daysToCrack / 365 * 10) / 10; + if (years>1000000) { + years = (Math.round(years/1000000*10)/10)+' million'; + } + if (years>1000) { + years = (Math.round(years/1000))+' thousand'; + } + $('#password-help').text("That password is great! It could take up to "+years+" years to crack!").css({'color':'#8ae137'}); + checkMatch(); + } + else { + $('#password-help').text("That password is amazing! It is virtually impossible to crack!").css({'color':'#8ae137'}); + checkMatch(); + } + } + + }); + + // On checking 'show' + $('#show').click(function(){ + if ($(this).is(':checked')) { + $('.password').attr('type','text'); + } else { + $('.password').attr('type','password'); + } + }); + +}); diff --git a/static/js/settings.js b/static/js/settings.js new file mode 100644 index 0000000..77be716 --- /dev/null +++ b/static/js/settings.js @@ -0,0 +1,164 @@ +'use strict'; +/* global location $ */ + +// Validate email addresses +function validateEmail(email) { + var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(email); +} + +// Replace inputed value with response +function replaceFromEndpoint(type, selector, cb) { + $.get('/validate?'+type+'='+$(selector).val()) + .done(function(data){ + $(selector).val(data); + cb(); + }); +} + +// On page load +$(function(){ + var slugNotUnique, emailNotUnique; + + // Set timezone in password change link + $('#password').attr('href',"/settings/password?tz="+new Date().getTimezoneOffset()); + + // Delete account + $('#delete').click(function(){ + if (confirm("Are you sure you want to delete your account? This CANNOT be undone! ")) { + $.ajax({ + url: '/settings', + type: 'DELETE', + success: function(){ + location.reload(); + }, + fail: function(){ + alert("Failed to delete account!"); + } + }); + } + }); + + function validateForm(input) { + + // Perform basic check, then validate uniqueness + basicCheck(function(){ validateUniqueness(input); }); + + function basicCheck(cb){ + var checkedCount = 0; + + // Check slug + if (!$('#slug-input').val()){ + $('#slug-help').show().text("A slug is required. "); + $('#submit-group .main').prop('disabled',true).prop('title',"You need to enter a slug. "); + if (checkedCount>0) {cb();} else {checkedCount++;} + } + else { + if (!slugNotUnique){ $('#slug-help').hide(); } + if (checkedCount>0) {cb();} else {checkedCount++;} + } + + // Check email + if (!$('#email-input').val()){ + $('#email-help').show().text("An email is required. "); + $('#submit-group .main').prop('disabled',true).prop('title',"You need to enter an email address. "); + if (checkedCount>0) {cb();} else {checkedCount++;} + } + else if (!validateEmail($('#email-input').val())) { + $('#email-help').show().text("You must enter a valid email address. "); + $('#submit-group .main').prop('disabled',true).prop('title',"You need to enter a valid email address. "); + if (checkedCount>0) {cb();} else {checkedCount++;} + } + else { + if (!emailNotUnique){ $('#email-help').hide(); } + if (checkedCount>0) {cb();} else {checkedCount++;} + } + } + + function validateUniqueness(input){ + + function recheckBasic(){ + if ($('#email-help').is(":visible") && $('#email-help').text().substring(0,25)!=="Unable to confirm unique ") { + $('#submit-group .main').prop('disabled',true).prop('title',"You need to supply a different email address. "); + } + else if ($('#slug-help').is(":visible") && $('#slug-help').text().substring(0,25)!=="Unable to confirm unique ") { + $('#submit-group .main').prop('disabled',true).prop('title',"You need to supply a different slug. "); + } + else if ( $('#slug-help').text().substring(0,25)==="Unable to confirm unique " ) { + $('#submit-group .main').prop('title',"Unable to confirm unique slug with the server. This might not work... "); + } + else if ( $('#email-help').text().substring(0,25)==="Unable to confirm unique " ) { + $('#submit-group .main').prop('title',"Unable to confirm unique email with the server. This might not work... "); + } + else { + $('#submit-group .main').prop('disabled',false).prop('title',"Click here to save your changes. "); + } + } + + // Should server be queried for unique values? + if (input && $('#'+input+'-input').val()) { + if (input==='email' && !validateEmail($('#email-input').val())) {} + + // Query server for unique values + else { + $.ajax({ + url: '/validate?'+input+'='+$('#'+input+'-input').val(), + type: 'GET', + statusCode: { + + // Is unique + 200: function(){ + $('#'+input+'-help').hide(); + if (input==='slug'){ slugNotUnique=false; } + else if (input==='email'){ emailNotUnique=false; } + recheckBasic(); + }, + + // Isn't unique + 400: function(){ + if (input==='slug'){ slugNotUnique=true; } + else if (input==='email'){ emailNotUnique=true; } + $('#'+input+'-help').show().text("That "+input+" is already in use by another user. "); + $('#submit-group .main').prop('disabled',true).prop('title',"You need to supply a different "+input+". "); + } + + } }) + + // Server error + .error( function(){ + if (input==='slug'){ slugNotUnique=undefined; } + else if (input==='email'){ emailNotUnique=undefined; } + $('#'+input+'-help').show().text("Unable to confirm unique "+input+". This might not work... "); + recheckBasic(); + }); + + } } + + // Nothing changed. Recheck basic validations + else { recheckBasic(); } + + } + + } + + // Input change listeners + $('#slug-input').change(function(){ + if (!$('#slug-input').val()){ + $('#slug-help').show().text("A slug is required. "); + $('#submit-group .main').prop('disabled',true).prop('title',"You need to enter a slug. "); + } + else { + $('#slug-help').hide(); + replaceFromEndpoint('slugify','#slug-input',function(){ + validateForm('slug'); + }); + } + }); + $('#email-input').change(function(){ + validateForm('email'); + }); + $('#name-input').change(function(){ + replaceFromEndpoint('xss','#name-input',validateForm); + }); + +}); diff --git a/static/js/validator.min.js b/static/js/validator.min.js deleted file mode 100644 index 9a49ff3..0000000 --- a/static/js/validator.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Validator v0.10.1 for Bootstrap 3, by @1000hz - * Copyright 2016 Cina Saffary - * Licensed under http://opensource.org/licenses/MIT - * - * https://github.com/1000hz/bootstrap-validator - */ - -+function(a){"use strict";function b(b){return b.is('[type="checkbox"]')?b.prop("checked"):b.is('[type="radio"]')?!!a('[name="'+b.attr("name")+'"]:checked').length:a.trim(b.val())}function c(b){return this.each(function(){var c=a(this),e=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b),f=c.data("bs.validator");(f||"destroy"!=b)&&(f||c.data("bs.validator",f=new d(this,e)),"string"==typeof b&&f[b]())})}var d=function(c,e){this.options=e,this.$element=a(c),this.$inputs=this.$element.find(d.INPUT_SELECTOR),this.$btn=a('button[type="submit"], input[type="submit"]').filter('[form="'+this.$element.attr("id")+'"]').add(this.$element.find('input[type="submit"], button[type="submit"]')),e.errors=a.extend({},d.DEFAULTS.errors,e.errors);for(var f in e.custom)if(!e.errors[f])throw new Error("Missing default error message for custom validator: "+f);a.extend(d.VALIDATORS,e.custom),this.$element.attr("novalidate",!0),this.toggleSubmit(),this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator",d.INPUT_SELECTOR,a.proxy(this.onInput,this)),this.$element.on("submit.bs.validator",a.proxy(this.onSubmit,this)),this.$element.find("[data-match]").each(function(){var c=a(this),d=c.data("match");a(d).on("input.bs.validator",function(){b(c)&&c.trigger("input.bs.validator")})})};d.INPUT_SELECTOR=':input:not([type="submit"], button):enabled:visible',d.FOCUS_OFFSET=20,d.DEFAULTS={delay:500,html:!1,disable:!0,focus:!0,custom:{},errors:{match:"Does not match",minlength:"Not long enough"},feedback:{success:"glyphicon-ok",error:"glyphicon-remove"}},d.VALIDATORS={"native":function(a){var b=a[0];return b.checkValidity?b.checkValidity():!0},match:function(b){var c=b.data("match");return!b.val()||b.val()===a(c).val()},minlength:function(a){var b=a.data("minlength");return!a.val()||a.val().length>=b}},d.prototype.onInput=function(b){var c=this,d=a(b.target),e="focusout"!==b.type;this.validateInput(d,e).done(function(){c.toggleSubmit()})},d.prototype.validateInput=function(c,d){var e=b(c),f=c.data("bs.validator.previous"),g=c.data("bs.validator.errors");if(f===e)return a.Deferred().resolve();c.data("bs.validator.previous",e),c.is('[type="radio"]')&&(c=this.$element.find('input[name="'+c.attr("name")+'"]'));var h=a.Event("validate.bs.validator",{relatedTarget:c[0]});if(this.$element.trigger(h),!h.isDefaultPrevented()){var i=this;return this.runValidators(c).done(function(b){c.data("bs.validator.errors",b),b.length?d?i.defer(c,i.showErrors):i.showErrors(c):i.clearErrors(c),g&&b.toString()===g.toString()||(h=b.length?a.Event("invalid.bs.validator",{relatedTarget:c[0],detail:b}):a.Event("valid.bs.validator",{relatedTarget:c[0],detail:g}),i.$element.trigger(h)),i.toggleSubmit(),i.$element.trigger(a.Event("validated.bs.validator",{relatedTarget:c[0]}))})}},d.prototype.runValidators=function(c){function e(a){return c.data(a+"-error")||c.data("error")||"native"==a&&c[0].validationMessage||h.errors[a]}var f=[],g=a.Deferred(),h=this.options;return c.data("bs.validator.deferred")&&c.data("bs.validator.deferred").reject(),c.data("bs.validator.deferred",g),a.each(d.VALIDATORS,a.proxy(function(a,d){if((b(c)||c.attr("required"))&&(c.data(a)||"native"==a)&&!d.call(this,c)){var g=e(a);!~f.indexOf(g)&&f.push(g)}},this)),!f.length&&b(c)&&c.data("remote")?this.defer(c,function(){var d={};d[c.attr("name")]=b(c),a.get(c.data("remote"),d).fail(function(a,b,c){f.push(e("remote")||c)}).always(function(){g.resolve(f)})}):g.resolve(f),g.promise()},d.prototype.validate=function(){var b=this;return a.when(this.$inputs.map(function(){return b.validateInput(a(this),!1)})).then(function(){b.toggleSubmit(),b.$btn.hasClass("disabled")&&b.focusError()}),this},d.prototype.focusError=function(){if(this.options.focus){var b=a(".has-error:first :input");a(document.body).animate({scrollTop:b.offset().top-d.FOCUS_OFFSET},250),b.focus()}},d.prototype.showErrors=function(b){var c=this.options.html?"html":"text",d=b.data("bs.validator.errors"),e=b.closest(".form-group"),f=e.find(".help-block.with-errors"),g=e.find(".form-control-feedback");d.length&&(d=a("
    ").addClass("list-unstyled").append(a.map(d,function(b){return a("
  • ")[c](b)})),void 0===f.data("bs.validator.originalContent")&&f.data("bs.validator.originalContent",f.html()),f.empty().append(d),e.addClass("has-error has-danger"),e.hasClass("has-feedback")&&g.removeClass(this.options.feedback.success)&&g.addClass(this.options.feedback.error)&&e.removeClass("has-success"))},d.prototype.clearErrors=function(a){var c=a.closest(".form-group"),d=c.find(".help-block.with-errors"),e=c.find(".form-control-feedback");d.html(d.data("bs.validator.originalContent")),c.removeClass("has-error has-danger"),c.hasClass("has-feedback")&&e.removeClass(this.options.feedback.error)&&b(a)&&e.addClass(this.options.feedback.success)&&c.addClass("has-success")},d.prototype.hasErrors=function(){function b(){return!!(a(this).data("bs.validator.errors")||[]).length}return!!this.$inputs.filter(b).length},d.prototype.isIncomplete=function(){function c(){return!b(a(this))}return!!this.$inputs.filter("[required]").filter(c).length},d.prototype.onSubmit=function(a){this.validate(),this.$btn.hasClass("disabled")&&a.preventDefault()},d.prototype.toggleSubmit=function(){this.options.disable&&this.$btn.toggleClass("disabled",this.isIncomplete()||this.hasErrors())},d.prototype.defer=function(b,c){return c=a.proxy(c,this,b),this.options.delay?(window.clearTimeout(b.data("bs.validator.timeout")),void b.data("bs.validator.timeout",window.setTimeout(c,this.options.delay))):c()},d.prototype.destroy=function(){return this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator").find(".form-control-feedback").removeClass([this.options.feedback.error,this.options.feedback.success].join(" ")),this.$inputs.off(".bs.validator").removeData(["bs.validator.errors","bs.validator.deferred","bs.validator.previous"]).each(function(){var b=a(this),c=b.data("bs.validator.timeout");window.clearTimeout(c)&&b.removeData("bs.validator.timeout")}),this.$element.find(".help-block.with-errors").each(function(){var b=a(this),c=b.data("bs.validator.originalContent");b.removeData("bs.validator.originalContent").html(c)}),this.$element.find('input[type="submit"], button[type="submit"]').removeClass("disabled"),this.$element.find(".has-error, .has-danger").removeClass("has-error has-danger"),this};var e=a.fn.validator;a.fn.validator=c,a.fn.validator.Constructor=d,a.fn.validator.noConflict=function(){return a.fn.validator=e,this},a(window).on("load",function(){a('form[data-toggle="validator"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery); \ No newline at end of file diff --git a/test.js b/test.js index c34cb68..ac04079 100755 --- a/test.js +++ b/test.js @@ -1,20 +1,11 @@ -var chai = require('chai'), +const chai = require('chai'), chaiHttp = require('chai-http'), request = require('supertest'), - server = require('./server'), - should = chai.should(), - expect = chai.expect(); + server = require('./server'); chai.use(chaiHttp); -describe('Index', function() { - // I think this restarts the server after each try? - // var server; - // beforeEach(function() { - // server = require('./server'); - // }); - // afterEach(function() { - // server.close(); - // }); + +describe('Public', function() { it('Displays homepage', function(done){ request(server).get('/') @@ -22,6 +13,24 @@ describe('Index', function() { .end(function(err,res){ done(); }); }); + it('Displays help page', function(done){ + request(server).get('/help') + .expect(200) + .end(function(err,res){ done(); }); + }); + + it('Displays terms of service', function(done){ + request(server).get('/terms') + .expect(200) + .end(function(err,res){ done(); }); + }); + + it('Displays privacy policy', function(done){ + request(server).get('/privacy') + .expect(200) + .end(function(err,res){ done(); }); + }); + it('Displays robots.txt', function(done){ request(server).get('/robots.txt') .expect(200) @@ -37,60 +46,15 @@ describe('Index', function() { }); -describe('Auth', function() { +describe('User', function() { it('Creates an account', function(done){ - request(server).get('/login') - .expect(200) - .end(function(err,res){ - //TODO: google authentication - it('Logs out', function(done){ - request(server).get('/logout') - .expect(200) - .end(function(err,res){ - it('Logs in', function(done){ - request(server).get('/logout') - .expect(200) - .end(function(err,res){ - cbc=2; - var deletesAccount = function(done){ - it('Deletes own account', function(){ - //TODO: Delete account via GUI - }); - } - it('Shows own map', function(done){ - request(server).get('/map') - .expect(200) - //TODO: Expect no js errors - .end(function(err,res){ - if (cbc<2){ deletesAccount(); } - else { cbc--; } - done(); - }); - }); - - it('Has the correct account info', function(done){ - //TODO: Check account info - if (cbc<2){ deletesAccount(); } - else { cbc--; } - done(); - }); - - done(); - }); - }); - done(); - }); - }); - done(); - }); + request(server).post('/signup',{"email":"test@tracman.org"}) + .expect(200) + .end(function(err,res){ done(); }); }); - //TODO: it('Has the correct account info', function(done){ - - // }); - - //TODO: it('Logs out', function(done){ + //TODO: it('Creates a password', function(done){ // }); @@ -98,7 +62,85 @@ describe('Auth', function() { // }); + //TODO: it('Logs out', function(done){ + + // }); + + //TODO: it('Forgets password', function(done){ + + // }); + + //TODO: it('Changes forgotten password', function(done){ + + // }); + + //TODO: it('Logs back in', function(done){ + + // }); + + //TODO: it('Changes email address', function(done){ + + // }); + + //TODO: it('Changes password', function(done){ + + // }); + + //TODO: it('Changes settings', function(done){ + + // }); + + //TODO: it('Connects a Google account', function(done){ + + // }); + + //TODO: it('Connects a Facebook account', function(done){ + + // }); + + //TODO: it('Connects a Twitter account', function(done){ + + // }); + + //TODO: it('Logs in with Google', function(done){ + + // }); + + //TODO: it('Logs in with Facebook', function(done){ + + // }); + + //TODO: it('Logs in with Twitter', function(done){ + + // }); + + //TODO: it('Disconnects a Google account', function(done){ + + // }); + + //TODO: it('Disconnects a Facebook account', function(done){ + + // }); + + //TODO: it('Disconnects a Twitter account', function(done){ + + // }); + //TODO: it('Shows own map', function(done){ + // request(server).get('/map') + // .expect(200) + // .end(function(err,res){ done(); }); + // }); + + //TODO: it('Sets own location', function(done){ + + // }); + + //TODO: it('Tracks own location', function(done){ + + // }); + + //TODO: it('Clears own location', function(done){ // }); @@ -107,43 +149,3 @@ describe('Auth', function() { // }); }); - -describe('Map controls', function() { - - //TODO: it('Sets location', function(done){ - - // }); - - //TODO: it('Clears location', function(done){ - - // }); - - //TODO: it('Starts tracking', function(done){ - - // }); - - //TODO: it('Stops tracking', function(done){ - - // }); - -}); - -describe('Map popups', function() { - - //TODO: it('Opens Share popup', function(done){ - - // }); - - //TODO: it('Closes Share popup', function(done){ - - // }); - - //TODO: it('Opens Settings popup', function(done){ - - // }); - - //TODO: it('Closes Settings popup', function(done){ - - // }); - -}); diff --git a/views/admin.html b/views/admin.html index d04f60e..d9df9a4 100644 --- a/views/admin.html +++ b/views/admin.html @@ -3,7 +3,6 @@ {% block head %} {{ super() }} - @@ -38,7 +37,7 @@ Google {% endif %} -
    +
    @@ -50,7 +49,7 @@ - + - +

    Tracman

    Display your realtime GPS location on a map

    - {% if user %} Map + Settings {% if user.isAdmin %} Admin {% endif %} {% else %} View example - Join - Login + Join + Login {% endif %}
    - +

    Easy-to-use

    -

    Download the android app and log in. Then send your friends a link with a map showing your live location. 

    +

    Download the android app and log in. Then send your friends a link with a map showing your live location.

    Realtime

    -

    Your location updates every second for all the world to see. 

    +

    Your location updates every second for all the world to see.

    Free

    -

    It's free, but you can donate if you want to help with server expenses. 

    +

    It's free, but you can donate if you want to help with server expenses.

    @@ -51,22 +49,22 @@ Mobile phone

    Setting your location

    -

    You can track your GPS location from your phone's web browsers. There's also has an android app which can run in the background. With the app, you can:

    +

    You can track your GPS location from your phone's web browsers. There's also has an android app which can run in the background. With the app, you can:

    • Turn off tracking

      -

      If you need to go undercover, just turn tracman off with the flip of a switch. 

      +

      If you need to go undercover, just turn tracman off with the flip of a switch.

    • Change settings

      -

      Change your settings to show a less accurate location, if you want an air of mystery. 

      +

      Change your settings to show a less accurate location, if you want an air of mystery.

    • Save energy

      -

      If nobody's tracking you, tracman won't needlessly drain your battery. 

      +

      If nobody's tracking you, tracman won't needlessly drain your battery.

    @@ -78,34 +76,33 @@ Laptop

    The Map

    -

    You'll get a simple webpage with a map to send to friends. It'll look like this. 

    +

    You'll get a simple webpage with a map to send to friends. It'll look like this.

    • Easy

      -

      Just send a link to whomever you want. Bam, now they know where you are. 

      +

      Just send a link to whomever you want. Bam, now they know where you are.

    • Precise

      -

      Map updates in realtime with websockets. 

      +

      Map updates in realtime with websockets.

    • Customizable

      -

      Change the map default type and zoom level. You can also show speed, altitude, and streetview. 

      +

      Change the map default type and zoom level. You can also show speed, altitude, and streetview.

    -
    +

    Warning!

    -

    This is beta software, so there are still kinks to be worked out. 

    -

    Also keep in mind that publishing your location online could be a bad idea. 

    -

    I assume no responsibilities. 

    +

    This is beta software, so there are still kinks to be worked out.

    +

    Keep in mind that publishing your location online could be a bad idea.

    @@ -113,9 +110,8 @@

    Hook me up!

    -

    Right now, Tracman is in beta testing. Things may break. 

    -

    You will need a google account to join tracman and log in. 

    - Join Tracman +

    Just click that there button to create an account.

    + Join Tracman
    {% endif %} diff --git a/views/license.html b/views/license.html deleted file mode 100644 index da645d3..0000000 --- a/views/license.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends 'templates/base.html' %} -{% block title %}{{ super() }} | License{% endblock %} - -{% block main %} -
    - -
    -

    The MIT License (MIT)

    -

    Copyright © 2016 Keith Irwin

    - -

    Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions:

    - -

    The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software.

    - -

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE.

    -
    - -
    -{% endblock %} diff --git a/views/login.html b/views/login.html new file mode 100644 index 0000000..46f2ce8 --- /dev/null +++ b/views/login.html @@ -0,0 +1,93 @@ +{% extends 'templates/base.html' %} +{% block title %}{{ super() }} | Login{% endblock %} +{% block head %} + {{super()}} + + +{% endblock %} + +{% block main %} + +
    + +

    Welcome!

    + +
    + + + +
    + +
    +

    Create account

    +

    Welcome aboard!

    +
    + +

    You will be sent an email confrimation with a link to create a password.

    +

    By signing up, you agree to our terms of service and privacy policy.

    + +
    +
    + +
    + +
    + +{% endblock %} + +{% block javascript %} + +{% endblock %} \ No newline at end of file diff --git a/views/map.html b/views/map.html index 55fb0bc..890af57 100644 --- a/views/map.html +++ b/views/map.html @@ -1,438 +1,94 @@ {% extends 'templates/base.html' %} -{% block title %}{{super()}} | {{mapuser.name}}{% endblock %} +{% block title %}{{super()}}{% if mapuser.name %} | {{mapuser.name}}{% endif %}{% endblock %} {% block head %} {{super()}} - - {% endblock %} {% block main %} -
    +
    +
    -
    -
    - -
    - {% if user.id == mapuser.id %} - Your location is unset. You can click 'set' below to set it to your current position. - {% else %} - This user has no location set. - {% endif %} -
    - +
    {% if user.id == mapuser.id %} -
    + Your location is unset. You can click 'set' below to set it to your current position. + {% else %} + This user has no location set. + {% endif %} +
    + + {% if user.id == mapuser.id %} +
    + {% if mapuser.settings.showStreetview and disp!='0' %} - - - -
    + {% endif %} - -
    + + + + + +
    + {% endif %} - - - + + + {% if user.id == mapuser.id %}{% endif %} + -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/views/password.html b/views/password.html new file mode 100644 index 0000000..f5102bb --- /dev/null +++ b/views/password.html @@ -0,0 +1,59 @@ +{% extends 'templates/base.html' %} +{% block title %}{{super()}} | Set Password{% endblock %} + +{% block head %} +{{super()}} + +{% endblock %} + +{% block main %} +
    + +

    Set Password

    + +
    + + +

    Your password must be at least 8 characters long. You can use any letter, number, symbol, emoji, or spaces. Your password will be stored as a salted hash on the server.

    + +
    + + + + + + + + +
    + +

    + +
    + +
    + +
    + +
    +{% endblock %} + +{% block javascript %} +{{super()}} + + + +{% endblock %} \ No newline at end of file diff --git a/views/privacy.html b/views/privacy.html new file mode 100644 index 0000000..873ed4e --- /dev/null +++ b/views/privacy.html @@ -0,0 +1,22 @@ +{% extends 'templates/base.html' %} +{% block title %}{{super()}} | Privacy Policy{% endblock %} + +{% block main %} +
    + +

    Privacy Policy

    + +

    In lieu of legalease, which I don't speak, here is a quick rundown of what Tracman does with your data (such as location).

    + +

    Location history

    + +

    Your location is saved on the database as long as you have it "set" or "tracking". If you "clear" the data, it will be deleted from the database too. This doesn't mean all copies are destroyed. Our servers keep occasional backups, and caches could exist on other servers (google index, wayback archive, etc).

    + +

    This means that all public access to your location is essentially deleted when you clear it. But anyone could record your location while it's publicly available and rebroadcast it. Tracman doesn't store location histories (except as mentioned above), but histories may exist elsewhere! If you have (or plan to have) trouble with the law, don't use Tracman. Authorities have easy access to those histories.

    + +

    Email addresses

    + +

    Tracman stores email addresses so we can contact users for important stuff (urgent security updates, deletion requests, lost passwords). We will never subscribe you to anything else by default.

    + +
    +{% endblock %} \ No newline at end of file diff --git a/views/pro.html b/views/pro.html index 21e90ba..cecc37e 100644 --- a/views/pro.html +++ b/views/pro.html @@ -1,41 +1,43 @@ {% extends 'templates/base.html' %} -{% block title %}{{ super() }} | Pro{% endblock %} +{% block title %}{{super()}} | Pro{% endblock %} + +{% block head %}{{super()}} + +{% endblock %} {% block main %}
    -
    +

    Tracman Pro

    A word from the developer

    Hi Folks,

    -

    Glad you're enjoying my website and app. I made the whole thing, from front to backend, - and I'm really proud of it! However, I'm a long-haul trucker by day and coding is just a hobby. - I don't make any money off this website, and I pay the server fees out of my own pocket. Do you - pity me enough to donate some money by paypal - or bitcoin?

    +

    Glad you're enjoying my website and app. I made the whole thing, from front to backend, and I'm really proud of it! However, I'm a long-haul trucker by day and coding is just a hobby. I don't make any money off this website, and I pay the server fees out of my own pocket. Do you pity me enough to donate some money or bitcoin?

    -

    To make a little money off this service, I'm going to be offering a pro version with more - features. It'll be cheap, probably $1 or $2 per month. However, while Tracman is in beta, - you can beta test the pro version too. Be sure to inform me about any bugs - you encounter or suggestions you have. And keep in mind that at some - point, when we launch out of beta, Tracman Pro will not be free and you will - lose your pro membership unless start paying for it. +

    To make a little money off this service, I'm going to be offering a pro version with more features. It'll be cheap, probably $1 or $2 per month. While Tracman is in beta, you can test the pro version for free. Be sure to inform me about any bugs you encounter. And keep in mind that at some point, when we launch out of beta, Tracman Pro will not be free and you will lose your pro membership unless start paying for it.

    -

    That said, just click the button below to test out the pro features. Keep in mind, they are - as unstable as the rest of this product. +

    That said, just click the button below to try pro out.

    Cheers,
    Keith Irwin

    -
    + {% if user.isPro %} -
    You are already pro!
    +
    + + You are already pro! +
    + go back {% else %} - + + go home {% endif %} - go home
    diff --git a/views/settings.html b/views/settings.html index 33c976b..a0d073e 100644 --- a/views/settings.html +++ b/views/settings.html @@ -1,134 +1,154 @@ {% extends 'templates/base.html' %} {% block title %}{{super()}} | Settings{% endblock %} +{% block head %} +{{super()}} + + +{% endblock %} + {% block main %} - +
    + +

    Settings

    + +
    -

    Settings

    - - - - -
    - -
    -
    +

    Account settings

    + +
    + + +

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

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

    Map settings

    + +
    + +
    + + +
    +

    -
    - -
    - -
    - + +
    + +
    +
    + + +
    +
    + + +
    +
    -
    - -
    - -
    -
    + +
    + +
    +
    + + +
    +
    + + +
    +
    -
    - -
    - -
    -
    + +
    + +
    -
    - -
    - -
    -
    + +
    + +
    -
    - - - -
    - - cancel + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + cancel
    - - {% if not user.isPro %}

    Want to try Tracman Pro? It's free during beta testing.

    {% endif %} + + {% if not user.isPro %}

    Want to try Tracman Pro? It's free during beta testing.

    {% endif %}

    Would you like to submit a suggestion or bug report?

    - +
    -{% endblock %} \ No newline at end of file +{% endblock %} + +{% block javascript %} +{{super()}} + +{% endblock %} diff --git a/views/templates/base.html b/views/templates/base.html index f42d6ab..c6942ac 100644 --- a/views/templates/base.html +++ b/views/templates/base.html @@ -1,14 +1,30 @@ + + + {% block head %} {% block title %}Tracman{% endblock %} - + - + @@ -25,33 +41,29 @@ - - - - + + + - - - + + {% endblock %} - {% if not noHeader %}{% endif %} - {% if not noFooter %}{% endif %} + {% if not noHeader %}{% endif %} + {% if not noFooter %}{% endif %} - - {% if not noHeader %}{% include 'templates/header.html' %}{% endif %} - {% block main %}Loading... {% endblock %} - {% if not noFooter %}{% include 'templates/footer.html' %}{% endif %} +
    + {% block main %}{% endblock %} + {% if not noFooter %}{% include 'templates/footer.html' %}{% endif %} +
    - + + {% block javascript %} - - - - + {% endblock %} diff --git a/views/templates/footer.html b/views/templates/footer.html index b27fe5b..1beecbe 100644 --- a/views/templates/footer.html +++ b/views/templates/footer.html @@ -4,13 +4,13 @@
    Design by Fraser Boag.

    - Share: - - - -
    Contribute: + Contribute: +
    + Privacy Policy ▪️ Terms of Service
    - \ No newline at end of file + + + \ No newline at end of file diff --git a/views/templates/header.html b/views/templates/header.html index c89238d..d2c6a1a 100644 --- a/views/templates/header.html +++ b/views/templates/header.html @@ -1,44 +1,59 @@ - +
    -
    + + +
    - + + + +
    - - - -{% if error %} -
    - ERROR: {{error|safe}} - + +