From 9823acc03f3fb5758e579fe582eae360fa34c829 Mon Sep 17 00:00:00 2001 From: Nathaniel van Diepen Date: Wed, 14 Dec 2016 13:55:43 -0700 Subject: [PATCH] Initial work to get working in Firefox --- .bowerrc | 4 +- .gitignore | 68 +- .jshintignore | 8 +- .jshintrc | 20 +- .validate.json | 12 +- AUTHORS | 28 +- HISTORY.rst | 48 +- LICENSE | 62 +- README.md | 150 +- assets/js/app.jsx | 30 +- assets/js/components/Alert.jsx | 38 +- assets/js/components/MainList.jsx | 212 +- assets/js/components/NavBar.jsx | 178 +- assets/js/components/Options.jsx | 428 ++-- assets/js/components/SitesList.jsx | 70 +- assets/js/components/WakaTime.jsx | 346 ++-- assets/js/config.js | 134 +- assets/js/core/WakaTimeCore.js | 512 ++--- assets/js/devtools.js | 24 +- assets/js/events.js | 200 +- assets/js/helpers/changeExtensionIcon.js | 100 +- assets/js/helpers/changeExtensionState.js | 82 +- assets/js/helpers/changeExtensionTooltip.js | 42 +- assets/js/helpers/contains.js | 58 +- assets/js/helpers/getDomainFromUrl.js | 24 +- assets/js/helpers/in_array.js | 34 +- assets/js/options.jsx | 32 +- assets/less/app.less | 60 +- assets/less/bootstrap/.csscomb.json | 608 +++--- assets/less/bootstrap/.csslintrc | 38 +- assets/less/bootstrap/bootstrap.less | 4 +- assets/less/bootstrap/button-groups.less | 2 +- assets/less/bootstrap/forms.less | 2 +- assets/less/bootstrap/input-groups.less | 2 +- assets/less/bootstrap/mixins/tab-focus.less | 6 +- assets/less/bootstrap/panels.less | 2 +- assets/less/bootstrap/scaffolding.less | 2 +- assets/less/bootstrap/theme.less | 4 +- assets/less/bootstrap/variables.less | 2 +- assets/less/bootswatch/paper/bootswatch.less | 1134 +++++------ assets/less/bootswatch/paper/variables.less | 1722 ++++++++--------- assets/less/font-awesome/animated.less | 68 +- assets/less/font-awesome/bordered-pulled.less | 50 +- assets/less/font-awesome/core.less | 24 +- assets/less/font-awesome/fixed-width.less | 12 +- assets/less/font-awesome/font-awesome.less | 36 +- assets/less/font-awesome/icons.less | 1466 +++++++------- assets/less/font-awesome/larger.less | 26 +- assets/less/font-awesome/list.less | 38 +- assets/less/font-awesome/mixins.less | 120 +- assets/less/font-awesome/path.less | 30 +- assets/less/font-awesome/rotated-flipped.less | 40 +- assets/less/font-awesome/screen-reader.less | 10 +- assets/less/font-awesome/stacked.less | 40 +- assets/less/font-awesome/variables.less | 1488 +++++++------- assets/less/partials/_animations.less | 32 +- assets/less/partials/_scrollbar.less | 28 +- assets/less/variables.less | 4 +- bower.json | 28 +- devtools.html | 4 +- gulpfile.js | 86 +- manifest.json | 83 +- options.html | 34 +- package.json | 134 +- popup.html | 34 +- tests/beforeEach.js | 78 +- tests/components/Alert.react.jest.js | 32 +- tests/components/MainList.react.jest.js | 32 +- tests/components/Navbar.react.jest.js | 32 +- tests/components/Options.react.jest.js | 32 +- tests/components/SitesList.react.jest.js | 32 +- tests/components/Wakatime.react.jest.js | 32 +- tests/empty.html | 18 +- tests/helpers/Chrome.spec.js | 22 +- tests/helpers/changeExtensionIcon.spec.js | 18 +- tests/helpers/changeExtensionState.spec.js | 18 +- tests/helpers/changeExtensionTooltip.spec.js | 36 +- tests/helpers/contains.spec.js | 52 +- tests/helpers/getDomainFromUrl.spec.js | 36 +- tests/helpers/in_array.spec.js | 34 +- tests/run.js | 46 +- 81 files changed, 5501 insertions(+), 5496 deletions(-) diff --git a/.bowerrc b/.bowerrc index 64014cf..f6e99c3 100644 --- a/.bowerrc +++ b/.bowerrc @@ -1,3 +1,3 @@ -{ - "directory": "vendor/bower_components" +{ + "directory": "vendor/bower_components" } \ No newline at end of file diff --git a/.gitignore b/.gitignore index d3060e7..9cc95ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,34 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Deployed apps should consider commenting this line out: -# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git -node_modules - -.DS_Store - -vendor/ - -.idea - -# Generated chrome extension -public/ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Deployed apps should consider commenting this line out: +# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git +node_modules + +.DS_Store + +vendor/ + +.idea + +# Generated chrome extension +public/ diff --git a/.jshintignore b/.jshintignore index ce81fa9..1f121d2 100644 --- a/.jshintignore +++ b/.jshintignore @@ -1,5 +1,5 @@ -coverage/ -node_modules/ -public/ -vendor/ +coverage/ +node_modules/ +public/ +vendor/ tests/ \ No newline at end of file diff --git a/.jshintrc b/.jshintrc index 11886c7..d1ea3e8 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,10 +1,10 @@ -{ - "node": true, - "curly": true, - "latedef": true, - "quotmark": true, - "undef": true, - "unused": true, - "trailing": true, - "predef": [ "chrome" ] -} +{ + "node": true, + "curly": true, + "latedef": true, + "quotmark": true, + "undef": true, + "unused": true, + "trailing": true, + "predef": [ "chrome" ] +} diff --git a/.validate.json b/.validate.json index b2f964b..59b78ca 100644 --- a/.validate.json +++ b/.validate.json @@ -1,6 +1,6 @@ -{ - "scripts": { - "lint": "jshint ." - }, - "pre-commit": ["lint", "validate", "test"] -} +{ + "scripts": { + "lint": "jshint ." + }, + "pre-commit": ["lint", "validate", "test"] +} diff --git a/AUTHORS b/AUTHORS index 48186fa..7c2a32a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,14 +1,14 @@ -WakaTime is written and maintained by Alan Hamlett and -various contributors: - - -Development Lead ----------------- - -- Alan Hamlett -- Mario Bašić - - -Patches and Suggestions ------------------------ - +WakaTime is written and maintained by Alan Hamlett and +various contributors: + + +Development Lead +---------------- + +- Alan Hamlett +- Mario Bašić + + +Patches and Suggestions +----------------------- + diff --git a/HISTORY.rst b/HISTORY.rst index 671800b..00fd818 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,24 +1,24 @@ - -History -------- - - -1.0.2 (2016-06-30) -++++++++++++++++++ - -- Fix bug preventing options from saving. #42 - - -1.0.1 (2016-06-29) -++++++++++++++++++ - -- Fix blacklist setting. -- Misc bug fixes related to icon popup. -- Send plugin name and version with heartbeat data. #41 - - -1.0.0 (2016-06-29) -++++++++++++++++++ - -- Birth - + +History +------- + + +1.0.2 (2016-06-30) +++++++++++++++++++ + +- Fix bug preventing options from saving. #42 + + +1.0.1 (2016-06-29) +++++++++++++++++++ + +- Fix blacklist setting. +- Misc bug fixes related to icon popup. +- Send plugin name and version with heartbeat data. #41 + + +1.0.0 (2016-06-29) +++++++++++++++++++ + +- Birth + diff --git a/LICENSE b/LICENSE index 08bb777..4c74f77 100644 --- a/LICENSE +++ b/LICENSE @@ -1,31 +1,31 @@ -BSD 3-Clause License - -Copyright (c) 2014 by the respective authors (see AUTHORS file). -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided - with the distribution. - -* Neither the names of WakaTime, nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +BSD 3-Clause License + +Copyright (c) 2014 by the respective authors (see AUTHORS file). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided + with the distribution. + +* Neither the names of WakaTime, nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 2b59041..b524905 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,75 @@ -chrome-wakatime -=============== - -Automatic time tracking for stats about your website debugging, research, documentation, etc. - - -##Installation - -1. Install the extension: - -[![Chrome Web Store](https://wakatime.com/static/img/chrome-web-store.png)](https://chrome.google.com/webstore/detail/wakatime/jnbbnacmeggbgdjgaoojpmhdlkkpblgi) - -2. Login to [WakaTime](https://wakatime.com/). - -3. Use Chrome like you normally do and your time will be tracked for you automatically. - -4. Visit https://wakatime.com to see your logged time. - -5. Use in conjunction with [other WakaTime plugins](https://wakatime.com/plugins). - - -## Screenshots - -![SC open](./screenshots/sc_6-green.png) - -![SC open](./screenshots/sc_6-open.png) - -![Options SC](./screenshots/sc_8-options.png) - - -## Development instructions - -> For development purposes only. - -To get started, install NPM and Bower dependencies, and do an initial build with Gulp: -``` -npm start -``` - -To build the extension once: - -``` -npm run gulp -``` - -To monitor changes: - -``` -npm run watch -``` - -Run tests: - -``` -npm test -``` - -Lint code *(Both JS and JSX)*: - -``` -jsxhint --jsx-only . -``` - -### Automatic code linting - -There is a precommit hook that lints the code before commiting the changes. - - -### Load unpacked in Chrome - -1. Clone repository to disk -2. Go to `Settings` -> `Extensions` -3. Enable `Developer mode` -4. Click `Load unpacked extension...` -5. Select repository directory +chrome-wakatime +=============== + +Automatic time tracking for stats about your website debugging, research, documentation, etc. + + +##Installation + +1. Install the extension: + +[![Chrome Web Store](https://wakatime.com/static/img/chrome-web-store.png)](https://chrome.google.com/webstore/detail/wakatime/jnbbnacmeggbgdjgaoojpmhdlkkpblgi) + +2. Login to [WakaTime](https://wakatime.com/). + +3. Use Chrome like you normally do and your time will be tracked for you automatically. + +4. Visit https://wakatime.com to see your logged time. + +5. Use in conjunction with [other WakaTime plugins](https://wakatime.com/plugins). + + +## Screenshots + +![SC open](./screenshots/sc_6-green.png) + +![SC open](./screenshots/sc_6-open.png) + +![Options SC](./screenshots/sc_8-options.png) + + +## Development instructions + +> For development purposes only. + +To get started, install NPM and Bower dependencies, and do an initial build with Gulp: +``` +npm start +``` + +To build the extension once: + +``` +npm run gulp +``` + +To monitor changes: + +``` +npm run watch +``` + +Run tests: + +``` +npm test +``` + +Lint code *(Both JS and JSX)*: + +``` +jsxhint --jsx-only . +``` + +### Automatic code linting + +There is a precommit hook that lints the code before commiting the changes. + + +### Load unpacked in Chrome + +1. Clone repository to disk +2. Go to `Settings` -> `Extensions` +3. Enable `Developer mode` +4. Click `Load unpacked extension...` +5. Select repository directory diff --git a/assets/js/app.jsx b/assets/js/app.jsx index 0797c4d..ccec460 100644 --- a/assets/js/app.jsx +++ b/assets/js/app.jsx @@ -1,15 +1,15 @@ - -/* This is a fix for Bootstrap requiring jQuery */ -global.jQuery = require('jquery'); -require('bootstrap'); - -var React = require('react'); -var ReactDOM = require('react-dom'); - -// React components -var WakaTime = require('./components/WakaTime.jsx'); - -ReactDOM.render( - , - document.getElementById('wakatime') -); + +/* This is a fix for Bootstrap requiring jQuery */ +global.jQuery = require('jquery'); +require('bootstrap'); + +var React = require('react'); +var ReactDOM = require('react-dom'); + +// React components +var WakaTime = require('./components/WakaTime.jsx'); + +ReactDOM.render( + , + document.getElementById('wakatime') +); diff --git a/assets/js/components/Alert.jsx b/assets/js/components/Alert.jsx index 5afd0d5..e82d8c5 100644 --- a/assets/js/components/Alert.jsx +++ b/assets/js/components/Alert.jsx @@ -1,19 +1,19 @@ -var React = require('react'); -var classNames = require('classnames'); - -var Alert = React.createClass({ - - propTypes: { - type: React.PropTypes.string.isRequired, - text: React.PropTypes.string.isRequired - }, - - render: function() { - return( -
{this.props.text}
- ); - } - -}); - -module.exports = Alert; +var React = require('react'); +var classNames = require('classnames'); + +var Alert = React.createClass({ + + propTypes: { + type: React.PropTypes.string.isRequired, + text: React.PropTypes.string.isRequired + }, + + render: function() { + return( +
{this.props.text}
+ ); + } + +}); + +module.exports = Alert; diff --git a/assets/js/components/MainList.jsx b/assets/js/components/MainList.jsx index 537c122..76a6443 100644 --- a/assets/js/components/MainList.jsx +++ b/assets/js/components/MainList.jsx @@ -1,106 +1,106 @@ -/* global chrome */ - -var React = require('react'); - -var MainList = React.createClass({ - - _openOptionsPage: function() { - if (chrome.runtime.openOptionsPage) { - // New way to open options pages, if supported (Chrome 42+). - chrome.runtime.openOptionsPage(); - } else { - // Reasonable fallback. - window.open(chrome.runtime.getURL('options.html')); - } - }, - - render: function() { - - var that = this; - - var loginLogoutButton = function() { - if (that.props.loggedIn === true) { - return ( - - ); - } - - return ( - - - Login - - ); - }; - - // If logging is enabled, display that info to user - var loggingStatus = function() { - if(that.props.loggingEnabled === true && that.props.loggedIn === true) - { - return ( -
-
-

- Disable logging -

-
-
- ); - } - else if(that.props.loggingEnabled === false && that.props.loggedIn === true) - { - return ( -
-
-

- Enable logging -

-
-
- ); - } - }; - - var totalTimeLoggedToday = function() { - if (that.props.loggedIn === true) { - return ( -
-
-
-

{that.props.totalTimeLoggedToday}

- TOTAL TIME LOGGED TODAY -
-
-
- ); - } - }; - - return ( -
- - {totalTimeLoggedToday()} - - {loggingStatus()} - -
- - - Options - - - {loginLogoutButton()} - -
-
- ); - } - -}); - -module.exports = MainList; +/* global browser */ + +var React = require('react'); + +var MainList = React.createClass({ + + _openOptionsPage: function() { + if (browser.runtime.openOptionsPage) { + // New way to open options pages, if supported (Chrome 42+). + browser.runtime.openOptionsPage(); + } else { + // Reasonable fallback. + window.open(browser.runtime.getURL('options.html')); + } + }, + + render: function() { + + var that = this; + + var loginLogoutButton = function() { + if (that.props.loggedIn === true) { + return ( + + ); + } + + return ( + + + Login + + ); + }; + + // If logging is enabled, display that info to user + var loggingStatus = function() { + if(that.props.loggingEnabled === true && that.props.loggedIn === true) + { + return ( +
+
+

+ Disable logging +

+
+
+ ); + } + else if(that.props.loggingEnabled === false && that.props.loggedIn === true) + { + return ( +
+
+

+ Enable logging +

+
+
+ ); + } + }; + + var totalTimeLoggedToday = function() { + if (that.props.loggedIn === true) { + return ( +
+
+
+

{that.props.totalTimeLoggedToday}

+ TOTAL TIME LOGGED TODAY +
+
+
+ ); + } + }; + + return ( +
+ + {totalTimeLoggedToday()} + + {loggingStatus()} + +
+ + + Options + + + {loginLogoutButton()} + +
+
+ ); + } + +}); + +module.exports = MainList; diff --git a/assets/js/components/NavBar.jsx b/assets/js/components/NavBar.jsx index 5b2e09a..6950303 100644 --- a/assets/js/components/NavBar.jsx +++ b/assets/js/components/NavBar.jsx @@ -1,89 +1,89 @@ -var React = require('react'); - -var NavBar = React.createClass({ - - render: function() { - - var that = this; - - var signedInAs = function() { - if (that.props.loggedIn === true) { - return ( -

Signed in as {that.props.user.full_name}

- ); - } - }; - - var dashboard = function() { - if (that.props.loggedIn === true) { - return ( -
  • - - - Dashboard - -
  • - ); - } - }; - - var customRules = function() { - if (that.props.loggedIn === true) { - return ( -
  • - - - Custom Rules - -
  • - ); - } - }; - - return ( - - ); - } - -}); - -module.exports = NavBar; +var React = require('react'); + +var NavBar = React.createClass({ + + render: function() { + + var that = this; + + var signedInAs = function() { + if (that.props.loggedIn === true) { + return ( +

    Signed in as {that.props.user.full_name}

    + ); + } + }; + + var dashboard = function() { + if (that.props.loggedIn === true) { + return ( +
  • + + + Dashboard + +
  • + ); + } + }; + + var customRules = function() { + if (that.props.loggedIn === true) { + return ( +
  • + + + Custom Rules + +
  • + ); + } + }; + + return ( + + ); + } + +}); + +module.exports = NavBar; diff --git a/assets/js/components/Options.jsx b/assets/js/components/Options.jsx index ed637f4..e315043 100644 --- a/assets/js/components/Options.jsx +++ b/assets/js/components/Options.jsx @@ -1,214 +1,214 @@ -/* global chrome */ - -var React = require('react'); -var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); - -var config = require('../config'); - -// React components -var Alert = require('./Alert.jsx'); -var SitesList = require('./SitesList.jsx'); - -/** - * One thing to keep in mind is that you cannot use this.refs.blacklist if - * the blacklist select box is not being rendered on the form. - * - * @type {*|Function} - */ -var Options = React.createClass({ - - getInitialState: function () { - return { - theme: config.theme, - blacklist: '', - whitelist: '', - loggingType: config.loggingType, - loggingStyle: config.loggingStyle, - displayAlert: false, - alertType: config.alert.success.type, - alertText: config.alert.success.text - }; - }, - - componentDidMount: function () { - this.restoreSettings(); - }, - - restoreSettings: function () { - var that = this; - - chrome.storage.sync.get({ - theme: config.theme, - blacklist: '', - whitelist: '', - loggingType: config.loggingType, - loggingStyle: config.loggingStyle - }, function (items) { - that.setState({ - theme: items.theme, - blacklist: items.blacklist, - whitelist: items.whitelist, - loggingType: items.loggingType, - loggingStyle: items.loggingStyle - }); - - that.refs.theme.value = items.theme; - that.refs.loggingType.value = items.loggingType; - that.refs.loggingStyle.value = items.loggingStyle; - }); - }, - - _handleSubmit: function (e) { - e.preventDefault(); - - this.saveSettings(); - }, - - saveSettings: function () { - var that = this; - - var theme = this.refs.theme.value.trim(); - var loggingType = this.refs.loggingType.value.trim(); - var loggingStyle = this.refs.loggingStyle.value.trim(); - // Trimming blacklist and whitelist removes blank lines and spaces. - var blacklist = that.state.blacklist.trim(); - var whitelist = that.state.whitelist.trim(); - - // Sync options with google storage. - chrome.storage.sync.set({ - theme: theme, - blacklist: blacklist, - whitelist: whitelist, - loggingType: loggingType, - loggingStyle: loggingStyle - }, function () { - // Set state to be newly entered values. - that.setState({ - theme: theme, - blacklist: blacklist, - whitelist: whitelist, - loggingType: loggingType, - loggingStyle: loggingStyle, - displayAlert: true - }); - }); - }, - - _displayBlackOrWhiteList: function () { - var loggingStyle = this.refs.loggingStyle.value.trim(); - - this.setState({loggingStyle: loggingStyle}); - }, - - _updateBlacklistState: function(sites){ - this.setState({ - blacklist: sites - }); - }, - - _updateWhitelistState: function(sites){ - this.setState({ - whitelist: sites - }); - }, - - render: function () { - - var that = this; - - var alert = function() { - if(that.state.displayAlert === true){ - - setTimeout(function () { - that.setState({displayAlert:false}); - }, 2000); - - return( - - ); - } - }; - - var loggingStyle = function () { - - if (that.state.loggingStyle == 'blacklist') { - return ( - - ); - } - - return ( - - ); - - }; - - return ( -
    -
    -
    - - - {alert()} - - -
    - -
    - - -
    - -
    -
    - - {loggingStyle()} - -
    - - -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    -
    - ); - } -}); - -module.exports = Options; +/* global browser */ + +var React = require('react'); +var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); + +var config = require('../config'); + +// React components +var Alert = require('./Alert.jsx'); +var SitesList = require('./SitesList.jsx'); + +/** + * One thing to keep in mind is that you cannot use this.refs.blacklist if + * the blacklist select box is not being rendered on the form. + * + * @type {*|Function} + */ +var Options = React.createClass({ + + getInitialState: function () { + return { + theme: config.theme, + blacklist: '', + whitelist: '', + loggingType: config.loggingType, + loggingStyle: config.loggingStyle, + displayAlert: false, + alertType: config.alert.success.type, + alertText: config.alert.success.text + }; + }, + + componentDidMount: function () { + this.restoreSettings(); + }, + + restoreSettings: function () { + var that = this; + + browser.storage.sync.get({ + theme: config.theme, + blacklist: '', + whitelist: '', + loggingType: config.loggingType, + loggingStyle: config.loggingStyle + }).then(function (items) { + that.setState({ + theme: items.theme, + blacklist: items.blacklist, + whitelist: items.whitelist, + loggingType: items.loggingType, + loggingStyle: items.loggingStyle + }); + + that.refs.theme.value = items.theme; + that.refs.loggingType.value = items.loggingType; + that.refs.loggingStyle.value = items.loggingStyle; + }); + }, + + _handleSubmit: function (e) { + e.preventDefault(); + + this.saveSettings(); + }, + + saveSettings: function () { + var that = this; + + var theme = this.refs.theme.value.trim(); + var loggingType = this.refs.loggingType.value.trim(); + var loggingStyle = this.refs.loggingStyle.value.trim(); + // Trimming blacklist and whitelist removes blank lines and spaces. + var blacklist = that.state.blacklist.trim(); + var whitelist = that.state.whitelist.trim(); + + // Sync options with google storage. + browser.storage.sync.set({ + theme: theme, + blacklist: blacklist, + whitelist: whitelist, + loggingType: loggingType, + loggingStyle: loggingStyle + }).then(function () { + // Set state to be newly entered values. + that.setState({ + theme: theme, + blacklist: blacklist, + whitelist: whitelist, + loggingType: loggingType, + loggingStyle: loggingStyle, + displayAlert: true + }); + }); + }, + + _displayBlackOrWhiteList: function () { + var loggingStyle = this.refs.loggingStyle.value.trim(); + + this.setState({loggingStyle: loggingStyle}); + }, + + _updateBlacklistState: function(sites){ + this.setState({ + blacklist: sites + }); + }, + + _updateWhitelistState: function(sites){ + this.setState({ + whitelist: sites + }); + }, + + render: function () { + + var that = this; + + var alert = function() { + if(that.state.displayAlert === true){ + + setTimeout(function () { + that.setState({displayAlert:false}); + }, 2000); + + return( + + ); + } + }; + + var loggingStyle = function () { + + if (that.state.loggingStyle == 'blacklist') { + return ( + + ); + } + + return ( + + ); + + }; + + return ( +
    +
    +
    + + + {alert()} + + +
    + +
    + + +
    + +
    +
    + + {loggingStyle()} + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + ); + } +}); + +module.exports = Options; diff --git a/assets/js/components/SitesList.jsx b/assets/js/components/SitesList.jsx index 276f6e0..af034b0 100644 --- a/assets/js/components/SitesList.jsx +++ b/assets/js/components/SitesList.jsx @@ -1,35 +1,35 @@ -var React = require('react'); - -var SitesList = React.createClass({ - - getDefaultProps: function () { - return { - placeholder: 'http://google.com' - }; - }, - - _handleChange: function (event) { - var sites = event.target.value; - - this.props.handleChange(sites); - }, - - render: function () { - - return ( -
    - - -
    - - {this.props.helpText} -
    - One line per site.
    -
    -
    - ); - } -}); - -module.exports = SitesList; +var React = require('react'); + +var SitesList = React.createClass({ + + getDefaultProps: function () { + return { + placeholder: 'http://google.com' + }; + }, + + _handleChange: function (event) { + var sites = event.target.value; + + this.props.handleChange(sites); + }, + + render: function () { + + return ( +
    + + +
    + + {this.props.helpText} +
    + One line per site.
    +
    +
    + ); + } +}); + +module.exports = SitesList; diff --git a/assets/js/components/WakaTime.jsx b/assets/js/components/WakaTime.jsx index bea26f9..10e4105 100644 --- a/assets/js/components/WakaTime.jsx +++ b/assets/js/components/WakaTime.jsx @@ -1,173 +1,173 @@ -/* global chrome */ - -var React = require("react"); -var $ = require('jquery'); - -var config = require('../config'); - -// React components -var NavBar = require('./NavBar.jsx'); -var MainList = require('./MainList.jsx'); - -// Core -var WakaTimeCore = require('../core/WakaTimeCore').default; - -// Helpers -var changeExtensionState = require('../helpers/changeExtensionState'); - -var Wakatime = React.createClass({ - - getInitialState: function() { - return { - user: { - full_name: null, - email: null, - photo: null - }, - loggedIn: false, - loggingEnabled: config.loggingEnabled, - totalTimeLoggedToday: '0 minutes' - }; - }, - - componentDidMount: function() { - - var wakatime = new WakaTimeCore(); - - var that = this; - - wakatime.checkAuth().done(function(data) { - - if (data !== false) { - - chrome.storage.sync.get({ - loggingEnabled: config.loggingEnabled - }, function(items) { - that.setState({loggingEnabled: items.loggingEnabled}); - - if (items.loggingEnabled === true) { - changeExtensionState('allGood'); - } - else { - changeExtensionState('notLogging'); - } - }); - - that.setState({ - user: { - full_name: data.full_name, - email: data.email, - photo: data.photo - }, - loggedIn: true - }); - - wakatime.getTotalTimeLoggedToday().done(function(grand_total) { - that.setState({ - totalTimeLoggedToday: grand_total.text - }); - }); - } - else { - changeExtensionState('notSignedIn'); - } - }); - - }, - - logoutUser: function() { - var deferredObject = $.Deferred(); - - var that = this; - - $.ajax({ - url: config.logoutUserUrl, - method: 'GET', - success: function() { - - deferredObject.resolve(that); - - }, - error: function(xhr, status, err) { - - console.error(config.logoutUserUrl, status, err.toString()); - - deferredObject.resolve(that); - } - }); - - return deferredObject.promise(); - }, - - _logoutUser: function() { - - var that = this; - - this.logoutUser().done(function(){ - - that.setState({ - user: { - full_name: null, - email: null, - photo: null - }, - loggedIn: false, - loggingEnabled: false - }); - - changeExtensionState('notSignedIn'); - - }); - }, - - _disableLogging: function() { - this.setState({ - loggingEnabled: false - }); - - changeExtensionState('notLogging'); - - chrome.storage.sync.set({ - loggingEnabled: false - }); - }, - - _enableLogging: function() { - this.setState({ - loggingEnabled: true - }); - - changeExtensionState('allGood'); - - chrome.storage.sync.set({ - loggingEnabled: true - }); - }, - - render: function() { - return ( -
    - -
    -
    -
    - -
    -
    -
    -
    - ); - } - -}); - -module.exports = Wakatime; +/* global browser */ + +var React = require("react"); +var $ = require('jquery'); + +var config = require('../config'); + +// React components +var NavBar = require('./NavBar.jsx'); +var MainList = require('./MainList.jsx'); + +// Core +var WakaTimeCore = require('../core/WakaTimeCore').default; + +// Helpers +var changeExtensionState = require('../helpers/changeExtensionState'); + +var Wakatime = React.createClass({ + + getInitialState: function() { + return { + user: { + full_name: null, + email: null, + photo: null + }, + loggedIn: false, + loggingEnabled: config.loggingEnabled, + totalTimeLoggedToday: '0 minutes' + }; + }, + + componentDidMount: function() { + + var wakatime = new WakaTimeCore(); + + var that = this; + + wakatime.checkAuth().done(function(data) { + + if (data !== false) { + + browser.storage.sync.get({ + loggingEnabled: config.loggingEnabled + }).then(function(items) { + that.setState({loggingEnabled: items.loggingEnabled}); + + if (items.loggingEnabled === true) { + changeExtensionState('allGood'); + } + else { + changeExtensionState('notLogging'); + } + }); + + that.setState({ + user: { + full_name: data.full_name, + email: data.email, + photo: data.photo + }, + loggedIn: true + }); + + wakatime.getTotalTimeLoggedToday().done(function(grand_total) { + that.setState({ + totalTimeLoggedToday: grand_total.text + }); + }); + } + else { + changeExtensionState('notSignedIn'); + } + }); + + }, + + logoutUser: function() { + var deferredObject = $.Deferred(); + + var that = this; + + $.ajax({ + url: config.logoutUserUrl, + method: 'GET', + success: function() { + + deferredObject.resolve(that); + + }, + error: function(xhr, status, err) { + + console.error(config.logoutUserUrl, status, err.toString()); + + deferredObject.resolve(that); + } + }); + + return deferredObject.promise(); + }, + + _logoutUser: function() { + + var that = this; + + this.logoutUser().done(function(){ + + that.setState({ + user: { + full_name: null, + email: null, + photo: null + }, + loggedIn: false, + loggingEnabled: false + }); + + changeExtensionState('notSignedIn'); + + }); + }, + + _disableLogging: function() { + this.setState({ + loggingEnabled: false + }); + + changeExtensionState('notLogging'); + + browser.storage.sync.set({ + loggingEnabled: false + }); + }, + + _enableLogging: function() { + this.setState({ + loggingEnabled: true + }); + + changeExtensionState('allGood'); + + browser.storage.sync.set({ + loggingEnabled: true + }); + }, + + render: function() { + return ( +
    + +
    +
    +
    + +
    +
    +
    +
    + ); + } + +}); + +module.exports = Wakatime; diff --git a/assets/js/config.js b/assets/js/config.js index 80e5fed..b0dda1d 100644 --- a/assets/js/config.js +++ b/assets/js/config.js @@ -1,67 +1,67 @@ -/* global chrome */ -//jshint esnext:true - -var config = { - // Extension name - name: 'WakaTime', - // Extension version - version: chrome.app.getDetails().version, - // Time for idle state of the browser - // The user is considered idle if there was - // no activity in the browser for x seconds - detectionIntervalInSeconds: 60, - // Default logging style - // Log all except blacklisted sites - // or log only the white listed sites. - loggingStyle: 'blacklist', - // Default logging type - loggingType: 'domain', - // By default logging is enabled - loggingEnabled: true, - // Url to which to send the heartbeat - heartbeatApiUrl: 'https://api.wakatime.com/api/v1/users/current/heartbeats', - // Url from which to detect if the user is logged in - currentUserApiUrl: 'https://api.wakatime.com/api/v1/users/current', - // The url to logout the user from wakatime - logoutUserUrl: 'https://wakatime.com/logout', - // Gets stats from the WakaTime API - summariesApiUrl: 'https://api.wakatime.com/api/v1/users/current/summaries', - // Different colors for different states of the extension - colors: { - allGood: '', - notLogging: 'gray', - notSignedIn: 'red', - lightTheme: 'white' - }, - // Tooltips for each of the extension states - tooltips: { - allGood: '', - notLogging: 'Not logging', - notSignedIn: 'Not signed In', - blacklisted: 'This URL is blacklisted', - whitelisted: 'This URL is not on your whitelist' - }, - // Default theme - theme: 'light', - // Valid extension states - states: [ - 'allGood', - 'notLogging', - 'notSignedIn', - 'blacklisted', - 'whitelisted' - ], - // Predefined alert type and text for success and failure. - alert: { - success: { - type: 'success', - text: 'Options have been saved!' - }, - failure: { - type: 'danger', - text: 'There was an error while saving the options!' - } - } -}; - -module.exports = config; +/* global browser */ +//jshint esnext:true + +var config = { + // Extension name + name: 'WakaTime', + // Extension version + version: browser.runtime.getManifest().version, + // Time for idle state of the browser + // The user is considered idle if there was + // no activity in the browser for x seconds + detectionIntervalInSeconds: 60, + // Default logging style + // Log all except blacklisted sites + // or log only the white listed sites. + loggingStyle: 'blacklist', + // Default logging type + loggingType: 'domain', + // By default logging is enabled + loggingEnabled: true, + // Url to which to send the heartbeat + heartbeatApiUrl: 'https://api.wakatime.com/api/v1/users/current/heartbeats', + // Url from which to detect if the user is logged in + currentUserApiUrl: 'https://api.wakatime.com/api/v1/users/current', + // The url to logout the user from wakatime + logoutUserUrl: 'https://wakatime.com/logout', + // Gets stats from the WakaTime API + summariesApiUrl: 'https://api.wakatime.com/api/v1/users/current/summaries', + // Different colors for different states of the extension + colors: { + allGood: '', + notLogging: 'gray', + notSignedIn: 'red', + lightTheme: 'white' + }, + // Tooltips for each of the extension states + tooltips: { + allGood: '', + notLogging: 'Not logging', + notSignedIn: 'Not signed In', + blacklisted: 'This URL is blacklisted', + whitelisted: 'This URL is not on your whitelist' + }, + // Default theme + theme: 'light', + // Valid extension states + states: [ + 'allGood', + 'notLogging', + 'notSignedIn', + 'blacklisted', + 'whitelisted' + ], + // Predefined alert type and text for success and failure. + alert: { + success: { + type: 'success', + text: 'Options have been saved!' + }, + failure: { + type: 'danger', + text: 'There was an error while saving the options!' + } + } +}; + +module.exports = config; diff --git a/assets/js/core/WakaTimeCore.js b/assets/js/core/WakaTimeCore.js index 2c10bc3..e184539 100644 --- a/assets/js/core/WakaTimeCore.js +++ b/assets/js/core/WakaTimeCore.js @@ -1,256 +1,256 @@ -/* global chrome */ -//jshint esnext:true - -var $ = require('jquery'); -var moment = require('moment'); - -var config = require('./../config'); - -// Helpers -var getDomainFromUrl = require('./../helpers/getDomainFromUrl'); -var changeExtensionState = require('../helpers/changeExtensionState'); -var in_array = require('./../helpers/in_array'); -var contains = require('./../helpers/contains'); - -class WakaTimeCore { - - constructor() { - this.tabsWithDevtoolsOpen = []; - } - - /** - * Settter for tabsWithDevtoolsOpen - * - * @param tabs - */ - setTabsWithDevtoolsOpen(tabs) { - this.tabsWithDevtoolsOpen = tabs; - } - - getTotalTimeLoggedToday() { - var deferredObject = $.Deferred(); - - var today = moment().format('YYYY-MM-DD'); - - $.ajax({ - url: config.summariesApiUrl + '?start=' + today + '&end=' + today, - dataType: 'json', - success: (data) => { - - deferredObject.resolve(data.data[0].grand_total); - - }, - error: (xhr, status, err) => { - - console.error(config.summariesApiUrl, status, err.toString()); - - deferredObject.resolve(false); - } - }); - - return deferredObject.promise(); - } - - /** - * Checks if the user is logged in. - * - * @returns {*} - */ - checkAuth() { - var deferredObject = $.Deferred(); - - $.ajax({ - url: config.currentUserApiUrl, - dataType: 'json', - success: (data) => { - - deferredObject.resolve(data.data); - - }, - error: (xhr, status, err) => { - - console.error(config.currentUserApiUrl, status, err.toString()); - - deferredObject.resolve(false); - } - }); - - return deferredObject.promise(); - } - - /** - * Depending on various factors detects the current active tab URL or domain, - * and sends it to WakaTime for logging. - */ - recordHeartbeat() { - - chrome.storage.sync.get({ - loggingEnabled: config.loggingEnabled, - loggingStyle: config.loggingStyle, - blacklist: '', - whitelist: '' - }, (items) => { - if (items.loggingEnabled === true) { - - changeExtensionState('allGood'); - - chrome.idle.queryState(config.detectionIntervalInSeconds, (newState) => { - - if (newState === 'active') { - // Get current tab URL. - chrome.tabs.query({active: true}, (tabs) => { - - var currentActiveTab = tabs[0]; - - var debug = false; - // If the current active tab has devtools open - if (in_array(currentActiveTab.id, this.tabsWithDevtoolsOpen)) debug = true; - - if (items.loggingStyle == 'blacklist') { - if (! contains(currentActiveTab.url, items.blacklist)) { - this.sendHeartbeat(currentActiveTab.url, debug); - } - else { - changeExtensionState('blacklisted'); - console.log(currentActiveTab.url + ' is on a blacklist.'); - } - } - - if (items.loggingStyle == 'whitelist') { - if (contains(currentActiveTab.url, items.whitelist)) { - this.sendHeartbeat(currentActiveTab.url, debug); - } - else { - changeExtensionState('whitelisted'); - console.log(currentActiveTab.url + ' is not on a whitelist.'); - } - } - - }); - } - }); - } - else { - changeExtensionState('notLogging'); - } - }); - } - - /** - * Creates payload for the heartbeat and returns it as JSON. - * - * @param entity - * @param type - * @param debug - * @returns {*} - * @private - */ - _preparePayload(entity, type, debug = false) { - return JSON.stringify({ - entity: entity, - type: type, - time: moment().format('X'), - project: '<>', - is_debugging: debug, - plugin: 'chrome-wakatime/' + config.version - }); - } - - - /** - * Returns a promise with logging type variable. - * - * @returns {*} - * @private - */ - _getLoggingType() { - var deferredObject = $.Deferred(); - - chrome.storage.sync.get({ - loggingType: config.loggingType - }, function (items) { - deferredObject.resolve(items.loggingType); - }); - - return deferredObject.promise(); - } - - /** - * Given the entity and logging type it creates a payload and - * sends an ajax post request to the API. - * - * @param entity - * @param debug - */ - sendHeartbeat(entity, debug) { - - var payload = null; - - this._getLoggingType().done((loggingType) => { - - // Get only the domain from the entity. - // And send that in heartbeat - if (loggingType == 'domain') { - - var domain = getDomainFromUrl(entity); - - payload = this._preparePayload(domain, 'domain', debug); - - console.log(payload); - - this.sendAjaxRequestToApi(payload); - - } - // Send entity in heartbeat - else if (loggingType == 'url') { - payload = this._preparePayload(entity, 'url', debug); - - console.log(payload); - - this.sendAjaxRequestToApi(payload); - } - - }); - } - - /** - * Sends AJAX request with payload to the heartbeat API as JSON. - * - * @param payload - * @param method - * @returns {*} - */ - sendAjaxRequestToApi(payload, method = 'POST') { - - var deferredObject = $.Deferred(); - - $.ajax({ - url: config.heartbeatApiUrl, - dataType: 'json', - contentType: 'application/json', - method: method, - data: payload, - statusCode: { - 401: function () { - changeExtensionState('notSignedIn'); - }, - 201: function () { - // nothing to do here - } - }, - success: (response) => { - deferredObject.resolve(this); - }, - error: (xhr, status, err) => { - console.error(config.heartbeatApiUrl, status, err.toString()); - - deferredObject.resolve(this); - } - }); - - return deferredObject.promise(); - } - -} - -export default WakaTimeCore; +/* global browser */ +//jshint esnext:true + +var $ = require('jquery'); +var moment = require('moment'); + +var config = require('./../config'); + +// Helpers +var getDomainFromUrl = require('./../helpers/getDomainFromUrl'); +var changeExtensionState = require('../helpers/changeExtensionState'); +var in_array = require('./../helpers/in_array'); +var contains = require('./../helpers/contains'); + +class WakaTimeCore { + + constructor() { + this.tabsWithDevtoolsOpen = []; + } + + /** + * Settter for tabsWithDevtoolsOpen + * + * @param tabs + */ + setTabsWithDevtoolsOpen(tabs) { + this.tabsWithDevtoolsOpen = tabs; + } + + getTotalTimeLoggedToday() { + var deferredObject = $.Deferred(); + + var today = moment().format('YYYY-MM-DD'); + + $.ajax({ + url: config.summariesApiUrl + '?start=' + today + '&end=' + today, + dataType: 'json', + success: (data) => { + + deferredObject.resolve(data.data[0].grand_total); + + }, + error: (xhr, status, err) => { + + console.error(config.summariesApiUrl, status, err.toString()); + + deferredObject.resolve(false); + } + }); + + return deferredObject.promise(); + } + + /** + * Checks if the user is logged in. + * + * @returns {*} + */ + checkAuth() { + var deferredObject = $.Deferred(); + + $.ajax({ + url: config.currentUserApiUrl, + dataType: 'json', + success: (data) => { + + deferredObject.resolve(data.data); + + }, + error: (xhr, status, err) => { + + console.error(config.currentUserApiUrl, status, err.toString()); + + deferredObject.resolve(false); + } + }); + + return deferredObject.promise(); + } + + /** + * Depending on various factors detects the current active tab URL or domain, + * and sends it to WakaTime for logging. + */ + recordHeartbeat() { + + browser.storage.sync.get({ + loggingEnabled: config.loggingEnabled, + loggingStyle: config.loggingStyle, + blacklist: '', + whitelist: '' + }).then((items) => { + if (items.loggingEnabled === true) { + + changeExtensionState('allGood'); + + browser.idle.queryState(config.detectionIntervalInSeconds).then((newState) => { + + if (newState === 'active') { + // Get current tab URL. + browser.tabs.query({active: true}).then((tabs) => { + + var currentActiveTab = tabs[0]; + + var debug = false; + // If the current active tab has devtools open + if (in_array(currentActiveTab.id, this.tabsWithDevtoolsOpen)) debug = true; + + if (items.loggingStyle == 'blacklist') { + if (! contains(currentActiveTab.url, items.blacklist)) { + this.sendHeartbeat(currentActiveTab.url, debug); + } + else { + changeExtensionState('blacklisted'); + console.log(currentActiveTab.url + ' is on a blacklist.'); + } + } + + if (items.loggingStyle == 'whitelist') { + if (contains(currentActiveTab.url, items.whitelist)) { + this.sendHeartbeat(currentActiveTab.url, debug); + } + else { + changeExtensionState('whitelisted'); + console.log(currentActiveTab.url + ' is not on a whitelist.'); + } + } + + }); + } + }); + } + else { + changeExtensionState('notLogging'); + } + }); + } + + /** + * Creates payload for the heartbeat and returns it as JSON. + * + * @param entity + * @param type + * @param debug + * @returns {*} + * @private + */ + _preparePayload(entity, type, debug = false) { + return JSON.stringify({ + entity: entity, + type: type, + time: moment().format('X'), + project: '<>', + is_debugging: debug, + plugin: 'browser-wakatime/' + config.version + }); + } + + + /** + * Returns a promise with logging type variable. + * + * @returns {*} + * @private + */ + _getLoggingType() { + var deferredObject = $.Deferred(); + + browser.storage.sync.get({ + loggingType: config.loggingType + }).then(function (items) { + deferredObject.resolve(items.loggingType); + }); + + return deferredObject.promise(); + } + + /** + * Given the entity and logging type it creates a payload and + * sends an ajax post request to the API. + * + * @param entity + * @param debug + */ + sendHeartbeat(entity, debug) { + + var payload = null; + + this._getLoggingType().done((loggingType) => { + + // Get only the domain from the entity. + // And send that in heartbeat + if (loggingType == 'domain') { + + var domain = getDomainFromUrl(entity); + + payload = this._preparePayload(domain, 'domain', debug); + + console.log(payload); + + this.sendAjaxRequestToApi(payload); + + } + // Send entity in heartbeat + else if (loggingType == 'url') { + payload = this._preparePayload(entity, 'url', debug); + + console.log(payload); + + this.sendAjaxRequestToApi(payload); + } + + }); + } + + /** + * Sends AJAX request with payload to the heartbeat API as JSON. + * + * @param payload + * @param method + * @returns {*} + */ + sendAjaxRequestToApi(payload, method = 'POST') { + + var deferredObject = $.Deferred(); + + $.ajax({ + url: config.heartbeatApiUrl, + dataType: 'json', + contentType: 'application/json', + method: method, + data: payload, + statusCode: { + 401: function () { + changeExtensionState('notSignedIn'); + }, + 201: function () { + // nothing to do here + } + }, + success: (response) => { + deferredObject.resolve(this); + }, + error: (xhr, status, err) => { + console.error(config.heartbeatApiUrl, status, err.toString()); + + deferredObject.resolve(this); + } + }); + + return deferredObject.promise(); + } + +} + +export default WakaTimeCore; diff --git a/assets/js/devtools.js b/assets/js/devtools.js index 3638189..4521356 100644 --- a/assets/js/devtools.js +++ b/assets/js/devtools.js @@ -1,12 +1,12 @@ -/* global chrome */ - -// Create a connection to the background page -var backgroundPageConnection = chrome.runtime.connect({ - name: "devtools-page" -}); - -// Send a message to background page with the current active tabId -backgroundPageConnection.postMessage({ - name: 'init', - tabId: chrome.devtools.inspectedWindow.tabId -}); +/* global browser */ + +// Create a connection to the background page +var backgroundPageConnection = browser.runtime.connect({ + name: "devtools-page" +}); + +// Send a message to background page with the current active tabId +backgroundPageConnection.postMessage({ + name: 'init', + tabId: browser.devtools.inspectedWindow.tabId +}); diff --git a/assets/js/events.js b/assets/js/events.js index 144ce83..6660615 100644 --- a/assets/js/events.js +++ b/assets/js/events.js @@ -1,100 +1,100 @@ -/* global chrome */ - -// Core -var WakaTimeCore = require("./core/WakaTimeCore").default; - -// initialize class -var wakatime = new WakaTimeCore(); - -// Holds currently open connections (ports) with devtools -// Uses tabId as index key. -var connections = {}; - -// Add a listener to resolve alarms -chrome.alarms.onAlarm.addListener(function (alarm) { - // |alarm| can be undefined because onAlarm also gets called from - // window.setTimeout on old chrome versions. - if (alarm && alarm.name == 'heartbeatAlarm') { - - console.log('recording a heartbeat - alarm triggered'); - - wakatime.recordHeartbeat(); - } -}); - -// Create a new alarm for heartbeats. -chrome.alarms.create('heartbeatAlarm', {periodInMinutes: 2}); - -/** - * Whenever a active tab is changed it records a heartbeat with that tab url. - */ -chrome.tabs.onActivated.addListener(function (activeInfo) { - - chrome.tabs.get(activeInfo.tabId, function (tab) { - - console.log('recording a heartbeat - active tab changed'); - - wakatime.recordHeartbeat(); - }); - -}); - -/** - * Whenever any tab is updated it checks if the updated tab is the tab that is - * currently active and if it is, then it records a heartbeat. - */ -chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { - - if (changeInfo.status === 'complete') { - // Get current tab URL. - chrome.tabs.query({active: true}, function(tabs) { - // If tab updated is the same as active tab - if (tabId == tabs[0].id) { - console.log('recording a heartbeat - tab updated'); - - wakatime.recordHeartbeat(); - } - }); - } - -}); - - -/** - * This is in charge of detecting if devtools are opened or closed - * and sending a heartbeat depending on that. - */ -chrome.runtime.onConnect.addListener(function (port) { - - if (port.name == "devtools-page") { - - // Listen to messages sent from the DevTools page - port.onMessage.addListener(function (message, sender, sendResponse) { - if (message.name == "init") { - - connections[message.tabId] = port; - - wakatime.setTabsWithDevtoolsOpen(Object.keys(connections)); - - wakatime.recordHeartbeat(); - } - }); - - port.onDisconnect.addListener(function (port) { - - var tabs = Object.keys(connections); - - for (var i = 0, len = tabs.length; i < len; i ++) { - if (connections[tabs[i]] == port) { - delete connections[tabs[i]]; - break; - } - } - - wakatime.setTabsWithDevtoolsOpen(Object.keys(connections)); - - wakatime.recordHeartbeat(); - }); - - } -}); +/* global browser */ + +// Core +var WakaTimeCore = require("./core/WakaTimeCore").default; + +// initialize class +var wakatime = new WakaTimeCore(); + +// Holds currently open connections (ports) with devtools +// Uses tabId as index key. +var connections = {}; + +// Add a listener to resolve alarms +browser.alarms.onAlarm.addListener(function (alarm) { + // |alarm| can be undefined because onAlarm also gets called from + // window.setTimeout on old chrome versions. + if (alarm && alarm.name == 'heartbeatAlarm') { + + console.log('recording a heartbeat - alarm triggered'); + + wakatime.recordHeartbeat(); + } +}); + +// Create a new alarm for heartbeats. +browser.alarms.create('heartbeatAlarm', {periodInMinutes: 2}); + +/** + * Whenever a active tab is changed it records a heartbeat with that tab url. + */ +browser.tabs.onActivated.addListener(function (activeInfo) { + + browser.tabs.get(activeInfo.tabId).then(function (tab) { + + console.log('recording a heartbeat - active tab changed'); + + wakatime.recordHeartbeat(); + }); + +}); + +/** + * Whenever any tab is updated it checks if the updated tab is the tab that is + * currently active and if it is, then it records a heartbeat. + */ +browser.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { + + if (changeInfo.status === 'complete') { + // Get current tab URL. + browser.tabs.query({active: true}).then(function(tabs) { + // If tab updated is the same as active tab + if (tabId == tabs[0].id) { + console.log('recording a heartbeat - tab updated'); + + wakatime.recordHeartbeat(); + } + }); + } + +}); + + +/** + * This is in charge of detecting if devtools are opened or closed + * and sending a heartbeat depending on that. + */ +browser.runtime.onConnect.addListener(function (port) { + + if (port.name == "devtools-page") { + + // Listen to messages sent from the DevTools page + port.onMessage.addListener(function (message, sender, sendResponse) { + if (message.name == "init") { + + connections[message.tabId] = port; + + wakatime.setTabsWithDevtoolsOpen(Object.keys(connections)); + + wakatime.recordHeartbeat(); + } + }); + + port.onDisconnect.addListener(function (port) { + + var tabs = Object.keys(connections); + + for (var i = 0, len = tabs.length; i < len; i ++) { + if (connections[tabs[i]] == port) { + delete connections[tabs[i]]; + break; + } + } + + wakatime.setTabsWithDevtoolsOpen(Object.keys(connections)); + + wakatime.recordHeartbeat(); + }); + + } +}); diff --git a/assets/js/helpers/changeExtensionIcon.js b/assets/js/helpers/changeExtensionIcon.js index 7f7cdf9..3979a43 100644 --- a/assets/js/helpers/changeExtensionIcon.js +++ b/assets/js/helpers/changeExtensionIcon.js @@ -1,50 +1,50 @@ -/* global chrome */ - -var config = require('../config'); - -/** - * It changes the extension icon color. - * Supported values are: 'red', 'white', 'gray' and ''. - * - * @param color - */ -function changeExtensionIcon(color) { - - color = color ? color : ''; - - var path = null; - - if (color !== '') { - color = '-' + color; - - path = './graphics/wakatime-logo-38' + color + '.png'; - - chrome.browserAction.setIcon({ - path: path - }); - } - - if (color === '') { - chrome.storage.sync.get({ - theme: config.theme - }, function (items) { - if (items.theme == config.theme) { - path = './graphics/wakatime-logo-38.png'; - - chrome.browserAction.setIcon({ - path: path - }); - } - else { - path = './graphics/wakatime-logo-38-white.png'; - - chrome.browserAction.setIcon({ - path: path - }); - } - }); - } - -} - -module.exports = changeExtensionIcon; +/* global browser */ + +var config = require('../config'); + +/** + * It changes the extension icon color. + * Supported values are: 'red', 'white', 'gray' and ''. + * + * @param color + */ +function changeExtensionIcon(color) { + + color = color ? color : ''; + + var path = null; + + if (color !== '') { + color = '-' + color; + + path = './graphics/wakatime-logo-38' + color + '.png'; + + browser.browserAction.setIcon({ + path: path + }); + } + + if (color === '') { + browser.storage.sync.get({ + theme: config.theme + }).then(function (items) { + if (items.theme == config.theme) { + path = './graphics/wakatime-logo-38.png'; + + browser.browserAction.setIcon({ + path: path + }); + } + else { + path = './graphics/wakatime-logo-38-white.png'; + + browser.browserAction.setIcon({ + path: path + }); + } + }); + } + +} + +module.exports = changeExtensionIcon; diff --git a/assets/js/helpers/changeExtensionState.js b/assets/js/helpers/changeExtensionState.js index e879059..812447a 100644 --- a/assets/js/helpers/changeExtensionState.js +++ b/assets/js/helpers/changeExtensionState.js @@ -1,42 +1,42 @@ -var config = require('../config'); - -// Helpers -var changeExtensionIcon = require('./changeExtensionIcon'); -var changeExtensionTooltip = require('./changeExtensionTooltip'); -var in_array = require('./in_array'); - -/** - * Sets the current state of the extension. - * - * @param state - */ -function changeExtensionState(state) { - if (! in_array(state, config.states)) { - throw new Error('Not a valid state!'); - } - - switch (state) { - case 'allGood': - changeExtensionIcon(config.colors.allGood); - changeExtensionTooltip(config.tooltips.allGood); - break; - case 'notLogging': - changeExtensionIcon(config.colors.notLogging); - changeExtensionTooltip(config.tooltips.notLogging); - break; - case 'notSignedIn': - changeExtensionIcon(config.colors.notSignedIn); - changeExtensionTooltip(config.tooltips.notSignedIn); - break; - case 'blacklisted': - changeExtensionIcon(config.colors.notLogging); - changeExtensionTooltip(config.tooltips.blacklisted); - break; - case 'whitelisted': - changeExtensionIcon(config.colors.notLogging); - changeExtensionTooltip(config.tooltips.whitelisted); - break; - } -} - +var config = require('../config'); + +// Helpers +var changeExtensionIcon = require('./changeExtensionIcon'); +var changeExtensionTooltip = require('./changeExtensionTooltip'); +var in_array = require('./in_array'); + +/** + * Sets the current state of the extension. + * + * @param state + */ +function changeExtensionState(state) { + if (! in_array(state, config.states)) { + throw new Error('Not a valid state!'); + } + + switch (state) { + case 'allGood': + changeExtensionIcon(config.colors.allGood); + changeExtensionTooltip(config.tooltips.allGood); + break; + case 'notLogging': + changeExtensionIcon(config.colors.notLogging); + changeExtensionTooltip(config.tooltips.notLogging); + break; + case 'notSignedIn': + changeExtensionIcon(config.colors.notSignedIn); + changeExtensionTooltip(config.tooltips.notSignedIn); + break; + case 'blacklisted': + changeExtensionIcon(config.colors.notLogging); + changeExtensionTooltip(config.tooltips.blacklisted); + break; + case 'whitelisted': + changeExtensionIcon(config.colors.notLogging); + changeExtensionTooltip(config.tooltips.whitelisted); + break; + } +} + module.exports = changeExtensionState; \ No newline at end of file diff --git a/assets/js/helpers/changeExtensionTooltip.js b/assets/js/helpers/changeExtensionTooltip.js index ac6620d..665560d 100644 --- a/assets/js/helpers/changeExtensionTooltip.js +++ b/assets/js/helpers/changeExtensionTooltip.js @@ -1,22 +1,22 @@ -/* global chrome */ - -var config = require('../config'); - -/** - * It changes the extension title - * - * @param text - */ -function changeExtensionTooltip(text) { - - if (text === '') { - text = config.name; - } - else { - text = config.name + ' - ' + text; - } - - chrome.browserAction.setTitle({title: text}); -} - +/* global browser */ + +var config = require('../config'); + +/** + * It changes the extension title + * + * @param text + */ +function changeExtensionTooltip(text) { + + if (text === '') { + text = config.name; + } + else { + text = config.name + ' - ' + text; + } + + browser.browserAction.setTitle({title: text}); +} + module.exports = changeExtensionTooltip; \ No newline at end of file diff --git a/assets/js/helpers/contains.js b/assets/js/helpers/contains.js index cd9c53f..bfe58f9 100644 --- a/assets/js/helpers/contains.js +++ b/assets/js/helpers/contains.js @@ -1,29 +1,29 @@ -/** - * Creates an array from list using \n as delimiter - * and checks if any element in list is contained in the url. - * - * @param url - * @param list - * @returns {boolean} - */ -function contains(url, list) { - var lines = list.split('\n'); - - for (var i = 0; i < lines.length; i ++) { - - // Trim all lines from the list one by one - var cleanLine = lines[i].trim(); - - // If by any chance one line in the list is empty, ignore it - if(cleanLine === '') continue; - - // If url contains the current line return true - if (url.indexOf(cleanLine) > -1) { - return true; - } - } - - return false; -} - -module.exports = contains; +/** + * Creates an array from list using \n as delimiter + * and checks if any element in list is contained in the url. + * + * @param url + * @param list + * @returns {boolean} + */ +function contains(url, list) { + var lines = list.split('\n'); + + for (var i = 0; i < lines.length; i ++) { + + // Trim all lines from the list one by one + var cleanLine = lines[i].trim(); + + // If by any chance one line in the list is empty, ignore it + if(cleanLine === '') continue; + + // If url contains the current line return true + if (url.indexOf(cleanLine) > -1) { + return true; + } + } + + return false; +} + +module.exports = contains; diff --git a/assets/js/helpers/getDomainFromUrl.js b/assets/js/helpers/getDomainFromUrl.js index 4195875..1b28886 100644 --- a/assets/js/helpers/getDomainFromUrl.js +++ b/assets/js/helpers/getDomainFromUrl.js @@ -1,13 +1,13 @@ -/** - * Returns domain from given URL. - * - * @param url - * @returns {string} - */ -function getDomainFromUrl(url) { - var parts = url.split('/'); - - return parts[0] + "//" + parts[2]; -} - +/** + * Returns domain from given URL. + * + * @param url + * @returns {string} + */ +function getDomainFromUrl(url) { + var parts = url.split('/'); + + return parts[0] + "//" + parts[2]; +} + module.exports = getDomainFromUrl; \ No newline at end of file diff --git a/assets/js/helpers/in_array.js b/assets/js/helpers/in_array.js index 66ccbde..9d87f7b 100644 --- a/assets/js/helpers/in_array.js +++ b/assets/js/helpers/in_array.js @@ -1,18 +1,18 @@ -/** - * Returns boolean if needle is found in haystack or not. - * - * @param needle - * @param haystack - * @returns {boolean} - */ -function in_array(needle, haystack) { - for (var i = 0; i < haystack.length; i ++) { - if (needle == haystack[i]) { - return true; - } - } - - return false; -} - +/** + * Returns boolean if needle is found in haystack or not. + * + * @param needle + * @param haystack + * @returns {boolean} + */ +function in_array(needle, haystack) { + for (var i = 0; i < haystack.length; i ++) { + if (needle == haystack[i]) { + return true; + } + } + + return false; +} + module.exports = in_array; \ No newline at end of file diff --git a/assets/js/options.jsx b/assets/js/options.jsx index e171c53..91b61dd 100644 --- a/assets/js/options.jsx +++ b/assets/js/options.jsx @@ -1,16 +1,16 @@ -/* global chrome */ - -/* This is a fix for Bootstrap requiring jQuery */ -global.jQuery = require('jquery'); -require('bootstrap'); - -var React = require('react'); -var ReactDOM = require('react-dom'); - -// React components -var Options = require('./components/Options.jsx'); - -ReactDOM.render( - , - document.getElementById('wakatime-options') -); +/* global browser */ + +/* This is a fix for Bootstrap requiring jQuery */ +global.jQuery = require('jquery'); +require('bootstrap'); + +var React = require('react'); +var ReactDOM = require('react-dom'); + +// React components +var Options = require('./components/Options.jsx'); + +ReactDOM.render( + , + document.getElementById('wakatime-options') +); diff --git a/assets/less/app.less b/assets/less/app.less index 4debeed..185950f 100644 --- a/assets/less/app.less +++ b/assets/less/app.less @@ -1,30 +1,30 @@ -@import "bootstrap/bootstrap"; -@import "font-awesome/font-awesome"; -@import "bootswatch/paper/bootswatch"; -@import "bootswatch/paper/variables"; -@import "variables"; -@import "partials/_animations"; - -body { - min-width: 357px; -} - -a.navbar-brand { - img { - margin-top: -12px; - float: left; - margin-right: 7px; - } -} - -div.container { - margin-top: 20px; -} - -canvas#icon { - display: none; -} - -div#status { - display: none; -} +@import "bootstrap/bootstrap"; +@import "font-awesome/font-awesome"; +@import "bootswatch/paper/bootswatch"; +@import "bootswatch/paper/variables"; +@import "variables"; +@import "partials/_animations"; + +body { + min-width: 357px; +} + +a.navbar-brand { + img { + margin-top: -12px; + float: left; + margin-right: 7px; + } +} + +div.container { + margin-top: 20px; +} + +canvas#icon { + display: none; +} + +div#status { + display: none; +} diff --git a/assets/less/bootstrap/.csscomb.json b/assets/less/bootstrap/.csscomb.json index 40695a4..388f36b 100644 --- a/assets/less/bootstrap/.csscomb.json +++ b/assets/less/bootstrap/.csscomb.json @@ -1,304 +1,304 @@ -{ - "always-semicolon": true, - "block-indent": 2, - "color-case": "lower", - "color-shorthand": true, - "element-case": "lower", - "eof-newline": true, - "leading-zero": false, - "remove-empty-rulesets": true, - "space-after-colon": 1, - "space-after-combinator": 1, - "space-before-selector-delimiter": 0, - "space-between-declarations": "\n", - "space-after-opening-brace": "\n", - "space-before-closing-brace": "\n", - "space-before-colon": 0, - "space-before-combinator": 1, - "space-before-opening-brace": 1, - "strip-spaces": true, - "unitless-zero": true, - "vendor-prefix-align": true, - "sort-order": [ - [ - "position", - "top", - "right", - "bottom", - "left", - "z-index", - "display", - "float", - "width", - "min-width", - "max-width", - "height", - "min-height", - "max-height", - "-webkit-box-sizing", - "-moz-box-sizing", - "box-sizing", - "-webkit-appearance", - "padding", - "padding-top", - "padding-right", - "padding-bottom", - "padding-left", - "margin", - "margin-top", - "margin-right", - "margin-bottom", - "margin-left", - "overflow", - "overflow-x", - "overflow-y", - "-webkit-overflow-scrolling", - "-ms-overflow-x", - "-ms-overflow-y", - "-ms-overflow-style", - "clip", - "clear", - "font", - "font-family", - "font-size", - "font-style", - "font-weight", - "font-variant", - "font-size-adjust", - "font-stretch", - "font-effect", - "font-emphasize", - "font-emphasize-position", - "font-emphasize-style", - "font-smooth", - "-webkit-hyphens", - "-moz-hyphens", - "hyphens", - "line-height", - "color", - "text-align", - "-webkit-text-align-last", - "-moz-text-align-last", - "-ms-text-align-last", - "text-align-last", - "text-emphasis", - "text-emphasis-color", - "text-emphasis-style", - "text-emphasis-position", - "text-decoration", - "text-indent", - "text-justify", - "text-outline", - "-ms-text-overflow", - "text-overflow", - "text-overflow-ellipsis", - "text-overflow-mode", - "text-shadow", - "text-transform", - "text-wrap", - "-webkit-text-size-adjust", - "-ms-text-size-adjust", - "letter-spacing", - "-ms-word-break", - "word-break", - "word-spacing", - "-ms-word-wrap", - "word-wrap", - "-moz-tab-size", - "-o-tab-size", - "tab-size", - "white-space", - "vertical-align", - "list-style", - "list-style-position", - "list-style-type", - "list-style-image", - "pointer-events", - "-ms-touch-action", - "touch-action", - "cursor", - "visibility", - "zoom", - "flex-direction", - "flex-order", - "flex-pack", - "flex-align", - "table-layout", - "empty-cells", - "caption-side", - "border-spacing", - "border-collapse", - "content", - "quotes", - "counter-reset", - "counter-increment", - "resize", - "-webkit-user-select", - "-moz-user-select", - "-ms-user-select", - "-o-user-select", - "user-select", - "nav-index", - "nav-up", - "nav-right", - "nav-down", - "nav-left", - "background", - "background-color", - "background-image", - "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", - "filter:progid:DXImageTransform.Microsoft.gradient", - "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", - "filter", - "background-repeat", - "background-attachment", - "background-position", - "background-position-x", - "background-position-y", - "-webkit-background-clip", - "-moz-background-clip", - "background-clip", - "background-origin", - "-webkit-background-size", - "-moz-background-size", - "-o-background-size", - "background-size", - "border", - "border-color", - "border-style", - "border-width", - "border-top", - "border-top-color", - "border-top-style", - "border-top-width", - "border-right", - "border-right-color", - "border-right-style", - "border-right-width", - "border-bottom", - "border-bottom-color", - "border-bottom-style", - "border-bottom-width", - "border-left", - "border-left-color", - "border-left-style", - "border-left-width", - "border-radius", - "border-top-left-radius", - "border-top-right-radius", - "border-bottom-right-radius", - "border-bottom-left-radius", - "-webkit-border-image", - "-moz-border-image", - "-o-border-image", - "border-image", - "-webkit-border-image-source", - "-moz-border-image-source", - "-o-border-image-source", - "border-image-source", - "-webkit-border-image-slice", - "-moz-border-image-slice", - "-o-border-image-slice", - "border-image-slice", - "-webkit-border-image-width", - "-moz-border-image-width", - "-o-border-image-width", - "border-image-width", - "-webkit-border-image-outset", - "-moz-border-image-outset", - "-o-border-image-outset", - "border-image-outset", - "-webkit-border-image-repeat", - "-moz-border-image-repeat", - "-o-border-image-repeat", - "border-image-repeat", - "outline", - "outline-width", - "outline-style", - "outline-color", - "outline-offset", - "-webkit-box-shadow", - "-moz-box-shadow", - "box-shadow", - "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", - "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", - "opacity", - "-ms-interpolation-mode", - "-webkit-transition", - "-moz-transition", - "-ms-transition", - "-o-transition", - "transition", - "-webkit-transition-delay", - "-moz-transition-delay", - "-ms-transition-delay", - "-o-transition-delay", - "transition-delay", - "-webkit-transition-timing-function", - "-moz-transition-timing-function", - "-ms-transition-timing-function", - "-o-transition-timing-function", - "transition-timing-function", - "-webkit-transition-duration", - "-moz-transition-duration", - "-ms-transition-duration", - "-o-transition-duration", - "transition-duration", - "-webkit-transition-property", - "-moz-transition-property", - "-ms-transition-property", - "-o-transition-property", - "transition-property", - "-webkit-transform", - "-moz-transform", - "-ms-transform", - "-o-transform", - "transform", - "-webkit-transform-origin", - "-moz-transform-origin", - "-ms-transform-origin", - "-o-transform-origin", - "transform-origin", - "-webkit-animation", - "-moz-animation", - "-ms-animation", - "-o-animation", - "animation", - "-webkit-animation-name", - "-moz-animation-name", - "-ms-animation-name", - "-o-animation-name", - "animation-name", - "-webkit-animation-duration", - "-moz-animation-duration", - "-ms-animation-duration", - "-o-animation-duration", - "animation-duration", - "-webkit-animation-play-state", - "-moz-animation-play-state", - "-ms-animation-play-state", - "-o-animation-play-state", - "animation-play-state", - "-webkit-animation-timing-function", - "-moz-animation-timing-function", - "-ms-animation-timing-function", - "-o-animation-timing-function", - "animation-timing-function", - "-webkit-animation-delay", - "-moz-animation-delay", - "-ms-animation-delay", - "-o-animation-delay", - "animation-delay", - "-webkit-animation-iteration-count", - "-moz-animation-iteration-count", - "-ms-animation-iteration-count", - "-o-animation-iteration-count", - "animation-iteration-count", - "-webkit-animation-direction", - "-moz-animation-direction", - "-ms-animation-direction", - "-o-animation-direction", - "animation-direction" - ] - ] -} +{ + "always-semicolon": true, + "block-indent": 2, + "color-case": "lower", + "color-shorthand": true, + "element-case": "lower", + "eof-newline": true, + "leading-zero": false, + "remove-empty-rulesets": true, + "space-after-colon": 1, + "space-after-combinator": 1, + "space-before-selector-delimiter": 0, + "space-between-declarations": "\n", + "space-after-opening-brace": "\n", + "space-before-closing-brace": "\n", + "space-before-colon": 0, + "space-before-combinator": 1, + "space-before-opening-brace": 1, + "strip-spaces": true, + "unitless-zero": true, + "vendor-prefix-align": true, + "sort-order": [ + [ + "position", + "top", + "right", + "bottom", + "left", + "z-index", + "display", + "float", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "-webkit-box-sizing", + "-moz-box-sizing", + "box-sizing", + "-webkit-appearance", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "overflow", + "overflow-x", + "overflow-y", + "-webkit-overflow-scrolling", + "-ms-overflow-x", + "-ms-overflow-y", + "-ms-overflow-style", + "clip", + "clear", + "font", + "font-family", + "font-size", + "font-style", + "font-weight", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-effect", + "font-emphasize", + "font-emphasize-position", + "font-emphasize-style", + "font-smooth", + "-webkit-hyphens", + "-moz-hyphens", + "hyphens", + "line-height", + "color", + "text-align", + "-webkit-text-align-last", + "-moz-text-align-last", + "-ms-text-align-last", + "text-align-last", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-style", + "text-emphasis-position", + "text-decoration", + "text-indent", + "text-justify", + "text-outline", + "-ms-text-overflow", + "text-overflow", + "text-overflow-ellipsis", + "text-overflow-mode", + "text-shadow", + "text-transform", + "text-wrap", + "-webkit-text-size-adjust", + "-ms-text-size-adjust", + "letter-spacing", + "-ms-word-break", + "word-break", + "word-spacing", + "-ms-word-wrap", + "word-wrap", + "-moz-tab-size", + "-o-tab-size", + "tab-size", + "white-space", + "vertical-align", + "list-style", + "list-style-position", + "list-style-type", + "list-style-image", + "pointer-events", + "-ms-touch-action", + "touch-action", + "cursor", + "visibility", + "zoom", + "flex-direction", + "flex-order", + "flex-pack", + "flex-align", + "table-layout", + "empty-cells", + "caption-side", + "border-spacing", + "border-collapse", + "content", + "quotes", + "counter-reset", + "counter-increment", + "resize", + "-webkit-user-select", + "-moz-user-select", + "-ms-user-select", + "-o-user-select", + "user-select", + "nav-index", + "nav-up", + "nav-right", + "nav-down", + "nav-left", + "background", + "background-color", + "background-image", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", + "filter:progid:DXImageTransform.Microsoft.gradient", + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", + "filter", + "background-repeat", + "background-attachment", + "background-position", + "background-position-x", + "background-position-y", + "-webkit-background-clip", + "-moz-background-clip", + "background-clip", + "background-origin", + "-webkit-background-size", + "-moz-background-size", + "-o-background-size", + "background-size", + "border", + "border-color", + "border-style", + "border-width", + "border-top", + "border-top-color", + "border-top-style", + "border-top-width", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-bottom", + "border-bottom-color", + "border-bottom-style", + "border-bottom-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "-webkit-border-image", + "-moz-border-image", + "-o-border-image", + "border-image", + "-webkit-border-image-source", + "-moz-border-image-source", + "-o-border-image-source", + "border-image-source", + "-webkit-border-image-slice", + "-moz-border-image-slice", + "-o-border-image-slice", + "border-image-slice", + "-webkit-border-image-width", + "-moz-border-image-width", + "-o-border-image-width", + "border-image-width", + "-webkit-border-image-outset", + "-moz-border-image-outset", + "-o-border-image-outset", + "border-image-outset", + "-webkit-border-image-repeat", + "-moz-border-image-repeat", + "-o-border-image-repeat", + "border-image-repeat", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "-webkit-box-shadow", + "-moz-box-shadow", + "box-shadow", + "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", + "opacity", + "-ms-interpolation-mode", + "-webkit-transition", + "-moz-transition", + "-ms-transition", + "-o-transition", + "transition", + "-webkit-transition-delay", + "-moz-transition-delay", + "-ms-transition-delay", + "-o-transition-delay", + "transition-delay", + "-webkit-transition-timing-function", + "-moz-transition-timing-function", + "-ms-transition-timing-function", + "-o-transition-timing-function", + "transition-timing-function", + "-webkit-transition-duration", + "-moz-transition-duration", + "-ms-transition-duration", + "-o-transition-duration", + "transition-duration", + "-webkit-transition-property", + "-moz-transition-property", + "-ms-transition-property", + "-o-transition-property", + "transition-property", + "-webkit-transform", + "-moz-transform", + "-ms-transform", + "-o-transform", + "transform", + "-webkit-transform-origin", + "-moz-transform-origin", + "-ms-transform-origin", + "-o-transform-origin", + "transform-origin", + "-webkit-animation", + "-moz-animation", + "-ms-animation", + "-o-animation", + "animation", + "-webkit-animation-name", + "-moz-animation-name", + "-ms-animation-name", + "-o-animation-name", + "animation-name", + "-webkit-animation-duration", + "-moz-animation-duration", + "-ms-animation-duration", + "-o-animation-duration", + "animation-duration", + "-webkit-animation-play-state", + "-moz-animation-play-state", + "-ms-animation-play-state", + "-o-animation-play-state", + "animation-play-state", + "-webkit-animation-timing-function", + "-moz-animation-timing-function", + "-ms-animation-timing-function", + "-o-animation-timing-function", + "animation-timing-function", + "-webkit-animation-delay", + "-moz-animation-delay", + "-ms-animation-delay", + "-o-animation-delay", + "animation-delay", + "-webkit-animation-iteration-count", + "-moz-animation-iteration-count", + "-ms-animation-iteration-count", + "-o-animation-iteration-count", + "animation-iteration-count", + "-webkit-animation-direction", + "-moz-animation-direction", + "-ms-animation-direction", + "-o-animation-direction", + "animation-direction" + ] + ] +} diff --git a/assets/less/bootstrap/.csslintrc b/assets/less/bootstrap/.csslintrc index 005b862..8e8afb3 100644 --- a/assets/less/bootstrap/.csslintrc +++ b/assets/less/bootstrap/.csslintrc @@ -1,19 +1,19 @@ -{ - "adjoining-classes": false, - "box-sizing": false, - "box-model": false, - "compatible-vendor-prefixes": false, - "floats": false, - "font-sizes": false, - "gradients": false, - "important": false, - "known-properties": false, - "outline-none": false, - "qualified-headings": false, - "regex-selectors": false, - "shorthand": false, - "text-indent": false, - "unique-headings": false, - "universal-selector": false, - "unqualified-attributes": false -} +{ + "adjoining-classes": false, + "box-sizing": false, + "box-model": false, + "compatible-vendor-prefixes": false, + "floats": false, + "font-sizes": false, + "gradients": false, + "important": false, + "known-properties": false, + "outline-none": false, + "qualified-headings": false, + "regex-selectors": false, + "shorthand": false, + "text-indent": false, + "unique-headings": false, + "universal-selector": false, + "unqualified-attributes": false +} diff --git a/assets/less/bootstrap/bootstrap.less b/assets/less/bootstrap/bootstrap.less index 1c04778..f0aa08f 100644 --- a/assets/less/bootstrap/bootstrap.less +++ b/assets/less/bootstrap/bootstrap.less @@ -1,6 +1,6 @@ /*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ diff --git a/assets/less/bootstrap/button-groups.less b/assets/less/bootstrap/button-groups.less index 293245a..16db0c6 100644 --- a/assets/less/bootstrap/button-groups.less +++ b/assets/less/bootstrap/button-groups.less @@ -59,7 +59,7 @@ .border-right-radius(0); } } -// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { .border-left-radius(0); diff --git a/assets/less/bootstrap/forms.less b/assets/less/bootstrap/forms.less index e8b071a..9377d38 100644 --- a/assets/less/bootstrap/forms.less +++ b/assets/less/bootstrap/forms.less @@ -181,7 +181,7 @@ input[type="search"] { // set a pixel line-height that matches the given height of the input, but only // for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848 // -// Note that as of 8.3, iOS doesn't support `datetime` or `week`. +// Note that as of 9.3, iOS doesn't support `week`. @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"], diff --git a/assets/less/bootstrap/input-groups.less b/assets/less/bootstrap/input-groups.less index 5f73eec..d0763db 100644 --- a/assets/less/bootstrap/input-groups.less +++ b/assets/less/bootstrap/input-groups.less @@ -29,7 +29,7 @@ width: 100%; margin-bottom: 0; - + &:focus { z-index: 3; } diff --git a/assets/less/bootstrap/mixins/tab-focus.less b/assets/less/bootstrap/mixins/tab-focus.less index 1f1f05a..d12d236 100644 --- a/assets/less/bootstrap/mixins/tab-focus.less +++ b/assets/less/bootstrap/mixins/tab-focus.less @@ -1,9 +1,9 @@ // WebKit-style focus .tab-focus() { - // Default - outline: thin dotted; - // WebKit + // WebKit-specific. Other browsers will keep their default outline style. + // (Initially tried to also force default via `outline: initial`, + // but that seems to erroneously remove the outline in Firefox altogether.) outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } diff --git a/assets/less/bootstrap/panels.less b/assets/less/bootstrap/panels.less index 425eb5e..65aa3a8 100644 --- a/assets/less/bootstrap/panels.less +++ b/assets/less/bootstrap/panels.less @@ -214,7 +214,7 @@ } -// Collapsable panels (aka, accordion) +// Collapsible panels (aka, accordion) // // Wrap a series of panels in `.panel-group` to turn them into an accordion with // the help of our collapse JavaScript plugin. diff --git a/assets/less/bootstrap/scaffolding.less b/assets/less/bootstrap/scaffolding.less index 1929bfc..64a29c6 100644 --- a/assets/less/bootstrap/scaffolding.less +++ b/assets/less/bootstrap/scaffolding.less @@ -120,7 +120,7 @@ hr { // Only display content to screen readers // -// See: http://a11yproject.com/posts/how-to-hide-content/ +// See: http://a11yproject.com/posts/how-to-hide-content .sr-only { position: absolute; diff --git a/assets/less/bootstrap/theme.less b/assets/less/bootstrap/theme.less index 8f51d91..fb61744 100644 --- a/assets/less/bootstrap/theme.less +++ b/assets/less/bootstrap/theme.less @@ -1,6 +1,6 @@ /*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ diff --git a/assets/less/bootstrap/variables.less b/assets/less/bootstrap/variables.less index b057ef5..03b5498 100644 --- a/assets/less/bootstrap/variables.less +++ b/assets/less/bootstrap/variables.less @@ -111,7 +111,7 @@ //** Global background color for active items (e.g., navs or dropdowns). @component-active-bg: @brand-primary; -//** Width of the `border` for generating carets that indicator dropdowns. +//** Width of the `border` for generating carets that indicate dropdowns. @caret-width-base: 4px; //** Carets increase slightly in size for larger components. @caret-width-large: 5px; diff --git a/assets/less/bootswatch/paper/bootswatch.less b/assets/less/bootswatch/paper/bootswatch.less index 937a263..8faf7f1 100644 --- a/assets/less/bootswatch/paper/bootswatch.less +++ b/assets/less/bootswatch/paper/bootswatch.less @@ -1,567 +1,567 @@ -// Paper 3.3.4 -// Bootswatch -// ----------------------------------------------------- - -@import url("http://fonts.googleapis.com/css?family=Roboto:300,400,500,700"); - -// Navbar ===================================================================== - -.navbar { - border: none; - .box-shadow(0 1px 2px rgba(0,0,0,.3)); - - &-brand { - font-size: 24px; - } - - &-inverse { - .form-control { - color: #fff; - .placeholder(@navbar-inverse-link-color); - - &[type=text] { - .box-shadow(inset 0 -1px 0 @navbar-inverse-link-color); - - &:focus { - .box-shadow(inset 0 -2px 0 #fff); - } - } - } - } - - &-nav > li > .dropdown-menu { - margin-top: 2px; - } -} - -// Buttons ==================================================================== - -#btn(@class,@bg) { - .btn-@{class} { - background-size: 200%; - background-position: 50%; - - &:hover, - &:active:hover, - &:focus { - background-color: darken(@bg, 6%); - } - - &:active { - background-color: darken(@bg, 6%); - #gradient > .radial(darken(@bg, 6%) 10%, @bg 11%); - background-size: 1000%; - .box-shadow(2px 2px 2px rgba(0,0,0,.3)); - } - } -} - -#btn(default,@btn-default-bg); -#btn(primary,@btn-primary-bg); -#btn(success,@btn-success-bg); -#btn(info,@btn-info-bg); -#btn(warning,@btn-warning-bg); -#btn(danger,@btn-danger-bg); - -.btn { - text-transform: uppercase; - border-right: none; - border-bottom: none; - .box-shadow(1px 1px 2px rgba(0,0,0,.3)); - .transition(all 0.2s); - - &-link { - .box-shadow(none); - - &:hover, - &:focus { - color: @brand-primary; - text-decoration: none; - } - } - - &-default.disabled { - border: 1px solid @btn-default-border; - } -} - -.btn-group { - .btn + .btn, - .btn + .btn-group, - .btn-group + .btn, - .btn-group + .btn-group { - margin-left: 0; - } - - &-vertical { - > .btn + .btn, - > .btn + .btn-group, - > .btn-group + .btn, - > .btn-group + .btn-group { - margin-top: 0; - } - } -} - -// Typography ================================================================= - -body { - -webkit-font-smoothing: antialiased; - letter-spacing: .1px; - text-rendering: optimizeLegibility; -} - -p { - margin: 0 0 1em; -} - -input, -button { - -webkit-font-smoothing: antialiased; - letter-spacing: .1px; - text-rendering: optimizeLegibility; -} - -a { - .transition(all 0.2s); -} - -// Tables ===================================================================== - -// Forms ====================================================================== - -label { - font-weight: normal; -} - -textarea, -textarea.form-control, -input.form-control, -input[type=text], -input[type=password], -input[type=email], -input[type=number], -[type=text].form-control, -[type=password].form-control, -[type=email].form-control, -[type=tel].form-control, -[contenteditable].form-control { - padding: 0; - border: none; - border-radius: 0; - -webkit-appearance: none; - .box-shadow(inset 0 -1px 0 #ddd); - font-size: 16px; - - &:focus { - .box-shadow(inset 0 -2px 0 @brand-primary); - } - - &[disabled], - &[readonly] { - .box-shadow(none); - border-bottom: 1px dotted #ddd; - } - - &.input { - &-sm { - font-size: @font-size-small; - } - - &-lg { - font-size: @font-size-large; - } - } -} - -select, -select.form-control { - border: 0; - border-radius: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding-left: 0; - padding-right: 0\9; // remove padding for < ie9 since default arrow can't be removed - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); - background-size: 13px; - background-repeat: no-repeat; - background-position: right center; - .box-shadow(inset 0 -1px 0 #ddd); - font-size: 16px; - line-height: 1.5; - - &::-ms-expand { - display: none; - } - - &.input { - &-sm { - font-size: @font-size-small; - } - - &-lg { - font-size: @font-size-large; - } - } - - &:focus { - .box-shadow(inset 0 -2px 0 @brand-primary); - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); - } - - &[multiple] { - background: none; - } -} - -.radio, -.radio-inline, -.checkbox, -.checkbox-inline { - label { - padding-left: 25px; - } - - input[type="radio"], - input[type="checkbox"] { - margin-left: -25px; - } -} - -input[type="radio"], -.radio input[type="radio"], -.radio-inline input[type="radio"] { - position: relative; - margin-top: 5px; - margin-right: 4px; - vertical-align: -4px; - border: none; - background-color: transparent; - -webkit-appearance: none; - appearance: none; - cursor: pointer; - - &:focus { - outline: none; - } - - &:before, - &:after { - content: ""; - display: block; - width: 18px; - height: 18px; - margin-top: -3px; - border-radius: 50%; - .transition(240ms); - } - - &:before { - position: absolute; - left: 0; - top: 0; - background-color: @brand-primary; - .scale(0); - } - - &:after { - border: 2px solid @gray; - } - - &:checked:before { - .scale(0.5); - } - - &:disabled:checked:before { - background-color: @gray-light; - } - - &:checked:after { - border-color: @brand-primary; - } - - &:disabled:after, - &:disabled:checked:after { - border-color: @gray-light; - } -} - -input[type="checkbox"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: relative; - vertical-align: -4px; - border: none; - -webkit-appearance: none; - appearance: none; - cursor: pointer; - - &:focus { - outline: none; - } - - &:after { - content: ""; - display: block; - width: 18px; - height: 18px; - margin-top: -2px; - margin-right: 5px; - border: 2px solid @gray; - border-radius: 2px; - .transition(240ms); - } - - &:checked:before { - content: ""; - position: absolute; - top: 0; - left: 6px; - display: table; - width: 6px; - height: 12px; - border: 2px solid #fff; - border-top-width: 0; - border-left-width: 0; - .rotate(45deg); - } - - &:checked:after { - background-color: @brand-primary; - border-color: @brand-primary; - } - - &:disabled:after { - border-color: @gray-light; - } - - &:disabled:checked:after { - background-color: @gray-light; - border-color: transparent; - } -} - -.has-warning { - input:not([type=checkbox]), - .form-control, - input:not([type=checkbox]):focus, - .form-control:focus { - .box-shadow(inset 0 -2px 0 @brand-warning); - } -} - -.has-error { - input:not([type=checkbox]), - .form-control, - input:not([type=checkbox]):focus, - .form-control:focus { - .box-shadow(inset 0 -2px 0 @brand-danger); - } -} - -.has-success { - input:not([type=checkbox]), - .form-control, - input:not([type=checkbox]):focus, - .form-control:focus { - .box-shadow(inset 0 -2px 0 @brand-success); - } -} - -// Navs ======================================================================= - -.nav-tabs { - > li > a, - > li > a:focus { - margin-right: 0; - background-color: transparent; - border: none; - color: @navbar-default-link-color; - .box-shadow(inset 0 -1px 0 #ddd); - .transition(all 0.2s); - - &:hover { - background-color: transparent; - .box-shadow(inset 0 -2px 0 @brand-primary); - color: @brand-primary; - } - } - - & > li.active > a, - & > li.active > a:focus { - border: none; - .box-shadow(inset 0 -2px 0 @brand-primary); - color: @brand-primary; - - &:hover { - border: none; - color: @brand-primary; - } - } - - & > li.disabled > a { - .box-shadow(inset 0 -1px 0 #ddd); - } - - &.nav-justified { - - & > li > a, - & > li > a:hover, - & > .active > a, - & > .active > a:hover { - border: none; - } - } - - .dropdown-menu { - margin-top: 0; - } -} - -.dropdown-menu { - border: none; - .box-shadow(0 1px 4px rgba(0,0,0,.3)); -} - -// Indicators ================================================================= - -.alert { - border: none; - color: #fff; - - &-success { - background-color: @brand-success; - } - - &-info { - background-color: @brand-info; - } - - &-warning { - background-color: @brand-warning; - } - - &-danger { - background-color: @brand-danger; - } - - a:not(.close), - .alert-link { - color: #fff; - font-weight: bold; - } - - .close { - color: #fff; - } -} - -.badge { - padding: 3px 6px 5px; -} - -.progress { - position: relative; - z-index: 1; - height: 6px; - border-radius: 0; - - .box-shadow(none); - - &-bar { - .box-shadow(none); - - &:last-child { - border-radius: 0 3px 3px 0; - } - - &:last-child { - &:before { - display: block; - content: ""; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - z-index: -1; - background-color: lighten(@progress-bar-bg, 35%); - } - } - - &-success:last-child.progress-bar:before { - background-color: lighten(@brand-success, 35%); - } - - &-info:last-child.progress-bar:before { - background-color: lighten(@brand-info, 45%); - } - &-warning:last-child.progress-bar:before { - background-color: lighten(@brand-warning, 35%); - } - - &-danger:last-child.progress-bar:before { - background-color: lighten(@brand-danger, 25%); - } - } -} - -// Progress bars ============================================================== - -// Containers ================================================================= - -.close { - font-size: 34px; - font-weight: 300; - line-height: 24px; - opacity: 0.6; - - &:hover { - opacity: 1; - } -} - -.list-group { - - &-item { - padding: 15px; - } - - &-item-text { - color: @gray-light; - } -} - -.well { - border-radius: 0; - .box-shadow(none); -} - -.panel { - border: none; - border-radius: 2px; - .box-shadow(0 1px 4px rgba(0,0,0,.3)); - - &-heading { - border-bottom: none; - } - - &-footer { - border-top: none; - } -} - -.popover { - border: none; - .box-shadow(0 1px 4px rgba(0,0,0,.3)); -} - -.carousel { - &-caption { - h1, h2, h3, h4, h5, h6 { - color: inherit; - } - } -} - +// Paper 3.3.4 +// Bootswatch +// ----------------------------------------------------- + +@import url("http://fonts.googleapis.com/css?family=Roboto:300,400,500,700"); + +// Navbar ===================================================================== + +.navbar { + border: none; + .box-shadow(0 1px 2px rgba(0,0,0,.3)); + + &-brand { + font-size: 24px; + } + + &-inverse { + .form-control { + color: #fff; + .placeholder(@navbar-inverse-link-color); + + &[type=text] { + .box-shadow(inset 0 -1px 0 @navbar-inverse-link-color); + + &:focus { + .box-shadow(inset 0 -2px 0 #fff); + } + } + } + } + + &-nav > li > .dropdown-menu { + margin-top: 2px; + } +} + +// Buttons ==================================================================== + +#btn(@class,@bg) { + .btn-@{class} { + background-size: 200%; + background-position: 50%; + + &:hover, + &:active:hover, + &:focus { + background-color: darken(@bg, 6%); + } + + &:active { + background-color: darken(@bg, 6%); + #gradient > .radial(darken(@bg, 6%) 10%, @bg 11%); + background-size: 1000%; + .box-shadow(2px 2px 2px rgba(0,0,0,.3)); + } + } +} + +#btn(default,@btn-default-bg); +#btn(primary,@btn-primary-bg); +#btn(success,@btn-success-bg); +#btn(info,@btn-info-bg); +#btn(warning,@btn-warning-bg); +#btn(danger,@btn-danger-bg); + +.btn { + text-transform: uppercase; + border-right: none; + border-bottom: none; + .box-shadow(1px 1px 2px rgba(0,0,0,.3)); + .transition(all 0.2s); + + &-link { + .box-shadow(none); + + &:hover, + &:focus { + color: @brand-primary; + text-decoration: none; + } + } + + &-default.disabled { + border: 1px solid @btn-default-border; + } +} + +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: 0; + } + + &-vertical { + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: 0; + } + } +} + +// Typography ================================================================= + +body { + -webkit-font-smoothing: antialiased; + letter-spacing: .1px; + text-rendering: optimizeLegibility; +} + +p { + margin: 0 0 1em; +} + +input, +button { + -webkit-font-smoothing: antialiased; + letter-spacing: .1px; + text-rendering: optimizeLegibility; +} + +a { + .transition(all 0.2s); +} + +// Tables ===================================================================== + +// Forms ====================================================================== + +label { + font-weight: normal; +} + +textarea, +textarea.form-control, +input.form-control, +input[type=text], +input[type=password], +input[type=email], +input[type=number], +[type=text].form-control, +[type=password].form-control, +[type=email].form-control, +[type=tel].form-control, +[contenteditable].form-control { + padding: 0; + border: none; + border-radius: 0; + -webkit-appearance: none; + .box-shadow(inset 0 -1px 0 #ddd); + font-size: 16px; + + &:focus { + .box-shadow(inset 0 -2px 0 @brand-primary); + } + + &[disabled], + &[readonly] { + .box-shadow(none); + border-bottom: 1px dotted #ddd; + } + + &.input { + &-sm { + font-size: @font-size-small; + } + + &-lg { + font-size: @font-size-large; + } + } +} + +select, +select.form-control { + border: 0; + border-radius: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding-left: 0; + padding-right: 0\9; // remove padding for < ie9 since default arrow can't be removed + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); + background-size: 13px; + background-repeat: no-repeat; + background-position: right center; + .box-shadow(inset 0 -1px 0 #ddd); + font-size: 16px; + line-height: 1.5; + + &::-ms-expand { + display: none; + } + + &.input { + &-sm { + font-size: @font-size-small; + } + + &-lg { + font-size: @font-size-large; + } + } + + &:focus { + .box-shadow(inset 0 -2px 0 @brand-primary); + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); + } + + &[multiple] { + background: none; + } +} + +.radio, +.radio-inline, +.checkbox, +.checkbox-inline { + label { + padding-left: 25px; + } + + input[type="radio"], + input[type="checkbox"] { + margin-left: -25px; + } +} + +input[type="radio"], +.radio input[type="radio"], +.radio-inline input[type="radio"] { + position: relative; + margin-top: 5px; + margin-right: 4px; + vertical-align: -4px; + border: none; + background-color: transparent; + -webkit-appearance: none; + appearance: none; + cursor: pointer; + + &:focus { + outline: none; + } + + &:before, + &:after { + content: ""; + display: block; + width: 18px; + height: 18px; + margin-top: -3px; + border-radius: 50%; + .transition(240ms); + } + + &:before { + position: absolute; + left: 0; + top: 0; + background-color: @brand-primary; + .scale(0); + } + + &:after { + border: 2px solid @gray; + } + + &:checked:before { + .scale(0.5); + } + + &:disabled:checked:before { + background-color: @gray-light; + } + + &:checked:after { + border-color: @brand-primary; + } + + &:disabled:after, + &:disabled:checked:after { + border-color: @gray-light; + } +} + +input[type="checkbox"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: relative; + vertical-align: -4px; + border: none; + -webkit-appearance: none; + appearance: none; + cursor: pointer; + + &:focus { + outline: none; + } + + &:after { + content: ""; + display: block; + width: 18px; + height: 18px; + margin-top: -2px; + margin-right: 5px; + border: 2px solid @gray; + border-radius: 2px; + .transition(240ms); + } + + &:checked:before { + content: ""; + position: absolute; + top: 0; + left: 6px; + display: table; + width: 6px; + height: 12px; + border: 2px solid #fff; + border-top-width: 0; + border-left-width: 0; + .rotate(45deg); + } + + &:checked:after { + background-color: @brand-primary; + border-color: @brand-primary; + } + + &:disabled:after { + border-color: @gray-light; + } + + &:disabled:checked:after { + background-color: @gray-light; + border-color: transparent; + } +} + +.has-warning { + input:not([type=checkbox]), + .form-control, + input:not([type=checkbox]):focus, + .form-control:focus { + .box-shadow(inset 0 -2px 0 @brand-warning); + } +} + +.has-error { + input:not([type=checkbox]), + .form-control, + input:not([type=checkbox]):focus, + .form-control:focus { + .box-shadow(inset 0 -2px 0 @brand-danger); + } +} + +.has-success { + input:not([type=checkbox]), + .form-control, + input:not([type=checkbox]):focus, + .form-control:focus { + .box-shadow(inset 0 -2px 0 @brand-success); + } +} + +// Navs ======================================================================= + +.nav-tabs { + > li > a, + > li > a:focus { + margin-right: 0; + background-color: transparent; + border: none; + color: @navbar-default-link-color; + .box-shadow(inset 0 -1px 0 #ddd); + .transition(all 0.2s); + + &:hover { + background-color: transparent; + .box-shadow(inset 0 -2px 0 @brand-primary); + color: @brand-primary; + } + } + + & > li.active > a, + & > li.active > a:focus { + border: none; + .box-shadow(inset 0 -2px 0 @brand-primary); + color: @brand-primary; + + &:hover { + border: none; + color: @brand-primary; + } + } + + & > li.disabled > a { + .box-shadow(inset 0 -1px 0 #ddd); + } + + &.nav-justified { + + & > li > a, + & > li > a:hover, + & > .active > a, + & > .active > a:hover { + border: none; + } + } + + .dropdown-menu { + margin-top: 0; + } +} + +.dropdown-menu { + border: none; + .box-shadow(0 1px 4px rgba(0,0,0,.3)); +} + +// Indicators ================================================================= + +.alert { + border: none; + color: #fff; + + &-success { + background-color: @brand-success; + } + + &-info { + background-color: @brand-info; + } + + &-warning { + background-color: @brand-warning; + } + + &-danger { + background-color: @brand-danger; + } + + a:not(.close), + .alert-link { + color: #fff; + font-weight: bold; + } + + .close { + color: #fff; + } +} + +.badge { + padding: 3px 6px 5px; +} + +.progress { + position: relative; + z-index: 1; + height: 6px; + border-radius: 0; + + .box-shadow(none); + + &-bar { + .box-shadow(none); + + &:last-child { + border-radius: 0 3px 3px 0; + } + + &:last-child { + &:before { + display: block; + content: ""; + position: absolute; + width: 100%; + height: 100%; + left: 0; + right: 0; + z-index: -1; + background-color: lighten(@progress-bar-bg, 35%); + } + } + + &-success:last-child.progress-bar:before { + background-color: lighten(@brand-success, 35%); + } + + &-info:last-child.progress-bar:before { + background-color: lighten(@brand-info, 45%); + } + &-warning:last-child.progress-bar:before { + background-color: lighten(@brand-warning, 35%); + } + + &-danger:last-child.progress-bar:before { + background-color: lighten(@brand-danger, 25%); + } + } +} + +// Progress bars ============================================================== + +// Containers ================================================================= + +.close { + font-size: 34px; + font-weight: 300; + line-height: 24px; + opacity: 0.6; + + &:hover { + opacity: 1; + } +} + +.list-group { + + &-item { + padding: 15px; + } + + &-item-text { + color: @gray-light; + } +} + +.well { + border-radius: 0; + .box-shadow(none); +} + +.panel { + border: none; + border-radius: 2px; + .box-shadow(0 1px 4px rgba(0,0,0,.3)); + + &-heading { + border-bottom: none; + } + + &-footer { + border-top: none; + } +} + +.popover { + border: none; + .box-shadow(0 1px 4px rgba(0,0,0,.3)); +} + +.carousel { + &-caption { + h1, h2, h3, h4, h5, h6 { + color: inherit; + } + } +} + diff --git a/assets/less/bootswatch/paper/variables.less b/assets/less/bootswatch/paper/variables.less index 1dd6bc2..4514575 100644 --- a/assets/less/bootswatch/paper/variables.less +++ b/assets/less/bootswatch/paper/variables.less @@ -1,861 +1,861 @@ -// Paper 3.3.4 -// Variables -// -------------------------------------------------- - - -//== Colors -// -//## Gray and brand colors for use across Bootstrap. - -@gray-base: #000; -@gray-darker: lighten(@gray-base, 13.5%); // #222 -@gray-dark: #212121; -@gray: #666; -@gray-light: #bbb; -@gray-lighter: lighten(@gray-base, 93.5%); // #eee - -@brand-primary: #2196F3; -@brand-success: #4CAF50; -@brand-info: #9C27B0; -@brand-warning: #ff9800; -@brand-danger: #e51c23; - - -//== Scaffolding -// -//## Settings for some of the most global styles. - -//** Background color for ``. -@body-bg: #fff; -//** Global text color on ``. -@text-color: @gray; - -//** Global textual link color. -@link-color: @brand-primary; -//** Link hover color set via `darken()` function. -@link-hover-color: darken(@link-color, 15%); -//** Link hover decoration. -@link-hover-decoration: underline; - - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. - -@font-family-sans-serif: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; -@font-family-serif: Georgia, "Times New Roman", Times, serif; -//** Default monospace fonts for ``, ``, and `
    `.
    -@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
    -@font-family-base:        @font-family-sans-serif;
    -
    -@font-size-base:          13px;
    -@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
    -@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
    -
    -@font-size-h1:            56px;
    -@font-size-h2:            45px;
    -@font-size-h3:            34px;
    -@font-size-h4:            24px;
    -@font-size-h5:            20px;
    -@font-size-h6:            14px;
    -
    -//** Unit-less `line-height` for use in components like buttons.
    -@line-height-base:        1.846; // 20/14
    -//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    -@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
    -
    -//** By default, this inherits from the ``.
    -@headings-font-family:    inherit;
    -@headings-font-weight:    400;
    -@headings-line-height:    1.1;
    -@headings-color:          #444;
    -
    -
    -//== Iconography
    -//
    -//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
    -
    -//** Load fonts from this directory.
    -@icon-font-path:          "../fonts/";
    -//** File name for all font files.
    -@icon-font-name:          "glyphicons-halflings-regular";
    -//** Element ID within SVG icon file.
    -@icon-font-svg-id:        "glyphicons_halflingsregular";
    -
    -
    -//== Components
    -//
    -//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    -
    -@padding-base-vertical:     6px;
    -@padding-base-horizontal:   16px;
    -
    -@padding-large-vertical:    10px;
    -@padding-large-horizontal:  16px;
    -
    -@padding-small-vertical:    5px;
    -@padding-small-horizontal:  10px;
    -
    -@padding-xs-vertical:       1px;
    -@padding-xs-horizontal:     5px;
    -
    -@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
    -@line-height-small:         1.5;
    -
    -@border-radius-base:        3px;
    -@border-radius-large:       3px;
    -@border-radius-small:       3px;
    -
    -//** Global color for active items (e.g., navs or dropdowns).
    -@component-active-color:    #fff;
    -//** Global background color for active items (e.g., navs or dropdowns).
    -@component-active-bg:       @brand-primary;
    -
    -//** Width of the `border` for generating carets that indicator dropdowns.
    -@caret-width-base:          4px;
    -//** Carets increase slightly in size for larger components.
    -@caret-width-large:         5px;
    -
    -
    -//== Tables
    -//
    -//## Customizes the `.table` component with basic values, each used across all table variations.
    -
    -//** Padding for ``s and ``s.
    -@table-cell-padding:            8px;
    -//** Padding for cells in `.table-condensed`.
    -@table-condensed-cell-padding:  5px;
    -
    -//** Default background color used for all tables.
    -@table-bg:                      transparent;
    -//** Background color used for `.table-striped`.
    -@table-bg-accent:               #f9f9f9;
    -//** Background color used for `.table-hover`.
    -@table-bg-hover:                #f5f5f5;
    -@table-bg-active:               @table-bg-hover;
    -
    -//** Border color for table and cell borders.
    -@table-border-color:            #ddd;
    -
    -
    -//== Buttons
    -//
    -//## For each of Bootstrap's buttons, define text, background and border color.
    -
    -@btn-font-weight:                normal;
    -
    -@btn-default-color:              @text-color;
    -@btn-default-bg:                 #fff;
    -@btn-default-border:             #eee;
    -
    -@btn-primary-color:              #fff;
    -@btn-primary-bg:                 @brand-primary;
    -@btn-primary-border:             transparent;
    -
    -@btn-success-color:              #fff;
    -@btn-success-bg:                 @brand-success;
    -@btn-success-border:             transparent;
    -
    -@btn-info-color:                 #fff;
    -@btn-info-bg:                    @brand-info;
    -@btn-info-border:                transparent;
    -
    -@btn-warning-color:              #fff;
    -@btn-warning-bg:                 @brand-warning;
    -@btn-warning-border:             transparent;
    -
    -@btn-danger-color:               #fff;
    -@btn-danger-bg:                  @brand-danger;
    -@btn-danger-border:              transparent;
    -
    -@btn-link-disabled-color:        @gray-light;
    -
    -
    -//== Forms
    -//
    -//##
    -
    -//** `` background color
    -@input-bg:                       transparent;
    -//** `` background color
    -@input-bg-disabled:              transparent;
    -
    -//** Text color for ``s
    -@input-color:                    @gray;
    -//** `` border color
    -@input-border:                   transparent;
    -
    -// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
    -//** Default `.form-control` border radius
    -// This has no effect on ``s in CSS.
    -@input-border-radius:            @border-radius-base;
    -//** Large `.form-control` border radius
    -@input-border-radius-large:      @border-radius-large;
    -//** Small `.form-control` border radius
    -@input-border-radius-small:      @border-radius-small;
    -
    -//** Border color for inputs on focus
    -@input-border-focus:             #66afe9;
    -
    -//** Placeholder text color
    -@input-color-placeholder:        @gray-light;
    -
    -//** Default `.form-control` height
    -@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
    -//** Large `.form-control` height
    -@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
    -//** Small `.form-control` height
    -@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
    -
    -//** `.form-group` margin
    -@form-group-margin-bottom:       15px;
    -
    -@legend-color:                   @gray-dark;
    -@legend-border-color:            #e5e5e5;
    -
    -//** Background color for textual input addons
    -@input-group-addon-bg:           transparent;
    -//** Border color for textual input addons
    -@input-group-addon-border-color: @input-border;
    -
    -//** Disabled cursor for form controls and buttons.
    -@cursor-disabled:                not-allowed;
    -
    -
    -//== Dropdowns
    -//
    -//## Dropdown menu container and contents.
    -
    -//** Background for the dropdown menu.
    -@dropdown-bg:                    #fff;
    -//** Dropdown menu `border-color`.
    -@dropdown-border:                rgba(0,0,0,.15);
    -//** Dropdown menu `border-color` **for IE8**.
    -@dropdown-fallback-border:       #ccc;
    -//** Divider color for between dropdown items.
    -@dropdown-divider-bg:            #e5e5e5;
    -
    -//** Dropdown link text color.
    -@dropdown-link-color:            @text-color;
    -//** Hover color for dropdown links.
    -@dropdown-link-hover-color:      darken(@gray-dark, 5%);
    -//** Hover background for dropdown links.
    -@dropdown-link-hover-bg:         @gray-lighter;
    -
    -//** Active dropdown menu item text color.
    -@dropdown-link-active-color:     @component-active-color;
    -//** Active dropdown menu item background color.
    -@dropdown-link-active-bg:        @component-active-bg;
    -
    -//** Disabled dropdown menu item background color.
    -@dropdown-link-disabled-color:   @gray-light;
    -
    -//** Text color for headers within dropdown menus.
    -@dropdown-header-color:          @gray-light;
    -
    -//** Deprecated `@dropdown-caret-color` as of v3.1.0
    -@dropdown-caret-color:           @gray-light;
    -
    -
    -//-- Z-index master list
    -//
    -// Warning: Avoid customizing these values. They're used for a bird's eye view
    -// of components dependent on the z-axis and are designed to all work together.
    -//
    -// Note: These variables are not generated into the Customizer.
    -
    -@zindex-navbar:            1000;
    -@zindex-dropdown:          1000;
    -@zindex-popover:           1060;
    -@zindex-tooltip:           1070;
    -@zindex-navbar-fixed:      1030;
    -@zindex-modal-background:  1040;
    -@zindex-modal:             1050;
    -
    -
    -//== Media queries breakpoints
    -//
    -//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    -
    -// Extra small screen / phone
    -//** Deprecated `@screen-xs` as of v3.0.1
    -@screen-xs:                  480px;
    -//** Deprecated `@screen-xs-min` as of v3.2.0
    -@screen-xs-min:              @screen-xs;
    -//** Deprecated `@screen-phone` as of v3.0.1
    -@screen-phone:               @screen-xs-min;
    -
    -// Small screen / tablet
    -//** Deprecated `@screen-sm` as of v3.0.1
    -@screen-sm:                  768px;
    -@screen-sm-min:              @screen-sm;
    -//** Deprecated `@screen-tablet` as of v3.0.1
    -@screen-tablet:              @screen-sm-min;
    -
    -// Medium screen / desktop
    -//** Deprecated `@screen-md` as of v3.0.1
    -@screen-md:                  992px;
    -@screen-md-min:              @screen-md;
    -//** Deprecated `@screen-desktop` as of v3.0.1
    -@screen-desktop:             @screen-md-min;
    -
    -// Large screen / wide desktop
    -//** Deprecated `@screen-lg` as of v3.0.1
    -@screen-lg:                  1200px;
    -@screen-lg-min:              @screen-lg;
    -//** Deprecated `@screen-lg-desktop` as of v3.0.1
    -@screen-lg-desktop:          @screen-lg-min;
    -
    -// So media queries don't overlap when required, provide a maximum
    -@screen-xs-max:              (@screen-sm-min - 1);
    -@screen-sm-max:              (@screen-md-min - 1);
    -@screen-md-max:              (@screen-lg-min - 1);
    -
    -
    -//== Grid system
    -//
    -//## Define your custom responsive grid.
    -
    -//** Number of columns in the grid.
    -@grid-columns:              12;
    -//** Padding between columns. Gets divided in half for the left and right.
    -@grid-gutter-width:         30px;
    -// Navbar collapse
    -//** Point at which the navbar becomes uncollapsed.
    -@grid-float-breakpoint:     @screen-sm-min;
    -//** Point at which the navbar begins collapsing.
    -@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
    -
    -
    -//== Container sizes
    -//
    -//## Define the maximum width of `.container` for different screen sizes.
    -
    -// Small screen / tablet
    -@container-tablet:             (720px + @grid-gutter-width);
    -//** For `@screen-sm-min` and up.
    -@container-sm:                 @container-tablet;
    -
    -// Medium screen / desktop
    -@container-desktop:            (940px + @grid-gutter-width);
    -//** For `@screen-md-min` and up.
    -@container-md:                 @container-desktop;
    -
    -// Large screen / wide desktop
    -@container-large-desktop:      (1140px + @grid-gutter-width);
    -//** For `@screen-lg-min` and up.
    -@container-lg:                 @container-large-desktop;
    -
    -
    -//== Navbar
    -//
    -//##
    -
    -// Basics of a navbar
    -@navbar-height:                    64px;
    -@navbar-margin-bottom:             @line-height-computed;
    -@navbar-border-radius:             @border-radius-base;
    -@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
    -@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
    -@navbar-collapse-max-height:       340px;
    -
    -@navbar-default-color:             @gray-light;
    -@navbar-default-bg:                #fff;
    -@navbar-default-border:            transparent;
    -
    -// Navbar links
    -@navbar-default-link-color:                @gray;
    -@navbar-default-link-hover-color:          @gray-dark;
    -@navbar-default-link-hover-bg:             transparent;
    -@navbar-default-link-active-color:         @gray-dark;
    -@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
    -@navbar-default-link-disabled-color:       #ccc;
    -@navbar-default-link-disabled-bg:          transparent;
    -
    -// Navbar brand label
    -@navbar-default-brand-color:               @navbar-default-link-color;
    -@navbar-default-brand-hover-color:         @navbar-default-link-hover-color;
    -@navbar-default-brand-hover-bg:            transparent;
    -
    -// Navbar toggle
    -@navbar-default-toggle-hover-bg:           transparent;
    -@navbar-default-toggle-icon-bar-bg:        rgba(0,0,0,0.5);
    -@navbar-default-toggle-border-color:       transparent;
    -
    -
    -// Inverted navbar
    -// Reset inverted navbar basics
    -@navbar-inverse-color:                      @gray-light;
    -@navbar-inverse-bg:                         @brand-primary;
    -@navbar-inverse-border:                     transparent;
    -
    -// Inverted navbar links
    -@navbar-inverse-link-color:                 lighten(@brand-primary, 30%);
    -@navbar-inverse-link-hover-color:           #fff;
    -@navbar-inverse-link-hover-bg:              transparent;
    -@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
    -@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
    -@navbar-inverse-link-disabled-color:        #444;
    -@navbar-inverse-link-disabled-bg:           transparent;
    -
    -// Inverted navbar brand label
    -@navbar-inverse-brand-color:                @navbar-inverse-link-color;
    -@navbar-inverse-brand-hover-color:          #fff;
    -@navbar-inverse-brand-hover-bg:             transparent;
    -
    -// Inverted navbar toggle\
    -@navbar-inverse-toggle-hover-bg:            transparent;
    -@navbar-inverse-toggle-icon-bar-bg:         rgba(0,0,0,0.5);
    -@navbar-inverse-toggle-border-color:        transparent;
    -
    -
    -//== Navs
    -//
    -//##
    -
    -//=== Shared nav styles
    -@nav-link-padding:                          10px 15px;
    -@nav-link-hover-bg:                         @gray-lighter;
    -
    -@nav-disabled-link-color:                   @gray-light;
    -@nav-disabled-link-hover-color:             @gray-light;
    -
    -//== Tabs
    -@nav-tabs-border-color:                     transparent;
    -
    -@nav-tabs-link-hover-border-color:          @gray-lighter;
    -
    -@nav-tabs-active-link-hover-bg:             transparent;
    -@nav-tabs-active-link-hover-color:          @gray;
    -@nav-tabs-active-link-hover-border-color:   transparent;
    -
    -@nav-tabs-justified-link-border-color:            @nav-tabs-border-color;
    -@nav-tabs-justified-active-link-border-color:     @body-bg;
    -
    -//== Pills
    -@nav-pills-border-radius:                   @border-radius-base;
    -@nav-pills-active-link-hover-bg:            @component-active-bg;
    -@nav-pills-active-link-hover-color:         @component-active-color;
    -
    -
    -//== Pagination
    -//
    -//##
    -
    -@pagination-color:                     @link-color;
    -@pagination-bg:                        #fff;
    -@pagination-border:                    #ddd;
    -
    -@pagination-hover-color:               @link-hover-color;
    -@pagination-hover-bg:                  @gray-lighter;
    -@pagination-hover-border:              #ddd;
    -
    -@pagination-active-color:              #fff;
    -@pagination-active-bg:                 @brand-primary;
    -@pagination-active-border:             @brand-primary;
    -
    -@pagination-disabled-color:            @gray-light;
    -@pagination-disabled-bg:               #fff;
    -@pagination-disabled-border:           #ddd;
    -
    -
    -//== Pager
    -//
    -//##
    -
    -@pager-bg:                             @pagination-bg;
    -@pager-border:                         @pagination-border;
    -@pager-border-radius:                  15px;
    -
    -@pager-hover-bg:                       @pagination-hover-bg;
    -
    -@pager-active-bg:                      @pagination-active-bg;
    -@pager-active-color:                   @pagination-active-color;
    -
    -@pager-disabled-color:                 @pagination-disabled-color;
    -
    -
    -//== Jumbotron
    -//
    -//##
    -
    -@jumbotron-padding:              30px;
    -@jumbotron-color:                inherit;
    -@jumbotron-bg:                   #f9f9f9;
    -@jumbotron-heading-color:        @headings-color;
    -@jumbotron-font-size:            ceil((@font-size-base * 1.5));
    -
    -
    -//== Form states and alerts
    -//
    -//## Define colors for form feedback states and, by default, alerts.
    -
    -@state-success-text:             @brand-success;
    -@state-success-bg:               #dff0d8;
    -@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
    -
    -@state-info-text:                @brand-info;
    -@state-info-bg:                  #e1bee7;
    -@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
    -
    -@state-warning-text:             @brand-warning;
    -@state-warning-bg:               #ffe0b2;
    -@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
    -
    -@state-danger-text:              @brand-danger;
    -@state-danger-bg:                #f9bdbb;
    -@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
    -
    -
    -//== Tooltips
    -//
    -//##
    -
    -//** Tooltip max width
    -@tooltip-max-width:           200px;
    -//** Tooltip text color
    -@tooltip-color:               #fff;
    -//** Tooltip background color
    -@tooltip-bg:                  #727272;
    -@tooltip-opacity:             .9;
    -
    -//** Tooltip arrow width
    -@tooltip-arrow-width:         5px;
    -//** Tooltip arrow color
    -@tooltip-arrow-color:         @tooltip-bg;
    -
    -
    -//== Popovers
    -//
    -//##
    -
    -//** Popover body background color
    -@popover-bg:                          #fff;
    -//** Popover maximum width
    -@popover-max-width:                   276px;
    -//** Popover border color
    -@popover-border-color:                transparent;
    -//** Popover fallback border color
    -@popover-fallback-border-color:       transparent;
    -
    -//** Popover title background color
    -@popover-title-bg:                    darken(@popover-bg, 3%);
    -
    -//** Popover arrow width
    -@popover-arrow-width:                 10px;
    -//** Popover arrow color
    -@popover-arrow-color:                 @popover-bg;
    -
    -//** Popover outer arrow width
    -@popover-arrow-outer-width:           (@popover-arrow-width + 1);
    -//** Popover outer arrow color
    -@popover-arrow-outer-color:           fadein(@popover-border-color, 7.5%);
    -//** Popover outer arrow fallback color
    -@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
    -
    -
    -//== Labels
    -//
    -//##
    -
    -//** Default label background color
    -@label-default-bg:            @gray-light;
    -//** Primary label background color
    -@label-primary-bg:            @brand-primary;
    -//** Success label background color
    -@label-success-bg:            @brand-success;
    -//** Info label background color
    -@label-info-bg:               @brand-info;
    -//** Warning label background color
    -@label-warning-bg:            @brand-warning;
    -//** Danger label background color
    -@label-danger-bg:             @brand-danger;
    -
    -//** Default label text color
    -@label-color:                 #fff;
    -//** Default text color of a linked label
    -@label-link-hover-color:      #fff;
    -
    -
    -//== Modals
    -//
    -//##
    -
    -//** Padding applied to the modal body
    -@modal-inner-padding:         15px;
    -
    -//** Padding applied to the modal title
    -@modal-title-padding:         15px;
    -//** Modal title line-height
    -@modal-title-line-height:     @line-height-base;
    -
    -//** Background color of modal content area
    -@modal-content-bg:                             #fff;
    -//** Modal content border color
    -@modal-content-border-color:                   transparent;
    -//** Modal content border color **for IE8**
    -@modal-content-fallback-border-color:          #999;
    -
    -//** Modal backdrop background color
    -@modal-backdrop-bg:           #000;
    -//** Modal backdrop opacity
    -@modal-backdrop-opacity:      .5;
    -//** Modal header border color
    -@modal-header-border-color:   transparent;
    -//** Modal footer border color
    -@modal-footer-border-color:   @modal-header-border-color;
    -
    -@modal-lg:                    900px;
    -@modal-md:                    600px;
    -@modal-sm:                    300px;
    -
    -
    -//== Alerts
    -//
    -//## Define alert colors, border radius, and padding.
    -
    -@alert-padding:               15px;
    -@alert-border-radius:         @border-radius-base;
    -@alert-link-font-weight:      bold;
    -
    -@alert-success-bg:            @state-success-bg;
    -@alert-success-text:          @state-success-text;
    -@alert-success-border:        @state-success-border;
    -
    -@alert-info-bg:               @state-info-bg;
    -@alert-info-text:             @state-info-text;
    -@alert-info-border:           @state-info-border;
    -
    -@alert-warning-bg:            @state-warning-bg;
    -@alert-warning-text:          @state-warning-text;
    -@alert-warning-border:        @state-warning-border;
    -
    -@alert-danger-bg:             @state-danger-bg;
    -@alert-danger-text:           @state-danger-text;
    -@alert-danger-border:         @state-danger-border;
    -
    -
    -//== Progress bars
    -//
    -//##
    -
    -//** Background color of the whole progress component
    -@progress-bg:                 #f5f5f5;
    -//** Progress bar text color
    -@progress-bar-color:          #fff;
    -//** Variable for setting rounded corners on progress bar.
    -@progress-border-radius:      @border-radius-base;
    -
    -//** Default progress bar color
    -@progress-bar-bg:             @brand-primary;
    -//** Success progress bar color
    -@progress-bar-success-bg:     @brand-success;
    -//** Warning progress bar color
    -@progress-bar-warning-bg:     @brand-warning;
    -//** Danger progress bar color
    -@progress-bar-danger-bg:      @brand-danger;
    -//** Info progress bar color
    -@progress-bar-info-bg:        @brand-info;
    -
    -
    -//== List group
    -//
    -//##
    -
    -//** Background color on `.list-group-item`
    -@list-group-bg:                 #fff;
    -//** `.list-group-item` border color
    -@list-group-border:             #ddd;
    -//** List group border radius
    -@list-group-border-radius:      @border-radius-base;
    -
    -//** Background color of single list items on hover
    -@list-group-hover-bg:           #f5f5f5;
    -//** Text color of active list items
    -@list-group-active-color:       @component-active-color;
    -//** Background color of active list items
    -@list-group-active-bg:          @component-active-bg;
    -//** Border color of active list elements
    -@list-group-active-border:      @list-group-active-bg;
    -//** Text color for content within active list items
    -@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
    -
    -//** Text color of disabled list items
    -@list-group-disabled-color:      @gray-light;
    -//** Background color of disabled list items
    -@list-group-disabled-bg:         @gray-lighter;
    -//** Text color for content within disabled list items
    -@list-group-disabled-text-color: @list-group-disabled-color;
    -
    -@list-group-link-color:         #555;
    -@list-group-link-hover-color:   @list-group-link-color;
    -@list-group-link-heading-color: #333;
    -
    -
    -//== Panels
    -//
    -//##
    -
    -@panel-bg:                    #fff;
    -@panel-body-padding:          15px;
    -@panel-heading-padding:       10px 15px;
    -@panel-footer-padding:        @panel-heading-padding;
    -@panel-border-radius:         @border-radius-base;
    -
    -//** Border color for elements within panels
    -@panel-inner-border:          #ddd;
    -@panel-footer-bg:             #f5f5f5;
    -
    -@panel-default-text:          @gray-dark;
    -@panel-default-border:        #ddd;
    -@panel-default-heading-bg:    #f5f5f5;
    -
    -@panel-primary-text:          #fff;
    -@panel-primary-border:        @brand-primary;
    -@panel-primary-heading-bg:    @brand-primary;
    -
    -@panel-success-text:          #fff;
    -@panel-success-border:        @state-success-border;
    -@panel-success-heading-bg:    @brand-success;
    -
    -@panel-info-text:             #fff;
    -@panel-info-border:           @state-info-border;
    -@panel-info-heading-bg:       @brand-info;
    -
    -@panel-warning-text:          #fff;
    -@panel-warning-border:        @state-warning-border;
    -@panel-warning-heading-bg:    @brand-warning;
    -
    -@panel-danger-text:           #fff;
    -@panel-danger-border:         @state-danger-border;
    -@panel-danger-heading-bg:     @brand-danger;
    -
    -
    -//== Thumbnails
    -//
    -//##
    -
    -//** Padding around the thumbnail image
    -@thumbnail-padding:           4px;
    -//** Thumbnail background color
    -@thumbnail-bg:                @body-bg;
    -//** Thumbnail border color
    -@thumbnail-border:            #ddd;
    -//** Thumbnail border radius
    -@thumbnail-border-radius:     @border-radius-base;
    -
    -//** Custom text color for thumbnail captions
    -@thumbnail-caption-color:     @text-color;
    -//** Padding around the thumbnail caption
    -@thumbnail-caption-padding:   9px;
    -
    -
    -//== Wells
    -//
    -//##
    -
    -@well-bg:                     #f9f9f9;
    -@well-border:                 transparent;
    -
    -
    -//== Badges
    -//
    -//##
    -
    -@badge-color:                 #fff;
    -//** Linked badge text color on hover
    -@badge-link-hover-color:      #fff;
    -@badge-bg:                    @gray-light;
    -
    -//** Badge text color in active nav link
    -@badge-active-color:          @link-color;
    -//** Badge background color in active nav link
    -@badge-active-bg:             #fff;
    -
    -@badge-font-weight:           normal;
    -@badge-line-height:           1;
    -@badge-border-radius:         10px;
    -
    -
    -//== Breadcrumbs
    -//
    -//##
    -
    -@breadcrumb-padding-vertical:   8px;
    -@breadcrumb-padding-horizontal: 15px;
    -//** Breadcrumb background color
    -@breadcrumb-bg:                 #f5f5f5;
    -//** Breadcrumb text color
    -@breadcrumb-color:              #ccc;
    -//** Text color of current page in the breadcrumb
    -@breadcrumb-active-color:       @gray-light;
    -//** Textual separator for between breadcrumb elements
    -@breadcrumb-separator:          "/";
    -
    -
    -//== Carousel
    -//
    -//##
    -
    -@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
    -
    -@carousel-control-color:                      #fff;
    -@carousel-control-width:                      15%;
    -@carousel-control-opacity:                    .5;
    -@carousel-control-font-size:                  20px;
    -
    -@carousel-indicator-active-bg:                #fff;
    -@carousel-indicator-border-color:             #fff;
    -
    -@carousel-caption-color:                      #fff;
    -
    -
    -//== Close
    -//
    -//##
    -
    -@close-font-weight:           normal;
    -@close-color:                 #000;
    -@close-text-shadow:           none;
    -
    -
    -//== Code
    -//
    -//##
    -
    -@code-color:                  #c7254e;
    -@code-bg:                     #f9f2f4;
    -
    -@kbd-color:                   #fff;
    -@kbd-bg:                      #333;
    -
    -@pre-bg:                      #f5f5f5;
    -@pre-color:                   @gray-dark;
    -@pre-border-color:            #ccc;
    -@pre-scrollable-max-height:   340px;
    -
    -
    -//== Type
    -//
    -//##
    -
    -//** Horizontal offset for forms and lists.
    -@component-offset-horizontal: 180px;
    -//** Text muted color
    -@text-muted:                  @gray-light;
    -//** Abbreviations and acronyms border color
    -@abbr-border-color:           @gray-light;
    -//** Headings small color
    -@headings-small-color:        @gray-light;
    -//** Blockquote small color
    -@blockquote-small-color:      @gray-light;
    -//** Blockquote font size
    -@blockquote-font-size:        (@font-size-base * 1.25);
    -//** Blockquote border color
    -@blockquote-border-color:     @gray-lighter;
    -//** Page header border color
    -@page-header-border-color:    @gray-lighter;
    -//** Width of horizontal description list titles
    -@dl-horizontal-offset:        @component-offset-horizontal;
    -//** Horizontal line color.
    -@hr-border:                   @gray-lighter;
    +// Paper 3.3.4
    +// Variables
    +// --------------------------------------------------
    +
    +
    +//== Colors
    +//
    +//## Gray and brand colors for use across Bootstrap.
    +
    +@gray-base:              #000;
    +@gray-darker:            lighten(@gray-base, 13.5%); // #222
    +@gray-dark:              #212121;
    +@gray:                   #666;
    +@gray-light:             #bbb;
    +@gray-lighter:           lighten(@gray-base, 93.5%); // #eee
    +
    +@brand-primary:         #2196F3;
    +@brand-success:         #4CAF50;
    +@brand-info:            #9C27B0;
    +@brand-warning:         #ff9800;
    +@brand-danger:          #e51c23;
    +
    +
    +//== Scaffolding
    +//
    +//## Settings for some of the most global styles.
    +
    +//** Background color for ``.
    +@body-bg:               #fff;
    +//** Global text color on ``.
    +@text-color:            @gray;
    +
    +//** Global textual link color.
    +@link-color:            @brand-primary;
    +//** Link hover color set via `darken()` function.
    +@link-hover-color:      darken(@link-color, 15%);
    +//** Link hover decoration.
    +@link-hover-decoration: underline;
    +
    +
    +//== Typography
    +//
    +//## Font, line-height, and color for body text, headings, and more.
    +
    +@font-family-sans-serif:  "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
    +@font-family-serif:       Georgia, "Times New Roman", Times, serif;
    +//** Default monospace fonts for ``, ``, and `
    `.
    +@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
    +@font-family-base:        @font-family-sans-serif;
    +
    +@font-size-base:          13px;
    +@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
    +@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
    +
    +@font-size-h1:            56px;
    +@font-size-h2:            45px;
    +@font-size-h3:            34px;
    +@font-size-h4:            24px;
    +@font-size-h5:            20px;
    +@font-size-h6:            14px;
    +
    +//** Unit-less `line-height` for use in components like buttons.
    +@line-height-base:        1.846; // 20/14
    +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
    +@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
    +
    +//** By default, this inherits from the ``.
    +@headings-font-family:    inherit;
    +@headings-font-weight:    400;
    +@headings-line-height:    1.1;
    +@headings-color:          #444;
    +
    +
    +//== Iconography
    +//
    +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
    +
    +//** Load fonts from this directory.
    +@icon-font-path:          "../fonts/";
    +//** File name for all font files.
    +@icon-font-name:          "glyphicons-halflings-regular";
    +//** Element ID within SVG icon file.
    +@icon-font-svg-id:        "glyphicons_halflingsregular";
    +
    +
    +//== Components
    +//
    +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
    +
    +@padding-base-vertical:     6px;
    +@padding-base-horizontal:   16px;
    +
    +@padding-large-vertical:    10px;
    +@padding-large-horizontal:  16px;
    +
    +@padding-small-vertical:    5px;
    +@padding-small-horizontal:  10px;
    +
    +@padding-xs-vertical:       1px;
    +@padding-xs-horizontal:     5px;
    +
    +@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
    +@line-height-small:         1.5;
    +
    +@border-radius-base:        3px;
    +@border-radius-large:       3px;
    +@border-radius-small:       3px;
    +
    +//** Global color for active items (e.g., navs or dropdowns).
    +@component-active-color:    #fff;
    +//** Global background color for active items (e.g., navs or dropdowns).
    +@component-active-bg:       @brand-primary;
    +
    +//** Width of the `border` for generating carets that indicator dropdowns.
    +@caret-width-base:          4px;
    +//** Carets increase slightly in size for larger components.
    +@caret-width-large:         5px;
    +
    +
    +//== Tables
    +//
    +//## Customizes the `.table` component with basic values, each used across all table variations.
    +
    +//** Padding for ``s and ``s.
    +@table-cell-padding:            8px;
    +//** Padding for cells in `.table-condensed`.
    +@table-condensed-cell-padding:  5px;
    +
    +//** Default background color used for all tables.
    +@table-bg:                      transparent;
    +//** Background color used for `.table-striped`.
    +@table-bg-accent:               #f9f9f9;
    +//** Background color used for `.table-hover`.
    +@table-bg-hover:                #f5f5f5;
    +@table-bg-active:               @table-bg-hover;
    +
    +//** Border color for table and cell borders.
    +@table-border-color:            #ddd;
    +
    +
    +//== Buttons
    +//
    +//## For each of Bootstrap's buttons, define text, background and border color.
    +
    +@btn-font-weight:                normal;
    +
    +@btn-default-color:              @text-color;
    +@btn-default-bg:                 #fff;
    +@btn-default-border:             #eee;
    +
    +@btn-primary-color:              #fff;
    +@btn-primary-bg:                 @brand-primary;
    +@btn-primary-border:             transparent;
    +
    +@btn-success-color:              #fff;
    +@btn-success-bg:                 @brand-success;
    +@btn-success-border:             transparent;
    +
    +@btn-info-color:                 #fff;
    +@btn-info-bg:                    @brand-info;
    +@btn-info-border:                transparent;
    +
    +@btn-warning-color:              #fff;
    +@btn-warning-bg:                 @brand-warning;
    +@btn-warning-border:             transparent;
    +
    +@btn-danger-color:               #fff;
    +@btn-danger-bg:                  @brand-danger;
    +@btn-danger-border:              transparent;
    +
    +@btn-link-disabled-color:        @gray-light;
    +
    +
    +//== Forms
    +//
    +//##
    +
    +//** `` background color
    +@input-bg:                       transparent;
    +//** `` background color
    +@input-bg-disabled:              transparent;
    +
    +//** Text color for ``s
    +@input-color:                    @gray;
    +//** `` border color
    +@input-border:                   transparent;
    +
    +// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
    +//** Default `.form-control` border radius
    +// This has no effect on ``s in CSS.
    +@input-border-radius:            @border-radius-base;
    +//** Large `.form-control` border radius
    +@input-border-radius-large:      @border-radius-large;
    +//** Small `.form-control` border radius
    +@input-border-radius-small:      @border-radius-small;
    +
    +//** Border color for inputs on focus
    +@input-border-focus:             #66afe9;
    +
    +//** Placeholder text color
    +@input-color-placeholder:        @gray-light;
    +
    +//** Default `.form-control` height
    +@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
    +//** Large `.form-control` height
    +@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
    +//** Small `.form-control` height
    +@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
    +
    +//** `.form-group` margin
    +@form-group-margin-bottom:       15px;
    +
    +@legend-color:                   @gray-dark;
    +@legend-border-color:            #e5e5e5;
    +
    +//** Background color for textual input addons
    +@input-group-addon-bg:           transparent;
    +//** Border color for textual input addons
    +@input-group-addon-border-color: @input-border;
    +
    +//** Disabled cursor for form controls and buttons.
    +@cursor-disabled:                not-allowed;
    +
    +
    +//== Dropdowns
    +//
    +//## Dropdown menu container and contents.
    +
    +//** Background for the dropdown menu.
    +@dropdown-bg:                    #fff;
    +//** Dropdown menu `border-color`.
    +@dropdown-border:                rgba(0,0,0,.15);
    +//** Dropdown menu `border-color` **for IE8**.
    +@dropdown-fallback-border:       #ccc;
    +//** Divider color for between dropdown items.
    +@dropdown-divider-bg:            #e5e5e5;
    +
    +//** Dropdown link text color.
    +@dropdown-link-color:            @text-color;
    +//** Hover color for dropdown links.
    +@dropdown-link-hover-color:      darken(@gray-dark, 5%);
    +//** Hover background for dropdown links.
    +@dropdown-link-hover-bg:         @gray-lighter;
    +
    +//** Active dropdown menu item text color.
    +@dropdown-link-active-color:     @component-active-color;
    +//** Active dropdown menu item background color.
    +@dropdown-link-active-bg:        @component-active-bg;
    +
    +//** Disabled dropdown menu item background color.
    +@dropdown-link-disabled-color:   @gray-light;
    +
    +//** Text color for headers within dropdown menus.
    +@dropdown-header-color:          @gray-light;
    +
    +//** Deprecated `@dropdown-caret-color` as of v3.1.0
    +@dropdown-caret-color:           @gray-light;
    +
    +
    +//-- Z-index master list
    +//
    +// Warning: Avoid customizing these values. They're used for a bird's eye view
    +// of components dependent on the z-axis and are designed to all work together.
    +//
    +// Note: These variables are not generated into the Customizer.
    +
    +@zindex-navbar:            1000;
    +@zindex-dropdown:          1000;
    +@zindex-popover:           1060;
    +@zindex-tooltip:           1070;
    +@zindex-navbar-fixed:      1030;
    +@zindex-modal-background:  1040;
    +@zindex-modal:             1050;
    +
    +
    +//== Media queries breakpoints
    +//
    +//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
    +
    +// Extra small screen / phone
    +//** Deprecated `@screen-xs` as of v3.0.1
    +@screen-xs:                  480px;
    +//** Deprecated `@screen-xs-min` as of v3.2.0
    +@screen-xs-min:              @screen-xs;
    +//** Deprecated `@screen-phone` as of v3.0.1
    +@screen-phone:               @screen-xs-min;
    +
    +// Small screen / tablet
    +//** Deprecated `@screen-sm` as of v3.0.1
    +@screen-sm:                  768px;
    +@screen-sm-min:              @screen-sm;
    +//** Deprecated `@screen-tablet` as of v3.0.1
    +@screen-tablet:              @screen-sm-min;
    +
    +// Medium screen / desktop
    +//** Deprecated `@screen-md` as of v3.0.1
    +@screen-md:                  992px;
    +@screen-md-min:              @screen-md;
    +//** Deprecated `@screen-desktop` as of v3.0.1
    +@screen-desktop:             @screen-md-min;
    +
    +// Large screen / wide desktop
    +//** Deprecated `@screen-lg` as of v3.0.1
    +@screen-lg:                  1200px;
    +@screen-lg-min:              @screen-lg;
    +//** Deprecated `@screen-lg-desktop` as of v3.0.1
    +@screen-lg-desktop:          @screen-lg-min;
    +
    +// So media queries don't overlap when required, provide a maximum
    +@screen-xs-max:              (@screen-sm-min - 1);
    +@screen-sm-max:              (@screen-md-min - 1);
    +@screen-md-max:              (@screen-lg-min - 1);
    +
    +
    +//== Grid system
    +//
    +//## Define your custom responsive grid.
    +
    +//** Number of columns in the grid.
    +@grid-columns:              12;
    +//** Padding between columns. Gets divided in half for the left and right.
    +@grid-gutter-width:         30px;
    +// Navbar collapse
    +//** Point at which the navbar becomes uncollapsed.
    +@grid-float-breakpoint:     @screen-sm-min;
    +//** Point at which the navbar begins collapsing.
    +@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
    +
    +
    +//== Container sizes
    +//
    +//## Define the maximum width of `.container` for different screen sizes.
    +
    +// Small screen / tablet
    +@container-tablet:             (720px + @grid-gutter-width);
    +//** For `@screen-sm-min` and up.
    +@container-sm:                 @container-tablet;
    +
    +// Medium screen / desktop
    +@container-desktop:            (940px + @grid-gutter-width);
    +//** For `@screen-md-min` and up.
    +@container-md:                 @container-desktop;
    +
    +// Large screen / wide desktop
    +@container-large-desktop:      (1140px + @grid-gutter-width);
    +//** For `@screen-lg-min` and up.
    +@container-lg:                 @container-large-desktop;
    +
    +
    +//== Navbar
    +//
    +//##
    +
    +// Basics of a navbar
    +@navbar-height:                    64px;
    +@navbar-margin-bottom:             @line-height-computed;
    +@navbar-border-radius:             @border-radius-base;
    +@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
    +@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
    +@navbar-collapse-max-height:       340px;
    +
    +@navbar-default-color:             @gray-light;
    +@navbar-default-bg:                #fff;
    +@navbar-default-border:            transparent;
    +
    +// Navbar links
    +@navbar-default-link-color:                @gray;
    +@navbar-default-link-hover-color:          @gray-dark;
    +@navbar-default-link-hover-bg:             transparent;
    +@navbar-default-link-active-color:         @gray-dark;
    +@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
    +@navbar-default-link-disabled-color:       #ccc;
    +@navbar-default-link-disabled-bg:          transparent;
    +
    +// Navbar brand label
    +@navbar-default-brand-color:               @navbar-default-link-color;
    +@navbar-default-brand-hover-color:         @navbar-default-link-hover-color;
    +@navbar-default-brand-hover-bg:            transparent;
    +
    +// Navbar toggle
    +@navbar-default-toggle-hover-bg:           transparent;
    +@navbar-default-toggle-icon-bar-bg:        rgba(0,0,0,0.5);
    +@navbar-default-toggle-border-color:       transparent;
    +
    +
    +// Inverted navbar
    +// Reset inverted navbar basics
    +@navbar-inverse-color:                      @gray-light;
    +@navbar-inverse-bg:                         @brand-primary;
    +@navbar-inverse-border:                     transparent;
    +
    +// Inverted navbar links
    +@navbar-inverse-link-color:                 lighten(@brand-primary, 30%);
    +@navbar-inverse-link-hover-color:           #fff;
    +@navbar-inverse-link-hover-bg:              transparent;
    +@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
    +@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
    +@navbar-inverse-link-disabled-color:        #444;
    +@navbar-inverse-link-disabled-bg:           transparent;
    +
    +// Inverted navbar brand label
    +@navbar-inverse-brand-color:                @navbar-inverse-link-color;
    +@navbar-inverse-brand-hover-color:          #fff;
    +@navbar-inverse-brand-hover-bg:             transparent;
    +
    +// Inverted navbar toggle\
    +@navbar-inverse-toggle-hover-bg:            transparent;
    +@navbar-inverse-toggle-icon-bar-bg:         rgba(0,0,0,0.5);
    +@navbar-inverse-toggle-border-color:        transparent;
    +
    +
    +//== Navs
    +//
    +//##
    +
    +//=== Shared nav styles
    +@nav-link-padding:                          10px 15px;
    +@nav-link-hover-bg:                         @gray-lighter;
    +
    +@nav-disabled-link-color:                   @gray-light;
    +@nav-disabled-link-hover-color:             @gray-light;
    +
    +//== Tabs
    +@nav-tabs-border-color:                     transparent;
    +
    +@nav-tabs-link-hover-border-color:          @gray-lighter;
    +
    +@nav-tabs-active-link-hover-bg:             transparent;
    +@nav-tabs-active-link-hover-color:          @gray;
    +@nav-tabs-active-link-hover-border-color:   transparent;
    +
    +@nav-tabs-justified-link-border-color:            @nav-tabs-border-color;
    +@nav-tabs-justified-active-link-border-color:     @body-bg;
    +
    +//== Pills
    +@nav-pills-border-radius:                   @border-radius-base;
    +@nav-pills-active-link-hover-bg:            @component-active-bg;
    +@nav-pills-active-link-hover-color:         @component-active-color;
    +
    +
    +//== Pagination
    +//
    +//##
    +
    +@pagination-color:                     @link-color;
    +@pagination-bg:                        #fff;
    +@pagination-border:                    #ddd;
    +
    +@pagination-hover-color:               @link-hover-color;
    +@pagination-hover-bg:                  @gray-lighter;
    +@pagination-hover-border:              #ddd;
    +
    +@pagination-active-color:              #fff;
    +@pagination-active-bg:                 @brand-primary;
    +@pagination-active-border:             @brand-primary;
    +
    +@pagination-disabled-color:            @gray-light;
    +@pagination-disabled-bg:               #fff;
    +@pagination-disabled-border:           #ddd;
    +
    +
    +//== Pager
    +//
    +//##
    +
    +@pager-bg:                             @pagination-bg;
    +@pager-border:                         @pagination-border;
    +@pager-border-radius:                  15px;
    +
    +@pager-hover-bg:                       @pagination-hover-bg;
    +
    +@pager-active-bg:                      @pagination-active-bg;
    +@pager-active-color:                   @pagination-active-color;
    +
    +@pager-disabled-color:                 @pagination-disabled-color;
    +
    +
    +//== Jumbotron
    +//
    +//##
    +
    +@jumbotron-padding:              30px;
    +@jumbotron-color:                inherit;
    +@jumbotron-bg:                   #f9f9f9;
    +@jumbotron-heading-color:        @headings-color;
    +@jumbotron-font-size:            ceil((@font-size-base * 1.5));
    +
    +
    +//== Form states and alerts
    +//
    +//## Define colors for form feedback states and, by default, alerts.
    +
    +@state-success-text:             @brand-success;
    +@state-success-bg:               #dff0d8;
    +@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
    +
    +@state-info-text:                @brand-info;
    +@state-info-bg:                  #e1bee7;
    +@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
    +
    +@state-warning-text:             @brand-warning;
    +@state-warning-bg:               #ffe0b2;
    +@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
    +
    +@state-danger-text:              @brand-danger;
    +@state-danger-bg:                #f9bdbb;
    +@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
    +
    +
    +//== Tooltips
    +//
    +//##
    +
    +//** Tooltip max width
    +@tooltip-max-width:           200px;
    +//** Tooltip text color
    +@tooltip-color:               #fff;
    +//** Tooltip background color
    +@tooltip-bg:                  #727272;
    +@tooltip-opacity:             .9;
    +
    +//** Tooltip arrow width
    +@tooltip-arrow-width:         5px;
    +//** Tooltip arrow color
    +@tooltip-arrow-color:         @tooltip-bg;
    +
    +
    +//== Popovers
    +//
    +//##
    +
    +//** Popover body background color
    +@popover-bg:                          #fff;
    +//** Popover maximum width
    +@popover-max-width:                   276px;
    +//** Popover border color
    +@popover-border-color:                transparent;
    +//** Popover fallback border color
    +@popover-fallback-border-color:       transparent;
    +
    +//** Popover title background color
    +@popover-title-bg:                    darken(@popover-bg, 3%);
    +
    +//** Popover arrow width
    +@popover-arrow-width:                 10px;
    +//** Popover arrow color
    +@popover-arrow-color:                 @popover-bg;
    +
    +//** Popover outer arrow width
    +@popover-arrow-outer-width:           (@popover-arrow-width + 1);
    +//** Popover outer arrow color
    +@popover-arrow-outer-color:           fadein(@popover-border-color, 7.5%);
    +//** Popover outer arrow fallback color
    +@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
    +
    +
    +//== Labels
    +//
    +//##
    +
    +//** Default label background color
    +@label-default-bg:            @gray-light;
    +//** Primary label background color
    +@label-primary-bg:            @brand-primary;
    +//** Success label background color
    +@label-success-bg:            @brand-success;
    +//** Info label background color
    +@label-info-bg:               @brand-info;
    +//** Warning label background color
    +@label-warning-bg:            @brand-warning;
    +//** Danger label background color
    +@label-danger-bg:             @brand-danger;
    +
    +//** Default label text color
    +@label-color:                 #fff;
    +//** Default text color of a linked label
    +@label-link-hover-color:      #fff;
    +
    +
    +//== Modals
    +//
    +//##
    +
    +//** Padding applied to the modal body
    +@modal-inner-padding:         15px;
    +
    +//** Padding applied to the modal title
    +@modal-title-padding:         15px;
    +//** Modal title line-height
    +@modal-title-line-height:     @line-height-base;
    +
    +//** Background color of modal content area
    +@modal-content-bg:                             #fff;
    +//** Modal content border color
    +@modal-content-border-color:                   transparent;
    +//** Modal content border color **for IE8**
    +@modal-content-fallback-border-color:          #999;
    +
    +//** Modal backdrop background color
    +@modal-backdrop-bg:           #000;
    +//** Modal backdrop opacity
    +@modal-backdrop-opacity:      .5;
    +//** Modal header border color
    +@modal-header-border-color:   transparent;
    +//** Modal footer border color
    +@modal-footer-border-color:   @modal-header-border-color;
    +
    +@modal-lg:                    900px;
    +@modal-md:                    600px;
    +@modal-sm:                    300px;
    +
    +
    +//== Alerts
    +//
    +//## Define alert colors, border radius, and padding.
    +
    +@alert-padding:               15px;
    +@alert-border-radius:         @border-radius-base;
    +@alert-link-font-weight:      bold;
    +
    +@alert-success-bg:            @state-success-bg;
    +@alert-success-text:          @state-success-text;
    +@alert-success-border:        @state-success-border;
    +
    +@alert-info-bg:               @state-info-bg;
    +@alert-info-text:             @state-info-text;
    +@alert-info-border:           @state-info-border;
    +
    +@alert-warning-bg:            @state-warning-bg;
    +@alert-warning-text:          @state-warning-text;
    +@alert-warning-border:        @state-warning-border;
    +
    +@alert-danger-bg:             @state-danger-bg;
    +@alert-danger-text:           @state-danger-text;
    +@alert-danger-border:         @state-danger-border;
    +
    +
    +//== Progress bars
    +//
    +//##
    +
    +//** Background color of the whole progress component
    +@progress-bg:                 #f5f5f5;
    +//** Progress bar text color
    +@progress-bar-color:          #fff;
    +//** Variable for setting rounded corners on progress bar.
    +@progress-border-radius:      @border-radius-base;
    +
    +//** Default progress bar color
    +@progress-bar-bg:             @brand-primary;
    +//** Success progress bar color
    +@progress-bar-success-bg:     @brand-success;
    +//** Warning progress bar color
    +@progress-bar-warning-bg:     @brand-warning;
    +//** Danger progress bar color
    +@progress-bar-danger-bg:      @brand-danger;
    +//** Info progress bar color
    +@progress-bar-info-bg:        @brand-info;
    +
    +
    +//== List group
    +//
    +//##
    +
    +//** Background color on `.list-group-item`
    +@list-group-bg:                 #fff;
    +//** `.list-group-item` border color
    +@list-group-border:             #ddd;
    +//** List group border radius
    +@list-group-border-radius:      @border-radius-base;
    +
    +//** Background color of single list items on hover
    +@list-group-hover-bg:           #f5f5f5;
    +//** Text color of active list items
    +@list-group-active-color:       @component-active-color;
    +//** Background color of active list items
    +@list-group-active-bg:          @component-active-bg;
    +//** Border color of active list elements
    +@list-group-active-border:      @list-group-active-bg;
    +//** Text color for content within active list items
    +@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
    +
    +//** Text color of disabled list items
    +@list-group-disabled-color:      @gray-light;
    +//** Background color of disabled list items
    +@list-group-disabled-bg:         @gray-lighter;
    +//** Text color for content within disabled list items
    +@list-group-disabled-text-color: @list-group-disabled-color;
    +
    +@list-group-link-color:         #555;
    +@list-group-link-hover-color:   @list-group-link-color;
    +@list-group-link-heading-color: #333;
    +
    +
    +//== Panels
    +//
    +//##
    +
    +@panel-bg:                    #fff;
    +@panel-body-padding:          15px;
    +@panel-heading-padding:       10px 15px;
    +@panel-footer-padding:        @panel-heading-padding;
    +@panel-border-radius:         @border-radius-base;
    +
    +//** Border color for elements within panels
    +@panel-inner-border:          #ddd;
    +@panel-footer-bg:             #f5f5f5;
    +
    +@panel-default-text:          @gray-dark;
    +@panel-default-border:        #ddd;
    +@panel-default-heading-bg:    #f5f5f5;
    +
    +@panel-primary-text:          #fff;
    +@panel-primary-border:        @brand-primary;
    +@panel-primary-heading-bg:    @brand-primary;
    +
    +@panel-success-text:          #fff;
    +@panel-success-border:        @state-success-border;
    +@panel-success-heading-bg:    @brand-success;
    +
    +@panel-info-text:             #fff;
    +@panel-info-border:           @state-info-border;
    +@panel-info-heading-bg:       @brand-info;
    +
    +@panel-warning-text:          #fff;
    +@panel-warning-border:        @state-warning-border;
    +@panel-warning-heading-bg:    @brand-warning;
    +
    +@panel-danger-text:           #fff;
    +@panel-danger-border:         @state-danger-border;
    +@panel-danger-heading-bg:     @brand-danger;
    +
    +
    +//== Thumbnails
    +//
    +//##
    +
    +//** Padding around the thumbnail image
    +@thumbnail-padding:           4px;
    +//** Thumbnail background color
    +@thumbnail-bg:                @body-bg;
    +//** Thumbnail border color
    +@thumbnail-border:            #ddd;
    +//** Thumbnail border radius
    +@thumbnail-border-radius:     @border-radius-base;
    +
    +//** Custom text color for thumbnail captions
    +@thumbnail-caption-color:     @text-color;
    +//** Padding around the thumbnail caption
    +@thumbnail-caption-padding:   9px;
    +
    +
    +//== Wells
    +//
    +//##
    +
    +@well-bg:                     #f9f9f9;
    +@well-border:                 transparent;
    +
    +
    +//== Badges
    +//
    +//##
    +
    +@badge-color:                 #fff;
    +//** Linked badge text color on hover
    +@badge-link-hover-color:      #fff;
    +@badge-bg:                    @gray-light;
    +
    +//** Badge text color in active nav link
    +@badge-active-color:          @link-color;
    +//** Badge background color in active nav link
    +@badge-active-bg:             #fff;
    +
    +@badge-font-weight:           normal;
    +@badge-line-height:           1;
    +@badge-border-radius:         10px;
    +
    +
    +//== Breadcrumbs
    +//
    +//##
    +
    +@breadcrumb-padding-vertical:   8px;
    +@breadcrumb-padding-horizontal: 15px;
    +//** Breadcrumb background color
    +@breadcrumb-bg:                 #f5f5f5;
    +//** Breadcrumb text color
    +@breadcrumb-color:              #ccc;
    +//** Text color of current page in the breadcrumb
    +@breadcrumb-active-color:       @gray-light;
    +//** Textual separator for between breadcrumb elements
    +@breadcrumb-separator:          "/";
    +
    +
    +//== Carousel
    +//
    +//##
    +
    +@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
    +
    +@carousel-control-color:                      #fff;
    +@carousel-control-width:                      15%;
    +@carousel-control-opacity:                    .5;
    +@carousel-control-font-size:                  20px;
    +
    +@carousel-indicator-active-bg:                #fff;
    +@carousel-indicator-border-color:             #fff;
    +
    +@carousel-caption-color:                      #fff;
    +
    +
    +//== Close
    +//
    +//##
    +
    +@close-font-weight:           normal;
    +@close-color:                 #000;
    +@close-text-shadow:           none;
    +
    +
    +//== Code
    +//
    +//##
    +
    +@code-color:                  #c7254e;
    +@code-bg:                     #f9f2f4;
    +
    +@kbd-color:                   #fff;
    +@kbd-bg:                      #333;
    +
    +@pre-bg:                      #f5f5f5;
    +@pre-color:                   @gray-dark;
    +@pre-border-color:            #ccc;
    +@pre-scrollable-max-height:   340px;
    +
    +
    +//== Type
    +//
    +//##
    +
    +//** Horizontal offset for forms and lists.
    +@component-offset-horizontal: 180px;
    +//** Text muted color
    +@text-muted:                  @gray-light;
    +//** Abbreviations and acronyms border color
    +@abbr-border-color:           @gray-light;
    +//** Headings small color
    +@headings-small-color:        @gray-light;
    +//** Blockquote small color
    +@blockquote-small-color:      @gray-light;
    +//** Blockquote font size
    +@blockquote-font-size:        (@font-size-base * 1.25);
    +//** Blockquote border color
    +@blockquote-border-color:     @gray-lighter;
    +//** Page header border color
    +@page-header-border-color:    @gray-lighter;
    +//** Width of horizontal description list titles
    +@dl-horizontal-offset:        @component-offset-horizontal;
    +//** Horizontal line color.
    +@hr-border:                   @gray-lighter;
    diff --git a/assets/less/font-awesome/animated.less b/assets/less/font-awesome/animated.less
    index 66ad52a..f9f1a47 100644
    --- a/assets/less/font-awesome/animated.less
    +++ b/assets/less/font-awesome/animated.less
    @@ -1,34 +1,34 @@
    -// Animated Icons
    -// --------------------------
    -
    -.@{fa-css-prefix}-spin {
    -  -webkit-animation: fa-spin 2s infinite linear;
    -          animation: fa-spin 2s infinite linear;
    -}
    -
    -.@{fa-css-prefix}-pulse {
    -  -webkit-animation: fa-spin 1s infinite steps(8);
    -          animation: fa-spin 1s infinite steps(8);
    -}
    -
    -@-webkit-keyframes fa-spin {
    -  0% {
    -    -webkit-transform: rotate(0deg);
    -            transform: rotate(0deg);
    -  }
    -  100% {
    -    -webkit-transform: rotate(359deg);
    -            transform: rotate(359deg);
    -  }
    -}
    -
    -@keyframes fa-spin {
    -  0% {
    -    -webkit-transform: rotate(0deg);
    -            transform: rotate(0deg);
    -  }
    -  100% {
    -    -webkit-transform: rotate(359deg);
    -            transform: rotate(359deg);
    -  }
    -}
    +// Animated Icons
    +// --------------------------
    +
    +.@{fa-css-prefix}-spin {
    +  -webkit-animation: fa-spin 2s infinite linear;
    +          animation: fa-spin 2s infinite linear;
    +}
    +
    +.@{fa-css-prefix}-pulse {
    +  -webkit-animation: fa-spin 1s infinite steps(8);
    +          animation: fa-spin 1s infinite steps(8);
    +}
    +
    +@-webkit-keyframes fa-spin {
    +  0% {
    +    -webkit-transform: rotate(0deg);
    +            transform: rotate(0deg);
    +  }
    +  100% {
    +    -webkit-transform: rotate(359deg);
    +            transform: rotate(359deg);
    +  }
    +}
    +
    +@keyframes fa-spin {
    +  0% {
    +    -webkit-transform: rotate(0deg);
    +            transform: rotate(0deg);
    +  }
    +  100% {
    +    -webkit-transform: rotate(359deg);
    +            transform: rotate(359deg);
    +  }
    +}
    diff --git a/assets/less/font-awesome/bordered-pulled.less b/assets/less/font-awesome/bordered-pulled.less
    index f1c8ad7..481339a 100644
    --- a/assets/less/font-awesome/bordered-pulled.less
    +++ b/assets/less/font-awesome/bordered-pulled.less
    @@ -1,25 +1,25 @@
    -// Bordered & Pulled
    -// -------------------------
    -
    -.@{fa-css-prefix}-border {
    -  padding: .2em .25em .15em;
    -  border: solid .08em @fa-border-color;
    -  border-radius: .1em;
    -}
    -
    -.@{fa-css-prefix}-pull-left { float: left; }
    -.@{fa-css-prefix}-pull-right { float: right; }
    -
    -.@{fa-css-prefix} {
    -  &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
    -  &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
    -}
    -
    -/* Deprecated as of 4.4.0 */
    -.pull-right { float: right; }
    -.pull-left { float: left; }
    -
    -.@{fa-css-prefix} {
    -  &.pull-left { margin-right: .3em; }
    -  &.pull-right { margin-left: .3em; }
    -}
    +// Bordered & Pulled
    +// -------------------------
    +
    +.@{fa-css-prefix}-border {
    +  padding: .2em .25em .15em;
    +  border: solid .08em @fa-border-color;
    +  border-radius: .1em;
    +}
    +
    +.@{fa-css-prefix}-pull-left { float: left; }
    +.@{fa-css-prefix}-pull-right { float: right; }
    +
    +.@{fa-css-prefix} {
    +  &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
    +  &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
    +}
    +
    +/* Deprecated as of 4.4.0 */
    +.pull-right { float: right; }
    +.pull-left { float: left; }
    +
    +.@{fa-css-prefix} {
    +  &.pull-left { margin-right: .3em; }
    +  &.pull-right { margin-left: .3em; }
    +}
    diff --git a/assets/less/font-awesome/core.less b/assets/less/font-awesome/core.less
    index c577ac8..1693826 100644
    --- a/assets/less/font-awesome/core.less
    +++ b/assets/less/font-awesome/core.less
    @@ -1,12 +1,12 @@
    -// Base Class Definition
    -// -------------------------
    -
    -.@{fa-css-prefix} {
    -  display: inline-block;
    -  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
    -  font-size: inherit; // can't have font-size inherit on line above, so need to override
    -  text-rendering: auto; // optimizelegibility throws things off #1094
    -  -webkit-font-smoothing: antialiased;
    -  -moz-osx-font-smoothing: grayscale;
    -
    -}
    +// Base Class Definition
    +// -------------------------
    +
    +.@{fa-css-prefix} {
    +  display: inline-block;
    +  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
    +  font-size: inherit; // can't have font-size inherit on line above, so need to override
    +  text-rendering: auto; // optimizelegibility throws things off #1094
    +  -webkit-font-smoothing: antialiased;
    +  -moz-osx-font-smoothing: grayscale;
    +
    +}
    diff --git a/assets/less/font-awesome/fixed-width.less b/assets/less/font-awesome/fixed-width.less
    index 110289f..4fd1ed3 100644
    --- a/assets/less/font-awesome/fixed-width.less
    +++ b/assets/less/font-awesome/fixed-width.less
    @@ -1,6 +1,6 @@
    -// Fixed Width Icons
    -// -------------------------
    -.@{fa-css-prefix}-fw {
    -  width: (18em / 14);
    -  text-align: center;
    -}
    +// Fixed Width Icons
    +// -------------------------
    +.@{fa-css-prefix}-fw {
    +  width: (18em / 14);
    +  text-align: center;
    +}
    diff --git a/assets/less/font-awesome/font-awesome.less b/assets/less/font-awesome/font-awesome.less
    index c44e5f4..ff77f52 100644
    --- a/assets/less/font-awesome/font-awesome.less
    +++ b/assets/less/font-awesome/font-awesome.less
    @@ -1,18 +1,18 @@
    -/*!
    - *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
    - *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
    - */
    -
    -@import "variables.less";
    -@import "mixins.less";
    -@import "path.less";
    -@import "core.less";
    -@import "larger.less";
    -@import "fixed-width.less";
    -@import "list.less";
    -@import "bordered-pulled.less";
    -@import "animated.less";
    -@import "rotated-flipped.less";
    -@import "stacked.less";
    -@import "icons.less";
    -@import "screen-reader.less";
    +/*!
    + *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
    + *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
    + */
    +
    +@import "variables.less";
    +@import "mixins.less";
    +@import "path.less";
    +@import "core.less";
    +@import "larger.less";
    +@import "fixed-width.less";
    +@import "list.less";
    +@import "bordered-pulled.less";
    +@import "animated.less";
    +@import "rotated-flipped.less";
    +@import "stacked.less";
    +@import "icons.less";
    +@import "screen-reader.less";
    diff --git a/assets/less/font-awesome/icons.less b/assets/less/font-awesome/icons.less
    index ba21b22..7b15a32 100644
    --- a/assets/less/font-awesome/icons.less
    +++ b/assets/less/font-awesome/icons.less
    @@ -1,733 +1,733 @@
    -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
    -   readers do not read off random characters that represent icons */
    -
    -.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
    -.@{fa-css-prefix}-music:before { content: @fa-var-music; }
    -.@{fa-css-prefix}-search:before { content: @fa-var-search; }
    -.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
    -.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
    -.@{fa-css-prefix}-star:before { content: @fa-var-star; }
    -.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
    -.@{fa-css-prefix}-user:before { content: @fa-var-user; }
    -.@{fa-css-prefix}-film:before { content: @fa-var-film; }
    -.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
    -.@{fa-css-prefix}-th:before { content: @fa-var-th; }
    -.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
    -.@{fa-css-prefix}-check:before { content: @fa-var-check; }
    -.@{fa-css-prefix}-remove:before,
    -.@{fa-css-prefix}-close:before,
    -.@{fa-css-prefix}-times:before { content: @fa-var-times; }
    -.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
    -.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
    -.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
    -.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
    -.@{fa-css-prefix}-gear:before,
    -.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
    -.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
    -.@{fa-css-prefix}-home:before { content: @fa-var-home; }
    -.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
    -.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
    -.@{fa-css-prefix}-road:before { content: @fa-var-road; }
    -.@{fa-css-prefix}-download:before { content: @fa-var-download; }
    -.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
    -.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
    -.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
    -.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
    -.@{fa-css-prefix}-rotate-right:before,
    -.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
    -.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
    -.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
    -.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
    -.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
    -.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
    -.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
    -.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
    -.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
    -.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
    -.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
    -.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
    -.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
    -.@{fa-css-prefix}-book:before { content: @fa-var-book; }
    -.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
    -.@{fa-css-prefix}-print:before { content: @fa-var-print; }
    -.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
    -.@{fa-css-prefix}-font:before { content: @fa-var-font; }
    -.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
    -.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
    -.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
    -.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
    -.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
    -.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
    -.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
    -.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
    -.@{fa-css-prefix}-list:before { content: @fa-var-list; }
    -.@{fa-css-prefix}-dedent:before,
    -.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
    -.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
    -.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
    -.@{fa-css-prefix}-photo:before,
    -.@{fa-css-prefix}-image:before,
    -.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
    -.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
    -.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
    -.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
    -.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
    -.@{fa-css-prefix}-edit:before,
    -.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
    -.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
    -.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
    -.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
    -.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
    -.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
    -.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
    -.@{fa-css-prefix}-play:before { content: @fa-var-play; }
    -.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
    -.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
    -.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
    -.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
    -.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
    -.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
    -.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
    -.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
    -.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
    -.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
    -.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
    -.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
    -.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
    -.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
    -.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
    -.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
    -.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
    -.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
    -.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
    -.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
    -.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
    -.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
    -.@{fa-css-prefix}-mail-forward:before,
    -.@{fa-css-prefix}-share:before { content: @fa-var-share; }
    -.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
    -.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
    -.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
    -.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
    -.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
    -.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
    -.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
    -.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
    -.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
    -.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
    -.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
    -.@{fa-css-prefix}-warning:before,
    -.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
    -.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
    -.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
    -.@{fa-css-prefix}-random:before { content: @fa-var-random; }
    -.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
    -.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
    -.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
    -.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
    -.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
    -.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
    -.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
    -.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
    -.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
    -.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
    -.@{fa-css-prefix}-bar-chart-o:before,
    -.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
    -.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
    -.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
    -.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
    -.@{fa-css-prefix}-key:before { content: @fa-var-key; }
    -.@{fa-css-prefix}-gears:before,
    -.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
    -.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
    -.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
    -.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
    -.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
    -.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
    -.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
    -.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
    -.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
    -.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
    -.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
    -.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
    -.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
    -.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
    -.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
    -.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
    -.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
    -.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
    -.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
    -.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
    -.@{fa-css-prefix}-facebook-f:before,
    -.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
    -.@{fa-css-prefix}-github:before { content: @fa-var-github; }
    -.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
    -.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
    -.@{fa-css-prefix}-feed:before,
    -.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
    -.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
    -.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
    -.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
    -.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
    -.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
    -.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
    -.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
    -.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
    -.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
    -.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
    -.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
    -.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
    -.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
    -.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
    -.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
    -.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
    -.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
    -.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
    -.@{fa-css-prefix}-group:before,
    -.@{fa-css-prefix}-users:before { content: @fa-var-users; }
    -.@{fa-css-prefix}-chain:before,
    -.@{fa-css-prefix}-link:before { content: @fa-var-link; }
    -.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
    -.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
    -.@{fa-css-prefix}-cut:before,
    -.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
    -.@{fa-css-prefix}-copy:before,
    -.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
    -.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
    -.@{fa-css-prefix}-save:before,
    -.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
    -.@{fa-css-prefix}-square:before { content: @fa-var-square; }
    -.@{fa-css-prefix}-navicon:before,
    -.@{fa-css-prefix}-reorder:before,
    -.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
    -.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
    -.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
    -.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
    -.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
    -.@{fa-css-prefix}-table:before { content: @fa-var-table; }
    -.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
    -.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
    -.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
    -.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
    -.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
    -.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
    -.@{fa-css-prefix}-money:before { content: @fa-var-money; }
    -.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
    -.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
    -.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
    -.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
    -.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
    -.@{fa-css-prefix}-unsorted:before,
    -.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
    -.@{fa-css-prefix}-sort-down:before,
    -.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
    -.@{fa-css-prefix}-sort-up:before,
    -.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
    -.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
    -.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
    -.@{fa-css-prefix}-rotate-left:before,
    -.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
    -.@{fa-css-prefix}-legal:before,
    -.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
    -.@{fa-css-prefix}-dashboard:before,
    -.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
    -.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
    -.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
    -.@{fa-css-prefix}-flash:before,
    -.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
    -.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
    -.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
    -.@{fa-css-prefix}-paste:before,
    -.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
    -.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
    -.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
    -.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
    -.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
    -.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
    -.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
    -.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
    -.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
    -.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
    -.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
    -.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
    -.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
    -.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
    -.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
    -.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
    -.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
    -.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
    -.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
    -.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
    -.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
    -.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
    -.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
    -.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
    -.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
    -.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
    -.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
    -.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
    -.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
    -.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
    -.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
    -.@{fa-css-prefix}-mobile-phone:before,
    -.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
    -.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
    -.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
    -.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
    -.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
    -.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
    -.@{fa-css-prefix}-mail-reply:before,
    -.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
    -.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
    -.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
    -.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
    -.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
    -.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
    -.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
    -.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
    -.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
    -.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
    -.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
    -.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
    -.@{fa-css-prefix}-code:before { content: @fa-var-code; }
    -.@{fa-css-prefix}-mail-reply-all:before,
    -.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
    -.@{fa-css-prefix}-star-half-empty:before,
    -.@{fa-css-prefix}-star-half-full:before,
    -.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
    -.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
    -.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
    -.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
    -.@{fa-css-prefix}-unlink:before,
    -.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
    -.@{fa-css-prefix}-question:before { content: @fa-var-question; }
    -.@{fa-css-prefix}-info:before { content: @fa-var-info; }
    -.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
    -.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
    -.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
    -.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
    -.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
    -.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
    -.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
    -.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
    -.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
    -.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
    -.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
    -.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
    -.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
    -.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
    -.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
    -.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
    -.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
    -.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
    -.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
    -.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
    -.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
    -.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
    -.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
    -.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
    -.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
    -.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
    -.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
    -.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
    -.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
    -.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
    -.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
    -.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
    -.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
    -.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
    -.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
    -.@{fa-css-prefix}-toggle-down:before,
    -.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
    -.@{fa-css-prefix}-toggle-up:before,
    -.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
    -.@{fa-css-prefix}-toggle-right:before,
    -.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
    -.@{fa-css-prefix}-euro:before,
    -.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
    -.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
    -.@{fa-css-prefix}-dollar:before,
    -.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
    -.@{fa-css-prefix}-rupee:before,
    -.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
    -.@{fa-css-prefix}-cny:before,
    -.@{fa-css-prefix}-rmb:before,
    -.@{fa-css-prefix}-yen:before,
    -.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
    -.@{fa-css-prefix}-ruble:before,
    -.@{fa-css-prefix}-rouble:before,
    -.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
    -.@{fa-css-prefix}-won:before,
    -.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
    -.@{fa-css-prefix}-bitcoin:before,
    -.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
    -.@{fa-css-prefix}-file:before { content: @fa-var-file; }
    -.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
    -.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
    -.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
    -.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
    -.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
    -.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
    -.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
    -.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
    -.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
    -.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
    -.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
    -.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
    -.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
    -.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
    -.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
    -.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
    -.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
    -.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
    -.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
    -.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
    -.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
    -.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
    -.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
    -.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
    -.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
    -.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
    -.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
    -.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
    -.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
    -.@{fa-css-prefix}-android:before { content: @fa-var-android; }
    -.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
    -.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
    -.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
    -.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
    -.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
    -.@{fa-css-prefix}-female:before { content: @fa-var-female; }
    -.@{fa-css-prefix}-male:before { content: @fa-var-male; }
    -.@{fa-css-prefix}-gittip:before,
    -.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
    -.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
    -.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
    -.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
    -.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
    -.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
    -.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
    -.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
    -.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
    -.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
    -.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
    -.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
    -.@{fa-css-prefix}-toggle-left:before,
    -.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
    -.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
    -.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
    -.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
    -.@{fa-css-prefix}-turkish-lira:before,
    -.@{fa-css-prefix}-try:before { content: @fa-var-try; }
    -.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
    -.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
    -.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
    -.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
    -.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
    -.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
    -.@{fa-css-prefix}-institution:before,
    -.@{fa-css-prefix}-bank:before,
    -.@{fa-css-prefix}-university:before { content: @fa-var-university; }
    -.@{fa-css-prefix}-mortar-board:before,
    -.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
    -.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
    -.@{fa-css-prefix}-google:before { content: @fa-var-google; }
    -.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
    -.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
    -.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
    -.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
    -.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
    -.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
    -.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }
    -.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
    -.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
    -.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
    -.@{fa-css-prefix}-language:before { content: @fa-var-language; }
    -.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
    -.@{fa-css-prefix}-building:before { content: @fa-var-building; }
    -.@{fa-css-prefix}-child:before { content: @fa-var-child; }
    -.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
    -.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
    -.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
    -.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
    -.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
    -.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
    -.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
    -.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
    -.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
    -.@{fa-css-prefix}-automobile:before,
    -.@{fa-css-prefix}-car:before { content: @fa-var-car; }
    -.@{fa-css-prefix}-cab:before,
    -.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
    -.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
    -.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
    -.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
    -.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
    -.@{fa-css-prefix}-database:before { content: @fa-var-database; }
    -.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
    -.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
    -.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
    -.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
    -.@{fa-css-prefix}-file-photo-o:before,
    -.@{fa-css-prefix}-file-picture-o:before,
    -.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
    -.@{fa-css-prefix}-file-zip-o:before,
    -.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
    -.@{fa-css-prefix}-file-sound-o:before,
    -.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
    -.@{fa-css-prefix}-file-movie-o:before,
    -.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
    -.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
    -.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
    -.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
    -.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
    -.@{fa-css-prefix}-life-bouy:before,
    -.@{fa-css-prefix}-life-buoy:before,
    -.@{fa-css-prefix}-life-saver:before,
    -.@{fa-css-prefix}-support:before,
    -.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
    -.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
    -.@{fa-css-prefix}-ra:before,
    -.@{fa-css-prefix}-resistance:before,
    -.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
    -.@{fa-css-prefix}-ge:before,
    -.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
    -.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
    -.@{fa-css-prefix}-git:before { content: @fa-var-git; }
    -.@{fa-css-prefix}-y-combinator-square:before,
    -.@{fa-css-prefix}-yc-square:before,
    -.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
    -.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
    -.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
    -.@{fa-css-prefix}-wechat:before,
    -.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
    -.@{fa-css-prefix}-send:before,
    -.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
    -.@{fa-css-prefix}-send-o:before,
    -.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
    -.@{fa-css-prefix}-history:before { content: @fa-var-history; }
    -.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
    -.@{fa-css-prefix}-header:before { content: @fa-var-header; }
    -.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
    -.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
    -.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
    -.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
    -.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
    -.@{fa-css-prefix}-soccer-ball-o:before,
    -.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
    -.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
    -.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
    -.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
    -.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
    -.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
    -.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
    -.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
    -.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
    -.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
    -.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
    -.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
    -.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
    -.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
    -.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
    -.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
    -.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
    -.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
    -.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
    -.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
    -.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
    -.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
    -.@{fa-css-prefix}-at:before { content: @fa-var-at; }
    -.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
    -.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
    -.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
    -.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
    -.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
    -.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
    -.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
    -.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
    -.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
    -.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
    -.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
    -.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
    -.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
    -.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
    -.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
    -.@{fa-css-prefix}-shekel:before,
    -.@{fa-css-prefix}-sheqel:before,
    -.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
    -.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
    -.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
    -.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
    -.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
    -.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
    -.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
    -.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
    -.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
    -.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
    -.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
    -.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
    -.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
    -.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }
    -.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
    -.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
    -.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
    -.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
    -.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
    -.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
    -.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
    -.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
    -.@{fa-css-prefix}-intersex:before,
    -.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
    -.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
    -.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
    -.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
    -.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
    -.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
    -.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
    -.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
    -.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
    -.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
    -.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }
    -.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
    -.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
    -.@{fa-css-prefix}-server:before { content: @fa-var-server; }
    -.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
    -.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
    -.@{fa-css-prefix}-hotel:before,
    -.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
    -.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
    -.@{fa-css-prefix}-train:before { content: @fa-var-train; }
    -.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
    -.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
    -.@{fa-css-prefix}-yc:before,
    -.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
    -.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
    -.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
    -.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
    -.@{fa-css-prefix}-battery-4:before,
    -.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
    -.@{fa-css-prefix}-battery-3:before,
    -.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
    -.@{fa-css-prefix}-battery-2:before,
    -.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
    -.@{fa-css-prefix}-battery-1:before,
    -.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
    -.@{fa-css-prefix}-battery-0:before,
    -.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
    -.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
    -.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
    -.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
    -.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
    -.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
    -.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }
    -.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
    -.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
    -.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
    -.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
    -.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }
    -.@{fa-css-prefix}-hourglass-1:before,
    -.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
    -.@{fa-css-prefix}-hourglass-2:before,
    -.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
    -.@{fa-css-prefix}-hourglass-3:before,
    -.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
    -.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
    -.@{fa-css-prefix}-hand-grab-o:before,
    -.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }
    -.@{fa-css-prefix}-hand-stop-o:before,
    -.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }
    -.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }
    -.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }
    -.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }
    -.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }
    -.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }
    -.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
    -.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
    -.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
    -.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
    -.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
    -.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
    -.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
    -.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
    -.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
    -.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
    -.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
    -.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
    -.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
    -.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
    -.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
    -.@{fa-css-prefix}-tv:before,
    -.@{fa-css-prefix}-television:before { content: @fa-var-television; }
    -.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
    -.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
    -.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
    -.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }
    -.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }
    -.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }
    -.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }
    -.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
    -.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
    -.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
    -.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }
    -.@{fa-css-prefix}-map:before { content: @fa-var-map; }
    -.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }
    -.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }
    -.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
    -.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
    -.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
    -.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
    -.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }
    -.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }
    -.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }
    -.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }
    -.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }
    -.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }
    -.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }
    -.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }
    -.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }
    -.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }
    -.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }
    -.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }
    -.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }
    -.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }
    -.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }
    -.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }
    -.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }
    -.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }
    -.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }
    -.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }
    -.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }
    -.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }
    -.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }
    -.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }
    -.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }
    -.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }
    -.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }
    -.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }
    -.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }
    -.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }
    -.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }
    -.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }
    -.@{fa-css-prefix}-asl-interpreting:before,
    -.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }
    -.@{fa-css-prefix}-deafness:before,
    -.@{fa-css-prefix}-hard-of-hearing:before,
    -.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }
    -.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }
    -.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }
    -.@{fa-css-prefix}-signing:before,
    -.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }
    -.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }
    -.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }
    -.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }
    -.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }
    -.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }
    -.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }
    -.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
    -.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }
    -.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }
    -.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }
    -.@{fa-css-prefix}-google-plus-circle:before,
    -.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }
    -.@{fa-css-prefix}-fa:before,
    -.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }
    +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
    +   readers do not read off random characters that represent icons */
    +
    +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
    +.@{fa-css-prefix}-music:before { content: @fa-var-music; }
    +.@{fa-css-prefix}-search:before { content: @fa-var-search; }
    +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
    +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
    +.@{fa-css-prefix}-star:before { content: @fa-var-star; }
    +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
    +.@{fa-css-prefix}-user:before { content: @fa-var-user; }
    +.@{fa-css-prefix}-film:before { content: @fa-var-film; }
    +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
    +.@{fa-css-prefix}-th:before { content: @fa-var-th; }
    +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
    +.@{fa-css-prefix}-check:before { content: @fa-var-check; }
    +.@{fa-css-prefix}-remove:before,
    +.@{fa-css-prefix}-close:before,
    +.@{fa-css-prefix}-times:before { content: @fa-var-times; }
    +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
    +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
    +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
    +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
    +.@{fa-css-prefix}-gear:before,
    +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
    +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
    +.@{fa-css-prefix}-home:before { content: @fa-var-home; }
    +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
    +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
    +.@{fa-css-prefix}-road:before { content: @fa-var-road; }
    +.@{fa-css-prefix}-download:before { content: @fa-var-download; }
    +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
    +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
    +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
    +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
    +.@{fa-css-prefix}-rotate-right:before,
    +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
    +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
    +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
    +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
    +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
    +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
    +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
    +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
    +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
    +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
    +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
    +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
    +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
    +.@{fa-css-prefix}-book:before { content: @fa-var-book; }
    +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
    +.@{fa-css-prefix}-print:before { content: @fa-var-print; }
    +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
    +.@{fa-css-prefix}-font:before { content: @fa-var-font; }
    +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
    +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
    +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
    +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
    +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
    +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
    +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
    +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
    +.@{fa-css-prefix}-list:before { content: @fa-var-list; }
    +.@{fa-css-prefix}-dedent:before,
    +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
    +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
    +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
    +.@{fa-css-prefix}-photo:before,
    +.@{fa-css-prefix}-image:before,
    +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
    +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
    +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
    +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
    +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
    +.@{fa-css-prefix}-edit:before,
    +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
    +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
    +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
    +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
    +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
    +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
    +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
    +.@{fa-css-prefix}-play:before { content: @fa-var-play; }
    +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
    +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
    +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
    +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
    +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
    +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
    +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
    +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
    +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
    +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
    +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
    +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
    +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
    +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
    +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
    +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
    +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
    +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
    +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
    +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
    +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
    +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
    +.@{fa-css-prefix}-mail-forward:before,
    +.@{fa-css-prefix}-share:before { content: @fa-var-share; }
    +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
    +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
    +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
    +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
    +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
    +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
    +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
    +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
    +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
    +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
    +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
    +.@{fa-css-prefix}-warning:before,
    +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
    +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
    +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
    +.@{fa-css-prefix}-random:before { content: @fa-var-random; }
    +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
    +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
    +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
    +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
    +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
    +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
    +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
    +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
    +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
    +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
    +.@{fa-css-prefix}-bar-chart-o:before,
    +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
    +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
    +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
    +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
    +.@{fa-css-prefix}-key:before { content: @fa-var-key; }
    +.@{fa-css-prefix}-gears:before,
    +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
    +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
    +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
    +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
    +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
    +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
    +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
    +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
    +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
    +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
    +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
    +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
    +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
    +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
    +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
    +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
    +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
    +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
    +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
    +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
    +.@{fa-css-prefix}-facebook-f:before,
    +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
    +.@{fa-css-prefix}-github:before { content: @fa-var-github; }
    +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
    +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
    +.@{fa-css-prefix}-feed:before,
    +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
    +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
    +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
    +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
    +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
    +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
    +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
    +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
    +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
    +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
    +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
    +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
    +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
    +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
    +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
    +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
    +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
    +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
    +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
    +.@{fa-css-prefix}-group:before,
    +.@{fa-css-prefix}-users:before { content: @fa-var-users; }
    +.@{fa-css-prefix}-chain:before,
    +.@{fa-css-prefix}-link:before { content: @fa-var-link; }
    +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
    +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
    +.@{fa-css-prefix}-cut:before,
    +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
    +.@{fa-css-prefix}-copy:before,
    +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
    +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
    +.@{fa-css-prefix}-save:before,
    +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
    +.@{fa-css-prefix}-square:before { content: @fa-var-square; }
    +.@{fa-css-prefix}-navicon:before,
    +.@{fa-css-prefix}-reorder:before,
    +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
    +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
    +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
    +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
    +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
    +.@{fa-css-prefix}-table:before { content: @fa-var-table; }
    +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
    +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
    +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
    +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
    +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
    +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
    +.@{fa-css-prefix}-money:before { content: @fa-var-money; }
    +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
    +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
    +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
    +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
    +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
    +.@{fa-css-prefix}-unsorted:before,
    +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
    +.@{fa-css-prefix}-sort-down:before,
    +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
    +.@{fa-css-prefix}-sort-up:before,
    +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
    +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
    +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
    +.@{fa-css-prefix}-rotate-left:before,
    +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
    +.@{fa-css-prefix}-legal:before,
    +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
    +.@{fa-css-prefix}-dashboard:before,
    +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
    +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
    +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
    +.@{fa-css-prefix}-flash:before,
    +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
    +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
    +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
    +.@{fa-css-prefix}-paste:before,
    +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
    +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
    +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
    +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
    +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
    +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
    +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
    +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
    +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
    +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
    +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
    +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
    +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
    +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
    +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
    +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
    +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
    +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
    +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
    +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
    +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
    +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
    +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
    +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
    +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
    +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
    +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
    +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
    +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
    +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
    +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
    +.@{fa-css-prefix}-mobile-phone:before,
    +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
    +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
    +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
    +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
    +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
    +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
    +.@{fa-css-prefix}-mail-reply:before,
    +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
    +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
    +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
    +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
    +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
    +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
    +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
    +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
    +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
    +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
    +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
    +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
    +.@{fa-css-prefix}-code:before { content: @fa-var-code; }
    +.@{fa-css-prefix}-mail-reply-all:before,
    +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
    +.@{fa-css-prefix}-star-half-empty:before,
    +.@{fa-css-prefix}-star-half-full:before,
    +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
    +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
    +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
    +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
    +.@{fa-css-prefix}-unlink:before,
    +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
    +.@{fa-css-prefix}-question:before { content: @fa-var-question; }
    +.@{fa-css-prefix}-info:before { content: @fa-var-info; }
    +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
    +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
    +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
    +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
    +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
    +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
    +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
    +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
    +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
    +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
    +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
    +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
    +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
    +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
    +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
    +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
    +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
    +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
    +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
    +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
    +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
    +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
    +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
    +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
    +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
    +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
    +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
    +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
    +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
    +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
    +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
    +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
    +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
    +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
    +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
    +.@{fa-css-prefix}-toggle-down:before,
    +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
    +.@{fa-css-prefix}-toggle-up:before,
    +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
    +.@{fa-css-prefix}-toggle-right:before,
    +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
    +.@{fa-css-prefix}-euro:before,
    +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
    +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
    +.@{fa-css-prefix}-dollar:before,
    +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
    +.@{fa-css-prefix}-rupee:before,
    +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
    +.@{fa-css-prefix}-cny:before,
    +.@{fa-css-prefix}-rmb:before,
    +.@{fa-css-prefix}-yen:before,
    +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
    +.@{fa-css-prefix}-ruble:before,
    +.@{fa-css-prefix}-rouble:before,
    +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
    +.@{fa-css-prefix}-won:before,
    +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
    +.@{fa-css-prefix}-bitcoin:before,
    +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
    +.@{fa-css-prefix}-file:before { content: @fa-var-file; }
    +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
    +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
    +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
    +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
    +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
    +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
    +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
    +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
    +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
    +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
    +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
    +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
    +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
    +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
    +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
    +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
    +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
    +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
    +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
    +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
    +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
    +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
    +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
    +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
    +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
    +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
    +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
    +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
    +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
    +.@{fa-css-prefix}-android:before { content: @fa-var-android; }
    +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
    +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
    +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
    +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
    +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
    +.@{fa-css-prefix}-female:before { content: @fa-var-female; }
    +.@{fa-css-prefix}-male:before { content: @fa-var-male; }
    +.@{fa-css-prefix}-gittip:before,
    +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }
    +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
    +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
    +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
    +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
    +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
    +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
    +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
    +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
    +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
    +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
    +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
    +.@{fa-css-prefix}-toggle-left:before,
    +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
    +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
    +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
    +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
    +.@{fa-css-prefix}-turkish-lira:before,
    +.@{fa-css-prefix}-try:before { content: @fa-var-try; }
    +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
    +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
    +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
    +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
    +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
    +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
    +.@{fa-css-prefix}-institution:before,
    +.@{fa-css-prefix}-bank:before,
    +.@{fa-css-prefix}-university:before { content: @fa-var-university; }
    +.@{fa-css-prefix}-mortar-board:before,
    +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
    +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
    +.@{fa-css-prefix}-google:before { content: @fa-var-google; }
    +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
    +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
    +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
    +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
    +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
    +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
    +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }
    +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
    +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
    +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
    +.@{fa-css-prefix}-language:before { content: @fa-var-language; }
    +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
    +.@{fa-css-prefix}-building:before { content: @fa-var-building; }
    +.@{fa-css-prefix}-child:before { content: @fa-var-child; }
    +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
    +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
    +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
    +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
    +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
    +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
    +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
    +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
    +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
    +.@{fa-css-prefix}-automobile:before,
    +.@{fa-css-prefix}-car:before { content: @fa-var-car; }
    +.@{fa-css-prefix}-cab:before,
    +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
    +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
    +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
    +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
    +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
    +.@{fa-css-prefix}-database:before { content: @fa-var-database; }
    +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
    +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
    +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
    +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
    +.@{fa-css-prefix}-file-photo-o:before,
    +.@{fa-css-prefix}-file-picture-o:before,
    +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
    +.@{fa-css-prefix}-file-zip-o:before,
    +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
    +.@{fa-css-prefix}-file-sound-o:before,
    +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
    +.@{fa-css-prefix}-file-movie-o:before,
    +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
    +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
    +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
    +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
    +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
    +.@{fa-css-prefix}-life-bouy:before,
    +.@{fa-css-prefix}-life-buoy:before,
    +.@{fa-css-prefix}-life-saver:before,
    +.@{fa-css-prefix}-support:before,
    +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
    +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
    +.@{fa-css-prefix}-ra:before,
    +.@{fa-css-prefix}-resistance:before,
    +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
    +.@{fa-css-prefix}-ge:before,
    +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
    +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
    +.@{fa-css-prefix}-git:before { content: @fa-var-git; }
    +.@{fa-css-prefix}-y-combinator-square:before,
    +.@{fa-css-prefix}-yc-square:before,
    +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
    +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
    +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
    +.@{fa-css-prefix}-wechat:before,
    +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
    +.@{fa-css-prefix}-send:before,
    +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
    +.@{fa-css-prefix}-send-o:before,
    +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
    +.@{fa-css-prefix}-history:before { content: @fa-var-history; }
    +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
    +.@{fa-css-prefix}-header:before { content: @fa-var-header; }
    +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
    +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
    +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
    +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
    +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
    +.@{fa-css-prefix}-soccer-ball-o:before,
    +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
    +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
    +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
    +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
    +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
    +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
    +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
    +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
    +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
    +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
    +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
    +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
    +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
    +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
    +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
    +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
    +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
    +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
    +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
    +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
    +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
    +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
    +.@{fa-css-prefix}-at:before { content: @fa-var-at; }
    +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
    +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
    +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
    +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
    +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
    +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
    +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
    +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
    +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
    +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
    +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
    +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
    +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
    +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
    +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
    +.@{fa-css-prefix}-shekel:before,
    +.@{fa-css-prefix}-sheqel:before,
    +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
    +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
    +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }
    +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }
    +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }
    +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }
    +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }
    +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }
    +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }
    +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }
    +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }
    +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }
    +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }
    +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }
    +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }
    +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }
    +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }
    +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }
    +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }
    +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }
    +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }
    +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }
    +.@{fa-css-prefix}-intersex:before,
    +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }
    +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }
    +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }
    +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }
    +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }
    +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }
    +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }
    +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }
    +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }
    +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }
    +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }
    +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }
    +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }
    +.@{fa-css-prefix}-server:before { content: @fa-var-server; }
    +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }
    +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }
    +.@{fa-css-prefix}-hotel:before,
    +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }
    +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }
    +.@{fa-css-prefix}-train:before { content: @fa-var-train; }
    +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }
    +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }
    +.@{fa-css-prefix}-yc:before,
    +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }
    +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }
    +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }
    +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }
    +.@{fa-css-prefix}-battery-4:before,
    +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }
    +.@{fa-css-prefix}-battery-3:before,
    +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }
    +.@{fa-css-prefix}-battery-2:before,
    +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }
    +.@{fa-css-prefix}-battery-1:before,
    +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }
    +.@{fa-css-prefix}-battery-0:before,
    +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }
    +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }
    +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }
    +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }
    +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }
    +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }
    +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }
    +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }
    +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }
    +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }
    +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }
    +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }
    +.@{fa-css-prefix}-hourglass-1:before,
    +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }
    +.@{fa-css-prefix}-hourglass-2:before,
    +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }
    +.@{fa-css-prefix}-hourglass-3:before,
    +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }
    +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }
    +.@{fa-css-prefix}-hand-grab-o:before,
    +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }
    +.@{fa-css-prefix}-hand-stop-o:before,
    +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }
    +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }
    +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }
    +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }
    +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }
    +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }
    +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }
    +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }
    +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }
    +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }
    +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }
    +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }
    +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }
    +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }
    +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }
    +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }
    +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }
    +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }
    +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }
    +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }
    +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }
    +.@{fa-css-prefix}-tv:before,
    +.@{fa-css-prefix}-television:before { content: @fa-var-television; }
    +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }
    +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }
    +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }
    +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }
    +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }
    +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }
    +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }
    +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }
    +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }
    +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }
    +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }
    +.@{fa-css-prefix}-map:before { content: @fa-var-map; }
    +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }
    +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }
    +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }
    +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }
    +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }
    +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }
    +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }
    +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }
    +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }
    +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }
    +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }
    +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }
    +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }
    +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }
    +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }
    +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }
    +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }
    +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }
    +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }
    +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }
    +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }
    +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }
    +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }
    +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }
    +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }
    +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }
    +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }
    +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }
    +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }
    +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }
    +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }
    +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }
    +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }
    +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }
    +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }
    +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }
    +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }
    +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }
    +.@{fa-css-prefix}-asl-interpreting:before,
    +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }
    +.@{fa-css-prefix}-deafness:before,
    +.@{fa-css-prefix}-hard-of-hearing:before,
    +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }
    +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }
    +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }
    +.@{fa-css-prefix}-signing:before,
    +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }
    +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }
    +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }
    +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }
    +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }
    +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }
    +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }
    +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
    +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }
    +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }
    +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }
    +.@{fa-css-prefix}-google-plus-circle:before,
    +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }
    +.@{fa-css-prefix}-fa:before,
    +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }
    diff --git a/assets/less/font-awesome/larger.less b/assets/less/font-awesome/larger.less
    index c9d6467..3646d3d 100644
    --- a/assets/less/font-awesome/larger.less
    +++ b/assets/less/font-awesome/larger.less
    @@ -1,13 +1,13 @@
    -// Icon Sizes
    -// -------------------------
    -
    -/* makes the font 33% larger relative to the icon container */
    -.@{fa-css-prefix}-lg {
    -  font-size: (4em / 3);
    -  line-height: (3em / 4);
    -  vertical-align: -15%;
    -}
    -.@{fa-css-prefix}-2x { font-size: 2em; }
    -.@{fa-css-prefix}-3x { font-size: 3em; }
    -.@{fa-css-prefix}-4x { font-size: 4em; }
    -.@{fa-css-prefix}-5x { font-size: 5em; }
    +// Icon Sizes
    +// -------------------------
    +
    +/* makes the font 33% larger relative to the icon container */
    +.@{fa-css-prefix}-lg {
    +  font-size: (4em / 3);
    +  line-height: (3em / 4);
    +  vertical-align: -15%;
    +}
    +.@{fa-css-prefix}-2x { font-size: 2em; }
    +.@{fa-css-prefix}-3x { font-size: 3em; }
    +.@{fa-css-prefix}-4x { font-size: 4em; }
    +.@{fa-css-prefix}-5x { font-size: 5em; }
    diff --git a/assets/less/font-awesome/list.less b/assets/less/font-awesome/list.less
    index 0b44038..eb64bf4 100644
    --- a/assets/less/font-awesome/list.less
    +++ b/assets/less/font-awesome/list.less
    @@ -1,19 +1,19 @@
    -// List Icons
    -// -------------------------
    -
    -.@{fa-css-prefix}-ul {
    -  padding-left: 0;
    -  margin-left: @fa-li-width;
    -  list-style-type: none;
    -  > li { position: relative; }
    -}
    -.@{fa-css-prefix}-li {
    -  position: absolute;
    -  left: -@fa-li-width;
    -  width: @fa-li-width;
    -  top: (2em / 14);
    -  text-align: center;
    -  &.@{fa-css-prefix}-lg {
    -    left: (-@fa-li-width + (4em / 14));
    -  }
    -}
    +// List Icons
    +// -------------------------
    +
    +.@{fa-css-prefix}-ul {
    +  padding-left: 0;
    +  margin-left: @fa-li-width;
    +  list-style-type: none;
    +  > li { position: relative; }
    +}
    +.@{fa-css-prefix}-li {
    +  position: absolute;
    +  left: -@fa-li-width;
    +  width: @fa-li-width;
    +  top: (2em / 14);
    +  text-align: center;
    +  &.@{fa-css-prefix}-lg {
    +    left: (-@fa-li-width + (4em / 14));
    +  }
    +}
    diff --git a/assets/less/font-awesome/mixins.less b/assets/less/font-awesome/mixins.less
    index beef231..97c72c4 100644
    --- a/assets/less/font-awesome/mixins.less
    +++ b/assets/less/font-awesome/mixins.less
    @@ -1,60 +1,60 @@
    -// Mixins
    -// --------------------------
    -
    -.fa-icon() {
    -  display: inline-block;
    -  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
    -  font-size: inherit; // can't have font-size inherit on line above, so need to override
    -  text-rendering: auto; // optimizelegibility throws things off #1094
    -  -webkit-font-smoothing: antialiased;
    -  -moz-osx-font-smoothing: grayscale;
    -
    -}
    -
    -.fa-icon-rotate(@degrees, @rotation) {
    -  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
    -  -webkit-transform: rotate(@degrees);
    -      -ms-transform: rotate(@degrees);
    -          transform: rotate(@degrees);
    -}
    -
    -.fa-icon-flip(@horiz, @vert, @rotation) {
    -  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
    -  -webkit-transform: scale(@horiz, @vert);
    -      -ms-transform: scale(@horiz, @vert);
    -          transform: scale(@horiz, @vert);
    -}
    -
    -
    -// Only display content to screen readers. A la Bootstrap 4.
    -//
    -// See: http://a11yproject.com/posts/how-to-hide-content/
    -
    -.sr-only() {
    -  position: absolute;
    -  width: 1px;
    -  height: 1px;
    -  padding: 0;
    -  margin: -1px;
    -  overflow: hidden;
    -  clip: rect(0,0,0,0);
    -  border: 0;
    -}
    -
    -// Use in conjunction with .sr-only to only display content when it's focused.
    -//
    -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
    -//
    -// Credit: HTML5 Boilerplate
    -
    -.sr-only-focusable() {
    -  &:active,
    -  &:focus {
    -    position: static;
    -    width: auto;
    -    height: auto;
    -    margin: 0;
    -    overflow: visible;
    -    clip: auto;
    -  }
    -}
    +// Mixins
    +// --------------------------
    +
    +.fa-icon() {
    +  display: inline-block;
    +  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
    +  font-size: inherit; // can't have font-size inherit on line above, so need to override
    +  text-rendering: auto; // optimizelegibility throws things off #1094
    +  -webkit-font-smoothing: antialiased;
    +  -moz-osx-font-smoothing: grayscale;
    +
    +}
    +
    +.fa-icon-rotate(@degrees, @rotation) {
    +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
    +  -webkit-transform: rotate(@degrees);
    +      -ms-transform: rotate(@degrees);
    +          transform: rotate(@degrees);
    +}
    +
    +.fa-icon-flip(@horiz, @vert, @rotation) {
    +  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
    +  -webkit-transform: scale(@horiz, @vert);
    +      -ms-transform: scale(@horiz, @vert);
    +          transform: scale(@horiz, @vert);
    +}
    +
    +
    +// Only display content to screen readers. A la Bootstrap 4.
    +//
    +// See: http://a11yproject.com/posts/how-to-hide-content/
    +
    +.sr-only() {
    +  position: absolute;
    +  width: 1px;
    +  height: 1px;
    +  padding: 0;
    +  margin: -1px;
    +  overflow: hidden;
    +  clip: rect(0,0,0,0);
    +  border: 0;
    +}
    +
    +// Use in conjunction with .sr-only to only display content when it's focused.
    +//
    +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
    +//
    +// Credit: HTML5 Boilerplate
    +
    +.sr-only-focusable() {
    +  &:active,
    +  &:focus {
    +    position: static;
    +    width: auto;
    +    height: auto;
    +    margin: 0;
    +    overflow: visible;
    +    clip: auto;
    +  }
    +}
    diff --git a/assets/less/font-awesome/path.less b/assets/less/font-awesome/path.less
    index 835be41..051d9fa 100644
    --- a/assets/less/font-awesome/path.less
    +++ b/assets/less/font-awesome/path.less
    @@ -1,15 +1,15 @@
    -/* FONT PATH
    - * -------------------------- */
    -
    -@font-face {
    -  font-family: 'FontAwesome';
    -  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
    -  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
    -    url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
    -    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
    -    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
    -    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
    -  // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
    -  font-weight: normal;
    -  font-style: normal;
    -}
    +/* FONT PATH
    + * -------------------------- */
    +
    +@font-face {
    +  font-family: 'FontAwesome';
    +  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
    +  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
    +    url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
    +    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
    +    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
    +    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
    +  // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
    +  font-weight: normal;
    +  font-style: normal;
    +}
    diff --git a/assets/less/font-awesome/rotated-flipped.less b/assets/less/font-awesome/rotated-flipped.less
    index f6ba814..34faba5 100644
    --- a/assets/less/font-awesome/rotated-flipped.less
    +++ b/assets/less/font-awesome/rotated-flipped.less
    @@ -1,20 +1,20 @@
    -// Rotated & Flipped Icons
    -// -------------------------
    -
    -.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }
    -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
    -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
    -
    -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
    -.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }
    -
    -// Hook for IE8-9
    -// -------------------------
    -
    -:root .@{fa-css-prefix}-rotate-90,
    -:root .@{fa-css-prefix}-rotate-180,
    -:root .@{fa-css-prefix}-rotate-270,
    -:root .@{fa-css-prefix}-flip-horizontal,
    -:root .@{fa-css-prefix}-flip-vertical {
    -  filter: none;
    -}
    +// Rotated & Flipped Icons
    +// -------------------------
    +
    +.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }
    +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
    +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
    +
    +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
    +.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }
    +
    +// Hook for IE8-9
    +// -------------------------
    +
    +:root .@{fa-css-prefix}-rotate-90,
    +:root .@{fa-css-prefix}-rotate-180,
    +:root .@{fa-css-prefix}-rotate-270,
    +:root .@{fa-css-prefix}-flip-horizontal,
    +:root .@{fa-css-prefix}-flip-vertical {
    +  filter: none;
    +}
    diff --git a/assets/less/font-awesome/screen-reader.less b/assets/less/font-awesome/screen-reader.less
    index 11c1881..ba83a53 100644
    --- a/assets/less/font-awesome/screen-reader.less
    +++ b/assets/less/font-awesome/screen-reader.less
    @@ -1,5 +1,5 @@
    -// Screen Readers
    -// -------------------------
    -
    -.sr-only { .sr-only(); }
    -.sr-only-focusable { .sr-only-focusable(); }
    +// Screen Readers
    +// -------------------------
    +
    +.sr-only { .sr-only(); }
    +.sr-only-focusable { .sr-only-focusable(); }
    diff --git a/assets/less/font-awesome/stacked.less b/assets/less/font-awesome/stacked.less
    index fc53fb0..d3fc101 100644
    --- a/assets/less/font-awesome/stacked.less
    +++ b/assets/less/font-awesome/stacked.less
    @@ -1,20 +1,20 @@
    -// Stacked Icons
    -// -------------------------
    -
    -.@{fa-css-prefix}-stack {
    -  position: relative;
    -  display: inline-block;
    -  width: 2em;
    -  height: 2em;
    -  line-height: 2em;
    -  vertical-align: middle;
    -}
    -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
    -  position: absolute;
    -  left: 0;
    -  width: 100%;
    -  text-align: center;
    -}
    -.@{fa-css-prefix}-stack-1x { line-height: inherit; }
    -.@{fa-css-prefix}-stack-2x { font-size: 2em; }
    -.@{fa-css-prefix}-inverse { color: @fa-inverse; }
    +// Stacked Icons
    +// -------------------------
    +
    +.@{fa-css-prefix}-stack {
    +  position: relative;
    +  display: inline-block;
    +  width: 2em;
    +  height: 2em;
    +  line-height: 2em;
    +  vertical-align: middle;
    +}
    +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
    +  position: absolute;
    +  left: 0;
    +  width: 100%;
    +  text-align: center;
    +}
    +.@{fa-css-prefix}-stack-1x { line-height: inherit; }
    +.@{fa-css-prefix}-stack-2x { font-size: 2em; }
    +.@{fa-css-prefix}-inverse { color: @fa-inverse; }
    diff --git a/assets/less/font-awesome/variables.less b/assets/less/font-awesome/variables.less
    index 2b33819..5253701 100644
    --- a/assets/less/font-awesome/variables.less
    +++ b/assets/less/font-awesome/variables.less
    @@ -1,744 +1,744 @@
    -// Variables
    -// --------------------------
    -
    -@fa-font-path:        "../fonts";
    -@fa-font-size-base:   14px;
    -@fa-line-height-base: 1;
    -//@fa-font-path:        "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly
    -@fa-css-prefix:       fa;
    -@fa-version:          "4.6.3";
    -@fa-border-color:     #eee;
    -@fa-inverse:          #fff;
    -@fa-li-width:         (30em / 14);
    -
    -@fa-var-500px: "\f26e";
    -@fa-var-adjust: "\f042";
    -@fa-var-adn: "\f170";
    -@fa-var-align-center: "\f037";
    -@fa-var-align-justify: "\f039";
    -@fa-var-align-left: "\f036";
    -@fa-var-align-right: "\f038";
    -@fa-var-amazon: "\f270";
    -@fa-var-ambulance: "\f0f9";
    -@fa-var-american-sign-language-interpreting: "\f2a3";
    -@fa-var-anchor: "\f13d";
    -@fa-var-android: "\f17b";
    -@fa-var-angellist: "\f209";
    -@fa-var-angle-double-down: "\f103";
    -@fa-var-angle-double-left: "\f100";
    -@fa-var-angle-double-right: "\f101";
    -@fa-var-angle-double-up: "\f102";
    -@fa-var-angle-down: "\f107";
    -@fa-var-angle-left: "\f104";
    -@fa-var-angle-right: "\f105";
    -@fa-var-angle-up: "\f106";
    -@fa-var-apple: "\f179";
    -@fa-var-archive: "\f187";
    -@fa-var-area-chart: "\f1fe";
    -@fa-var-arrow-circle-down: "\f0ab";
    -@fa-var-arrow-circle-left: "\f0a8";
    -@fa-var-arrow-circle-o-down: "\f01a";
    -@fa-var-arrow-circle-o-left: "\f190";
    -@fa-var-arrow-circle-o-right: "\f18e";
    -@fa-var-arrow-circle-o-up: "\f01b";
    -@fa-var-arrow-circle-right: "\f0a9";
    -@fa-var-arrow-circle-up: "\f0aa";
    -@fa-var-arrow-down: "\f063";
    -@fa-var-arrow-left: "\f060";
    -@fa-var-arrow-right: "\f061";
    -@fa-var-arrow-up: "\f062";
    -@fa-var-arrows: "\f047";
    -@fa-var-arrows-alt: "\f0b2";
    -@fa-var-arrows-h: "\f07e";
    -@fa-var-arrows-v: "\f07d";
    -@fa-var-asl-interpreting: "\f2a3";
    -@fa-var-assistive-listening-systems: "\f2a2";
    -@fa-var-asterisk: "\f069";
    -@fa-var-at: "\f1fa";
    -@fa-var-audio-description: "\f29e";
    -@fa-var-automobile: "\f1b9";
    -@fa-var-backward: "\f04a";
    -@fa-var-balance-scale: "\f24e";
    -@fa-var-ban: "\f05e";
    -@fa-var-bank: "\f19c";
    -@fa-var-bar-chart: "\f080";
    -@fa-var-bar-chart-o: "\f080";
    -@fa-var-barcode: "\f02a";
    -@fa-var-bars: "\f0c9";
    -@fa-var-battery-0: "\f244";
    -@fa-var-battery-1: "\f243";
    -@fa-var-battery-2: "\f242";
    -@fa-var-battery-3: "\f241";
    -@fa-var-battery-4: "\f240";
    -@fa-var-battery-empty: "\f244";
    -@fa-var-battery-full: "\f240";
    -@fa-var-battery-half: "\f242";
    -@fa-var-battery-quarter: "\f243";
    -@fa-var-battery-three-quarters: "\f241";
    -@fa-var-bed: "\f236";
    -@fa-var-beer: "\f0fc";
    -@fa-var-behance: "\f1b4";
    -@fa-var-behance-square: "\f1b5";
    -@fa-var-bell: "\f0f3";
    -@fa-var-bell-o: "\f0a2";
    -@fa-var-bell-slash: "\f1f6";
    -@fa-var-bell-slash-o: "\f1f7";
    -@fa-var-bicycle: "\f206";
    -@fa-var-binoculars: "\f1e5";
    -@fa-var-birthday-cake: "\f1fd";
    -@fa-var-bitbucket: "\f171";
    -@fa-var-bitbucket-square: "\f172";
    -@fa-var-bitcoin: "\f15a";
    -@fa-var-black-tie: "\f27e";
    -@fa-var-blind: "\f29d";
    -@fa-var-bluetooth: "\f293";
    -@fa-var-bluetooth-b: "\f294";
    -@fa-var-bold: "\f032";
    -@fa-var-bolt: "\f0e7";
    -@fa-var-bomb: "\f1e2";
    -@fa-var-book: "\f02d";
    -@fa-var-bookmark: "\f02e";
    -@fa-var-bookmark-o: "\f097";
    -@fa-var-braille: "\f2a1";
    -@fa-var-briefcase: "\f0b1";
    -@fa-var-btc: "\f15a";
    -@fa-var-bug: "\f188";
    -@fa-var-building: "\f1ad";
    -@fa-var-building-o: "\f0f7";
    -@fa-var-bullhorn: "\f0a1";
    -@fa-var-bullseye: "\f140";
    -@fa-var-bus: "\f207";
    -@fa-var-buysellads: "\f20d";
    -@fa-var-cab: "\f1ba";
    -@fa-var-calculator: "\f1ec";
    -@fa-var-calendar: "\f073";
    -@fa-var-calendar-check-o: "\f274";
    -@fa-var-calendar-minus-o: "\f272";
    -@fa-var-calendar-o: "\f133";
    -@fa-var-calendar-plus-o: "\f271";
    -@fa-var-calendar-times-o: "\f273";
    -@fa-var-camera: "\f030";
    -@fa-var-camera-retro: "\f083";
    -@fa-var-car: "\f1b9";
    -@fa-var-caret-down: "\f0d7";
    -@fa-var-caret-left: "\f0d9";
    -@fa-var-caret-right: "\f0da";
    -@fa-var-caret-square-o-down: "\f150";
    -@fa-var-caret-square-o-left: "\f191";
    -@fa-var-caret-square-o-right: "\f152";
    -@fa-var-caret-square-o-up: "\f151";
    -@fa-var-caret-up: "\f0d8";
    -@fa-var-cart-arrow-down: "\f218";
    -@fa-var-cart-plus: "\f217";
    -@fa-var-cc: "\f20a";
    -@fa-var-cc-amex: "\f1f3";
    -@fa-var-cc-diners-club: "\f24c";
    -@fa-var-cc-discover: "\f1f2";
    -@fa-var-cc-jcb: "\f24b";
    -@fa-var-cc-mastercard: "\f1f1";
    -@fa-var-cc-paypal: "\f1f4";
    -@fa-var-cc-stripe: "\f1f5";
    -@fa-var-cc-visa: "\f1f0";
    -@fa-var-certificate: "\f0a3";
    -@fa-var-chain: "\f0c1";
    -@fa-var-chain-broken: "\f127";
    -@fa-var-check: "\f00c";
    -@fa-var-check-circle: "\f058";
    -@fa-var-check-circle-o: "\f05d";
    -@fa-var-check-square: "\f14a";
    -@fa-var-check-square-o: "\f046";
    -@fa-var-chevron-circle-down: "\f13a";
    -@fa-var-chevron-circle-left: "\f137";
    -@fa-var-chevron-circle-right: "\f138";
    -@fa-var-chevron-circle-up: "\f139";
    -@fa-var-chevron-down: "\f078";
    -@fa-var-chevron-left: "\f053";
    -@fa-var-chevron-right: "\f054";
    -@fa-var-chevron-up: "\f077";
    -@fa-var-child: "\f1ae";
    -@fa-var-chrome: "\f268";
    -@fa-var-circle: "\f111";
    -@fa-var-circle-o: "\f10c";
    -@fa-var-circle-o-notch: "\f1ce";
    -@fa-var-circle-thin: "\f1db";
    -@fa-var-clipboard: "\f0ea";
    -@fa-var-clock-o: "\f017";
    -@fa-var-clone: "\f24d";
    -@fa-var-close: "\f00d";
    -@fa-var-cloud: "\f0c2";
    -@fa-var-cloud-download: "\f0ed";
    -@fa-var-cloud-upload: "\f0ee";
    -@fa-var-cny: "\f157";
    -@fa-var-code: "\f121";
    -@fa-var-code-fork: "\f126";
    -@fa-var-codepen: "\f1cb";
    -@fa-var-codiepie: "\f284";
    -@fa-var-coffee: "\f0f4";
    -@fa-var-cog: "\f013";
    -@fa-var-cogs: "\f085";
    -@fa-var-columns: "\f0db";
    -@fa-var-comment: "\f075";
    -@fa-var-comment-o: "\f0e5";
    -@fa-var-commenting: "\f27a";
    -@fa-var-commenting-o: "\f27b";
    -@fa-var-comments: "\f086";
    -@fa-var-comments-o: "\f0e6";
    -@fa-var-compass: "\f14e";
    -@fa-var-compress: "\f066";
    -@fa-var-connectdevelop: "\f20e";
    -@fa-var-contao: "\f26d";
    -@fa-var-copy: "\f0c5";
    -@fa-var-copyright: "\f1f9";
    -@fa-var-creative-commons: "\f25e";
    -@fa-var-credit-card: "\f09d";
    -@fa-var-credit-card-alt: "\f283";
    -@fa-var-crop: "\f125";
    -@fa-var-crosshairs: "\f05b";
    -@fa-var-css3: "\f13c";
    -@fa-var-cube: "\f1b2";
    -@fa-var-cubes: "\f1b3";
    -@fa-var-cut: "\f0c4";
    -@fa-var-cutlery: "\f0f5";
    -@fa-var-dashboard: "\f0e4";
    -@fa-var-dashcube: "\f210";
    -@fa-var-database: "\f1c0";
    -@fa-var-deaf: "\f2a4";
    -@fa-var-deafness: "\f2a4";
    -@fa-var-dedent: "\f03b";
    -@fa-var-delicious: "\f1a5";
    -@fa-var-desktop: "\f108";
    -@fa-var-deviantart: "\f1bd";
    -@fa-var-diamond: "\f219";
    -@fa-var-digg: "\f1a6";
    -@fa-var-dollar: "\f155";
    -@fa-var-dot-circle-o: "\f192";
    -@fa-var-download: "\f019";
    -@fa-var-dribbble: "\f17d";
    -@fa-var-dropbox: "\f16b";
    -@fa-var-drupal: "\f1a9";
    -@fa-var-edge: "\f282";
    -@fa-var-edit: "\f044";
    -@fa-var-eject: "\f052";
    -@fa-var-ellipsis-h: "\f141";
    -@fa-var-ellipsis-v: "\f142";
    -@fa-var-empire: "\f1d1";
    -@fa-var-envelope: "\f0e0";
    -@fa-var-envelope-o: "\f003";
    -@fa-var-envelope-square: "\f199";
    -@fa-var-envira: "\f299";
    -@fa-var-eraser: "\f12d";
    -@fa-var-eur: "\f153";
    -@fa-var-euro: "\f153";
    -@fa-var-exchange: "\f0ec";
    -@fa-var-exclamation: "\f12a";
    -@fa-var-exclamation-circle: "\f06a";
    -@fa-var-exclamation-triangle: "\f071";
    -@fa-var-expand: "\f065";
    -@fa-var-expeditedssl: "\f23e";
    -@fa-var-external-link: "\f08e";
    -@fa-var-external-link-square: "\f14c";
    -@fa-var-eye: "\f06e";
    -@fa-var-eye-slash: "\f070";
    -@fa-var-eyedropper: "\f1fb";
    -@fa-var-fa: "\f2b4";
    -@fa-var-facebook: "\f09a";
    -@fa-var-facebook-f: "\f09a";
    -@fa-var-facebook-official: "\f230";
    -@fa-var-facebook-square: "\f082";
    -@fa-var-fast-backward: "\f049";
    -@fa-var-fast-forward: "\f050";
    -@fa-var-fax: "\f1ac";
    -@fa-var-feed: "\f09e";
    -@fa-var-female: "\f182";
    -@fa-var-fighter-jet: "\f0fb";
    -@fa-var-file: "\f15b";
    -@fa-var-file-archive-o: "\f1c6";
    -@fa-var-file-audio-o: "\f1c7";
    -@fa-var-file-code-o: "\f1c9";
    -@fa-var-file-excel-o: "\f1c3";
    -@fa-var-file-image-o: "\f1c5";
    -@fa-var-file-movie-o: "\f1c8";
    -@fa-var-file-o: "\f016";
    -@fa-var-file-pdf-o: "\f1c1";
    -@fa-var-file-photo-o: "\f1c5";
    -@fa-var-file-picture-o: "\f1c5";
    -@fa-var-file-powerpoint-o: "\f1c4";
    -@fa-var-file-sound-o: "\f1c7";
    -@fa-var-file-text: "\f15c";
    -@fa-var-file-text-o: "\f0f6";
    -@fa-var-file-video-o: "\f1c8";
    -@fa-var-file-word-o: "\f1c2";
    -@fa-var-file-zip-o: "\f1c6";
    -@fa-var-files-o: "\f0c5";
    -@fa-var-film: "\f008";
    -@fa-var-filter: "\f0b0";
    -@fa-var-fire: "\f06d";
    -@fa-var-fire-extinguisher: "\f134";
    -@fa-var-firefox: "\f269";
    -@fa-var-first-order: "\f2b0";
    -@fa-var-flag: "\f024";
    -@fa-var-flag-checkered: "\f11e";
    -@fa-var-flag-o: "\f11d";
    -@fa-var-flash: "\f0e7";
    -@fa-var-flask: "\f0c3";
    -@fa-var-flickr: "\f16e";
    -@fa-var-floppy-o: "\f0c7";
    -@fa-var-folder: "\f07b";
    -@fa-var-folder-o: "\f114";
    -@fa-var-folder-open: "\f07c";
    -@fa-var-folder-open-o: "\f115";
    -@fa-var-font: "\f031";
    -@fa-var-font-awesome: "\f2b4";
    -@fa-var-fonticons: "\f280";
    -@fa-var-fort-awesome: "\f286";
    -@fa-var-forumbee: "\f211";
    -@fa-var-forward: "\f04e";
    -@fa-var-foursquare: "\f180";
    -@fa-var-frown-o: "\f119";
    -@fa-var-futbol-o: "\f1e3";
    -@fa-var-gamepad: "\f11b";
    -@fa-var-gavel: "\f0e3";
    -@fa-var-gbp: "\f154";
    -@fa-var-ge: "\f1d1";
    -@fa-var-gear: "\f013";
    -@fa-var-gears: "\f085";
    -@fa-var-genderless: "\f22d";
    -@fa-var-get-pocket: "\f265";
    -@fa-var-gg: "\f260";
    -@fa-var-gg-circle: "\f261";
    -@fa-var-gift: "\f06b";
    -@fa-var-git: "\f1d3";
    -@fa-var-git-square: "\f1d2";
    -@fa-var-github: "\f09b";
    -@fa-var-github-alt: "\f113";
    -@fa-var-github-square: "\f092";
    -@fa-var-gitlab: "\f296";
    -@fa-var-gittip: "\f184";
    -@fa-var-glass: "\f000";
    -@fa-var-glide: "\f2a5";
    -@fa-var-glide-g: "\f2a6";
    -@fa-var-globe: "\f0ac";
    -@fa-var-google: "\f1a0";
    -@fa-var-google-plus: "\f0d5";
    -@fa-var-google-plus-circle: "\f2b3";
    -@fa-var-google-plus-official: "\f2b3";
    -@fa-var-google-plus-square: "\f0d4";
    -@fa-var-google-wallet: "\f1ee";
    -@fa-var-graduation-cap: "\f19d";
    -@fa-var-gratipay: "\f184";
    -@fa-var-group: "\f0c0";
    -@fa-var-h-square: "\f0fd";
    -@fa-var-hacker-news: "\f1d4";
    -@fa-var-hand-grab-o: "\f255";
    -@fa-var-hand-lizard-o: "\f258";
    -@fa-var-hand-o-down: "\f0a7";
    -@fa-var-hand-o-left: "\f0a5";
    -@fa-var-hand-o-right: "\f0a4";
    -@fa-var-hand-o-up: "\f0a6";
    -@fa-var-hand-paper-o: "\f256";
    -@fa-var-hand-peace-o: "\f25b";
    -@fa-var-hand-pointer-o: "\f25a";
    -@fa-var-hand-rock-o: "\f255";
    -@fa-var-hand-scissors-o: "\f257";
    -@fa-var-hand-spock-o: "\f259";
    -@fa-var-hand-stop-o: "\f256";
    -@fa-var-hard-of-hearing: "\f2a4";
    -@fa-var-hashtag: "\f292";
    -@fa-var-hdd-o: "\f0a0";
    -@fa-var-header: "\f1dc";
    -@fa-var-headphones: "\f025";
    -@fa-var-heart: "\f004";
    -@fa-var-heart-o: "\f08a";
    -@fa-var-heartbeat: "\f21e";
    -@fa-var-history: "\f1da";
    -@fa-var-home: "\f015";
    -@fa-var-hospital-o: "\f0f8";
    -@fa-var-hotel: "\f236";
    -@fa-var-hourglass: "\f254";
    -@fa-var-hourglass-1: "\f251";
    -@fa-var-hourglass-2: "\f252";
    -@fa-var-hourglass-3: "\f253";
    -@fa-var-hourglass-end: "\f253";
    -@fa-var-hourglass-half: "\f252";
    -@fa-var-hourglass-o: "\f250";
    -@fa-var-hourglass-start: "\f251";
    -@fa-var-houzz: "\f27c";
    -@fa-var-html5: "\f13b";
    -@fa-var-i-cursor: "\f246";
    -@fa-var-ils: "\f20b";
    -@fa-var-image: "\f03e";
    -@fa-var-inbox: "\f01c";
    -@fa-var-indent: "\f03c";
    -@fa-var-industry: "\f275";
    -@fa-var-info: "\f129";
    -@fa-var-info-circle: "\f05a";
    -@fa-var-inr: "\f156";
    -@fa-var-instagram: "\f16d";
    -@fa-var-institution: "\f19c";
    -@fa-var-internet-explorer: "\f26b";
    -@fa-var-intersex: "\f224";
    -@fa-var-ioxhost: "\f208";
    -@fa-var-italic: "\f033";
    -@fa-var-joomla: "\f1aa";
    -@fa-var-jpy: "\f157";
    -@fa-var-jsfiddle: "\f1cc";
    -@fa-var-key: "\f084";
    -@fa-var-keyboard-o: "\f11c";
    -@fa-var-krw: "\f159";
    -@fa-var-language: "\f1ab";
    -@fa-var-laptop: "\f109";
    -@fa-var-lastfm: "\f202";
    -@fa-var-lastfm-square: "\f203";
    -@fa-var-leaf: "\f06c";
    -@fa-var-leanpub: "\f212";
    -@fa-var-legal: "\f0e3";
    -@fa-var-lemon-o: "\f094";
    -@fa-var-level-down: "\f149";
    -@fa-var-level-up: "\f148";
    -@fa-var-life-bouy: "\f1cd";
    -@fa-var-life-buoy: "\f1cd";
    -@fa-var-life-ring: "\f1cd";
    -@fa-var-life-saver: "\f1cd";
    -@fa-var-lightbulb-o: "\f0eb";
    -@fa-var-line-chart: "\f201";
    -@fa-var-link: "\f0c1";
    -@fa-var-linkedin: "\f0e1";
    -@fa-var-linkedin-square: "\f08c";
    -@fa-var-linux: "\f17c";
    -@fa-var-list: "\f03a";
    -@fa-var-list-alt: "\f022";
    -@fa-var-list-ol: "\f0cb";
    -@fa-var-list-ul: "\f0ca";
    -@fa-var-location-arrow: "\f124";
    -@fa-var-lock: "\f023";
    -@fa-var-long-arrow-down: "\f175";
    -@fa-var-long-arrow-left: "\f177";
    -@fa-var-long-arrow-right: "\f178";
    -@fa-var-long-arrow-up: "\f176";
    -@fa-var-low-vision: "\f2a8";
    -@fa-var-magic: "\f0d0";
    -@fa-var-magnet: "\f076";
    -@fa-var-mail-forward: "\f064";
    -@fa-var-mail-reply: "\f112";
    -@fa-var-mail-reply-all: "\f122";
    -@fa-var-male: "\f183";
    -@fa-var-map: "\f279";
    -@fa-var-map-marker: "\f041";
    -@fa-var-map-o: "\f278";
    -@fa-var-map-pin: "\f276";
    -@fa-var-map-signs: "\f277";
    -@fa-var-mars: "\f222";
    -@fa-var-mars-double: "\f227";
    -@fa-var-mars-stroke: "\f229";
    -@fa-var-mars-stroke-h: "\f22b";
    -@fa-var-mars-stroke-v: "\f22a";
    -@fa-var-maxcdn: "\f136";
    -@fa-var-meanpath: "\f20c";
    -@fa-var-medium: "\f23a";
    -@fa-var-medkit: "\f0fa";
    -@fa-var-meh-o: "\f11a";
    -@fa-var-mercury: "\f223";
    -@fa-var-microphone: "\f130";
    -@fa-var-microphone-slash: "\f131";
    -@fa-var-minus: "\f068";
    -@fa-var-minus-circle: "\f056";
    -@fa-var-minus-square: "\f146";
    -@fa-var-minus-square-o: "\f147";
    -@fa-var-mixcloud: "\f289";
    -@fa-var-mobile: "\f10b";
    -@fa-var-mobile-phone: "\f10b";
    -@fa-var-modx: "\f285";
    -@fa-var-money: "\f0d6";
    -@fa-var-moon-o: "\f186";
    -@fa-var-mortar-board: "\f19d";
    -@fa-var-motorcycle: "\f21c";
    -@fa-var-mouse-pointer: "\f245";
    -@fa-var-music: "\f001";
    -@fa-var-navicon: "\f0c9";
    -@fa-var-neuter: "\f22c";
    -@fa-var-newspaper-o: "\f1ea";
    -@fa-var-object-group: "\f247";
    -@fa-var-object-ungroup: "\f248";
    -@fa-var-odnoklassniki: "\f263";
    -@fa-var-odnoklassniki-square: "\f264";
    -@fa-var-opencart: "\f23d";
    -@fa-var-openid: "\f19b";
    -@fa-var-opera: "\f26a";
    -@fa-var-optin-monster: "\f23c";
    -@fa-var-outdent: "\f03b";
    -@fa-var-pagelines: "\f18c";
    -@fa-var-paint-brush: "\f1fc";
    -@fa-var-paper-plane: "\f1d8";
    -@fa-var-paper-plane-o: "\f1d9";
    -@fa-var-paperclip: "\f0c6";
    -@fa-var-paragraph: "\f1dd";
    -@fa-var-paste: "\f0ea";
    -@fa-var-pause: "\f04c";
    -@fa-var-pause-circle: "\f28b";
    -@fa-var-pause-circle-o: "\f28c";
    -@fa-var-paw: "\f1b0";
    -@fa-var-paypal: "\f1ed";
    -@fa-var-pencil: "\f040";
    -@fa-var-pencil-square: "\f14b";
    -@fa-var-pencil-square-o: "\f044";
    -@fa-var-percent: "\f295";
    -@fa-var-phone: "\f095";
    -@fa-var-phone-square: "\f098";
    -@fa-var-photo: "\f03e";
    -@fa-var-picture-o: "\f03e";
    -@fa-var-pie-chart: "\f200";
    -@fa-var-pied-piper: "\f2ae";
    -@fa-var-pied-piper-alt: "\f1a8";
    -@fa-var-pied-piper-pp: "\f1a7";
    -@fa-var-pinterest: "\f0d2";
    -@fa-var-pinterest-p: "\f231";
    -@fa-var-pinterest-square: "\f0d3";
    -@fa-var-plane: "\f072";
    -@fa-var-play: "\f04b";
    -@fa-var-play-circle: "\f144";
    -@fa-var-play-circle-o: "\f01d";
    -@fa-var-plug: "\f1e6";
    -@fa-var-plus: "\f067";
    -@fa-var-plus-circle: "\f055";
    -@fa-var-plus-square: "\f0fe";
    -@fa-var-plus-square-o: "\f196";
    -@fa-var-power-off: "\f011";
    -@fa-var-print: "\f02f";
    -@fa-var-product-hunt: "\f288";
    -@fa-var-puzzle-piece: "\f12e";
    -@fa-var-qq: "\f1d6";
    -@fa-var-qrcode: "\f029";
    -@fa-var-question: "\f128";
    -@fa-var-question-circle: "\f059";
    -@fa-var-question-circle-o: "\f29c";
    -@fa-var-quote-left: "\f10d";
    -@fa-var-quote-right: "\f10e";
    -@fa-var-ra: "\f1d0";
    -@fa-var-random: "\f074";
    -@fa-var-rebel: "\f1d0";
    -@fa-var-recycle: "\f1b8";
    -@fa-var-reddit: "\f1a1";
    -@fa-var-reddit-alien: "\f281";
    -@fa-var-reddit-square: "\f1a2";
    -@fa-var-refresh: "\f021";
    -@fa-var-registered: "\f25d";
    -@fa-var-remove: "\f00d";
    -@fa-var-renren: "\f18b";
    -@fa-var-reorder: "\f0c9";
    -@fa-var-repeat: "\f01e";
    -@fa-var-reply: "\f112";
    -@fa-var-reply-all: "\f122";
    -@fa-var-resistance: "\f1d0";
    -@fa-var-retweet: "\f079";
    -@fa-var-rmb: "\f157";
    -@fa-var-road: "\f018";
    -@fa-var-rocket: "\f135";
    -@fa-var-rotate-left: "\f0e2";
    -@fa-var-rotate-right: "\f01e";
    -@fa-var-rouble: "\f158";
    -@fa-var-rss: "\f09e";
    -@fa-var-rss-square: "\f143";
    -@fa-var-rub: "\f158";
    -@fa-var-ruble: "\f158";
    -@fa-var-rupee: "\f156";
    -@fa-var-safari: "\f267";
    -@fa-var-save: "\f0c7";
    -@fa-var-scissors: "\f0c4";
    -@fa-var-scribd: "\f28a";
    -@fa-var-search: "\f002";
    -@fa-var-search-minus: "\f010";
    -@fa-var-search-plus: "\f00e";
    -@fa-var-sellsy: "\f213";
    -@fa-var-send: "\f1d8";
    -@fa-var-send-o: "\f1d9";
    -@fa-var-server: "\f233";
    -@fa-var-share: "\f064";
    -@fa-var-share-alt: "\f1e0";
    -@fa-var-share-alt-square: "\f1e1";
    -@fa-var-share-square: "\f14d";
    -@fa-var-share-square-o: "\f045";
    -@fa-var-shekel: "\f20b";
    -@fa-var-sheqel: "\f20b";
    -@fa-var-shield: "\f132";
    -@fa-var-ship: "\f21a";
    -@fa-var-shirtsinbulk: "\f214";
    -@fa-var-shopping-bag: "\f290";
    -@fa-var-shopping-basket: "\f291";
    -@fa-var-shopping-cart: "\f07a";
    -@fa-var-sign-in: "\f090";
    -@fa-var-sign-language: "\f2a7";
    -@fa-var-sign-out: "\f08b";
    -@fa-var-signal: "\f012";
    -@fa-var-signing: "\f2a7";
    -@fa-var-simplybuilt: "\f215";
    -@fa-var-sitemap: "\f0e8";
    -@fa-var-skyatlas: "\f216";
    -@fa-var-skype: "\f17e";
    -@fa-var-slack: "\f198";
    -@fa-var-sliders: "\f1de";
    -@fa-var-slideshare: "\f1e7";
    -@fa-var-smile-o: "\f118";
    -@fa-var-snapchat: "\f2ab";
    -@fa-var-snapchat-ghost: "\f2ac";
    -@fa-var-snapchat-square: "\f2ad";
    -@fa-var-soccer-ball-o: "\f1e3";
    -@fa-var-sort: "\f0dc";
    -@fa-var-sort-alpha-asc: "\f15d";
    -@fa-var-sort-alpha-desc: "\f15e";
    -@fa-var-sort-amount-asc: "\f160";
    -@fa-var-sort-amount-desc: "\f161";
    -@fa-var-sort-asc: "\f0de";
    -@fa-var-sort-desc: "\f0dd";
    -@fa-var-sort-down: "\f0dd";
    -@fa-var-sort-numeric-asc: "\f162";
    -@fa-var-sort-numeric-desc: "\f163";
    -@fa-var-sort-up: "\f0de";
    -@fa-var-soundcloud: "\f1be";
    -@fa-var-space-shuttle: "\f197";
    -@fa-var-spinner: "\f110";
    -@fa-var-spoon: "\f1b1";
    -@fa-var-spotify: "\f1bc";
    -@fa-var-square: "\f0c8";
    -@fa-var-square-o: "\f096";
    -@fa-var-stack-exchange: "\f18d";
    -@fa-var-stack-overflow: "\f16c";
    -@fa-var-star: "\f005";
    -@fa-var-star-half: "\f089";
    -@fa-var-star-half-empty: "\f123";
    -@fa-var-star-half-full: "\f123";
    -@fa-var-star-half-o: "\f123";
    -@fa-var-star-o: "\f006";
    -@fa-var-steam: "\f1b6";
    -@fa-var-steam-square: "\f1b7";
    -@fa-var-step-backward: "\f048";
    -@fa-var-step-forward: "\f051";
    -@fa-var-stethoscope: "\f0f1";
    -@fa-var-sticky-note: "\f249";
    -@fa-var-sticky-note-o: "\f24a";
    -@fa-var-stop: "\f04d";
    -@fa-var-stop-circle: "\f28d";
    -@fa-var-stop-circle-o: "\f28e";
    -@fa-var-street-view: "\f21d";
    -@fa-var-strikethrough: "\f0cc";
    -@fa-var-stumbleupon: "\f1a4";
    -@fa-var-stumbleupon-circle: "\f1a3";
    -@fa-var-subscript: "\f12c";
    -@fa-var-subway: "\f239";
    -@fa-var-suitcase: "\f0f2";
    -@fa-var-sun-o: "\f185";
    -@fa-var-superscript: "\f12b";
    -@fa-var-support: "\f1cd";
    -@fa-var-table: "\f0ce";
    -@fa-var-tablet: "\f10a";
    -@fa-var-tachometer: "\f0e4";
    -@fa-var-tag: "\f02b";
    -@fa-var-tags: "\f02c";
    -@fa-var-tasks: "\f0ae";
    -@fa-var-taxi: "\f1ba";
    -@fa-var-television: "\f26c";
    -@fa-var-tencent-weibo: "\f1d5";
    -@fa-var-terminal: "\f120";
    -@fa-var-text-height: "\f034";
    -@fa-var-text-width: "\f035";
    -@fa-var-th: "\f00a";
    -@fa-var-th-large: "\f009";
    -@fa-var-th-list: "\f00b";
    -@fa-var-themeisle: "\f2b2";
    -@fa-var-thumb-tack: "\f08d";
    -@fa-var-thumbs-down: "\f165";
    -@fa-var-thumbs-o-down: "\f088";
    -@fa-var-thumbs-o-up: "\f087";
    -@fa-var-thumbs-up: "\f164";
    -@fa-var-ticket: "\f145";
    -@fa-var-times: "\f00d";
    -@fa-var-times-circle: "\f057";
    -@fa-var-times-circle-o: "\f05c";
    -@fa-var-tint: "\f043";
    -@fa-var-toggle-down: "\f150";
    -@fa-var-toggle-left: "\f191";
    -@fa-var-toggle-off: "\f204";
    -@fa-var-toggle-on: "\f205";
    -@fa-var-toggle-right: "\f152";
    -@fa-var-toggle-up: "\f151";
    -@fa-var-trademark: "\f25c";
    -@fa-var-train: "\f238";
    -@fa-var-transgender: "\f224";
    -@fa-var-transgender-alt: "\f225";
    -@fa-var-trash: "\f1f8";
    -@fa-var-trash-o: "\f014";
    -@fa-var-tree: "\f1bb";
    -@fa-var-trello: "\f181";
    -@fa-var-tripadvisor: "\f262";
    -@fa-var-trophy: "\f091";
    -@fa-var-truck: "\f0d1";
    -@fa-var-try: "\f195";
    -@fa-var-tty: "\f1e4";
    -@fa-var-tumblr: "\f173";
    -@fa-var-tumblr-square: "\f174";
    -@fa-var-turkish-lira: "\f195";
    -@fa-var-tv: "\f26c";
    -@fa-var-twitch: "\f1e8";
    -@fa-var-twitter: "\f099";
    -@fa-var-twitter-square: "\f081";
    -@fa-var-umbrella: "\f0e9";
    -@fa-var-underline: "\f0cd";
    -@fa-var-undo: "\f0e2";
    -@fa-var-universal-access: "\f29a";
    -@fa-var-university: "\f19c";
    -@fa-var-unlink: "\f127";
    -@fa-var-unlock: "\f09c";
    -@fa-var-unlock-alt: "\f13e";
    -@fa-var-unsorted: "\f0dc";
    -@fa-var-upload: "\f093";
    -@fa-var-usb: "\f287";
    -@fa-var-usd: "\f155";
    -@fa-var-user: "\f007";
    -@fa-var-user-md: "\f0f0";
    -@fa-var-user-plus: "\f234";
    -@fa-var-user-secret: "\f21b";
    -@fa-var-user-times: "\f235";
    -@fa-var-users: "\f0c0";
    -@fa-var-venus: "\f221";
    -@fa-var-venus-double: "\f226";
    -@fa-var-venus-mars: "\f228";
    -@fa-var-viacoin: "\f237";
    -@fa-var-viadeo: "\f2a9";
    -@fa-var-viadeo-square: "\f2aa";
    -@fa-var-video-camera: "\f03d";
    -@fa-var-vimeo: "\f27d";
    -@fa-var-vimeo-square: "\f194";
    -@fa-var-vine: "\f1ca";
    -@fa-var-vk: "\f189";
    -@fa-var-volume-control-phone: "\f2a0";
    -@fa-var-volume-down: "\f027";
    -@fa-var-volume-off: "\f026";
    -@fa-var-volume-up: "\f028";
    -@fa-var-warning: "\f071";
    -@fa-var-wechat: "\f1d7";
    -@fa-var-weibo: "\f18a";
    -@fa-var-weixin: "\f1d7";
    -@fa-var-whatsapp: "\f232";
    -@fa-var-wheelchair: "\f193";
    -@fa-var-wheelchair-alt: "\f29b";
    -@fa-var-wifi: "\f1eb";
    -@fa-var-wikipedia-w: "\f266";
    -@fa-var-windows: "\f17a";
    -@fa-var-won: "\f159";
    -@fa-var-wordpress: "\f19a";
    -@fa-var-wpbeginner: "\f297";
    -@fa-var-wpforms: "\f298";
    -@fa-var-wrench: "\f0ad";
    -@fa-var-xing: "\f168";
    -@fa-var-xing-square: "\f169";
    -@fa-var-y-combinator: "\f23b";
    -@fa-var-y-combinator-square: "\f1d4";
    -@fa-var-yahoo: "\f19e";
    -@fa-var-yc: "\f23b";
    -@fa-var-yc-square: "\f1d4";
    -@fa-var-yelp: "\f1e9";
    -@fa-var-yen: "\f157";
    -@fa-var-yoast: "\f2b1";
    -@fa-var-youtube: "\f167";
    -@fa-var-youtube-play: "\f16a";
    -@fa-var-youtube-square: "\f166";
    -
    +// Variables
    +// --------------------------
    +
    +@fa-font-path:        "../fonts";
    +@fa-font-size-base:   14px;
    +@fa-line-height-base: 1;
    +//@fa-font-path:        "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly
    +@fa-css-prefix:       fa;
    +@fa-version:          "4.6.3";
    +@fa-border-color:     #eee;
    +@fa-inverse:          #fff;
    +@fa-li-width:         (30em / 14);
    +
    +@fa-var-500px: "\f26e";
    +@fa-var-adjust: "\f042";
    +@fa-var-adn: "\f170";
    +@fa-var-align-center: "\f037";
    +@fa-var-align-justify: "\f039";
    +@fa-var-align-left: "\f036";
    +@fa-var-align-right: "\f038";
    +@fa-var-amazon: "\f270";
    +@fa-var-ambulance: "\f0f9";
    +@fa-var-american-sign-language-interpreting: "\f2a3";
    +@fa-var-anchor: "\f13d";
    +@fa-var-android: "\f17b";
    +@fa-var-angellist: "\f209";
    +@fa-var-angle-double-down: "\f103";
    +@fa-var-angle-double-left: "\f100";
    +@fa-var-angle-double-right: "\f101";
    +@fa-var-angle-double-up: "\f102";
    +@fa-var-angle-down: "\f107";
    +@fa-var-angle-left: "\f104";
    +@fa-var-angle-right: "\f105";
    +@fa-var-angle-up: "\f106";
    +@fa-var-apple: "\f179";
    +@fa-var-archive: "\f187";
    +@fa-var-area-chart: "\f1fe";
    +@fa-var-arrow-circle-down: "\f0ab";
    +@fa-var-arrow-circle-left: "\f0a8";
    +@fa-var-arrow-circle-o-down: "\f01a";
    +@fa-var-arrow-circle-o-left: "\f190";
    +@fa-var-arrow-circle-o-right: "\f18e";
    +@fa-var-arrow-circle-o-up: "\f01b";
    +@fa-var-arrow-circle-right: "\f0a9";
    +@fa-var-arrow-circle-up: "\f0aa";
    +@fa-var-arrow-down: "\f063";
    +@fa-var-arrow-left: "\f060";
    +@fa-var-arrow-right: "\f061";
    +@fa-var-arrow-up: "\f062";
    +@fa-var-arrows: "\f047";
    +@fa-var-arrows-alt: "\f0b2";
    +@fa-var-arrows-h: "\f07e";
    +@fa-var-arrows-v: "\f07d";
    +@fa-var-asl-interpreting: "\f2a3";
    +@fa-var-assistive-listening-systems: "\f2a2";
    +@fa-var-asterisk: "\f069";
    +@fa-var-at: "\f1fa";
    +@fa-var-audio-description: "\f29e";
    +@fa-var-automobile: "\f1b9";
    +@fa-var-backward: "\f04a";
    +@fa-var-balance-scale: "\f24e";
    +@fa-var-ban: "\f05e";
    +@fa-var-bank: "\f19c";
    +@fa-var-bar-chart: "\f080";
    +@fa-var-bar-chart-o: "\f080";
    +@fa-var-barcode: "\f02a";
    +@fa-var-bars: "\f0c9";
    +@fa-var-battery-0: "\f244";
    +@fa-var-battery-1: "\f243";
    +@fa-var-battery-2: "\f242";
    +@fa-var-battery-3: "\f241";
    +@fa-var-battery-4: "\f240";
    +@fa-var-battery-empty: "\f244";
    +@fa-var-battery-full: "\f240";
    +@fa-var-battery-half: "\f242";
    +@fa-var-battery-quarter: "\f243";
    +@fa-var-battery-three-quarters: "\f241";
    +@fa-var-bed: "\f236";
    +@fa-var-beer: "\f0fc";
    +@fa-var-behance: "\f1b4";
    +@fa-var-behance-square: "\f1b5";
    +@fa-var-bell: "\f0f3";
    +@fa-var-bell-o: "\f0a2";
    +@fa-var-bell-slash: "\f1f6";
    +@fa-var-bell-slash-o: "\f1f7";
    +@fa-var-bicycle: "\f206";
    +@fa-var-binoculars: "\f1e5";
    +@fa-var-birthday-cake: "\f1fd";
    +@fa-var-bitbucket: "\f171";
    +@fa-var-bitbucket-square: "\f172";
    +@fa-var-bitcoin: "\f15a";
    +@fa-var-black-tie: "\f27e";
    +@fa-var-blind: "\f29d";
    +@fa-var-bluetooth: "\f293";
    +@fa-var-bluetooth-b: "\f294";
    +@fa-var-bold: "\f032";
    +@fa-var-bolt: "\f0e7";
    +@fa-var-bomb: "\f1e2";
    +@fa-var-book: "\f02d";
    +@fa-var-bookmark: "\f02e";
    +@fa-var-bookmark-o: "\f097";
    +@fa-var-braille: "\f2a1";
    +@fa-var-briefcase: "\f0b1";
    +@fa-var-btc: "\f15a";
    +@fa-var-bug: "\f188";
    +@fa-var-building: "\f1ad";
    +@fa-var-building-o: "\f0f7";
    +@fa-var-bullhorn: "\f0a1";
    +@fa-var-bullseye: "\f140";
    +@fa-var-bus: "\f207";
    +@fa-var-buysellads: "\f20d";
    +@fa-var-cab: "\f1ba";
    +@fa-var-calculator: "\f1ec";
    +@fa-var-calendar: "\f073";
    +@fa-var-calendar-check-o: "\f274";
    +@fa-var-calendar-minus-o: "\f272";
    +@fa-var-calendar-o: "\f133";
    +@fa-var-calendar-plus-o: "\f271";
    +@fa-var-calendar-times-o: "\f273";
    +@fa-var-camera: "\f030";
    +@fa-var-camera-retro: "\f083";
    +@fa-var-car: "\f1b9";
    +@fa-var-caret-down: "\f0d7";
    +@fa-var-caret-left: "\f0d9";
    +@fa-var-caret-right: "\f0da";
    +@fa-var-caret-square-o-down: "\f150";
    +@fa-var-caret-square-o-left: "\f191";
    +@fa-var-caret-square-o-right: "\f152";
    +@fa-var-caret-square-o-up: "\f151";
    +@fa-var-caret-up: "\f0d8";
    +@fa-var-cart-arrow-down: "\f218";
    +@fa-var-cart-plus: "\f217";
    +@fa-var-cc: "\f20a";
    +@fa-var-cc-amex: "\f1f3";
    +@fa-var-cc-diners-club: "\f24c";
    +@fa-var-cc-discover: "\f1f2";
    +@fa-var-cc-jcb: "\f24b";
    +@fa-var-cc-mastercard: "\f1f1";
    +@fa-var-cc-paypal: "\f1f4";
    +@fa-var-cc-stripe: "\f1f5";
    +@fa-var-cc-visa: "\f1f0";
    +@fa-var-certificate: "\f0a3";
    +@fa-var-chain: "\f0c1";
    +@fa-var-chain-broken: "\f127";
    +@fa-var-check: "\f00c";
    +@fa-var-check-circle: "\f058";
    +@fa-var-check-circle-o: "\f05d";
    +@fa-var-check-square: "\f14a";
    +@fa-var-check-square-o: "\f046";
    +@fa-var-chevron-circle-down: "\f13a";
    +@fa-var-chevron-circle-left: "\f137";
    +@fa-var-chevron-circle-right: "\f138";
    +@fa-var-chevron-circle-up: "\f139";
    +@fa-var-chevron-down: "\f078";
    +@fa-var-chevron-left: "\f053";
    +@fa-var-chevron-right: "\f054";
    +@fa-var-chevron-up: "\f077";
    +@fa-var-child: "\f1ae";
    +@fa-var-chrome: "\f268";
    +@fa-var-circle: "\f111";
    +@fa-var-circle-o: "\f10c";
    +@fa-var-circle-o-notch: "\f1ce";
    +@fa-var-circle-thin: "\f1db";
    +@fa-var-clipboard: "\f0ea";
    +@fa-var-clock-o: "\f017";
    +@fa-var-clone: "\f24d";
    +@fa-var-close: "\f00d";
    +@fa-var-cloud: "\f0c2";
    +@fa-var-cloud-download: "\f0ed";
    +@fa-var-cloud-upload: "\f0ee";
    +@fa-var-cny: "\f157";
    +@fa-var-code: "\f121";
    +@fa-var-code-fork: "\f126";
    +@fa-var-codepen: "\f1cb";
    +@fa-var-codiepie: "\f284";
    +@fa-var-coffee: "\f0f4";
    +@fa-var-cog: "\f013";
    +@fa-var-cogs: "\f085";
    +@fa-var-columns: "\f0db";
    +@fa-var-comment: "\f075";
    +@fa-var-comment-o: "\f0e5";
    +@fa-var-commenting: "\f27a";
    +@fa-var-commenting-o: "\f27b";
    +@fa-var-comments: "\f086";
    +@fa-var-comments-o: "\f0e6";
    +@fa-var-compass: "\f14e";
    +@fa-var-compress: "\f066";
    +@fa-var-connectdevelop: "\f20e";
    +@fa-var-contao: "\f26d";
    +@fa-var-copy: "\f0c5";
    +@fa-var-copyright: "\f1f9";
    +@fa-var-creative-commons: "\f25e";
    +@fa-var-credit-card: "\f09d";
    +@fa-var-credit-card-alt: "\f283";
    +@fa-var-crop: "\f125";
    +@fa-var-crosshairs: "\f05b";
    +@fa-var-css3: "\f13c";
    +@fa-var-cube: "\f1b2";
    +@fa-var-cubes: "\f1b3";
    +@fa-var-cut: "\f0c4";
    +@fa-var-cutlery: "\f0f5";
    +@fa-var-dashboard: "\f0e4";
    +@fa-var-dashcube: "\f210";
    +@fa-var-database: "\f1c0";
    +@fa-var-deaf: "\f2a4";
    +@fa-var-deafness: "\f2a4";
    +@fa-var-dedent: "\f03b";
    +@fa-var-delicious: "\f1a5";
    +@fa-var-desktop: "\f108";
    +@fa-var-deviantart: "\f1bd";
    +@fa-var-diamond: "\f219";
    +@fa-var-digg: "\f1a6";
    +@fa-var-dollar: "\f155";
    +@fa-var-dot-circle-o: "\f192";
    +@fa-var-download: "\f019";
    +@fa-var-dribbble: "\f17d";
    +@fa-var-dropbox: "\f16b";
    +@fa-var-drupal: "\f1a9";
    +@fa-var-edge: "\f282";
    +@fa-var-edit: "\f044";
    +@fa-var-eject: "\f052";
    +@fa-var-ellipsis-h: "\f141";
    +@fa-var-ellipsis-v: "\f142";
    +@fa-var-empire: "\f1d1";
    +@fa-var-envelope: "\f0e0";
    +@fa-var-envelope-o: "\f003";
    +@fa-var-envelope-square: "\f199";
    +@fa-var-envira: "\f299";
    +@fa-var-eraser: "\f12d";
    +@fa-var-eur: "\f153";
    +@fa-var-euro: "\f153";
    +@fa-var-exchange: "\f0ec";
    +@fa-var-exclamation: "\f12a";
    +@fa-var-exclamation-circle: "\f06a";
    +@fa-var-exclamation-triangle: "\f071";
    +@fa-var-expand: "\f065";
    +@fa-var-expeditedssl: "\f23e";
    +@fa-var-external-link: "\f08e";
    +@fa-var-external-link-square: "\f14c";
    +@fa-var-eye: "\f06e";
    +@fa-var-eye-slash: "\f070";
    +@fa-var-eyedropper: "\f1fb";
    +@fa-var-fa: "\f2b4";
    +@fa-var-facebook: "\f09a";
    +@fa-var-facebook-f: "\f09a";
    +@fa-var-facebook-official: "\f230";
    +@fa-var-facebook-square: "\f082";
    +@fa-var-fast-backward: "\f049";
    +@fa-var-fast-forward: "\f050";
    +@fa-var-fax: "\f1ac";
    +@fa-var-feed: "\f09e";
    +@fa-var-female: "\f182";
    +@fa-var-fighter-jet: "\f0fb";
    +@fa-var-file: "\f15b";
    +@fa-var-file-archive-o: "\f1c6";
    +@fa-var-file-audio-o: "\f1c7";
    +@fa-var-file-code-o: "\f1c9";
    +@fa-var-file-excel-o: "\f1c3";
    +@fa-var-file-image-o: "\f1c5";
    +@fa-var-file-movie-o: "\f1c8";
    +@fa-var-file-o: "\f016";
    +@fa-var-file-pdf-o: "\f1c1";
    +@fa-var-file-photo-o: "\f1c5";
    +@fa-var-file-picture-o: "\f1c5";
    +@fa-var-file-powerpoint-o: "\f1c4";
    +@fa-var-file-sound-o: "\f1c7";
    +@fa-var-file-text: "\f15c";
    +@fa-var-file-text-o: "\f0f6";
    +@fa-var-file-video-o: "\f1c8";
    +@fa-var-file-word-o: "\f1c2";
    +@fa-var-file-zip-o: "\f1c6";
    +@fa-var-files-o: "\f0c5";
    +@fa-var-film: "\f008";
    +@fa-var-filter: "\f0b0";
    +@fa-var-fire: "\f06d";
    +@fa-var-fire-extinguisher: "\f134";
    +@fa-var-firefox: "\f269";
    +@fa-var-first-order: "\f2b0";
    +@fa-var-flag: "\f024";
    +@fa-var-flag-checkered: "\f11e";
    +@fa-var-flag-o: "\f11d";
    +@fa-var-flash: "\f0e7";
    +@fa-var-flask: "\f0c3";
    +@fa-var-flickr: "\f16e";
    +@fa-var-floppy-o: "\f0c7";
    +@fa-var-folder: "\f07b";
    +@fa-var-folder-o: "\f114";
    +@fa-var-folder-open: "\f07c";
    +@fa-var-folder-open-o: "\f115";
    +@fa-var-font: "\f031";
    +@fa-var-font-awesome: "\f2b4";
    +@fa-var-fonticons: "\f280";
    +@fa-var-fort-awesome: "\f286";
    +@fa-var-forumbee: "\f211";
    +@fa-var-forward: "\f04e";
    +@fa-var-foursquare: "\f180";
    +@fa-var-frown-o: "\f119";
    +@fa-var-futbol-o: "\f1e3";
    +@fa-var-gamepad: "\f11b";
    +@fa-var-gavel: "\f0e3";
    +@fa-var-gbp: "\f154";
    +@fa-var-ge: "\f1d1";
    +@fa-var-gear: "\f013";
    +@fa-var-gears: "\f085";
    +@fa-var-genderless: "\f22d";
    +@fa-var-get-pocket: "\f265";
    +@fa-var-gg: "\f260";
    +@fa-var-gg-circle: "\f261";
    +@fa-var-gift: "\f06b";
    +@fa-var-git: "\f1d3";
    +@fa-var-git-square: "\f1d2";
    +@fa-var-github: "\f09b";
    +@fa-var-github-alt: "\f113";
    +@fa-var-github-square: "\f092";
    +@fa-var-gitlab: "\f296";
    +@fa-var-gittip: "\f184";
    +@fa-var-glass: "\f000";
    +@fa-var-glide: "\f2a5";
    +@fa-var-glide-g: "\f2a6";
    +@fa-var-globe: "\f0ac";
    +@fa-var-google: "\f1a0";
    +@fa-var-google-plus: "\f0d5";
    +@fa-var-google-plus-circle: "\f2b3";
    +@fa-var-google-plus-official: "\f2b3";
    +@fa-var-google-plus-square: "\f0d4";
    +@fa-var-google-wallet: "\f1ee";
    +@fa-var-graduation-cap: "\f19d";
    +@fa-var-gratipay: "\f184";
    +@fa-var-group: "\f0c0";
    +@fa-var-h-square: "\f0fd";
    +@fa-var-hacker-news: "\f1d4";
    +@fa-var-hand-grab-o: "\f255";
    +@fa-var-hand-lizard-o: "\f258";
    +@fa-var-hand-o-down: "\f0a7";
    +@fa-var-hand-o-left: "\f0a5";
    +@fa-var-hand-o-right: "\f0a4";
    +@fa-var-hand-o-up: "\f0a6";
    +@fa-var-hand-paper-o: "\f256";
    +@fa-var-hand-peace-o: "\f25b";
    +@fa-var-hand-pointer-o: "\f25a";
    +@fa-var-hand-rock-o: "\f255";
    +@fa-var-hand-scissors-o: "\f257";
    +@fa-var-hand-spock-o: "\f259";
    +@fa-var-hand-stop-o: "\f256";
    +@fa-var-hard-of-hearing: "\f2a4";
    +@fa-var-hashtag: "\f292";
    +@fa-var-hdd-o: "\f0a0";
    +@fa-var-header: "\f1dc";
    +@fa-var-headphones: "\f025";
    +@fa-var-heart: "\f004";
    +@fa-var-heart-o: "\f08a";
    +@fa-var-heartbeat: "\f21e";
    +@fa-var-history: "\f1da";
    +@fa-var-home: "\f015";
    +@fa-var-hospital-o: "\f0f8";
    +@fa-var-hotel: "\f236";
    +@fa-var-hourglass: "\f254";
    +@fa-var-hourglass-1: "\f251";
    +@fa-var-hourglass-2: "\f252";
    +@fa-var-hourglass-3: "\f253";
    +@fa-var-hourglass-end: "\f253";
    +@fa-var-hourglass-half: "\f252";
    +@fa-var-hourglass-o: "\f250";
    +@fa-var-hourglass-start: "\f251";
    +@fa-var-houzz: "\f27c";
    +@fa-var-html5: "\f13b";
    +@fa-var-i-cursor: "\f246";
    +@fa-var-ils: "\f20b";
    +@fa-var-image: "\f03e";
    +@fa-var-inbox: "\f01c";
    +@fa-var-indent: "\f03c";
    +@fa-var-industry: "\f275";
    +@fa-var-info: "\f129";
    +@fa-var-info-circle: "\f05a";
    +@fa-var-inr: "\f156";
    +@fa-var-instagram: "\f16d";
    +@fa-var-institution: "\f19c";
    +@fa-var-internet-explorer: "\f26b";
    +@fa-var-intersex: "\f224";
    +@fa-var-ioxhost: "\f208";
    +@fa-var-italic: "\f033";
    +@fa-var-joomla: "\f1aa";
    +@fa-var-jpy: "\f157";
    +@fa-var-jsfiddle: "\f1cc";
    +@fa-var-key: "\f084";
    +@fa-var-keyboard-o: "\f11c";
    +@fa-var-krw: "\f159";
    +@fa-var-language: "\f1ab";
    +@fa-var-laptop: "\f109";
    +@fa-var-lastfm: "\f202";
    +@fa-var-lastfm-square: "\f203";
    +@fa-var-leaf: "\f06c";
    +@fa-var-leanpub: "\f212";
    +@fa-var-legal: "\f0e3";
    +@fa-var-lemon-o: "\f094";
    +@fa-var-level-down: "\f149";
    +@fa-var-level-up: "\f148";
    +@fa-var-life-bouy: "\f1cd";
    +@fa-var-life-buoy: "\f1cd";
    +@fa-var-life-ring: "\f1cd";
    +@fa-var-life-saver: "\f1cd";
    +@fa-var-lightbulb-o: "\f0eb";
    +@fa-var-line-chart: "\f201";
    +@fa-var-link: "\f0c1";
    +@fa-var-linkedin: "\f0e1";
    +@fa-var-linkedin-square: "\f08c";
    +@fa-var-linux: "\f17c";
    +@fa-var-list: "\f03a";
    +@fa-var-list-alt: "\f022";
    +@fa-var-list-ol: "\f0cb";
    +@fa-var-list-ul: "\f0ca";
    +@fa-var-location-arrow: "\f124";
    +@fa-var-lock: "\f023";
    +@fa-var-long-arrow-down: "\f175";
    +@fa-var-long-arrow-left: "\f177";
    +@fa-var-long-arrow-right: "\f178";
    +@fa-var-long-arrow-up: "\f176";
    +@fa-var-low-vision: "\f2a8";
    +@fa-var-magic: "\f0d0";
    +@fa-var-magnet: "\f076";
    +@fa-var-mail-forward: "\f064";
    +@fa-var-mail-reply: "\f112";
    +@fa-var-mail-reply-all: "\f122";
    +@fa-var-male: "\f183";
    +@fa-var-map: "\f279";
    +@fa-var-map-marker: "\f041";
    +@fa-var-map-o: "\f278";
    +@fa-var-map-pin: "\f276";
    +@fa-var-map-signs: "\f277";
    +@fa-var-mars: "\f222";
    +@fa-var-mars-double: "\f227";
    +@fa-var-mars-stroke: "\f229";
    +@fa-var-mars-stroke-h: "\f22b";
    +@fa-var-mars-stroke-v: "\f22a";
    +@fa-var-maxcdn: "\f136";
    +@fa-var-meanpath: "\f20c";
    +@fa-var-medium: "\f23a";
    +@fa-var-medkit: "\f0fa";
    +@fa-var-meh-o: "\f11a";
    +@fa-var-mercury: "\f223";
    +@fa-var-microphone: "\f130";
    +@fa-var-microphone-slash: "\f131";
    +@fa-var-minus: "\f068";
    +@fa-var-minus-circle: "\f056";
    +@fa-var-minus-square: "\f146";
    +@fa-var-minus-square-o: "\f147";
    +@fa-var-mixcloud: "\f289";
    +@fa-var-mobile: "\f10b";
    +@fa-var-mobile-phone: "\f10b";
    +@fa-var-modx: "\f285";
    +@fa-var-money: "\f0d6";
    +@fa-var-moon-o: "\f186";
    +@fa-var-mortar-board: "\f19d";
    +@fa-var-motorcycle: "\f21c";
    +@fa-var-mouse-pointer: "\f245";
    +@fa-var-music: "\f001";
    +@fa-var-navicon: "\f0c9";
    +@fa-var-neuter: "\f22c";
    +@fa-var-newspaper-o: "\f1ea";
    +@fa-var-object-group: "\f247";
    +@fa-var-object-ungroup: "\f248";
    +@fa-var-odnoklassniki: "\f263";
    +@fa-var-odnoklassniki-square: "\f264";
    +@fa-var-opencart: "\f23d";
    +@fa-var-openid: "\f19b";
    +@fa-var-opera: "\f26a";
    +@fa-var-optin-monster: "\f23c";
    +@fa-var-outdent: "\f03b";
    +@fa-var-pagelines: "\f18c";
    +@fa-var-paint-brush: "\f1fc";
    +@fa-var-paper-plane: "\f1d8";
    +@fa-var-paper-plane-o: "\f1d9";
    +@fa-var-paperclip: "\f0c6";
    +@fa-var-paragraph: "\f1dd";
    +@fa-var-paste: "\f0ea";
    +@fa-var-pause: "\f04c";
    +@fa-var-pause-circle: "\f28b";
    +@fa-var-pause-circle-o: "\f28c";
    +@fa-var-paw: "\f1b0";
    +@fa-var-paypal: "\f1ed";
    +@fa-var-pencil: "\f040";
    +@fa-var-pencil-square: "\f14b";
    +@fa-var-pencil-square-o: "\f044";
    +@fa-var-percent: "\f295";
    +@fa-var-phone: "\f095";
    +@fa-var-phone-square: "\f098";
    +@fa-var-photo: "\f03e";
    +@fa-var-picture-o: "\f03e";
    +@fa-var-pie-chart: "\f200";
    +@fa-var-pied-piper: "\f2ae";
    +@fa-var-pied-piper-alt: "\f1a8";
    +@fa-var-pied-piper-pp: "\f1a7";
    +@fa-var-pinterest: "\f0d2";
    +@fa-var-pinterest-p: "\f231";
    +@fa-var-pinterest-square: "\f0d3";
    +@fa-var-plane: "\f072";
    +@fa-var-play: "\f04b";
    +@fa-var-play-circle: "\f144";
    +@fa-var-play-circle-o: "\f01d";
    +@fa-var-plug: "\f1e6";
    +@fa-var-plus: "\f067";
    +@fa-var-plus-circle: "\f055";
    +@fa-var-plus-square: "\f0fe";
    +@fa-var-plus-square-o: "\f196";
    +@fa-var-power-off: "\f011";
    +@fa-var-print: "\f02f";
    +@fa-var-product-hunt: "\f288";
    +@fa-var-puzzle-piece: "\f12e";
    +@fa-var-qq: "\f1d6";
    +@fa-var-qrcode: "\f029";
    +@fa-var-question: "\f128";
    +@fa-var-question-circle: "\f059";
    +@fa-var-question-circle-o: "\f29c";
    +@fa-var-quote-left: "\f10d";
    +@fa-var-quote-right: "\f10e";
    +@fa-var-ra: "\f1d0";
    +@fa-var-random: "\f074";
    +@fa-var-rebel: "\f1d0";
    +@fa-var-recycle: "\f1b8";
    +@fa-var-reddit: "\f1a1";
    +@fa-var-reddit-alien: "\f281";
    +@fa-var-reddit-square: "\f1a2";
    +@fa-var-refresh: "\f021";
    +@fa-var-registered: "\f25d";
    +@fa-var-remove: "\f00d";
    +@fa-var-renren: "\f18b";
    +@fa-var-reorder: "\f0c9";
    +@fa-var-repeat: "\f01e";
    +@fa-var-reply: "\f112";
    +@fa-var-reply-all: "\f122";
    +@fa-var-resistance: "\f1d0";
    +@fa-var-retweet: "\f079";
    +@fa-var-rmb: "\f157";
    +@fa-var-road: "\f018";
    +@fa-var-rocket: "\f135";
    +@fa-var-rotate-left: "\f0e2";
    +@fa-var-rotate-right: "\f01e";
    +@fa-var-rouble: "\f158";
    +@fa-var-rss: "\f09e";
    +@fa-var-rss-square: "\f143";
    +@fa-var-rub: "\f158";
    +@fa-var-ruble: "\f158";
    +@fa-var-rupee: "\f156";
    +@fa-var-safari: "\f267";
    +@fa-var-save: "\f0c7";
    +@fa-var-scissors: "\f0c4";
    +@fa-var-scribd: "\f28a";
    +@fa-var-search: "\f002";
    +@fa-var-search-minus: "\f010";
    +@fa-var-search-plus: "\f00e";
    +@fa-var-sellsy: "\f213";
    +@fa-var-send: "\f1d8";
    +@fa-var-send-o: "\f1d9";
    +@fa-var-server: "\f233";
    +@fa-var-share: "\f064";
    +@fa-var-share-alt: "\f1e0";
    +@fa-var-share-alt-square: "\f1e1";
    +@fa-var-share-square: "\f14d";
    +@fa-var-share-square-o: "\f045";
    +@fa-var-shekel: "\f20b";
    +@fa-var-sheqel: "\f20b";
    +@fa-var-shield: "\f132";
    +@fa-var-ship: "\f21a";
    +@fa-var-shirtsinbulk: "\f214";
    +@fa-var-shopping-bag: "\f290";
    +@fa-var-shopping-basket: "\f291";
    +@fa-var-shopping-cart: "\f07a";
    +@fa-var-sign-in: "\f090";
    +@fa-var-sign-language: "\f2a7";
    +@fa-var-sign-out: "\f08b";
    +@fa-var-signal: "\f012";
    +@fa-var-signing: "\f2a7";
    +@fa-var-simplybuilt: "\f215";
    +@fa-var-sitemap: "\f0e8";
    +@fa-var-skyatlas: "\f216";
    +@fa-var-skype: "\f17e";
    +@fa-var-slack: "\f198";
    +@fa-var-sliders: "\f1de";
    +@fa-var-slideshare: "\f1e7";
    +@fa-var-smile-o: "\f118";
    +@fa-var-snapchat: "\f2ab";
    +@fa-var-snapchat-ghost: "\f2ac";
    +@fa-var-snapchat-square: "\f2ad";
    +@fa-var-soccer-ball-o: "\f1e3";
    +@fa-var-sort: "\f0dc";
    +@fa-var-sort-alpha-asc: "\f15d";
    +@fa-var-sort-alpha-desc: "\f15e";
    +@fa-var-sort-amount-asc: "\f160";
    +@fa-var-sort-amount-desc: "\f161";
    +@fa-var-sort-asc: "\f0de";
    +@fa-var-sort-desc: "\f0dd";
    +@fa-var-sort-down: "\f0dd";
    +@fa-var-sort-numeric-asc: "\f162";
    +@fa-var-sort-numeric-desc: "\f163";
    +@fa-var-sort-up: "\f0de";
    +@fa-var-soundcloud: "\f1be";
    +@fa-var-space-shuttle: "\f197";
    +@fa-var-spinner: "\f110";
    +@fa-var-spoon: "\f1b1";
    +@fa-var-spotify: "\f1bc";
    +@fa-var-square: "\f0c8";
    +@fa-var-square-o: "\f096";
    +@fa-var-stack-exchange: "\f18d";
    +@fa-var-stack-overflow: "\f16c";
    +@fa-var-star: "\f005";
    +@fa-var-star-half: "\f089";
    +@fa-var-star-half-empty: "\f123";
    +@fa-var-star-half-full: "\f123";
    +@fa-var-star-half-o: "\f123";
    +@fa-var-star-o: "\f006";
    +@fa-var-steam: "\f1b6";
    +@fa-var-steam-square: "\f1b7";
    +@fa-var-step-backward: "\f048";
    +@fa-var-step-forward: "\f051";
    +@fa-var-stethoscope: "\f0f1";
    +@fa-var-sticky-note: "\f249";
    +@fa-var-sticky-note-o: "\f24a";
    +@fa-var-stop: "\f04d";
    +@fa-var-stop-circle: "\f28d";
    +@fa-var-stop-circle-o: "\f28e";
    +@fa-var-street-view: "\f21d";
    +@fa-var-strikethrough: "\f0cc";
    +@fa-var-stumbleupon: "\f1a4";
    +@fa-var-stumbleupon-circle: "\f1a3";
    +@fa-var-subscript: "\f12c";
    +@fa-var-subway: "\f239";
    +@fa-var-suitcase: "\f0f2";
    +@fa-var-sun-o: "\f185";
    +@fa-var-superscript: "\f12b";
    +@fa-var-support: "\f1cd";
    +@fa-var-table: "\f0ce";
    +@fa-var-tablet: "\f10a";
    +@fa-var-tachometer: "\f0e4";
    +@fa-var-tag: "\f02b";
    +@fa-var-tags: "\f02c";
    +@fa-var-tasks: "\f0ae";
    +@fa-var-taxi: "\f1ba";
    +@fa-var-television: "\f26c";
    +@fa-var-tencent-weibo: "\f1d5";
    +@fa-var-terminal: "\f120";
    +@fa-var-text-height: "\f034";
    +@fa-var-text-width: "\f035";
    +@fa-var-th: "\f00a";
    +@fa-var-th-large: "\f009";
    +@fa-var-th-list: "\f00b";
    +@fa-var-themeisle: "\f2b2";
    +@fa-var-thumb-tack: "\f08d";
    +@fa-var-thumbs-down: "\f165";
    +@fa-var-thumbs-o-down: "\f088";
    +@fa-var-thumbs-o-up: "\f087";
    +@fa-var-thumbs-up: "\f164";
    +@fa-var-ticket: "\f145";
    +@fa-var-times: "\f00d";
    +@fa-var-times-circle: "\f057";
    +@fa-var-times-circle-o: "\f05c";
    +@fa-var-tint: "\f043";
    +@fa-var-toggle-down: "\f150";
    +@fa-var-toggle-left: "\f191";
    +@fa-var-toggle-off: "\f204";
    +@fa-var-toggle-on: "\f205";
    +@fa-var-toggle-right: "\f152";
    +@fa-var-toggle-up: "\f151";
    +@fa-var-trademark: "\f25c";
    +@fa-var-train: "\f238";
    +@fa-var-transgender: "\f224";
    +@fa-var-transgender-alt: "\f225";
    +@fa-var-trash: "\f1f8";
    +@fa-var-trash-o: "\f014";
    +@fa-var-tree: "\f1bb";
    +@fa-var-trello: "\f181";
    +@fa-var-tripadvisor: "\f262";
    +@fa-var-trophy: "\f091";
    +@fa-var-truck: "\f0d1";
    +@fa-var-try: "\f195";
    +@fa-var-tty: "\f1e4";
    +@fa-var-tumblr: "\f173";
    +@fa-var-tumblr-square: "\f174";
    +@fa-var-turkish-lira: "\f195";
    +@fa-var-tv: "\f26c";
    +@fa-var-twitch: "\f1e8";
    +@fa-var-twitter: "\f099";
    +@fa-var-twitter-square: "\f081";
    +@fa-var-umbrella: "\f0e9";
    +@fa-var-underline: "\f0cd";
    +@fa-var-undo: "\f0e2";
    +@fa-var-universal-access: "\f29a";
    +@fa-var-university: "\f19c";
    +@fa-var-unlink: "\f127";
    +@fa-var-unlock: "\f09c";
    +@fa-var-unlock-alt: "\f13e";
    +@fa-var-unsorted: "\f0dc";
    +@fa-var-upload: "\f093";
    +@fa-var-usb: "\f287";
    +@fa-var-usd: "\f155";
    +@fa-var-user: "\f007";
    +@fa-var-user-md: "\f0f0";
    +@fa-var-user-plus: "\f234";
    +@fa-var-user-secret: "\f21b";
    +@fa-var-user-times: "\f235";
    +@fa-var-users: "\f0c0";
    +@fa-var-venus: "\f221";
    +@fa-var-venus-double: "\f226";
    +@fa-var-venus-mars: "\f228";
    +@fa-var-viacoin: "\f237";
    +@fa-var-viadeo: "\f2a9";
    +@fa-var-viadeo-square: "\f2aa";
    +@fa-var-video-camera: "\f03d";
    +@fa-var-vimeo: "\f27d";
    +@fa-var-vimeo-square: "\f194";
    +@fa-var-vine: "\f1ca";
    +@fa-var-vk: "\f189";
    +@fa-var-volume-control-phone: "\f2a0";
    +@fa-var-volume-down: "\f027";
    +@fa-var-volume-off: "\f026";
    +@fa-var-volume-up: "\f028";
    +@fa-var-warning: "\f071";
    +@fa-var-wechat: "\f1d7";
    +@fa-var-weibo: "\f18a";
    +@fa-var-weixin: "\f1d7";
    +@fa-var-whatsapp: "\f232";
    +@fa-var-wheelchair: "\f193";
    +@fa-var-wheelchair-alt: "\f29b";
    +@fa-var-wifi: "\f1eb";
    +@fa-var-wikipedia-w: "\f266";
    +@fa-var-windows: "\f17a";
    +@fa-var-won: "\f159";
    +@fa-var-wordpress: "\f19a";
    +@fa-var-wpbeginner: "\f297";
    +@fa-var-wpforms: "\f298";
    +@fa-var-wrench: "\f0ad";
    +@fa-var-xing: "\f168";
    +@fa-var-xing-square: "\f169";
    +@fa-var-y-combinator: "\f23b";
    +@fa-var-y-combinator-square: "\f1d4";
    +@fa-var-yahoo: "\f19e";
    +@fa-var-yc: "\f23b";
    +@fa-var-yc-square: "\f1d4";
    +@fa-var-yelp: "\f1e9";
    +@fa-var-yen: "\f157";
    +@fa-var-yoast: "\f2b1";
    +@fa-var-youtube: "\f167";
    +@fa-var-youtube-play: "\f16a";
    +@fa-var-youtube-square: "\f166";
    +
    diff --git a/assets/less/partials/_animations.less b/assets/less/partials/_animations.less
    index 7c7494e..06738c4 100644
    --- a/assets/less/partials/_animations.less
    +++ b/assets/less/partials/_animations.less
    @@ -1,17 +1,17 @@
    -.alert-enter {
    -  opacity: 0.01;
    -  transition: opacity 1s ease-in;
    -}
    -
    -.alert-enter.alert-enter-active {
    -  opacity: 1;
    -}
    -
    -.alert-leave {
    -  opacity: 1;
    -  transition: opacity 1s ease-in;
    -}
    -
    -.alert-leave.alert-leave-active {
    -  opacity: 0.01;
    +.alert-enter {
    +  opacity: 0.01;
    +  transition: opacity 1s ease-in;
    +}
    +
    +.alert-enter.alert-enter-active {
    +  opacity: 1;
    +}
    +
    +.alert-leave {
    +  opacity: 1;
    +  transition: opacity 1s ease-in;
    +}
    +
    +.alert-leave.alert-leave-active {
    +  opacity: 0.01;
     }
    \ No newline at end of file
    diff --git a/assets/less/partials/_scrollbar.less b/assets/less/partials/_scrollbar.less
    index 68a162a..776aa64 100644
    --- a/assets/less/partials/_scrollbar.less
    +++ b/assets/less/partials/_scrollbar.less
    @@ -1,14 +1,14 @@
    -::-webkit-scrollbar {
    -  height: 12px;
    -  width: 12px;
    -  background: @body-bg;
    -}
    -
    -::-webkit-scrollbar-thumb {
    -  background: @brand-primary;
    -  -webkit-border-radius: 0;
    -}
    -
    -::-webkit-scrollbar-corner {
    -  background: #000;
    -}
    +::-webkit-scrollbar {
    +  height: 12px;
    +  width: 12px;
    +  background: @body-bg;
    +}
    +
    +::-webkit-scrollbar-thumb {
    +  background: @brand-primary;
    +  -webkit-border-radius: 0;
    +}
    +
    +::-webkit-scrollbar-corner {
    +  background: #000;
    +}
    diff --git a/assets/less/variables.less b/assets/less/variables.less
    index 2a55e45..b90cedf 100644
    --- a/assets/less/variables.less
    +++ b/assets/less/variables.less
    @@ -1,2 +1,2 @@
    -@navbar-margin-bottom: 0px;
    -@navbar-border-radius: 0px;
    +@navbar-margin-bottom: 0px;
    +@navbar-border-radius: 0px;
    diff --git a/bower.json b/bower.json
    index 619ca46..ddcb72e 100644
    --- a/bower.json
    +++ b/bower.json
    @@ -1,14 +1,14 @@
    -{
    -  "name": "WakaTime",
    -  "ignore": [
    -    "**/.*",
    -    "node_modules",
    -    "bower_components",
    -    "test",
    -    "tests"
    -  ],
    -  "dependencies": {
    -    "font-awesome": "~4.6.3",
    -    "bootstrap": "~3.3.4"
    -  }
    -}
    +{
    +  "name": "WakaTime",
    +  "ignore": [
    +    "**/.*",
    +    "node_modules",
    +    "bower_components",
    +    "test",
    +    "tests"
    +  ],
    +  "dependencies": {
    +    "font-awesome": "~4.6.3",
    +    "bootstrap": "~3.3.4"
    +  }
    +}
    diff --git a/devtools.html b/devtools.html
    index 0eaf379..6146d9e 100644
    --- a/devtools.html
    +++ b/devtools.html
    @@ -1,2 +1,2 @@
    -
    -
    +
    +
    diff --git a/gulpfile.js b/gulpfile.js
    index 510d4c6..3df2b22 100644
    --- a/gulpfile.js
    +++ b/gulpfile.js
    @@ -1,43 +1,43 @@
    -var del = require('del');
    -var gulp = require('gulp');
    -var elixir = require('laravel-elixir');
    -
    -/*
    - |--------------------------------------------------------------------------
    - | Pre-defined Gulp Tasks
    - |--------------------------------------------------------------------------
    - |
    - | Tasks outside the scope of Elixir can be predefined before setting it up.
    - |
    - */
    -
    -gulp.task('postinstall', function (cb) {
    -    // .pem files cause Chrome to show a bunch of warnings
    -    //so we remove them on postinstall
    -    del('node_modules/**/*.pem', cb);
    -});
    -
    -/*
    - |--------------------------------------------------------------------------
    - | Elixir Asset Management
    - |--------------------------------------------------------------------------
    - |
    - | Elixir provides a clean, fluent API for defining some basic Gulp tasks
    - | for your Laravel application. By default, we are compiling the Less
    - | file for our application, as well as publishing vendor resources.
    - |
    - */
    -
    -elixir.config.assetsPath = 'assets/';
    -
    -elixir(function (mix) {
    -    mix.copy('vendor/bower_components/bootstrap/less', 'assets/less/bootstrap');
    -    mix.copy('vendor/bower_components/bootstrap/fonts', 'public/fonts');
    -    mix.copy('vendor/bower_components/font-awesome/less', 'assets/less/font-awesome');
    -    mix.copy('vendor/bower_components/font-awesome/fonts', 'public/fonts');
    -    mix.less('app.less');
    -    mix.browserify('app.jsx', 'public/js/app.js', 'assets/js');
    -    mix.browserify('events.js', 'public/js/events.js', 'assets/js');
    -    mix.browserify('options.jsx', 'public/js/options.js', 'assets/js');
    -    mix.browserify('devtools.js', 'public/js/devtools.js', 'assets/js');
    -});
    +var del = require('del');
    +var gulp = require('gulp');
    +var elixir = require('laravel-elixir');
    +
    +/*
    + |--------------------------------------------------------------------------
    + | Pre-defined Gulp Tasks
    + |--------------------------------------------------------------------------
    + |
    + | Tasks outside the scope of Elixir can be predefined before setting it up.
    + |
    + */
    +
    +gulp.task('postinstall', function (cb) {
    +    // .pem files cause Chrome to show a bunch of warnings
    +    //so we remove them on postinstall
    +    del('node_modules/**/*.pem', cb);
    +});
    +
    +/*
    + |--------------------------------------------------------------------------
    + | Elixir Asset Management
    + |--------------------------------------------------------------------------
    + |
    + | Elixir provides a clean, fluent API for defining some basic Gulp tasks
    + | for your Laravel application. By default, we are compiling the Less
    + | file for our application, as well as publishing vendor resources.
    + |
    + */
    +
    +elixir.config.assetsPath = 'assets/';
    +
    +elixir(function (mix) {
    +    mix.copy('vendor/bower_components/bootstrap/less', 'assets/less/bootstrap');
    +    mix.copy('vendor/bower_components/bootstrap/fonts', 'public/fonts');
    +    mix.copy('vendor/bower_components/font-awesome/less', 'assets/less/font-awesome');
    +    mix.copy('vendor/bower_components/font-awesome/fonts', 'public/fonts');
    +    mix.less('app.less');
    +    mix.browserify('app.jsx', 'public/js/app.js', 'assets/js');
    +    mix.browserify('events.js', 'public/js/events.js', 'assets/js');
    +    mix.browserify('options.jsx', 'public/js/options.js', 'assets/js');
    +    mix.browserify('devtools.js', 'public/js/devtools.js', 'assets/js');
    +});
    diff --git a/manifest.json b/manifest.json
    index 83cd7fc..04007b7 100644
    --- a/manifest.json
    +++ b/manifest.json
    @@ -1,39 +1,44 @@
    -{
    -  "manifest_version": 2,
    -  "name": "WakaTime",
    -  "version": "1.0.2",
    -  "description": "Automatic time tracking for Chrome.",
    -  "homepage_url": "https://wakatime.com",
    -  "devtools_page": "devtools.html",
    -  "icons": {
    -    "16": "graphics/wakatime-logo-16.png",
    -    "48": "graphics/wakatime-logo-48.png",
    -    "128": "graphics/wakatime-logo-128.png"
    -  },
    -  "permissions": [
    -    "https://api.wakatime.com/*",
    -    "https://wakatime.com/*",
    -    "alarms",
    -    "tabs",
    -    "storage",
    -    "idle"
    -  ],
    -  "background": {
    -    "scripts": [
    -      "public/js/events.js"
    -    ],
    -    "persistent": false
    -  },
    -  "browser_action": {
    -    "default_icon": {
    -      "19": "graphics/wakatime-logo-19.png",
    -      "38": "graphics/wakatime-logo-38.png"
    -    },
    -    "default_title": "WakaTime",
    -    "default_popup": "popup.html"
    -  },
    -  "options_ui": {
    -    "page": "options.html",
    -    "chrome_style": false
    -  }
    -}
    +{
    +  "manifest_version": 2,
    +  "name": "WakaTime",
    +  "version": "1.0.2",
    +  "description": "Automatic time tracking for Chrome.",
    +  "homepage_url": "https://wakatime.com",
    +  "devtools_page": "devtools.html",
    +  "icons": {
    +    "16": "graphics/wakatime-logo-16.png",
    +    "48": "graphics/wakatime-logo-48.png",
    +    "128": "graphics/wakatime-logo-128.png"
    +  },
    +  "permissions": [
    +    "https://api.wakatime.com/*",
    +    "https://wakatime.com/*",
    +    "alarms",
    +    "tabs",
    +    "storage",
    +    "idle"
    +  ],
    +  "background": {
    +    "scripts": [
    +      "public/js/events.js"
    +    ],
    +    "persistent": false
    +  },
    +  "browser_action": {
    +    "default_icon": {
    +      "19": "graphics/wakatime-logo-19.png",
    +      "38": "graphics/wakatime-logo-38.png"
    +    },
    +    "default_title": "WakaTime",
    +    "default_popup": "popup.html"
    +  },
    +  "options_ui": {
    +    "page": "options.html",
    +    "chrome_style": false
    +  },
    +  "applicaitons": {
    +    "gecko": {
    +      "id": "addon@wakatime.com"
    +    }
    +  }
    +}
    diff --git a/options.html b/options.html
    index db1e980..ac239ae 100644
    --- a/options.html
    +++ b/options.html
    @@ -1,17 +1,17 @@
    -
    -
    -
    -    
    -    
    -    
    -    WakaTime options
    -
    -    
    -
    -
    -
    -
    - - - - + + + + + + + WakaTime options + + + + + +
    + + + + diff --git a/package.json b/package.json index 73b3c54..96a72fc 100644 --- a/package.json +++ b/package.json @@ -1,67 +1,67 @@ -{ - "scripts": { - "test": "jest --verbose --coverage && mocha --compilers js:mocha-traceur tests/**/*.spec.js", - "test-react": "jest --verbose --coverage", - "test-js": "node_modules/.bin/phantomjs tests/run.js", - "start": "npm install && bower install && gulp", - "gulp": "gulp", - "watch": "gulp watch", - "lint": "jsxhint --jsx-only .", - "postinstall": "gulp postinstall", - "validate": "npm ls" - }, - "pre-commit": [ - "lint" - ], - "jest": { - "testFileExtensions": [ - "jest.js" - ], - "scriptPreprocessor": "/node_modules/babel-jest", - "testDirectoryName": "tests", - "unmockedModulePathPatterns": [ - "/node_modules/react" - ] - }, - "private": true, - "devDependencies": { - "babel-jest": "^13.0.0", - "bower": "^1.7.9", - "chai": "^3.5.0", - "del": "^2.2.1", - "gulp": "^3.9.1", - "jest-cli": "^13.0.0", - "jshint": "^2.9.2", - "jsxhint": "^0.15.1", - "laravel-elixir": "^5.0.0", - "mocha": "^2.5.3", - "mocha-sinon": "^1.1.5", - "mocha-traceur": "^2.1.0", - "precommit-hook": "^3.0.0", - "sinon": "^1.17.4", - "sinon-chai": "^2.8.0", - "sinon-chrome": "^1.1.2", - "traceur": "^0.0.111" - }, - "dependencies": { - "bootstrap": "^3.3.6", - "classnames": "^2.2.5", - "jquery": "^3.0.0", - "moment": "^2.13.0", - "react": "^15.1.0", - "react-addons-css-transition-group": "^15.1.0", - "react-dom": "^15.1.0" - }, - "jshintConfig": { - "asi": false, - "browser": true, - "curly": false, - "expr": true, - "indent": 4, - "loopfunc": true, - "node": true, - "trailing": true, - "undef": true, - "white": true - } -} +{ + "scripts": { + "test": "jest --verbose --coverage && mocha --compilers js:mocha-traceur tests/**/*.spec.js", + "test-react": "jest --verbose --coverage", + "test-js": "node_modules/.bin/phantomjs tests/run.js", + "start": "npm install && bower install && gulp", + "gulp": "gulp", + "watch": "gulp watch", + "lint": "jsxhint --jsx-only .", + "postinstall": "gulp postinstall", + "validate": "npm ls" + }, + "pre-commit": [ + "lint" + ], + "jest": { + "testFileExtensions": [ + "jest.js" + ], + "scriptPreprocessor": "/node_modules/babel-jest", + "testDirectoryName": "tests", + "unmockedModulePathPatterns": [ + "/node_modules/react" + ] + }, + "private": true, + "devDependencies": { + "babel-jest": "^13.0.0", + "bower": "^1.7.9", + "chai": "^3.5.0", + "del": "^2.2.1", + "gulp": "^3.9.1", + "jest-cli": "^13.0.0", + "jshint": "^2.9.2", + "jsxhint": "^0.15.1", + "laravel-elixir": "^5.0.0", + "mocha": "^2.5.3", + "mocha-sinon": "^1.1.5", + "mocha-traceur": "^2.1.0", + "precommit-hook": "^3.0.0", + "sinon": "^1.17.4", + "sinon-chai": "^2.8.0", + "sinon-chrome": "^1.1.2", + "traceur": "^0.0.111" + }, + "dependencies": { + "bootstrap": "^3.3.6", + "classnames": "^2.2.5", + "jquery": "^3.0.0", + "moment": "^2.13.0", + "react": "^15.1.0", + "react-addons-css-transition-group": "^15.1.0", + "react-dom": "^15.1.0" + }, + "jshintConfig": { + "asi": false, + "browser": true, + "curly": false, + "expr": true, + "indent": 4, + "loopfunc": true, + "node": true, + "trailing": true, + "undef": true, + "white": true + } +} diff --git a/popup.html b/popup.html index 61ddcd7..4c33949 100644 --- a/popup.html +++ b/popup.html @@ -1,17 +1,17 @@ - - - - - - - WakaTime - - - - - -
    - - - - + + + + + + + WakaTime + + + + + +
    + + + + diff --git a/tests/beforeEach.js b/tests/beforeEach.js index 607a9df..0034aaa 100644 --- a/tests/beforeEach.js +++ b/tests/beforeEach.js @@ -1,40 +1,40 @@ -var fs = require('fs'); -var page; -var beforeLoadFn; - -beforeEach(function() { - page = require('webpage').create(); - - page.onConsoleMessage = function(msg) { console.log(msg); }; - - page.onError = function(msg, trace) { - var msgStack = [msg]; - if (trace && trace.length) { - msgStack.push('TRACE:'); - trace.forEach(function(t) { - msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : '')); - }); - } - // we need try..catch here as mocha throws error that catched by phantom.onError - try { - mocha.throwError(msgStack.join('\n')); - } catch(e) { } - }; - - page.onInitialized = function() { - page.injectJs(node_modules + 'chai/chai.js'); - page.injectJs(node_modules + 'sinon/pkg/sinon.js'); - page.injectJs(node_modules + 'sinon-chrome/chrome.js'); - page.injectJs(node_modules + 'sinon-chrome/src/phantom-tweaks.js'); - page.injectJs(node_modules + 'require-stub/index.js'); - // call additional function defined in tests - if (beforeLoadFn) { - beforeLoadFn(); - } - }; -}); - -afterEach(function() { - page.close(); - beforeLoadFn = null; +var fs = require('fs'); +var page; +var beforeLoadFn; + +beforeEach(function() { + page = require('webpage').create(); + + page.onConsoleMessage = function(msg) { console.log(msg); }; + + page.onError = function(msg, trace) { + var msgStack = [msg]; + if (trace && trace.length) { + msgStack.push('TRACE:'); + trace.forEach(function(t) { + msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : '')); + }); + } + // we need try..catch here as mocha throws error that catched by phantom.onError + try { + mocha.throwError(msgStack.join('\n')); + } catch(e) { } + }; + + page.onInitialized = function() { + page.injectJs(node_modules + 'chai/chai.js'); + page.injectJs(node_modules + 'sinon/pkg/sinon.js'); + page.injectJs(node_modules + 'sinon-chrome/chrome.js'); + page.injectJs(node_modules + 'sinon-chrome/src/phantom-tweaks.js'); + page.injectJs(node_modules + 'require-stub/index.js'); + // call additional function defined in tests + if (beforeLoadFn) { + beforeLoadFn(); + } + }; +}); + +afterEach(function() { + page.close(); + beforeLoadFn = null; }); \ No newline at end of file diff --git a/tests/components/Alert.react.jest.js b/tests/components/Alert.react.jest.js index 4b10f27..3617f3d 100644 --- a/tests/components/Alert.react.jest.js +++ b/tests/components/Alert.react.jest.js @@ -1,17 +1,17 @@ -jest.dontMock('../../assets/js/components/Alert.jsx'); - -describe('Alert', function() { - var React, Alert, TestUtils, Component; - - beforeEach(function() { - // Setup our tools - React = require('react/addons'); - Alert = require('../../assets/js/components/Alert.jsx'); - TestUtils = React.addons.TestUtils; - // Create the React component here using TestUtils and store into Component - }); - - it('should work', function() { - expect(2 + 2).toEqual(4); - }); +jest.dontMock('../../assets/js/components/Alert.jsx'); + +describe('Alert', function() { + var React, Alert, TestUtils, Component; + + beforeEach(function() { + // Setup our tools + React = require('react/addons'); + Alert = require('../../assets/js/components/Alert.jsx'); + TestUtils = React.addons.TestUtils; + // Create the React component here using TestUtils and store into Component + }); + + it('should work', function() { + expect(2 + 2).toEqual(4); + }); }); \ No newline at end of file diff --git a/tests/components/MainList.react.jest.js b/tests/components/MainList.react.jest.js index 58182c7..37bcc3b 100644 --- a/tests/components/MainList.react.jest.js +++ b/tests/components/MainList.react.jest.js @@ -1,17 +1,17 @@ -jest.dontMock('../../assets/js/components/MainList.jsx'); - -describe('MainList', function() { - var React, MainList, TestUtils, Component; - - beforeEach(function() { - // Setup our tools - React = require('react/addons'); - MainList = require('../../assets/js/components/MainList.jsx'); - TestUtils = React.addons.TestUtils; - // Create the React component here using TestUtils and store into Component - }); - - it('should work', function() { - expect(2 + 2).toEqual(4); - }); +jest.dontMock('../../assets/js/components/MainList.jsx'); + +describe('MainList', function() { + var React, MainList, TestUtils, Component; + + beforeEach(function() { + // Setup our tools + React = require('react/addons'); + MainList = require('../../assets/js/components/MainList.jsx'); + TestUtils = React.addons.TestUtils; + // Create the React component here using TestUtils and store into Component + }); + + it('should work', function() { + expect(2 + 2).toEqual(4); + }); }); \ No newline at end of file diff --git a/tests/components/Navbar.react.jest.js b/tests/components/Navbar.react.jest.js index 7cd637c..6feefcb 100644 --- a/tests/components/Navbar.react.jest.js +++ b/tests/components/Navbar.react.jest.js @@ -1,17 +1,17 @@ -jest.dontMock('../../assets/js/components/Navbar.jsx'); - -describe('Navbar', function() { - var React, Navbar, TestUtils, Component; - - beforeEach(function() { - // Setup our tools - React = require('react/addons'); - Navbar = require('../../assets/js/components/Navbar.jsx'); - TestUtils = React.addons.TestUtils; - // Create the React component here using TestUtils and store into Component - }); - - it('should work', function() { - expect(2 + 2).toEqual(4); - }); +jest.dontMock('../../assets/js/components/Navbar.jsx'); + +describe('Navbar', function() { + var React, Navbar, TestUtils, Component; + + beforeEach(function() { + // Setup our tools + React = require('react/addons'); + Navbar = require('../../assets/js/components/Navbar.jsx'); + TestUtils = React.addons.TestUtils; + // Create the React component here using TestUtils and store into Component + }); + + it('should work', function() { + expect(2 + 2).toEqual(4); + }); }); \ No newline at end of file diff --git a/tests/components/Options.react.jest.js b/tests/components/Options.react.jest.js index a022d0a..b9402ea 100644 --- a/tests/components/Options.react.jest.js +++ b/tests/components/Options.react.jest.js @@ -1,17 +1,17 @@ -jest.dontMock('../../assets/js/components/Options.jsx'); - -describe('Options', function() { - var React, Options, TestUtils, Component; - - beforeEach(function() { - // Setup our tools - React = require('react/addons'); - Options = require('../../assets/js/components/Options.jsx'); - TestUtils = React.addons.TestUtils; - // Create the React component here using TestUtils and store into Component - }); - - it('should work', function() { - expect(2 + 2).toEqual(4); - }); +jest.dontMock('../../assets/js/components/Options.jsx'); + +describe('Options', function() { + var React, Options, TestUtils, Component; + + beforeEach(function() { + // Setup our tools + React = require('react/addons'); + Options = require('../../assets/js/components/Options.jsx'); + TestUtils = React.addons.TestUtils; + // Create the React component here using TestUtils and store into Component + }); + + it('should work', function() { + expect(2 + 2).toEqual(4); + }); }); \ No newline at end of file diff --git a/tests/components/SitesList.react.jest.js b/tests/components/SitesList.react.jest.js index 6fabced..b7c94be 100644 --- a/tests/components/SitesList.react.jest.js +++ b/tests/components/SitesList.react.jest.js @@ -1,17 +1,17 @@ -jest.dontMock('../../assets/js/components/SitesList.jsx'); - -describe('SitesList', function() { - var React, SitesList, TestUtils, Component; - - beforeEach(function() { - // Setup our tools - React = require('react/addons'); - SitesList = require('../../assets/js/components/SitesList.jsx'); - TestUtils = React.addons.TestUtils; - // Create the React component here using TestUtils and store into Component - }); - - it('should work', function() { - expect(2 + 2).toEqual(4); - }); +jest.dontMock('../../assets/js/components/SitesList.jsx'); + +describe('SitesList', function() { + var React, SitesList, TestUtils, Component; + + beforeEach(function() { + // Setup our tools + React = require('react/addons'); + SitesList = require('../../assets/js/components/SitesList.jsx'); + TestUtils = React.addons.TestUtils; + // Create the React component here using TestUtils and store into Component + }); + + it('should work', function() { + expect(2 + 2).toEqual(4); + }); }); \ No newline at end of file diff --git a/tests/components/Wakatime.react.jest.js b/tests/components/Wakatime.react.jest.js index 9640be2..b10bb9a 100644 --- a/tests/components/Wakatime.react.jest.js +++ b/tests/components/Wakatime.react.jest.js @@ -1,17 +1,17 @@ -jest.dontMock('../../assets/js/components/Wakatime.jsx'); - -describe('Wakatime', function() { - var React, Wakatime, TestUtils, Component; - - beforeEach(function() { - // Setup our tools - React = require('react/addons'); - Wakatime = require('../../assets/js/components/Wakatime.jsx'); - TestUtils = React.addons.TestUtils; - // Create the React component here using TestUtils and store into Component - }); - - it('should work', function() { - expect(2 + 2).toEqual(4); - }); +jest.dontMock('../../assets/js/components/Wakatime.jsx'); + +describe('Wakatime', function() { + var React, Wakatime, TestUtils, Component; + + beforeEach(function() { + // Setup our tools + React = require('react/addons'); + Wakatime = require('../../assets/js/components/Wakatime.jsx'); + TestUtils = React.addons.TestUtils; + // Create the React component here using TestUtils and store into Component + }); + + it('should work', function() { + expect(2 + 2).toEqual(4); + }); }); \ No newline at end of file diff --git a/tests/empty.html b/tests/empty.html index ed12e53..74b1819 100644 --- a/tests/empty.html +++ b/tests/empty.html @@ -1,10 +1,10 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/tests/helpers/Chrome.spec.js b/tests/helpers/Chrome.spec.js index 336b204..3e5de3e 100644 --- a/tests/helpers/Chrome.spec.js +++ b/tests/helpers/Chrome.spec.js @@ -1,11 +1,11 @@ -var chai = require('chai'); -var sinon = require('sinon'); -var chrome = require('sinon-chrome'); -var expect = chai.expect; - -describe('Chrome Dev Tools', function() { - it('should work', function() { - chrome.browserAction.setTitle({title: 'hello'}); - sinon.assert.calledOnce(chrome.browserAction.setTitle); - }); -}); +var chai = require('chai'); +var sinon = require('sinon'); +var chrome = require('sinon-chrome'); +var expect = chai.expect; + +describe('Chrome Dev Tools', function() { + it('should work', function() { + chrome.browserAction.setTitle({title: 'hello'}); + sinon.assert.calledOnce(chrome.browserAction.setTitle); + }); +}); diff --git a/tests/helpers/changeExtensionIcon.spec.js b/tests/helpers/changeExtensionIcon.spec.js index 98c70be..414320e 100644 --- a/tests/helpers/changeExtensionIcon.spec.js +++ b/tests/helpers/changeExtensionIcon.spec.js @@ -1,10 +1,10 @@ -var chai = require('chai'); -var expect = chai.expect; - -import changeExtensionIcon from '../../assets/js/helpers/changeExtensionIcon'; - -describe('changeExtensionIcon', function() { - it('should be a function', function() { - expect(changeExtensionIcon).to.be.a('function'); - }); +var chai = require('chai'); +var expect = chai.expect; + +import changeExtensionIcon from '../../assets/js/helpers/changeExtensionIcon'; + +describe('changeExtensionIcon', function() { + it('should be a function', function() { + expect(changeExtensionIcon).to.be.a('function'); + }); }); \ No newline at end of file diff --git a/tests/helpers/changeExtensionState.spec.js b/tests/helpers/changeExtensionState.spec.js index 708e661..050dcd8 100644 --- a/tests/helpers/changeExtensionState.spec.js +++ b/tests/helpers/changeExtensionState.spec.js @@ -1,10 +1,10 @@ -var chai = require('chai'); -var expect = chai.expect; - -import changeExtensionState from '../../assets/js/helpers/changeExtensionState'; - -describe('changeExtensionState', function() { - it('should be a function', function() { - expect(changeExtensionState).to.be.a('function'); - }); +var chai = require('chai'); +var expect = chai.expect; + +import changeExtensionState from '../../assets/js/helpers/changeExtensionState'; + +describe('changeExtensionState', function() { + it('should be a function', function() { + expect(changeExtensionState).to.be.a('function'); + }); }); \ No newline at end of file diff --git a/tests/helpers/changeExtensionTooltip.spec.js b/tests/helpers/changeExtensionTooltip.spec.js index c1d53e9..d47a10a 100644 --- a/tests/helpers/changeExtensionTooltip.spec.js +++ b/tests/helpers/changeExtensionTooltip.spec.js @@ -1,18 +1,18 @@ -var chai = require('chai'); -var sinon = require('sinon-chai'); -var chrome = require('sinon-chrome'); -var expect = chai.expect; - -import changeExtensionTooltip from '../../assets/js/helpers/changeExtensionTooltip'; - -describe('changeExtensionTooltip', function() { - it('should be a function', function() { - expect(changeExtensionTooltip).to.be.a('function'); - }); - - // it('should change the extension tooltip', function() { - // changeExtensionTooltip('WakaTime'); - // expect(chrome.browserAction.setTitle).toHaveBeenCalledWith({title: 'Wakatime'}); - // sinon.assert.calledWithMatch(chrome.browserAction.setTitle, {title: 'WakaTime'}); - // }); -}); +var chai = require('chai'); +var sinon = require('sinon-chai'); +var chrome = require('sinon-chrome'); +var expect = chai.expect; + +import changeExtensionTooltip from '../../assets/js/helpers/changeExtensionTooltip'; + +describe('changeExtensionTooltip', function() { + it('should be a function', function() { + expect(changeExtensionTooltip).to.be.a('function'); + }); + + // it('should change the extension tooltip', function() { + // changeExtensionTooltip('WakaTime'); + // expect(chrome.browserAction.setTitle).toHaveBeenCalledWith({title: 'Wakatime'}); + // sinon.assert.calledWithMatch(chrome.browserAction.setTitle, {title: 'WakaTime'}); + // }); +}); diff --git a/tests/helpers/contains.spec.js b/tests/helpers/contains.spec.js index c3798e8..f7da909 100644 --- a/tests/helpers/contains.spec.js +++ b/tests/helpers/contains.spec.js @@ -1,26 +1,26 @@ -var chai = require('chai'); -var expect = chai.expect; - -import contains from '../../assets/js/helpers/contains'; - -describe('contains', function() { - it('should be a function', function() { - expect(contains).to.be.a('function'); - }); - - it('should match url against blacklist and return true', function() { - - var list = "localhost\ntest.com"; - - var url = 'http://localhost/fooapp'; - expect(contains(url, list)).to.equal(true); - }); - - it('should not match url against blacklist and return false', function() { - - var list = "localhost2\ntest.com"; - - var url = 'http://localhost/fooapp'; - expect(contains(url, list)).to.equal(false); - }); -}); +var chai = require('chai'); +var expect = chai.expect; + +import contains from '../../assets/js/helpers/contains'; + +describe('contains', function() { + it('should be a function', function() { + expect(contains).to.be.a('function'); + }); + + it('should match url against blacklist and return true', function() { + + var list = "localhost\ntest.com"; + + var url = 'http://localhost/fooapp'; + expect(contains(url, list)).to.equal(true); + }); + + it('should not match url against blacklist and return false', function() { + + var list = "localhost2\ntest.com"; + + var url = 'http://localhost/fooapp'; + expect(contains(url, list)).to.equal(false); + }); +}); diff --git a/tests/helpers/getDomainFromUrl.spec.js b/tests/helpers/getDomainFromUrl.spec.js index a0418bc..a96de1f 100644 --- a/tests/helpers/getDomainFromUrl.spec.js +++ b/tests/helpers/getDomainFromUrl.spec.js @@ -1,19 +1,19 @@ -var chai = require('chai'); -var expect = chai.expect; - -import getDomainFromUrl from '../../assets/js/helpers/getDomainFromUrl'; - -describe('getDomainFromUrl', function() { - it('should be a function', function() { - expect(getDomainFromUrl).to.be.a('function'); - }); - - it('should return the domain', function() { - expect(getDomainFromUrl('http://google.com/something/very/secret')).to.equal('http://google.com'); - - expect(getDomainFromUrl('http://www.google.com/something/very/secret')).to.equal('http://www.google.com'); - - // This is not how it was imaged to work, but let's leave it here as a warning. - expect(getDomainFromUrl('google.com/something/very/secret')).to.equal('google.com//very'); - }); +var chai = require('chai'); +var expect = chai.expect; + +import getDomainFromUrl from '../../assets/js/helpers/getDomainFromUrl'; + +describe('getDomainFromUrl', function() { + it('should be a function', function() { + expect(getDomainFromUrl).to.be.a('function'); + }); + + it('should return the domain', function() { + expect(getDomainFromUrl('http://google.com/something/very/secret')).to.equal('http://google.com'); + + expect(getDomainFromUrl('http://www.google.com/something/very/secret')).to.equal('http://www.google.com'); + + // This is not how it was imaged to work, but let's leave it here as a warning. + expect(getDomainFromUrl('google.com/something/very/secret')).to.equal('google.com//very'); + }); }); \ No newline at end of file diff --git a/tests/helpers/in_array.spec.js b/tests/helpers/in_array.spec.js index 450ca3c..0eda2a3 100644 --- a/tests/helpers/in_array.spec.js +++ b/tests/helpers/in_array.spec.js @@ -1,18 +1,18 @@ -var chai = require('chai'); -var expect = chai.expect; - -import in_array from '../../assets/js/helpers/in_array'; - -describe('in_array', function() { - it('should be a function', function() { - expect(in_array).to.be.a('function'); - }); - - it('should find the needle and return true', function() { - expect(in_array('4', ['4', '3', '2', '1'])).to.equal(true); - }); - - it('should not find the needle and it should return false', function() { - expect(in_array('5', ['4', '3', '2', '1'])).to.equal(false); - }); +var chai = require('chai'); +var expect = chai.expect; + +import in_array from '../../assets/js/helpers/in_array'; + +describe('in_array', function() { + it('should be a function', function() { + expect(in_array).to.be.a('function'); + }); + + it('should find the needle and return true', function() { + expect(in_array('4', ['4', '3', '2', '1'])).to.equal(true); + }); + + it('should not find the needle and it should return false', function() { + expect(in_array('5', ['4', '3', '2', '1'])).to.equal(false); + }); }); \ No newline at end of file diff --git a/tests/run.js b/tests/run.js index df69fb1..10c3c20 100644 --- a/tests/run.js +++ b/tests/run.js @@ -1,24 +1,24 @@ -/** - * Test Runner for Mocha tests - * Using phantomjs to render page and execute scripts - */ - -var node_modules = '../node_modules/'; -phantom.injectJs(node_modules + 'mocha/mocha.js'); -phantom.injectJs(node_modules + 'sinon-chrome/src/phantom-tweaks.js'); -mocha.setup({ui: 'bdd', reporter: 'spec'}); - -// Setup -phantom.injectJs('beforeeach.js'); - -// Tests -phantom.injectJs('helpers/changeExtensionTooltip.spec.js'); - -// Execute -mocha.run(function(failures) { - // setTimeout is needed to supress "Unsafe JavaScript attempt to access..." - // see https://github.com/ariya/phantomjs/issues/12697 - setTimeout(function() { - phantom.exit(failures); - }, 0); +/** + * Test Runner for Mocha tests + * Using phantomjs to render page and execute scripts + */ + +var node_modules = '../node_modules/'; +phantom.injectJs(node_modules + 'mocha/mocha.js'); +phantom.injectJs(node_modules + 'sinon-chrome/src/phantom-tweaks.js'); +mocha.setup({ui: 'bdd', reporter: 'spec'}); + +// Setup +phantom.injectJs('beforeeach.js'); + +// Tests +phantom.injectJs('helpers/changeExtensionTooltip.spec.js'); + +// Execute +mocha.run(function(failures) { + // setTimeout is needed to supress "Unsafe JavaScript attempt to access..." + // see https://github.com/ariya/phantomjs/issues/12697 + setTimeout(function() { + phantom.exit(failures); + }, 0); }); \ No newline at end of file