diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..7d5b6a20 --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "exodus4d/pathfinder", + "description": "Mapping tool for EVE ONLINE", + "minimum-stability": "stable", + "license": "MIT", + "authors": [ + { + "name": "Mark Friedrich", + "email": "pathfinder@exodus4d.de" + } + ], + "autoload": { + "psr-4": { + "Exodus4D\\Pathfinder\\": "app/main" + } + }, + "require": { + "php-64bit": ">=7.0", + "ext-zmq": "1.1.*", + "react/zmq": "0.3.*" + } +} \ No newline at end of file diff --git a/js/app.js b/js/app.js index 7311009d..063467b8 100644 --- a/js/app.js +++ b/js/app.js @@ -26,8 +26,8 @@ requirejs.config({ text: 'lib/requirejs/text', // v2.0.12 A RequireJS/AMD loader plugin for loading text resources. mustache: 'lib/mustache.min', // v1.0.0 Javascript template engine - http://mustache.github.io localForage: 'lib/localforage.min', // v1.4.2 localStorage library - https://mozilla.github.io/localForage - velocity: 'lib/velocity.min', // v1.2.2 animation engine - http://julian.com/research/velocity - velocityUI: 'lib/velocity.ui.min', // v5.0.4 plugin for velocity - http://julian.com/research/velocity/#uiPack + velocity: 'lib/velocity.min', // v1.4.1 animation engine - http://julian.com/research/velocity + velocityUI: 'lib/velocity.ui.min', // v5.2.0 plugin for velocity - http://julian.com/research/velocity/#uiPack slidebars: 'lib/slidebars', // v0.10 Slidebars - side menu plugin http://plugins.adchsm.me/slidebars jsPlumb: 'lib/dom.jsPlumb-1.7.6', // v1.7.6 jsPlumb (Vanilla)- main map draw plugin https://jsplumbtoolkit.com farahey: 'lib/farahey-0.5', // v0.5 jsPlumb "magnetizing" extension - https://github.com/jsplumb/farahey diff --git a/js/app/counter.js b/js/app/counter.js index 6bfc90bc..040a0e02 100644 --- a/js/app/counter.js +++ b/js/app/counter.js @@ -5,7 +5,7 @@ define([ ], function($, Init, Util) { 'use strict'; - var config = { + let config = { counterDigitSmallClass: 'pf-digit-counter-small', counterDigitLargeClass: 'pf-digit-counter-large' }; @@ -15,13 +15,13 @@ define([ * @param element * @param tempDate */ - var updateDateDiff = function(element, tempDate){ - var diff = Util.getTimeDiffParts(tempDate, new Date()); - var days = diff.days; - var hrs = diff.hours; - var min = diff.min; - var leftSec = diff.sec; - var value = []; + let updateDateDiff = function(element, tempDate){ + let diff = Util.getTimeDiffParts(tempDate, new Date()); + let days = diff.days; + let hrs = diff.hours; + let min = diff.min; + let leftSec = diff.sec; + let value = []; if( days > 0 || @@ -58,19 +58,22 @@ define([ */ $.fn.initTimestampCounter = function(){ return this.each(function(){ - var element = $(this); - var timestamp = parseInt( element.text() ); + let element = $(this); + let timestamp = parseInt( element.text() ); // do not init twice if(timestamp > 0){ // mark as init element.attr('data-counter', 'init'); - var date = new Date( timestamp * 1000); + let date = new Date( timestamp * 1000); updateDateDiff(element, date); - var refreshIntervalId = window.setInterval(function(){ + // show element (if invisible) after first update + element.css({'visibility': 'initial'}); + + let refreshIntervalId = window.setInterval(function(){ // update element with current time if( !element.hasClass('stopCounter')){ diff --git a/js/app/init.js b/js/app/init.js index e99e6573..e067560d 100644 --- a/js/app/init.js +++ b/js/app/init.js @@ -6,7 +6,7 @@ define(['jquery'], function($) { 'use strict'; - var Config = { + let Config = { path: { img: 'public/img/', // path for images // user API @@ -22,6 +22,7 @@ define(['jquery'], function($) { searchAccess: 'api/access/search', // ajax URL - search user/corporation/ally by name // main config/map ping API initMap: 'api/map/init', // ajax URL - get static data + getAccessData: 'api/map/getAccessData', // ajax URL - get map access tokens (WebSocket) updateMapData: 'api/map/updateData', // ajax URL - main map update trigger updateUserData: 'api/map/updateUserData', // ajax URL - main map user data trigger // map API @@ -63,11 +64,35 @@ define(['jquery'], function($) { splashOverlay: 300, // "splash" loading overlay headerLink: 100, // links in head bar mapOverlay: 200, // show/hide duration for map overlays - mapMoveSystem: 300, // system position has changed animation + mapMoveSystem: 180, // system position has changed animation mapDeleteSystem: 200, // remove system from map mapModule: 200, // show/hide of an map module dialogEvents: 180 // dialog events /slide/show/... }, + syncStatus: { + type: 'ajax', + webSocket: { + status: 'closed', + class: 'txt-color-danger', + timestamp: undefined + }, + sharedWorker: { + status: 'offline', // SharedWorker status + class: 'txt-color-danger', + timestamp: undefined + }, + ajax: { + status: 'enabled', + class: 'txt-color-success', + timestamp: undefined + } + }, + performanceLogging: { + keyServerMapData: 'UPDATE_SERVER_MAP', // ajax request update map data + keyClientMapData: 'UPDATE_CLIENT_MAP', // update client map data + keyServerUserData: 'UPDATE_SERVER_USER_DATA', // ajax request update map user data + keyClientUserData: 'UPDATE_CLIENT_USER_DATA', // update client map user data + }, mapIcons: [ // map tab-icons { class: 'fa-desktop', diff --git a/js/app/logging.js b/js/app/logging.js index 252f668f..61f62e94 100644 --- a/js/app/logging.js +++ b/js/app/logging.js @@ -11,288 +11,312 @@ define([ 'use strict'; - var logData = []; // cache object for all log entries - var logDataTable = null; // "Datatables" Object + let logData = []; // cache object for all log entries + let logDataTable = null; // "Datatables" Object // Morris charts data - var maxGraphDataCount = 30; // max date entries for a graph - var chartData = {}; // chart Data object for all Morris Log graphs + let maxGraphDataCount = 30; // max date entries for a graph + let chartData = {}; // chart Data object for all Morris Log graphs - var config = { - dialogDynamicAreaClass: 'pf-dynamic-area', // class for dynamic areas - logGraphClass: 'pf-log-graph', // class for all log Morris graphs - tableToolsClass: 'pf-table-tools' // class for table tools + let config = { + taskDialogId: 'pf-task-dialog', // id for map "task manager" dialog + dialogDynamicAreaClass: 'pf-dynamic-area', // class for dynamic areas + timestampCounterClass: 'pf-timestamp-counter', // class for "timestamp" counter + taskDialogStatusAreaClass: 'pf-task-dialog-status', // class for "status" dynamic area + taskDialogLogTableAreaClass: 'pf-task-dialog-table', // class for "log table" dynamic area + logGraphClass: 'pf-log-graph', // class for all log Morris graphs + tableToolsClass: 'pf-table-tools' // class for table tools }; /** * get log time string * @returns {string} */ - var getLogTime = function(){ - - var serverTime = Util.getServerTime(); - - var logTime = serverTime.toLocaleTimeString('en-US', { hour12: false }); + let getLogTime = function(){ + let serverTime = Util.getServerTime(); + let logTime = serverTime.toLocaleTimeString('en-US', { hour12: false }); return logTime; }; + /** + * updated "sync status" dynamic dialog area + */ + let updateSyncStatus = function(){ + + // check if task manager dialog is open + let logDialog = $('#' + config.taskDialogId); + if(logDialog.length){ + // dialog is open + requirejs(['text!templates/modules/sync_status.html', 'mustache'], function(templateSyncStatus, Mustache) { + let data = { + timestampCounterClass: config.timestampCounterClass, + syncStatus: Init.syncStatus, + isWebSocket: () => { + return (Util.getSyncType() === 'webSocket'); + }, + isAjax: () => { + return (Util.getSyncType() === 'ajax'); + } + }; + + let syncStatusElement = $( Mustache.render(templateSyncStatus, data ) ); + + logDialog.find('.' + config.taskDialogStatusAreaClass).html( syncStatusElement ); + + logDialog.find('.' + config.timestampCounterClass).initTimestampCounter(); + + syncStatusElement.initTooltips({ + placement: 'right' + }); + }); + } + + }; + /** * shows the logging dialog */ - var showDialog = function(){ - + let showDialog = function(){ // dialog content - var content = $('
'); - - // content row for log graphs - var rowElementGraphs = $('
', { - class: 'row' - }); - - content.append(rowElementGraphs); - - - - var tableHeadline = $('

', { - text: ' Processes' - }).prepend( $('', { - class: ['fa', 'fa-fw', 'fa-lg', 'fa-microchip'].join(' ') - })); - - // add content Structure to dome before table initialization - content.append(tableHeadline); - - // log table area -------------------------------------------------- - var logTableArea = $('
', { - class: config.dialogDynamicAreaClass - }); - - var logTableActionBar = $('
', { - class: config.tableToolsClass - }); - logTableArea.append(logTableActionBar); - - var logTable = $('', { - class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') - }); - logTableArea.append(logTable); - - content.append(logTableArea); - - // init log table - logDataTable = logTable.DataTable({ - paging: true, - ordering: true, - order: [ 1, 'desc' ], - autoWidth: false, - hover: false, - pageLength: 15, - lengthMenu: [[10, 15, 25, 50, 50], [10, 15, 25, 50, 50]], - data: logData, // load cached logs (if available) - language: { - emptyTable: 'No entries', - zeroRecords: 'No entries found', - lengthMenu: 'Show _MENU_ entries', - info: 'Showing _START_ to _END_ of _TOTAL_ entries' - }, - columnDefs: [ - { - targets: 0, - title: '', - width: '18px', - searchable: false, - class: ['text-center'].join(' '), - data: 'status' - },{ - targets: 1, - title: '  ', - width: '50px', - searchable: true, - class: 'text-right', - data: 'time' - },{ - targets: 2, - title: '  ', - width: '35px', - searchable: false, - class: 'text-right', - sType: 'html', - data: 'duration' - },{ - targets: 3, - title: 'description', - searchable: true, - data: 'description' - },{ - targets: 4, - title: 'type', - width: '40px', - searchable: true, - class: ['text-center'].join(' '), - data: 'type' - },{ - targets: 5, - title: 'Prozess-ID   ', - width: '80px', - searchable: false, - class: 'text-right', - data: 'key' - } - ] - - }); - - // open dialog - var logDialog = bootbox.dialog({ - title: 'Task-Manager', - message: content, - size: 'large', - buttons: { - close: { - label: 'close', - className: 'btn-default' - } - } - }); - - // modal dialog is shown - logDialog.on('shown.bs.modal', function(e) { - - // show Morris graphs ---------------------------------------------------------- - - // function for chart label formation - var labelYFormat = function(y){ - return Math.round(y) + 'ms'; + requirejs(['text!templates/dialog/task_manager.html', 'mustache'], function(templateTaskManagerDialog, Mustache) { + let data = { + id: config.taskDialogId, + dialogDynamicAreaClass: config.dialogDynamicAreaClass, + taskDialogStatusAreaClass: config.taskDialogStatusAreaClass, + taskDialogLogTableAreaClass: config.taskDialogLogTableAreaClass, + tableActionBarClass: config.tableToolsClass }; - for(var key in chartData) { - if(chartData.hasOwnProperty(key)) { - // create a chart for each key + let contentTaskManager = $( Mustache.render(templateTaskManagerDialog, data) ); - var colElementGraph = $('
', { - class: ['col-md-6'].join(' ') - }); + let rowElementGraphs = contentTaskManager.find('.row'); + let taskDialogLogTableAreaElement = contentTaskManager.find('.' + config.taskDialogLogTableAreaClass); + let logTable = $('
', { + class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') + }); - // graph element - var graphElement = $('
', { - class: config.logGraphClass - }); + taskDialogLogTableAreaElement.append(logTable); - var graphArea = $('
', { - class: config.dialogDynamicAreaClass - }).append( graphElement ); - - // headline - var headline = $('

', { - text: key - }).prepend( - $('', { - class: ['txt-color', 'txt-color-grayLight'].join(' '), - text: 'Prozess-ID: ' - }) - ); - - // show update ping between function calls - var updateElement = $('', { - class: ['txt-color', 'txt-color-blue', 'pull-right'].join(' ') - }); - headline.append(updateElement).append('
'); - - // show average execution time - var averageElement = $('', { - class: 'pull-right' - }); - headline.append(averageElement); - - colElementGraph.append( headline ); - colElementGraph.append( graphArea ); - - graphArea.showLoadingAnimation(); - - rowElementGraphs.append( colElementGraph ); - - // cache DOM Elements that will be updated frequently - chartData[key].averageElement = averageElement; - chartData[key].updateElement = updateElement; - - chartData[key].graph = Morris.Area({ - element: graphElement, - data: [], - xkey: 'x', - ykeys: ['y'], - labels: [key], - units: 'ms', - parseTime: false, - ymin: 0, - yLabelFormat: labelYFormat, - padding: 10, - hideHover: true, - pointSize: 3, - lineColors: ['#375959'], - pointFillColors: ['#477372'], - pointStrokeColors: ['#313335'], - lineWidth: 2, - grid: false, - gridStrokeWidth: 0.3, - gridTextSize: 9, - gridTextFamily: 'Oxygen Bold', - gridTextColor: '#63676a', - behaveLikeLine: true, - goals: [], - goalLineColors: ['#66c84f'], - smooth: false, - fillOpacity: 0.3, - resize: true - }); - - graphArea.hideLoadingAnimation(); - - } - } - - // ------------------------------------------------------------------------------ - // add dataTable buttons (extension) - - var buttons = new $.fn.dataTable.Buttons( logDataTable, { - buttons: [ + // init log table + logDataTable = logTable.DataTable({ + paging: true, + ordering: true, + order: [ 1, 'desc' ], + autoWidth: false, + hover: false, + pageLength: 10, + lengthMenu: [[5, 10, 25, 50, 100, -1], [5, 10, 25, 50, 100, 'All']], + data: logData, // load cached logs (if available) + language: { + emptyTable: 'No entries', + zeroRecords: 'No entries found', + lengthMenu: 'Show _MENU_ entries', + info: 'Showing _START_ to _END_ of _TOTAL_ entries' + }, + columnDefs: [ { - extend: 'copy', - className: 'btn btn-sm btn-default', - text: ' copy' + targets: 0, + title: '', + width: '18px', + searchable: false, + class: ['text-center'].join(' '), + data: 'status' },{ - extend: 'csv', - className: 'btn btn-sm btn-default', - text: ' csv' + targets: 1, + title: '  ', + width: '50px', + searchable: true, + class: 'text-right', + data: 'time' + },{ + targets: 2, + title: '  ', + width: '35px', + searchable: false, + class: 'text-right', + sType: 'html', + data: 'duration' + },{ + targets: 3, + title: 'description', + searchable: true, + data: 'description' + },{ + targets: 4, + title: 'type', + width: '40px', + searchable: true, + class: ['text-center'].join(' '), + data: 'type' + },{ + targets: 5, + title: 'Prozess-ID   ', + width: '80px', + searchable: false, + class: 'text-right', + data: 'key' } ] - } ); - logDataTable.buttons().container().appendTo( $(this).find('.' + config.tableToolsClass)); - }); + }); - - // modal dialog is closed - logDialog.on('hidden.bs.modal', function(e) { - // clear memory -> destroy all charts - for (var key in chartData) { - if (chartData.hasOwnProperty(key)) { - chartData[key].graph = null; + // open dialog + let logDialog = bootbox.dialog({ + title: 'Task-Manager', + message: contentTaskManager, + size: 'large', + buttons: { + close: { + label: 'close', + className: 'btn-default' + } } - } - }); + }); - // modal dialog before hide - logDialog.on('hide.bs.modal', function(e) { + // modal dialog is shown + logDialog.on('shown.bs.modal', function(e) { + updateSyncStatus(); - // destroy logTable - logDataTable.destroy(true); - logDataTable= null; + // show Morris graphs ---------------------------------------------------------- + + // function for chart label formation + let labelYFormat = function(y){ + return Math.round(y) + 'ms'; + }; + + for(let key in chartData) { + if(chartData.hasOwnProperty(key)) { + // create a chart for each key + + let colElementGraph = $('
', { + class: ['col-md-6'].join(' ') + }); + + + // graph element + let graphElement = $('
', { + class: config.logGraphClass + }); + + let graphArea = $('
', { + class: config.dialogDynamicAreaClass + }).append( graphElement ); + + // headline + let headline = $('

', { + text: key + }).prepend( + $('', { + class: ['txt-color', 'txt-color-grayLight'].join(' '), + text: 'Prozess-ID: ' + }) + ); + + // show update ping between function calls + let updateElement = $('', { + class: ['txt-color', 'txt-color-blue', 'pull-right'].join(' ') + }); + headline.append(updateElement).append('
'); + + // show average execution time + let averageElement = $('', { + class: 'pull-right' + }); + headline.append(averageElement); + + colElementGraph.append( headline ); + colElementGraph.append( graphArea ); + + graphArea.showLoadingAnimation(); + + rowElementGraphs.append( colElementGraph ); + + // cache DOM Elements that will be updated frequently + chartData[key].averageElement = averageElement; + chartData[key].updateElement = updateElement; + + chartData[key].graph = Morris.Area({ + element: graphElement, + data: [], + xkey: 'x', + ykeys: ['y'], + labels: [key], + units: 'ms', + parseTime: false, + ymin: 0, + yLabelFormat: labelYFormat, + padding: 10, + hideHover: true, + pointSize: 3, + lineColors: ['#375959'], + pointFillColors: ['#477372'], + pointStrokeColors: ['#313335'], + lineWidth: 2, + grid: false, + gridStrokeWidth: 0.3, + gridTextSize: 9, + gridTextFamily: 'Oxygen Bold', + gridTextColor: '#63676a', + behaveLikeLine: true, + goals: [], + goalLineColors: ['#66c84f'], + smooth: false, + fillOpacity: 0.3, + resize: true + }); + + updateLogGraph(key); + + graphArea.hideLoadingAnimation(); + + } + } + + // ------------------------------------------------------------------------------ + // add dataTable buttons (extension) + + let buttons = new $.fn.dataTable.Buttons( logDataTable, { + buttons: [ + { + extend: 'copy', + className: 'btn btn-sm btn-default', + text: ' copy' + },{ + extend: 'csv', + className: 'btn btn-sm btn-default', + text: ' csv' + } + ] + } ); + + logDataTable.buttons().container().appendTo( $(this).find('.' + config.tableToolsClass)); + }); + + + // modal dialog is closed + logDialog.on('hidden.bs.modal', function(e) { + // clear memory -> destroy all charts + for (let key in chartData) { + if (chartData.hasOwnProperty(key)) { + chartData[key].graph = null; + } + } + }); + + // modal dialog before hide + logDialog.on('hide.bs.modal', function(e) { + + // destroy logTable + logDataTable.destroy(true); + logDataTable= null; + + // remove event -> prevent calling this multiple times + $(this).off('hide.bs.modal'); + }); - // remove event -> prevent calling this multiple times - $(this).off('hide.bs.modal'); }); }; @@ -300,9 +324,9 @@ define([ /** * updates the log graph for a log key * @param key - * @param duration + * @param duration (if undefined -> just update graph with current data) */ - var updateLogGraph = function(key, duration){ + let updateLogGraph = function(key, duration){ // check if graph data already exist if( !(chartData.hasOwnProperty(key))){ @@ -314,21 +338,23 @@ define([ } // add new value - chartData[key].data.unshift(duration); + if(duration !== undefined){ + chartData[key].data.unshift(duration); + } if(chartData[key].data.length > maxGraphDataCount){ chartData[key].data = chartData[key].data.slice(0, maxGraphDataCount); } function getGraphData(data) { - var tempChartData = { + let tempChartData = { data: [], dataSum: 0, average: 0 }; - for(var x = 0; x < maxGraphDataCount; x++){ - var value = 0; + for(let x = 0; x < maxGraphDataCount; x++){ + let value = 0; if(data[x]){ value = data[x]; tempChartData.dataSum = Number( (tempChartData.dataSum + value).toFixed(2) ); @@ -346,14 +372,14 @@ define([ return tempChartData; } - var tempChartData = getGraphData(chartData[key].data); + let tempChartData = getGraphData(chartData[key].data); // add new data to graph (Morris chart) - if is already initialized if(chartData[key].graph !== null){ - var avgElement = chartData[key].averageElement; - var updateElement = chartData[key].updateElement; + let avgElement = chartData[key].averageElement; + let updateElement = chartData[key].updateElement; - var delay = Util.getCurrentTriggerDelay( key, 0 ); + let delay = Util.getCurrentTriggerDelay( key, 0 ); if(delay){ updateElement[0].textContent = ' delay: ' + delay + 'ms '; @@ -365,8 +391,8 @@ define([ // change avg. display avgElement[0].textContent = 'Avg. ' + tempChartData.average + 'ms'; - var avgStatus = getLogStatusByDuration(key, tempChartData.average); - var avgStatusClass = Util.getLogInfo( avgStatus, 'class' ); + let avgStatus = getLogStatusByDuration(key, tempChartData.average); + let avgStatusClass = Util.getLogInfo( avgStatus, 'class' ); //change avg. display class if( !avgElement.hasClass(avgStatusClass) ){ @@ -376,7 +402,7 @@ define([ // change goals line color if(avgStatus === 'warning'){ chartData[key].graph.options.goalLineColors = ['#e28a0d']; - $(document).setProgramStatus('problem'); + $(document).setProgramStatus('slow connection'); }else{ chartData[key].graph.options.goalLineColors = ['#5cb85c']; } @@ -396,9 +422,8 @@ define([ * @param logDuration * @returns {string} */ - var getLogStatusByDuration = function(logKey, logDuration){ - - var logStatus = 'info'; + let getLogStatusByDuration = function(logKey, logDuration){ + let logStatus = 'info'; if( logDuration > Init.timer[logKey].EXECUTION_LIMIT ){ logStatus = 'warning'; } @@ -410,9 +435,9 @@ define([ * @param logType * @returns {string} */ - var getLogTypeIconClass = function(logType){ + let getLogTypeIconClass = function(logType){ - var logIconClass = ''; + let logIconClass = ''; switch(logType){ case 'client': @@ -427,11 +452,15 @@ define([ }; /** - * init logging -> set global log event + * init logging -> set global log events */ - var init = function(){ + let init = function(){ - var maxEntries = 150; + let maxEntries = 150; + + $(window).on('pf:syncStatus', function(){ + updateSyncStatus(); + }); // set global logging listener $(window).on('pf:log', function(e, logKey, options){ @@ -442,21 +471,19 @@ define([ options.duration && options.description ){ - var logDescription = options.description; - var logDuration = options.duration; - var logType = options.type; + let logDescription = options.description; + let logDuration = options.duration; + let logType = options.type; // check log status by duration - var logStatus = getLogStatusByDuration(logKey, logDuration); - - var statusClass = Util.getLogInfo( logStatus, 'class' ); - - var typeIconClass = getLogTypeIconClass(logType); + let logStatus = getLogStatusByDuration(logKey, logDuration); + let statusClass = Util.getLogInfo( logStatus, 'class' ); + let typeIconClass = getLogTypeIconClass(logType); // update graph data updateLogGraph(logKey, logDuration); - var logRowData = { + let logRowData = { status: '', time: getLogTime(), duration: '' + logDuration + 'ms', @@ -476,7 +503,7 @@ define([ } // delete old log entries from table --------------------------------- - var rowCount = logData.length; + let rowCount = logData.length; if( rowCount >= maxEntries ){ diff --git a/js/app/map/map.js b/js/app/map/map.js index d3cc3626..4e6cc5af 100644 --- a/js/app/map/map.js +++ b/js/app/map/map.js @@ -20,7 +20,7 @@ define([ 'use strict'; - var config = { + let config = { zIndexCounter: 110, newSystemOffset: { x: 130, @@ -74,13 +74,13 @@ define([ }; // active jsPlumb instances currently running - var activeInstances = {}; + let activeInstances = {}; // active connections per map (cache object) - var connectionCache = {}; + let connectionCache = {}; // jsPlumb config - var globalMapConfig = { + let globalMapConfig = { source: { filter: '.' + config.systemHeadNameClass, //isSource:true, @@ -120,19 +120,19 @@ define([ */ $.fn.updateSystemUserData = function(map, data, currentUserIsHere){ - var system = $(this); - var systemId = system.attr('id'); + let system = $(this); + let systemId = system.attr('id'); // find system body - var systemBody = $( system.find('.' + config.systemBodyClass) ); + let systemBody = $( system.find('.' + config.systemBodyClass) ); // find expand arrow - var systemHeadExpand = $( system.find('.' + config.systemHeadExpandClass) ); + let systemHeadExpand = $( system.find('.' + config.systemHeadExpandClass) ); - var oldCacheKey = system.data('userCache'); - var oldUserCount = system.data('userCount'); + let oldCacheKey = system.data('userCache'); + let oldUserCount = system.data('userCount'); oldUserCount = (oldUserCount !== undefined ? oldUserCount : 0); - var userCounter = 0; + let userCounter = 0; system.data('currentUser', false); @@ -146,14 +146,14 @@ define([ data && data.user ){ - var cacheArray = []; + let cacheArray = []; // loop all active pilots and build cache-key - for(var i = 0; i < data.user.length; i++){ + for(let i = 0; i < data.user.length; i++){ userCounter++; - var tempUserData = data.user[i]; + let tempUserData = data.user[i]; cacheArray.push(tempUserData.id + '_' + tempUserData.log.ship.id); } - var cacheKey = cacheArray.join('_'); + let cacheKey = cacheArray.join('_'); // check for if cacheKey has changed if(cacheKey !== oldCacheKey){ @@ -166,12 +166,12 @@ define([ // loop "again" and build DOM object with user information for(let j = 0; j < data.user.length; j++){ - var userData = data.user[j]; + let userData = data.user[j]; - var statusClass = Util.getStatusInfoForCharacter(userData, 'class'); - var userName = userData.name; + let statusClass = Util.getStatusInfoForCharacter(userData, 'class'); + let userName = userData.name; - var item = $('
', { + let item = $('
', { class: config.systemBodyItemClass }).append( $('', { @@ -196,11 +196,11 @@ define([ // ================================================================= // user count changed -> change tooltip content - var tooltipOptions = {placement: 'top', trigger: 'manual'}; + let tooltipOptions = {placement: 'top', trigger: 'manual'}; // set tooltip color - var highlight = false; - var tooltipIconClass = ''; + let highlight = false; + let tooltipIconClass = ''; if(userCounter > oldUserCount){ highlight = 'good'; tooltipIconClass = 'fa-caret-up'; @@ -265,10 +265,10 @@ define([ * @param callback */ $.fn.toggleBody = function(type, map, callback){ - var system = $(this); - var systemBody = system.find('.' + config.systemBodyClass); + let system = $(this); + let systemBody = system.find('.' + config.systemBodyClass); - var systemDomId = system.attr('id'); + let systemDomId = system.attr('id'); if(type === true){ // show minimal body @@ -320,15 +320,15 @@ define([ $.fn.toggleSystemTooltip = function(show, options){ // tooltip colors - var colorClasses = { + let colorClasses = { good: 'txt-color-green', bad: 'txt-color-red' }; return this.each(function(){ - var system = $(this); - var tooltipId = 0; - var tooltipClassHighlight = false; + let system = $(this); + let tooltipId = 0; + let tooltipClassHighlight = false; // do not update tooltips while a system is dragged if(system.hasClass('jsPlumb_dragged')){ @@ -346,7 +346,7 @@ define([ }else if(show === 'show'){ // check if tooltip is currently visible - var tooltipActive = (system.attr('aria-describedby') !== undefined); + let tooltipActive = (system.attr('aria-describedby') !== undefined); if(options === undefined){ options = {}; @@ -365,7 +365,7 @@ define([ // init new tooltip tooltipId = config.systemTooltipInnerIdPrefix + options.id; - var template = '

', { + let table = $('
', { class: ['compact', 'stripe', 'order-column', 'row-border', config.systemInfoRoutesTableClass].join(' ') }); moduleElement.append( $(table) ); // init empty table - var routesTable = table.DataTable( { + let routesTable = table.DataTable( { paging: false, ordering: true, order: [[ 2, 'asc' ], [ 0, 'asc' ]], @@ -711,41 +784,35 @@ define([ data: 'route' },{ targets: 5, - title: '', + title: '', orderable: false, searchable: false, width: '10px', class: ['text-center', config.dataTableActionCellClass].join(' '), - data: 'reload', + data: 'safer', render: { _: 'button' }, createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - var tempTableApi = this.api(); + let tempTableApi = this.api(); $(cell).on('click', function(e) { // get current row data (important!) // -> "rowData" param is not current state, values are "on createCell()" state rowData = tempTableApi.row( $(cell).parents('tr')).data(); + let routeData = getRouteRequestDataFromRowData( rowData ); - var context = { + // overwrite some params + routeData.skipSearch = 0; + routeData.safer = 1 - routeData.safer; // toggle + + let context = { moduleElement: moduleElement, dataTable: tempTableApi }; - var requestData = { - routeData: [{ - mapIds: rowData.mapIds, - systemFromData: rowData.systemFromData, - systemToData: rowData.systemToData, - skipSearch: 0, - stargates: rowData.stargates ? 1 : 0, - jumpbridges: rowData.jumpbridges ? 1 : 0, - wormholes: rowData.wormholes ? 1 : 0, - wormholesReduced: rowData.wormholesReduced ? 1 : 0, - wormholesCritical: rowData.wormholesCritical ? 1 : 0, - wormholesEOL: rowData.wormholesEOL ? 1 : 0 - }] + let requestData = { + routeData: [routeData] }; getRouteData(requestData, context, callbackAddRouteRow); @@ -758,14 +825,49 @@ define([ searchable: false, width: '10px', class: ['text-center', config.dataTableActionCellClass].join(' '), + data: 'reload', + render: { + _: 'button' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tempTableApi = this.api(); + + $(cell).on('click', function(e) { + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tempTableApi.row( $(cell).parents('tr')).data(); + let routeData = getRouteRequestDataFromRowData( rowData ); + + // overwrite some params + routeData.skipSearch = 0; + + let context = { + moduleElement: moduleElement, + dataTable: tempTableApi + }; + + let requestData = { + routeData: [routeData] + }; + + getRouteData(requestData, context, callbackAddRouteRow); + }); + } + },{ + targets: 7, + title: '', + orderable: false, + searchable: false, + width: '10px', + class: ['text-center', config.dataTableActionCellClass].join(' '), data: 'clear', render: { _: 'button' }, createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - var tempTableElement = this; + let tempTableElement = this; - var confirmationSettings = { + let confirmationSettings = { container: 'body', placement: 'left', btnCancelClass: 'btn btn-sm btn-default', @@ -776,7 +878,7 @@ define([ btnOkLabel: 'delete', btnOkIcon: 'fa fa-fw fa-close', onConfirm : function(e, target){ - var deleteRowElement = $(cell).parents('tr'); + let deleteRowElement = $(cell).parents('tr'); tempTableElement.api().rows(deleteRowElement).remove().draw(); } }; @@ -788,14 +890,14 @@ define([ ], drawCallback: function(settings){ - var animationRows = this.api().rows().nodes().to$().filter(function() { + let animationRows = this.api().rows().nodes().to$().filter(function() { return ( $(this).data('animationStatus') || $(this).data('animationTimer') ); }); - for(var i = 0; i < animationRows.length; i++){ + for(let i = 0; i < animationRows.length; i++){ $(animationRows[i]).pulseTableRow($(animationRows[i]).data('animationStatus')); $(animationRows[i]).removeData('animationStatus'); } @@ -805,7 +907,7 @@ define([ }); // init tooltips for this module - var tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); + let tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); tooltipElements.tooltip({ container: 'body' }); @@ -819,19 +921,19 @@ define([ * @param options */ $.fn.initSystemPopover = function(options){ - var elements = $(this); - var eventNamespace = 'hideSystemPopup'; - var systemToData = options.systemToData; + let elements = $(this); + let eventNamespace = 'hideSystemPopup'; + let systemToData = options.systemToData; requirejs(['text!templates/tooltip/system_popover.html', 'mustache'], function (template, Mustache) { - var data = { + let data = { systemToData: systemToData }; - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); elements.each(function() { - var element = $(this); + let element = $(this); // destroy "popover" and remove "click" event for animation element.popover('destroy').off(); @@ -859,11 +961,11 @@ define([ // set link observer "on shown" event elements.on('shown.bs.popover', function () { - var popoverRoot = $(this); + let popoverRoot = $(this); popoverRoot.data('bs.popover').tip().find('a').on('click', function(){ // hint: "data" attributes should be in lower case! - var systemData = { + let systemData = { name: $(this).data('name'), systemId: $(this).data('systemid') }; @@ -883,16 +985,16 @@ define([ * @param mapId * @param systemData */ - var initModule = function(moduleElement, mapId, systemData){ + let initModule = function(moduleElement, mapId, systemData){ - var systemFromData = { + let systemFromData = { name: systemData.name, systemId: systemData.systemId }; - var routesTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); + let routesTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); - var routesTable = routesTableElement.DataTable(); + let routesTable = routesTableElement.DataTable(); // init refresh routes -------------------------------------------------------------------- moduleElement.find('.' + config.systemModuleHeadlineIconRefresh).on('click', function(e){ @@ -907,7 +1009,7 @@ define([ // max routes limit reached -> show warning Util.showNotify({title: 'Route limit reached', text: 'Serch is limited by ' + maxRouteSearchLimit, type: 'warning'}); }else{ - var dialogData = { + let dialogData = { moduleElement: moduleElement, mapId: mapId, systemFromData: systemFromData, @@ -922,7 +1024,7 @@ define([ // init settings dialog ------------------------------------------------------------------- moduleElement.find('.' + config.systemModuleHeadlineIconSettings).on('click', function(e){ - var dialogData = { + let dialogData = { mapId: mapId }; @@ -930,10 +1032,10 @@ define([ }); // fill routesTable with data ------------------------------------------------------------- - var promiseStore = MapUtil.getLocaleData('map', mapId); + let promiseStore = MapUtil.getLocaleData('map', mapId); promiseStore.then(function(dataStore) { // selected systems (if already stored) - var systemsTo = [{ + let systemsTo = [{ name: 'Jita', systemId: 30000142 }]; @@ -950,69 +1052,6 @@ define([ }; - /** - * draw route table - * @param mapId - * @param moduleElement - * @param systemFromData - * @param routesTable - * @param systemsTo - */ - var drawRouteTable = function(mapId, moduleElement, systemFromData, routesTable, systemsTo){ - var requestRouteData = []; - var currentTimestamp = Util.getServerTime().getTime(); - - // Skip some routes from search - // -> this should help to throttle requests (heavy CPU load for route calculation) - var defaultRoutesCount = Init.routeSearch.defaultCount; - - for(var i = 0; i < systemsTo.length; i++){ - var systemToData = systemsTo[i]; - - if(systemFromData.name !== systemToData.name){ - var cacheKey = 'route_' + mapId + '_' + systemFromData.name.toUpperCase() + '_' + systemToData.name.toUpperCase(); - - if( - cache.systemRoutes.hasOwnProperty(cacheKey) && - Math.round( - ( currentTimestamp - (new Date( cache.systemRoutes[cacheKey].updated * 1000).getTime())) / 1000 - ) <= config.routeCacheTTL - ){ - // route data is cached (client side) - var context = { - dataTable: routesTable - }; - - addRow(context, cache.systemRoutes[cacheKey].data); - }else{ - // get route data - var searchData = { - mapIds: [mapId], - systemFromData: systemFromData, - systemToData: systemToData, - skipSearch: requestRouteData.length >= defaultRoutesCount - }; - - requestRouteData.push( getRouteRequestDataFromRowData( searchData )); - } - } - } - - // check if routes data is not cached and is requested - if(requestRouteData.length > 0){ - var contextData = { - moduleElement: moduleElement, - dataTable: routesTable - }; - - var requestData = { - routeData: requestRouteData - }; - - getRouteData(requestData, contextData, callbackAddRouteRow); - } - }; - /** * updates an dom element with the system route module * @param mapId @@ -1020,10 +1059,10 @@ define([ */ $.fn.drawSystemRouteModule = function(mapId, systemData){ - var parentElement = $(this); + let parentElement = $(this); // show route module - var showModule = function(moduleElement){ + let showModule = function(moduleElement){ if(moduleElement){ moduleElement.css({ opacity: 0 }); parentElement.append(moduleElement); @@ -1039,7 +1078,7 @@ define([ }; // check if module already exists - var moduleElement = parentElement.find('.' + config.systemRouteModuleClass); + let moduleElement = parentElement.find('.' + config.systemRouteModuleClass); if(moduleElement.length > 0){ moduleElement.velocity('transition.slideDownOut', { diff --git a/js/app/util.js b/js/app/util.js index feef7e46..fefba264 100644 --- a/js/app/util.js +++ b/js/app/util.js @@ -21,7 +21,7 @@ define([ 'use strict'; - var config = { + let config = { ajaxOverlayClass: 'pf-loading-overlay', ajaxOverlayWrapperClass: 'pf-loading-overlay-wrapper', @@ -62,11 +62,11 @@ define([ }; - var stopTimerCache = {}; // cache for stopwatch timer + let stopTimerCache = {}; // cache for stopwatch timer - var animationTimerCache = {}; // cache for table row animation timeout + let animationTimerCache = {}; // cache for table row animation timeout - var localStorage; // cache for "localForage" singleton + let localStorage; // cache for "localForage" singleton /* * =========================================================================================================== @@ -78,9 +78,9 @@ define([ * displays a loading indicator on an element */ $.fn.showLoadingAnimation = function(options){ - var loadingElement = $(this); + let loadingElement = $(this); - var iconSize = 'fa-lg'; + let iconSize = 'fa-lg'; // disable all events loadingElement.css('pointer-events', 'none'); @@ -93,7 +93,7 @@ define([ } } - var overlay = $('
', { + let overlay = $('
', { class: config.ajaxOverlayClass }).append( $('
', { @@ -111,7 +111,7 @@ define([ $(overlay).velocity({ opacity: 0.6 },{ - duration: 180 + duration: 120 }); }; @@ -119,8 +119,8 @@ define([ * removes a loading indicator */ $.fn.hideLoadingAnimation = function(){ - var loadingElement = $(this); - var overlay = loadingElement.find('.' + config.ajaxOverlayClass ); + let loadingElement = $(this); + let overlay = loadingElement.find('.' + config.ajaxOverlayClass ); // important: "stop" is required to stop "show" animation // -> otherwise "complete" callback is not fired! @@ -138,7 +138,7 @@ define([ * @param callback */ $.fn.showSplashOverlay = function(callback){ - var splashOverlay = $(this); + let splashOverlay = $(this); splashOverlay.velocity('fadeIn', { duration: Init.animationSpeed.splashOverlay, @@ -155,7 +155,7 @@ define([ * hide "splash" loading overlay */ $.fn.hideSplashOverlay = function(){ - var splashOverlay = $(this); + let splashOverlay = $(this); splashOverlay.velocity('fadeOut', { duration: Init.animationSpeed.splashOverlay @@ -170,8 +170,8 @@ define([ */ $.fn.showCaptchaImage = function(reason, callback){ return this.each(function(){ - var captchaWrapper = $(this); - var captchaImage = captchaWrapper.find('img'); + let captchaWrapper = $(this); + let captchaImage = captchaWrapper.find('img'); captchaWrapper.showLoadingAnimation(config.loadingOptions); getCaptchaImage(reason, function(base64Image){ @@ -192,9 +192,10 @@ define([ /** * request a captcha image + * @param reason * @param callback */ - var getCaptchaImage = function(reason, callback){ + let getCaptchaImage = function(reason, callback){ $.ajax({ type: 'POST', @@ -210,7 +211,7 @@ define([ callback(responseData.img); } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; showNotify({title: jqXHR.status + ': getCaptchaImage', text: reason, type: 'error'}); }); @@ -222,7 +223,7 @@ define([ */ $.fn.resetFormFields = function(){ return this.each(function(){ - var field = $(this); + let field = $(this); if( !field.is('select') ){ // "input" @@ -240,12 +241,12 @@ define([ */ $.fn.showFormMessage = function(errors){ - var formElement = $(this); + let formElement = $(this); - var errorMessage = []; - var warningMessage = []; - var infoMessage = []; - for(var i = 0; i < errors.length; i++){ + let errorMessage = []; + let warningMessage = []; + let infoMessage = []; + for(let i = 0; i < errors.length; i++){ if(errors[i].type === 'error'){ errorMessage.push( errors[i].message ); @@ -254,7 +255,7 @@ define([ errors[i].field && errors[i].field.length > 0 ){ - var formField = formElement.find('[name="' + errors[i].field + '"]'); + let formField = formElement.find('[name="' + errors[i].field + '"]'); formField.parents('.form-group').removeClass('has-success').addClass('has-error'); } @@ -294,9 +295,9 @@ define([ */ $.fn.hideFormMessage = function(type, callback){ - var formElement = $(this); + let formElement = $(this); - var settingsMessageVelocityOptions = $.extend({}, config.settingsMessageVelocityOptions); + let settingsMessageVelocityOptions = $.extend({}, config.settingsMessageVelocityOptions); // check if callback exists if(callback !== undefined){ @@ -306,7 +307,7 @@ define([ settingsMessageVelocityOptions.display = 'block'; } - var messageElement = null; + let messageElement = null; switch(type){ case 'error': @@ -346,22 +347,22 @@ define([ options = (typeof options === 'undefined')? {} : options; return this.each(function(){ - var form = $(this); + let form = $(this); // init form validation form.validator(options); // validation event listener form.on('valid.bs.validator', function(validatorObj){ - var inputGroup = $(validatorObj.relatedTarget).parents('.form-group'); + let inputGroup = $(validatorObj.relatedTarget).parents('.form-group'); if(inputGroup){ inputGroup.removeClass('has-error').addClass('has-success'); } }); form.on('invalid.bs.validator', function(validatorObj){ - var field = $(validatorObj.relatedTarget); - var inputGroup = field.parents('.form-group'); + let field = $(validatorObj.relatedTarget); + let inputGroup = field.parents('.form-group'); if(inputGroup){ inputGroup.removeClass('has-success').addClass('has-error'); } @@ -375,10 +376,10 @@ define([ * @returns {boolean} */ $.fn.isValidForm = function(){ - var form = $(this); - var valid = false; + let form = $(this); + let valid = false; - var errorElements = form.find('.has-error'); + let errorElements = form.find('.has-error'); if(errorElements.length === 0){ valid = true; @@ -393,9 +394,9 @@ define([ * @returns {{}} */ $.fn.getFormValues = function(){ - var form = $(this); - var formData = {}; - var values = form.serializeArray(); + let form = $(this); + let formData = {}; + let values = form.serializeArray(); // add "unchecked" checkboxes as well values = values.concat( @@ -411,7 +412,7 @@ define([ if(field.name.indexOf('[]') !== -1){ // array field - var key = field.name.replace('[]', ''); + let key = field.name.replace('[]', ''); if( !$.isArray(formData[key]) ){ formData[key] = []; } @@ -423,7 +424,7 @@ define([ } // get xEditable values - var editableValues = form.find('.' + config.formEditableFieldClass).editable('getValue'); + let editableValues = form.find('.' + config.formEditableFieldClass).editable('getValue'); // merge values formData = $.extend(formData, editableValues); @@ -437,15 +438,15 @@ define([ */ $.fn.isInViewport = function(){ - var visibleElement = []; + let visibleElement = []; this.each(function(){ - var element = $(this)[0]; + let element = $(this)[0]; - var top = element.offsetTop; - var left = element.offsetLeft; - var width = element.offsetWidth; - var height = element.offsetHeight; + let top = element.offsetTop; + let left = element.offsetLeft; + let width = element.offsetWidth; + let height = element.offsetHeight; while(element.offsetParent) { element = element.offsetParent; @@ -471,12 +472,12 @@ define([ */ $.fn.initMapUpdateCounter = function(){ - var counterChart = $(this); + let counterChart = $(this); counterChart.easyPieChart({ barColor: function(percent){ - var color = '#568a89'; + let color = '#568a89'; if(percent <= 30){ color = '#d9534f'; }else if(percent <= 50){ @@ -503,14 +504,14 @@ define([ options = (typeof options === 'object') ? options : {}; - var defaultOptions = { + let defaultOptions = { container: this, delay: 100 }; options = $.extend(defaultOptions, options); return this.each(function(){ - var tooltipElements = $(this).find('[title]'); + let tooltipElements = $(this).find('[title]'); tooltipElements.tooltip('destroy').tooltip(options); }); }; @@ -520,14 +521,14 @@ define([ * @param tooltipData */ $.fn.addCharacterInfoTooltip = function(tooltipData){ - var element = $(this); + let element = $(this); if( tooltipData.created.character && tooltipData.updated.character ){ - var createdData = tooltipData.created; - var updatedData = tooltipData.updated; + let createdData = tooltipData.created; + let updatedData = tooltipData.updated; // check if data has changed if( @@ -539,16 +540,16 @@ define([ element.data('created', createdData.created); element.data('updated', updatedData.updated); - var statusCreatedClass = getStatusInfoForCharacter(createdData.character, 'class'); - var statusUpdatedClass = getStatusInfoForCharacter(updatedData.character, 'class'); + let statusCreatedClass = getStatusInfoForCharacter(createdData.character, 'class'); + let statusUpdatedClass = getStatusInfoForCharacter(updatedData.character, 'class'); // convert timestamps - var dateCreated = new Date(createdData.created * 1000); - var dateUpdated = new Date(updatedData.updated * 1000); - var dateCreatedUTC = convertDateToUTC(dateCreated); - var dateUpdatedUTC = convertDateToUTC(dateUpdated); + let dateCreated = new Date(createdData.created * 1000); + let dateUpdated = new Date(updatedData.updated * 1000); + let dateCreatedUTC = convertDateToUTC(dateCreated); + let dateUpdatedUTC = convertDateToUTC(dateUpdated); - var data = { + let data = { created: createdData, updated: updatedData, createdTime: convertDateToString(dateCreatedUTC), @@ -558,7 +559,7 @@ define([ }; requirejs(['text!templates/tooltip/character_info.html', 'mustache'], function(template, Mustache) { - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); element.popover({ placement: 'top', @@ -574,7 +575,7 @@ define([ }); // set new popover content - var popover = element.data('bs.popover'); + let popover = element.data('bs.popover'); popover.options.content = content; }); @@ -587,12 +588,12 @@ define([ * @param userData */ $.fn.initCharacterSwitchPopover = function(userData){ - var elements = $(this); - var eventNamespace = 'hideCharacterPopup'; + let elements = $(this); + let eventNamespace = 'hideCharacterPopup'; requirejs(['text!templates/tooltip/character_switch.html', 'mustache'], function (template, Mustache) { - var data = { + let data = { id: config.headCharacterSwitchId, routes: Init.routes, userData: userData, @@ -602,10 +603,10 @@ define([ }) }; - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); return elements.each(function() { - var element = $(this); + let element = $(this); // check if tooltip already exists -> remove it if(element.data('bs.popover') !== undefined){ @@ -616,11 +617,11 @@ define([ e.preventDefault(); e.stopPropagation(); - var easeEffect = $(this).attr('data-easein'); - var popoverData = $(this).data('bs.popover'); - var popoverElement = null; + let easeEffect = $(this).attr('data-easein'); + let popoverData = $(this).data('bs.popover'); + let popoverElement = null; - var velocityOptions = { + let velocityOptions = { duration: Init.animationSpeed.dialogEvents }; @@ -670,7 +671,7 @@ define([ $('body').off('click.' + eventNamespace).on('click.' + eventNamespace + ' contextmenu', function (e) { $('.' + config.popoverTriggerClass).each(function () { - var popoverElement = $(this); + let popoverElement = $(this); //the 'is' for buttons that trigger popups //the 'has' for icons within a button that triggers a popup if( @@ -678,7 +679,7 @@ define([ popoverElement.has(e.target).length === 0 && $('.popover').has(e.target).length === 0 ){ - var popover = popoverElement.data('bs.popover'); + let popover = popoverElement.data('bs.popover'); if( popover !== undefined && @@ -699,10 +700,10 @@ define([ */ $.fn.addWormholeInfoTooltip = function(tooltipData){ return this.each(function() { - var element = $(this); + let element = $(this); requirejs(['text!templates/tooltip/wormhole_info.html', 'mustache'], function (template, Mustache) { - var content = Mustache.render(template, tooltipData); + let content = Mustache.render(template, tooltipData); element.popover({ placement: 'top', @@ -719,7 +720,7 @@ define([ }); // set new popover content - var popover = element.data('bs.popover'); + let popover = element.data('bs.popover'); popover.options.content = content; }); }); @@ -731,12 +732,12 @@ define([ * @param config */ $.fn.showMessage = function(config){ - var containerElement = $(this); + let containerElement = $(this); requirejs(['text!templates/form/message.html', 'mustache'], function(template, Mustache) { - var messageTypeClass = 'alert-danger'; - var messageTextClass = 'txt-color-danger'; + let messageTypeClass = 'alert-danger'; + let messageTextClass = 'txt-color-danger'; switch(config.type){ case 'info': @@ -753,14 +754,14 @@ define([ break; } - var data = { + let data = { title: config.title, text: config.text, messageTypeClass: messageTypeClass, messageTextClass: messageTextClass }; - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); containerElement.html(content); @@ -778,14 +779,14 @@ define([ */ $.fn.singleDoubleClick = function(singleClickCallback, doubleClickCallback, timeout) { return this.each(function(){ - var clicks = 0, self = this; + let clicks = 0, self = this; // prevent default behaviour (e.g. open -tag link) - $(this).on('click', function(e){ + $(this).off('click').on('click', function(e){ e.preventDefault(); }); - $(this).on('mouseup', function(e){ + $(this).off('mouseup').on('mouseup', function(e){ clicks++; if (clicks === 1) { setTimeout(function(){ @@ -808,7 +809,7 @@ define([ */ $.fn.pulseTableRow = function(status, clear){ - var animationClass = ''; + let animationClass = ''; switch(status){ case 'added': animationClass = config.animationPulseSuccessClass; @@ -818,9 +819,9 @@ define([ break; } - var clearTimer = function(element) { + let clearTimer = function(element) { element.removeClass( animationClass ); - var currentTimer = element.data('animationTimer'); + let currentTimer = element.data('animationTimer'); if( animationTimerCache.hasOwnProperty(currentTimer) ){ clearTimeout( currentTimer ); @@ -830,7 +831,7 @@ define([ }; return this.each(function(){ - var element = $(this); + let element = $(this); if( element.hasClass(animationClass) ){ // clear timer -> set new timer @@ -839,7 +840,7 @@ define([ if(clear !== true){ element.addClass( animationClass ); - var timer = setTimeout(clearTimer, 1500, element); + let timer = setTimeout(clearTimer, 1500, element); element.data('animationTimer', timer); animationTimerCache[timer] = true; } @@ -857,21 +858,21 @@ define([ * get current Pathfinder version number * @returns {*|jQuery} */ - var getVersion = function(){ + let getVersion = function(){ return $('body').data('version'); }; /** * show current program version information in browser console */ - var showVersionInfo = function(){ + let showVersionInfo = function(){ console.info('PATHFINDER ' + getVersion()); }; /** * init utility prototype functions */ - var initPrototypes = function(){ + let initPrototypes = function(){ // Array diff // [1,2,3,4,5,6].diff( [3,4,5] ); // => [1, 2, 6] @@ -883,7 +884,7 @@ define([ /** * set default configuration for "Bootbox" dialogs */ - var initDefaultBootboxConfig = function(){ + let initDefaultBootboxConfig = function(){ bootbox.setDefaults({ onEscape: true // enables close dialogs on ESC key }); @@ -896,7 +897,7 @@ define([ * @param value * @returns {*} */ - var getCurrentTriggerDelay = function( updateKey, value ){ + let getCurrentTriggerDelay = function( updateKey, value ){ // make sure the delay timer is valid! // if this is called for the first time -> set CURRENT_DELAY @@ -922,12 +923,12 @@ define([ * get date obj with current EVE Server Time. * @returns {Date} */ - var getServerTime = function(){ + let getServerTime = function(){ // Server is running with GMT/UTC (EVE Time) - var localDate = new Date(); + let localDate = new Date(); - var serverDate= new Date( + let serverDate= new Date( localDate.getUTCFullYear(), localDate.getUTCMonth(), localDate.getUTCDate(), @@ -944,8 +945,8 @@ define([ * @param timestamp * @returns {Date} */ - var convertTimestampToServerTime = function(timestamp){ - var currentTimeZoneOffsetInMinutes = new Date().getTimezoneOffset(); + let convertTimestampToServerTime = function(timestamp){ + let currentTimeZoneOffsetInMinutes = new Date().getTimezoneOffset(); return new Date( (timestamp + (currentTimeZoneOffsetInMinutes * 60)) * 1000); }; @@ -955,11 +956,11 @@ define([ * @param date2 * @returns {{}} */ - var getTimeDiffParts = function(date1, date2){ - var parts = {}; - var time1 = date1.getTime(); - var time2 = date2.getTime(); - var diff = 0; + let getTimeDiffParts = function(date1, date2){ + let parts = {}; + let time1 = date1.getTime(); + let time2 = date2.getTime(); + let diff = 0; if( time1 >= 0 && @@ -971,7 +972,7 @@ define([ diff = Math.abs(Math.floor(diff)); parts.days = Math.floor(diff/(24*60*60)); - var leftSec = diff - parts.days * 24*60*60; + let leftSec = diff - parts.days * 24*60*60; parts.hours = Math.floor(leftSec/(60*60)); leftSec = leftSec - parts.hours * 60*60; @@ -985,7 +986,7 @@ define([ * start time measurement by a unique string identifier * @param timerName */ - var timeStart = function(timerName){ + let timeStart = function(timerName){ if(typeof performance === 'object'){ stopTimerCache[timerName] = performance.now(); @@ -999,13 +1000,13 @@ define([ * @param timerName * @returns {number} */ - var timeStop = function(timerName){ + let timeStop = function(timerName){ - var duration = 0; + let duration = 0; if( stopTimerCache.hasOwnProperty(timerName) ){ // check browser support for performance API - var timeNow = 0; + let timeNow = 0; if(typeof performance === 'object'){ timeNow = performance.now(); @@ -1025,10 +1026,10 @@ define([ /** * trigger main logging event with log information - * @param message + * @param logKey * @param options */ - var log = function(logKey, options){ + let log = function(logKey, options){ $(window).trigger('pf:log', [logKey, options]); }; @@ -1037,7 +1038,7 @@ define([ * @param customConfig * @param desktop */ - var showNotify = function(customConfig, desktop){ + let showNotify = function(customConfig, desktop){ requirejs(['app/notification'], function(Notification) { Notification.showNotify(customConfig, desktop); }); @@ -1046,7 +1047,7 @@ define([ /** * stop browser tab title "blinking" */ - var stopTabBlink = function(){ + let stopTabBlink = function(){ requirejs(['app/notification'], function(Notification) { Notification.stopTabBlink(); }); @@ -1058,8 +1059,8 @@ define([ * @param option * @returns {string} */ - var getLogInfo = function(logType, option){ - var logInfo = ''; + let getLogInfo = function(logType, option){ + let logInfo = ''; if(Init.classes.logTypes.hasOwnProperty(logType)){ logInfo = Init.classes.logTypes[logType][option]; @@ -1068,10 +1069,18 @@ define([ return logInfo; }; + /** + * get currentUserData from "global" variable + * @returns {*} + */ + let getCurrentUserData = function(){ + return Init.currentUserData; + }; + /** * set default jQuery AJAX configuration */ - var ajaxSetup = function(){ + let ajaxSetup = function(){ $.ajaxSetup({ beforeSend: function(xhr, settings) { // Add custom application headers on "same origin" requests only! @@ -1079,8 +1088,8 @@ define([ if(settings.crossDomain === false){ // add current character data to ANY XHR request (HTTP HEADER) // -> This helps to identify multiple characters on multiple browser tabs - var userData = getCurrentUserData(); - var currentCharacterId = 0; + let userData = getCurrentUserData(); + let currentCharacterId = 0; if( userData && userData.character @@ -1094,6 +1103,111 @@ define([ }); }; + /** + * get WebSocket readyState description from ID + * https://developer.mozilla.org/de/docs/Web/API/WebSocket + * @param readyState + * @returns {string} + */ + let getWebSocketDescriptionByReadyState = (readyState) => { + let description = ''; + + switch(readyState){ + case 0: description = 'connecting'; break; + case 1: description = 'open'; break; + case 2: description = 'closing'; break; + case 3: description = 'closed'; break; + } + + return description; + }; + + /** + * set sync status for map updates + * -> if SharedWorker AND WebSocket connected -> status = "WebSocket" + * -> else -> status = "ajax" (long polling) + * @param type + * @param options + */ + let setSyncStatus = (type, options) => { + // current syncStatus + let syncStatus = Init.syncStatus; + + switch(type){ + case 'ws:open': + // WebSocket open + syncStatus.webSocket.status = getWebSocketDescriptionByReadyState(options.readyState); + syncStatus.webSocket.class = 'txt-color-success'; + syncStatus.webSocket.timestamp = new Date().getTime() / 1000; + + syncStatus.type = 'webSocket'; + setSyncStatus('ajax:disable'); + + $(window).trigger('pf:syncStatus'); + break; + case 'ws:get': + // WebSocket data pushed from server + syncStatus.webSocket.timestamp = new Date().getTime() / 1000; + $(window).trigger('pf:syncStatus'); + break; + case 'ws:closed': + // WebSocket closed + syncStatus.webSocket.status = getWebSocketDescriptionByReadyState(options.readyState); + syncStatus.webSocket.class = 'txt-color-danger'; + syncStatus.webSocket.timestamp = undefined; + + setSyncStatus('ajax:enable'); + break; + case 'ws:error': + // WebSocket error + syncStatus.webSocket.status = getWebSocketDescriptionByReadyState(options.readyState); + syncStatus.webSocket.class = 'txt-color-danger'; + + setSyncStatus('ajax:enable'); + break; + case 'sw:init': + // SharedWorker initialized + syncStatus.sharedWorker.status = 'online'; + syncStatus.sharedWorker.class = 'txt-color-success'; + break; + case 'sw:error': + // SharedWorker error + syncStatus.sharedWorker.status = 'offline'; + syncStatus.sharedWorker.class = 'txt-color-danger'; + + setSyncStatus('ajax:enable'); + break; + case 'ajax:enable': + // Ajax enabled (WebSocket error/not connected) + syncStatus.ajax.status = 'enabled'; + syncStatus.ajax.class = 'txt-color-success'; + syncStatus.ajax.timestamp = new Date().getTime() / 1000; + + syncStatus.type = 'ajax'; + $(window).trigger('pf:syncStatus'); + break; + case 'ajax:get': + // Ajax data pulled from client + syncStatus.ajax.timestamp = new Date().getTime() / 1000; + $(window).trigger('pf:syncStatus'); + break; + case 'ajax:disable': + // Ajax disabled (WebSocket open/ready) + syncStatus.ajax.status = 'disabled'; + syncStatus.ajax.class = 'txt-color-warning'; + break; + } + }; + + /** + * get current sync type for map updates + * -> "ajax" or "webSocket" + * @returns {string} + */ + let getSyncType = () => { + return Init.syncStatus.type; + }; + /** * Returns true if the user hit Esc or navigated away from the * current page before an AJAX call was done. (The response @@ -1104,7 +1218,7 @@ define([ * @param jqXHR XMLHttpRequest instance * @returns {boolean} */ - var isXHRAborted = function(jqXHR){ + let isXHRAborted = function(jqXHR){ return !jqXHR.getAllResponseHeaders(); }; @@ -1117,9 +1231,9 @@ define([ */ $.fn.getMapTabElements = function(mapId){ - var mapModuleElement = $(this); + let mapModuleElement = $(this); - var mapTabElements = mapModuleElement.find('#' + config.mapTabBarId).find('a'); + let mapTabElements = mapModuleElement.find('#' + config.mapTabBarId).find('a'); if(mapId){ // search for a specific tab element @@ -1135,9 +1249,9 @@ define([ * get the map module object or create a new module * @returns {*|HTMLElement} */ - var getMapModule = function(){ + let getMapModule = function(){ - var mapModule = $('#' + config.mapModuleId); + let mapModule = $('#' + config.mapModuleId); if(mapModule.length === 0){ mapModule = $('
', { id: config.mapModuleId @@ -1147,6 +1261,42 @@ define([ return mapModule; }; + /** + * get Area ID by security string + * @param security + * @returns {number} + */ + let getAreaIdBySecurity = function(security){ + + let areaId = 0; + + switch(security){ + case 'H': + areaId = 10; + break; + case 'L': + areaId = 11; + break; + case '0.0': + areaId = 12; + break; + case 'SH': + areaId = 13; + break; + default: + // w-space + for(let i = 1; i <= 6; i++){ + if(security === 'C' + i){ + areaId = i; + break; + } + } + break; + } + + return areaId; + }; + /** * get system effect data by system security and system class * if no search parameters given -> get all effect data @@ -1154,12 +1304,12 @@ define([ * @param effect * @returns {boolean} */ - var getSystemEffectData = function(security, effect){ - var data = SystemEffect; + let getSystemEffectData = function(security, effect){ + let data = SystemEffect; if(security){ // look for specific data data = false; - var areaId = getAreaIdBySecurity(security); + let areaId = getAreaIdBySecurity(security); if( areaId > 0 && @@ -1179,25 +1329,25 @@ define([ * @param option * @returns {string} */ - var getStatusInfoForCharacter = function(characterData, option){ + let getStatusInfoForCharacter = function(characterData, option){ - var statusInfo = ''; + let statusInfo = ''; // character status can not be checked if there are no reference data // e.g. during registration process (login page) if(Init.characterStatus){ // get info for current "main" character - var corporationId = getCurrentUserInfo('corporationId'); - var allianceId = getCurrentUserInfo('allianceId'); + let corporationId = getCurrentUserInfo('corporationId'); + let allianceId = getCurrentUserInfo('allianceId'); // get all user characters - var userData = getCurrentUserData(); + let userData = getCurrentUserData(); if(userData){ // check if character is one of his own characters - var userCharactersData = userData.characters; + let userCharactersData = userData.characters; - for(var i = 0; i < userCharactersData.length; i++){ + for(let i = 0; i < userCharactersData.length; i++){ if(userCharactersData[i].id === characterData.id){ statusInfo = Init.characterStatus.own[option]; break; @@ -1230,13 +1380,13 @@ define([ * @param data * @returns {string} */ - var getSystemEffectTable = function(data){ - var table = ''; + let getSystemEffectTable = function(data){ + let table = ''; if(data.length > 0){ table += '
'; - for(var i = 0; i < data.length; i++){ + for(let i = 0; i < data.length; i++){ table += ''; table += '
'; table += data[i].effect; @@ -1258,16 +1408,16 @@ define([ * @param data * @returns {string} */ - var getSystemsInfoTable = function(data){ - var table = ''; + let getSystemsInfoTable = function(data){ + let table = ''; if(data.length > 0){ table += ''; - for(var i = 0; i < data.length; i++){ + for(let i = 0; i < data.length; i++){ - var trueSecClass = getTrueSecClassForSystem( data[i].trueSec ); - var securityClass = getSecurityClassForSystem( data[i].security ); + let trueSecClass = getTrueSecClassForSystem( data[i].trueSec ); + let securityClass = getSecurityClassForSystem( data[i].security ); table += ''; table += '
'; @@ -1292,8 +1442,8 @@ define([ * @param sec * @returns {string} */ - var getSecurityClassForSystem = function(sec){ - var secClass = ''; + let getSecurityClassForSystem = function(sec){ + let secClass = ''; if( Init.classes.systemSecurity.hasOwnProperty(sec) ){ secClass = Init.classes.systemSecurity[sec]['class']; @@ -1304,11 +1454,11 @@ define([ /** * get a css class for the trueSec level of a system - * @param sec + * @param trueSec * @returns {string} */ - var getTrueSecClassForSystem = function(trueSec){ - var trueSecClass = ''; + let getTrueSecClassForSystem = function(trueSec){ + let trueSecClass = ''; trueSec = parseFloat(trueSec); @@ -1337,9 +1487,9 @@ define([ * @param option * @returns {string} */ - var getStatusInfoForSystem = function(status, option){ + let getStatusInfoForSystem = function(status, option){ - var statusInfo = ''; + let statusInfo = ''; if( Init.systemStatus.hasOwnProperty(status) ){ // search by status string @@ -1363,11 +1513,11 @@ define([ * @param option * @returns {{}} */ - var getSignatureGroupInfo = function(option){ + let getSignatureGroupInfo = function(option){ - var groupInfo = {}; + let groupInfo = {}; - for (var prop in Init.signatureGroups) { + for (let prop in Init.signatureGroups) { if(Init.signatureGroups.hasOwnProperty(prop)){ prop = parseInt(prop); groupInfo[prop] = Init.signatureGroups[prop][option]; @@ -1384,9 +1534,9 @@ define([ * @param sigGroupId * @returns {{}} */ - var getAllSignatureNames = function(systemTypeId, areaId, sigGroupId){ + let getAllSignatureNames = function(systemTypeId, areaId, sigGroupId){ - var signatureNames = {}; + let signatureNames = {}; if( SignatureType[systemTypeId] && @@ -1406,17 +1556,17 @@ define([ * @param name * @returns {number} */ - var getSignatureTypeIdByName = function(systemData, sigGroupId, name){ + let getSignatureTypeIdByName = function(systemData, sigGroupId, name){ - var signatureTypeId = 0; + let signatureTypeId = 0; - var areaId = getAreaIdBySecurity(systemData.security); + let areaId = getAreaIdBySecurity(systemData.security); if(areaId > 0){ - var signatureNames = getAllSignatureNames(systemData.type.id, areaId, sigGroupId ); + let signatureNames = getAllSignatureNames(systemData.type.id, areaId, sigGroupId ); name = name.toLowerCase(); - for(var prop in signatureNames) { + for(let prop in signatureNames) { if( signatureNames.hasOwnProperty(prop) && @@ -1431,49 +1581,13 @@ define([ return signatureTypeId; }; - /** - * get Area ID by security string - * @param security - * @returns {number} - */ - var getAreaIdBySecurity = function(security){ - - var areaId = 0; - - switch(security){ - case 'H': - areaId = 10; - break; - case 'L': - areaId = 11; - break; - case '0.0': - areaId = 12; - break; - case 'SH': - areaId = 13; - break; - default: - // w-space - for(var i = 1; i <= 6; i++){ - if(security === 'C' + i){ - areaId = i; - break; - } - } - break; - } - - return areaId; - }; - /** * set currentMapUserData as "global" variable (count of active pilots) * this function should be called continuously after data change * to keep the data always up2data * @param mapUserData */ - var setCurrentMapUserData = function(mapUserData){ + let setCurrentMapUserData = function(mapUserData){ Init.currentMapUserData = mapUserData; return getCurrentMapUserData(); @@ -1484,16 +1598,15 @@ define([ * @param mapId * @returns {boolean} */ - var getCurrentMapUserData = function(mapId){ - - var currentMapUserData = false; + let getCurrentMapUserData = function(mapId){ + let currentMapUserData = false; if( mapId === parseInt(mapId, 10) && Init.currentMapUserData ){ // search for a specific map - for(var i = 0; i < Init.currentMapUserData.length; i++){ + for(let i = 0; i < Init.currentMapUserData.length; i++){ if(Init.currentMapUserData[i].config.id === mapId){ currentMapUserData = Init.currentMapUserData[i]; break; @@ -1518,23 +1631,59 @@ define([ * to keep the data always up2data * @param mapData */ - var setCurrentMapData = function(mapData){ + let setCurrentMapData = function(mapData){ Init.currentMapData = mapData; return getCurrentMapData(); }; + /** + * get mapData array index by mapId + * @param mapId + * @returns {boolean|int} + */ + let getCurrentMapDataIndex = function(mapId){ + let mapDataIndex = false; + + if( mapId === parseInt(mapId, 10) ){ + for(let i = 0; i < Init.currentMapData.length; i++){ + if(Init.currentMapData[i].config.id === mapId){ + mapDataIndex = i; + break; + } + } + } + + return mapDataIndex; + }; + + /** + * update cached mapData for a single map + * @param mapData + */ + let updateCurrentMapData = function(mapData){ + let mapDataIndex = getCurrentMapDataIndex( mapData.config.id ); + + if(mapDataIndex !== false){ + Init.currentMapData[mapDataIndex].config = mapData.config; + Init.currentMapData[mapDataIndex].data = mapData.data; + }else{ + // new map data + Init.currentMapData.push(mapData); + } + }; + /** * get currentMapData from "global" variable for a specific map or all maps * @param mapId * @returns {boolean} */ - var getCurrentMapData = function(mapId){ - var currentMapData = false; + let getCurrentMapData = function(mapId){ + let currentMapData = false; if( mapId === parseInt(mapId, 10) ){ // search for a specific map - for(var i = 0; i < Init.currentMapData.length; i++){ + for(let i = 0; i < Init.currentMapData.length; i++){ if(Init.currentMapData[i].config.id === mapId){ currentMapData = Init.currentMapData[i]; break; @@ -1549,33 +1698,22 @@ define([ }; /** - * get mapData array index by mapId + * delete map data by mapId from currentMapData * @param mapId - * @returns {boolean|int} */ - var getCurrentMapDataIndex = function(mapId){ - var mapDataIndex = false; - - if( mapId === parseInt(mapId, 10) ){ - for(var i = 0; i < Init.currentMapData.length; i++){ - if(Init.currentMapData[i].config.id === mapId){ - mapDataIndex = i; - break; - } - } - } - - return mapDataIndex; + let deleteCurrentMapData = (mapId) => { + Init.currentMapData = Init.currentMapData.filter((mapData) => { + return (mapData.config.id !== mapId); + }); }; - /** * set currentUserData as "global" variable * this function should be called continuously after data change * to keep the data always up2data * @param userData */ - var setCurrentUserData = function(userData){ + let setCurrentUserData = function(userData){ Init.currentUserData = userData; // check if function is available @@ -1587,23 +1725,13 @@ define([ return getCurrentUserData(); }; - /** - * get currentUserData from "global" variable - * @returns {*} - */ - var getCurrentUserData = function(){ - return Init.currentUserData; - }; - /** * get the current log data for the current user character * @returns {boolean} */ - var getCurrentCharacterLog = function(){ - - var characterLog = false; - - var currentUserData = getCurrentUserData(); + let getCurrentCharacterLog = function(){ + let characterLog = false; + let currentUserData = getCurrentUserData(); if( currentUserData && @@ -1621,13 +1749,13 @@ define([ * @param option * @returns {boolean} */ - var getCurrentUserInfo = function(option){ - var currentUserData = getCurrentUserData(); - var userInfo = false; + let getCurrentUserInfo = function(option){ + let currentUserData = getCurrentUserData(); + let userInfo = false; if(currentUserData){ // user data is set -> user data will be set AFTER the main init request! - var characterData = currentUserData.character; + let characterData = currentUserData.character; if(characterData){ if( @@ -1655,8 +1783,8 @@ define([ * @param systemData * @param type */ - var setDestination = function(systemData, type){ - var description = ''; + let setDestination = function(systemData, type){ + let description = ''; switch(type){ case 'set_destination': description = 'Set destination'; @@ -1689,7 +1817,7 @@ define([ responseData.systemData && responseData.systemData.length > 0 ){ - for (var j = 0; j < responseData.systemData.length; j++) { + for (let j = 0; j < responseData.systemData.length; j++) { showNotify({title: this.description, text: 'System: ' + responseData.systemData[j].name, type: 'success'}); } } @@ -1698,13 +1826,13 @@ define([ responseData.error && responseData.error.length > 0 ){ - for(var i = 0; i < responseData.error.length; i++){ + for(let i = 0; i < responseData.error.length; i++){ showNotify({title: this.description + ' error', text: 'System: ' + responseData.error[i].message, type: 'error'}); } } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; showNotify({title: jqXHR.status + ': ' + this.description, text: reason, type: 'warning'}); }); }; @@ -1713,7 +1841,7 @@ define([ * set currentSystemData as "global" variable * @param systemData */ - var setCurrentSystemData = function(systemData){ + let setCurrentSystemData = function(systemData){ Init.currentSystemData = systemData; }; @@ -1721,7 +1849,7 @@ define([ * get currentSystemData from "global" variables * @returns {*} */ - var getCurrentSystemData = function(){ + let getCurrentSystemData = function(){ return Init.currentSystemData; }; @@ -1730,8 +1858,8 @@ define([ * -> system data where current user is located * @returns {{id: *, name: *}} */ - var getCurrentLocationData = function(){ - var currentLocationLink = $('#' + config.headCurrentLocationId).find('a'); + let getCurrentLocationData = function(){ + let currentLocationLink = $('#' + config.headCurrentLocationId).find('a'); return { id: currentLocationLink.data('systemId'), name: currentLocationLink.data('systemName') @@ -1742,7 +1870,7 @@ define([ * get all "open" dialog elements * @returns {*|jQuery} */ - var getOpenDialogs = function(){ + let getOpenDialogs = function(){ return $('.' + config.dialogClass).filter(':visible'); }; @@ -1751,10 +1879,10 @@ define([ * @param price * @returns {string} */ - var formatPrice = function(price){ + let formatPrice = function(price){ price = Number( price ).toFixed(2); - var parts = price.toString().split('.'); + let parts = price.toString().split('.'); price = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',') + (parts[1] ? '.' + parts[1] : ''); return price + ' ISK'; @@ -1764,7 +1892,7 @@ define([ * get localForage instance (singleton) for offline client site storage * @returns {localforage} */ - var getLocalStorage = function(){ + let getLocalStorage = function(){ if(localStorage === undefined){ localStorage = localforage.createInstance({ driver: [localforage.INDEXEDDB, localforage.WEBSQL, localforage.LOCALSTORAGE], @@ -1779,7 +1907,7 @@ define([ * @param date * @returns {Date} */ - var createDateAsUTC = function(date) { + let createDateAsUTC = function(date) { return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); }; @@ -1788,7 +1916,7 @@ define([ * @param date * @returns {Date} */ - var convertDateToUTC = function(date) { + let convertDateToUTC = function(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }; @@ -1797,9 +1925,9 @@ define([ * @param date * @returns {string} */ - var convertDateToString = function(date){ - var dateString = ('0'+ (date.getMonth() + 1 )).slice(-2) + '/' + ('0'+date.getDate()).slice(-2) + '/' + date.getFullYear(); - var timeString = ('0' + date.getHours()).slice(-2) + ':' + ('0'+date.getMinutes()).slice(-2); + let convertDateToString = function(date){ + let dateString = ('0'+ (date.getMonth() + 1 )).slice(-2) + '/' + ('0'+date.getDate()).slice(-2) + '/' + date.getFullYear(); + let timeString = ('0' + date.getHours()).slice(-2) + ':' + ('0'+date.getMinutes()).slice(-2); return dateString + ' ' + timeString; }; @@ -1808,11 +1936,11 @@ define([ * -> www.pathfinder.com/pathfinder/ -> /pathfinder * @returns {string|string} */ - var getDocumentPath = function(){ - var pathname = window.location.pathname; + let getDocumentPath = function(){ + let pathname = window.location.pathname; // replace file endings - var r = /[^\/]*$/; - var path = pathname.replace(r, ''); + let r = /[^\/]*$/; + let path = pathname.replace(r, ''); return path || '/'; }; @@ -1821,8 +1949,8 @@ define([ * @param url * @param params */ - var redirect = function(url, params){ - var currentUrl = document.URL; + let redirect = function(url, params){ + let currentUrl = document.URL; if(url !== currentUrl){ if( @@ -1839,8 +1967,8 @@ define([ * send logout request * @param params */ - var logout = function(params){ - var data = {}; + let logout = function(params){ + let data = {}; if( params && params.ajaxData @@ -1858,7 +1986,7 @@ define([ redirect(data.reroute, ['logout']); } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; showNotify({title: jqXHR.status + ': logout', text: reason, type: 'error'}); }); }; @@ -1880,6 +2008,8 @@ define([ stopTabBlink: stopTabBlink, getLogInfo: getLogInfo, ajaxSetup: ajaxSetup, + setSyncStatus: setSyncStatus, + getSyncType: getSyncType, isXHRAborted: isXHRAborted, getMapModule: getMapModule, getSystemEffectData: getSystemEffectData, @@ -1898,6 +2028,8 @@ define([ setCurrentMapData: setCurrentMapData, getCurrentMapData: getCurrentMapData, getCurrentMapDataIndex: getCurrentMapDataIndex, + updateCurrentMapData: updateCurrentMapData, + deleteCurrentMapData: deleteCurrentMapData, setCurrentUserData: setCurrentUserData, getCurrentUserData: getCurrentUserData, setCurrentSystemData: setCurrentSystemData, diff --git a/js/app/worker/map.js b/js/app/worker/map.js new file mode 100644 index 00000000..bd524ff7 --- /dev/null +++ b/js/app/worker/map.js @@ -0,0 +1,162 @@ +'use strict'; + +// "fake" window object will contain "MsgWorker" after import +let window = {}; // jshint ignore:line + +// import "MsgWorker" class +self.importScripts( self.name ); // jshint ignore:line + +let MsgWorker = window.MsgWorker; +let socket = null; +let ports = []; +let characterPorts = []; + +// init "WebSocket" connection ======================================================================================== +let initSocket = (uri) => { + let MsgWorkerOpen = new MsgWorker('ws:open'); + + if(socket === null){ + socket = new WebSocket(uri); + + // "WebSocket" open ----------------------------------------------------------------------- + socket.onopen = (e) => { + MsgWorkerOpen.meta({ + readyState: socket.readyState + }); + + sendToCurrentPort(MsgWorkerOpen); + }; + + // "WebSocket message --------------------------------------------------------------------- + socket.onmessage = (e) => { + let response = JSON.parse(e.data); + + let MsgWorkerSend = new MsgWorker('ws:send'); + MsgWorkerSend.task( response.task ); + MsgWorkerSend.meta({ + readyState: this.readyState, + characterIds: response.characterIds + }); + MsgWorkerSend.data( response.load ); + + broadcastPorts(MsgWorkerSend); + }; + + // "WebSocket" close ---------------------------------------------------------------------- + socket.onclose = (closeEvent) => { + let MsgWorkerClosed = new MsgWorker('ws:closed'); + MsgWorkerClosed.meta({ + readyState: socket.readyState, + code: closeEvent.code, + reason: closeEvent.reason, + wasClean: closeEvent.wasClean + }); + + broadcastPorts(MsgWorkerClosed); + socket = null; // reset WebSocket + }; + + // "WebSocket" error ---------------------------------------------------------------------- + socket.onerror = (e) => { + let MsgWorkerError = new MsgWorker('ws:error'); + MsgWorkerError.meta({ + readyState: socket.readyState + }); + + sendToCurrentPort(MsgWorkerError); + }; + }else{ + // socket still open + MsgWorkerOpen.meta({ + readyState: socket.readyState + }); + sendToCurrentPort(MsgWorkerOpen); + } +}; + +// send message to port(s) ============================================================================================ +let sendToCurrentPort = (load) => { + ports[ports.length - 1].postMessage(load); +}; + +let broadcastPorts = (load) => { + // default: sent to all ports + let sentToPorts = ports; + + // check if send() is limited to some ports + let meta = load.meta(); + if( + meta && + meta.characterIds && + meta.characterIds !== 'undefined' && + meta.characterIds instanceof Array + ){ + // ... get ports for characterIds + sentToPorts = getPortsByCharacterIds(meta.characterIds); + } + + for (let i = 0; i < sentToPorts.length; i++) { + sentToPorts[i].postMessage(load); + } +}; + +// port functions ===================================================================================================== +let addPort = (port, characterId) => { + characterId = parseInt(characterId); + + if(characterId > 0){ + characterPorts.push({ + characterId: characterId, + port: port + }); + }else{ + ports.push(port); + } +}; + +let getPortsByCharacterIds = (characterIds) => { + let ports = []; + + for(let i = 0; i < characterPorts.length; i++){ + for(let j = 0; j < characterIds.length; j++){ + if(characterPorts[i].characterId === characterIds[j]){ + ports.push(characterPorts[i].port); + } + } + } + + return ports; +}; + +// "SharedWorker" connection ========================================================================================== +self.addEventListener('connect', (event) => { // jshint ignore:line + let port = event.ports[0]; + addPort(port); + + port.addEventListener('message', (e) => { + let MsgWorkerMessage = e.data; + Object.setPrototypeOf(MsgWorkerMessage, MsgWorker.prototype); + + switch(MsgWorkerMessage.command){ + case 'ws:init': + let data = MsgWorkerMessage.data(); + // add character specific port (for broadcast) to individual ports (tabs) + addPort(port, data.characterId); + initSocket(data.uri); + break; + case 'ws:send': + let MsgSocket = { + task: MsgWorkerMessage.task(), + load: MsgWorkerMessage.data() + }; + + socket.send(JSON.stringify(MsgSocket)); + break; + case 'ws:close': + // closeSocket(); + break; + } + }, false); + + port.start(); +}, false); \ No newline at end of file diff --git a/js/app/worker/message.js b/js/app/worker/message.js new file mode 100644 index 00000000..492eecc1 --- /dev/null +++ b/js/app/worker/message.js @@ -0,0 +1,55 @@ +window.MsgWorker = class MessageWorker { + + constructor(cmd){ + /** + * "command" type (identifies this message) + */ + this.cmd = cmd; + + /** + * "task" what should be done with this message + * @type {string} + */ + this.msgTask = ''; + + /** + * "message" meta data (e.g. error/close data from WebSocket + * @type {null} + */ + this.msgMeta = null; + + /** + * "message" body (load) + * @type {null} + */ + this.msgBody = null; + } + + get command(){ + return this.cmd; + } + + task(task) { + if(task){ + this.msgTask = task; + } + + return this.msgTask; + } + + meta(metaData) { + if(metaData){ + this.msgMeta = metaData; + } + + return this.msgMeta; + } + + data(data) { + if(data){ + this.msgBody = data; + } + + return this.msgBody; + } +}; \ No newline at end of file diff --git a/js/lib/velocity.min.js b/js/lib/velocity.min.js index 10036035..1521826c 100644 --- a/js/lib/velocity.min.js +++ b/js/lib/velocity.min.js @@ -1,4 +1,4 @@ -/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */ +/*! VelocityJS.org (1.4.1). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */ /*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */ -!function(a){function b(a){var b=a.length,d=c.type(a);return"function"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[i]||{},i++),"object"!=typeof h&&"function"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,"string"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||"fx")+"queue";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||"fx";var e=c.queue(d,b),f=e.shift();"inprogress"===f&&(f=e.shift()),f&&("fx"===b&&e.unshift("inprogress"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error("Not a DOM node.")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&"html"===!a.nodeType.toLowerCase&&"static"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando="velocity"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h="Boolean Number String Function Array Date RegExp Object Error".split(" "),i=0;ie;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&"none"!==j.display){if("flex"===j.display){var A=["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex"];m.each(A,function(a,b){v.setPropertyValue(y,"display",b)})}v.setPropertyValue(y,"display",j.display)}j.visibility!==d&&"hidden"!==j.visibility&&v.setPropertyValue(y,"visibility",j.visibility);for(var B in w)if("element"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,"tween"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?"":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G]("extract",null,I[1]):I[1]),"transform"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d="(0px, 0px, 0px)",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&"none"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&"hidden"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||("none"===f.display&&v.setPropertyValue(l,"display",f.display),"hidden"===f.visibility&&v.setPropertyValue(l,"visibility",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp("^\\("+c+"[^.]").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,"velocity-animating")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&"%"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,"reverse",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement("div");if(b.innerHTML="",b.getElementsByTagName("span").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return"object"==typeof a&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||"object"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s="swing",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,"velocity",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft="pageXOffset",t.State.scrollPropertyTop="pageYOffset"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft="scrollLeft",t.State.scrollPropertyTop="scrollTop");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"]},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a=n)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":return c;case"inject":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;ae&&(e=1),f=!/(\d)$/i.test(e);break;case"skew":f=!/(deg|\d)$/i.test(e);break;case"rotate":f=!/(deg|\d)$/i.test(e)}return f||(g(c).transformCache[b]="("+e+")"),g(c).transformCache[b]}}}();for(var a=0;a=n||3!==f.split(" ").length||(f+=" 1"),f;case"inject":return 8>=n?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(8>=n?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?"deg":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?"":"px"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?"inline":/^(li)$/i.test(b)?"list-item":/^(tr)$/i.test(b)?"table-row":/^(table)$/i.test(b)?"table":/^(tbody)$/i.test(b)?"table-row-group":"block"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?" ":"")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp("(^|\\s)"+b.split(" ").join("|")+"(\\s|$)","gi")," ")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,"display","none")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,"display")&&(j=!0,v.setPropertyValue(a,"display",v.Values.getDisplayType(a))),!f){if("height"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,"borderTopWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderBottomWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingTop"))||0)-(parseFloat(v.getPropertyValue(a,"paddingBottom"))||0);return e(),k}if("width"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,"borderLeftWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderRightWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingLeft"))||0)-(parseFloat(v.getPropertyValue(a,"paddingRight"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),"borderColor"===c&&(c="borderTopColor"),i=9===n&&"filter"===c?o.getPropertyValue(c):o[c],(""===i||null===i)&&(i=a.style[c]),e()}if("auto"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,"position");("fixed"===p||"absolute"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+"px")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k]("extract",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c]("name",a),"transform"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c]("extract",a,o)}if(!/^[\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&"transform"===v.Normalizations.registered[c]("name",a))v.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c]("inject",a,d),c=v.Normalizations.registered[c]("name",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c="";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b("translateX"),b("translateY")],skewX:[b("skewX")],skewY:[b("skewY")],scale:1!==b("scale")?[b("scale"),b("scale")]:[b("scaleX"),b("scaleY")],rotate:[b("rotateZ"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),d[a]&&(c+=a+"("+d[a].join(" ")+") ",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],"transformPerspective"===b?(f=e,!0):(9===n&&"rotateZ"===b&&(b="rotate"),void(c+=b+e+" "))}),f&&(c="perspective"+f+" "+c)}v.setPropertyValue(a,"transform",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);"transform"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(){function a(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function l(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=v.Values.getUnitType(a)),[d,c]}function n(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,"position"),fontSize:v.getPropertyValue(f,"fontSize")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");t.init(j),a.myParent.appendChild(j),m.each(["overflow","overflowX","overflowY"],function(a,b){t.CSS.setPropertyValue(j,b,"hidden")}),t.CSS.setPropertyValue(j,"position",a.position),t.CSS.setPropertyValue(j,"fontSize",a.fontSize),t.CSS.setPropertyValue(j,"boxSizing","content-box"),m.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){t.CSS.setPropertyValue(j,b,h+"%")}),t.CSS.setPropertyValue(j,"paddingLeft",h+"em"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,"width",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,"height",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,"paddingLeft"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,"fontSize"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log("Unit ratios: "+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(r){setTimeout(function(){throw r},1)}if("scroll"===C){var u,w,z,A=/^x$/i.test(h.axis)?"Left":"Top",D=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,u=h.container["scroll"+A],z=u+m(f).position()[A.toLowerCase()]+D):h.container=null:(u=t.State.scrollAnchor[t.State["scrollProperty"+A]],w=t.State.scrollAnchor[t.State["scrollProperty"+("Left"===A?"Top":"Left")]],z=m(f).offset()[A.toLowerCase()]+D),i={scroll:{rootPropertyValue:!1,startValue:u,currentValue:u,endValue:z,unitType:"",easing:h.easing,scrollData:{container:h.container,direction:A,alternateValue:w}},element:f},t.debug&&console.log("tweensContainer (scroll): ",i.scroll,f)}else if("reverse"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);"none"===g(f).opts.display&&(g(f).opts.display="auto"),"hidden"===g(f).opts.visibility&&(g(f).opts.visibility="visible"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var E=m.extend(!0,{},g(f).tweensContainer);for(var F in E)if("element"!==F){var G=E[F].startValue;E[F].startValue=E[F].currentValue=E[F].endValue,E[F].endValue=G,p.isEmptyObject(s)||(E[F].easing=h.easing),t.debug&&console.log("reverse tweensContainer ("+F+"): "+JSON.stringify(E[F]),f)}i=E}else if("start"===C){var E;g(f).tweensContainer&&g(f).isAnimating===!0&&(E=g(f).tweensContainer),m.each(q,function(b,c){if(RegExp("^"+v.Lists.colors.join("$|^")+"$").test(b)){var e=a(c,!0),f=e[0],g=e[1],h=e[2];if(v.RegEx.isHex.test(f)){for(var i=["Red","Green","Blue"],j=v.Values.hexToRgb(f),k=h?v.Values.hexToRgb(h):d,l=0;lL;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,"reverse",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener("visibilitychange",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each(["Down","Up"],function(a,b){t.Redirects["slide"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:"",marginTop:"",marginBottom:"",paddingTop:"",paddingBottom:""},n={};i.display===d&&(i.display="Down"===b?"inline"===t.CSS.Values.getDisplayType(a)?"inline-block":"block":"none"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]="Down"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow="hidden"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each(["In","Out"],function(a,b){t.Redirects["fade"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:"In"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display="In"===b?"auto":"none"),t(this,j,i)}}),t}(window.jQuery||window.Zepto||window,window,document)}); +!function(a){"use strict";function b(a){var b=a.length,d=c.type(a);return"function"!==d&&!c.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a))}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return a&&a===a.window},c.type=function(a){return a?"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a:a+""},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;f0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0===i?h:m(b,c,c+u)}function o(){y=!0,a===c&&d===e||l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;w<4;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function l(a,b){var c=a;return s.isString(a)?w.Easings[a]||(c=!1):c=s.isArray(a)&&1===a.length?j.apply(null,a):s.isArray(a)&&2===a.length?x.apply(null,a.concat([b])):!(!s.isArray(a)||4!==a.length)&&k.apply(null,a),c===!1&&(c=w.Easings[w.defaults.easing]?w.defaults.easing:v),c}function m(a){if(a){var b=w.timestamp&&a!==!0?a:r.now(),c=w.State.calls.length;c>1e4&&(w.State.calls=e(w.State.calls),c=w.State.calls.length);for(var f=0;f4;a--){var b=c.createElement("div");if(b.innerHTML="",b.getElementsByTagName("span").length)return b=null,a}return d}(),q=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),r=function(){var a=b.performance||{};if(!a.hasOwnProperty("now")){var c=a.timing&&a.timing.domComplete?a.timing.domComplete:(new Date).getTime();a.now=function(){return(new Date).getTime()-c}}return a}(),s={isNumber:function(a){return"number"==typeof a},isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isWrapped:function(a){return a&&s.isNumber(a.length)&&!s.isString(a)&&!s.isFunction(a)&&!s.isNode(a)&&(0===a.length||s.isNode(a[0]))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}},t=!1;if(a.fn&&a.fn.jquery?(o=a,t=!0):o=b.Velocity.Utilities,p<=8&&!t)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(p<=7)return void(jQuery.fn.velocity=jQuery.fn.animate);var u=400,v="swing",w={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[],delayedElements:{count:0}},CSS:{},Utilities:o,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:u,easing:v,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0,promiseRejectEmpty:!0},init:function(a){o.data(a,"velocity",{isSVG:s.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:4,patch:1},debug:!1,timestamp:!0,pauseAll:function(a){var b=(new Date).getTime();o.each(w.State.calls,function(b,c){if(c){if(a!==d&&(c[2].queue!==a||c[2].queue===!1))return!0;c[5]={resume:!1}}}),o.each(w.State.delayedElements,function(a,c){c&&h(c,b)})},resumeAll:function(a){var b=(new Date).getTime();o.each(w.State.calls,function(b,c){if(c){if(a!==d&&(c[2].queue!==a||c[2].queue===!1))return!0;c[5]&&(c[5].resume=!0)}}),o.each(w.State.delayedElements,function(a,c){c&&i(c,b)})}};b.pageYOffset!==d?(w.State.scrollAnchor=b,w.State.scrollPropertyLeft="pageXOffset",w.State.scrollPropertyTop="pageYOffset"):(w.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,w.State.scrollPropertyLeft="scrollLeft",w.State.scrollPropertyTop="scrollTop");var x=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();w.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},o.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){w.Easings[b[0]]=k.apply(null,b[1])});var y=w.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a=0?c:""},fixColors:function(a){return a.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g,function(a,b,c){return y.Lists.colorNames.hasOwnProperty(c)?(b?b:"rgba(")+y.Lists.colorNames[c]+(b?"":",1)"):b+c})},cleanRootPropertyValue:function(a,b){return y.RegEx.valueUnwrap.test(b)&&(b=b.match(y.RegEx.valueUnwrap)[1]),y.Values.isCSSNullValue(b)&&(b=y.Hooks.templates[a][1]),b},extractValue:function(a,b){var c=y.Hooks.registered[a];if(c){var d=c[0],e=c[1];return b=y.Hooks.cleanRootPropertyValue(d,b),b.toString().match(y.RegEx.valueSplit)[e]}return b},injectValue:function(a,b,c){var d=y.Hooks.registered[a];if(d){var e,f,g=d[0],h=d[1];return c=y.Hooks.cleanRootPropertyValue(g,c),e=c.toString().match(y.RegEx.valueSplit),e[h]=b,f=e.join(" ")}return c}},Normalizations:{registered:{clip:function(a,b,c){switch(a){case"name":return"clip";case"extract":var d;return y.RegEx.wrappedValueAlreadyExtracted.test(c)?d=c:(d=c.toString().match(y.RegEx.valueUnwrap),d=d?d[1].replace(/,(\s+)?/g," "):c),d;case"inject":return"rect("+c+")"}},blur:function(a,b,c){switch(a){case"name":return w.State.isFirefox?"filter":"-webkit-filter";case"extract":var d=parseFloat(c);if(!d&&0!==d){var e=c.toString().match(/blur\(([0-9]+[A-z]+)\)/i);d=e?e[1]:0}return d;case"inject":return parseFloat(c)?"blur("+c+")":"none"}},opacity:function(a,b,c){if(p<=8)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":return c;case"inject":return c}}},register:function(){function a(a,b,c){var d="border-box"===y.getPropertyValue(b,"boxSizing").toString().toLowerCase();if(d===(c||!1)){var e,f,g=0,h="width"===a?["Left","Right"]:["Top","Bottom"],i=["padding"+h[0],"padding"+h[1],"border"+h[0]+"Width","border"+h[1]+"Width"];for(e=0;e9)||w.State.isGingerbread||(y.Lists.transformsBase=y.Lists.transformsBase.concat(y.Lists.transforms3D));for(var c=0;c8)&&3===f.split(" ").length&&(f+=" 1"),f;case"inject":return/^rgb/.test(e)?e:(p<=8?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(p<=8?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}}();y.Normalizations.registered.innerWidth=b("width",!0),y.Normalizations.registered.innerHeight=b("height",!0),y.Normalizations.registered.outerWidth=b("width"),y.Normalizations.registered.outerHeight=b("height")}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(p||w.State.isAndroid&&!w.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(w.State.prefixMatches[a])return[w.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;c=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(y.Normalizations.registered[c]&&"transform"===y.Normalizations.registered[c]("name",a))y.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(y.Hooks.registered[c]){var i=c,j=y.Hooks.getRoot(c);e=e||y.getPropertyValue(a,j),d=y.Hooks.injectValue(i,d,e),c=j}if(y.Normalizations.registered[c]&&(d=y.Normalizations.registered[c]("inject",a,d),c=y.Normalizations.registered[c]("name",a)),h=y.Names.prefixCheck(c)[0],p<=8)try{a.style[h]=d}catch(k){w.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else{var l=g(a);l&&l.isSVG&&y.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d}w.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){var b="",c=g(a);if((p||w.State.isAndroid&&!w.State.isChrome)&&c&&c.isSVG){var d=function(b){return parseFloat(y.getPropertyValue(a,b))},e={translate:[d("translateX"),d("translateY")],skewX:[d("skewX")],skewY:[d("skewY")],scale:1!==d("scale")?[d("scale"),d("scale")]:[d("scaleX"),d("scaleY")],rotate:[d("rotateZ"),0,0]};o.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),e[a]&&(b+=a+"("+e[a].join(" ")+") ",delete e[a])})}else{var f,h;o.each(g(a).transformCache,function(c){return f=g(a).transformCache[c],"transformPerspective"===c?(h=f,!0):(9===p&&"rotateZ"===c&&(c="rotate"),void(b+=c+f+" "))}),h&&(b="perspective"+h+" "+b)}y.setPropertyValue(a,"transform",b)}};y.Hooks.register(),y.Normalizations.register(),w.hook=function(a,b,c){var e;return a=f(a),o.each(a,function(a,f){if(g(f)===d&&w.init(f),c===d)e===d&&(e=y.getPropertyValue(f,b));else{var h=y.setPropertyValue(f,b,c);"transform"===h[0]&&w.CSS.flushTransformCache(f),e=h}}),e};var z=function(){function a(){return k?A.promise||null:p}function e(a,e){function f(f){var k,n;if(i.begin&&0===C)try{i.begin.call(r,r)}catch(p){setTimeout(function(){throw p},1)}if("scroll"===F){var q,u,x,z=/^x$/i.test(i.axis)?"Left":"Top",D=parseFloat(i.offset)||0;i.container?s.isWrapped(i.container)||s.isNode(i.container)?(i.container=i.container[0]||i.container,q=i.container["scroll"+z],x=q+o(a).position()[z.toLowerCase()]+D):i.container=null:(q=w.State.scrollAnchor[w.State["scrollProperty"+z]],u=w.State.scrollAnchor[w.State["scrollProperty"+("Left"===z?"Top":"Left")]],x=o(a).offset()[z.toLowerCase()]+D),j={scroll:{rootPropertyValue:!1,startValue:q,currentValue:q,endValue:x,unitType:"",easing:i.easing,scrollData:{container:i.container,direction:z,alternateValue:u}},element:a},w.debug&&console.log("tweensContainer (scroll): ",j.scroll,a)}else if("reverse"===F){if(k=g(a),!k)return;if(!k.tweensContainer)return void o.dequeue(a,i.queue);"none"===k.opts.display&&(k.opts.display="auto"),"hidden"===k.opts.visibility&&(k.opts.visibility="visible"),k.opts.loop=!1,k.opts.begin=null,k.opts.complete=null,v.easing||delete i.easing,v.duration||delete i.duration,i=o.extend({},k.opts,i),n=o.extend(!0,{},k?k.tweensContainer:null);for(var E in n)if(n.hasOwnProperty(E)&&"element"!==E){var G=n[E].startValue;n[E].startValue=n[E].currentValue=n[E].endValue,n[E].endValue=G,s.isEmptyObject(v)||(n[E].easing=i.easing),w.debug&&console.log("reverse tweensContainer ("+E+"): "+JSON.stringify(n[E]),a)}j=n}else if("start"===F){k=g(a),k&&k.tweensContainer&&k.isAnimating===!0&&(n=k.tweensContainer);var H=function(b,c){var d,f,g;return s.isFunction(b)&&(b=b.call(a,e,B)),s.isArray(b)?(d=b[0],!s.isArray(b[1])&&/^[\d-]/.test(b[1])||s.isFunction(b[1])||y.RegEx.isHex.test(b[1])?g=b[1]:s.isString(b[1])&&!y.RegEx.isHex.test(b[1])&&w.Easings[b[1]]||s.isArray(b[1])?(f=c?b[1]:l(b[1],i.duration),g=b[2]):g=b[1]||b[2]):d=b,c||(f=f||i.easing),s.isFunction(d)&&(d=d.call(a,e,B)),s.isFunction(g)&&(g=g.call(a,e,B)),[d||0,f,g]},I=function(e,f){var g,l=y.Hooks.getRoot(e),m=!1,p=f[0],q=f[1],r=f[2];if(!(k&&k.isSVG||"tween"===l||y.Names.prefixCheck(l)[1]!==!1||y.Normalizations.registered[l]!==d))return void(w.debug&&console.log("Skipping ["+l+"] due to a lack of browser support.")); + (i.display!==d&&null!==i.display&&"none"!==i.display||i.visibility!==d&&"hidden"!==i.visibility)&&/opacity|filter/.test(e)&&!r&&0!==p&&(r=0),i._cacheValues&&n&&n[e]?(r===d&&(r=n[e].endValue+n[e].unitType),m=k.rootPropertyValueCache[l]):y.Hooks.registered[e]?r===d?(m=y.getPropertyValue(a,l),r=y.getPropertyValue(a,e,m)):m=y.Hooks.templates[l][1]:r===d&&(r=y.getPropertyValue(a,e));var t,u,v,x=!1,z=function(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=y.Values.getUnitType(a)),[d,c]};if(r!==p&&s.isString(r)&&s.isString(p)){g="";var A=0,B=0,C=[],D=[],E=0,F=0,G=0;for(r=y.Hooks.fixColors(r),p=y.Hooks.fixColors(p);A=4&&"("===H?E++:(E&&E<5||E>=4&&")"===H&&--E<5)&&(E=0),0===F&&"r"===H||1===F&&"g"===H||2===F&&"b"===H||3===F&&"a"===H||F>=3&&"("===H?(3===F&&"a"===H&&(G=1),F++):G&&","===H?++G>3&&(F=G=0):(G&&F<(G?5:4)||F>=(G?4:3)&&")"===H&&--F<(G?5:4))&&(F=G=0)}}A===r.length&&B===p.length||(w.debug&&console.error('Trying to pattern match mis-matched strings ["'+p+'", "'+r+'"]'),g=d),g&&(C.length?(w.debug&&console.log('Pattern found "'+g+'" -> ',C,D,"["+r+","+p+"]"),r=C,p=D,u=v=""):g=d)}g||(t=z(e,r),r=t[0],v=t[1],t=z(e,p),p=t[0].replace(/^([+-\/*])=/,function(a,b){return x=b,""}),u=t[1],r=parseFloat(r)||0,p=parseFloat(p)||0,"%"===u&&(/^(fontSize|lineHeight)$/.test(e)?(p/=100,u="em"):/^scale/.test(e)?(p/=100,u=""):/(Red|Green|Blue)$/i.test(e)&&(p=p/100*255,u="")));var S=function(){var d={myParent:a.parentNode||c.body,position:y.getPropertyValue(a,"position"),fontSize:y.getPropertyValue(a,"fontSize")},e=d.position===L.lastPosition&&d.myParent===L.lastParent,f=d.fontSize===L.lastFontSize;L.lastParent=d.myParent,L.lastPosition=d.position,L.lastFontSize=d.fontSize;var g=100,h={};if(f&&e)h.emToPx=L.lastEmToPx,h.percentToPxWidth=L.lastPercentToPxWidth,h.percentToPxHeight=L.lastPercentToPxHeight;else{var i=k&&k.isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");w.init(i),d.myParent.appendChild(i),o.each(["overflow","overflowX","overflowY"],function(a,b){w.CSS.setPropertyValue(i,b,"hidden")}),w.CSS.setPropertyValue(i,"position",d.position),w.CSS.setPropertyValue(i,"fontSize",d.fontSize),w.CSS.setPropertyValue(i,"boxSizing","content-box"),o.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){w.CSS.setPropertyValue(i,b,g+"%")}),w.CSS.setPropertyValue(i,"paddingLeft",g+"em"),h.percentToPxWidth=L.lastPercentToPxWidth=(parseFloat(y.getPropertyValue(i,"width",null,!0))||1)/g,h.percentToPxHeight=L.lastPercentToPxHeight=(parseFloat(y.getPropertyValue(i,"height",null,!0))||1)/g,h.emToPx=L.lastEmToPx=(parseFloat(y.getPropertyValue(i,"paddingLeft"))||1)/g,d.myParent.removeChild(i)}return null===L.remToPx&&(L.remToPx=parseFloat(y.getPropertyValue(c.body,"fontSize"))||16),null===L.vwToPx&&(L.vwToPx=parseFloat(b.innerWidth)/100,L.vhToPx=parseFloat(b.innerHeight)/100),h.remToPx=L.remToPx,h.vwToPx=L.vwToPx,h.vhToPx=L.vhToPx,w.debug>=1&&console.log("Unit ratios: "+JSON.stringify(h),a),h};if(/[\/*]/.test(x))u=v;else if(v!==u&&0!==r)if(0===p)u=v;else{h=h||S();var T=/margin|padding|left|right|width|text|word|letter/i.test(e)||/X$/.test(e)||"x"===e?"x":"y";switch(v){case"%":r*="x"===T?h.percentToPxWidth:h.percentToPxHeight;break;case"px":break;default:r*=h[v+"ToPx"]}switch(u){case"%":r*=1/("x"===T?h.percentToPxWidth:h.percentToPxHeight);break;case"px":break;default:r*=1/h[u+"ToPx"]}}switch(x){case"+":p=r+p;break;case"-":p=r-p;break;case"*":p=r*p;break;case"/":p=r/p}j[e]={rootPropertyValue:m,startValue:r,currentValue:r,endValue:p,unitType:u,easing:q},g&&(j[e].pattern=g),w.debug&&console.log("tweensContainer ("+e+"): "+JSON.stringify(j[e]),a)};for(var J in t)if(t.hasOwnProperty(J)){var K=y.Names.camelCase(J),N=H(t[J]);if(y.Lists.colors.indexOf(K)>=0){var O=N[0],P=N[1],Q=N[2];if(y.RegEx.isHex.test(O)){for(var R=["Red","Green","Blue"],S=y.Values.hexToRgb(O),T=Q?y.Values.hexToRgb(Q):d,U=0;UparseFloat(e[1])):!1}if(!t.Velocity||!t.Velocity.Utilities)return void(a.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting."));var i=t.Velocity,$=i.Utilities,s=i.version,o={major:1,minor:1,patch:0};if(n(o,s)){var l="Velocity UI Pack: You need to update Velocity (jquery.velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(l),new Error(l)}i.RegisterEffect=i.RegisterUI=function(t,a){function e(t,a,e,r){var n=0,s;$.each(t.nodeType?[t]:t,function(t,a){r&&(e+=t*r),s=a.parentNode,$.each(["height","paddingTop","paddingBottom","marginTop","marginBottom"],function(t,e){n+=parseFloat(i.CSS.getPropertyValue(a,e))})}),i.animate(s,{height:("In"===a?"+":"-")+"="+n},{queue:!1,easing:"ease-in-out",duration:e*("In"===a?.6:1)})}return i.Redirects[t]=function(n,s,o,l,c,u){function f(){s.display!==r&&"none"!==s.display||!/Out$/.test(t)||$.each(c.nodeType?[c]:c,function(t,a){i.CSS.setPropertyValue(a,"display","none")}),s.complete&&s.complete.call(c,c),u&&u.resolver(c||n)}var p=o===l-1;a.defaultDuration="function"==typeof a.defaultDuration?a.defaultDuration.call(c,c):parseFloat(a.defaultDuration);for(var d=0;d1&&($.each(a.reverse(),function(t,e){var r=a[t+1];if(r){var n=e.o||e.options,s=r.o||r.options,o=n&&n.sequenceQueue===!1?"begin":"complete",l=s&&s[o],c={};c[o]=function(){var t=r.e||r.elements,a=t.nodeType?[t]:t;l&&l.call(a,a),i(e)},r.o?r.o=$.extend({},s,c):r.options=$.extend({},s,c)}}),a.reverse()),i(a[0])}}(window.jQuery||window.Zepto||window,window,document)}); \ No newline at end of file +!function(a){"use strict";"function"==typeof require&&"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(["velocity"],a):a()}(function(){"use strict";return function(a,b,c,d){function e(a,b){var c=[];return!(!a||!b)&&(g.each([a,b],function(a,b){var d=[];g.each(b,function(a,b){for(;b.toString().length<5;)b="0"+b;d.push(b)}),c.push(d.join(""))}),parseFloat(c[0])>parseFloat(c[1]))}var f=a.Velocity;if(!f||!f.Utilities)return void(b.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting."));var g=f.Utilities,h=f.version,i={major:1,minor:1,patch:0};if(e(i,h)){var j="Velocity UI Pack: You need to update Velocity (velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(j),new Error(j)}f.RegisterEffect=f.RegisterUI=function(a,b){function c(a,b,c,d){var e,h=0;g.each(a.nodeType?[a]:a,function(a,b){d&&(c+=a*d),e=b.parentNode;var i=["height","paddingTop","paddingBottom","marginTop","marginBottom"];"border-box"===f.CSS.getPropertyValue(b,"boxSizing").toString().toLowerCase()&&(i=["height"]),g.each(i,function(a,c){h+=parseFloat(f.CSS.getPropertyValue(b,c))})}),f.animate(e,{height:("In"===b?"+":"-")+"="+h},{queue:!1,easing:"ease-in-out",duration:c*("In"===b?.6:1)})}return f.Redirects[a]=function(e,h,i,j,k,l,m){var n=i===j-1,o=0;m=m||b.loop,"function"==typeof b.defaultDuration?b.defaultDuration=b.defaultDuration.call(k,k):b.defaultDuration=parseFloat(b.defaultDuration);for(var p=0;p=1?0:b.calls.length?(1-o)/b.calls.length:1;for(p=0;p1&&(g.each(b.reverse(),function(a,c){var d=b[a+1];if(d){var e=c.o||c.options,h=d.o||d.options,i=e&&e.sequenceQueue===!1?"begin":"complete",j=h&&h[i],k={};k[i]=function(){var a=d.e||d.elements,b=a.nodeType?[a]:a;j&&j.call(b,b),f(c)},d.o?d.o=g.extend({},h,k):d.options=g.extend({},h,k)}}),b.reverse()),f(b[0])}}(window.jQuery||window.Zepto||window,window,window?window.document:void 0)}); \ No newline at end of file diff --git a/public/css/pathfinder.css b/public/css/pathfinder.css index b490bfb4..87aa52f2 100644 --- a/public/css/pathfinder.css +++ b/public/css/pathfinder.css @@ -38,4 +38,4 @@ * ======================================================================== * Copyright 2014 Min Hur, The New York Times Company * Licensed under MIT - * ======================================================================== */label.checkbox .toggle,label.checkbox.inline .toggle{margin-left:-20px;margin-right:5px}.toggle{min-width:40px;height:20px;position:relative;overflow:hidden}.toggle input[type="checkbox"]{display:none}.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left 0.35s;-webkit-transition:left 0.35s;-moz-user-select:none;-webkit-user-select:none}.toggle.off .toggle-group{left:-100%}.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}.toggle-handle{position:relative;margin:0 auto;padding-top:0px;padding-bottom:0px;height:100%;width:0px;border-width:0 1px}.toggle-handle.btn-mini{top:-2px}.toggle.btn{min-width:30px}.toggle-on.btn{padding-right:24px}.toggle-off.btn{padding-left:24px}.toggle.btn-large{min-width:40px}.toggle-on.btn-large{padding-right:35px}.toggle-off.btn-large{padding-left:35px}.toggle.btn-small{min-width:25px}.toggle-on.btn-small{padding-right:20px}.toggle-off.btn-small{padding-left:20px}.toggle.btn-mini{min-width:20px}.toggle-on.btn-mini{padding-right:12px}.toggle-off.btn-mini{padding-left:12px}.checkbox{padding-left:20px}.checkbox label{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.checkbox label::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:3px;background-color:#313335;-webkit-transition:border 0.15s ease-in-out,color 0.15s ease-in-out;transition:border 0.15s ease-in-out,color 0.15s ease-in-out}.checkbox label::after{display:inline-block;position:absolute;width:16px;height:16px;left:0;top:0;margin-left:-20px;padding-left:3px;padding-top:1px;font-size:11px;color:#adadad}.checkbox input[type="checkbox"],.checkbox input[type="radio"]{opacity:0;z-index:1}.checkbox input[type="checkbox"]:focus+label::before,.checkbox input[type="radio"]:focus+label::before{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}.checkbox input[type="checkbox"]:checked+label::after,.checkbox input[type="radio"]:checked+label::after{font-family:"FontAwesome";content:""}.checkbox input[type="checkbox"]:indeterminate+label::after,.checkbox input[type="radio"]:indeterminate+label::after{display:block;content:"";width:10px;height:3px;background-color:#555555;border-radius:2px;margin-left:-16.5px;margin-top:7px}.checkbox input[type="checkbox"]:disabled+label,.checkbox input[type="radio"]:disabled+label{opacity:0.65}.checkbox input[type="checkbox"]:disabled+label::before,.checkbox input[type="radio"]:disabled+label::before{background-color:#adadad;cursor:not-allowed}.checkbox.checkbox-circle label::before{border-radius:50%}.checkbox.checkbox-inline{margin-top:0}.checkbox-primary input[type="checkbox"]:checked+label::before,.checkbox-primary input[type="radio"]:checked+label::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:checked+label::after,.checkbox-primary input[type="radio"]:checked+label::after{color:#fff}.checkbox-danger input[type="checkbox"]:checked+label::before,.checkbox-danger input[type="radio"]:checked+label::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:checked+label::after,.checkbox-danger input[type="radio"]:checked+label::after{color:#fff}.checkbox-info input[type="checkbox"]:checked+label::before,.checkbox-info input[type="radio"]:checked+label::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:checked+label::after,.checkbox-info input[type="radio"]:checked+label::after{color:#fff}.checkbox-warning input[type="checkbox"]:checked+label::before,.checkbox-warning input[type="radio"]:checked+label::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:checked+label::after,.checkbox-warning input[type="radio"]:checked+label::after{color:#fff}.checkbox-success input[type="checkbox"]:checked+label::before,.checkbox-success input[type="radio"]:checked+label::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:checked+label::after,.checkbox-success input[type="radio"]:checked+label::after{color:#fff}.checkbox-primary input[type="checkbox"]:indeterminate+label::before,.checkbox-primary input[type="radio"]:indeterminate+label::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:indeterminate+label::after,.checkbox-primary input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-danger input[type="checkbox"]:indeterminate+label::before,.checkbox-danger input[type="radio"]:indeterminate+label::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:indeterminate+label::after,.checkbox-danger input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-info input[type="checkbox"]:indeterminate+label::before,.checkbox-info input[type="radio"]:indeterminate+label::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:indeterminate+label::after,.checkbox-info input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-warning input[type="checkbox"]:indeterminate+label::before,.checkbox-warning input[type="radio"]:indeterminate+label::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:indeterminate+label::after,.checkbox-warning input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-success input[type="checkbox"]:indeterminate+label::before,.checkbox-success input[type="radio"]:indeterminate+label::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:indeterminate+label::after,.checkbox-success input[type="radio"]:indeterminate+label::after{background-color:#fff}.radio{padding-left:20px}.radio label{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.radio label::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:50%;background-color:#313335;-webkit-transition:border 0.15s ease-in-out;transition:border 0.15s ease-in-out}.radio label::after{display:inline-block;position:absolute;content:" ";width:11px;height:11px;left:3px;top:3px;margin-left:-20px;border-radius:50%;background-color:#adadad;-webkit-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition:-webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);-moz-transition:-moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);-o-transition:-o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);transition:transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33)}.radio input[type="radio"]{opacity:0;z-index:1}.radio input[type="radio"]:focus+label::before{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}.radio input[type="radio"]:checked+label::after{-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1)}.radio input[type="radio"]:disabled+label{opacity:0.65}.radio input[type="radio"]:disabled+label::before{cursor:not-allowed}.radio.radio-inline{margin-top:0}.radio-primary input[type="radio"]+label::after{background-color:#375959}.radio-primary input[type="radio"]:checked+label::before{border-color:#375959}.radio-primary input[type="radio"]:checked+label::after{background-color:#375959}.radio-danger input[type="radio"]+label::after{background-color:#a52521}.radio-danger input[type="radio"]:checked+label::before{border-color:#a52521}.radio-danger input[type="radio"]:checked+label::after{background-color:#a52521}.radio-info input[type="radio"]+label::after{background-color:#316490}.radio-info input[type="radio"]:checked+label::before{border-color:#316490}.radio-info input[type="radio"]:checked+label::after{background-color:#316490}.radio-warning input[type="radio"]+label::after{background-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::before{border-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::after{background-color:#e28a0d}.radio-success input[type="radio"]+label::after{background-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::before{border-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::after{background-color:#4f9e4f}input[type="checkbox"].styled:checked+label:after,input[type="radio"].styled:checked+label:after{font-family:"FontAwesome";content:""}input[type="checkbox"] .styled:checked+label::before,input[type="radio"] .styled:checked+label::before{color:#fff}input[type="checkbox"] .styled:checked+label::after,input[type="radio"] .styled:checked+label::after{color:#fff}html{margin:0;padding:0;height:100%;position:relative}body{margin:0;padding:0;min-height:100%;direction:ltr}body.mobile-view-activated.hidden-menu{overflow-x:hidden}body.modal-open{overflow:hidden !important}a:hover,a:active,a:focus,button,button:active,button:focus,object,embed,input::-moz-focus-inner{outline:0}h1,h3,h4{margin:0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.page-title{margin:12px 0 28px}.page-title span{font-size:15px;color:#313335;display:inline-block;vertical-align:1px}label{font-weight:normal}*:focus{outline:0 !important}a,input,button{-ms-touch-action:none !important}textarea:focus,select:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{outline:0;outline:thin dotted \9;box-shadow:inset -1px 1px 5px 0 rgba(0,0,0,0.8) !important}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-xs,.form-control{border-radius:0px !important;-webkit-border-radius:0px !important;-moz-border-radius:0px !important}.input-xs{height:24px;padding:2px 10px;font-size:11px;line-height:1.5}.btn-xs,.btn-group-xs>.btn{padding:0px 2px;font-size:10px;line-height:1.3}.btn-sm,.btn-group-sm>.btn{padding:5px 8px 4px}.btn-lg,.btn-group-lg>.btn{padding:10px 16px}.no-space{margin:0}.no-space>[class*="col-"]{margin:0 !important;padding-right:0;padding-left:0}h1{letter-spacing:-1px;font-size:22px;margin:10px 0}h1 small{font-size:12px;font-weight:300;letter-spacing:-1px}h2{font-size:20px;margin:20px 0;line-height:normal}h3{display:block;font-size:17px;font-weight:400;margin:20px 0;line-height:normal}h4{line-height:normal;margin:20px 0 10px 0}h5{font-size:14px;font-weight:300;margin-top:0;margin-bottom:10px;line-height:normal}h6{font-size:13px;margin:10px 0;font-weight:bold;line-height:normal}.row-seperator-header{margin:15px 14px 20px;border-bottom:none;display:block;color:#303133;font-size:20px;font-weight:400}.center-canvas,.center-child-canvas>canvas{display:block !important;margin:0 auto !important}.smart-accordion-default.panel-group{margin-bottom:0px}.smart-accordion-default.panel-group .panel+.panel{margin-top:-1px}.smart-accordion-default.panel-group .panel-heading{padding:0px}.smart-accordion-default.panel-group .panel-title a{display:block;padding:10px 15px;text-decoration:none !important}.smart-accordion-default .panel-heading,.panel-group .panel{border-radius:0px;-webkit-border-radius:0px;-moz-border-radius:0px}.smart-accordion-default .panel-default>.panel-heading{background-color:#f3f3f3}.smart-accordion-default .panel-default{border-color:#8d9194}.smart-accordion-default .panel-title>a>:first-child{display:none}.smart-accordion-default .panel-title>a.collapsed>.fa{display:none}.smart-accordion-default .panel-title>a.collapsed>:first-child{display:inline-block}.no-padding .smart-accordion-default>div{border-left:none !important;border-right:none !important}.no-padding .smart-accordion-default>div:first-child{border-top:none !important}.no-padding .smart-accordion-default>div:last-child{border-bottom:none !important}.onoffswitch-container{margin-top:4px;margin-left:7px;display:inline-block}.onoffswitch{position:relative;width:50px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;margin-top:3px;margin-bottom:3px;margin-left:5px;display:inline-block;vertical-align:middle}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:1px solid #484c4e;border-radius:50px;border-color:#777b7f #7c8184 #686c6f;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.onoffswitch-inner{width:200%;margin-left:-100%;display:block}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:15px;padding:0;line-height:15px;font-size:10px;color:#fff;font-family:Trebuchet, Arial, sans-serif;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.onoffswitch-inner:before{content:attr(data-swchon-text);text-shadow:0 -1px 0 #313335;padding-left:7px;background-color:#3276b1;color:#fff;box-shadow:inset 0 2px 6px rgba(0,0,0,0.5),0 1px 2px rgba(0,0,0,0.05);text-align:left}.onoffswitch-inner:after{content:attr(data-swchoff-text);padding-right:7px;text-shadow:0 -1px 0 #fff;background-color:#fff;color:#3c3f41;text-align:right;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-switch{width:19px;height:19px;margin:-2px;background:white;border:1px solid #64686b;border-radius:50px;position:absolute;top:0;bottom:0;right:32px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background-color:#eaeaea;background-image:-moz-linear-gradient(top, #fff, #adadad);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#adadad));background-image:-webkit-linear-gradient(top, #fff, #adadad);background-image:-o-linear-gradient(top, #fff, #adadad);background-image:linear-gradient(to bottom, #ffffff,#adadad);background-repeat:repeat-x;-webkit-box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3);box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3)}.onoffswitch-checkbox+.onoffswitch-label .onoffswitch-switch:before,.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00d";color:#a52521;display:block;text-align:center;line-height:19px;font-size:10px;text-shadow:0 -1px 0 #fff;font-weight:bold;font-family:FontAwesome}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00c";color:#428bca}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0;display:block}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0px}.onoffswitch-switch:hover{background-color:#adadad}.onoffswitch-switch:active{background-color:#adadad;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-inner:after,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-inner:before{text-shadow:0 1px 0 #fff;background:#bfbfbf;color:#313335}.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-switch,.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-switch{background-color:#eaeaea;background-image:-moz-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#bfbfbf), to(#eaeaea));background-image:-webkit-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-o-linear-gradient(top, #bfbfbf, #eaeaea);background-image:linear-gradient(to bottom, #bfbfbf,#eaeaea);box-shadow:none !important}.onoffswitch-checkbox:disabled+.onoffswitch-label,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-label{border-color:#74797c #63676a #525558 !important}.onoffswitch-checkbox:checked+.onoffswitch-label{border-color:#3276b1 #2a6395 #255681}.onoffswitch+span,.onoffswitch-title{display:inline-block;vertical-align:middle;margin-top:-5px}.form-control{box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.form hr{margin-left:-13px;margin-right:-13px;border-color:rgba(0,0,0,0.1);margin-top:20px;margin-bottom:20px}.form fieldset{display:block;border:none;background:rgba(255,255,255,0.9);position:relative}fieldset{position:relative}.form-actions{display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(239,239,239,0.9);margin-top:25px;margin-left:-13px;margin-right:-13px;margin-bottom:-13px;text-align:right}.well .form-actions{margin-left:-19px;margin-right:-19px;margin-bottom:-19px}.well.well-lg .form-actions{margin-left:-24px;margin-right:-24px;margin-bottom:-24px}.well.well-sm .form-actions{margin-left:-9px;margin-right:-9px;margin-bottom:-9px}.popover-content .form-actions{margin:0 -14px -9px;border-radius:0 0 3px 3px;padding:9px 14px}.no-padding .form .form-actions{margin:0;display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(248,248,248,0.9);text-align:right;margin-top:25px}.form header,legend{display:block;padding:8px 0;border-bottom:1px dashed rgba(0,0,0,0.2);background:#fff;font-size:16px;font-weight:300;color:#2b2b2b;margin:25px 0px 20px}.no-padding .form header{margin:25px 14px 0}.form header:first-child{margin-top:10px}legend{font-weight:400;margin-top:0px;background:none}.input-group-addon{padding:6px 10px;will-change:background-color, border-color;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-webkit-transition:all ease-out 0.15s;transition:all ease-out 0.15s}.input-group-addon .fa,.input-group-addon .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .input-group-addon li>i{font-size:14px}.input-group-addon .fa-lg,.input-group-addon .fa-2x{font-size:2em}.input-group-addon .fa-3x,.input-group-addon .fa-4x,.input-group-addon .fa-5x{font-size:30px}input[type="text"]:focus+.input-group-addon,input[type="password"]:focus+.input-group-addon,input[type="email"]:focus+.input-group-addon{border-color:#568a89;color:#568a89}.has-warning input[type="text"],.has-warning input[type="text"]+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]+.input-group-addon{background-color:#fbe3c0;color:#2b2b2b}.has-warning input[type="text"]:focus,.has-warning input[type="text"]:focus+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]:focus+.input-group-addon{background-color:#e28a0d;color:#fff}.has-error .input-group-addon{border-color:#d9534f !important;background:#d9534f !important;color:#2b2b2b !important}.has-success .input-group-addon{border-color:#4f9e4f !important;background-color:#2b2b2b !important;color:#4f9e4f !important}.form fieldset .form-group:last-child,.form fieldset .form-group:last-child .note,.form .form-group:last-child,.form .form-group:last-child .note{margin-bottom:0}.note{margin-top:6px;padding:0 1px;font-size:11px;line-height:15px;color:#63676a}.input-icon-right{position:relative}.input-icon-right>i,.input-icon-left>i{position:absolute;right:10px;top:30%;font-size:16px;color:#bfbfbf}.input-icon-left>i{right:auto;left:24px}.input-icon-right .form-control{padding-right:27px}.input-icon-left .form-control{padding-left:29px}input[type="text"].ui-autocomplete-loading,input[type="password"].ui-autocomplete-loading,input[type="datetime"].ui-autocomplete-loading,input[type="datetime-local"].ui-autocomplete-loading,input[type="date"].ui-autocomplete-loading,input[type="month"].ui-autocomplete-loading,input[type="time"].ui-autocomplete-loading,input[type="week"].ui-autocomplete-loading,input[type="number"].ui-autocomplete-loading,input[type="email"].ui-autocomplete-loading,input[type="url"].ui-autocomplete-loading,input[type="search"].ui-autocomplete-loading,input[type="tel"].ui-autocomplete-loading,input[type="color"].ui-autocomplete-loading{background-image:url("../img/select2-spinner.gif") !important;background-repeat:no-repeat;background-position:99% 50%;padding-right:27px}.input-group-addon .checkbox,.input-group-addon .radio{min-height:0px;margin-right:0px !important;padding-top:0}.input-group-addon label input[type="checkbox"].checkbox+span,.input-group-addon label input[type="radio"].radiobox+span,.input-group-addon label input[type="radio"].radiobox+span:before,.input-group-addon label input[type="checkbox"].checkbox+span:before{margin-right:0px}.input-group-addon .onoffswitch,.input-group-addon .onoffswitch-label{margin:0}.alert{margin-bottom:10px;margin-top:0px;padding:5px 15px 5px 34px;color:#675100;border-width:0px;border-left-width:3px;padding:10px}.alert .ui-pnotify-title{line-height:12px}.alert .ui-pnotify-text{font-size:10px}.alert .close{top:0px;right:-5px;line-height:20px}.alert-heading{font-weight:600}.alert-danger{border-color:#a52521;color:#2b2b2b;background:#f6d1d0;text-shadow:none}.alert-danger .ui-pnotify-icon{color:#a52521}.alert-warning{border-color:#e28a0d;color:#2b2b2b;background:#fdedd8}.alert-warning .ui-pnotify-icon{color:#e28a0d}.alert-success{border-color:#4f9e4f;color:#2b2b2b;background:#d1e8d1}.alert-success .ui-pnotify-icon{color:#4f9e4f}.alert-info{border-color:#316490;color:#2b2b2b;background:#abc9e2}.alert-info .ui-pnotify-icon{color:#316490}.progress-micro{height:2px !important;line-height:2px !important}.progress-xs{height:7px !important;line-height:7px !important}.progress-sm{height:14px !important;line-height:14px !important}.progress-lg{height:30px !important;line-height:30px !important}.progress .progress-bar{position:absolute;overflow:hidden;line-height:18px}.progress .progressbar-back-text{position:absolute;width:100%;height:100%;font-size:12px;line-height:20px;text-align:center}.progress .progressbar-front-text{display:block;width:100%;font-size:12px;line-height:20px;text-align:center}.progress.right .progress-bar{right:0}.progress.right .progressbar-front-text{position:absolute;right:0}.progress.vertical{width:25px;height:100%;min-height:150px;margin-right:20px;display:inline-block;margin-bottom:0px}.progress.wide-bar{width:40px}.progress.vertical.bottom{position:relative}.progress.vertical.bottom .progressbar-front-text{position:absolute;bottom:0}.progress.vertical .progress-bar{width:100%;height:0;-webkit-transition:height 0.6s ease;transition:height 0.6s ease}.progress.vertical.bottom .progress-bar{position:absolute;bottom:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{position:relative;margin-bottom:20px;overflow:hidden;height:18px;background:#adadad;box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-webkit-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-moz-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px}.progress-bar{float:left;width:0;height:100%;font-size:11px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);font-weight:bold;text-shadow:0 -1px 0 rgba(0,0,0,0.25);-webkit-transition:width 1.5s ease-in-out;transition:width 1.5s ease-in-out}.progress-striped .progress-bar{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-info .bar,.progress .bar-info{background:#316490}.vertical-bars{padding:0;margin:0}.vertical-bars:after{content:"";display:block;height:0;clear:both}.vertical-bars li{padding:14px 0;width:25%;display:block;float:left;text-align:center}.vertical-bars li:first-child{border-left:none}.vertical-bars>li>.progress.vertical:first-child{margin-left:auto}.vertical-bars>li>.progress.vertical{margin:0 auto;float:none}.nav-tabs{border-bottom:none}.nav-tabs>li>a .badge{font-size:11px;padding:3px 5px 3px 5px;opacity:.5;margin-left:5px;min-width:17px;font-weight:normal}.tabs-left .nav-tabs>li>a .badge{margin-right:5px;margin-left:0px}.nav-tabs>li>a .label{display:inline-block;font-size:11px;margin-left:5px;opacity:.5}.nav-tabs>li>a{color:#adadad;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.nav-tabs>li>a:hover{color:#1d1d1d;border-color:transparent transparent #adadad transparent;margin-top:1px;border-top-width:0}.nav-tabs>li.active>a{background-color:#adadad;color:#2b2b2b;border-top-width:0px !important;margin-top:1px !important;font-weight:bold}.tabs-left .nav-tabs>li.active>a{-webkit-box-shadow:-2px 0 0 #428bca;-moz-box-shadow:-2px 0 0 #428bca;box-shadow:-2px 0 0 #428bca;border-top-width:1px !important;border-left:none !important;margin-left:1px !important}.tabs-left .nav-pills>li.active>a{border:none !important;box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.tabs-right .nav-tabs>li.active>a{-webkit-box-shadow:2px 0 0 #428bca;-moz-box-shadow:2px 0 0 #428bca;box-shadow:2px 0 0 #428bca;border-top-width:1px !important;border-right:none !important;margin-right:1px !important}.tabs-below .nav-tabs>li.active>a{-webkit-box-shadow:0 2px 0 #428bca;-moz-box-shadow:0 2px 0 #428bca;box-shadow:0 2px 0 #428bca;border-bottom-width:0px !important;border-top:none !important;margin-top:0px !important}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li,.tabs-left>.nav-pills>li,.tabs-right>.nav-pills>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a,.tabs-left>.nav-pills>li>a,.tabs-right>.nav-pills>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs,.tabs-left>.nav-pills{float:left;margin-right:19px;border-right:1px solid #9b9b9b}.tabs-left>.nav-pills{border-right:none}.tabs-left>.nav-tabs>li>a{margin-right:-1px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#adadad #949494 #adadad #adadad}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#949494 transparent #949494 #9b9b9b;*border-right-color:#fff}.tabs-left>.tab-content{margin-left:109px}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #9b9b9b}.tabs-right>.nav-tabs>li>a{margin-left:-1px}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#adadad #adadad #adadad #9b9b9b}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#9b9b9b #9b9b9b #9b9b9b transparent;*border-left-color:#fff}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#9b9b9b;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #9b9b9b #9b9b9b #9b9b9b}.nav-tabs.bordered{background:#fff;border:1px solid #9b9b9b}.nav-tabs.bordered>:first-child a{border-left-width:0px !important}.nav-tabs.bordered+.tab-content{border:1px solid #9b9b9b;border-top:none}.tabs-pull-right.nav-tabs>li,.tabs-pull-right.nav-pills>li{float:right}.tabs-pull-right.nav-tabs>li:first-child>a,.tabs-pull-right.nav-pills>li:first-child>a{margin-right:1px}.tabs-pull-right.bordered.nav-tabs>li:first-child>a,.tabs-pull-right.bordered.nav-pills>li:first-child>a{border-left-width:1px !important;margin-right:0px;border-right-width:0px}.dropdown-menu-xs{min-width:37px}.dropdown-menu-xs>li>a{padding:3px 10px}.dropdown-menu-xs>li>a:hover i{color:#fff !important}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#2b2b2b;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#adadad}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}.pagination>li>a,.pagination>li>span{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.btn-default.disabled{color:#adadad}.btn{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;will-change:background-color, border-color;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-transition:all 0.18s ease-in-out;transition:all 0.18s ease-in-out}.btn.btn-ribbon{background-color:#707070;background-image:-moz-linear-gradient(top, #777, #666);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#777), to(#666));background-image:-webkit-linear-gradient(top, #777, #666);background-image:-o-linear-gradient(top, #777, #666);background-image:linear-gradient(to bottom, #777777,#666666);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff777777', endColorstr='#ff666666', GradientType=0);color:white;padding:0 5px;line-height:20px;vertical-align:middle;height:20px;display:block;border:none;float:left;margin:0 8px 0 0;cursor:pointer}.btn.btn-ribbon>i{font-size:111%}.ribbon-button-alignment{padding-top:10px;display:inline-block}.ribbon-button-alignment.pull-right>.btn.btn-ribbon{margin:0 0 0 8px}.panel-purple{border-color:#6e587a}.panel-purple>.panel-heading{color:#fff;background-color:#6e587a;border-color:#6e587a}.panel-greenLight{border-color:#71843f}.panel-greenLight>.panel-heading{color:#fff;background-color:#71843f;border-color:#71843f}.panel-greenDark{border-color:#496949}.panel-greenDark>.panel-heading{color:#fff;background-color:#496949;border-color:#496949}.panel-darken{border-color:#313335}.panel-darken>.panel-heading{color:#fff;background-color:#404040;border-color:#404040}.panel-pink{border-color:#e06fdf}.panel-pink>.panel-heading{color:#fff;background-color:#e06fdf;border-color:#e06fdf}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.panel-blueLight{border-color:#92a2a8}.panel-blueLight>.panel-heading{color:#fff;background-color:#92a2a8;border-color:#92a2a8}.panel-pinkDark{border-color:#a8829f}.panel-pinkDark>.panel-heading{color:#fff;background-color:#a8829f;border-color:#a8829f}.panel-redLight{border-color:#a65858}.panel-redLight>.panel-heading{color:#fff;background-color:#a65858;border-color:#a65858}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{color:#fff;background-color:#d9534f;border-color:#d9534f}.panel-teal{border-color:#568a89}.panel-teal>.panel-heading{color:#fff;background-color:#568a89;border-color:#568a89}.panel-orange{border-color:#e28a0d}.panel-orange>.panel-heading{color:#fff;background-color:#e28a0d;border-color:#e28a0d}.panel-blueDark{border-color:#4c4f53}.panel-blueDark>.panel-heading{color:#fff;background-color:#4c4f53;border-color:#4c4f53}.panel-magenta{border-color:#6e3671}.panel-magenta>.panel-heading{color:#fff;background-color:#6e3671;border-color:#6e3671}.panel-blue{border-color:#428bca}.panel-blue>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-footer>.btn-block{border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px;border-bottom:none;border-left:none;border-right:none}.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:18px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;-webkit-box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12);box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12)}.btn-circle.btn-sm,.btn-group-sm>.btn-circle.btn{width:22px;height:22px;padding:4px 0;font-size:12px;line-height:14px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn{width:50px;height:50px;padding:10px 15px;font-size:18px;line-height:30px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 15px;font-size:24px;line-height:50px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-metro{margin:0 0 20px;padding-top:15px;padding-bottom:15px}.btn-metro>span{display:block;vertical-align:bottom;margin-top:10px;text-transform:uppercase}.btn-metro>span.label{position:absolute;top:0px;right:0px}.btn-label{position:relative;left:-8px;display:inline-block;padding:5px 8px;background:rgba(0,0,0,0.15);border-radius:3px 0 0 3px}.btn-labeled{padding-top:0;padding-bottom:0}.btn-link{box-shadow:none;-webkit-box-shadow:none;font-size:13px}.morris-hover.morris-default-style{border-radius:5px;padding:5px;color:#666;background:rgba(29,29,29,0.9);border:solid 2px #375959;font-family:'Oxygen Bold';font-size:10px;text-align:left;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap}.morris-hover{position:absolute;z-index:903}.fixed-page-footer .morris-hover{z-index:900}.txt-color.txt-color-blue,.txt-color-blue.pf-help,.pf-help:hover,.pf-landing .pf-landing-list li>i.pf-help:hover,.pf-landing .pf-landing-list li>i.txt-color-blue{color:#428bca !important}.txt-color.txt-color-blueLight,.txt-color-blueLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-blueLight{color:#92a2a8 !important}.txt-color.txt-color-blueDark,.txt-color-blueDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-blueDark{color:#4c4f53 !important}.txt-color.txt-color-grayLightest,.txt-color-grayLightest.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayLightest{color:#eaeaea !important}.txt-color.txt-color-grayLighter,.txt-color-grayLighter.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayLighter{color:#adadad !important}.txt-color.txt-color-grayLight,.txt-color-grayLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayLight{color:#63676a !important}.txt-color.txt-color-gray,.pf-help,.pf-landing .pf-landing-list li>i.txt-color-gray,.pf-landing .pf-landing-list li>i.pf-help{color:#3c3f41 !important}.txt-color.txt-color-grayDark,.txt-color-grayDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayDark{color:#313335 !important}.txt-color.txt-color-greenLight,.txt-color-greenLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-greenLight{color:#66c84f !important}.txt-color.txt-color-green,.txt-color-green.pf-help,.pf-help.pf-log-info,.txt-color.pf-log-info,.pf-landing .pf-landing-list li>i.pf-log-info,.pf-landing .pf-landing-list li>i.txt-color-green{color:#5cb85c !important}.txt-color.txt-color-greenDark,.txt-color-greenDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-greenDark{color:#4f9e4f !important}.txt-color.txt-color-redLight,.txt-color-redLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-redLight{color:#a65858 !important}.txt-color.txt-color-red,.txt-color-red.pf-help,.pf-help.pf-log-error,.txt-color.pf-log-error,.pf-landing .pf-landing-list li>i.pf-log-error,.pf-landing .pf-landing-list li>i.txt-color-red{color:#d9534f !important}.txt-color.txt-color-redDarker,.txt-color-redDarker.pf-help,.pf-landing .pf-landing-list li>i.txt-color-redDarker{color:#a52521 !important}.txt-color.txt-color-yellow,.txt-color-yellow.pf-help,.pf-landing .pf-landing-list li>i.txt-color-yellow{color:#b09b5b !important}.txt-color.txt-color-orange,.txt-color-orange.pf-help,.pf-landing .pf-landing-list li>i.txt-color-orange{color:#e28a0d !important}.txt-color.txt-color-orangeDark,.txt-color-orangeDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-orangeDark{color:#c2760c !important}.txt-color.txt-color-pink,.txt-color-pink.pf-help,.pf-landing .pf-landing-list li>i.txt-color-pink{color:#e06fdf !important}.txt-color.txt-color-pinkDark,.txt-color-pinkDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-pinkDark{color:#a8829f !important}.txt-color.txt-color-purple,.txt-color-purple.pf-help,.pf-landing .pf-landing-list li>i.txt-color-purple{color:#6e587a !important}.txt-color.txt-color-darken,.txt-color-darken.pf-help,.pf-landing .pf-landing-list li>i.txt-color-darken{color:#404040 !important}.txt-color.txt-color-lighten,.txt-color-lighten.pf-help,.pf-landing .pf-landing-list li>i.txt-color-lighten{color:#d5e7ec !important}.txt-color.txt-color-white,.txt-color-white.pf-help,.pf-landing .pf-landing-list li>i.txt-color-white{color:#fff !important}.txt-color.txt-color-magenta,.txt-color-magenta.pf-help,.pf-landing .pf-landing-list li>i.txt-color-magenta{color:#6e3671 !important}.txt-color.txt-color-tealLighter,.txt-color-tealLighter.pf-help,.pf-landing .pf-landing-list li>i{color:#568a89 !important}.txt-color.txt-color-indigoDark,.txt-color-indigoDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-indigoDark{color:#5c6bc0 !important}.txt-color.txt-color-indigoDarkest,.txt-color-indigoDarkest.pf-help,.pf-landing .pf-landing-list li>i.txt-color-indigoDarkest{color:#313966 !important}.txt-color.txt-color-primary,.txt-color-primary.pf-help,.pf-landing .pf-landing-list li>i.txt-color-primary{color:#375959 !important}.txt-color.txt-color-success,.txt-color-success.pf-help,.pf-landing .pf-landing-list li>i.txt-color-success{color:#4f9e4f !important}.txt-color.txt-color-information,.txt-color-information.pf-help,.pf-landing .pf-landing-list li>i.txt-color-information{color:#316490 !important}.txt-color.txt-color-warning,.txt-color-warning.pf-help,.pf-help.pf-log-warning,.txt-color.pf-log-warning,.pf-landing .pf-landing-list li>i.pf-log-warning,.pf-landing .pf-landing-list li>i.txt-color-warning{color:#e28a0d !important}.txt-color.txt-color-danger,.txt-color-danger.pf-help,.pf-landing .pf-landing-list li>i.txt-color-danger{color:#a52521 !important}.bg-color.bg-color-blue{background-color:#428bca !important}.bg-color.bg-color-blueLight{background-color:#92a2a8 !important}.bg-color.bg-color-blueDark{background-color:#4c4f53 !important}.bg-color.bg-color-green{background-color:#5cb85c !important}.bg-color.bg-color-greenLight{background-color:#71843f !important}.bg-color.bg-color-greenDark{background-color:#496949 !important}.bg-color.bg-color-red{background-color:#d9534f !important}.bg-color.bg-color-yellow{background-color:#b09b5b !important}.bg-color.bg-color-orange{background-color:#e28a0d !important}.bg-color.bg-color-orangeDark{background-color:#c2760c !important}.bg-color.bg-color-pink{background-color:#e06fdf !important}.bg-color.bg-color-pinkDark{background-color:#a8829f !important}.bg-color.bg-color-purple{background-color:#6e587a !important}.bg-color.bg-color-darken{background-color:#404040 !important}.bg-color.bg-color-lighten{background-color:#d5e7ec !important}.bg-color.bg-color-white{background-color:#fff !important}.bg-color.bg-color-gray{background-color:#3c3f41 !important}.bg-color.bg-color-grayDark{background-color:#525252 !important}.bg-color.bg-color-grayDarker{background-color:#2b2b2b !important}.bg-color.bg-color-magenta{background-color:#6e3671 !important}.bg-color.bg-color-tealLighter{background-color:#568a89 !important}.bg-color.bg-color-tealDarker{background-color:#212C30 !important}.bg-color.bg-color-tealDarkest{background-color:#1b2326 !important}.bg-color.bg-color-redLight{background-color:#a65858 !important}body{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.pf-body{overflow:hidden}a{color:#477372;will-change:color;text-decoration:none;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}a:hover{color:#6caead;text-decoration:none}a:focus{color:#477372}em{font-style:italic}em.pf-brand{text-transform:uppercase}.pf-font-capitalize{text-transform:capitalize}.no-padding{padding:0 !important}::-webkit-scrollbar{width:16px;height:16px}::-webkit-scrollbar-track{background-color:#2b2b2b;border-left:1px solid #313335;border-radius:2px;-webkit-transition:background-color 0.5s;transition:background-color 0.5s}::-webkit-scrollbar-thumb{height:6px;border:5px solid transparent;background-clip:padding-box;-webkit-border-radius:8px;background-color:#868c90}::-webkit-scrollbar-thumb:hover{background-color:#a1a5a8}::-webkit-scrollbar-button{width:0;height:0;display:none}::-webkit-scrollbar-corner{background-color:transparent}::selection{background:#adadad;color:#1d1d1d}::-moz-selection{background:#adadad;color:#1d1d1d}.pf-help{cursor:pointer;cursor:help;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.pf-dialog-icon-button,.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty,.pf-sig-table-module .pf-sig-table .fa-plus,.pf-system-route-module .pf-system-route-table td .fa-refresh,.pf-system-route-module .pf-system-route-table td .fa-search-plus{cursor:pointer;margin-top:2px;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-dialog-icon-button:not(.collapsed),.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty:not(.collapsed),.pf-sig-table-module .pf-sig-table .fa-plus:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-refresh:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-search-plus:not(.collapsed),.pf-dialog-icon-button:hover,.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty:hover,.pf-sig-table-module .pf-sig-table .fa-plus:hover,.pf-system-route-module .pf-system-route-table td .fa-refresh:hover,.pf-system-route-module .pf-system-route-table td .fa-search-plus:hover{color:#e28a0d}.pf-module-icon-button{cursor:pointer;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-module-icon-button:hover{color:#e28a0d !important}a.disabled{color:#777;pointer-events:none;cursor:default}.alert{will-change:opacity, transform}.editable-input optgroup[label]{background-color:#3c3f41;color:#63676a}.editable-input optgroup[label] option{background-color:#313335;color:#adadad;font-family:Consolas,monospace,Menlo,Monaco,"Courier New"}select:active,select:hover{outline:none}select:active,select:hover{outline-color:red}.select2-results [class*="col-"]{line-height:22px}.select2 ::-webkit-search-cancel-button{-webkit-appearance:none !important}.select2 .select2-selection__choice__remove{float:left}.select2 .select2-selection--multiple input{box-shadow:none !important}.dataTable th.pf-table-image-cell,.dataTable th.pf-table-image-small-cell{padding-left:0 !important;padding-right:0 !important}.dataTable th.sorting,.dataTable th.sorting_asc,.dataTable th.sorting_desc{padding-right:18px !important}.dataTable td.pf-table-action-cell{cursor:pointer}.dataTable td.pf-table-image-cell{padding:0 !important}.dataTable td.pf-table-image-cell img{width:26px;box-sizing:content-box;border-left:1px solid #3c3f41;border-right:1px solid #3c3f41}.dataTable td.pf-table-image-small-cell img{width:24px;border-left:1px solid transparent;border-right:1px solid transparent}.dataTable td.pf-table-counter-cell{color:#63676a}.dataTable td.pf-table-counter-cell .pf-digit-counter-small{width:20px;display:inline-block;font-size:10px}.dataTable td.pf-table-counter-cell .pf-digit-counter-large{width:26px;display:inline-block;font-size:10px}.dataTable td.separator-right,.dataTable th.separator-right{border-right:1px solid #3c3f41}.dataTable td svg.peity,.dataTable th svg.peity{display:block}table tr.collapsing{-webkit-transition:height 0.01s ease;transition:height 0.01s ease}table tr.collapse.in{display:table-row !important}.pf-table-tools{height:45px}.pf-table-tools .btn:not(:last-child){margin-right:10px}.pf-table-tools-action{will-change:height, opacity, display;opacity:0;display:none;height:0;visibility:hidden}.pf-loading-overlay{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;background:#2b2b2b;z-index:1060;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-loading-overlay .pf-loading-overlay-wrapper{width:25px;height:25px;margin:auto;text-align:center;position:absolute;top:0;left:0;bottom:0;right:0}.pf-loading-overlay .pf-loading-overlay-wrapper i{padding:3px}.navbar-nav li:not(.disabled):hover:before,.navbar-nav li:not(.disabled).active:before{top:-4px;opacity:1}.navbar-nav li:not(.disabled):before{content:'';position:absolute;width:100%;height:2px;background-color:#5cb85c;top:0;opacity:0;will-change:opacity, top;-webkit-transition:top 0.15s ease-out,opacity 0.15s ease-out;transition:top 0.15s ease-out,opacity 0.15s ease-out}.pf-navbar-version-info{cursor:pointer}.pf-site{will-change:transform}.sb-slidebar{will-change:transform}.sb-left .list-group-item{-webkit-box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4)}.sb-right .list-group-item{-webkit-box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4)}.mCSB_container,.mCSB_dragger{will-change:top, left}.pf-map-type-private{color:#7986cb}.pf-map-type-corporation{color:#5cb85c}.pf-map-type-alliance{color:#428bca}.pf-map-type-global{color:#568a89}#pf-map-module{margin:20px 10px 0 10px}#pf-map-module #pf-map-tabs .pf-map-type-tab-default{border-top:2px solid transparent}#pf-map-module #pf-map-tabs .pf-map-type-tab-private{border-top:2px solid #7986cb}#pf-map-module #pf-map-tabs .pf-map-type-tab-corporation{border-top:2px solid #5cb85c}#pf-map-module #pf-map-tabs .pf-map-type-tab-alliance{border-top:2px solid #428bca}#pf-map-module #pf-map-tabs .pf-map-type-tab-global{border-top:2px solid #568a89}#pf-map-module #pf-map-tabs .pf-map-tab-icon{margin-right:5px}#pf-map-module #pf-map-tabs .pf-map-tab-shared-icon{margin-left:5px}.pf-map-content-row{margin-top:10px;padding-bottom:40px}.pf-map-content-row .pf-module{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background:rgba(60,63,65,0.3);padding:10px;width:100%;margin-bottom:10px;will-change:height, transform, opacity;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-map-content-row .pf-module:before{content:'';position:absolute;top:0;left:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent transparent #3c3f41;cursor:pointer}.pf-map-content-row .pf-module .label{margin-bottom:10px}.pf-map-content-row .pf-module .pf-dynamic-area{background:rgba(43,43,43,0.4)}.pf-map-content-row .pf-module h5 .pf-module-icon-button{margin-left:5px}.pf-user-status{color:#a52521}.pf-user-status-corp{color:#5cb85c}.pf-user-status-ally{color:#428bca}.pf-user-status-own{color:#7986cb}.pf-system-effect{display:none;cursor:default;color:#adadad}.pf-system-effect-magnetar{color:#e06fdf;display:inline-block}.pf-system-effect-redgiant{color:#d9534f;display:inline-block}.pf-system-effect-pulsar{color:#428bca;display:inline-block}.pf-system-effect-wolfrayet{color:#e28a0d;display:inline-block}.pf-system-effect-cataclysmic{color:#ffb;display:inline-block}.pf-system-effect-blackhole{color:#000;display:inline-block}.pf-system-info-rally .pf-system-head{background-color:#782d77;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjEuMCIgeTE9IjEuMCIgeDI9IjAuMCIgeTI9IjAuMCI+PHN0b3Agb2Zmc2V0PSIyNSUiIHN0b3AtY29sb3I9IiMzZTI2NGUiLz48c3RvcCBvZmZzZXQ9IjI1JSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzNlMjY0ZSIvPjxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjM2UyNjRlIi8+PHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-webkit-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:linear-gradient(-45deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:25px 25px;-webkit-animation:move 3s linear infinite;-moz-animation:move 3s linear infinite;-ms-animation:move 3s linear infinite;animation:move 3s linear infinite}.pf-system-security-0-0{color:#be0000}.pf-system-security-0-1{color:#ab2600}.pf-system-security-0-2{color:#be3900}.pf-system-security-0-3{color:#c24e02}.pf-system-security-0-4{color:#ab5f00}.pf-system-security-0-5{color:#bebe00}.pf-system-security-0-6{color:#73bf26}.pf-system-security-0-7{color:#00bf00}.pf-system-security-0-8{color:#00bf39}.pf-system-security-0-9{color:#39bf99}.pf-system-security-1-0{color:#28c0bf}.pf-system-sec{margin-right:5px;cursor:-moz-grab;cursor:-webkit-grab}.pf-system-sec-highSec{color:#5cb85c}.pf-system-sec-lowSec{color:#e28a0d}.pf-system-sec-nullSec{color:#d9534f}.pf-system-sec-high{color:#d9534f}.pf-system-sec-mid{color:#e28a0d}.pf-system-sec-low{color:#428bca}.pf-system-sec-unknown{color:#7986cb}.pf-system-status-friendly{border-color:#428bca !important;color:#428bca}.pf-system-status-occupied{border-color:#e28a0d !important;color:#e28a0d}.pf-system-status-hostile{border-color:#d9534f !important;color:#d9534f}.pf-system-status-empty{border-color:#5cb85c !important;color:#5cb85c}.pf-system-status-unscanned{border-color:#568a89 !important;color:#568a89}.pf-system-info-status-label{background-color:#63676a;color:#000;will-change:background-color;-webkit-transition:background-color 0.5s ease-out;transition:background-color 0.5s ease-out}.pf-system-info-status-label.pf-system-status-friendly{background-color:#428bca}.pf-system-info-status-label.pf-system-status-occupied{background-color:#e28a0d}.pf-system-info-status-label.pf-system-status-hostile{background-color:#d9534f}.pf-system-info-status-label.pf-system-status-empty{background-color:#5cb85c}.pf-system-info-status-label.pf-system-status-unscanned{background-color:#568a89}.pf-system-effect-dialog-wrapper .table,.pf-jump-info-dialog .table{margin:15px 0}.pf-system-effect-dialog-wrapper .table td,.pf-jump-info-dialog .table td{text-transform:capitalize}.pf-fake-connection{box-sizing:content-box;display:inline-block;width:70px;height:4px;margin-right:5px;border-top:2px solid #63676a;border-bottom:2px solid #63676a;background-color:#3c3f41;position:relative;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-fake-connection.pf-map-connection-stargate{background-color:#313966;border-color:#63676a}.pf-fake-connection.pf-map-connection-jumpbridge{background-color:#6caead;border-color:#3c3f41;background:repeating-linear-gradient(to right, #6caead, #6caead 10px, #3c3f41 10px, #3c3f41 20px)}.pf-fake-connection.pf-map-connection-wh-eol{border-color:#d747d6}.pf-fake-connection.pf-map-connection-wh-reduced{background-color:#e28a0d}.pf-fake-connection.pf-map-connection-wh-critical{background-color:#a52521}.pf-fake-connection.pf-map-connection-frig{border-style:dashed;border-left:none;border-right:none}.pf-fake-connection.pf-map-connection-frig:after{content:'frig';background-color:#e28a0d;color:#1d1d1d;padding:0px 3px;position:absolute;left:25px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'save mass';background-color:#a52521;color:#eaeaea;padding:0px 3px;position:absolute;left:9px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.tooltip-inner{color:#5cb85c;background-color:#3c3f41;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;padding:5px 5px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.modal .tooltip{z-index:1060}.modal .tooltip .tooltip-inner{color:#313335;background-color:#adadad}.tooltip.top .tooltip-arrow{border-top-color:#63676a}.tooltip.right .tooltip-arrow{border-right-color:#63676a}.tooltip.bottom .tooltip-arrow{border-bottom-color:#63676a}.tooltip.left .tooltip-arrow{border-left-color:#63676a}.popover{z-index:1060}.popover img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.popover h4{color:#adadad}.popover table{color:#adadad;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;line-height:16px;font-size:11px}.popover table td{padding:0 5px;vertical-align:middle !important}.pf-popover{display:initial}.pf-popover .popover-content{padding:0}.pf-popover h6{white-space:nowrap;margin-right:50px}.pf-popover h6:before,.pf-popover h6:after{content:" ";display:table}.pf-popover h6:after{clear:both}.pf-popover .well{margin-top:7px;margin-bottom:10px}.pf-popover .list-group{margin:0}.pf-popover .list-group .list-group-item{color:#313335}.pf-popover .list-group .list-group-item:hover{color:#1d1d1d}.pf-popover .list-group .list-group-item.disabled{background-color:#3c3f41;color:#63676a;cursor:not-allowed}.pf-popover .list-group .list-group-item img{width:30px;margin:-8px 10px -6px -8px;border-radius:0}.pf-popover .list-group .list-group-item i{margin-right:20px}td.pf-popover-trigger:hover{color:#477372}.pf-dynamic-area{padding:10px;min-height:100px;position:relative;background-color:#313335;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-dynamic-area .dl-horizontal{margin-bottom:0}.pf-dynamic-area .dl-horizontal dd{min-width:100px}#pf-logo-wrapper{display:block}#pf-head{margin-bottom:0px}#pf-head a{-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out;will-change:color}#pf-head a:focus{color:#477372}#pf-head a:focus img{border-color:#3c3f41}#pf-head a:hover{text-decoration:none}#pf-head a:hover .badge{color:#6caead}#pf-head a:hover img{border-color:#568a89}#pf-head i{margin-right:2px}#pf-head .pf-brand-desc{margin:6px 10px 0 90px;width:180px}#pf-head .pf-head-menu{padding:3px 10px;line-height:24px}#pf-head .pf-head-menu .pf-head-menu-logo{width:24px;height:24px;display:inline-block;float:left}#pf-head .badge{background-color:#3c3f41;color:#adadad}#pf-head .pf-head-user-character,#pf-head .pf-head-user-ship{opacity:0;visibility:hidden}#pf-head .pf-head-active-user,#pf-head #pf-head-current-location{display:none}#pf-head .pf-head-active-user .badge,#pf-head #pf-head-current-location .badge{-webkit-transition:color 0.3s ease-out;transition:color 0.3s ease-out}#pf-head .pf-head-user-character-image,#pf-head .pf-head-user-ship-image{display:inline-block;margin-top:-6px;margin-bottom:-6px;width:27px;border:1px solid #3c3f41;margin-right:3px;-webkit-transition:border-color 0.15s ease-out;transition:border-color 0.15s ease-out;will-change:border-color}#pf-head .pf-head-program-status{cursor:pointer}#pf-head .navbar-text{min-width:60px}#pf-head .tooltip .tooltip-inner{color:#adadad}.pf-head{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}#pf-head-character-switch td{border:none}#pf-head-character-switch td:first-child+td{padding:0 5px}#pf-footer{position:absolute;bottom:0;left:0;width:100%;margin:0;background:rgba(60,63,65,0.3)}#pf-footer a{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#375959}#pf-footer a:hover{color:#477372;text-decoration:none}.navbar-fixed-bottom{padding:2px 0}@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-moz-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-ms-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}.pf-animate{visibility:hidden;opacity:0}.pf-color-line{position:fixed;top:0;left:0;width:100%;height:3px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2Yzg0ZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzY2Yzg0ZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #66c84f),color-stop(100%, #66c84f));background-image:-moz-linear-gradient(left, #66c84f,#66c84f 100%);background-image:-webkit-linear-gradient(left, #66c84f,#66c84f 100%);background-image:linear-gradient(to right, #66c84f,#66c84f 100%)}.pf-color-line.warning{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UyOGEwZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UyOGEwZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e28a0d),color-stop(100%, #e28a0d));background-image:-moz-linear-gradient(left, #e28a0d,#e28a0d 100%);background-image:-webkit-linear-gradient(left, #e28a0d,#e28a0d 100%);background-image:linear-gradient(to right, #e28a0d,#e28a0d 100%)}.pf-color-line.danger{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2E1MjUyMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2E1MjUyMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #a52521),color-stop(100%, #a52521));background-image:-moz-linear-gradient(left, #a52521,#a52521 100%);background-image:-webkit-linear-gradient(left, #a52521,#a52521 100%);background-image:linear-gradient(to right, #a52521,#a52521 100%)}.pf-splash{position:absolute;z-index:2000;background-color:#1d1d1d;color:#63676a;top:0;bottom:0;left:0;right:0;will-change:opacity}.pf-splash .pf-splash-title{position:fixed;left:50%;top:30%;text-align:center;max-width:500px;padding:20px;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}@media (max-width: 1200px){.pf-landing #pf-logo-container{margin:5px auto}.pf-landing .pf-brand-desc{display:none}.pf-landing .navbar .navbar-brand{margin-left:10px}}.pf-landing section{min-height:200px;padding:20px 0 40px 0;border-bottom:1px solid #2b2b2b}.pf-landing section h4{font-size:18px;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;margin:5px 0 10px 0;border-bottom:1px solid #2b2b2b;line-height:34px}.pf-landing .container>.row{margin-bottom:30px}.pf-landing .alert{box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery]{position:relative}.pf-landing a[data-gallery]:before{content:'\f002';font-family:'FontAwesome';font-size:20px;line-height:20px;color:#e28a0d;position:absolute;top:9px;left:8px;height:100%;width:100%;padding-top:calc(50% - 10px);z-index:10;text-align:center;-webkit-transition:transform 0.1s 0.06s ease-in,opacity 0.1s ease-out;transition:transform 0.1s 0.06s ease-in,opacity 0.1s ease-out;will-change:transform, opacity;transform:scale(0, 0);opacity:0}.pf-landing a[data-gallery]:hover img{border-color:#6caead;-webkit-filter:brightness(50%);filter:brightness(50%)}.pf-landing a[data-gallery]:hover:before{-webkit-transition-delay:.1s;transition-delay:.1s;transform:scale(1, 1);opacity:1}.pf-landing a[data-gallery] .pf-landing-image-preview{border-width:1px;border-style:solid;border-color:#1d1d1d;margin:5px 0 15px 0;display:inline-block;will-change:all;-webkit-filter:brightness(100%);filter:brightness(100%);-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-small{height:160px}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-medium{height:256px}#pf-landing-top{height:450px;border-bottom:1px solid #313335;position:relative}#pf-landing-top:before{content:'';width:100%;height:100%;position:absolute;background:url("../img/pf-bg.jpg") #05050a;background-repeat:no-repeat;background-position:0 0;-webkit-filter:brightness(.9);filter:brightness(.9)}#pf-landing-top #pf-header-container{position:absolute;width:100%;background-position:center center}#pf-landing-top #pf-header-container #pf-header-canvas{position:absolute;visibility:hidden;top:0;left:0}#pf-landing-top #pf-header-container #pf-logo-container{z-index:110}#pf-landing-top #pf-header-container #pf-header-preview-container{position:absolute;left:400px;width:590px;height:350px;top:92px}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element{position:relative;margin-left:12px;margin-top:12px;height:155px;width:180px;padding:7px;opacity:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-color:rgba(43,43,43,0.5)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:nth-child(n+4){box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:after{content:'';position:absolute;width:calc(100% - 14px);height:calc(100% - 14px);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-repeat:no-repeat;background-position:50% 50%;background-color:rgba(29,29,29,0.75)}#pf-landing-top .container{position:relative;margin-top:50px}#pf-header-preview-intel:after{background-image:url("../img/landing/intel.png")}#pf-header-preview-map:after{background-image:url("../img/landing/map.png")}#pf-header-preview-scope:after{background-image:url("../img/landing/scope.png")}#pf-header-preview-signature:after{background-image:url("../img/landing/signature.png")}#pf-header-preview-data:after{background-image:url("../img/landing/data.png")}#pf-header-preview-gameplay:after{background-image:url("../img/landing/gameplay.png")}#pf-landing-login{padding-top:40px;padding-bottom:30px}#pf-landing-login .row{margin-bottom:0}#pf-landing-login .pf-character-selection>div:not(.pf-character-row-animate){-webkit-transition:width 0.2s ease,margin 0.2s ease;transition:width 0.2s ease,margin 0.2s ease}#pf-landing-login .pf-dynamic-area{display:inline-block;margin:10px 5px 20px 5px;padding:10px 10px 5px 10px;min-width:155px;min-height:184px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper{opacity:0;width:128px;border:2px solid #63676a;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;-webkit-transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);will-change:border-color, transition;overflow:hidden;cursor:pointer;display:inline-block;background-color:#2b2b2b;box-sizing:content-box}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover{border-color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-name{color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-image{-webkit-filter:grayscale(50%);filter:grayscale(50%)}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image{overflow:hidden;width:128px;height:128px;position:relative}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info{position:absolute;top:0;left:0;width:0;height:100%;color:#adadad;background:rgba(60,63,65,0.8);overflow:hidden;will-change:width, transition;padding:10px 0}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info .pf-character-info-text{line-height:25px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-name{font-size:13px;line-height:30px;border-top:1px solid #313335;color:#adadad;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-image{-webkit-transition:all 0.3s ease-out;transition:all 0.3s ease-out;-webkit-filter:grayscale(0%);filter:grayscale(0%)}#pf-landing-login .pf-sso-login-button{position:relative;display:inline-block;width:270px;height:45px;border:none;margin-bottom:10px;background-color:transparent;background-image:url("../img/landing/eve_sso_login_buttons_large_black_hover.png");cursor:pointer;box-shadow:0 2px 5px rgba(0,0,0,0.2);-webkit-transition:box-shadow 0.12s ease-out;transition:box-shadow 0.12s ease-out;will-change:box-shadow}#pf-landing-login .pf-sso-login-button:after{content:' ';position:absolute;width:270px;height:45px;left:0;top:0;background-image:url("../img/landing/eve_sso_login_buttons_large_black.png");-webkit-transition:opacity 0.12s ease-in-out;transition:opacity 0.12s ease-in-out;will-change:opacity}#pf-landing-login .pf-sso-login-button:hover{box-shadow:0 4px 5px rgba(0,0,0,0.2)}#pf-landing-login .pf-sso-login-button:hover:after{opacity:0}#pf-landing-login #pf-notification-panel{display:none}#pf-header-map{position:relative;margin:0 auto;height:380px;width:600px;pointer-events:none}#pf-header-map .pf-header-svg-layer{position:absolute;top:0;left:0;right:0;bottom:0}#pf-header-map #pf-header-systems{z-index:100}#pf-header-map #pf-header-connectors{z-index:90}#pf-header-map #pf-header-connections{z-index:80}#pf-header-map #pf-header-background{z-index:70}#pf-header-map #pf-header-background .pf-header-system{display:none}#pf-header-map-bg{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none}#pf-header-map-bg img{pointer-events:none}#pf-header-map-bg #pf-map-bg-image{opacity:0;position:absolute;bottom:0;right:0;width:100%;height:100%}#pf-header-map-bg #pf-map-neocom{opacity:0;height:665px;width:21px}#pf-header-map-bg #pf-map-browser{opacity:0;position:absolute;top:110px;left:21px;height:560px;width:515px}#pf-landing-gallery-carousel{background-image:url("../img/pf-header-bg.jpg")}#pf-landing-gallery-carousel .slide-content{border-radius:5px;pointer-events:none}#pf-landing-gallery-carousel h3{width:100%;text-align:left}.pf-landing-pricing-panel{margin-top:20px}.pricing-big{-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pricing-big .panel-heading{border-color:#3c3f41}.pricing-big .the-price{padding:1px 0;background:#2d3031;text-align:center}.pricing-big .the-price .subscript{font-size:12px;color:#63676a}.pricing-big .price-features{background:#3c3f41;color:#adadad;padding:20px 15px;min-height:205px;line-height:22px}.pricing-big .price-features .list-unstyled.text-left li,.pricing-big .price-features .text-left.list-inline li{text-indent:-1em;padding-left:1.5em}.pricing-big .price-features .list-unstyled.text-left li .fa,.pricing-big .price-features .text-left.list-inline li .fa,.pricing-big .price-features .list-unstyled.text-left .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pricing-big .price-features .list-unstyled.text-left li>i,.pricing-big .price-features .text-left.list-inline .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pricing-big .price-features .text-left.list-inline li>i{text-indent:0}.pricing-big table tr td{line-height:1}#pf-landing-about .pf-landing-about-me{width:256px;height:256px;border:none;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing-footer{padding:30px 0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#171717}.pf-landing-footer .pf-social-networks>li{display:inline-block;line-height:1}.pf-landing-footer .pf-social-networks>li a{display:inline-block;background:rgba(99,103,106,0.5);line-height:24px;text-align:center;font-size:12px;margin-right:5px;width:28px;height:24px}#pf-static-logo-svg{opacity:0;position:absolute;z-index:105;overflow:visible}#pf-static-logo-svg path{will-change:fill, opacity, transform, translateZ, translateX, translateY;pointer-events:all;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.logo-ploygon-top-right{fill:#477372;fill-rule:evenodd;stroke:#477372;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-bottom-left{fill:#5cb85c;fill-rule:evenodd;stroke:#5cb85c;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-bottom-right{fill:#375959;fill-rule:evenodd;stroke:#375959;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-top-left{fill:#63676a;fill-opacity:1;fill-rule:evenodd;stroke:#63676a;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1}@-webkit-keyframes bounce{0%, 20%, 50%, 80%, 100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-8px)}60%{-webkit-transform:translateY(-4px)}}@keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}#pf-map-tab-element{max-width:2515px;margin:0 auto}.pf-map-tab-content .pf-map-wrapper{position:relative;width:100%;max-width:2515px;height:550px;overflow:auto;padding:5px;background:rgba(43,43,43,0.93);box-shadow:inset -3px 3px 10px 0 rgba(0,0,0,0.3);border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-width:1px;border-style:solid;border-color:#313335}.pf-map-overlay{position:absolute;display:none;z-index:10000;height:36px;right:10px;background:rgba(0,0,0,0.25);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-map-overlay.pf-map-overlay-timer{width:36px;bottom:23px}.pf-map-overlay.pf-map-overlay-info{top:8px;color:#2b2b2b;padding:3px;line-height:26px;min-height:36px;min-width:36px}.pf-map-overlay.pf-map-overlay-info i{margin:0;margin-top:3px;width:0;height:26px;opacity:0;color:#63676a;transform:scale(0);transform-origin:50% 50% 0px;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;cursor:help;will-change:all}.pf-map-overlay.pf-map-overlay-info i.fa,.pf-map-overlay.pf-map-overlay-info .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pf-map-overlay.pf-map-overlay-info li>i{font-size:26px}.pf-map-overlay.pf-map-overlay-info i.glyphicon{margin-top:1px;font-size:24px;padding-left:3px}.pf-map-overlay.pf-map-overlay-info i.active,.pf-map-overlay.pf-map-overlay-info i:hover{color:#c2760c}.pf-grid-small{background:url('data:image/png;base64,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') !important}.pf-map{width:2500px;height:520px;position:relative;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-map .jsplumb-overlay{opacity:1;pointer-events:none;will-change:opacity;-webkit-transition:opacity 0.18s ease-out;transition:opacity 0.18s ease-out}.pf-map .jsplumb-hover.jsplumb-overlay{opacity:0 !important}.pf-map .jsplumb-hover:not(.jsplumb-overlay){-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce}.pf-map .jsplumb-target-hover,.pf-map .jsplumb-source-hover{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.pf-map .pf-system{position:absolute;min-width:60px;height:auto;overflow:hidden;background-color:#313335;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:100;will-change:top, left, opacity;border-width:2px;border-style:solid;border-color:#63676a;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.pf-map .pf-system:hover{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);-moz-transform:translate3d(0, -2px, 0);-ms-transform:translate3d(0, -2px, 0);-webkit-transform:translate3d(0, -2px, 0);transform:translate3d(0, -2px, 0)}.pf-map .pf-system .pf-system-head{padding:0px 3px 0px 3px;cursor:pointer;font-family:Arial;font-weight:bold}.pf-map .pf-system .pf-system-head .pf-system-head-name{border:none;display:inline-block;min-width:41px;color:#adadad;margin-right:2px}.pf-map .pf-system .pf-system-head .fa-lock{display:none}.pf-map .pf-system .pf-system-head .pf-system-head-expand{margin-left:2px;color:#63676a;display:none}.pf-map .pf-system .pf-system-head .editable-empty{font-style:normal}.pf-map .pf-system .pf-system-body{height:0px;width:100%;overflow:hidden;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab;padding:0 4px;white-space:nowrap;display:none;will-change:width;border-top-width:1px;border-top-style:dashed;border-top-color:#63676a}.pf-map .pf-system .pf-system-body .pf-system-body-item{color:#7c8184;font-size:10px;line-height:16px;height:16px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-right{text-overflow:ellipsis;float:right;color:#f0ad4e;display:none}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status{font-size:7px;width:10px;vertical-align:middle;height:14px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-item-name{display:inline-block;width:65px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pf-map .pf-system .tooltip.in{opacity:1}.pf-map .pf-system .tooltip .tooltip-inner{color:#313335;background-color:#adadad;padding:3px 3px}.pf-map .pf-system-active:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#ffb 0px 0px 8px 0px;box-shadow:#ffb 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target),.pf-map .jsPlumb_dragged:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#58100d 0px 0px 8px 0px;box-shadow:#58100d 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .jsPlumb_dragged:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body,.pf-map .jsPlumb_dragged:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body{background-color:#58100d}.pf-map .pf-system-locked .pf-system-sec{cursor:default !important}.pf-map .pf-system-locked .pf-system-body{cursor:default !important}.pf-map .pf-system-locked .fa-lock{color:#63676a !important;display:inline-block !important}.pf-map .pf-map-endpoint-source,.pf-map .pf-map-endpoint-target{z-index:90}.pf-map .pf-map-endpoint-source svg,.pf-map .pf-map-endpoint-target svg{overflow:visible}.pf-map .pf-map-endpoint-source svg circle,.pf-map .pf-map-endpoint-target svg circle{-webkit-transition:stroke 0.18s ease-out,fill 0.18s ease-out;transition:stroke 0.18s ease-out,fill 0.18s ease-out}.pf-map .pf-map-endpoint-source svg *,.pf-map .pf-map-endpoint-target svg *{stroke:#63676a;stroke-width:2;fill:#3c3f41;cursor:pointer}.pf-map .pf-map-endpoint-source:hover circle,.pf-map .pf-map-endpoint-target:hover circle{stroke:#e28a0d !important}.pf-map .pf-map-endpoint-source.jsplumb-hover,.pf-map .pf-map-endpoint-target.jsplumb-hover{z-index:95}.pf-map .pf-map-endpoint-source.jsplumb-dragging circle,.pf-map .pf-map-endpoint-target.jsplumb-dragging circle{stroke:#e28a0d}.pf-map .jsplumb-endpoint-drop-allowed circle{stroke:#5cb85c !important;fill:#5cb85c !important}.pf-map .jsplumb-endpoint-drop-forbidden circle{stroke:#a52521 !important;fill:#a52521 !important}.pf-map svg.jsplumb-connector{cursor:pointer;stroke-linecap:round;-webkit-transition:stroke 0.18s ease-out;transition:stroke 0.18s ease-out;will-change:all}.pf-map svg.jsplumb-connector path{-webkit-transition:stroke 0.18s ease-out;transition:stroke 0.18s ease-out}.pf-map svg.jsplumb-connector path:not(:first-child){stroke:#3c3f41}.pf-map svg.jsplumb-connector path:first-child{stroke:#63676a}.pf-map svg.jsplumb-connector.jsplumb-hover{z-index:80}.pf-map svg.jsplumb-connector.jsplumb-hover path:first-child{stroke:#eaeaea}.pf-map svg.jsplumb-connector.jsplumb-dragging{-webkit-transition:opacity 0.18s ease-out;transition:opacity 0.18s ease-out;opacity:0.4;z-index:80}.pf-map svg.pf-map-connection-jumpbridge{z-index:50}.pf-map svg.pf-map-connection-jumpbridge path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge path:not(:first-child){stroke:#568a89}.pf-map svg.pf-map-connection-jumpbridge:hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge:hover path:not(:first-child){stroke:#eaeaea}.pf-map svg.pf-map-connection-stargate{z-index:60}.pf-map svg.pf-map-connection-stargate path:first-child{stroke:#63676a}.pf-map svg.pf-map-connection-stargate path:not(:first-child){stroke:#313966}.pf-map svg.pf-map-connection-stargate:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-fresh,.pf-map svg.pf-map-connection-wh-reduced,.pf-map svg.pf-map-connection-wh-critical,.pf-map svg.pf-map-connection-wh-eol{z-index:70}.pf-map svg.pf-map-connection-wh-eol path:first-child{stroke:#d747d6}.pf-map svg.pf-map-connection-wh-eol:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-reduced path:not(:first-child){stroke:#e28a0d}.pf-map svg.pf-map-connection-wh-critical path:not(:first-child){stroke:#a52521}.pf-map .pf-map-connection-overlay{padding:1px 4px;font-size:11px;z-index:1020;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.pf-map .frig{background-color:#f0ad4e;color:#1d1d1d}.pf-map .mass{background-color:#a52521;color:#eaeaea}.pf-map .eol{background-color:#3c3f41;color:#d747d6}.ui-dialog-content label{min-width:60px}.dropdown-menu{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:1020;will-change:opacity, top, left, transform}.dropdown-menu a{cursor:pointer}.dropdown-menu i{width:20px}.pf-system-tooltip-inner{color:#adadad;padding:2px 4px;min-width:25px;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}.pf-system-info-module h5{text-transform:capitalize;line-height:16px}.pf-system-info-module .pf-system-info-description-area{min-height:123px}.pf-system-info-module .pf-system-info-description-area .editable-container{width:100%}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform{width:100%}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform .form-group{width:100%}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform .form-group .editable-input{width:calc(100% - 75px)}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform .form-group .editable-input textarea{width:100%;max-height:200px;resize:vertical}.pf-system-info-module .pf-system-info-description-area .pf-form-field-char-count{display:block;margin-top:10px}.pf-system-info-module .pf-system-info-table{font-size:11px;white-space:nowrap}.pf-sig-table-module .pf-sig-table-clear-button{will-change:opacity, transform;display:none}.pf-sig-table-module .pf-sig-table{font-size:10px}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text{white-space:normal}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty{border-bottom:none}.pf-sig-table-module .pf-sig-table .pf-editable-description{background-color:#2b2b2b;max-height:50px}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-name-input{text-transform:uppercase}.pf-sig-table-module .pf-sig-table .pf-editable-filter{color:#63676a;border:none;font-style:normal}.pf-editable-filter-active{min-width:100px}.pf-system-graph-module .pf-system-graph{width:100%;height:100px}.pf-system-route-module .pf-system-route-table{width:100%;font-size:10px}.pf-system-route-module .pf-system-route-table td{text-transform:capitalize}.pf-system-route-module .pf-system-route-table td>.fa{font-size:10px}.pf-system-killboard-module .pf-system-killboard-graph-kills{width:100%;height:100px;position:relative;margin-bottom:30px}.pf-system-killboard-module .pf-system-killboard-list{padding-bottom:10px;border-bottom:1px solid #2b2b2b}.pf-system-killboard-module .pf-system-killboard-list li{margin-left:0;overflow:visible;min-height:50px;will-change:margin-left;-webkit-transition:margin-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7);transition:margin-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7)}.pf-system-killboard-module .pf-system-killboard-list li h5{white-space:nowrap}.pf-system-killboard-module .pf-system-killboard-list li h3{width:120px;display:inline-block}.pf-system-killboard-module .pf-system-killboard-list li .pf-system-killboard-img-corp{margin-right:10px;width:16px}.pf-system-killboard-module .pf-system-killboard-list li .pf-system-killboard-img-ship{width:50px;margin-right:10px;border:1px solid #2b2b2b;transform:translateZ(1px);will-change:border-color;-moz-border-radius:25px;-webkit-border-radius:25px;border-radius:25px;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list li:before{content:"\f054";font-family:FontAwesome;position:absolute;z-index:10;left:-25px;top:15px;color:#477372;opacity:0;will-change:opacity, left;-webkit-transition:all 0.12s ease-out;transition:all 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list li:hover{margin-left:20px}.pf-system-killboard-module .pf-system-killboard-list li:hover .pf-system-killboard-img-ship{border-color:#568a89}.pf-system-killboard-module .pf-system-killboard-list li:hover:before{opacity:1;left:-20px}input,select{background-color:#313335;color:#adadad;border:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}input:focus,select:focus{border-color:#568a89}input:-webkit-autofill,select:-webkit-autofill{background-color:#313335 !important;-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important;-webkit-text-fill-color:#adadad}input:-webkit-autofill:focus,select:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important;-webkit-text-fill-color:#adadad}input::-webkit-file-upload-button,select::-webkit-file-upload-button{background-color:transparent;border:none;color:#63676a;outline:none}.btn-fake{border:none;text-align:left;cursor:default;opacity:1 !important;color:#63676a !important;background-color:#3c3f41 !important}.pf-form-dropzone{border:2px dashed #2b2b2b;height:100px;background-color:#353739;text-align:center;font-size:20px;line-height:100px;margin:15px 0;color:#2b2b2b;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-webkit-transition:color 0.18s ease-out,border-color 0.18s ease-out;transition:color 0.18s ease-out,border-color 0.18s ease-out}.pf-form-dropzone:hover{color:#568a89;border-color:#568a89;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}.toggle.btn:active{box-shadow:none}.toggle .toggle-group .btn{padding:0px 5px}.pf-icon{display:inline-block}.pf-icon.disabled{opacity:0.5;color:#63676a}.pf-icon-dotlan{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAwpJREFUeNqslE9oXFUUxr9z7333vZk3k3+1JGkyldI44KYKFbSIihbauBOrNkgXdeGqVnAhFnfiQgTFCtJNEQndVDDSFrRBWiGutEYFi2mlhQraP2km02by8ubdd/8cF8WJi+z0bA/nx3cO5/uImfFfSwHAwh9PbNR7EMBLBGoyuA3gKwCzAEAEbLu/gqkXLuLUFzchNhjeAuAXSWJBkXyFwcOSxOOK5FkCMYDnN1QSAoOIQIQnBdGcAP2a+3Kb8dbZYBuCZCcW0Y00io8IiBnP4QMCvSnEvyBbRxMstsuGKXiOJD5ZLlcP586cFJr3S025Z1vtlmY5s90HhpL6dKKi30wIf+W5/xjAvXWmTyzuyLJwvr8eXejYtcOZ6/4ZV2g/Z/rZsqVTu6wpEvJcUK7dLlYDI7zsLB+VUj3cU/L1mSX9yM6+YzzsjmeuOJHEary7pOjulURzoNPs8VN11E4NNnnROHdppcxHtsjKwSRWsgeJRDzvOMyvlMUmpXHAZvLVO5criiQPqzgMMeOd7LpuRqk/UBsPr+fGHOw68z4xobfO9ocIHXSQGzuhpECwdArAcRHxRQbWQAAJ3mdzqYnoZwC7looOCl+uQ9q3gIg1pKTbITCE4jEA37GjfhD2AgA7WpBRKAE0AviaFhKSxDqkdcuM9Im0OZCk10wRrug+/2H/RPGZL+mYzSTKVfl7bax8rD5unzEFb45IfTqcDqbBYqx3k92Tm8bjKmZil3xbkfGurjGt2hh/RIRDZkUdkjqg3jA7g+DzocRbg2maO8vZ5hG9F8B1YmbcyXfjdttO+hJnhcBky6zMd71t6YS8lDjHAROl4e0I9PaArr03OlQzP1y4Ozc0GO156tHv7ym5sViCCLMQeINIzN6XDBzJbFcYa/e5MjQF0Zm6VDPVOK5pEfHqmr3a2JrsSVOx/rFEPRsc9RxuEuhkf1R916sw7REuC9CIJPlNAO9w7E+zw3P1usQ/CaA2MODnDP7Ssn+NQC8KiKcBFI79jwCmAFwiArxfjxD6P/Lk7wEA9Dls2LsiUxoAAAAASUVORK5CYII=');width:17px;height:17px;opacity:0.8;margin:-5px 0px 0 10px}.pf-icon-wormhol-es{background:url('data:image/png;base64,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');width:17px;height:17px;opacity:0.8;margin:-5px 0px 0 10px}.modal-content h2{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;letter-spacing:0px;font-size:14px;margin:20px 0;line-height:normal}.modal-content h2.pf-dynamic-area,.modal-content h4.pf-dynamic-area{min-height:0;margin:10px 0}.modal-content h2.pf-dynamic-area>img,.modal-content h4.pf-dynamic-area>img{margin:-10px 5px -10px -10px;width:35px}.modal-content .dataTable,.modal-content .table{font-size:10px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.modal-content hr{margin:5px 0 15px 0;border-color:#63676a}.modal-content .pf-wizard-navigation{margin:0}.modal-content .pf-wizard-navigation li:not(:last-child):before{border-top:1px solid #63676a;content:"";display:block;font-size:0;overflow:hidden;position:relative;top:12px;left:71px;right:1px;width:100%}.modal-content .pf-wizard-navigation li.finished:before{-moz-border-image:-moz-linear-gradient(left, #375959,#375959) 1 1%;-moz-border-image:linear-gradient(to right, #375959,#375959) 1 1%;-o-border-image:linear-gradient(to right, #375959,#375959) 1 1%;-webkit-border-image:-webkit-linear-gradient(left, #375959,#375959) 1 1%;-webkit-border-image:linear-gradient(to right, #375959,#375959) 1 1%;border-image:-moz-linear-gradient(left, #375959,#375959) 1 1%;border-image:-webkit-linear-gradient(left, #375959,#375959) 1 1%;border-image:linear-gradient(to right, #375959,#375959) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li.active:before{-moz-border-image:-moz-linear-gradient(left, #4f9e4f,#63676a) 1 1%;-moz-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;-o-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;-webkit-border-image:-webkit-linear-gradient(left, #4f9e4f,#63676a) 1 1%;-webkit-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;border-image:-moz-linear-gradient(left, #4f9e4f,#63676a) 1 1%;border-image:-webkit-linear-gradient(left, #4f9e4f,#63676a) 1 1%;border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li>h6{color:#63676a;font-size:11px;margin:5px}.modal-content .pf-wizard-navigation li a:hover+h6{color:#adadad}.modal-content .pf-wizard-navigation li.active a:not(.btn-danger)+h6{color:#adadad}#pf-settings-dialog .form-group .btn-sm,#pf-settings-dialog .form-group .btn-group-sm>.btn{padding:4px 7px 3px}#pf-settings-dialog #pf-dialog-captcha-wrapper{margin:0;padding:3px 0}#pf-map-dialog #pf-map-dialog-character-select,#pf-map-dialog #pf-map-dialog-corporation-select,#pf-map-dialog #pf-map-dialog-alliance-select{width:300px}#pf-route-dialog #pf-route-dialog-map-select{width:300px !important}#pf-manual-scrollspy{position:relative;height:700px;overflow:auto}.pf-system-dialog-select{width:270px !important}.pf-credits-dialog .pf-credits-logo-background{overflow:visible;background:url("../img/logo_bg.png");padding:20px;margin-bottom:20px}.pf-credits-dialog #pf-logo-container{width:355px;height:366px;margin:0 auto}.pf-log-graph{height:100px;width:100%}.pf-animation-slide-in{-moz-animation-duration:1.2s;-webkit-animation-duration:1.2s;-moz-animation-name:pfSlideIn;-webkit-animation-name:pfSlideIn;position:relative}@-webkit-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-moz-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-ms-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}.pf-animation-pulse-success{-webkit-animation:pulseBackgroundSuccess 1.5s 1;animation:pulseBackgroundSuccess 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}.pf-animation-pulse-success .sorting_1{-webkit-animation:pulseBackgroundSuccessActive 1.5s 1;animation:pulseBackgroundSuccessActive 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}.pf-animation-pulse-warning{-webkit-animation:pulseBackgroundWarning 1.5s 1;animation:pulseBackgroundWarning 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}.pf-animation-pulse-warning .sorting_1{-webkit-animation:pulseBackgroundWarningActive 1.5s 1;animation:pulseBackgroundWarningActive 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}@-webkit-keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@-moz-keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@-ms-keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@-webkit-keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@-moz-keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@-ms-keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@-webkit-keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@-moz-keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@-ms-keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@-webkit-keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}@-moz-keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}@-ms-keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}@keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}.pf-animate-rotate{-webkit-transition:all 0.08s linear;transition:all 0.08s linear}.pf-animate-rotate.right{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.timeline{list-style:none;position:relative}.timeline:before{top:0;bottom:0;position:absolute;content:" ";width:1px;left:50%;margin-top:20px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRmOWU0ZiIvPjxzdG9wIG9mZnNldD0iMjUlIiBzdG9wLWNvbG9yPSIjNjM2NzZhIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4f9e4f),color-stop(25%, #63676a));background-image:-moz-linear-gradient(top, #4f9e4f,#63676a 25%);background-image:-webkit-linear-gradient(top, #4f9e4f,#63676a 25%);background-image:linear-gradient(to bottom, #4f9e4f,#63676a 25%)}.timeline>li{margin-bottom:20px;position:relative}.timeline>li.timeline-first .timeline-title{color:#4f9e4f}.timeline>li.timeline-first .timeline-badge{background-color:#4f9e4f}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{width:47%;float:left;border:1px solid #313335;padding:8px;position:relative;background-color:#313335;font-size:11px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.timeline>li>.timeline-panel:before{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-panel:after{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-badge{color:#2b2b2b;width:22px;height:22px;line-height:22px;text-align:center;position:absolute;top:7px;left:50%;margin-left:-11px;background-color:#63676a;z-index:100;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}.timeline>li.timeline-inverted>.timeline-panel:after{border-left-width:0;border-right-width:8px;left:-9px;right:auto}.timeline-title{margin-top:0;color:inherit}.timeline-body>p,.timeline-body>ul{margin-bottom:0;list-style-type:disc;margin-left:15px}.timeline-body>p+p{margin-top:5px}@media (max-width: 1200px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(100% - 62px)}ul.timeline>li>.timeline-badge{left:29px;margin-left:0;top:6px}ul.timeline>li>.timeline-panel{float:right}ul.timeline>li>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}ul.timeline>li>.timeline-panel:after{border-left-width:0;border-right-width:7px;left:-8px;right:auto}}.ribbon-wrapper{width:72px;height:88px;overflow:hidden;position:absolute;top:-3px;right:7px}.ribbon{font:bold 12px "Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#2b2b2b;text-align:center;text-shadow:rgba(255,255,255,0.2) 0px 1px 0px;position:relative;padding:3px 0;left:-4px;top:16px;width:99px;-webkit-box-shadow:2px 3px 3px rgba(0,0,0,0.2);box-shadow:2px 3px 3px rgba(0,0,0,0.2);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ribbon:before,.ribbon:after{content:"";border-left:3px solid transparent;border-right:3px solid transparent;position:absolute;bottom:-3px}.ribbon.ribbon-default{color:#adadad;background-color:#353739;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJkMzAzMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzJhMmIyZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2d3031),color-stop(100%, #2a2b2d));background-image:-moz-linear-gradient(top, #2d3031,#2a2b2d);background-image:-webkit-linear-gradient(top, #2d3031,#2a2b2d);background-image:linear-gradient(to bottom, #2d3031,#2a2b2d)}.ribbon.ribbon-default:before,.ribbon.ribbon-default:after{border-top:3px solid #000}.ribbon.ribbon-green{background-color:#5cb85c;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUxYjM1MSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRhOTQ0YSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #51b351),color-stop(100%, #4a944a));background-image:-moz-linear-gradient(top, #51b351,#4a944a);background-image:-webkit-linear-gradient(top, #51b351,#4a944a);background-image:linear-gradient(to bottom, #51b351,#4a944a)}.ribbon.ribbon-green:before,.ribbon.ribbon-green:after{border-top:3px solid #285028}.ribbon.ribbon-orange{background-color:#e28a0d;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Q0ODEwYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2I0NmQwYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d4810c),color-stop(100%, #b46d0b));background-image:-moz-linear-gradient(top, #d4810c,#b46d0b);background-image:-webkit-linear-gradient(top, #d4810c,#b46d0b);background-image:linear-gradient(to bottom, #d4810c,#b46d0b)}.ribbon.ribbon-orange:before,.ribbon.ribbon-orange:after{border-top:3px solid #6c4107}.ribbon:before{left:0}.ribbon:after{right:0}.pf-loading-bars-container{position:relative;z-index:4;margin:0 auto;left:5px;right:19px;width:70px;height:50px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader{position:absolute;z-index:3;margin:0 auto;left:0;right:0;top:50%;margin-top:-19px;width:56px;height:37px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader li{background-color:#5cb85c;width:6px;height:6px;float:right;margin-right:3px !important;-webkit-box-shadow:0px 12px 6px rgba(0,0,0,0.2);box-shadow:0px 12px 6px rgba(0,0,0,0.2)}.pf-loading-bars-container .pf-loading-bars-loader li:first-child{-webkit-animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s;animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(2){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(3){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(4){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(5){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(6){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s}@-webkit-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-moz-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-ms-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}#pf-server-panel{position:fixed;top:50px;min-width:100px;left:10px;border-radius:5px;padding:7px;box-shadow:0 4px 10px rgba(0,0,0,0.4);background-color:rgba(43,43,43,0.7)}#pf-server-panel h4{margin:5px 0 10px 0}#pf-server-panel ul{margin-bottom:0}#pf-server-panel ul li{text-transform:lowercase}.youtube{background-position:center;background-repeat:no-repeat;position:relative;display:inline-block;overflow:hidden;transition:all 200ms ease-out;cursor:pointer}.youtube .play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAERklEQVR4nOWbTWhcVRTHb1IJVoxGtNCNdal2JYJReC6GWuO83PM/59yUS3FRFARdFlwYP1CfiojQWt36sRCUurRIdVFXIn41lAoVdRGrG1M01YpKrWjiYmaSl8ybZJL3cd+YA//NLObd3++eO8x79z5jSq5Gw+8kov0AP8vMR5l1BtBZQM4B8ks75wCdZdYZZj5qLZ4hov2Nht9Z9vhKKSIaB/gI4M4w62KeAO6Mte4lYOq20FxrlqqOibhHmeWbvNC9ZfDX1mLae391aN6limO/gwgvAPJbWeAZuSDingdwXTBw7/0IsyaA/Fkh+KqOkD+YNfHej1QKD+y7iVlOhgLvFqFfNJvNGyuBJ+KDAF8MDd0tgS8y64OlgSdJMsysL4cG7SOHkyQZLhTee7+d2R2rAVy/S+Jd7/32ouBHAP4gNNRGQyTHc/84NhqNywZp5rvjjnnvt21aABFeCQ+RLwAf2hQ8s7sv9OCLk6AHNgQvIrvbfzKCD76g/O6cu7lf/iER/aQGgy448pExZmhdegAPhR9sObFWH1gT3lp7DaA/5bkIgJhZPgsNmz02novj+KqeApj1ubwXWe4kdyeznAgNvTpE/HQmvKqOMeuFogTUVQSRno+iaLRLAJF7uIgL9O4ubgL8aWgB7S44mNX+35YpICUiAvS9sBLkq1WzT+NFffl6AuoiApi6NT37h6sWkBIRZGkQ8YtLgyji6e1mBYTqCEBPG2Naz+0BWQgtoGoRgCzEsd9hAN1X5BfnFZASUfrSAFQNsyZ1FJASUVpHiLinDJG8U2cBZYogkrcNs5waBAGdstbeU9zdqpw0gPwwSAI6VUxHyFlDpOcHUUBBIuYNs14aZAE5RVwyzPr3/0EAEY0TyfGNjBWQvwZ +CTSbehfAH29mrID8bET0+0EUkAd8WYDOmqJ3ecsG30yr9wqRfm6Y+a1BEFDEjHfHvWmY9ck6CygHvBVr8Xhtb4ZE5HZA3y8DvBNA1TjnrmXWf+sioMwZX5V/VHXMGGMMoKdDCxCRvRWBdzKzdHEO+EisilbPyopHYqp6S9UCAsz4iojI7hUDAtyXVQgIDd6KnOoaWNkbI6FaPSuZGyMArsi7MZoloB4zviI/Nhr3X95jltwTRQmoIfgisy5ai+me67OI7fE4nrqjrqfK1t0eby0FPRB6oGVlchL3rgnfrq19RKbVBdhV9IOSwJmfmJi4vi/4ThERitwyCxVAFqydshuCX5awhQ9KtmuIWd8IDZED/nXT77rvVVv6sHRKwjYi91poqP7Dr+Y6JJ1VSZIMA3wkPNy6bX+o8Bcm0sXMdwM8Fxo0A3xORPaWBp6uPXsmbxCRD0NDL0dOANhVCXy6iAjMcjbcrMt3RITKwdMVRdFo+y5yvkL4eWZ+zHt/ZVD4dEVRNGotpst+dZZZH8k86lqn2pIvT/eqrNfn2xuyqYPZ8mv7s8pfn/8Pybm4TIjanscAAAAASUVORK5CYII=") no-repeat center center;background-size:64px 64px;position:absolute;height:100%;width:100%;opacity:.8;filter:alpha(opacity=80);transition:all 0.2s ease-out}.youtube .play:hover{opacity:1;filter:alpha(opacity=100)} + * ======================================================================== */label.checkbox .toggle,label.checkbox.inline .toggle{margin-left:-20px;margin-right:5px}.toggle{min-width:40px;height:20px;position:relative;overflow:hidden}.toggle input[type="checkbox"]{display:none}.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left 0.35s;-webkit-transition:left 0.35s;-moz-user-select:none;-webkit-user-select:none}.toggle.off .toggle-group{left:-100%}.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}.toggle-handle{position:relative;margin:0 auto;padding-top:0px;padding-bottom:0px;height:100%;width:0px;border-width:0 1px}.toggle-handle.btn-mini{top:-2px}.toggle.btn{min-width:30px}.toggle-on.btn{padding-right:24px}.toggle-off.btn{padding-left:24px}.toggle.btn-large{min-width:40px}.toggle-on.btn-large{padding-right:35px}.toggle-off.btn-large{padding-left:35px}.toggle.btn-small{min-width:25px}.toggle-on.btn-small{padding-right:20px}.toggle-off.btn-small{padding-left:20px}.toggle.btn-mini{min-width:20px}.toggle-on.btn-mini{padding-right:12px}.toggle-off.btn-mini{padding-left:12px}.checkbox{padding-left:20px}.checkbox label{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.checkbox label::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:3px;background-color:#313335;-webkit-transition:border 0.15s ease-in-out,color 0.15s ease-in-out;transition:border 0.15s ease-in-out,color 0.15s ease-in-out}.checkbox label::after{display:inline-block;position:absolute;width:16px;height:16px;left:0;top:0;margin-left:-20px;padding-left:3px;padding-top:1px;font-size:11px;color:#adadad}.checkbox input[type="checkbox"],.checkbox input[type="radio"]{opacity:0;z-index:1}.checkbox input[type="checkbox"]:focus+label::before,.checkbox input[type="radio"]:focus+label::before{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}.checkbox input[type="checkbox"]:checked+label::after,.checkbox input[type="radio"]:checked+label::after{font-family:"FontAwesome";content:""}.checkbox input[type="checkbox"]:indeterminate+label::after,.checkbox input[type="radio"]:indeterminate+label::after{display:block;content:"";width:10px;height:3px;background-color:#555555;border-radius:2px;margin-left:-16.5px;margin-top:7px}.checkbox input[type="checkbox"]:disabled+label,.checkbox input[type="radio"]:disabled+label{opacity:0.65}.checkbox input[type="checkbox"]:disabled+label::before,.checkbox input[type="radio"]:disabled+label::before{background-color:#adadad;cursor:not-allowed}.checkbox.checkbox-circle label::before{border-radius:50%}.checkbox.checkbox-inline{margin-top:0}.checkbox-primary input[type="checkbox"]:checked+label::before,.checkbox-primary input[type="radio"]:checked+label::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:checked+label::after,.checkbox-primary input[type="radio"]:checked+label::after{color:#fff}.checkbox-danger input[type="checkbox"]:checked+label::before,.checkbox-danger input[type="radio"]:checked+label::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:checked+label::after,.checkbox-danger input[type="radio"]:checked+label::after{color:#fff}.checkbox-info input[type="checkbox"]:checked+label::before,.checkbox-info input[type="radio"]:checked+label::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:checked+label::after,.checkbox-info input[type="radio"]:checked+label::after{color:#fff}.checkbox-warning input[type="checkbox"]:checked+label::before,.checkbox-warning input[type="radio"]:checked+label::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:checked+label::after,.checkbox-warning input[type="radio"]:checked+label::after{color:#fff}.checkbox-success input[type="checkbox"]:checked+label::before,.checkbox-success input[type="radio"]:checked+label::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:checked+label::after,.checkbox-success input[type="radio"]:checked+label::after{color:#fff}.checkbox-primary input[type="checkbox"]:indeterminate+label::before,.checkbox-primary input[type="radio"]:indeterminate+label::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:indeterminate+label::after,.checkbox-primary input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-danger input[type="checkbox"]:indeterminate+label::before,.checkbox-danger input[type="radio"]:indeterminate+label::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:indeterminate+label::after,.checkbox-danger input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-info input[type="checkbox"]:indeterminate+label::before,.checkbox-info input[type="radio"]:indeterminate+label::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:indeterminate+label::after,.checkbox-info input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-warning input[type="checkbox"]:indeterminate+label::before,.checkbox-warning input[type="radio"]:indeterminate+label::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:indeterminate+label::after,.checkbox-warning input[type="radio"]:indeterminate+label::after{background-color:#fff}.checkbox-success input[type="checkbox"]:indeterminate+label::before,.checkbox-success input[type="radio"]:indeterminate+label::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:indeterminate+label::after,.checkbox-success input[type="radio"]:indeterminate+label::after{background-color:#fff}.radio{padding-left:20px}.radio label{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.radio label::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:50%;background-color:#313335;-webkit-transition:border 0.15s ease-in-out;transition:border 0.15s ease-in-out}.radio label::after{display:inline-block;position:absolute;content:" ";width:11px;height:11px;left:3px;top:3px;margin-left:-20px;border-radius:50%;background-color:#adadad;-webkit-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition:-webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);-moz-transition:-moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);-o-transition:-o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);transition:transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33)}.radio input[type="radio"]{opacity:0;z-index:1}.radio input[type="radio"]:focus+label::before{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}.radio input[type="radio"]:checked+label::after{-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1)}.radio input[type="radio"]:disabled+label{opacity:0.65}.radio input[type="radio"]:disabled+label::before{cursor:not-allowed}.radio.radio-inline{margin-top:0}.radio-primary input[type="radio"]+label::after{background-color:#375959}.radio-primary input[type="radio"]:checked+label::before{border-color:#375959}.radio-primary input[type="radio"]:checked+label::after{background-color:#375959}.radio-danger input[type="radio"]+label::after{background-color:#a52521}.radio-danger input[type="radio"]:checked+label::before{border-color:#a52521}.radio-danger input[type="radio"]:checked+label::after{background-color:#a52521}.radio-info input[type="radio"]+label::after{background-color:#316490}.radio-info input[type="radio"]:checked+label::before{border-color:#316490}.radio-info input[type="radio"]:checked+label::after{background-color:#316490}.radio-warning input[type="radio"]+label::after{background-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::before{border-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::after{background-color:#e28a0d}.radio-success input[type="radio"]+label::after{background-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::before{border-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::after{background-color:#4f9e4f}input[type="checkbox"].styled:checked+label:after,input[type="radio"].styled:checked+label:after{font-family:"FontAwesome";content:""}input[type="checkbox"] .styled:checked+label::before,input[type="radio"] .styled:checked+label::before{color:#fff}input[type="checkbox"] .styled:checked+label::after,input[type="radio"] .styled:checked+label::after{color:#fff}html{margin:0;padding:0;height:100%;position:relative}body{margin:0;padding:0;min-height:100%;direction:ltr}body.mobile-view-activated.hidden-menu{overflow-x:hidden}body.modal-open{overflow:hidden !important}a:hover,a:active,a:focus,button,button:active,button:focus,object,embed,input::-moz-focus-inner{outline:0}h1,h3,h4{margin:0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.page-title{margin:12px 0 28px}.page-title span{font-size:15px;color:#313335;display:inline-block;vertical-align:1px}label{font-weight:normal}*:focus{outline:0 !important}a,input,button{-ms-touch-action:none !important}textarea:focus,select:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{outline:0;outline:thin dotted \9;box-shadow:inset -1px 1px 5px 0 rgba(0,0,0,0.8) !important}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-xs,.form-control{border-radius:0px !important;-webkit-border-radius:0px !important;-moz-border-radius:0px !important}.input-xs{height:24px;padding:2px 10px;font-size:11px;line-height:1.5}.btn-xs,.btn-group-xs>.btn{padding:0px 2px;font-size:10px;line-height:1.3}.btn-sm,.btn-group-sm>.btn{padding:5px 8px 4px}.btn-lg,.btn-group-lg>.btn{padding:10px 16px}.no-space{margin:0}.no-space>[class*="col-"]{margin:0 !important;padding-right:0;padding-left:0}h1{letter-spacing:-1px;font-size:22px;margin:10px 0}h1 small{font-size:12px;font-weight:300;letter-spacing:-1px}h2{font-size:20px;margin:20px 0;line-height:normal}h3{display:block;font-size:17px;font-weight:400;margin:20px 0;line-height:normal}h4{line-height:normal;margin:20px 0 10px 0}h5{font-size:14px;font-weight:300;margin-top:0;margin-bottom:10px;line-height:normal}h6{font-size:13px;margin:10px 0;font-weight:bold;line-height:normal}.row-seperator-header{margin:15px 14px 20px;border-bottom:none;display:block;color:#303133;font-size:20px;font-weight:400}.center-canvas,.center-child-canvas>canvas{display:block !important;margin:0 auto !important}.smart-accordion-default.panel-group{margin-bottom:0px}.smart-accordion-default.panel-group .panel+.panel{margin-top:-1px}.smart-accordion-default.panel-group .panel-heading{padding:0px}.smart-accordion-default.panel-group .panel-title a{display:block;padding:10px 15px;text-decoration:none !important}.smart-accordion-default .panel-heading,.panel-group .panel{border-radius:0px;-webkit-border-radius:0px;-moz-border-radius:0px}.smart-accordion-default .panel-default>.panel-heading{background-color:#f3f3f3}.smart-accordion-default .panel-default{border-color:#8d9194}.smart-accordion-default .panel-title>a>:first-child{display:none}.smart-accordion-default .panel-title>a.collapsed>.fa{display:none}.smart-accordion-default .panel-title>a.collapsed>:first-child{display:inline-block}.no-padding .smart-accordion-default>div{border-left:none !important;border-right:none !important}.no-padding .smart-accordion-default>div:first-child{border-top:none !important}.no-padding .smart-accordion-default>div:last-child{border-bottom:none !important}.onoffswitch-container{margin-top:4px;margin-left:7px;display:inline-block}.onoffswitch{position:relative;width:50px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;margin-top:3px;margin-bottom:3px;margin-left:5px;display:inline-block;vertical-align:middle}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:1px solid #484c4e;border-radius:50px;border-color:#777b7f #7c8184 #686c6f;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.onoffswitch-inner{width:200%;margin-left:-100%;display:block}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:15px;padding:0;line-height:15px;font-size:10px;color:#fff;font-family:Trebuchet, Arial, sans-serif;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.onoffswitch-inner:before{content:attr(data-swchon-text);text-shadow:0 -1px 0 #313335;padding-left:7px;background-color:#3276b1;color:#fff;box-shadow:inset 0 2px 6px rgba(0,0,0,0.5),0 1px 2px rgba(0,0,0,0.05);text-align:left}.onoffswitch-inner:after{content:attr(data-swchoff-text);padding-right:7px;text-shadow:0 -1px 0 #fff;background-color:#fff;color:#3c3f41;text-align:right;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-switch{width:19px;height:19px;margin:-2px;background:white;border:1px solid #64686b;border-radius:50px;position:absolute;top:0;bottom:0;right:32px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background-color:#eaeaea;background-image:-moz-linear-gradient(top, #fff, #adadad);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#adadad));background-image:-webkit-linear-gradient(top, #fff, #adadad);background-image:-o-linear-gradient(top, #fff, #adadad);background-image:linear-gradient(to bottom, #ffffff,#adadad);background-repeat:repeat-x;-webkit-box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3);box-shadow:1px 1px 4px 0px rgba(0,0,0,0.3)}.onoffswitch-checkbox+.onoffswitch-label .onoffswitch-switch:before,.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00d";color:#a52521;display:block;text-align:center;line-height:19px;font-size:10px;text-shadow:0 -1px 0 #fff;font-weight:bold;font-family:FontAwesome}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch:before{content:"\f00c";color:#428bca}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0;display:block}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0px}.onoffswitch-switch:hover{background-color:#adadad}.onoffswitch-switch:active{background-color:#adadad;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-inner:after,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-inner:before{text-shadow:0 1px 0 #fff;background:#bfbfbf;color:#313335}.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-switch,.onoffswitch-checkbox:disabled+.onoffswitch-label .onoffswitch-switch{background-color:#eaeaea;background-image:-moz-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#bfbfbf), to(#eaeaea));background-image:-webkit-linear-gradient(top, #bfbfbf, #eaeaea);background-image:-o-linear-gradient(top, #bfbfbf, #eaeaea);background-image:linear-gradient(to bottom, #bfbfbf,#eaeaea);box-shadow:none !important}.onoffswitch-checkbox:disabled+.onoffswitch-label,.onoffswitch-checkbox:checked:disabled+.onoffswitch-label .onoffswitch-label{border-color:#74797c #63676a #525558 !important}.onoffswitch-checkbox:checked+.onoffswitch-label{border-color:#3276b1 #2a6395 #255681}.onoffswitch+span,.onoffswitch-title{display:inline-block;vertical-align:middle;margin-top:-5px}.form-control{box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.form hr{margin-left:-13px;margin-right:-13px;border-color:rgba(0,0,0,0.1);margin-top:20px;margin-bottom:20px}.form fieldset{display:block;border:none;background:rgba(255,255,255,0.9);position:relative}fieldset{position:relative}.form-actions{display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(239,239,239,0.9);margin-top:25px;margin-left:-13px;margin-right:-13px;margin-bottom:-13px;text-align:right}.well .form-actions{margin-left:-19px;margin-right:-19px;margin-bottom:-19px}.well.well-lg .form-actions{margin-left:-24px;margin-right:-24px;margin-bottom:-24px}.well.well-sm .form-actions{margin-left:-9px;margin-right:-9px;margin-bottom:-9px}.popover-content .form-actions{margin:0 -14px -9px;border-radius:0 0 3px 3px;padding:9px 14px}.no-padding .form .form-actions{margin:0;display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(248,248,248,0.9);text-align:right;margin-top:25px}.form header,legend{display:block;padding:8px 0;border-bottom:1px dashed rgba(0,0,0,0.2);background:#fff;font-size:16px;font-weight:300;color:#2b2b2b;margin:25px 0px 20px}.no-padding .form header{margin:25px 14px 0}.form header:first-child{margin-top:10px}legend{font-weight:400;margin-top:0px;background:none}.input-group-addon{padding:6px 10px;will-change:background-color, border-color;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-webkit-transition:all ease-out 0.15s;transition:all ease-out 0.15s}.input-group-addon .fa,.input-group-addon .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .input-group-addon li>i{font-size:14px}.input-group-addon .fa-lg,.input-group-addon .fa-2x{font-size:2em}.input-group-addon .fa-3x,.input-group-addon .fa-4x,.input-group-addon .fa-5x{font-size:30px}input[type="text"]:focus+.input-group-addon,input[type="password"]:focus+.input-group-addon,input[type="email"]:focus+.input-group-addon{border-color:#568a89;color:#568a89}.has-warning input[type="text"],.has-warning input[type="text"]+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]+.input-group-addon{background-color:#fbe3c0;color:#2b2b2b}.has-warning input[type="text"]:focus,.has-warning input[type="text"]:focus+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]:focus+.input-group-addon{background-color:#e28a0d;color:#fff}.has-error .input-group-addon{border-color:#d9534f !important;background:#d9534f !important;color:#2b2b2b !important}.has-success .input-group-addon{border-color:#4f9e4f !important;background-color:#2b2b2b !important;color:#4f9e4f !important}.form fieldset .form-group:last-child,.form fieldset .form-group:last-child .note,.form .form-group:last-child,.form .form-group:last-child .note{margin-bottom:0}.note{margin-top:6px;padding:0 1px;font-size:11px;line-height:15px;color:#63676a}.input-icon-right{position:relative}.input-icon-right>i,.input-icon-left>i{position:absolute;right:10px;top:30%;font-size:16px;color:#bfbfbf}.input-icon-left>i{right:auto;left:24px}.input-icon-right .form-control{padding-right:27px}.input-icon-left .form-control{padding-left:29px}input[type="text"].ui-autocomplete-loading,input[type="password"].ui-autocomplete-loading,input[type="datetime"].ui-autocomplete-loading,input[type="datetime-local"].ui-autocomplete-loading,input[type="date"].ui-autocomplete-loading,input[type="month"].ui-autocomplete-loading,input[type="time"].ui-autocomplete-loading,input[type="week"].ui-autocomplete-loading,input[type="number"].ui-autocomplete-loading,input[type="email"].ui-autocomplete-loading,input[type="url"].ui-autocomplete-loading,input[type="search"].ui-autocomplete-loading,input[type="tel"].ui-autocomplete-loading,input[type="color"].ui-autocomplete-loading{background-image:url("../img/select2-spinner.gif") !important;background-repeat:no-repeat;background-position:99% 50%;padding-right:27px}.input-group-addon .checkbox,.input-group-addon .radio{min-height:0px;margin-right:0px !important;padding-top:0}.input-group-addon label input[type="checkbox"].checkbox+span,.input-group-addon label input[type="radio"].radiobox+span,.input-group-addon label input[type="radio"].radiobox+span:before,.input-group-addon label input[type="checkbox"].checkbox+span:before{margin-right:0px}.input-group-addon .onoffswitch,.input-group-addon .onoffswitch-label{margin:0}.alert{margin-bottom:10px;margin-top:0px;padding:5px 15px 5px 34px;color:#675100;border-width:0px;border-left-width:3px;padding:10px}.alert .ui-pnotify-title{line-height:12px}.alert .ui-pnotify-text{font-size:10px}.alert .close{top:0px;right:-5px;line-height:20px}.alert-heading{font-weight:600}.alert-danger{border-color:#a52521;color:#2b2b2b;background:#f6d1d0;text-shadow:none}.alert-danger .ui-pnotify-icon{color:#a52521}.alert-warning{border-color:#e28a0d;color:#2b2b2b;background:#fdedd8}.alert-warning .ui-pnotify-icon{color:#e28a0d}.alert-success{border-color:#4f9e4f;color:#2b2b2b;background:#d1e8d1}.alert-success .ui-pnotify-icon{color:#4f9e4f}.alert-info{border-color:#316490;color:#2b2b2b;background:#abc9e2}.alert-info .ui-pnotify-icon{color:#316490}.progress-micro{height:2px !important;line-height:2px !important}.progress-xs{height:7px !important;line-height:7px !important}.progress-sm{height:14px !important;line-height:14px !important}.progress-lg{height:30px !important;line-height:30px !important}.progress .progress-bar{position:absolute;overflow:hidden;line-height:18px}.progress .progressbar-back-text{position:absolute;width:100%;height:100%;font-size:12px;line-height:20px;text-align:center}.progress .progressbar-front-text{display:block;width:100%;font-size:12px;line-height:20px;text-align:center}.progress.right .progress-bar{right:0}.progress.right .progressbar-front-text{position:absolute;right:0}.progress.vertical{width:25px;height:100%;min-height:150px;margin-right:20px;display:inline-block;margin-bottom:0px}.progress.wide-bar{width:40px}.progress.vertical.bottom{position:relative}.progress.vertical.bottom .progressbar-front-text{position:absolute;bottom:0}.progress.vertical .progress-bar{width:100%;height:0;-webkit-transition:height 0.6s ease;transition:height 0.6s ease}.progress.vertical.bottom .progress-bar{position:absolute;bottom:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{position:relative;margin-bottom:20px;overflow:hidden;height:18px;background:#adadad;box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-webkit-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;-moz-box-shadow:0 1px 0 transparent,0 0 0 1px #aeb1b3 inset;border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px}.progress-bar{float:left;width:0;height:100%;font-size:11px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);font-weight:bold;text-shadow:0 -1px 0 rgba(0,0,0,0.25);-webkit-transition:width 1.5s ease-in-out;transition:width 1.5s ease-in-out}.progress-striped .progress-bar{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-info .bar,.progress .bar-info{background:#316490}.vertical-bars{padding:0;margin:0}.vertical-bars:after{content:"";display:block;height:0;clear:both}.vertical-bars li{padding:14px 0;width:25%;display:block;float:left;text-align:center}.vertical-bars li:first-child{border-left:none}.vertical-bars>li>.progress.vertical:first-child{margin-left:auto}.vertical-bars>li>.progress.vertical{margin:0 auto;float:none}.nav-tabs{border-bottom:none}.nav-tabs>li>a .badge{font-size:11px;padding:3px 5px 3px 5px;opacity:.5;margin-left:5px;min-width:17px;font-weight:normal}.tabs-left .nav-tabs>li>a .badge{margin-right:5px;margin-left:0px}.nav-tabs>li>a .label{display:inline-block;font-size:11px;margin-left:5px;opacity:.5}.nav-tabs>li>a{color:#adadad;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.nav-tabs>li>a:hover{color:#1d1d1d;border-color:transparent transparent #adadad transparent;margin-top:1px;border-top-width:0}.nav-tabs>li.active>a{background-color:#adadad;color:#2b2b2b;border-top-width:0px !important;margin-top:1px !important;font-weight:bold}.tabs-left .nav-tabs>li.active>a{-webkit-box-shadow:-2px 0 0 #428bca;-moz-box-shadow:-2px 0 0 #428bca;box-shadow:-2px 0 0 #428bca;border-top-width:1px !important;border-left:none !important;margin-left:1px !important}.tabs-left .nav-pills>li.active>a{border:none !important;box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.tabs-right .nav-tabs>li.active>a{-webkit-box-shadow:2px 0 0 #428bca;-moz-box-shadow:2px 0 0 #428bca;box-shadow:2px 0 0 #428bca;border-top-width:1px !important;border-right:none !important;margin-right:1px !important}.tabs-below .nav-tabs>li.active>a{-webkit-box-shadow:0 2px 0 #428bca;-moz-box-shadow:0 2px 0 #428bca;box-shadow:0 2px 0 #428bca;border-bottom-width:0px !important;border-top:none !important;margin-top:0px !important}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li,.tabs-left>.nav-pills>li,.tabs-right>.nav-pills>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a,.tabs-left>.nav-pills>li>a,.tabs-right>.nav-pills>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs,.tabs-left>.nav-pills{float:left;margin-right:19px;border-right:1px solid #9b9b9b}.tabs-left>.nav-pills{border-right:none}.tabs-left>.nav-tabs>li>a{margin-right:-1px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#adadad #949494 #adadad #adadad}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#949494 transparent #949494 #9b9b9b;*border-right-color:#fff}.tabs-left>.tab-content{margin-left:109px}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #9b9b9b}.tabs-right>.nav-tabs>li>a{margin-left:-1px}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#adadad #adadad #adadad #9b9b9b}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#9b9b9b #9b9b9b #9b9b9b transparent;*border-left-color:#fff}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#9b9b9b;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #9b9b9b #9b9b9b #9b9b9b}.nav-tabs.bordered{background:#fff;border:1px solid #9b9b9b}.nav-tabs.bordered>:first-child a{border-left-width:0px !important}.nav-tabs.bordered+.tab-content{border:1px solid #9b9b9b;border-top:none}.tabs-pull-right.nav-tabs>li,.tabs-pull-right.nav-pills>li{float:right}.tabs-pull-right.nav-tabs>li:first-child>a,.tabs-pull-right.nav-pills>li:first-child>a{margin-right:1px}.tabs-pull-right.bordered.nav-tabs>li:first-child>a,.tabs-pull-right.bordered.nav-pills>li:first-child>a{border-left-width:1px !important;margin-right:0px;border-right-width:0px}.dropdown-menu-xs{min-width:37px}.dropdown-menu-xs>li>a{padding:3px 10px}.dropdown-menu-xs>li>a:hover i{color:#fff !important}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#2b2b2b;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#adadad}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}.pagination>li>a,.pagination>li>span{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.btn-default.disabled{color:#adadad}.btn{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;will-change:background-color, border-color;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-transition:all 0.18s ease-in-out;transition:all 0.18s ease-in-out}.btn.btn-ribbon{background-color:#707070;background-image:-moz-linear-gradient(top, #777, #666);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#777), to(#666));background-image:-webkit-linear-gradient(top, #777, #666);background-image:-o-linear-gradient(top, #777, #666);background-image:linear-gradient(to bottom, #777777,#666666);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff777777', endColorstr='#ff666666', GradientType=0);color:white;padding:0 5px;line-height:20px;vertical-align:middle;height:20px;display:block;border:none;float:left;margin:0 8px 0 0;cursor:pointer}.btn.btn-ribbon>i{font-size:111%}.ribbon-button-alignment{padding-top:10px;display:inline-block}.ribbon-button-alignment.pull-right>.btn.btn-ribbon{margin:0 0 0 8px}.panel-purple{border-color:#6e587a}.panel-purple>.panel-heading{color:#fff;background-color:#6e587a;border-color:#6e587a}.panel-greenLight{border-color:#71843f}.panel-greenLight>.panel-heading{color:#fff;background-color:#71843f;border-color:#71843f}.panel-greenDark{border-color:#496949}.panel-greenDark>.panel-heading{color:#fff;background-color:#496949;border-color:#496949}.panel-darken{border-color:#313335}.panel-darken>.panel-heading{color:#fff;background-color:#404040;border-color:#404040}.panel-pink{border-color:#e06fdf}.panel-pink>.panel-heading{color:#fff;background-color:#e06fdf;border-color:#e06fdf}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.panel-blueLight{border-color:#92a2a8}.panel-blueLight>.panel-heading{color:#fff;background-color:#92a2a8;border-color:#92a2a8}.panel-pinkDark{border-color:#a8829f}.panel-pinkDark>.panel-heading{color:#fff;background-color:#a8829f;border-color:#a8829f}.panel-redLight{border-color:#a65858}.panel-redLight>.panel-heading{color:#fff;background-color:#a65858;border-color:#a65858}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{color:#fff;background-color:#d9534f;border-color:#d9534f}.panel-teal{border-color:#568a89}.panel-teal>.panel-heading{color:#fff;background-color:#568a89;border-color:#568a89}.panel-orange{border-color:#e28a0d}.panel-orange>.panel-heading{color:#fff;background-color:#e28a0d;border-color:#e28a0d}.panel-blueDark{border-color:#4c4f53}.panel-blueDark>.panel-heading{color:#fff;background-color:#4c4f53;border-color:#4c4f53}.panel-magenta{border-color:#6e3671}.panel-magenta>.panel-heading{color:#fff;background-color:#6e3671;border-color:#6e3671}.panel-blue{border-color:#428bca}.panel-blue>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-footer>.btn-block{border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px;border-bottom:none;border-left:none;border-right:none}.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:18px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;-webkit-box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12);box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12)}.btn-circle.btn-sm,.btn-group-sm>.btn-circle.btn{width:22px;height:22px;padding:4px 0;font-size:12px;line-height:14px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn{width:50px;height:50px;padding:10px 15px;font-size:18px;line-height:30px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 15px;font-size:24px;line-height:50px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-metro{margin:0 0 20px;padding-top:15px;padding-bottom:15px}.btn-metro>span{display:block;vertical-align:bottom;margin-top:10px;text-transform:uppercase}.btn-metro>span.label{position:absolute;top:0px;right:0px}.btn-label{position:relative;left:-8px;display:inline-block;padding:5px 8px;background:rgba(0,0,0,0.15);border-radius:3px 0 0 3px}.btn-labeled{padding-top:0;padding-bottom:0}.btn-link{box-shadow:none;-webkit-box-shadow:none;font-size:13px}.morris-hover.morris-default-style{border-radius:5px;padding:5px;color:#666;background:rgba(29,29,29,0.9);border:solid 2px #375959;font-family:'Oxygen Bold';font-size:10px;text-align:left;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap}.morris-hover{position:absolute;z-index:903}.fixed-page-footer .morris-hover{z-index:900}.txt-color.txt-color-blue,.txt-color-blue.pf-help,.pf-help:hover,.pf-landing .pf-landing-list li>i.pf-help:hover,.pf-landing .pf-landing-list li>i.txt-color-blue{color:#428bca !important}.txt-color.txt-color-blueLight,.txt-color-blueLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-blueLight{color:#92a2a8 !important}.txt-color.txt-color-blueDark,.txt-color-blueDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-blueDark{color:#4c4f53 !important}.txt-color.txt-color-grayLightest,.txt-color-grayLightest.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayLightest{color:#eaeaea !important}.txt-color.txt-color-grayLighter,.txt-color-grayLighter.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayLighter{color:#adadad !important}.txt-color.txt-color-grayLight,.txt-color-grayLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayLight{color:#63676a !important}.txt-color.txt-color-gray,.pf-help,.pf-landing .pf-landing-list li>i.txt-color-gray,.pf-landing .pf-landing-list li>i.pf-help{color:#3c3f41 !important}.txt-color.txt-color-grayDark,.txt-color-grayDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-grayDark{color:#313335 !important}.txt-color.txt-color-greenLight,.txt-color-greenLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-greenLight{color:#66c84f !important}.txt-color.txt-color-green,.txt-color-green.pf-help,.pf-help.pf-log-info,.txt-color.pf-log-info,.pf-landing .pf-landing-list li>i.pf-log-info,.pf-landing .pf-landing-list li>i.txt-color-green{color:#5cb85c !important}.txt-color.txt-color-greenDark,.txt-color-greenDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-greenDark{color:#4f9e4f !important}.txt-color.txt-color-redLight,.txt-color-redLight.pf-help,.pf-landing .pf-landing-list li>i.txt-color-redLight{color:#a65858 !important}.txt-color.txt-color-red,.txt-color-red.pf-help,.pf-help.pf-log-error,.txt-color.pf-log-error,.pf-landing .pf-landing-list li>i.pf-log-error,.pf-landing .pf-landing-list li>i.txt-color-red{color:#d9534f !important}.txt-color.txt-color-redDarker,.txt-color-redDarker.pf-help,.pf-landing .pf-landing-list li>i.txt-color-redDarker{color:#a52521 !important}.txt-color.txt-color-yellow,.txt-color-yellow.pf-help,.pf-landing .pf-landing-list li>i.txt-color-yellow{color:#b09b5b !important}.txt-color.txt-color-orange,.txt-color-orange.pf-help,.pf-landing .pf-landing-list li>i.txt-color-orange{color:#e28a0d !important}.txt-color.txt-color-orangeDark,.txt-color-orangeDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-orangeDark{color:#c2760c !important}.txt-color.txt-color-pink,.txt-color-pink.pf-help,.pf-landing .pf-landing-list li>i.txt-color-pink{color:#e06fdf !important}.txt-color.txt-color-pinkDark,.txt-color-pinkDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-pinkDark{color:#a8829f !important}.txt-color.txt-color-purple,.txt-color-purple.pf-help,.pf-landing .pf-landing-list li>i.txt-color-purple{color:#6e587a !important}.txt-color.txt-color-darken,.txt-color-darken.pf-help,.pf-landing .pf-landing-list li>i.txt-color-darken{color:#404040 !important}.txt-color.txt-color-lighten,.txt-color-lighten.pf-help,.pf-landing .pf-landing-list li>i.txt-color-lighten{color:#d5e7ec !important}.txt-color.txt-color-white,.txt-color-white.pf-help,.pf-landing .pf-landing-list li>i.txt-color-white{color:#fff !important}.txt-color.txt-color-magenta,.txt-color-magenta.pf-help,.pf-landing .pf-landing-list li>i.txt-color-magenta{color:#6e3671 !important}.txt-color.txt-color-tealLighter,.txt-color-tealLighter.pf-help,.pf-landing .pf-landing-list li>i{color:#568a89 !important}.txt-color.txt-color-indigoDark,.txt-color-indigoDark.pf-help,.pf-landing .pf-landing-list li>i.txt-color-indigoDark{color:#5c6bc0 !important}.txt-color.txt-color-indigoDarkest,.txt-color-indigoDarkest.pf-help,.pf-landing .pf-landing-list li>i.txt-color-indigoDarkest{color:#313966 !important}.txt-color.txt-color-primary,.txt-color-primary.pf-help,.pf-landing .pf-landing-list li>i.txt-color-primary{color:#375959 !important}.txt-color.txt-color-success,.txt-color-success.pf-help,.pf-landing .pf-landing-list li>i.txt-color-success{color:#4f9e4f !important}.txt-color.txt-color-information,.txt-color-information.pf-help,.pf-landing .pf-landing-list li>i.txt-color-information{color:#316490 !important}.txt-color.txt-color-warning,.txt-color-warning.pf-help,.pf-help.pf-log-warning,.txt-color.pf-log-warning,.pf-landing .pf-landing-list li>i.pf-log-warning,.pf-landing .pf-landing-list li>i.txt-color-warning{color:#e28a0d !important}.txt-color.txt-color-danger,.txt-color-danger.pf-help,.pf-landing .pf-landing-list li>i.txt-color-danger{color:#a52521 !important}.bg-color.bg-color-blue{background-color:#428bca !important}.bg-color.bg-color-blueLight{background-color:#92a2a8 !important}.bg-color.bg-color-blueDark{background-color:#4c4f53 !important}.bg-color.bg-color-green{background-color:#5cb85c !important}.bg-color.bg-color-greenLight{background-color:#71843f !important}.bg-color.bg-color-greenDark{background-color:#496949 !important}.bg-color.bg-color-red{background-color:#d9534f !important}.bg-color.bg-color-yellow{background-color:#b09b5b !important}.bg-color.bg-color-orange{background-color:#e28a0d !important}.bg-color.bg-color-orangeDark{background-color:#c2760c !important}.bg-color.bg-color-pink{background-color:#e06fdf !important}.bg-color.bg-color-pinkDark{background-color:#a8829f !important}.bg-color.bg-color-purple{background-color:#6e587a !important}.bg-color.bg-color-darken{background-color:#404040 !important}.bg-color.bg-color-lighten{background-color:#d5e7ec !important}.bg-color.bg-color-white{background-color:#fff !important}.bg-color.bg-color-gray{background-color:#3c3f41 !important}.bg-color.bg-color-grayDark{background-color:#525252 !important}.bg-color.bg-color-grayDarker{background-color:#2b2b2b !important}.bg-color.bg-color-magenta{background-color:#6e3671 !important}.bg-color.bg-color-tealLighter{background-color:#568a89 !important}.bg-color.bg-color-tealDarker{background-color:#212C30 !important}.bg-color.bg-color-tealDarkest{background-color:#1b2326 !important}.bg-color.bg-color-redLight{background-color:#a65858 !important}body{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.pf-body{overflow:hidden}a{color:#477372;will-change:color;text-decoration:none;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}a:hover{color:#6caead;text-decoration:none}a:focus{color:#477372}em{font-style:italic}em.pf-brand{text-transform:uppercase}.pf-font-capitalize{text-transform:capitalize}.no-padding{padding:0 !important}::-webkit-scrollbar{width:16px;height:16px}::-webkit-scrollbar-track{background-color:#2b2b2b;border-left:1px solid #313335;border-radius:2px;-webkit-transition:background-color 0.5s;transition:background-color 0.5s}::-webkit-scrollbar-thumb{height:6px;border:5px solid transparent;background-clip:padding-box;-webkit-border-radius:8px;background-color:#868c90}::-webkit-scrollbar-thumb:hover{background-color:#a1a5a8}::-webkit-scrollbar-button{width:0;height:0;display:none}::-webkit-scrollbar-corner{background-color:transparent}::selection{background:#adadad;color:#1d1d1d}::-moz-selection{background:#adadad;color:#1d1d1d}.pf-help{cursor:pointer;cursor:help;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.pf-dialog-icon-button,.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty,.pf-sig-table-module .pf-sig-table .fa-plus,.pf-system-route-module .pf-system-route-table td .fa-refresh,.pf-system-route-module .pf-system-route-table td .fa-search-plus{cursor:pointer;margin-top:2px;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-dialog-icon-button:not(.collapsed),.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty:not(.collapsed),.pf-sig-table-module .pf-sig-table .fa-plus:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-refresh:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-search-plus:not(.collapsed),.pf-dialog-icon-button:hover,.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty:hover,.pf-sig-table-module .pf-sig-table .fa-plus:hover,.pf-system-route-module .pf-system-route-table td .fa-refresh:hover,.pf-system-route-module .pf-system-route-table td .fa-search-plus:hover{color:#e28a0d}.pf-module-icon-button{cursor:pointer;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-module-icon-button:hover{color:#e28a0d !important}a.disabled{color:#777;pointer-events:none;cursor:default}.alert{will-change:opacity, transform}.editable-input optgroup[label]{background-color:#3c3f41;color:#63676a}.editable-input optgroup[label] option{background-color:#313335;color:#adadad;font-family:Consolas,monospace,Menlo,Monaco,"Courier New"}select:active,select:hover{outline:none}select:active,select:hover{outline-color:red}.select2-results [class*="col-"]{line-height:22px}.select2 ::-webkit-search-cancel-button{-webkit-appearance:none !important}.select2 .select2-selection__choice__remove{float:left}.select2 .select2-selection--multiple input{box-shadow:none !important}.dataTable th.pf-table-image-cell,.dataTable th.pf-table-image-small-cell{padding-left:0 !important;padding-right:0 !important}.dataTable th.sorting,.dataTable th.sorting_asc,.dataTable th.sorting_desc{padding-right:18px !important}.dataTable td.pf-table-action-cell{cursor:pointer}.dataTable td.pf-table-image-cell{padding:0 !important}.dataTable td.pf-table-image-cell img{width:26px;box-sizing:content-box;border-left:1px solid #3c3f41;border-right:1px solid #3c3f41}.dataTable td.pf-table-image-small-cell img{width:24px;border-left:1px solid transparent;border-right:1px solid transparent}.dataTable td.pf-table-counter-cell{color:#63676a}.dataTable td.pf-table-counter-cell .pf-digit-counter-small{width:20px;display:inline-block;font-size:10px}.dataTable td.pf-table-counter-cell .pf-digit-counter-large{width:26px;display:inline-block;font-size:10px}.dataTable td.separator-right,.dataTable th.separator-right{border-right:1px solid #3c3f41}.dataTable td svg.peity,.dataTable th svg.peity{display:block}table tr.collapsing{-webkit-transition:height 0.01s ease;transition:height 0.01s ease}table tr.collapse.in{display:table-row !important}.pf-table-tools{height:45px}.pf-table-tools .btn:not(:last-child){margin-right:10px}.pf-table-tools-action{will-change:height, opacity, display;opacity:0;display:none;height:0;visibility:hidden}.pf-loading-overlay{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;background:#2b2b2b;z-index:1060;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-loading-overlay .pf-loading-overlay-wrapper{width:25px;height:25px;margin:auto;text-align:center;position:absolute;top:0;left:0;bottom:0;right:0}.pf-loading-overlay .pf-loading-overlay-wrapper i{padding:3px}.navbar-nav li:not(.disabled):hover:before,.navbar-nav li:not(.disabled).active:before{top:-4px;opacity:1}.navbar-nav li:not(.disabled):before{content:'';position:absolute;width:100%;height:2px;background-color:#5cb85c;top:0;opacity:0;will-change:opacity, top;-webkit-transition:top 0.15s ease-out,opacity 0.15s ease-out;transition:top 0.15s ease-out,opacity 0.15s ease-out}.pf-navbar-version-info{cursor:pointer}.pf-site{will-change:transform}.sb-slidebar{will-change:transform}.sb-left .list-group-item{-webkit-box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4)}.sb-right .list-group-item{-webkit-box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4)}.mCSB_container,.mCSB_dragger{will-change:top, left}.pf-timestamp-counter{visibility:hidden}.pf-map-type-private{color:#7986cb}.pf-map-type-corporation{color:#5cb85c}.pf-map-type-alliance{color:#428bca}.pf-map-type-global{color:#568a89}#pf-map-module{margin:20px 10px 0 10px}#pf-map-module #pf-map-tabs .pf-map-type-tab-default{border-top:2px solid transparent}#pf-map-module #pf-map-tabs .pf-map-type-tab-private{border-top:2px solid #7986cb}#pf-map-module #pf-map-tabs .pf-map-type-tab-corporation{border-top:2px solid #5cb85c}#pf-map-module #pf-map-tabs .pf-map-type-tab-alliance{border-top:2px solid #428bca}#pf-map-module #pf-map-tabs .pf-map-type-tab-global{border-top:2px solid #568a89}#pf-map-module #pf-map-tabs .pf-map-tab-icon{margin-right:5px}#pf-map-module #pf-map-tabs .pf-map-tab-shared-icon{margin-left:5px}.pf-map-content-row{margin-top:10px;padding-bottom:40px}.pf-map-content-row .pf-module{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background:rgba(60,63,65,0.3);padding:10px;width:100%;margin-bottom:10px;will-change:height, transform, opacity;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-map-content-row .pf-module:before{content:'';position:absolute;top:0;left:0;border-style:solid;border-width:0 0 8px 8px;border-color:transparent transparent transparent #3c3f41;cursor:pointer}.pf-map-content-row .pf-module .label{margin-bottom:10px}.pf-map-content-row .pf-module .pf-dynamic-area{background:rgba(43,43,43,0.4)}.pf-map-content-row .pf-module h5 .pf-module-icon-button{margin-left:5px}.pf-user-status{color:#a52521}.pf-user-status-corp{color:#5cb85c}.pf-user-status-ally{color:#428bca}.pf-user-status-own{color:#7986cb}.pf-system-effect{display:none;cursor:default;color:#adadad}.pf-system-effect-magnetar{color:#e06fdf;display:inline-block}.pf-system-effect-redgiant{color:#d9534f;display:inline-block}.pf-system-effect-pulsar{color:#428bca;display:inline-block}.pf-system-effect-wolfrayet{color:#e28a0d;display:inline-block}.pf-system-effect-cataclysmic{color:#ffb;display:inline-block}.pf-system-effect-blackhole{color:#000;display:inline-block}.pf-system-info-rally .pf-system-head{background-color:#782d77;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjEuMCIgeTE9IjEuMCIgeDI9IjAuMCIgeTI9IjAuMCI+PHN0b3Agb2Zmc2V0PSIyNSUiIHN0b3AtY29sb3I9IiMzZTI2NGUiLz48c3RvcCBvZmZzZXQ9IjI1JSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzNlMjY0ZSIvPjxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjM2UyNjRlIi8+PHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-webkit-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:linear-gradient(-45deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:25px 25px;-webkit-animation:move 3s linear infinite;-moz-animation:move 3s linear infinite;-ms-animation:move 3s linear infinite;animation:move 3s linear infinite}.pf-system-security-0-0{color:#be0000}.pf-system-security-0-1{color:#ab2600}.pf-system-security-0-2{color:#be3900}.pf-system-security-0-3{color:#c24e02}.pf-system-security-0-4{color:#ab5f00}.pf-system-security-0-5{color:#bebe00}.pf-system-security-0-6{color:#73bf26}.pf-system-security-0-7{color:#00bf00}.pf-system-security-0-8{color:#00bf39}.pf-system-security-0-9{color:#39bf99}.pf-system-security-1-0{color:#28c0bf}.pf-system-sec{margin-right:5px;cursor:-moz-grab;cursor:-webkit-grab}.pf-system-sec-highSec{color:#5cb85c}.pf-system-sec-lowSec{color:#e28a0d}.pf-system-sec-nullSec{color:#d9534f}.pf-system-sec-high{color:#d9534f}.pf-system-sec-mid{color:#e28a0d}.pf-system-sec-low{color:#428bca}.pf-system-sec-unknown{color:#7986cb}.pf-system-status-friendly{border-color:#428bca !important;color:#428bca}.pf-system-status-occupied{border-color:#e28a0d !important;color:#e28a0d}.pf-system-status-hostile{border-color:#d9534f !important;color:#d9534f}.pf-system-status-empty{border-color:#5cb85c !important;color:#5cb85c}.pf-system-status-unscanned{border-color:#568a89 !important;color:#568a89}.pf-system-info-status-label{background-color:#63676a;color:#000;will-change:background-color;-webkit-transition:background-color 0.5s ease-out;transition:background-color 0.5s ease-out}.pf-system-info-status-label.pf-system-status-friendly{background-color:#428bca}.pf-system-info-status-label.pf-system-status-occupied{background-color:#e28a0d}.pf-system-info-status-label.pf-system-status-hostile{background-color:#d9534f}.pf-system-info-status-label.pf-system-status-empty{background-color:#5cb85c}.pf-system-info-status-label.pf-system-status-unscanned{background-color:#568a89}.pf-system-effect-dialog-wrapper .table,.pf-jump-info-dialog .table{margin:15px 0}.pf-system-effect-dialog-wrapper .table td,.pf-jump-info-dialog .table td{text-transform:capitalize}.pf-fake-connection{box-sizing:content-box;display:inline-block;width:70px;height:4px;margin-right:5px;border-top:2px solid #63676a;border-bottom:2px solid #63676a;background-color:#3c3f41;position:relative;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-fake-connection.pf-map-connection-stargate{background-color:#313966;border-color:#63676a}.pf-fake-connection.pf-map-connection-jumpbridge{background-color:#6caead;border-color:#3c3f41;background:repeating-linear-gradient(to right, #6caead, #6caead 10px, #3c3f41 10px, #3c3f41 20px)}.pf-fake-connection.pf-map-connection-wh-eol{border-color:#d747d6}.pf-fake-connection.pf-map-connection-wh-reduced{background-color:#e28a0d}.pf-fake-connection.pf-map-connection-wh-critical{background-color:#a52521}.pf-fake-connection.pf-map-connection-frig{border-style:dashed;border-left:none;border-right:none}.pf-fake-connection.pf-map-connection-frig:after{content:'frig';background-color:#e28a0d;color:#1d1d1d;padding:0px 3px;position:absolute;left:25px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'save mass';background-color:#a52521;color:#eaeaea;padding:0px 3px;position:absolute;left:9px;top:-6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.tooltip-inner{color:#5cb85c;background-color:#3c3f41;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;padding:5px 5px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.modal .tooltip{z-index:1060}.modal .tooltip .tooltip-inner{color:#313335;background-color:#adadad}.tooltip.top .tooltip-arrow{border-top-color:#63676a}.tooltip.right .tooltip-arrow{border-right-color:#63676a}.tooltip.bottom .tooltip-arrow{border-bottom-color:#63676a}.tooltip.left .tooltip-arrow{border-left-color:#63676a}.popover{z-index:1060}.popover img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.popover h4{color:#adadad}.popover table{color:#adadad;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;line-height:16px;font-size:11px}.popover table td{padding:0 5px;vertical-align:middle !important}.pf-popover{display:initial}.pf-popover .popover-content{padding:0}.pf-popover h6{white-space:nowrap;margin-right:50px}.pf-popover h6:before,.pf-popover h6:after{content:" ";display:table}.pf-popover h6:after{clear:both}.pf-popover .well{margin-top:7px;margin-bottom:10px}.pf-popover .list-group{margin:0}.pf-popover .list-group .list-group-item{color:#313335}.pf-popover .list-group .list-group-item:hover{color:#1d1d1d}.pf-popover .list-group .list-group-item.disabled{background-color:#3c3f41;color:#63676a;cursor:not-allowed}.pf-popover .list-group .list-group-item img{width:30px;margin:-8px 10px -6px -8px;border-radius:0}.pf-popover .list-group .list-group-item i{margin-right:20px}td.pf-popover-trigger:hover{color:#477372}.pf-notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.pf-dynamic-area{padding:10px;min-height:100px;position:relative;background-color:#313335;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-dynamic-area .dl-horizontal{margin-bottom:0}.pf-dynamic-area .dl-horizontal dd{min-width:100px}.pf-dynamic-area .dl-horizontal dd.txt-color,.pf-dynamic-area .dl-horizontal dd.pf-help{font-weight:bold}#pf-logo-wrapper{display:block}#pf-head{margin-bottom:0px}#pf-head a{-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out;will-change:color}#pf-head a:focus{color:#477372}#pf-head a:focus img{border-color:#3c3f41}#pf-head a:hover{text-decoration:none}#pf-head a:hover .badge{color:#6caead}#pf-head a:hover img{border-color:#568a89}#pf-head i{margin-right:2px}#pf-head .pf-brand-desc{margin:6px 10px 0 90px;width:180px}#pf-head .pf-head-menu{padding:3px 10px;line-height:24px}#pf-head .pf-head-menu .pf-head-menu-logo{width:24px;height:24px;display:inline-block;float:left}#pf-head .badge{background-color:#3c3f41;color:#adadad}#pf-head .pf-head-user-character,#pf-head .pf-head-user-ship{opacity:0;visibility:hidden}#pf-head .pf-head-active-user,#pf-head #pf-head-current-location{display:none}#pf-head .pf-head-active-user .badge,#pf-head #pf-head-current-location .badge{-webkit-transition:color 0.3s ease-out;transition:color 0.3s ease-out}#pf-head .pf-head-user-character-image,#pf-head .pf-head-user-ship-image{display:inline-block;margin-top:-6px;margin-bottom:-6px;width:27px;border:1px solid #3c3f41;margin-right:3px;-webkit-transition:border-color 0.15s ease-out;transition:border-color 0.15s ease-out;will-change:border-color}#pf-head .pf-head-program-status{cursor:pointer}#pf-head .navbar-text{min-width:60px}#pf-head .tooltip .tooltip-inner{color:#adadad}.pf-head{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}#pf-head-character-switch td{border:none}#pf-head-character-switch td:first-child+td{padding:0 5px}#pf-footer{position:absolute;bottom:0;left:0;width:100%;margin:0;background:rgba(60,63,65,0.3)}#pf-footer a{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#375959}#pf-footer a:hover{color:#477372;text-decoration:none}.navbar-fixed-bottom{padding:2px 0}@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-moz-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-ms-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}.pf-animate{visibility:hidden;opacity:0}.pf-color-line{position:fixed;top:0;left:0;width:100%;height:3px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY2Yzg0ZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzY2Yzg0ZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #66c84f),color-stop(100%, #66c84f));background-image:-moz-linear-gradient(left, #66c84f,#66c84f 100%);background-image:-webkit-linear-gradient(left, #66c84f,#66c84f 100%);background-image:linear-gradient(to right, #66c84f,#66c84f 100%)}.pf-color-line.warning{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UyOGEwZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UyOGEwZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e28a0d),color-stop(100%, #e28a0d));background-image:-moz-linear-gradient(left, #e28a0d,#e28a0d 100%);background-image:-webkit-linear-gradient(left, #e28a0d,#e28a0d 100%);background-image:linear-gradient(to right, #e28a0d,#e28a0d 100%)}.pf-color-line.danger{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2E1MjUyMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2E1MjUyMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #a52521),color-stop(100%, #a52521));background-image:-moz-linear-gradient(left, #a52521,#a52521 100%);background-image:-webkit-linear-gradient(left, #a52521,#a52521 100%);background-image:linear-gradient(to right, #a52521,#a52521 100%)}.pf-splash{position:absolute;z-index:2000;background-color:#1d1d1d;color:#63676a;top:0;bottom:0;left:0;right:0;will-change:opacity}.pf-splash .pf-splash-title{position:fixed;left:50%;top:30%;text-align:center;max-width:500px;padding:20px;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}@media (max-width: 1200px){.pf-landing #pf-logo-container{margin:5px auto}.pf-landing .pf-brand-desc{display:none}.pf-landing .navbar .navbar-brand{margin-left:10px}}.pf-landing section{min-height:200px;padding:20px 0 40px 0;border-bottom:1px solid #2b2b2b}.pf-landing section h4{font-size:18px;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;margin:5px 0 10px 0;border-bottom:1px solid #2b2b2b;line-height:34px}.pf-landing .container>.row{margin-bottom:30px}.pf-landing .alert{box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery]{position:relative}.pf-landing a[data-gallery]:before{content:'\f002';font-family:'FontAwesome';font-size:20px;line-height:20px;color:#e28a0d;position:absolute;top:9px;left:8px;height:100%;width:100%;padding-top:calc(50% - 10px);z-index:10;text-align:center;-webkit-transition:transform 0.1s 0.06s ease-in,opacity 0.1s ease-out;transition:transform 0.1s 0.06s ease-in,opacity 0.1s ease-out;will-change:transform, opacity;transform:scale(0, 0);opacity:0}.pf-landing a[data-gallery]:hover img{border-color:#6caead;-webkit-filter:brightness(50%);filter:brightness(50%)}.pf-landing a[data-gallery]:hover:before{-webkit-transition-delay:.1s;transition-delay:.1s;transform:scale(1, 1);opacity:1}.pf-landing a[data-gallery] .pf-landing-image-preview{border-width:1px;border-style:solid;border-color:#1d1d1d;margin:5px 0 15px 0;display:inline-block;will-change:all;-webkit-filter:brightness(100%);filter:brightness(100%);-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-small{height:160px}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-medium{height:256px}#pf-landing-top{height:450px;border-bottom:1px solid #313335;position:relative}#pf-landing-top:before{content:'';width:100%;height:100%;position:absolute;background:url("../img/pf-bg.jpg") #05050a;background-repeat:no-repeat;background-position:0 0;-webkit-filter:brightness(.9);filter:brightness(.9)}#pf-landing-top #pf-header-container{position:absolute;width:100%;background-position:center center}#pf-landing-top #pf-header-container #pf-header-canvas{position:absolute;visibility:hidden;top:0;left:0}#pf-landing-top #pf-header-container #pf-logo-container{z-index:110}#pf-landing-top #pf-header-container #pf-header-preview-container{position:absolute;left:400px;width:590px;height:350px;top:92px}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element{position:relative;margin-left:12px;margin-top:12px;height:155px;width:180px;padding:7px;opacity:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-color:rgba(43,43,43,0.5)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:nth-child(n+4){box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:after{content:'';position:absolute;width:calc(100% - 14px);height:calc(100% - 14px);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-repeat:no-repeat;background-position:50% 50%;background-color:rgba(29,29,29,0.75)}#pf-landing-top .container{position:relative;margin-top:50px}#pf-header-preview-intel:after{background-image:url("../img/landing/intel.png")}#pf-header-preview-map:after{background-image:url("../img/landing/map.png")}#pf-header-preview-scope:after{background-image:url("../img/landing/scope.png")}#pf-header-preview-signature:after{background-image:url("../img/landing/signature.png")}#pf-header-preview-data:after{background-image:url("../img/landing/data.png")}#pf-header-preview-gameplay:after{background-image:url("../img/landing/gameplay.png")}#pf-landing-login{padding-top:40px;padding-bottom:30px}#pf-landing-login .row{margin-bottom:0}#pf-landing-login .pf-character-selection>div:not(.pf-character-row-animate){-webkit-transition:width 0.2s ease,margin 0.2s ease;transition:width 0.2s ease,margin 0.2s ease}#pf-landing-login .pf-dynamic-area{display:inline-block;margin:10px 5px 20px 5px;padding:10px 10px 5px 10px;min-width:155px;min-height:184px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper{opacity:0;width:128px;border:2px solid #63676a;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;-webkit-transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);will-change:border-color, transition;overflow:hidden;cursor:pointer;display:inline-block;background-color:#2b2b2b;box-sizing:content-box}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover{border-color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-name{color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-image{-webkit-filter:grayscale(50%);filter:grayscale(50%)}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image{overflow:hidden;width:128px;height:128px;position:relative}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info{position:absolute;top:0;left:0;width:0;height:100%;color:#adadad;background:rgba(60,63,65,0.8);overflow:hidden;will-change:width, transition;padding:10px 0}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info .pf-character-info-text{line-height:25px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-name{font-size:13px;line-height:30px;border-top:1px solid #313335;color:#adadad;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-image{-webkit-transition:all 0.3s ease-out;transition:all 0.3s ease-out;-webkit-filter:grayscale(0%);filter:grayscale(0%)}#pf-landing-login .pf-sso-login-button{position:relative;display:inline-block;width:270px;height:45px;border:none;margin-bottom:10px;background-color:transparent;background-image:url("../img/landing/eve_sso_login_buttons_large_black_hover.png");cursor:pointer;box-shadow:0 2px 5px rgba(0,0,0,0.2);-webkit-transition:box-shadow 0.12s ease-out;transition:box-shadow 0.12s ease-out;will-change:box-shadow}#pf-landing-login .pf-sso-login-button:after{content:' ';position:absolute;width:270px;height:45px;left:0;top:0;background-image:url("../img/landing/eve_sso_login_buttons_large_black.png");-webkit-transition:opacity 0.12s ease-in-out;transition:opacity 0.12s ease-in-out;will-change:opacity}#pf-landing-login .pf-sso-login-button:hover{box-shadow:0 4px 5px rgba(0,0,0,0.2)}#pf-landing-login .pf-sso-login-button:hover:after{opacity:0}#pf-landing-login #pf-notification-panel{display:none}#pf-header-map{position:relative;margin:0 auto;height:380px;width:600px;pointer-events:none}#pf-header-map .pf-header-svg-layer{position:absolute;top:0;left:0;right:0;bottom:0}#pf-header-map #pf-header-systems{z-index:100}#pf-header-map #pf-header-connectors{z-index:90}#pf-header-map #pf-header-connections{z-index:80}#pf-header-map #pf-header-background{z-index:70}#pf-header-map #pf-header-background .pf-header-system{display:none}#pf-header-map-bg{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none}#pf-header-map-bg img{pointer-events:none}#pf-header-map-bg #pf-map-bg-image{opacity:0;position:absolute;bottom:0;right:0;width:100%;height:100%}#pf-header-map-bg #pf-map-neocom{opacity:0;height:665px;width:21px}#pf-header-map-bg #pf-map-browser{opacity:0;position:absolute;top:110px;left:21px;height:560px;width:515px}#pf-landing-gallery-carousel{background-image:url("../img/pf-header-bg.jpg")}#pf-landing-gallery-carousel .slide-content{border-radius:5px;pointer-events:none}#pf-landing-gallery-carousel h3{width:100%;text-align:left}.pf-landing-pricing-panel{margin-top:20px}.pricing-big{-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pricing-big .panel-heading{border-color:#3c3f41}.pricing-big .the-price{padding:1px 0;background:#2d3031;text-align:center}.pricing-big .the-price .subscript{font-size:12px;color:#63676a}.pricing-big .price-features{background:#3c3f41;color:#adadad;padding:20px 15px;min-height:205px;line-height:22px}.pricing-big .price-features .list-unstyled.text-left li,.pricing-big .price-features .text-left.list-inline li{text-indent:-1em;padding-left:1.5em}.pricing-big .price-features .list-unstyled.text-left li .fa,.pricing-big .price-features .text-left.list-inline li .fa,.pricing-big .price-features .list-unstyled.text-left .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pricing-big .price-features .list-unstyled.text-left li>i,.pricing-big .price-features .text-left.list-inline .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pricing-big .price-features .text-left.list-inline li>i{text-indent:0}.pricing-big table tr td{line-height:1}#pf-landing-about .pf-landing-about-me{width:256px;height:256px;border:none;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing-footer{padding:30px 0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#171717}.pf-landing-footer .pf-social-networks>li{display:inline-block;line-height:1}.pf-landing-footer .pf-social-networks>li a{display:inline-block;background:rgba(99,103,106,0.5);line-height:24px;text-align:center;font-size:12px;margin-right:5px;width:28px;height:24px}#pf-static-logo-svg{opacity:0;position:absolute;z-index:105;overflow:visible}#pf-static-logo-svg path{will-change:fill, opacity, transform, translateZ, translateX, translateY;pointer-events:all;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.logo-ploygon-top-right{fill:#477372;fill-rule:evenodd;stroke:#477372;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-bottom-left{fill:#5cb85c;fill-rule:evenodd;stroke:#5cb85c;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-bottom-right{fill:#375959;fill-rule:evenodd;stroke:#375959;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-top-left{fill:#63676a;fill-opacity:1;fill-rule:evenodd;stroke:#63676a;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1}@-webkit-keyframes bounce{0%, 20%, 50%, 80%, 100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-8px)}60%{-webkit-transform:translateY(-4px)}}@keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}#pf-map-tab-element{max-width:2515px;margin:0 auto}.pf-map-tab-content .pf-map-wrapper{position:relative;width:100%;max-width:2515px;height:550px;overflow:auto;padding:5px;background:rgba(43,43,43,0.93);box-shadow:inset -3px 3px 10px 0 rgba(0,0,0,0.3);border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-width:1px;border-style:solid;border-color:#313335}.pf-map-overlay{position:absolute;display:none;z-index:10000;height:36px;right:10px;background:rgba(0,0,0,0.25);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-map-overlay.pf-map-overlay-timer{width:36px;bottom:23px}.pf-map-overlay.pf-map-overlay-info{top:8px;color:#2b2b2b;padding:3px;line-height:26px;min-height:36px;min-width:36px}.pf-map-overlay.pf-map-overlay-info i{margin:0;margin-top:3px;width:0;height:26px;opacity:0;color:#63676a;transform:scale(0);transform-origin:50% 50% 0px;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;cursor:help;will-change:all}.pf-map-overlay.pf-map-overlay-info i.fa,.pf-map-overlay.pf-map-overlay-info .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pf-map-overlay.pf-map-overlay-info li>i{font-size:26px}.pf-map-overlay.pf-map-overlay-info i.glyphicon{margin-top:1px;font-size:24px;padding-left:3px}.pf-map-overlay.pf-map-overlay-info i.active,.pf-map-overlay.pf-map-overlay-info i:hover{color:#c2760c}.pf-grid-small{background:url('data:image/png;base64,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') !important}.pf-map{width:2500px;height:520px;position:relative;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-map .jsplumb-overlay{opacity:1;pointer-events:none;will-change:opacity;-webkit-transition:opacity 0.18s ease-out;transition:opacity 0.18s ease-out}.pf-map .jsplumb-hover.jsplumb-overlay{opacity:0 !important}.pf-map .jsplumb-hover:not(.jsplumb-overlay){-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce}.pf-map .jsplumb-target-hover,.pf-map .jsplumb-source-hover{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:linear;animation-timing-function:linear;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-webkit-animation-name:bounce;animation-name:bounce;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.pf-map .pf-system{position:absolute;min-width:60px;height:auto;overflow:hidden;background-color:#313335;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:100;will-change:top, left, opacity;border-width:2px;border-style:solid;border-color:#63676a;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.5s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.pf-map .pf-system:hover{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);-moz-transform:translate3d(0, -2px, 0);-ms-transform:translate3d(0, -2px, 0);-webkit-transform:translate3d(0, -2px, 0);transform:translate3d(0, -2px, 0)}.pf-map .pf-system .pf-system-head{padding:0px 3px 0px 3px;cursor:pointer;font-family:Arial;font-weight:bold}.pf-map .pf-system .pf-system-head .pf-system-head-name{border:none;display:inline-block;min-width:41px;color:#adadad;margin-right:2px}.pf-map .pf-system .pf-system-head .fa-lock{display:none}.pf-map .pf-system .pf-system-head .pf-system-head-expand{margin-left:2px;color:#63676a;display:none}.pf-map .pf-system .pf-system-head .editable-empty{font-style:normal}.pf-map .pf-system .pf-system-body{height:0px;width:100%;overflow:hidden;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab;padding:0 4px;white-space:nowrap;display:none;will-change:width;border-top-width:1px;border-top-style:dashed;border-top-color:#63676a}.pf-map .pf-system .pf-system-body .pf-system-body-item{color:#7c8184;font-size:10px;line-height:16px;height:16px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-right{text-overflow:ellipsis;float:right;color:#f0ad4e;display:none}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status{font-size:7px;width:10px;vertical-align:middle;height:14px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-item-name{display:inline-block;width:65px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pf-map .pf-system .tooltip.in{opacity:1}.pf-map .pf-system .tooltip .tooltip-inner{color:#313335;background-color:#adadad;padding:3px 3px}.pf-map .pf-system-active:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#ffb 0px 0px 8px 0px;box-shadow:#ffb 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target),.pf-map .jsPlumb_dragged:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#58100d 0px 0px 8px 0px;box-shadow:#58100d 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .jsPlumb_dragged:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body,.pf-map .jsPlumb_dragged:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body{background-color:#58100d}.pf-map .pf-system-locked .pf-system-sec{cursor:default !important}.pf-map .pf-system-locked .pf-system-body{cursor:default !important}.pf-map .pf-system-locked .fa-lock{color:#63676a !important;display:inline-block !important}.pf-map .pf-map-endpoint-source,.pf-map .pf-map-endpoint-target{z-index:90}.pf-map .pf-map-endpoint-source svg,.pf-map .pf-map-endpoint-target svg{overflow:visible}.pf-map .pf-map-endpoint-source svg circle,.pf-map .pf-map-endpoint-target svg circle{-webkit-transition:stroke 0.18s ease-out,fill 0.18s ease-out;transition:stroke 0.18s ease-out,fill 0.18s ease-out}.pf-map .pf-map-endpoint-source svg *,.pf-map .pf-map-endpoint-target svg *{stroke:#63676a;stroke-width:2;fill:#3c3f41;cursor:pointer}.pf-map .pf-map-endpoint-source:hover circle,.pf-map .pf-map-endpoint-target:hover circle{stroke:#e28a0d !important}.pf-map .pf-map-endpoint-source.jsplumb-hover,.pf-map .pf-map-endpoint-target.jsplumb-hover{z-index:95}.pf-map .pf-map-endpoint-source.jsplumb-dragging circle,.pf-map .pf-map-endpoint-target.jsplumb-dragging circle{stroke:#e28a0d}.pf-map .jsplumb-endpoint-drop-allowed circle{stroke:#5cb85c !important;fill:#5cb85c !important}.pf-map .jsplumb-endpoint-drop-forbidden circle{stroke:#a52521 !important;fill:#a52521 !important}.pf-map svg.jsplumb-connector{cursor:pointer;stroke-linecap:round;-webkit-transition:stroke 0.18s ease-out;transition:stroke 0.18s ease-out;will-change:all}.pf-map svg.jsplumb-connector path{-webkit-transition:stroke 0.18s ease-out;transition:stroke 0.18s ease-out}.pf-map svg.jsplumb-connector path:not(:first-child){stroke:#3c3f41}.pf-map svg.jsplumb-connector path:first-child{stroke:#63676a}.pf-map svg.jsplumb-connector.jsplumb-hover{z-index:80}.pf-map svg.jsplumb-connector.jsplumb-hover path:first-child{stroke:#eaeaea}.pf-map svg.jsplumb-connector.jsplumb-dragging{-webkit-transition:opacity 0.18s ease-out;transition:opacity 0.18s ease-out;opacity:0.4;z-index:80}.pf-map svg.pf-map-connection-jumpbridge{z-index:50}.pf-map svg.pf-map-connection-jumpbridge path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge path:not(:first-child){stroke:#568a89}.pf-map svg.pf-map-connection-jumpbridge:hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map svg.pf-map-connection-jumpbridge:hover path:not(:first-child){stroke:#eaeaea}.pf-map svg.pf-map-connection-stargate{z-index:60}.pf-map svg.pf-map-connection-stargate path:first-child{stroke:#63676a}.pf-map svg.pf-map-connection-stargate path:not(:first-child){stroke:#313966}.pf-map svg.pf-map-connection-stargate:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-fresh,.pf-map svg.pf-map-connection-wh-reduced,.pf-map svg.pf-map-connection-wh-critical,.pf-map svg.pf-map-connection-wh-eol{z-index:70}.pf-map svg.pf-map-connection-wh-eol path:first-child{stroke:#d747d6}.pf-map svg.pf-map-connection-wh-eol:hover path:first-child{stroke:#eaeaea}.pf-map svg.pf-map-connection-wh-reduced path:not(:first-child){stroke:#e28a0d}.pf-map svg.pf-map-connection-wh-critical path:not(:first-child){stroke:#a52521}.pf-map .pf-map-connection-overlay{padding:1px 4px;font-size:11px;z-index:1020;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.pf-map .frig{background-color:#f0ad4e;color:#1d1d1d}.pf-map .mass{background-color:#a52521;color:#eaeaea}.pf-map .eol{background-color:#3c3f41;color:#d747d6}.ui-dialog-content label{min-width:60px}.dropdown-menu{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:1020;will-change:opacity, top, left, transform}.dropdown-menu a{cursor:pointer}.dropdown-menu i{width:20px}.pf-system-tooltip-inner{color:#adadad;padding:2px 4px;min-width:25px;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}.pf-system-info-module h5{text-transform:capitalize;line-height:16px}.pf-system-info-module .pf-system-info-description-area{min-height:123px}.pf-system-info-module .pf-system-info-description-area .editable-container{width:100%}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform{width:100%}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform .form-group{width:100%}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform .form-group .editable-input{width:calc(100% - 75px)}.pf-system-info-module .pf-system-info-description-area .editable-container .editableform .form-group .editable-input textarea{width:100%;max-height:200px;resize:vertical}.pf-system-info-module .pf-system-info-description-area .pf-form-field-char-count{display:block;margin-top:10px}.pf-system-info-module .pf-system-info-table{font-size:11px;white-space:nowrap}.pf-sig-table-module .pf-sig-table-clear-button{will-change:opacity, transform;display:none}.pf-sig-table-module .pf-sig-table{font-size:10px}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text{white-space:normal}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-desc-text.editable-empty{border-bottom:none}.pf-sig-table-module .pf-sig-table .pf-editable-description{background-color:#2b2b2b;max-height:50px}.pf-sig-table-module .pf-sig-table .pf-sig-table-edit-name-input{text-transform:uppercase}.pf-sig-table-module .pf-sig-table .pf-editable-filter{color:#63676a;border:none;font-style:normal}.pf-editable-filter-active{min-width:100px}.pf-system-graph-module .pf-system-graph{width:100%;height:100px}.pf-system-route-module .pf-system-route-table{width:100%;font-size:10px}.pf-system-route-module .pf-system-route-table td{text-transform:capitalize}.pf-system-route-module .pf-system-route-table td>.fa{font-size:10px}.pf-system-killboard-module .pf-system-killboard-graph-kills{width:100%;height:100px;position:relative;margin-bottom:30px}.pf-system-killboard-module .pf-system-killboard-list{padding-bottom:10px;border-bottom:1px solid #2b2b2b}.pf-system-killboard-module .pf-system-killboard-list li{margin-left:0;overflow:visible;min-height:50px;will-change:margin-left;-webkit-transition:margin-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7);transition:margin-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7)}.pf-system-killboard-module .pf-system-killboard-list li h5{white-space:nowrap}.pf-system-killboard-module .pf-system-killboard-list li h3{width:120px;display:inline-block}.pf-system-killboard-module .pf-system-killboard-list li .pf-system-killboard-img-corp{margin-right:10px;width:16px}.pf-system-killboard-module .pf-system-killboard-list li .pf-system-killboard-img-ship{width:50px;margin-right:10px;border:1px solid #2b2b2b;transform:translateZ(1px);will-change:border-color;-moz-border-radius:25px;-webkit-border-radius:25px;border-radius:25px;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list li:before{content:"\f054";font-family:FontAwesome;position:absolute;z-index:10;left:-25px;top:15px;color:#477372;opacity:0;will-change:opacity, left;-webkit-transition:all 0.12s ease-out;transition:all 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list li:hover{margin-left:20px}.pf-system-killboard-module .pf-system-killboard-list li:hover .pf-system-killboard-img-ship{border-color:#568a89}.pf-system-killboard-module .pf-system-killboard-list li:hover:before{opacity:1;left:-20px}input,select{background-color:#313335;color:#adadad;border:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}input:focus,select:focus{border-color:#568a89}input:-webkit-autofill,select:-webkit-autofill{background-color:#313335 !important;-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important;-webkit-text-fill-color:#adadad}input:-webkit-autofill:focus,select:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important;-webkit-text-fill-color:#adadad}input::-webkit-file-upload-button,select::-webkit-file-upload-button{background-color:transparent;border:none;color:#63676a;outline:none}.btn-fake{border:none;text-align:left;cursor:default;opacity:1 !important;color:#63676a !important;background-color:#3c3f41 !important}.pf-form-dropzone{border:2px dashed #2b2b2b;height:100px;background-color:#353739;text-align:center;font-size:20px;line-height:100px;margin:15px 0;color:#2b2b2b;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-webkit-transition:color 0.18s ease-out,border-color 0.18s ease-out;transition:color 0.18s ease-out,border-color 0.18s ease-out}.pf-form-dropzone:hover{color:#568a89;border-color:#568a89;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}.toggle.btn:active{box-shadow:none}.toggle .toggle-group .btn{padding:0px 5px}.pf-icon{display:inline-block}.pf-icon.disabled{opacity:0.5;color:#63676a}.pf-icon-dotlan{background:url('data:image/png;base64,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');width:17px;height:17px;opacity:0.8;margin:-5px 0px 0 10px}.pf-icon-wormhol-es{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAA5xJREFUeNp8lMtrXGUAxc/33e++Z+ZO5pHJZJK0STSx6UMqYrFYqF1I42NRFxVK3dhF3QiCLkQXbrpzoeBOi0iRbHQhWqEIohJRtAmW1tKaZiZSJ4+ZZObOnZl779zHdz8XkYJIe/6Aw+Fwfoc8e3IR95MggBpJCBk/vJ7rPy3HUlONaT89UDa1kC0FMudEAAwPkJQQyJzmlqYabw3UKGO6ahM0UdtGWDlQL3w8ZpuX+mr0XxMCQNxLIZD2FFydbL7TV2Jj/tres6HCB5QT9eZY69yfZfulim1epkCb3osdS5oSSWU1liwjZLTQM1DP9V/csrxDR6qlCwM1bvly7Ppq3N6/nv+IcRKsljpn9JCBCSJg+Qpqhd752oj9nDpQtghBONzVq77Op7K+Uiv29V93Uj6oIOBUgHHijNupK9Wic3q6aX1OjZChZQYnboy1To2101+XHePKiGMs3y7Zj0oJZRqXjWqh83wqkEEAUAFwKvStjP/4kKutEMBlRJDS8p7t1yda6cWDdwsfemoEPWTIeMrt1RHnVStUozsjzgtlJ3WLcepkPMX+fc/Oa7YRzMzfmDgzkHmfXa+0zxNB4sfuFi+0UgMAgKdwDPf079fy3WMRFftKrsl+e2jzDRZLAhCinQqmn1wrvQdgg1MBaoRsiyVEhIyb9/YBAZZQUAE3YIl1sFHcLPqmXwgML8t1cbQ2+mmup37jqhGIAOhsw1pIiKArw51Xij0dWizB8hXUs/0Tns6fKnf12rcPr031lCDnqIN82/BKm5a7TwCMgOzuaW7qXEgF1W9W2qclQHPUeDKS+eS1idbZyY7V2cj2CiVb/+7A34UPTF9etlx15Xpl52UjkAc5T/sjlhIwV4kxahtfekp2ej3XP55wiSdypI130k1XDSkLSXX/Rv6Trh5yJmg772h3xtuZY7VS99S4nfoKMjwyf3IRBIAZMCQEOpcSE4JIXBJzP83U336iWn5XD9nPAeMgAIgAtIiN/jhX/2xmc+jisGMsUPJvma4aw1diP5KSnVhKGlpIfzAHytZf+d4zWiTtIkEEjFBGM+MfjYlAypfXEiJA/0cugIQIcCrE3m3ri3quf7yvRofTA1nKuhpimjyyNNl4c3ZzaCHrqb9EjN+fYl/hqNjm5UbWnV+cq78/1DVWFU7c9Zx7aKKdujrdtC7aZgAiCMiD/kRKCADMbmf8IwPG9UiOs5RTMtW0LiVUbHC6y/w/AwBZTrZC1ec/kgAAAABJRU5ErkJggg==');width:17px;height:17px;opacity:0.8;margin:-5px 0px 0 10px}.modal-content h2{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;letter-spacing:0px;font-size:14px;margin:20px 0;line-height:normal}.modal-content h2.pf-dynamic-area,.modal-content h4.pf-dynamic-area{min-height:0;margin:10px 0}.modal-content h2.pf-dynamic-area>img,.modal-content h4.pf-dynamic-area>img{margin:-10px 5px -10px -10px;width:35px}.modal-content .dataTable,.modal-content .table{font-size:10px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.modal-content hr{margin:5px 0 15px 0;border-color:#63676a}.modal-content .pf-wizard-navigation{margin:0}.modal-content .pf-wizard-navigation li:not(:last-child):before{border-top:1px solid #63676a;content:"";display:block;font-size:0;overflow:hidden;position:relative;top:12px;left:71px;right:1px;width:100%}.modal-content .pf-wizard-navigation li.finished:before{-moz-border-image:-moz-linear-gradient(left, #375959,#375959) 1 1%;-moz-border-image:linear-gradient(to right, #375959,#375959) 1 1%;-o-border-image:linear-gradient(to right, #375959,#375959) 1 1%;-webkit-border-image:-webkit-linear-gradient(left, #375959,#375959) 1 1%;-webkit-border-image:linear-gradient(to right, #375959,#375959) 1 1%;border-image:-moz-linear-gradient(left, #375959,#375959) 1 1%;border-image:-webkit-linear-gradient(left, #375959,#375959) 1 1%;border-image:linear-gradient(to right, #375959,#375959) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li.active:before{-moz-border-image:-moz-linear-gradient(left, #4f9e4f,#63676a) 1 1%;-moz-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;-o-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;-webkit-border-image:-webkit-linear-gradient(left, #4f9e4f,#63676a) 1 1%;-webkit-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;border-image:-moz-linear-gradient(left, #4f9e4f,#63676a) 1 1%;border-image:-webkit-linear-gradient(left, #4f9e4f,#63676a) 1 1%;border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li>h6{color:#63676a;font-size:11px;margin:5px}.modal-content .pf-wizard-navigation li a:hover+h6{color:#adadad}.modal-content .pf-wizard-navigation li.active a:not(.btn-danger)+h6{color:#adadad}#pf-settings-dialog .form-group .btn-sm,#pf-settings-dialog .form-group .btn-group-sm>.btn{padding:4px 7px 3px}#pf-settings-dialog #pf-dialog-captcha-wrapper{margin:0;padding:3px 0}#pf-map-dialog #pf-map-dialog-character-select,#pf-map-dialog #pf-map-dialog-corporation-select,#pf-map-dialog #pf-map-dialog-alliance-select{width:300px}#pf-route-dialog #pf-route-dialog-map-select{width:300px !important}#pf-manual-scrollspy{position:relative;height:700px;overflow:auto}.pf-system-dialog-select{width:270px !important}#pf-task-dialog .pf-task-dialog-status{min-height:auto}.pf-credits-dialog .pf-credits-logo-background{overflow:visible;background:url("../img/logo_bg.png");padding:20px;margin-bottom:20px}.pf-credits-dialog #pf-logo-container{width:355px;height:366px;margin:0 auto}.pf-log-graph{height:100px;width:100%}.pf-animation-slide-in{-moz-animation-duration:1.2s;-webkit-animation-duration:1.2s;-moz-animation-name:pfSlideIn;-webkit-animation-name:pfSlideIn;position:relative}@-webkit-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-moz-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-ms-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}.pf-animation-pulse-success{-webkit-animation:pulseBackgroundSuccess 1.5s 1;animation:pulseBackgroundSuccess 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}.pf-animation-pulse-success .sorting_1{-webkit-animation:pulseBackgroundSuccessActive 1.5s 1;animation:pulseBackgroundSuccessActive 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}.pf-animation-pulse-warning{-webkit-animation:pulseBackgroundWarning 1.5s 1;animation:pulseBackgroundWarning 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}.pf-animation-pulse-warning .sorting_1{-webkit-animation:pulseBackgroundWarningActive 1.5s 1;animation:pulseBackgroundWarningActive 1.5s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38)}@-webkit-keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@-moz-keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@-ms-keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@keyframes pulseBackgroundSuccess{5%{background-color:#4f9e4f;color:#313335}}@-webkit-keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@-moz-keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@-ms-keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@keyframes pulseBackgroundSuccessActive{5%{background-color:#478d47;color:#313335}}@-webkit-keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@-moz-keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@-ms-keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@keyframes pulseBackgroundWarning{5%{background-color:#e28a0d;color:#2b2b2b}}@-webkit-keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}@-moz-keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}@-ms-keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}@keyframes pulseBackgroundWarningActive{5%{background-color:#ca7b0c;color:#2b2b2b}}.pf-animate-rotate{-webkit-transition:all 0.08s linear;transition:all 0.08s linear}.pf-animate-rotate.right{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.timeline{list-style:none;position:relative}.timeline:before{top:0;bottom:0;position:absolute;content:" ";width:1px;left:50%;margin-top:20px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRmOWU0ZiIvPjxzdG9wIG9mZnNldD0iMjUlIiBzdG9wLWNvbG9yPSIjNjM2NzZhIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4f9e4f),color-stop(25%, #63676a));background-image:-moz-linear-gradient(top, #4f9e4f,#63676a 25%);background-image:-webkit-linear-gradient(top, #4f9e4f,#63676a 25%);background-image:linear-gradient(to bottom, #4f9e4f,#63676a 25%)}.timeline>li{margin-bottom:20px;position:relative}.timeline>li.timeline-first .timeline-title{color:#4f9e4f}.timeline>li.timeline-first .timeline-badge{background-color:#4f9e4f}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{width:47%;float:left;border:1px solid #313335;padding:8px;position:relative;background-color:#313335;font-size:11px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.timeline>li>.timeline-panel:before{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-panel:after{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-badge{color:#2b2b2b;width:22px;height:22px;line-height:22px;text-align:center;position:absolute;top:7px;left:50%;margin-left:-11px;background-color:#63676a;z-index:100;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}.timeline>li.timeline-inverted>.timeline-panel:after{border-left-width:0;border-right-width:8px;left:-9px;right:auto}.timeline-title{margin-top:0;color:inherit}.timeline-body>p,.timeline-body>ul{margin-bottom:0;list-style-type:disc;margin-left:15px}.timeline-body>p+p{margin-top:5px}@media (max-width: 1200px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(100% - 62px)}ul.timeline>li>.timeline-badge{left:29px;margin-left:0;top:6px}ul.timeline>li>.timeline-panel{float:right}ul.timeline>li>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}ul.timeline>li>.timeline-panel:after{border-left-width:0;border-right-width:7px;left:-8px;right:auto}}.ribbon-wrapper{width:72px;height:88px;overflow:hidden;position:absolute;top:-3px;right:7px}.ribbon{font:bold 12px "Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#2b2b2b;text-align:center;text-shadow:rgba(255,255,255,0.2) 0px 1px 0px;position:relative;padding:3px 0;left:-4px;top:16px;width:99px;-webkit-box-shadow:2px 3px 3px rgba(0,0,0,0.2);box-shadow:2px 3px 3px rgba(0,0,0,0.2);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ribbon:before,.ribbon:after{content:"";border-left:3px solid transparent;border-right:3px solid transparent;position:absolute;bottom:-3px}.ribbon.ribbon-default{color:#adadad;background-color:#353739;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJkMzAzMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzJhMmIyZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2d3031),color-stop(100%, #2a2b2d));background-image:-moz-linear-gradient(top, #2d3031,#2a2b2d);background-image:-webkit-linear-gradient(top, #2d3031,#2a2b2d);background-image:linear-gradient(to bottom, #2d3031,#2a2b2d)}.ribbon.ribbon-default:before,.ribbon.ribbon-default:after{border-top:3px solid #000}.ribbon.ribbon-green{background-color:#5cb85c;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUxYjM1MSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRhOTQ0YSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #51b351),color-stop(100%, #4a944a));background-image:-moz-linear-gradient(top, #51b351,#4a944a);background-image:-webkit-linear-gradient(top, #51b351,#4a944a);background-image:linear-gradient(to bottom, #51b351,#4a944a)}.ribbon.ribbon-green:before,.ribbon.ribbon-green:after{border-top:3px solid #285028}.ribbon.ribbon-orange{background-color:#e28a0d;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Q0ODEwYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2I0NmQwYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d4810c),color-stop(100%, #b46d0b));background-image:-moz-linear-gradient(top, #d4810c,#b46d0b);background-image:-webkit-linear-gradient(top, #d4810c,#b46d0b);background-image:linear-gradient(to bottom, #d4810c,#b46d0b)}.ribbon.ribbon-orange:before,.ribbon.ribbon-orange:after{border-top:3px solid #6c4107}.ribbon:before{left:0}.ribbon:after{right:0}.pf-loading-bars-container{position:relative;z-index:4;margin:0 auto;left:5px;right:19px;width:70px;height:50px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader{position:absolute;z-index:3;margin:0 auto;left:0;right:0;top:50%;margin-top:-19px;width:56px;height:37px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader li{background-color:#5cb85c;width:6px;height:6px;float:right;margin-right:3px !important;-webkit-box-shadow:0px 12px 6px rgba(0,0,0,0.2);box-shadow:0px 12px 6px rgba(0,0,0,0.2)}.pf-loading-bars-container .pf-loading-bars-loader li:first-child{-webkit-animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s;animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(2){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(3){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(4){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(5){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(6){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s}@-webkit-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-moz-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-ms-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}#pf-server-panel{position:fixed;top:50px;min-width:100px;left:10px;border-radius:5px;padding:7px;box-shadow:0 4px 10px rgba(0,0,0,0.4);background-color:rgba(43,43,43,0.7)}#pf-server-panel h4{margin:5px 0 10px 0}#pf-server-panel ul{margin-bottom:0}#pf-server-panel ul li{text-transform:lowercase}.youtube{background-position:center;background-repeat:no-repeat;position:relative;display:inline-block;overflow:hidden;transition:all 200ms ease-out;cursor:pointer}.youtube .play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAERklEQVR4nOWbTWhcVRTHb1IJVoxGtNCNdal2JYJReC6GWuO83PM/59yUS3FRFARdFlwYP1CfiojQWt36sRCUurRIdVFXIn41lAoVdRGrG1M01YpKrWjiYmaSl8ybZJL3cd+YA//NLObd3++eO8x79z5jSq5Gw+8kov0AP8vMR5l1BtBZQM4B8ks75wCdZdYZZj5qLZ4hov2Nht9Z9vhKKSIaB/gI4M4w62KeAO6Mte4lYOq20FxrlqqOibhHmeWbvNC9ZfDX1mLae391aN6limO/gwgvAPJbWeAZuSDingdwXTBw7/0IsyaA/Fkh+KqOkD+YNfHej1QKD+y7iVlOhgLvFqFfNJvNGyuBJ+KDAF8MDd0tgS8y64OlgSdJMsysL4cG7SOHkyQZLhTee7+d2R2rAVy/S+Jd7/32ouBHAP4gNNRGQyTHc/84NhqNywZp5rvjjnnvt21aABFeCQ+RLwAf2hQ8s7sv9OCLk6AHNgQvIrvbfzKCD76g/O6cu7lf/iER/aQGgy448pExZmhdegAPhR9sObFWH1gT3lp7DaA/5bkIgJhZPgsNmz02novj+KqeApj1ubwXWe4kdyeznAgNvTpE/HQmvKqOMeuFogTUVQSRno+iaLRLAJF7uIgL9O4ubgL8aWgB7S44mNX+35YpICUiAvS9sBLkq1WzT+NFffl6AuoiApi6NT37h6sWkBIRZGkQ8YtLgyji6e1mBYTqCEBPG2Naz+0BWQgtoGoRgCzEsd9hAN1X5BfnFZASUfrSAFQNsyZ1FJASUVpHiLinDJG8U2cBZYogkrcNs5waBAGdstbeU9zdqpw0gPwwSAI6VUxHyFlDpOcHUUBBIuYNs14aZAE5RVwyzPr3/0EAEY0TyfGNjBWQvwZ +CTSbehfAH29mrID8bET0+0EUkAd8WYDOmqJ3ecsG30yr9wqRfm6Y+a1BEFDEjHfHvWmY9ck6CygHvBVr8Xhtb4ZE5HZA3y8DvBNA1TjnrmXWf+sioMwZX5V/VHXMGGMMoKdDCxCRvRWBdzKzdHEO+EisilbPyopHYqp6S9UCAsz4iojI7hUDAtyXVQgIDd6KnOoaWNkbI6FaPSuZGyMArsi7MZoloB4zviI/Nhr3X95jltwTRQmoIfgisy5ai+me67OI7fE4nrqjrqfK1t0eby0FPRB6oGVlchL3rgnfrq19RKbVBdhV9IOSwJmfmJi4vi/4ThERitwyCxVAFqydshuCX5awhQ9KtmuIWd8IDZED/nXT77rvVVv6sHRKwjYi91poqP7Dr+Y6JJ1VSZIMA3wkPNy6bX+o8Bcm0sXMdwM8Fxo0A3xORPaWBp6uPXsmbxCRD0NDL0dOANhVCXy6iAjMcjbcrMt3RITKwdMVRdFo+y5yvkL4eWZ+zHt/ZVD4dEVRNGotpst+dZZZH8k86lqn2pIvT/eqrNfn2xuyqYPZ8mv7s8pfn/8Pybm4TIjanscAAAAASUVORK5CYII=") no-repeat center center;background-size:64px 64px;position:absolute;height:100%;width:100%;opacity:.8;filter:alpha(opacity=80);transition:all 0.2s ease-out}.youtube .play:hover{opacity:1;filter:alpha(opacity=100)} diff --git a/public/js/v1.2.0/app.js b/public/js/v1.2.0/app.js index 7311009d..063467b8 100644 --- a/public/js/v1.2.0/app.js +++ b/public/js/v1.2.0/app.js @@ -26,8 +26,8 @@ requirejs.config({ text: 'lib/requirejs/text', // v2.0.12 A RequireJS/AMD loader plugin for loading text resources. mustache: 'lib/mustache.min', // v1.0.0 Javascript template engine - http://mustache.github.io localForage: 'lib/localforage.min', // v1.4.2 localStorage library - https://mozilla.github.io/localForage - velocity: 'lib/velocity.min', // v1.2.2 animation engine - http://julian.com/research/velocity - velocityUI: 'lib/velocity.ui.min', // v5.0.4 plugin for velocity - http://julian.com/research/velocity/#uiPack + velocity: 'lib/velocity.min', // v1.4.1 animation engine - http://julian.com/research/velocity + velocityUI: 'lib/velocity.ui.min', // v5.2.0 plugin for velocity - http://julian.com/research/velocity/#uiPack slidebars: 'lib/slidebars', // v0.10 Slidebars - side menu plugin http://plugins.adchsm.me/slidebars jsPlumb: 'lib/dom.jsPlumb-1.7.6', // v1.7.6 jsPlumb (Vanilla)- main map draw plugin https://jsplumbtoolkit.com farahey: 'lib/farahey-0.5', // v0.5 jsPlumb "magnetizing" extension - https://github.com/jsplumb/farahey diff --git a/public/js/v1.2.0/app/counter.js b/public/js/v1.2.0/app/counter.js index 6bfc90bc..040a0e02 100644 --- a/public/js/v1.2.0/app/counter.js +++ b/public/js/v1.2.0/app/counter.js @@ -5,7 +5,7 @@ define([ ], function($, Init, Util) { 'use strict'; - var config = { + let config = { counterDigitSmallClass: 'pf-digit-counter-small', counterDigitLargeClass: 'pf-digit-counter-large' }; @@ -15,13 +15,13 @@ define([ * @param element * @param tempDate */ - var updateDateDiff = function(element, tempDate){ - var diff = Util.getTimeDiffParts(tempDate, new Date()); - var days = diff.days; - var hrs = diff.hours; - var min = diff.min; - var leftSec = diff.sec; - var value = []; + let updateDateDiff = function(element, tempDate){ + let diff = Util.getTimeDiffParts(tempDate, new Date()); + let days = diff.days; + let hrs = diff.hours; + let min = diff.min; + let leftSec = diff.sec; + let value = []; if( days > 0 || @@ -58,19 +58,22 @@ define([ */ $.fn.initTimestampCounter = function(){ return this.each(function(){ - var element = $(this); - var timestamp = parseInt( element.text() ); + let element = $(this); + let timestamp = parseInt( element.text() ); // do not init twice if(timestamp > 0){ // mark as init element.attr('data-counter', 'init'); - var date = new Date( timestamp * 1000); + let date = new Date( timestamp * 1000); updateDateDiff(element, date); - var refreshIntervalId = window.setInterval(function(){ + // show element (if invisible) after first update + element.css({'visibility': 'initial'}); + + let refreshIntervalId = window.setInterval(function(){ // update element with current time if( !element.hasClass('stopCounter')){ diff --git a/public/js/v1.2.0/app/init.js b/public/js/v1.2.0/app/init.js index e99e6573..e067560d 100644 --- a/public/js/v1.2.0/app/init.js +++ b/public/js/v1.2.0/app/init.js @@ -6,7 +6,7 @@ define(['jquery'], function($) { 'use strict'; - var Config = { + let Config = { path: { img: 'public/img/', // path for images // user API @@ -22,6 +22,7 @@ define(['jquery'], function($) { searchAccess: 'api/access/search', // ajax URL - search user/corporation/ally by name // main config/map ping API initMap: 'api/map/init', // ajax URL - get static data + getAccessData: 'api/map/getAccessData', // ajax URL - get map access tokens (WebSocket) updateMapData: 'api/map/updateData', // ajax URL - main map update trigger updateUserData: 'api/map/updateUserData', // ajax URL - main map user data trigger // map API @@ -63,11 +64,35 @@ define(['jquery'], function($) { splashOverlay: 300, // "splash" loading overlay headerLink: 100, // links in head bar mapOverlay: 200, // show/hide duration for map overlays - mapMoveSystem: 300, // system position has changed animation + mapMoveSystem: 180, // system position has changed animation mapDeleteSystem: 200, // remove system from map mapModule: 200, // show/hide of an map module dialogEvents: 180 // dialog events /slide/show/... }, + syncStatus: { + type: 'ajax', + webSocket: { + status: 'closed', + class: 'txt-color-danger', + timestamp: undefined + }, + sharedWorker: { + status: 'offline', // SharedWorker status + class: 'txt-color-danger', + timestamp: undefined + }, + ajax: { + status: 'enabled', + class: 'txt-color-success', + timestamp: undefined + } + }, + performanceLogging: { + keyServerMapData: 'UPDATE_SERVER_MAP', // ajax request update map data + keyClientMapData: 'UPDATE_CLIENT_MAP', // update client map data + keyServerUserData: 'UPDATE_SERVER_USER_DATA', // ajax request update map user data + keyClientUserData: 'UPDATE_CLIENT_USER_DATA', // update client map user data + }, mapIcons: [ // map tab-icons { class: 'fa-desktop', diff --git a/public/js/v1.2.0/app/logging.js b/public/js/v1.2.0/app/logging.js index 252f668f..61f62e94 100644 --- a/public/js/v1.2.0/app/logging.js +++ b/public/js/v1.2.0/app/logging.js @@ -11,288 +11,312 @@ define([ 'use strict'; - var logData = []; // cache object for all log entries - var logDataTable = null; // "Datatables" Object + let logData = []; // cache object for all log entries + let logDataTable = null; // "Datatables" Object // Morris charts data - var maxGraphDataCount = 30; // max date entries for a graph - var chartData = {}; // chart Data object for all Morris Log graphs + let maxGraphDataCount = 30; // max date entries for a graph + let chartData = {}; // chart Data object for all Morris Log graphs - var config = { - dialogDynamicAreaClass: 'pf-dynamic-area', // class for dynamic areas - logGraphClass: 'pf-log-graph', // class for all log Morris graphs - tableToolsClass: 'pf-table-tools' // class for table tools + let config = { + taskDialogId: 'pf-task-dialog', // id for map "task manager" dialog + dialogDynamicAreaClass: 'pf-dynamic-area', // class for dynamic areas + timestampCounterClass: 'pf-timestamp-counter', // class for "timestamp" counter + taskDialogStatusAreaClass: 'pf-task-dialog-status', // class for "status" dynamic area + taskDialogLogTableAreaClass: 'pf-task-dialog-table', // class for "log table" dynamic area + logGraphClass: 'pf-log-graph', // class for all log Morris graphs + tableToolsClass: 'pf-table-tools' // class for table tools }; /** * get log time string * @returns {string} */ - var getLogTime = function(){ - - var serverTime = Util.getServerTime(); - - var logTime = serverTime.toLocaleTimeString('en-US', { hour12: false }); + let getLogTime = function(){ + let serverTime = Util.getServerTime(); + let logTime = serverTime.toLocaleTimeString('en-US', { hour12: false }); return logTime; }; + /** + * updated "sync status" dynamic dialog area + */ + let updateSyncStatus = function(){ + + // check if task manager dialog is open + let logDialog = $('#' + config.taskDialogId); + if(logDialog.length){ + // dialog is open + requirejs(['text!templates/modules/sync_status.html', 'mustache'], function(templateSyncStatus, Mustache) { + let data = { + timestampCounterClass: config.timestampCounterClass, + syncStatus: Init.syncStatus, + isWebSocket: () => { + return (Util.getSyncType() === 'webSocket'); + }, + isAjax: () => { + return (Util.getSyncType() === 'ajax'); + } + }; + + let syncStatusElement = $( Mustache.render(templateSyncStatus, data ) ); + + logDialog.find('.' + config.taskDialogStatusAreaClass).html( syncStatusElement ); + + logDialog.find('.' + config.timestampCounterClass).initTimestampCounter(); + + syncStatusElement.initTooltips({ + placement: 'right' + }); + }); + } + + }; + /** * shows the logging dialog */ - var showDialog = function(){ - + let showDialog = function(){ // dialog content - var content = $('
'); - - // content row for log graphs - var rowElementGraphs = $('
', { - class: 'row' - }); - - content.append(rowElementGraphs); - - - - var tableHeadline = $('

', { - text: ' Processes' - }).prepend( $('', { - class: ['fa', 'fa-fw', 'fa-lg', 'fa-microchip'].join(' ') - })); - - // add content Structure to dome before table initialization - content.append(tableHeadline); - - // log table area -------------------------------------------------- - var logTableArea = $('
', { - class: config.dialogDynamicAreaClass - }); - - var logTableActionBar = $('
', { - class: config.tableToolsClass - }); - logTableArea.append(logTableActionBar); - - var logTable = $('', { - class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') - }); - logTableArea.append(logTable); - - content.append(logTableArea); - - // init log table - logDataTable = logTable.DataTable({ - paging: true, - ordering: true, - order: [ 1, 'desc' ], - autoWidth: false, - hover: false, - pageLength: 15, - lengthMenu: [[10, 15, 25, 50, 50], [10, 15, 25, 50, 50]], - data: logData, // load cached logs (if available) - language: { - emptyTable: 'No entries', - zeroRecords: 'No entries found', - lengthMenu: 'Show _MENU_ entries', - info: 'Showing _START_ to _END_ of _TOTAL_ entries' - }, - columnDefs: [ - { - targets: 0, - title: '', - width: '18px', - searchable: false, - class: ['text-center'].join(' '), - data: 'status' - },{ - targets: 1, - title: '  ', - width: '50px', - searchable: true, - class: 'text-right', - data: 'time' - },{ - targets: 2, - title: '  ', - width: '35px', - searchable: false, - class: 'text-right', - sType: 'html', - data: 'duration' - },{ - targets: 3, - title: 'description', - searchable: true, - data: 'description' - },{ - targets: 4, - title: 'type', - width: '40px', - searchable: true, - class: ['text-center'].join(' '), - data: 'type' - },{ - targets: 5, - title: 'Prozess-ID   ', - width: '80px', - searchable: false, - class: 'text-right', - data: 'key' - } - ] - - }); - - // open dialog - var logDialog = bootbox.dialog({ - title: 'Task-Manager', - message: content, - size: 'large', - buttons: { - close: { - label: 'close', - className: 'btn-default' - } - } - }); - - // modal dialog is shown - logDialog.on('shown.bs.modal', function(e) { - - // show Morris graphs ---------------------------------------------------------- - - // function for chart label formation - var labelYFormat = function(y){ - return Math.round(y) + 'ms'; + requirejs(['text!templates/dialog/task_manager.html', 'mustache'], function(templateTaskManagerDialog, Mustache) { + let data = { + id: config.taskDialogId, + dialogDynamicAreaClass: config.dialogDynamicAreaClass, + taskDialogStatusAreaClass: config.taskDialogStatusAreaClass, + taskDialogLogTableAreaClass: config.taskDialogLogTableAreaClass, + tableActionBarClass: config.tableToolsClass }; - for(var key in chartData) { - if(chartData.hasOwnProperty(key)) { - // create a chart for each key + let contentTaskManager = $( Mustache.render(templateTaskManagerDialog, data) ); - var colElementGraph = $('
', { - class: ['col-md-6'].join(' ') - }); + let rowElementGraphs = contentTaskManager.find('.row'); + let taskDialogLogTableAreaElement = contentTaskManager.find('.' + config.taskDialogLogTableAreaClass); + let logTable = $('
', { + class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') + }); - // graph element - var graphElement = $('
', { - class: config.logGraphClass - }); + taskDialogLogTableAreaElement.append(logTable); - var graphArea = $('
', { - class: config.dialogDynamicAreaClass - }).append( graphElement ); - - // headline - var headline = $('

', { - text: key - }).prepend( - $('', { - class: ['txt-color', 'txt-color-grayLight'].join(' '), - text: 'Prozess-ID: ' - }) - ); - - // show update ping between function calls - var updateElement = $('', { - class: ['txt-color', 'txt-color-blue', 'pull-right'].join(' ') - }); - headline.append(updateElement).append('
'); - - // show average execution time - var averageElement = $('', { - class: 'pull-right' - }); - headline.append(averageElement); - - colElementGraph.append( headline ); - colElementGraph.append( graphArea ); - - graphArea.showLoadingAnimation(); - - rowElementGraphs.append( colElementGraph ); - - // cache DOM Elements that will be updated frequently - chartData[key].averageElement = averageElement; - chartData[key].updateElement = updateElement; - - chartData[key].graph = Morris.Area({ - element: graphElement, - data: [], - xkey: 'x', - ykeys: ['y'], - labels: [key], - units: 'ms', - parseTime: false, - ymin: 0, - yLabelFormat: labelYFormat, - padding: 10, - hideHover: true, - pointSize: 3, - lineColors: ['#375959'], - pointFillColors: ['#477372'], - pointStrokeColors: ['#313335'], - lineWidth: 2, - grid: false, - gridStrokeWidth: 0.3, - gridTextSize: 9, - gridTextFamily: 'Oxygen Bold', - gridTextColor: '#63676a', - behaveLikeLine: true, - goals: [], - goalLineColors: ['#66c84f'], - smooth: false, - fillOpacity: 0.3, - resize: true - }); - - graphArea.hideLoadingAnimation(); - - } - } - - // ------------------------------------------------------------------------------ - // add dataTable buttons (extension) - - var buttons = new $.fn.dataTable.Buttons( logDataTable, { - buttons: [ + // init log table + logDataTable = logTable.DataTable({ + paging: true, + ordering: true, + order: [ 1, 'desc' ], + autoWidth: false, + hover: false, + pageLength: 10, + lengthMenu: [[5, 10, 25, 50, 100, -1], [5, 10, 25, 50, 100, 'All']], + data: logData, // load cached logs (if available) + language: { + emptyTable: 'No entries', + zeroRecords: 'No entries found', + lengthMenu: 'Show _MENU_ entries', + info: 'Showing _START_ to _END_ of _TOTAL_ entries' + }, + columnDefs: [ { - extend: 'copy', - className: 'btn btn-sm btn-default', - text: ' copy' + targets: 0, + title: '', + width: '18px', + searchable: false, + class: ['text-center'].join(' '), + data: 'status' },{ - extend: 'csv', - className: 'btn btn-sm btn-default', - text: ' csv' + targets: 1, + title: '  ', + width: '50px', + searchable: true, + class: 'text-right', + data: 'time' + },{ + targets: 2, + title: '  ', + width: '35px', + searchable: false, + class: 'text-right', + sType: 'html', + data: 'duration' + },{ + targets: 3, + title: 'description', + searchable: true, + data: 'description' + },{ + targets: 4, + title: 'type', + width: '40px', + searchable: true, + class: ['text-center'].join(' '), + data: 'type' + },{ + targets: 5, + title: 'Prozess-ID   ', + width: '80px', + searchable: false, + class: 'text-right', + data: 'key' } ] - } ); - logDataTable.buttons().container().appendTo( $(this).find('.' + config.tableToolsClass)); - }); + }); - - // modal dialog is closed - logDialog.on('hidden.bs.modal', function(e) { - // clear memory -> destroy all charts - for (var key in chartData) { - if (chartData.hasOwnProperty(key)) { - chartData[key].graph = null; + // open dialog + let logDialog = bootbox.dialog({ + title: 'Task-Manager', + message: contentTaskManager, + size: 'large', + buttons: { + close: { + label: 'close', + className: 'btn-default' + } } - } - }); + }); - // modal dialog before hide - logDialog.on('hide.bs.modal', function(e) { + // modal dialog is shown + logDialog.on('shown.bs.modal', function(e) { + updateSyncStatus(); - // destroy logTable - logDataTable.destroy(true); - logDataTable= null; + // show Morris graphs ---------------------------------------------------------- + + // function for chart label formation + let labelYFormat = function(y){ + return Math.round(y) + 'ms'; + }; + + for(let key in chartData) { + if(chartData.hasOwnProperty(key)) { + // create a chart for each key + + let colElementGraph = $('
', { + class: ['col-md-6'].join(' ') + }); + + + // graph element + let graphElement = $('
', { + class: config.logGraphClass + }); + + let graphArea = $('
', { + class: config.dialogDynamicAreaClass + }).append( graphElement ); + + // headline + let headline = $('

', { + text: key + }).prepend( + $('', { + class: ['txt-color', 'txt-color-grayLight'].join(' '), + text: 'Prozess-ID: ' + }) + ); + + // show update ping between function calls + let updateElement = $('', { + class: ['txt-color', 'txt-color-blue', 'pull-right'].join(' ') + }); + headline.append(updateElement).append('
'); + + // show average execution time + let averageElement = $('', { + class: 'pull-right' + }); + headline.append(averageElement); + + colElementGraph.append( headline ); + colElementGraph.append( graphArea ); + + graphArea.showLoadingAnimation(); + + rowElementGraphs.append( colElementGraph ); + + // cache DOM Elements that will be updated frequently + chartData[key].averageElement = averageElement; + chartData[key].updateElement = updateElement; + + chartData[key].graph = Morris.Area({ + element: graphElement, + data: [], + xkey: 'x', + ykeys: ['y'], + labels: [key], + units: 'ms', + parseTime: false, + ymin: 0, + yLabelFormat: labelYFormat, + padding: 10, + hideHover: true, + pointSize: 3, + lineColors: ['#375959'], + pointFillColors: ['#477372'], + pointStrokeColors: ['#313335'], + lineWidth: 2, + grid: false, + gridStrokeWidth: 0.3, + gridTextSize: 9, + gridTextFamily: 'Oxygen Bold', + gridTextColor: '#63676a', + behaveLikeLine: true, + goals: [], + goalLineColors: ['#66c84f'], + smooth: false, + fillOpacity: 0.3, + resize: true + }); + + updateLogGraph(key); + + graphArea.hideLoadingAnimation(); + + } + } + + // ------------------------------------------------------------------------------ + // add dataTable buttons (extension) + + let buttons = new $.fn.dataTable.Buttons( logDataTable, { + buttons: [ + { + extend: 'copy', + className: 'btn btn-sm btn-default', + text: ' copy' + },{ + extend: 'csv', + className: 'btn btn-sm btn-default', + text: ' csv' + } + ] + } ); + + logDataTable.buttons().container().appendTo( $(this).find('.' + config.tableToolsClass)); + }); + + + // modal dialog is closed + logDialog.on('hidden.bs.modal', function(e) { + // clear memory -> destroy all charts + for (let key in chartData) { + if (chartData.hasOwnProperty(key)) { + chartData[key].graph = null; + } + } + }); + + // modal dialog before hide + logDialog.on('hide.bs.modal', function(e) { + + // destroy logTable + logDataTable.destroy(true); + logDataTable= null; + + // remove event -> prevent calling this multiple times + $(this).off('hide.bs.modal'); + }); - // remove event -> prevent calling this multiple times - $(this).off('hide.bs.modal'); }); }; @@ -300,9 +324,9 @@ define([ /** * updates the log graph for a log key * @param key - * @param duration + * @param duration (if undefined -> just update graph with current data) */ - var updateLogGraph = function(key, duration){ + let updateLogGraph = function(key, duration){ // check if graph data already exist if( !(chartData.hasOwnProperty(key))){ @@ -314,21 +338,23 @@ define([ } // add new value - chartData[key].data.unshift(duration); + if(duration !== undefined){ + chartData[key].data.unshift(duration); + } if(chartData[key].data.length > maxGraphDataCount){ chartData[key].data = chartData[key].data.slice(0, maxGraphDataCount); } function getGraphData(data) { - var tempChartData = { + let tempChartData = { data: [], dataSum: 0, average: 0 }; - for(var x = 0; x < maxGraphDataCount; x++){ - var value = 0; + for(let x = 0; x < maxGraphDataCount; x++){ + let value = 0; if(data[x]){ value = data[x]; tempChartData.dataSum = Number( (tempChartData.dataSum + value).toFixed(2) ); @@ -346,14 +372,14 @@ define([ return tempChartData; } - var tempChartData = getGraphData(chartData[key].data); + let tempChartData = getGraphData(chartData[key].data); // add new data to graph (Morris chart) - if is already initialized if(chartData[key].graph !== null){ - var avgElement = chartData[key].averageElement; - var updateElement = chartData[key].updateElement; + let avgElement = chartData[key].averageElement; + let updateElement = chartData[key].updateElement; - var delay = Util.getCurrentTriggerDelay( key, 0 ); + let delay = Util.getCurrentTriggerDelay( key, 0 ); if(delay){ updateElement[0].textContent = ' delay: ' + delay + 'ms '; @@ -365,8 +391,8 @@ define([ // change avg. display avgElement[0].textContent = 'Avg. ' + tempChartData.average + 'ms'; - var avgStatus = getLogStatusByDuration(key, tempChartData.average); - var avgStatusClass = Util.getLogInfo( avgStatus, 'class' ); + let avgStatus = getLogStatusByDuration(key, tempChartData.average); + let avgStatusClass = Util.getLogInfo( avgStatus, 'class' ); //change avg. display class if( !avgElement.hasClass(avgStatusClass) ){ @@ -376,7 +402,7 @@ define([ // change goals line color if(avgStatus === 'warning'){ chartData[key].graph.options.goalLineColors = ['#e28a0d']; - $(document).setProgramStatus('problem'); + $(document).setProgramStatus('slow connection'); }else{ chartData[key].graph.options.goalLineColors = ['#5cb85c']; } @@ -396,9 +422,8 @@ define([ * @param logDuration * @returns {string} */ - var getLogStatusByDuration = function(logKey, logDuration){ - - var logStatus = 'info'; + let getLogStatusByDuration = function(logKey, logDuration){ + let logStatus = 'info'; if( logDuration > Init.timer[logKey].EXECUTION_LIMIT ){ logStatus = 'warning'; } @@ -410,9 +435,9 @@ define([ * @param logType * @returns {string} */ - var getLogTypeIconClass = function(logType){ + let getLogTypeIconClass = function(logType){ - var logIconClass = ''; + let logIconClass = ''; switch(logType){ case 'client': @@ -427,11 +452,15 @@ define([ }; /** - * init logging -> set global log event + * init logging -> set global log events */ - var init = function(){ + let init = function(){ - var maxEntries = 150; + let maxEntries = 150; + + $(window).on('pf:syncStatus', function(){ + updateSyncStatus(); + }); // set global logging listener $(window).on('pf:log', function(e, logKey, options){ @@ -442,21 +471,19 @@ define([ options.duration && options.description ){ - var logDescription = options.description; - var logDuration = options.duration; - var logType = options.type; + let logDescription = options.description; + let logDuration = options.duration; + let logType = options.type; // check log status by duration - var logStatus = getLogStatusByDuration(logKey, logDuration); - - var statusClass = Util.getLogInfo( logStatus, 'class' ); - - var typeIconClass = getLogTypeIconClass(logType); + let logStatus = getLogStatusByDuration(logKey, logDuration); + let statusClass = Util.getLogInfo( logStatus, 'class' ); + let typeIconClass = getLogTypeIconClass(logType); // update graph data updateLogGraph(logKey, logDuration); - var logRowData = { + let logRowData = { status: '', time: getLogTime(), duration: '' + logDuration + 'ms', @@ -476,7 +503,7 @@ define([ } // delete old log entries from table --------------------------------- - var rowCount = logData.length; + let rowCount = logData.length; if( rowCount >= maxEntries ){ diff --git a/public/js/v1.2.0/app/map/map.js b/public/js/v1.2.0/app/map/map.js index d3cc3626..4e6cc5af 100644 --- a/public/js/v1.2.0/app/map/map.js +++ b/public/js/v1.2.0/app/map/map.js @@ -20,7 +20,7 @@ define([ 'use strict'; - var config = { + let config = { zIndexCounter: 110, newSystemOffset: { x: 130, @@ -74,13 +74,13 @@ define([ }; // active jsPlumb instances currently running - var activeInstances = {}; + let activeInstances = {}; // active connections per map (cache object) - var connectionCache = {}; + let connectionCache = {}; // jsPlumb config - var globalMapConfig = { + let globalMapConfig = { source: { filter: '.' + config.systemHeadNameClass, //isSource:true, @@ -120,19 +120,19 @@ define([ */ $.fn.updateSystemUserData = function(map, data, currentUserIsHere){ - var system = $(this); - var systemId = system.attr('id'); + let system = $(this); + let systemId = system.attr('id'); // find system body - var systemBody = $( system.find('.' + config.systemBodyClass) ); + let systemBody = $( system.find('.' + config.systemBodyClass) ); // find expand arrow - var systemHeadExpand = $( system.find('.' + config.systemHeadExpandClass) ); + let systemHeadExpand = $( system.find('.' + config.systemHeadExpandClass) ); - var oldCacheKey = system.data('userCache'); - var oldUserCount = system.data('userCount'); + let oldCacheKey = system.data('userCache'); + let oldUserCount = system.data('userCount'); oldUserCount = (oldUserCount !== undefined ? oldUserCount : 0); - var userCounter = 0; + let userCounter = 0; system.data('currentUser', false); @@ -146,14 +146,14 @@ define([ data && data.user ){ - var cacheArray = []; + let cacheArray = []; // loop all active pilots and build cache-key - for(var i = 0; i < data.user.length; i++){ + for(let i = 0; i < data.user.length; i++){ userCounter++; - var tempUserData = data.user[i]; + let tempUserData = data.user[i]; cacheArray.push(tempUserData.id + '_' + tempUserData.log.ship.id); } - var cacheKey = cacheArray.join('_'); + let cacheKey = cacheArray.join('_'); // check for if cacheKey has changed if(cacheKey !== oldCacheKey){ @@ -166,12 +166,12 @@ define([ // loop "again" and build DOM object with user information for(let j = 0; j < data.user.length; j++){ - var userData = data.user[j]; + let userData = data.user[j]; - var statusClass = Util.getStatusInfoForCharacter(userData, 'class'); - var userName = userData.name; + let statusClass = Util.getStatusInfoForCharacter(userData, 'class'); + let userName = userData.name; - var item = $('
', { + let item = $('
', { class: config.systemBodyItemClass }).append( $('', { @@ -196,11 +196,11 @@ define([ // ================================================================= // user count changed -> change tooltip content - var tooltipOptions = {placement: 'top', trigger: 'manual'}; + let tooltipOptions = {placement: 'top', trigger: 'manual'}; // set tooltip color - var highlight = false; - var tooltipIconClass = ''; + let highlight = false; + let tooltipIconClass = ''; if(userCounter > oldUserCount){ highlight = 'good'; tooltipIconClass = 'fa-caret-up'; @@ -265,10 +265,10 @@ define([ * @param callback */ $.fn.toggleBody = function(type, map, callback){ - var system = $(this); - var systemBody = system.find('.' + config.systemBodyClass); + let system = $(this); + let systemBody = system.find('.' + config.systemBodyClass); - var systemDomId = system.attr('id'); + let systemDomId = system.attr('id'); if(type === true){ // show minimal body @@ -320,15 +320,15 @@ define([ $.fn.toggleSystemTooltip = function(show, options){ // tooltip colors - var colorClasses = { + let colorClasses = { good: 'txt-color-green', bad: 'txt-color-red' }; return this.each(function(){ - var system = $(this); - var tooltipId = 0; - var tooltipClassHighlight = false; + let system = $(this); + let tooltipId = 0; + let tooltipClassHighlight = false; // do not update tooltips while a system is dragged if(system.hasClass('jsPlumb_dragged')){ @@ -346,7 +346,7 @@ define([ }else if(show === 'show'){ // check if tooltip is currently visible - var tooltipActive = (system.attr('aria-describedby') !== undefined); + let tooltipActive = (system.attr('aria-describedby') !== undefined); if(options === undefined){ options = {}; @@ -365,7 +365,7 @@ define([ // init new tooltip tooltipId = config.systemTooltipInnerIdPrefix + options.id; - var template = '

', { + let table = $('
', { class: ['compact', 'stripe', 'order-column', 'row-border', config.systemInfoRoutesTableClass].join(' ') }); moduleElement.append( $(table) ); // init empty table - var routesTable = table.DataTable( { + let routesTable = table.DataTable( { paging: false, ordering: true, order: [[ 2, 'asc' ], [ 0, 'asc' ]], @@ -711,41 +784,35 @@ define([ data: 'route' },{ targets: 5, - title: '', + title: '', orderable: false, searchable: false, width: '10px', class: ['text-center', config.dataTableActionCellClass].join(' '), - data: 'reload', + data: 'safer', render: { _: 'button' }, createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - var tempTableApi = this.api(); + let tempTableApi = this.api(); $(cell).on('click', function(e) { // get current row data (important!) // -> "rowData" param is not current state, values are "on createCell()" state rowData = tempTableApi.row( $(cell).parents('tr')).data(); + let routeData = getRouteRequestDataFromRowData( rowData ); - var context = { + // overwrite some params + routeData.skipSearch = 0; + routeData.safer = 1 - routeData.safer; // toggle + + let context = { moduleElement: moduleElement, dataTable: tempTableApi }; - var requestData = { - routeData: [{ - mapIds: rowData.mapIds, - systemFromData: rowData.systemFromData, - systemToData: rowData.systemToData, - skipSearch: 0, - stargates: rowData.stargates ? 1 : 0, - jumpbridges: rowData.jumpbridges ? 1 : 0, - wormholes: rowData.wormholes ? 1 : 0, - wormholesReduced: rowData.wormholesReduced ? 1 : 0, - wormholesCritical: rowData.wormholesCritical ? 1 : 0, - wormholesEOL: rowData.wormholesEOL ? 1 : 0 - }] + let requestData = { + routeData: [routeData] }; getRouteData(requestData, context, callbackAddRouteRow); @@ -758,14 +825,49 @@ define([ searchable: false, width: '10px', class: ['text-center', config.dataTableActionCellClass].join(' '), + data: 'reload', + render: { + _: 'button' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tempTableApi = this.api(); + + $(cell).on('click', function(e) { + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tempTableApi.row( $(cell).parents('tr')).data(); + let routeData = getRouteRequestDataFromRowData( rowData ); + + // overwrite some params + routeData.skipSearch = 0; + + let context = { + moduleElement: moduleElement, + dataTable: tempTableApi + }; + + let requestData = { + routeData: [routeData] + }; + + getRouteData(requestData, context, callbackAddRouteRow); + }); + } + },{ + targets: 7, + title: '', + orderable: false, + searchable: false, + width: '10px', + class: ['text-center', config.dataTableActionCellClass].join(' '), data: 'clear', render: { _: 'button' }, createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - var tempTableElement = this; + let tempTableElement = this; - var confirmationSettings = { + let confirmationSettings = { container: 'body', placement: 'left', btnCancelClass: 'btn btn-sm btn-default', @@ -776,7 +878,7 @@ define([ btnOkLabel: 'delete', btnOkIcon: 'fa fa-fw fa-close', onConfirm : function(e, target){ - var deleteRowElement = $(cell).parents('tr'); + let deleteRowElement = $(cell).parents('tr'); tempTableElement.api().rows(deleteRowElement).remove().draw(); } }; @@ -788,14 +890,14 @@ define([ ], drawCallback: function(settings){ - var animationRows = this.api().rows().nodes().to$().filter(function() { + let animationRows = this.api().rows().nodes().to$().filter(function() { return ( $(this).data('animationStatus') || $(this).data('animationTimer') ); }); - for(var i = 0; i < animationRows.length; i++){ + for(let i = 0; i < animationRows.length; i++){ $(animationRows[i]).pulseTableRow($(animationRows[i]).data('animationStatus')); $(animationRows[i]).removeData('animationStatus'); } @@ -805,7 +907,7 @@ define([ }); // init tooltips for this module - var tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); + let tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); tooltipElements.tooltip({ container: 'body' }); @@ -819,19 +921,19 @@ define([ * @param options */ $.fn.initSystemPopover = function(options){ - var elements = $(this); - var eventNamespace = 'hideSystemPopup'; - var systemToData = options.systemToData; + let elements = $(this); + let eventNamespace = 'hideSystemPopup'; + let systemToData = options.systemToData; requirejs(['text!templates/tooltip/system_popover.html', 'mustache'], function (template, Mustache) { - var data = { + let data = { systemToData: systemToData }; - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); elements.each(function() { - var element = $(this); + let element = $(this); // destroy "popover" and remove "click" event for animation element.popover('destroy').off(); @@ -859,11 +961,11 @@ define([ // set link observer "on shown" event elements.on('shown.bs.popover', function () { - var popoverRoot = $(this); + let popoverRoot = $(this); popoverRoot.data('bs.popover').tip().find('a').on('click', function(){ // hint: "data" attributes should be in lower case! - var systemData = { + let systemData = { name: $(this).data('name'), systemId: $(this).data('systemid') }; @@ -883,16 +985,16 @@ define([ * @param mapId * @param systemData */ - var initModule = function(moduleElement, mapId, systemData){ + let initModule = function(moduleElement, mapId, systemData){ - var systemFromData = { + let systemFromData = { name: systemData.name, systemId: systemData.systemId }; - var routesTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); + let routesTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); - var routesTable = routesTableElement.DataTable(); + let routesTable = routesTableElement.DataTable(); // init refresh routes -------------------------------------------------------------------- moduleElement.find('.' + config.systemModuleHeadlineIconRefresh).on('click', function(e){ @@ -907,7 +1009,7 @@ define([ // max routes limit reached -> show warning Util.showNotify({title: 'Route limit reached', text: 'Serch is limited by ' + maxRouteSearchLimit, type: 'warning'}); }else{ - var dialogData = { + let dialogData = { moduleElement: moduleElement, mapId: mapId, systemFromData: systemFromData, @@ -922,7 +1024,7 @@ define([ // init settings dialog ------------------------------------------------------------------- moduleElement.find('.' + config.systemModuleHeadlineIconSettings).on('click', function(e){ - var dialogData = { + let dialogData = { mapId: mapId }; @@ -930,10 +1032,10 @@ define([ }); // fill routesTable with data ------------------------------------------------------------- - var promiseStore = MapUtil.getLocaleData('map', mapId); + let promiseStore = MapUtil.getLocaleData('map', mapId); promiseStore.then(function(dataStore) { // selected systems (if already stored) - var systemsTo = [{ + let systemsTo = [{ name: 'Jita', systemId: 30000142 }]; @@ -950,69 +1052,6 @@ define([ }; - /** - * draw route table - * @param mapId - * @param moduleElement - * @param systemFromData - * @param routesTable - * @param systemsTo - */ - var drawRouteTable = function(mapId, moduleElement, systemFromData, routesTable, systemsTo){ - var requestRouteData = []; - var currentTimestamp = Util.getServerTime().getTime(); - - // Skip some routes from search - // -> this should help to throttle requests (heavy CPU load for route calculation) - var defaultRoutesCount = Init.routeSearch.defaultCount; - - for(var i = 0; i < systemsTo.length; i++){ - var systemToData = systemsTo[i]; - - if(systemFromData.name !== systemToData.name){ - var cacheKey = 'route_' + mapId + '_' + systemFromData.name.toUpperCase() + '_' + systemToData.name.toUpperCase(); - - if( - cache.systemRoutes.hasOwnProperty(cacheKey) && - Math.round( - ( currentTimestamp - (new Date( cache.systemRoutes[cacheKey].updated * 1000).getTime())) / 1000 - ) <= config.routeCacheTTL - ){ - // route data is cached (client side) - var context = { - dataTable: routesTable - }; - - addRow(context, cache.systemRoutes[cacheKey].data); - }else{ - // get route data - var searchData = { - mapIds: [mapId], - systemFromData: systemFromData, - systemToData: systemToData, - skipSearch: requestRouteData.length >= defaultRoutesCount - }; - - requestRouteData.push( getRouteRequestDataFromRowData( searchData )); - } - } - } - - // check if routes data is not cached and is requested - if(requestRouteData.length > 0){ - var contextData = { - moduleElement: moduleElement, - dataTable: routesTable - }; - - var requestData = { - routeData: requestRouteData - }; - - getRouteData(requestData, contextData, callbackAddRouteRow); - } - }; - /** * updates an dom element with the system route module * @param mapId @@ -1020,10 +1059,10 @@ define([ */ $.fn.drawSystemRouteModule = function(mapId, systemData){ - var parentElement = $(this); + let parentElement = $(this); // show route module - var showModule = function(moduleElement){ + let showModule = function(moduleElement){ if(moduleElement){ moduleElement.css({ opacity: 0 }); parentElement.append(moduleElement); @@ -1039,7 +1078,7 @@ define([ }; // check if module already exists - var moduleElement = parentElement.find('.' + config.systemRouteModuleClass); + let moduleElement = parentElement.find('.' + config.systemRouteModuleClass); if(moduleElement.length > 0){ moduleElement.velocity('transition.slideDownOut', { diff --git a/public/js/v1.2.0/app/ui/system_signature.js b/public/js/v1.2.0/app/ui/system_signature.js index 036c2580..8544e6e5 100644 --- a/public/js/v1.2.0/app/ui/system_signature.js +++ b/public/js/v1.2.0/app/ui/system_signature.js @@ -11,7 +11,7 @@ define([ ], function($, Init, Util, Render, bootbox) { 'use strict'; - var config = { + let config = { // module info moduleClass: 'pf-module', // class for each module @@ -55,16 +55,16 @@ define([ }; // lock Signature Table update temporary (until. some requests/animations) are finished - var disableTableUpdate = true; + let disableTableUpdate = true; // disable "copy&paste" from clipboard (until request finished) - var disableCopyFromClipboard = false; + let disableCopyFromClipboard = false; // cache for dataTable object - var signatureTable = null; + let signatureTable = null; // empty signatureData object -> for "add row" table - var emptySignatureData = { + let emptySignatureData = { id: 0, name: '', groupId: 0, @@ -78,20 +78,20 @@ define([ } }; - var fullSignatureOptions = { + let fullSignatureOptions = { action: 'delete', actionClass: ['fa-close', 'txt-color', 'txt-color-redDarker'].join(' ') }; // empty signatureData row Options - var emptySignatureOptions = { + let emptySignatureOptions = { action: 'add', actionClass: ['fa-plus'].join(' ') }; - var sigNameCache = {}; // cache signature names + let sigNameCache = {}; // cache signature names - var validSignatureNames = [ // allowed signature type/names + let validSignatureNames = [ // allowed signature type/names 'Cosmic Anomaly', 'Cosmic Signature', 'Космическая аномалия', // == "Cosmic Anomaly" @@ -99,29 +99,29 @@ define([ ]; // some static signature data - var signatureGroupsLabels = Util.getSignatureGroupInfo('label'); - var signatureGroupsNames = Util.getSignatureGroupInfo('name'); + let signatureGroupsLabels = Util.getSignatureGroupInfo('label'); + let signatureGroupsNames = Util.getSignatureGroupInfo('name'); /** * collect all data of all editable fields in a signature table * @returns {Array} */ - var getSignatureTableData = function(){ - var signatureTableApi = signatureTable.api(); - var tableData = []; + let getSignatureTableData = function(){ + let signatureTableApi = signatureTable.api(); + let tableData = []; signatureTableApi.rows().eq(0).each(function(idx){ - var row = signatureTableApi.row(idx); + let row = signatureTableApi.row(idx); // default row data - var defaultRowData = row.data(); - var rowElement = row.nodes().to$(); + let defaultRowData = row.data(); + let rowElement = row.nodes().to$(); if(defaultRowData.id > 0){ // get all editable fields per row - var editableFields = rowElement.find('.editable'); + let editableFields = rowElement.find('.editable'); if(editableFields.length > 0){ - var values = $(editableFields).editable('getValue'); + let values = $(editableFields).editable('getValue'); if(values.name){ // convert to lower for better compare options @@ -151,13 +151,13 @@ define([ * @param cellIndex * @param data */ - var updateSignatureCell = function(rowElement, cellIndex, data){ + let updateSignatureCell = function(rowElement, cellIndex, data){ - var signatureTableApi = signatureTable.api(); - var rowIndex = signatureTableApi.row( rowElement ).index(); + let signatureTableApi = signatureTable.api(); + let rowIndex = signatureTableApi.row( rowElement ).index(); - var updateCell = signatureTableApi.cell( rowIndex, cellIndex ); - var updateCellElement = updateCell.nodes().to$(); + let updateCell = signatureTableApi.cell( rowIndex, cellIndex ); + let updateCellElement = updateCell.nodes().to$(); if(cellIndex === 6){ // clear existing counter interval @@ -187,37 +187,36 @@ define([ } // clone signature array because of further manipulation - var signatureData = $.extend([], signatureDataOrig); + let signatureData = $.extend([], signatureDataOrig); // disable update until function is ready; lockSignatureTable(); - var moduleElement = $(this); + let moduleElement = $(this); // get signature table API - var signatureTableApi = signatureTable.api(); + let signatureTableApi = signatureTable.api(); // get current system data - var currentSystemData = Util.getCurrentSystemData(); + let currentSystemData = Util.getCurrentSystemData(); - var tableData = getSignatureTableData(); + let tableData = getSignatureTableData(); - var notificationCounter = { + let notificationCounter = { added: 0, changed: 0, deleted: 0 }; - for(var i = 0; i < signatureData.length; i++){ - for(var j = 0; j < tableData.length; j++){ + for(let i = 0; i < signatureData.length; i++){ + for(let j = 0; j < tableData.length; j++){ if(signatureData[i].id === tableData[j].id){ // check if row was updated if(signatureData[i].updated.updated > tableData[j].updated.updated){ - // row element to remove - var currentRowElement = signatureTableApi.row(tableData[j].index).nodes().to$(); + let currentRowElement = signatureTableApi.row(tableData[j].index).nodes().to$(); // hide open editable fields on the row before removing them currentRowElement.find('.editable').editable('destroy'); @@ -226,7 +225,7 @@ define([ signatureTableApi.row(currentRowElement).remove().draw(); // and add "new" row - var changedRowElement = addSignatureRow(currentSystemData.systemData, signatureData[i], false); + let changedRowElement = addSignatureRow(currentSystemData.systemData, signatureData[i], false); // highlight changedRowElement.pulseTableRow('changed'); @@ -251,7 +250,7 @@ define([ if(deleteOutdatedSignatures === true){ // callback function after row deleted - var toggleTableRowCallback = function(tempRowElement){ + let toggleTableRowCallback = function(tempRowElement){ // hide open editable fields on the row before removing them tempRowElement.find('.editable').editable('destroy'); @@ -259,17 +258,17 @@ define([ signatureTableApi.row(tempRowElement).remove().draw(); }; - for(var l = 0; l < tableData.length; l++){ - var rowElement = signatureTableApi.row(tableData[l].index).nodes().to$(); + for(let l = 0; l < tableData.length; l++){ + let rowElement = signatureTableApi.row(tableData[l].index).nodes().to$(); rowElement.toggleTableRow(toggleTableRowCallback); notificationCounter.deleted++; } } // add new signatures ----------------------------------------------------------------------------------------- - for(var k = 0; k < signatureData.length; k++){ + for(let k = 0; k < signatureData.length; k++){ // and add "new" row - var newRowElement = addSignatureRow(currentSystemData.systemData, signatureData[k], false); + let newRowElement = addSignatureRow(currentSystemData.systemData, signatureData[k], false); // highlight newRowElement.pulseTableRow('added'); @@ -288,7 +287,7 @@ define([ moduleElement.updateScannedSignaturesBar({showNotice: true}); // show Notification - var notification = notificationCounter.added + ' added
'; + let notification = notificationCounter.added + ' added
'; notification += notificationCounter.changed + ' changed
'; notification += notificationCounter.deleted + ' deleted
'; Util.showNotify({title: 'Signatures updated', text: notification, type: 'success'}); @@ -304,7 +303,7 @@ define([ /** * lock system signature table for */ - var lockSignatureTable = function(){ + let lockSignatureTable = function(){ disableTableUpdate = true; }; @@ -313,7 +312,7 @@ define([ * -> make table "update-able" again * @param instant */ - var unlockSignatureTable = function(instant){ + let unlockSignatureTable = function(instant){ if(disableTableUpdate === true){ if(instant === true){ disableTableUpdate = false; @@ -331,25 +330,27 @@ define([ */ $.fn.updateScannedSignaturesBar = function(options){ - var moduleElement = $(this); + let moduleElement = $(this); // get progress bar - var progressBarWrapper = moduleElement.find('.' + config.signatureScannedProgressBarClass); - var progressBar = $(progressBarWrapper).find('.progress-bar'); - var progressBarLabel = $(progressBarWrapper).find('.progress-label-right'); + let progressBarWrapper = moduleElement.find('.' + config.signatureScannedProgressBarClass); + let progressBar = $(progressBarWrapper).find('.progress-bar'); + let progressBarLabel = $(progressBarWrapper).find('.progress-label-right'); - var tableData = getSignatureTableData(); + let tableData = getSignatureTableData(); - var percent = 0; - var progressBarType = 'progress-bar-danger'; + let sigCount = 0; + let percent = 0; + let sigIncompleteCount = 0; + let progressBarType = 'progress-bar-danger'; if(tableData){ - var sigCount = tableData.length; - var sigIncompleteCount = 0; + sigCount = tableData.length; + // check for signatures without "groupId" -> these are un scanned signatures - for(var i = 0; i < tableData.length; i++){ - var groupId = parseInt(tableData[i].groupId); + for(let i = 0; i < tableData.length; i++){ + let groupId = parseInt(tableData[i].groupId); if(groupId === 0){ sigIncompleteCount++; } @@ -375,7 +376,7 @@ define([ progressBar.attr('aria-valuenow', percent); progressBar.css({width: percent + '%'}); - var notification = (sigCount - sigIncompleteCount) + ' / ' + sigCount + ' (' + percent + '%) signatures scanned'; + let notification = (sigCount - sigIncompleteCount) + ' / ' + sigCount + ' (' + percent + '%) signatures scanned'; // show notifications if(options.showNotice !== false){ @@ -396,17 +397,17 @@ define([ */ $.fn.showSignatureReaderDialog = function(systemData){ - var moduleElement = $(this); + let moduleElement = $(this); - var data = { + let data = { id: config.signatureReaderDialogId }; requirejs(['text!templates/dialog/signature_reader.html', 'mustache'], function(template, Mustache) { - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); - var signatureReaderDialog = bootbox.dialog({ + let signatureReaderDialog = bootbox.dialog({ title: 'Signature reader', message: content, buttons: { @@ -422,10 +423,10 @@ define([ className: 'btn-success', callback: function () { // get form Values - var form = $('#' + config.signatureReaderDialogId).find('form'); - var formData = $(form).getFormValues(); + let form = $('#' + config.signatureReaderDialogId).find('form'); + let formData = $(form).getFormValues(); - var signatureOptions = { + let signatureOptions = { deleteOld: (formData.deleteOld) ? 1 : 0 }; moduleElement.updateSignatureTableByClipboard(systemData, formData.clipboard, signatureOptions); @@ -454,15 +455,16 @@ define([ * @param options */ $.fn.updateSignatureTableByClipboard = function(systemData, clipboard, options){ + let moduleElement = $(this); - var requestData = function(){ + let saveSignatureData = function(signatureData){ // lock update function until request is finished lockSignatureTable(); // lock copy during request (prevent spamming (ctrl + c ) disableCopyFromClipboard = true; - var requestData = { + let requestData = { signatures: signatureData, deleteOld: (options.deleteOld) ? 1 : 0, systemId: parseInt(systemData.id) @@ -479,7 +481,7 @@ define([ // updates table with new/updated signature information moduleElement.updateSignatureTable(responseData.signatures, false); }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; Util.showNotify({title: jqXHR.status + ': Update signatures', text: reason, type: 'warning'}); $(document).setProgramStatus('problem'); }).always(function() { @@ -490,35 +492,34 @@ define([ // check if copy&paste is enabled if( !disableCopyFromClipboard ){ - var moduleElement = $(this); // parse input stream - var signatureData = parseSignatureString(systemData, clipboard); + let signatureData = parseSignatureString(systemData, clipboard); if(signatureData.length > 0){ // valid signature data parsed // check if signatures will be added to a system where character is currently in // if user is not in any system -> id === undefined -> no "confirmation required - var currentLocationData = Util.getCurrentLocationData(); + let currentLocationData = Util.getCurrentLocationData(); if( currentLocationData.id && currentLocationData.id !== systemData.id ){ - var systemNameStr = (systemData.name === systemData.alias) ? '"' + systemData.name + '"' : '"' + systemData.alias + '" (' + systemData.name + ')'; + let systemNameStr = (systemData.name === systemData.alias) ? '"' + systemData.name + '"' : '"' + systemData.alias + '" (' + systemData.name + ')'; systemNameStr = '' + systemNameStr + ''; - var msg = ''; + let msg = ''; msg += 'Update signatures in ' + systemNameStr + ' ? This not your current location, "' + currentLocationData.name + '" !'; bootbox.confirm(msg, function(result) { if(result){ - requestData(); + saveSignatureData(signatureData); } }); }else{ // current system selected -> no "confirmation" required - requestData(); + saveSignatureData(signatureData); } } } @@ -530,29 +531,29 @@ define([ * @param clipboard * @returns {Array} */ - var parseSignatureString = function(systemData, clipboard){ - var signatureData = []; + let parseSignatureString = function(systemData, clipboard){ + let signatureData = []; if(clipboard.length){ - var signatureRows = clipboard.split(/\r\n|\r|\n/g); - var signatureGroupOptions = signatureGroupsNames; - var invalidSignatures = 0; + let signatureRows = clipboard.split(/\r\n|\r|\n/g); + let signatureGroupOptions = signatureGroupsNames; + let invalidSignatures = 0; - for(var i = 0; i < signatureRows.length; i++){ - var rowData = signatureRows[i].split(/\t/g); + for(let i = 0; i < signatureRows.length; i++){ + let rowData = signatureRows[i].split(/\t/g); if(rowData.length === 6){ // check if sig Type = anomaly or combat site if(validSignatureNames.indexOf( rowData[1] ) !== -1){ - var sigGroup = $.trim(rowData[2]).toLowerCase(); - var sigDescription = $.trim(rowData[3]); - var sigGroupId = 0; - var typeId = 0; + let sigGroup = $.trim(rowData[2]).toLowerCase(); + let sigDescription = $.trim(rowData[3]); + let sigGroupId = 0; + let typeId = 0; // get groupId by groupName - for (var prop in signatureGroupOptions) { + for (let prop in signatureGroupOptions) { if(signatureGroupOptions.hasOwnProperty(prop)){ if(signatureGroupOptions[prop] === sigGroup){ sigGroupId = parseInt( prop ); @@ -573,9 +574,9 @@ define([ } // map array values to signature Object - var signatureObj = { + let signatureObj = { systemId: systemData.id, - name: $.trim( rowData[0].substr(0, 3) ).toLowerCase(), + name: $.trim( rowData[0] ).toLowerCase(), groupId: sigGroupId, typeId: typeId, description: sigDescription @@ -591,7 +592,7 @@ define([ } if(invalidSignatures > 0){ - var notification = invalidSignatures + ' / ' + signatureRows.length + ' signatures invalid'; + let notification = invalidSignatures + ' / ' + signatureRows.length + ' signatures invalid'; Util.showNotify({title: 'Invalid signature(s)', text: notification, type: 'warning'}); } } @@ -599,14 +600,147 @@ define([ return signatureData; }; + /** + * format signature data array into dataTable structure + * @param systemData + * @param signatureData + * @param options + * @returns {Array} + */ + let formatSignatureData = function(systemData, signatureData, options){ + + let formattedData = []; + + // security check + if( + systemData && + systemData.id && + systemData.id > 0 + ){ + let systemTypeId = systemData.type.id; + + // areaId is required as a key for signature names + // if areaId is 0, no signature data is available for this system + let areaId = Util.getAreaIdBySecurity(systemData.security); + + for(let i = 0; i < signatureData.length; i++){ + let data = signatureData[i]; + + let tempData = {}; + + // set id --------------------------------------------------------------------------------------------- + let sigId = 0; + if(data.id > 0){ + sigId = data.id; + } + tempData.id = sigId; + + // set status ----------------------------------------------------------------------------------------- + let statusClass = ''; + if(data.updated.character !== undefined){ + statusClass = Util.getStatusInfoForCharacter(data.updated.character, 'class'); + } + let status = ''; + + tempData.status = { + status: status, + status_sort: statusClass + }; + + // set name ------------------------------------------------------------------------------------------- + let sigName = '
0){ + sigName += 'data-pk="' + data.id + '" '; + } + sigName += '>' + data.name + ''; + + tempData.name = { + render: sigName, + name: data.name + }; + + // set group id --------------------------------------------------------------------------------------- + let sigGroup = ' 0){ + sigGroup += 'data-pk="' + data.id + '" '; + } + sigGroup += 'data-systemTypeId="' + systemTypeId + '" '; + sigGroup += 'data-areaId="' + areaId + '" '; + sigGroup += 'data-value="' + data.groupId + '" '; + sigGroup += '>'; + + tempData.group = { + group: sigGroup, + sort: signatureGroupsLabels[data.groupId], + filter: signatureGroupsLabels[data.groupId] + }; + + // set type id ---------------------------------------------------------------------------------------- + let sigType = ' 0){ + sigType += 'data-pk="' + data.id + '" '; + } + + // set disabled if sig type is not selected + if(data.groupId < 1){ + sigType += 'data-disabled="1" '; + } + + sigType += 'data-systemTypeId="' + systemTypeId + '" '; + sigType += 'data-areaId="' + areaId + '" '; + sigType += 'data-groupId="' + data.groupId + '" '; + sigType += 'data-value="' + data.typeId + '" '; + sigType += '>'; + + tempData.type = sigType; + + // set description ------------------------------------------------------------------------------------ + let sigDescription = ' 0){ + sigDescription += 'data-pk="' + data.id + '" '; + } + sigDescription += '>' + data.description + ''; + + tempData.description = sigDescription; + + // set created ---------------------------------------------------------------------------------------- + tempData.created = data.created; + + // set updated ---------------------------------------------------------------------------------------- + tempData.updated = data.updated; + + // info icon ------------------------------------------------------------------------------------------ + let infoButton = ''; + if(data.id > 0){ + infoButton = ''; + } + tempData.info = infoButton; + + // action icon ---------------------------------------------------------------------------------------- + + let actionButton = ''; + tempData.action = { + action: options.action, + button: actionButton + }; + + formattedData.push(tempData); + + } + + } + + return formattedData; + }; + /** * get a labeled button * @param options * @returns {*|jQuery} */ - var getLabledButton = function(options){ + let getLabledButton = function(options){ - var buttonClasses = ['btn', 'btn-sm', 'btn-labeled']; + let buttonClasses = ['btn', 'btn-sm', 'btn-labeled']; switch(options.type){ case 'default': @@ -626,7 +760,7 @@ define([ } - var buttonElement = $('
', { + let table = $('
', { class: ['display', 'compact', 'nowrap', config.sigTableClass, config.sigTableSecondaryClass].join(' ') }); @@ -758,7 +958,7 @@ define([ tableToolbar.after(tableToolbarAction); - var signatureData = formatSignatureData(systemData, [emptySignatureData], emptySignatureOptions); + let signatureData = formatSignatureData(systemData, [emptySignatureData], emptySignatureOptions); table.dataTable( { data: signatureData, paging: false, @@ -770,13 +970,13 @@ define([ table.makeEditable(systemData); // scanned signatures progress bar ---------------------------------------------------------------------------- - var moduleConfig = { + let moduleConfig = { name: 'form/progress', position: tableToolbar, link: 'before' }; - var moduleData = { + let moduleData = { label: true, wrapperClass: config.signatureScannedProgressBarClass, class: ['progress-bar-success'].join(' '), @@ -788,6 +988,18 @@ define([ Render.showModule(moduleConfig, moduleData); }; + /** + * Update/set tooltip for an element + * @param element + * @param title + */ + let updateTooltip = function(element, title){ + element = $(element); + + element.attr('data-container', 'body').attr('title', title.toUpperCase()).tooltip('fixTitle') + .tooltip('setContent'); + }; + /** * make a table or row editable * @param systemData @@ -795,22 +1007,22 @@ define([ $.fn.makeEditable = function(systemData){ // table element OR row element - var tableElement = $(this); + let tableElement = $(this); // find editable fields - var sigNameFields = tableElement.find('.' + config.sigTableEditSigNameInput); - var sigGroupFields = tableElement.find('.' + config.sigTableEditSigGroupSelect); - var sigTypeFields = tableElement.find('.' + config.sigTableEditSigTypeSelect); - var sigDescriptionFields = tableElement.find('.' + config.sigTableEditSigDescriptionTextarea); + let sigNameFields = tableElement.find('.' + config.sigTableEditSigNameInput); + let sigGroupFields = tableElement.find('.' + config.sigTableEditSigGroupSelect); + let sigTypeFields = tableElement.find('.' + config.sigTableEditSigTypeSelect); + let sigDescriptionFields = tableElement.find('.' + config.sigTableEditSigDescriptionTextarea); // jump to "next" editable field on save - var openNextEditDialogOnSave = function(fields){ + let openNextEditDialogOnSave = function(fields){ fields.on('save', function(e, a){ - var currentField = $(this); + let currentField = $(this); setTimeout(function() { - var nextField = getNextEditableField(currentField); + let nextField = getNextEditableField(currentField); nextField.editable('show'); // update scanning progressbar if sig "type" has changed AND @@ -826,8 +1038,8 @@ define([ }; // helper function - get the next editable field in next table column - var getNextEditableField = function(field){ - var nextEditableField = $(field).closest('td').next().find('.editable'); + let getNextEditableField = function(field){ + let nextEditableField = $(field).closest('td').next().find('.editable'); return $(nextEditableField); }; @@ -836,7 +1048,7 @@ define([ * @param params * @returns {*} */ - var modifyFieldParamsOnSend = function(params){ + let modifyFieldParamsOnSend = function(params){ params.systemId = systemData.id; return params; @@ -849,8 +1061,8 @@ define([ mode: 'popup', container: 'body', error: function(jqXHR, newValue){ - var reason = ''; - var status = ''; + let reason = ''; + let status = ''; if(jqXHR.name){ // save error new sig (mass save) reason = jqXHR.name; @@ -873,6 +1085,10 @@ define([ title: 'signature id', name: 'name', emptytext: '? ? ?', + display: function(value) { + // change display value to first 3 letters + $(this).text( $.trim( value.substr(0, 3) ).toLowerCase() ); + }, validate: function(value) { if($.trim(value).length < 3) { return 'Id is less than min of "3"'; @@ -883,9 +1099,13 @@ define([ params: modifyFieldParamsOnSend, success: function(response, newValue){ if(response){ - var signatureTypeField = $(this); - var rowElement = signatureTypeField.parents('tr'); - var newRowData = response.signatures[0]; + let signatureTypeField = $(this); + let columnElement = signatureTypeField.parents('td'); + let rowElement = signatureTypeField.parents('tr'); + let newRowData = response.signatures[0]; + + // update column tooltip + updateTooltip(columnElement, newValue); // update "updated" cell updateSignatureCell(rowElement, 6, newRowData.updated); @@ -905,11 +1125,11 @@ define([ params: modifyFieldParamsOnSend, source: function(){ - var signatureGroupField = $(this); - var systemTypeId = parseInt( signatureGroupField.attr('data-systemTypeId') ); + let signatureGroupField = $(this); + let systemTypeId = parseInt( signatureGroupField.attr('data-systemTypeId') ); // get all available Signature Types - var availableTypes = signatureGroupsLabels; + let availableTypes = signatureGroupsLabels; // add empty option availableTypes[0] = ''; @@ -917,24 +1137,24 @@ define([ return availableTypes; }, success: function(response, newValue){ - var signatureTypeField = $(this); - var rowElement = signatureTypeField.parents('tr'); + let signatureTypeField = $(this); + let rowElement = signatureTypeField.parents('tr'); newValue = parseInt(newValue); if(response){ - var newRowData = response.signatures[0]; + let newRowData = response.signatures[0]; // update "updated" cell updateSignatureCell(rowElement, 6, newRowData.updated); } // find related "type" select (same row) and change options - var typeSelect = getNextEditableField(signatureTypeField); + let typeSelect = getNextEditableField(signatureTypeField); - var systemTypeId = parseInt( signatureTypeField.attr('data-systemTypeId') ); - var areaId = parseInt( signatureTypeField.attr('data-areaid') ); + let systemTypeId = parseInt( signatureTypeField.attr('data-systemTypeId') ); + let areaId = parseInt( signatureTypeField.attr('data-areaid') ); - var newSelectOptions = getAllSignatureNames(systemData, systemTypeId, areaId, newValue); + let newSelectOptions = getAllSignatureNames(systemData, systemTypeId, areaId, newValue); typeSelect.editable('option', 'source', newSelectOptions); typeSelect.editable('setValue', null); @@ -953,7 +1173,7 @@ define([ // Select sig type (slave: depends on sig type) --------------------------------------------------------------- sigTypeFields.on('init', function(e, editable) { // check if there are initial options available - var options = editable.input.options.source.bind(e.target)(); + let options = editable.input.options.source.bind(e.target)(); if(options.length <= 0){ editable.disable(); } @@ -968,20 +1188,20 @@ define([ showbuttons: false, params: modifyFieldParamsOnSend, source: function(){ - var signatureTypeField = $(this); + let signatureTypeField = $(this); - var systemTypeId = parseInt( signatureTypeField.attr('data-systemTypeId') ); - var areaId = parseInt( signatureTypeField.attr('data-areaid') ); - var groupId = parseInt( signatureTypeField.attr('data-groupId') ); - var availableSigs = getAllSignatureNames(systemData, systemTypeId, areaId, groupId); + let systemTypeId = parseInt( signatureTypeField.attr('data-systemTypeId') ); + let areaId = parseInt( signatureTypeField.attr('data-areaid') ); + let groupId = parseInt( signatureTypeField.attr('data-groupId') ); + let availableSigs = getAllSignatureNames(systemData, systemTypeId, areaId, groupId); return availableSigs; }, success: function(response, newValue){ if(response){ - var signatureTypeField = $(this); - var rowElement = signatureTypeField.parents('tr'); - var newRowData = response.signatures[0]; + let signatureTypeField = $(this); + let rowElement = signatureTypeField.parents('tr'); + let newRowData = response.signatures[0]; // update "updated" cell updateSignatureCell(rowElement, 6, newRowData.updated); @@ -1002,9 +1222,9 @@ define([ params: modifyFieldParamsOnSend, success: function(response, newValue){ if(response){ - var signatureTypeField = $(this); - var rowElement = signatureTypeField.parents('tr'); - var newRowData = response.signatures[0]; + let signatureTypeField = $(this); + let rowElement = signatureTypeField.parents('tr'); + let newRowData = response.signatures[0]; // update "updated" cell updateSignatureCell(rowElement, 6, newRowData.updated); @@ -1037,10 +1257,10 @@ define([ * @param groupId * @returns {Array} */ - var getAllSignatureNames = function(systemData, systemTypeId, areaId, groupId){ - var newSelectOptions = []; - var cacheKey = [systemTypeId, areaId, groupId].join('_'); - var newSelectOptionsCount = 0; + let getAllSignatureNames = function(systemData, systemTypeId, areaId, groupId){ + let newSelectOptions = []; + let cacheKey = [systemTypeId, areaId, groupId].join('_'); + let newSelectOptionsCount = 0; // check for cached signature names if(sigNameCache.hasOwnProperty( cacheKey )){ @@ -1050,12 +1270,12 @@ define([ }else{ // get new Options ---------- // get all possible "static" signature names by the selected groupId - var tempSelectOptions = Util.getAllSignatureNames(systemTypeId, areaId, groupId); + let tempSelectOptions = Util.getAllSignatureNames(systemTypeId, areaId, groupId); // format options into array with objects advantages: keep order, add more options (whs), use optgroup if(tempSelectOptions){ - var fixSelectOptions = []; - for (var key in tempSelectOptions) { + let fixSelectOptions = []; + for (let key in tempSelectOptions) { if ( key > 0 && tempSelectOptions.hasOwnProperty(key) @@ -1079,9 +1299,9 @@ define([ if( groupId === 5 ){ // add possible frigate holes - var frigateHoles = getFrigateHolesBySystem(areaId); - var frigateWHData = []; - for(var frigKey in frigateHoles){ + let frigateHoles = getFrigateHolesBySystem(areaId); + let frigateWHData = []; + for(let frigKey in frigateHoles){ if ( frigKey > 0 && frigateHoles.hasOwnProperty(frigKey) @@ -1096,8 +1316,8 @@ define([ } // add possible incoming holes - var incomingWHData = []; - for(var incomingKey in Init.incomingWormholes){ + let incomingWHData = []; + for(let incomingKey in Init.incomingWormholes){ if ( incomingKey > 0 && Init.incomingWormholes.hasOwnProperty(incomingKey) @@ -1124,9 +1344,9 @@ define([ if( groupId === 5 ){ // add static WH(s) for this system if(systemData.statics){ - var staticWHData = []; - for(var i = 0; i < systemData.statics.length; i++){ - var staticWHName = systemData.statics[i].name + ' - ' + systemData.statics[i].security; + let staticWHData = []; + for(let i = 0; i < systemData.statics.length; i++){ + let staticWHName = systemData.statics[i].name + ' - ' + systemData.statics[i].security; newSelectOptionsCount++; staticWHData.push( {value: newSelectOptionsCount, text: staticWHName} ); @@ -1164,10 +1384,10 @@ define([ * @param obj * @returns {number} */ - var sumSignaturesRecursive = function(key, obj){ - var sum = 0; + let sumSignaturesRecursive = function(key, obj){ + let sum = 0; - for (var prop in obj) { + for (let prop in obj) { if (obj.hasOwnProperty(prop) && key === prop) { sum += obj[prop].length; } @@ -1185,8 +1405,8 @@ define([ * @param systemTypeId * @returns {{}} */ - var getFrigateHolesBySystem = function(systemTypeId){ - var signatureNames = {}; + let getFrigateHolesBySystem = function(systemTypeId){ + let signatureNames = {}; if(Init.frigateWormholes[systemTypeId]){ signatureNames = Init.frigateWormholes[systemTypeId]; @@ -1199,27 +1419,27 @@ define([ * deletes signature rows from signature table * @param rows */ - var deleteSignatures = function(rows){ + let deleteSignatures = function(rows){ - var deletedSignatures = 0; + let deletedSignatures = 0; - var moduleElement = $('.' + config.systemSigModuleClass); - var data = rows.data(); - var signatureTableApi = signatureTable.api(); - var rowElements = rows.nodes().to$(); - var signatureCount = data.length; + let moduleElement = $('.' + config.systemSigModuleClass); + let data = rows.data(); + let signatureTableApi = signatureTable.api(); + let rowElements = rows.nodes().to$(); + let signatureCount = data.length; - var signatureIds = []; - for(var i = 0; i < data.length; i++){ + let signatureIds = []; + for(let i = 0; i < data.length; i++){ signatureIds.push(data[i].id); } - var requestData = { + let requestData = { signatureIds: signatureIds }; // animation callback function - var removeCallback = function(rowElement){ + let removeCallback = function(rowElement){ // delete signature row signatureTableApi.row(rowElement).remove().draw(); @@ -1242,13 +1462,13 @@ define([ dataType: 'json' }).done(function(data){ - for(var j = 0; j < rowElements.length; j++){ + for(let j = 0; j < rowElements.length; j++){ // removeRow $(rowElements[j]).toggleTableRow(removeCallback); } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; Util.showNotify({title: jqXHR.status + ': Delete signature', text: reason, type: 'warning'}); $(document).setProgramStatus('problem'); }); @@ -1263,15 +1483,15 @@ define([ * @param animate * @returns {*} */ - var addSignatureRow = function(systemData, signatureData, animate){ + let addSignatureRow = function(systemData, signatureData, animate){ - var newSignatureData = formatSignatureData(systemData, [signatureData], fullSignatureOptions); + let newSignatureData = formatSignatureData(systemData, [signatureData], fullSignatureOptions); // insert new row in main signature table - var tablePrimaryElement = $('.' + config.sigTablePrimaryClass); - var dataTablePrimary = tablePrimaryElement.DataTable(); - var newRowNode = dataTablePrimary.row.add(newSignatureData.shift()).draw().nodes(); - var newRowElement = newRowNode.to$(); + let tablePrimaryElement = $('.' + config.sigTablePrimaryClass); + let dataTablePrimary = tablePrimaryElement.DataTable(); + let newRowNode = dataTablePrimary.row.add(newSignatureData.shift()).draw().nodes(); + let newRowElement = newRowNode.to$(); if(animate === true){ newRowElement.hide(); @@ -1296,11 +1516,10 @@ define([ * @param callback */ $.fn.toggleTableRow = function(callback){ - var rowElement = $(this); - var cellElements = rowElement.children('td'); + let rowElement = $(this); + let cellElements = rowElement.children('td'); - var duration = 100; - var tdCounter = 0; + let duration = 100; // wrap each
into a container (for better animation performance) @@ -1322,15 +1541,11 @@ define([ }).velocity('slideUp', { duration: duration, complete: function(animationElements){ - tdCounter++; - // execute callback when last animation finished - if(tdCounter === animationElements.length){ - // remove wrapper - $(animationElements).children().unwrap(); + // remove wrapper + $(animationElements).children().unwrap(); - if(callback !== undefined){ - callback(rowElement); - } + if(callback !== undefined){ + callback(rowElement); } } }); @@ -1364,25 +1579,18 @@ define([ }).velocity('slideDown', { duration: duration, complete: function(animationElements){ - tdCounter++; - // execute callback when last animation finished - if(tdCounter === animationElements.length){ - - // remove wrapper - var wrapperElements = cellElements.children(); - for(var i = 0; i < wrapperElements.length; i++){ - var currentWrapper = $(wrapperElements[i]); - if(currentWrapper.children().length > 0){ - currentWrapper.children().unwrap(); - }else{ - currentWrapper.parent().html( currentWrapper.html() ); - } - } - - if(callback !== undefined){ - callback(rowElement); + // remove wrapper + for(let i = 0; i < animationElements.length; i++){ + let currentWrapper = $(animationElements[i]); + if(currentWrapper.children().length > 0){ + currentWrapper.children().unwrap(); + }else{ + currentWrapper.parent().html( currentWrapper.html() ); } + } + if(callback !== undefined){ + callback(rowElement); } } }); @@ -1398,21 +1606,21 @@ define([ * @returns {*} */ $.fn.drawSignatureTable = function(signatureData, systemData){ - var moduleElement = $(this); + let moduleElement = $(this); // setup filter select in footer // column indexes that need a filter select - var filterColumnIndexes = [2]; + let filterColumnIndexes = [2]; // create new signature table --------------------------------------------------------------------------------- - var table = $('', { + let table = $('
', { class: ['display', 'compact', 'nowrap', config.sigTableClass, config.sigTablePrimaryClass].join(' ') }); // create table footer ---------------------------------------------------------------------------------------- // get column count from default dataTable config - var columnCount = $.fn.dataTable.defaults.columnDefs.length; - var footerHtml = ''; + let columnCount = $.fn.dataTable.defaults.columnDefs.length; + let footerHtml = ''; for(let i = 0; i < columnCount; i++){ footerHtml += ''; } @@ -1421,13 +1629,13 @@ define([ moduleElement.append(table); - var dataTableOptions = { + let dataTableOptions = { data: signatureData, drawCallback: function(settings){ this.api().columns(filterColumnIndexes).every(function(){ - var column = this; - var footerColumnElement = $(column.footer()); - var filterSelect = footerColumnElement.find('.editable'); + let column = this; + let footerColumnElement = $(column.footer()); + let filterSelect = footerColumnElement.find('.editable'); // update select values filterSelect.editable('option', 'source', getColumnTableDataForFilter(column)); @@ -1436,9 +1644,9 @@ define([ initComplete: function (settings, json){ this.api().columns(filterColumnIndexes).every(function(){ - var column = this; - var headerLabel = $(column.header()).text(); - var selectField = $(''); @@ -1456,7 +1664,7 @@ define([ }); selectField.on('save', { column: column }, function(e, params) { - var val = $.fn.dataTable.util.escapeRegex( params.newValue ); + let val = $.fn.dataTable.util.escapeRegex( params.newValue ); e.data.column.search( val !== '0' ? '^' + val + '$' : '', true, false ).draw(); }); }); @@ -1479,13 +1687,13 @@ define([ * @param column * @returns {{}} */ - var getColumnTableDataForFilter = function(column){ + let getColumnTableDataForFilter = function(column){ // get all available options from column - var source = {}; + let source = {}; column.data().unique().sort(function(a,b){ // sort alphabetically - var valA = a.filter.toLowerCase(); - var valB = b.filter.toLowerCase(); + let valA = a.filter.toLowerCase(); + let valB = b.filter.toLowerCase(); if(valA < valB) return -1; if(valA > valB) return 1; @@ -1502,141 +1710,11 @@ define([ return source; }; - /** - * format signature data array into dataTable structure - * @param systemData - * @param signatureData - * @param options - * @returns {Array} - */ - var formatSignatureData = function(systemData, signatureData, options){ - - var formattedData = []; - - // security check - if( - systemData && - systemData.id && - systemData.id > 0 - ){ - var systemTypeId = systemData.type.id; - - // areaId is required as a key for signature names - // if areaId is 0, no signature data is available for this system - var areaId = Util.getAreaIdBySecurity(systemData.security); - - for(var i = 0; i < signatureData.length; i++){ - var data = signatureData[i]; - - var tempData = {}; - - // set id --------------------------------------------------------------------------------------------- - var sigId = 0; - if(data.id > 0){ - sigId = data.id; - } - tempData.id = sigId; - - // set status ----------------------------------------------------------------------------------------- - var statusClass = ''; - if(data.updated.character !== undefined){ - statusClass = Util.getStatusInfoForCharacter(data.updated.character, 'class'); - } - var status = ''; - - tempData.status = { - status: status, - status_sort: statusClass - }; - - // set name ------------------------------------------------------------------------------------------- - var sigName = ' 0){ - sigName += 'data-pk="' + data.id + '" '; - } - sigName += '>' + data.name + ''; - - tempData.name = sigName; - - // set group id --------------------------------------------------------------------------------------- - var sigGroup = ' 0){ - sigGroup += 'data-pk="' + data.id + '" '; - } - sigGroup += 'data-systemTypeId="' + systemTypeId + '" '; - sigGroup += 'data-areaId="' + areaId + '" '; - sigGroup += 'data-value="' + data.groupId + '" '; - sigGroup += '>'; - - tempData.group = { - group: sigGroup, - sort: signatureGroupsLabels[data.groupId], - filter: signatureGroupsLabels[data.groupId] - }; - - // set type id ---------------------------------------------------------------------------------------- - var sigType = ' 0){ - sigType += 'data-pk="' + data.id + '" '; - } - - // set disabled if sig type is not selected - if(data.groupId < 1){ - sigType += 'data-disabled="1" '; - } - - sigType += 'data-systemTypeId="' + systemTypeId + '" '; - sigType += 'data-areaId="' + areaId + '" '; - sigType += 'data-groupId="' + data.groupId + '" '; - sigType += 'data-value="' + data.typeId + '" '; - sigType += '>'; - - tempData.type = sigType; - - // set description ------------------------------------------------------------------------------------ - var sigDescription = ' 0){ - sigDescription += 'data-pk="' + data.id + '" '; - } - sigDescription += '>' + data.description + ''; - - tempData.description = sigDescription; - - // set created ---------------------------------------------------------------------------------------- - tempData.created = data.created; - - // set updated ---------------------------------------------------------------------------------------- - tempData.updated = data.updated; - - // info icon ------------------------------------------------------------------------------------------ - var infoButton = ''; - if(data.id > 0){ - infoButton = ''; - } - tempData.info = infoButton; - - // action icon ---------------------------------------------------------------------------------------- - - var actionButton = ''; - tempData.action = { - action: options.action, - button: actionButton - }; - - formattedData.push(tempData); - - } - - } - - return formattedData; - }; - /** * setup dataTable options for all signatureTables * @param systemData */ - var initSignatureDataTable = function(systemData){ + let initSignatureDataTable = function(systemData){ $.extend( true, $.fn.dataTable.defaults, { pageLength: -1, @@ -1673,7 +1751,14 @@ define([ title: 'id', type: 'html', width: '30px', - data: 'name' + data: 'name', + render: { + _: 'render' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + // update column tooltip + updateTooltip(cell, cellData.name); + } },{ targets: 2, orderable: true, @@ -1731,7 +1816,7 @@ define([ $(cell).initTimestampCounter(); // highlight cell - var diff = Math.floor((new Date()).getTime()) - cellData.updated * 1000; + let diff = Math.floor((new Date()).getTime()) - cellData.updated * 1000; // age > 1 day if( diff > 86400000){ @@ -1751,7 +1836,7 @@ define([ if(rowData.id > 0){ // add row tooltip - var tooltipData = { + let tooltipData = { created: rowData.created, updated: rowData.updated }; @@ -1772,15 +1857,15 @@ define([ sort: 'action' }, createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - var tempTableElement = this; - var rowElement = $(cell).parents('tr'); + let tempTableElement = this; + let rowElement = $(cell).parents('tr'); switch(cellData.action){ case 'add': // add new signature ------------------------------------------------------------------ $(cell).on('click', function(e) { // submit all fields within a table row - var formFields = rowElement.find('.editable'); + let formFields = rowElement.find('.editable'); // the "hide" makes sure to take care about open editable fields (e.g. description) // otherwise, changes would not be submitted in this field (not necessary) @@ -1803,17 +1888,17 @@ define([ success: function (data, editableConfig) { unlockSignatureTable(false); - var newRowElement = addSignatureRow(systemData, data.signatures[0], true); + let newRowElement = addSignatureRow(systemData, data.signatures[0], true); // highlight newRowElement.pulseTableRow('added'); // prepare "add signature" table for new entry -> reset ------------------- - var signatureData = formatSignatureData(systemData, [emptySignatureData], emptySignatureOptions); + let signatureData = formatSignatureData(systemData, [emptySignatureData], emptySignatureOptions); - var dataSecondaryElement = $('.' + config.sigTableSecondaryClass); - var dataTableSecondary = dataSecondaryElement.DataTable(); - var newAddRowElement = dataTableSecondary.clear().row.add(signatureData.shift()).draw().nodes(); + let dataSecondaryElement = $('.' + config.sigTableSecondaryClass); + let dataTableSecondary = dataSecondaryElement.DataTable(); + let newAddRowElement = dataTableSecondary.clear().row.add(signatureData.shift()).draw().nodes(); newAddRowElement.to$().makeEditable(systemData); @@ -1828,7 +1913,7 @@ define([ break; case 'delete': // delete signature ------------------------------------------------------------------- - var confirmationSettings = { + let confirmationSettings = { container: 'body', placement: 'left', btnCancelClass: 'btn btn-sm btn-default', @@ -1839,8 +1924,8 @@ define([ btnOkLabel: 'delete', btnOkIcon: 'fa fa-fw fa-close', onConfirm : function(e, target){ - var deleteRowElement = $(target).parents('tr'); - var row = tempTableElement.DataTable().rows(deleteRowElement); + let deleteRowElement = $(target).parents('tr'); + let row = tempTableElement.DataTable().rows(deleteRowElement); deleteSignatures(row); } }; @@ -1863,10 +1948,10 @@ define([ * @param moduleElement * @param systemData */ - var setModuleObserver = function(moduleElement, systemData){ - var tablePrimaryElement = $('.' + config.sigTablePrimaryClass); - var dataTablePrimary = signatureTable.DataTable(); - var signatureTableApi = signatureTable.api(); + let setModuleObserver = function(moduleElement, systemData){ + let tablePrimaryElement = $('.' + config.sigTablePrimaryClass); + let dataTablePrimary = signatureTable.DataTable(); + let signatureTableApi = signatureTable.api(); $(document).off('pf:updateSystemSignatureModule').on('pf:updateSystemSignatureModule', function(e, data){ if(data.signatures){ @@ -1899,95 +1984,29 @@ define([ $(e.target).prop('tagName').toLowerCase() !== 'input' && $(e.target).prop('tagName').toLowerCase() !== 'textarea' ){ - var clipboard = (e.originalEvent || e).clipboardData.getData('text/plain'); + let clipboard = (e.originalEvent || e).clipboardData.getData('text/plain'); moduleElement.updateSignatureTableByClipboard(systemData, clipboard, {}); } }); }; - /** - * check the "delete signature" button. show/hide the button if a signature is selected - */ - var checkDeleteSignaturesButton = function(){ - - var selectedRows = getSelectedRows(signatureTable); - var selectedRowCount = selectedRows.data().length; - var clearButton = $('.' + config.sigTableClearButtonClass); - - if(selectedRowCount > 0){ - var allRows = getRows(signatureTable); - var rowCount = allRows.data().length; - - var badgetText = selectedRowCount; - if(selectedRowCount >= rowCount){ - badgetText = 'all'; - } - clearButton.find('.badge').text( badgetText ); - - // update clear signatures button text - clearButton.velocity('stop'); - - if( clearButton.is(':hidden') ){ - // show button - clearButton.velocity('transition.bounceIn', { - duration: 180 - }); - }else{ - // highlight button - clearButton.velocity('callout.pulse', { - duration: 240 - }); - } - }else{ - // hide button - clearButton.velocity('transition.bounceOut', { - duration: 180 - }); - } - }; - - /** - * get all rows of a table - * @param table - * @returns {*} - */ - var getRows = function(table){ - var tableApi = table.api(); - var rows = tableApi.rows(); - - return rows; - }; - - /** - * get all selected rows of a table - * @param table - * @returns {*} - */ - var getSelectedRows = function(table){ - var tableApi = table.api(); - - var selectedRows = tableApi.rows('.selected'); - - return selectedRows; - }; - /** * get module element * @param parentElement * @param systemData * @returns {*|HTMLElement} */ - var getModule = function(parentElement, systemData){ + let getModule = function(parentElement, systemData){ // create new module container - var moduleElement = $('
', { + let moduleElement = $('
', { class: [config.moduleClass, config.systemSigModuleClass].join(' '), css: {opacity: 0} }); // headline - var headline = $('
', { + let headline = $('
', { text: 'Signatures' }); @@ -2004,7 +2023,7 @@ define([ // request signature data for system -------------------------------------------------------------------------- - var requestData = { + let requestData = { systemIds: [systemData.id] }; @@ -2018,7 +2037,7 @@ define([ } }).done(function(signatureData){ - var signatureTableData = formatSignatureData(this.systemData, signatureData, fullSignatureOptions); + let signatureTableData = formatSignatureData(this.systemData, signatureData, fullSignatureOptions); // draw signature table moduleElement.drawSignatureTable(signatureTableData, this.systemData); @@ -2026,7 +2045,7 @@ define([ // set module observer setModuleObserver(moduleElement, this.systemData); }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; Util.showNotify({title: jqXHR.status + ': Get signatures', text: reason, type: 'warning'}); $(document).setProgramStatus('problem'); }); @@ -2039,10 +2058,10 @@ define([ * @param systemData */ $.fn.drawSignatureTableModule = function(systemData){ - var parentElement = $(this); + let parentElement = $(this); // show module - var showModule = function(moduleElement){ + let showModule = function(moduleElement){ if(moduleElement){ moduleElement.velocity('transition.slideDownIn', { duration: Init.animationSpeed.mapModule, @@ -2055,7 +2074,7 @@ define([ }; // some custom array functions - var initArrayFunctions = function(){ + let initArrayFunctions = function(){ /** * sort array of objects by property name * @param p @@ -2069,7 +2088,7 @@ define([ }; // check if module already exists - var moduleElement = parentElement.find('.' + config.systemSigModuleClass); + let moduleElement = parentElement.find('.' + config.systemSigModuleClass); if(moduleElement.length > 0){ // disable update diff --git a/public/js/v1.2.0/app/util.js b/public/js/v1.2.0/app/util.js index feef7e46..fefba264 100644 --- a/public/js/v1.2.0/app/util.js +++ b/public/js/v1.2.0/app/util.js @@ -21,7 +21,7 @@ define([ 'use strict'; - var config = { + let config = { ajaxOverlayClass: 'pf-loading-overlay', ajaxOverlayWrapperClass: 'pf-loading-overlay-wrapper', @@ -62,11 +62,11 @@ define([ }; - var stopTimerCache = {}; // cache for stopwatch timer + let stopTimerCache = {}; // cache for stopwatch timer - var animationTimerCache = {}; // cache for table row animation timeout + let animationTimerCache = {}; // cache for table row animation timeout - var localStorage; // cache for "localForage" singleton + let localStorage; // cache for "localForage" singleton /* * =========================================================================================================== @@ -78,9 +78,9 @@ define([ * displays a loading indicator on an element */ $.fn.showLoadingAnimation = function(options){ - var loadingElement = $(this); + let loadingElement = $(this); - var iconSize = 'fa-lg'; + let iconSize = 'fa-lg'; // disable all events loadingElement.css('pointer-events', 'none'); @@ -93,7 +93,7 @@ define([ } } - var overlay = $('
', { + let overlay = $('
', { class: config.ajaxOverlayClass }).append( $('
', { @@ -111,7 +111,7 @@ define([ $(overlay).velocity({ opacity: 0.6 },{ - duration: 180 + duration: 120 }); }; @@ -119,8 +119,8 @@ define([ * removes a loading indicator */ $.fn.hideLoadingAnimation = function(){ - var loadingElement = $(this); - var overlay = loadingElement.find('.' + config.ajaxOverlayClass ); + let loadingElement = $(this); + let overlay = loadingElement.find('.' + config.ajaxOverlayClass ); // important: "stop" is required to stop "show" animation // -> otherwise "complete" callback is not fired! @@ -138,7 +138,7 @@ define([ * @param callback */ $.fn.showSplashOverlay = function(callback){ - var splashOverlay = $(this); + let splashOverlay = $(this); splashOverlay.velocity('fadeIn', { duration: Init.animationSpeed.splashOverlay, @@ -155,7 +155,7 @@ define([ * hide "splash" loading overlay */ $.fn.hideSplashOverlay = function(){ - var splashOverlay = $(this); + let splashOverlay = $(this); splashOverlay.velocity('fadeOut', { duration: Init.animationSpeed.splashOverlay @@ -170,8 +170,8 @@ define([ */ $.fn.showCaptchaImage = function(reason, callback){ return this.each(function(){ - var captchaWrapper = $(this); - var captchaImage = captchaWrapper.find('img'); + let captchaWrapper = $(this); + let captchaImage = captchaWrapper.find('img'); captchaWrapper.showLoadingAnimation(config.loadingOptions); getCaptchaImage(reason, function(base64Image){ @@ -192,9 +192,10 @@ define([ /** * request a captcha image + * @param reason * @param callback */ - var getCaptchaImage = function(reason, callback){ + let getCaptchaImage = function(reason, callback){ $.ajax({ type: 'POST', @@ -210,7 +211,7 @@ define([ callback(responseData.img); } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; showNotify({title: jqXHR.status + ': getCaptchaImage', text: reason, type: 'error'}); }); @@ -222,7 +223,7 @@ define([ */ $.fn.resetFormFields = function(){ return this.each(function(){ - var field = $(this); + let field = $(this); if( !field.is('select') ){ // "input" @@ -240,12 +241,12 @@ define([ */ $.fn.showFormMessage = function(errors){ - var formElement = $(this); + let formElement = $(this); - var errorMessage = []; - var warningMessage = []; - var infoMessage = []; - for(var i = 0; i < errors.length; i++){ + let errorMessage = []; + let warningMessage = []; + let infoMessage = []; + for(let i = 0; i < errors.length; i++){ if(errors[i].type === 'error'){ errorMessage.push( errors[i].message ); @@ -254,7 +255,7 @@ define([ errors[i].field && errors[i].field.length > 0 ){ - var formField = formElement.find('[name="' + errors[i].field + '"]'); + let formField = formElement.find('[name="' + errors[i].field + '"]'); formField.parents('.form-group').removeClass('has-success').addClass('has-error'); } @@ -294,9 +295,9 @@ define([ */ $.fn.hideFormMessage = function(type, callback){ - var formElement = $(this); + let formElement = $(this); - var settingsMessageVelocityOptions = $.extend({}, config.settingsMessageVelocityOptions); + let settingsMessageVelocityOptions = $.extend({}, config.settingsMessageVelocityOptions); // check if callback exists if(callback !== undefined){ @@ -306,7 +307,7 @@ define([ settingsMessageVelocityOptions.display = 'block'; } - var messageElement = null; + let messageElement = null; switch(type){ case 'error': @@ -346,22 +347,22 @@ define([ options = (typeof options === 'undefined')? {} : options; return this.each(function(){ - var form = $(this); + let form = $(this); // init form validation form.validator(options); // validation event listener form.on('valid.bs.validator', function(validatorObj){ - var inputGroup = $(validatorObj.relatedTarget).parents('.form-group'); + let inputGroup = $(validatorObj.relatedTarget).parents('.form-group'); if(inputGroup){ inputGroup.removeClass('has-error').addClass('has-success'); } }); form.on('invalid.bs.validator', function(validatorObj){ - var field = $(validatorObj.relatedTarget); - var inputGroup = field.parents('.form-group'); + let field = $(validatorObj.relatedTarget); + let inputGroup = field.parents('.form-group'); if(inputGroup){ inputGroup.removeClass('has-success').addClass('has-error'); } @@ -375,10 +376,10 @@ define([ * @returns {boolean} */ $.fn.isValidForm = function(){ - var form = $(this); - var valid = false; + let form = $(this); + let valid = false; - var errorElements = form.find('.has-error'); + let errorElements = form.find('.has-error'); if(errorElements.length === 0){ valid = true; @@ -393,9 +394,9 @@ define([ * @returns {{}} */ $.fn.getFormValues = function(){ - var form = $(this); - var formData = {}; - var values = form.serializeArray(); + let form = $(this); + let formData = {}; + let values = form.serializeArray(); // add "unchecked" checkboxes as well values = values.concat( @@ -411,7 +412,7 @@ define([ if(field.name.indexOf('[]') !== -1){ // array field - var key = field.name.replace('[]', ''); + let key = field.name.replace('[]', ''); if( !$.isArray(formData[key]) ){ formData[key] = []; } @@ -423,7 +424,7 @@ define([ } // get xEditable values - var editableValues = form.find('.' + config.formEditableFieldClass).editable('getValue'); + let editableValues = form.find('.' + config.formEditableFieldClass).editable('getValue'); // merge values formData = $.extend(formData, editableValues); @@ -437,15 +438,15 @@ define([ */ $.fn.isInViewport = function(){ - var visibleElement = []; + let visibleElement = []; this.each(function(){ - var element = $(this)[0]; + let element = $(this)[0]; - var top = element.offsetTop; - var left = element.offsetLeft; - var width = element.offsetWidth; - var height = element.offsetHeight; + let top = element.offsetTop; + let left = element.offsetLeft; + let width = element.offsetWidth; + let height = element.offsetHeight; while(element.offsetParent) { element = element.offsetParent; @@ -471,12 +472,12 @@ define([ */ $.fn.initMapUpdateCounter = function(){ - var counterChart = $(this); + let counterChart = $(this); counterChart.easyPieChart({ barColor: function(percent){ - var color = '#568a89'; + let color = '#568a89'; if(percent <= 30){ color = '#d9534f'; }else if(percent <= 50){ @@ -503,14 +504,14 @@ define([ options = (typeof options === 'object') ? options : {}; - var defaultOptions = { + let defaultOptions = { container: this, delay: 100 }; options = $.extend(defaultOptions, options); return this.each(function(){ - var tooltipElements = $(this).find('[title]'); + let tooltipElements = $(this).find('[title]'); tooltipElements.tooltip('destroy').tooltip(options); }); }; @@ -520,14 +521,14 @@ define([ * @param tooltipData */ $.fn.addCharacterInfoTooltip = function(tooltipData){ - var element = $(this); + let element = $(this); if( tooltipData.created.character && tooltipData.updated.character ){ - var createdData = tooltipData.created; - var updatedData = tooltipData.updated; + let createdData = tooltipData.created; + let updatedData = tooltipData.updated; // check if data has changed if( @@ -539,16 +540,16 @@ define([ element.data('created', createdData.created); element.data('updated', updatedData.updated); - var statusCreatedClass = getStatusInfoForCharacter(createdData.character, 'class'); - var statusUpdatedClass = getStatusInfoForCharacter(updatedData.character, 'class'); + let statusCreatedClass = getStatusInfoForCharacter(createdData.character, 'class'); + let statusUpdatedClass = getStatusInfoForCharacter(updatedData.character, 'class'); // convert timestamps - var dateCreated = new Date(createdData.created * 1000); - var dateUpdated = new Date(updatedData.updated * 1000); - var dateCreatedUTC = convertDateToUTC(dateCreated); - var dateUpdatedUTC = convertDateToUTC(dateUpdated); + let dateCreated = new Date(createdData.created * 1000); + let dateUpdated = new Date(updatedData.updated * 1000); + let dateCreatedUTC = convertDateToUTC(dateCreated); + let dateUpdatedUTC = convertDateToUTC(dateUpdated); - var data = { + let data = { created: createdData, updated: updatedData, createdTime: convertDateToString(dateCreatedUTC), @@ -558,7 +559,7 @@ define([ }; requirejs(['text!templates/tooltip/character_info.html', 'mustache'], function(template, Mustache) { - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); element.popover({ placement: 'top', @@ -574,7 +575,7 @@ define([ }); // set new popover content - var popover = element.data('bs.popover'); + let popover = element.data('bs.popover'); popover.options.content = content; }); @@ -587,12 +588,12 @@ define([ * @param userData */ $.fn.initCharacterSwitchPopover = function(userData){ - var elements = $(this); - var eventNamespace = 'hideCharacterPopup'; + let elements = $(this); + let eventNamespace = 'hideCharacterPopup'; requirejs(['text!templates/tooltip/character_switch.html', 'mustache'], function (template, Mustache) { - var data = { + let data = { id: config.headCharacterSwitchId, routes: Init.routes, userData: userData, @@ -602,10 +603,10 @@ define([ }) }; - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); return elements.each(function() { - var element = $(this); + let element = $(this); // check if tooltip already exists -> remove it if(element.data('bs.popover') !== undefined){ @@ -616,11 +617,11 @@ define([ e.preventDefault(); e.stopPropagation(); - var easeEffect = $(this).attr('data-easein'); - var popoverData = $(this).data('bs.popover'); - var popoverElement = null; + let easeEffect = $(this).attr('data-easein'); + let popoverData = $(this).data('bs.popover'); + let popoverElement = null; - var velocityOptions = { + let velocityOptions = { duration: Init.animationSpeed.dialogEvents }; @@ -670,7 +671,7 @@ define([ $('body').off('click.' + eventNamespace).on('click.' + eventNamespace + ' contextmenu', function (e) { $('.' + config.popoverTriggerClass).each(function () { - var popoverElement = $(this); + let popoverElement = $(this); //the 'is' for buttons that trigger popups //the 'has' for icons within a button that triggers a popup if( @@ -678,7 +679,7 @@ define([ popoverElement.has(e.target).length === 0 && $('.popover').has(e.target).length === 0 ){ - var popover = popoverElement.data('bs.popover'); + let popover = popoverElement.data('bs.popover'); if( popover !== undefined && @@ -699,10 +700,10 @@ define([ */ $.fn.addWormholeInfoTooltip = function(tooltipData){ return this.each(function() { - var element = $(this); + let element = $(this); requirejs(['text!templates/tooltip/wormhole_info.html', 'mustache'], function (template, Mustache) { - var content = Mustache.render(template, tooltipData); + let content = Mustache.render(template, tooltipData); element.popover({ placement: 'top', @@ -719,7 +720,7 @@ define([ }); // set new popover content - var popover = element.data('bs.popover'); + let popover = element.data('bs.popover'); popover.options.content = content; }); }); @@ -731,12 +732,12 @@ define([ * @param config */ $.fn.showMessage = function(config){ - var containerElement = $(this); + let containerElement = $(this); requirejs(['text!templates/form/message.html', 'mustache'], function(template, Mustache) { - var messageTypeClass = 'alert-danger'; - var messageTextClass = 'txt-color-danger'; + let messageTypeClass = 'alert-danger'; + let messageTextClass = 'txt-color-danger'; switch(config.type){ case 'info': @@ -753,14 +754,14 @@ define([ break; } - var data = { + let data = { title: config.title, text: config.text, messageTypeClass: messageTypeClass, messageTextClass: messageTextClass }; - var content = Mustache.render(template, data); + let content = Mustache.render(template, data); containerElement.html(content); @@ -778,14 +779,14 @@ define([ */ $.fn.singleDoubleClick = function(singleClickCallback, doubleClickCallback, timeout) { return this.each(function(){ - var clicks = 0, self = this; + let clicks = 0, self = this; // prevent default behaviour (e.g. open -tag link) - $(this).on('click', function(e){ + $(this).off('click').on('click', function(e){ e.preventDefault(); }); - $(this).on('mouseup', function(e){ + $(this).off('mouseup').on('mouseup', function(e){ clicks++; if (clicks === 1) { setTimeout(function(){ @@ -808,7 +809,7 @@ define([ */ $.fn.pulseTableRow = function(status, clear){ - var animationClass = ''; + let animationClass = ''; switch(status){ case 'added': animationClass = config.animationPulseSuccessClass; @@ -818,9 +819,9 @@ define([ break; } - var clearTimer = function(element) { + let clearTimer = function(element) { element.removeClass( animationClass ); - var currentTimer = element.data('animationTimer'); + let currentTimer = element.data('animationTimer'); if( animationTimerCache.hasOwnProperty(currentTimer) ){ clearTimeout( currentTimer ); @@ -830,7 +831,7 @@ define([ }; return this.each(function(){ - var element = $(this); + let element = $(this); if( element.hasClass(animationClass) ){ // clear timer -> set new timer @@ -839,7 +840,7 @@ define([ if(clear !== true){ element.addClass( animationClass ); - var timer = setTimeout(clearTimer, 1500, element); + let timer = setTimeout(clearTimer, 1500, element); element.data('animationTimer', timer); animationTimerCache[timer] = true; } @@ -857,21 +858,21 @@ define([ * get current Pathfinder version number * @returns {*|jQuery} */ - var getVersion = function(){ + let getVersion = function(){ return $('body').data('version'); }; /** * show current program version information in browser console */ - var showVersionInfo = function(){ + let showVersionInfo = function(){ console.info('PATHFINDER ' + getVersion()); }; /** * init utility prototype functions */ - var initPrototypes = function(){ + let initPrototypes = function(){ // Array diff // [1,2,3,4,5,6].diff( [3,4,5] ); // => [1, 2, 6] @@ -883,7 +884,7 @@ define([ /** * set default configuration for "Bootbox" dialogs */ - var initDefaultBootboxConfig = function(){ + let initDefaultBootboxConfig = function(){ bootbox.setDefaults({ onEscape: true // enables close dialogs on ESC key }); @@ -896,7 +897,7 @@ define([ * @param value * @returns {*} */ - var getCurrentTriggerDelay = function( updateKey, value ){ + let getCurrentTriggerDelay = function( updateKey, value ){ // make sure the delay timer is valid! // if this is called for the first time -> set CURRENT_DELAY @@ -922,12 +923,12 @@ define([ * get date obj with current EVE Server Time. * @returns {Date} */ - var getServerTime = function(){ + let getServerTime = function(){ // Server is running with GMT/UTC (EVE Time) - var localDate = new Date(); + let localDate = new Date(); - var serverDate= new Date( + let serverDate= new Date( localDate.getUTCFullYear(), localDate.getUTCMonth(), localDate.getUTCDate(), @@ -944,8 +945,8 @@ define([ * @param timestamp * @returns {Date} */ - var convertTimestampToServerTime = function(timestamp){ - var currentTimeZoneOffsetInMinutes = new Date().getTimezoneOffset(); + let convertTimestampToServerTime = function(timestamp){ + let currentTimeZoneOffsetInMinutes = new Date().getTimezoneOffset(); return new Date( (timestamp + (currentTimeZoneOffsetInMinutes * 60)) * 1000); }; @@ -955,11 +956,11 @@ define([ * @param date2 * @returns {{}} */ - var getTimeDiffParts = function(date1, date2){ - var parts = {}; - var time1 = date1.getTime(); - var time2 = date2.getTime(); - var diff = 0; + let getTimeDiffParts = function(date1, date2){ + let parts = {}; + let time1 = date1.getTime(); + let time2 = date2.getTime(); + let diff = 0; if( time1 >= 0 && @@ -971,7 +972,7 @@ define([ diff = Math.abs(Math.floor(diff)); parts.days = Math.floor(diff/(24*60*60)); - var leftSec = diff - parts.days * 24*60*60; + let leftSec = diff - parts.days * 24*60*60; parts.hours = Math.floor(leftSec/(60*60)); leftSec = leftSec - parts.hours * 60*60; @@ -985,7 +986,7 @@ define([ * start time measurement by a unique string identifier * @param timerName */ - var timeStart = function(timerName){ + let timeStart = function(timerName){ if(typeof performance === 'object'){ stopTimerCache[timerName] = performance.now(); @@ -999,13 +1000,13 @@ define([ * @param timerName * @returns {number} */ - var timeStop = function(timerName){ + let timeStop = function(timerName){ - var duration = 0; + let duration = 0; if( stopTimerCache.hasOwnProperty(timerName) ){ // check browser support for performance API - var timeNow = 0; + let timeNow = 0; if(typeof performance === 'object'){ timeNow = performance.now(); @@ -1025,10 +1026,10 @@ define([ /** * trigger main logging event with log information - * @param message + * @param logKey * @param options */ - var log = function(logKey, options){ + let log = function(logKey, options){ $(window).trigger('pf:log', [logKey, options]); }; @@ -1037,7 +1038,7 @@ define([ * @param customConfig * @param desktop */ - var showNotify = function(customConfig, desktop){ + let showNotify = function(customConfig, desktop){ requirejs(['app/notification'], function(Notification) { Notification.showNotify(customConfig, desktop); }); @@ -1046,7 +1047,7 @@ define([ /** * stop browser tab title "blinking" */ - var stopTabBlink = function(){ + let stopTabBlink = function(){ requirejs(['app/notification'], function(Notification) { Notification.stopTabBlink(); }); @@ -1058,8 +1059,8 @@ define([ * @param option * @returns {string} */ - var getLogInfo = function(logType, option){ - var logInfo = ''; + let getLogInfo = function(logType, option){ + let logInfo = ''; if(Init.classes.logTypes.hasOwnProperty(logType)){ logInfo = Init.classes.logTypes[logType][option]; @@ -1068,10 +1069,18 @@ define([ return logInfo; }; + /** + * get currentUserData from "global" variable + * @returns {*} + */ + let getCurrentUserData = function(){ + return Init.currentUserData; + }; + /** * set default jQuery AJAX configuration */ - var ajaxSetup = function(){ + let ajaxSetup = function(){ $.ajaxSetup({ beforeSend: function(xhr, settings) { // Add custom application headers on "same origin" requests only! @@ -1079,8 +1088,8 @@ define([ if(settings.crossDomain === false){ // add current character data to ANY XHR request (HTTP HEADER) // -> This helps to identify multiple characters on multiple browser tabs - var userData = getCurrentUserData(); - var currentCharacterId = 0; + let userData = getCurrentUserData(); + let currentCharacterId = 0; if( userData && userData.character @@ -1094,6 +1103,111 @@ define([ }); }; + /** + * get WebSocket readyState description from ID + * https://developer.mozilla.org/de/docs/Web/API/WebSocket + * @param readyState + * @returns {string} + */ + let getWebSocketDescriptionByReadyState = (readyState) => { + let description = ''; + + switch(readyState){ + case 0: description = 'connecting'; break; + case 1: description = 'open'; break; + case 2: description = 'closing'; break; + case 3: description = 'closed'; break; + } + + return description; + }; + + /** + * set sync status for map updates + * -> if SharedWorker AND WebSocket connected -> status = "WebSocket" + * -> else -> status = "ajax" (long polling) + * @param type + * @param options + */ + let setSyncStatus = (type, options) => { + // current syncStatus + let syncStatus = Init.syncStatus; + + switch(type){ + case 'ws:open': + // WebSocket open + syncStatus.webSocket.status = getWebSocketDescriptionByReadyState(options.readyState); + syncStatus.webSocket.class = 'txt-color-success'; + syncStatus.webSocket.timestamp = new Date().getTime() / 1000; + + syncStatus.type = 'webSocket'; + setSyncStatus('ajax:disable'); + + $(window).trigger('pf:syncStatus'); + break; + case 'ws:get': + // WebSocket data pushed from server + syncStatus.webSocket.timestamp = new Date().getTime() / 1000; + $(window).trigger('pf:syncStatus'); + break; + case 'ws:closed': + // WebSocket closed + syncStatus.webSocket.status = getWebSocketDescriptionByReadyState(options.readyState); + syncStatus.webSocket.class = 'txt-color-danger'; + syncStatus.webSocket.timestamp = undefined; + + setSyncStatus('ajax:enable'); + break; + case 'ws:error': + // WebSocket error + syncStatus.webSocket.status = getWebSocketDescriptionByReadyState(options.readyState); + syncStatus.webSocket.class = 'txt-color-danger'; + + setSyncStatus('ajax:enable'); + break; + case 'sw:init': + // SharedWorker initialized + syncStatus.sharedWorker.status = 'online'; + syncStatus.sharedWorker.class = 'txt-color-success'; + break; + case 'sw:error': + // SharedWorker error + syncStatus.sharedWorker.status = 'offline'; + syncStatus.sharedWorker.class = 'txt-color-danger'; + + setSyncStatus('ajax:enable'); + break; + case 'ajax:enable': + // Ajax enabled (WebSocket error/not connected) + syncStatus.ajax.status = 'enabled'; + syncStatus.ajax.class = 'txt-color-success'; + syncStatus.ajax.timestamp = new Date().getTime() / 1000; + + syncStatus.type = 'ajax'; + $(window).trigger('pf:syncStatus'); + break; + case 'ajax:get': + // Ajax data pulled from client + syncStatus.ajax.timestamp = new Date().getTime() / 1000; + $(window).trigger('pf:syncStatus'); + break; + case 'ajax:disable': + // Ajax disabled (WebSocket open/ready) + syncStatus.ajax.status = 'disabled'; + syncStatus.ajax.class = 'txt-color-warning'; + break; + } + }; + + /** + * get current sync type for map updates + * -> "ajax" or "webSocket" + * @returns {string} + */ + let getSyncType = () => { + return Init.syncStatus.type; + }; + /** * Returns true if the user hit Esc or navigated away from the * current page before an AJAX call was done. (The response @@ -1104,7 +1218,7 @@ define([ * @param jqXHR XMLHttpRequest instance * @returns {boolean} */ - var isXHRAborted = function(jqXHR){ + let isXHRAborted = function(jqXHR){ return !jqXHR.getAllResponseHeaders(); }; @@ -1117,9 +1231,9 @@ define([ */ $.fn.getMapTabElements = function(mapId){ - var mapModuleElement = $(this); + let mapModuleElement = $(this); - var mapTabElements = mapModuleElement.find('#' + config.mapTabBarId).find('a'); + let mapTabElements = mapModuleElement.find('#' + config.mapTabBarId).find('a'); if(mapId){ // search for a specific tab element @@ -1135,9 +1249,9 @@ define([ * get the map module object or create a new module * @returns {*|HTMLElement} */ - var getMapModule = function(){ + let getMapModule = function(){ - var mapModule = $('#' + config.mapModuleId); + let mapModule = $('#' + config.mapModuleId); if(mapModule.length === 0){ mapModule = $('
', { id: config.mapModuleId @@ -1147,6 +1261,42 @@ define([ return mapModule; }; + /** + * get Area ID by security string + * @param security + * @returns {number} + */ + let getAreaIdBySecurity = function(security){ + + let areaId = 0; + + switch(security){ + case 'H': + areaId = 10; + break; + case 'L': + areaId = 11; + break; + case '0.0': + areaId = 12; + break; + case 'SH': + areaId = 13; + break; + default: + // w-space + for(let i = 1; i <= 6; i++){ + if(security === 'C' + i){ + areaId = i; + break; + } + } + break; + } + + return areaId; + }; + /** * get system effect data by system security and system class * if no search parameters given -> get all effect data @@ -1154,12 +1304,12 @@ define([ * @param effect * @returns {boolean} */ - var getSystemEffectData = function(security, effect){ - var data = SystemEffect; + let getSystemEffectData = function(security, effect){ + let data = SystemEffect; if(security){ // look for specific data data = false; - var areaId = getAreaIdBySecurity(security); + let areaId = getAreaIdBySecurity(security); if( areaId > 0 && @@ -1179,25 +1329,25 @@ define([ * @param option * @returns {string} */ - var getStatusInfoForCharacter = function(characterData, option){ + let getStatusInfoForCharacter = function(characterData, option){ - var statusInfo = ''; + let statusInfo = ''; // character status can not be checked if there are no reference data // e.g. during registration process (login page) if(Init.characterStatus){ // get info for current "main" character - var corporationId = getCurrentUserInfo('corporationId'); - var allianceId = getCurrentUserInfo('allianceId'); + let corporationId = getCurrentUserInfo('corporationId'); + let allianceId = getCurrentUserInfo('allianceId'); // get all user characters - var userData = getCurrentUserData(); + let userData = getCurrentUserData(); if(userData){ // check if character is one of his own characters - var userCharactersData = userData.characters; + let userCharactersData = userData.characters; - for(var i = 0; i < userCharactersData.length; i++){ + for(let i = 0; i < userCharactersData.length; i++){ if(userCharactersData[i].id === characterData.id){ statusInfo = Init.characterStatus.own[option]; break; @@ -1230,13 +1380,13 @@ define([ * @param data * @returns {string} */ - var getSystemEffectTable = function(data){ - var table = ''; + let getSystemEffectTable = function(data){ + let table = ''; if(data.length > 0){ table += '
'; - for(var i = 0; i < data.length; i++){ + for(let i = 0; i < data.length; i++){ table += ''; table += '
'; table += data[i].effect; @@ -1258,16 +1408,16 @@ define([ * @param data * @returns {string} */ - var getSystemsInfoTable = function(data){ - var table = ''; + let getSystemsInfoTable = function(data){ + let table = ''; if(data.length > 0){ table += ''; - for(var i = 0; i < data.length; i++){ + for(let i = 0; i < data.length; i++){ - var trueSecClass = getTrueSecClassForSystem( data[i].trueSec ); - var securityClass = getSecurityClassForSystem( data[i].security ); + let trueSecClass = getTrueSecClassForSystem( data[i].trueSec ); + let securityClass = getSecurityClassForSystem( data[i].security ); table += ''; table += '
'; @@ -1292,8 +1442,8 @@ define([ * @param sec * @returns {string} */ - var getSecurityClassForSystem = function(sec){ - var secClass = ''; + let getSecurityClassForSystem = function(sec){ + let secClass = ''; if( Init.classes.systemSecurity.hasOwnProperty(sec) ){ secClass = Init.classes.systemSecurity[sec]['class']; @@ -1304,11 +1454,11 @@ define([ /** * get a css class for the trueSec level of a system - * @param sec + * @param trueSec * @returns {string} */ - var getTrueSecClassForSystem = function(trueSec){ - var trueSecClass = ''; + let getTrueSecClassForSystem = function(trueSec){ + let trueSecClass = ''; trueSec = parseFloat(trueSec); @@ -1337,9 +1487,9 @@ define([ * @param option * @returns {string} */ - var getStatusInfoForSystem = function(status, option){ + let getStatusInfoForSystem = function(status, option){ - var statusInfo = ''; + let statusInfo = ''; if( Init.systemStatus.hasOwnProperty(status) ){ // search by status string @@ -1363,11 +1513,11 @@ define([ * @param option * @returns {{}} */ - var getSignatureGroupInfo = function(option){ + let getSignatureGroupInfo = function(option){ - var groupInfo = {}; + let groupInfo = {}; - for (var prop in Init.signatureGroups) { + for (let prop in Init.signatureGroups) { if(Init.signatureGroups.hasOwnProperty(prop)){ prop = parseInt(prop); groupInfo[prop] = Init.signatureGroups[prop][option]; @@ -1384,9 +1534,9 @@ define([ * @param sigGroupId * @returns {{}} */ - var getAllSignatureNames = function(systemTypeId, areaId, sigGroupId){ + let getAllSignatureNames = function(systemTypeId, areaId, sigGroupId){ - var signatureNames = {}; + let signatureNames = {}; if( SignatureType[systemTypeId] && @@ -1406,17 +1556,17 @@ define([ * @param name * @returns {number} */ - var getSignatureTypeIdByName = function(systemData, sigGroupId, name){ + let getSignatureTypeIdByName = function(systemData, sigGroupId, name){ - var signatureTypeId = 0; + let signatureTypeId = 0; - var areaId = getAreaIdBySecurity(systemData.security); + let areaId = getAreaIdBySecurity(systemData.security); if(areaId > 0){ - var signatureNames = getAllSignatureNames(systemData.type.id, areaId, sigGroupId ); + let signatureNames = getAllSignatureNames(systemData.type.id, areaId, sigGroupId ); name = name.toLowerCase(); - for(var prop in signatureNames) { + for(let prop in signatureNames) { if( signatureNames.hasOwnProperty(prop) && @@ -1431,49 +1581,13 @@ define([ return signatureTypeId; }; - /** - * get Area ID by security string - * @param security - * @returns {number} - */ - var getAreaIdBySecurity = function(security){ - - var areaId = 0; - - switch(security){ - case 'H': - areaId = 10; - break; - case 'L': - areaId = 11; - break; - case '0.0': - areaId = 12; - break; - case 'SH': - areaId = 13; - break; - default: - // w-space - for(var i = 1; i <= 6; i++){ - if(security === 'C' + i){ - areaId = i; - break; - } - } - break; - } - - return areaId; - }; - /** * set currentMapUserData as "global" variable (count of active pilots) * this function should be called continuously after data change * to keep the data always up2data * @param mapUserData */ - var setCurrentMapUserData = function(mapUserData){ + let setCurrentMapUserData = function(mapUserData){ Init.currentMapUserData = mapUserData; return getCurrentMapUserData(); @@ -1484,16 +1598,15 @@ define([ * @param mapId * @returns {boolean} */ - var getCurrentMapUserData = function(mapId){ - - var currentMapUserData = false; + let getCurrentMapUserData = function(mapId){ + let currentMapUserData = false; if( mapId === parseInt(mapId, 10) && Init.currentMapUserData ){ // search for a specific map - for(var i = 0; i < Init.currentMapUserData.length; i++){ + for(let i = 0; i < Init.currentMapUserData.length; i++){ if(Init.currentMapUserData[i].config.id === mapId){ currentMapUserData = Init.currentMapUserData[i]; break; @@ -1518,23 +1631,59 @@ define([ * to keep the data always up2data * @param mapData */ - var setCurrentMapData = function(mapData){ + let setCurrentMapData = function(mapData){ Init.currentMapData = mapData; return getCurrentMapData(); }; + /** + * get mapData array index by mapId + * @param mapId + * @returns {boolean|int} + */ + let getCurrentMapDataIndex = function(mapId){ + let mapDataIndex = false; + + if( mapId === parseInt(mapId, 10) ){ + for(let i = 0; i < Init.currentMapData.length; i++){ + if(Init.currentMapData[i].config.id === mapId){ + mapDataIndex = i; + break; + } + } + } + + return mapDataIndex; + }; + + /** + * update cached mapData for a single map + * @param mapData + */ + let updateCurrentMapData = function(mapData){ + let mapDataIndex = getCurrentMapDataIndex( mapData.config.id ); + + if(mapDataIndex !== false){ + Init.currentMapData[mapDataIndex].config = mapData.config; + Init.currentMapData[mapDataIndex].data = mapData.data; + }else{ + // new map data + Init.currentMapData.push(mapData); + } + }; + /** * get currentMapData from "global" variable for a specific map or all maps * @param mapId * @returns {boolean} */ - var getCurrentMapData = function(mapId){ - var currentMapData = false; + let getCurrentMapData = function(mapId){ + let currentMapData = false; if( mapId === parseInt(mapId, 10) ){ // search for a specific map - for(var i = 0; i < Init.currentMapData.length; i++){ + for(let i = 0; i < Init.currentMapData.length; i++){ if(Init.currentMapData[i].config.id === mapId){ currentMapData = Init.currentMapData[i]; break; @@ -1549,33 +1698,22 @@ define([ }; /** - * get mapData array index by mapId + * delete map data by mapId from currentMapData * @param mapId - * @returns {boolean|int} */ - var getCurrentMapDataIndex = function(mapId){ - var mapDataIndex = false; - - if( mapId === parseInt(mapId, 10) ){ - for(var i = 0; i < Init.currentMapData.length; i++){ - if(Init.currentMapData[i].config.id === mapId){ - mapDataIndex = i; - break; - } - } - } - - return mapDataIndex; + let deleteCurrentMapData = (mapId) => { + Init.currentMapData = Init.currentMapData.filter((mapData) => { + return (mapData.config.id !== mapId); + }); }; - /** * set currentUserData as "global" variable * this function should be called continuously after data change * to keep the data always up2data * @param userData */ - var setCurrentUserData = function(userData){ + let setCurrentUserData = function(userData){ Init.currentUserData = userData; // check if function is available @@ -1587,23 +1725,13 @@ define([ return getCurrentUserData(); }; - /** - * get currentUserData from "global" variable - * @returns {*} - */ - var getCurrentUserData = function(){ - return Init.currentUserData; - }; - /** * get the current log data for the current user character * @returns {boolean} */ - var getCurrentCharacterLog = function(){ - - var characterLog = false; - - var currentUserData = getCurrentUserData(); + let getCurrentCharacterLog = function(){ + let characterLog = false; + let currentUserData = getCurrentUserData(); if( currentUserData && @@ -1621,13 +1749,13 @@ define([ * @param option * @returns {boolean} */ - var getCurrentUserInfo = function(option){ - var currentUserData = getCurrentUserData(); - var userInfo = false; + let getCurrentUserInfo = function(option){ + let currentUserData = getCurrentUserData(); + let userInfo = false; if(currentUserData){ // user data is set -> user data will be set AFTER the main init request! - var characterData = currentUserData.character; + let characterData = currentUserData.character; if(characterData){ if( @@ -1655,8 +1783,8 @@ define([ * @param systemData * @param type */ - var setDestination = function(systemData, type){ - var description = ''; + let setDestination = function(systemData, type){ + let description = ''; switch(type){ case 'set_destination': description = 'Set destination'; @@ -1689,7 +1817,7 @@ define([ responseData.systemData && responseData.systemData.length > 0 ){ - for (var j = 0; j < responseData.systemData.length; j++) { + for (let j = 0; j < responseData.systemData.length; j++) { showNotify({title: this.description, text: 'System: ' + responseData.systemData[j].name, type: 'success'}); } } @@ -1698,13 +1826,13 @@ define([ responseData.error && responseData.error.length > 0 ){ - for(var i = 0; i < responseData.error.length; i++){ + for(let i = 0; i < responseData.error.length; i++){ showNotify({title: this.description + ' error', text: 'System: ' + responseData.error[i].message, type: 'error'}); } } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; showNotify({title: jqXHR.status + ': ' + this.description, text: reason, type: 'warning'}); }); }; @@ -1713,7 +1841,7 @@ define([ * set currentSystemData as "global" variable * @param systemData */ - var setCurrentSystemData = function(systemData){ + let setCurrentSystemData = function(systemData){ Init.currentSystemData = systemData; }; @@ -1721,7 +1849,7 @@ define([ * get currentSystemData from "global" variables * @returns {*} */ - var getCurrentSystemData = function(){ + let getCurrentSystemData = function(){ return Init.currentSystemData; }; @@ -1730,8 +1858,8 @@ define([ * -> system data where current user is located * @returns {{id: *, name: *}} */ - var getCurrentLocationData = function(){ - var currentLocationLink = $('#' + config.headCurrentLocationId).find('a'); + let getCurrentLocationData = function(){ + let currentLocationLink = $('#' + config.headCurrentLocationId).find('a'); return { id: currentLocationLink.data('systemId'), name: currentLocationLink.data('systemName') @@ -1742,7 +1870,7 @@ define([ * get all "open" dialog elements * @returns {*|jQuery} */ - var getOpenDialogs = function(){ + let getOpenDialogs = function(){ return $('.' + config.dialogClass).filter(':visible'); }; @@ -1751,10 +1879,10 @@ define([ * @param price * @returns {string} */ - var formatPrice = function(price){ + let formatPrice = function(price){ price = Number( price ).toFixed(2); - var parts = price.toString().split('.'); + let parts = price.toString().split('.'); price = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',') + (parts[1] ? '.' + parts[1] : ''); return price + ' ISK'; @@ -1764,7 +1892,7 @@ define([ * get localForage instance (singleton) for offline client site storage * @returns {localforage} */ - var getLocalStorage = function(){ + let getLocalStorage = function(){ if(localStorage === undefined){ localStorage = localforage.createInstance({ driver: [localforage.INDEXEDDB, localforage.WEBSQL, localforage.LOCALSTORAGE], @@ -1779,7 +1907,7 @@ define([ * @param date * @returns {Date} */ - var createDateAsUTC = function(date) { + let createDateAsUTC = function(date) { return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); }; @@ -1788,7 +1916,7 @@ define([ * @param date * @returns {Date} */ - var convertDateToUTC = function(date) { + let convertDateToUTC = function(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }; @@ -1797,9 +1925,9 @@ define([ * @param date * @returns {string} */ - var convertDateToString = function(date){ - var dateString = ('0'+ (date.getMonth() + 1 )).slice(-2) + '/' + ('0'+date.getDate()).slice(-2) + '/' + date.getFullYear(); - var timeString = ('0' + date.getHours()).slice(-2) + ':' + ('0'+date.getMinutes()).slice(-2); + let convertDateToString = function(date){ + let dateString = ('0'+ (date.getMonth() + 1 )).slice(-2) + '/' + ('0'+date.getDate()).slice(-2) + '/' + date.getFullYear(); + let timeString = ('0' + date.getHours()).slice(-2) + ':' + ('0'+date.getMinutes()).slice(-2); return dateString + ' ' + timeString; }; @@ -1808,11 +1936,11 @@ define([ * -> www.pathfinder.com/pathfinder/ -> /pathfinder * @returns {string|string} */ - var getDocumentPath = function(){ - var pathname = window.location.pathname; + let getDocumentPath = function(){ + let pathname = window.location.pathname; // replace file endings - var r = /[^\/]*$/; - var path = pathname.replace(r, ''); + let r = /[^\/]*$/; + let path = pathname.replace(r, ''); return path || '/'; }; @@ -1821,8 +1949,8 @@ define([ * @param url * @param params */ - var redirect = function(url, params){ - var currentUrl = document.URL; + let redirect = function(url, params){ + let currentUrl = document.URL; if(url !== currentUrl){ if( @@ -1839,8 +1967,8 @@ define([ * send logout request * @param params */ - var logout = function(params){ - var data = {}; + let logout = function(params){ + let data = {}; if( params && params.ajaxData @@ -1858,7 +1986,7 @@ define([ redirect(data.reroute, ['logout']); } }).fail(function( jqXHR, status, error) { - var reason = status + ' ' + error; + let reason = status + ' ' + error; showNotify({title: jqXHR.status + ': logout', text: reason, type: 'error'}); }); }; @@ -1880,6 +2008,8 @@ define([ stopTabBlink: stopTabBlink, getLogInfo: getLogInfo, ajaxSetup: ajaxSetup, + setSyncStatus: setSyncStatus, + getSyncType: getSyncType, isXHRAborted: isXHRAborted, getMapModule: getMapModule, getSystemEffectData: getSystemEffectData, @@ -1898,6 +2028,8 @@ define([ setCurrentMapData: setCurrentMapData, getCurrentMapData: getCurrentMapData, getCurrentMapDataIndex: getCurrentMapDataIndex, + updateCurrentMapData: updateCurrentMapData, + deleteCurrentMapData: deleteCurrentMapData, setCurrentUserData: setCurrentUserData, getCurrentUserData: getCurrentUserData, setCurrentSystemData: setCurrentSystemData, diff --git a/public/js/v1.2.0/app/worker/map.js b/public/js/v1.2.0/app/worker/map.js new file mode 100644 index 00000000..bd524ff7 --- /dev/null +++ b/public/js/v1.2.0/app/worker/map.js @@ -0,0 +1,162 @@ +'use strict'; + +// "fake" window object will contain "MsgWorker" after import +let window = {}; // jshint ignore:line + +// import "MsgWorker" class +self.importScripts( self.name ); // jshint ignore:line + +let MsgWorker = window.MsgWorker; +let socket = null; +let ports = []; +let characterPorts = []; + +// init "WebSocket" connection ======================================================================================== +let initSocket = (uri) => { + let MsgWorkerOpen = new MsgWorker('ws:open'); + + if(socket === null){ + socket = new WebSocket(uri); + + // "WebSocket" open ----------------------------------------------------------------------- + socket.onopen = (e) => { + MsgWorkerOpen.meta({ + readyState: socket.readyState + }); + + sendToCurrentPort(MsgWorkerOpen); + }; + + // "WebSocket message --------------------------------------------------------------------- + socket.onmessage = (e) => { + let response = JSON.parse(e.data); + + let MsgWorkerSend = new MsgWorker('ws:send'); + MsgWorkerSend.task( response.task ); + MsgWorkerSend.meta({ + readyState: this.readyState, + characterIds: response.characterIds + }); + MsgWorkerSend.data( response.load ); + + broadcastPorts(MsgWorkerSend); + }; + + // "WebSocket" close ---------------------------------------------------------------------- + socket.onclose = (closeEvent) => { + let MsgWorkerClosed = new MsgWorker('ws:closed'); + MsgWorkerClosed.meta({ + readyState: socket.readyState, + code: closeEvent.code, + reason: closeEvent.reason, + wasClean: closeEvent.wasClean + }); + + broadcastPorts(MsgWorkerClosed); + socket = null; // reset WebSocket + }; + + // "WebSocket" error ---------------------------------------------------------------------- + socket.onerror = (e) => { + let MsgWorkerError = new MsgWorker('ws:error'); + MsgWorkerError.meta({ + readyState: socket.readyState + }); + + sendToCurrentPort(MsgWorkerError); + }; + }else{ + // socket still open + MsgWorkerOpen.meta({ + readyState: socket.readyState + }); + sendToCurrentPort(MsgWorkerOpen); + } +}; + +// send message to port(s) ============================================================================================ +let sendToCurrentPort = (load) => { + ports[ports.length - 1].postMessage(load); +}; + +let broadcastPorts = (load) => { + // default: sent to all ports + let sentToPorts = ports; + + // check if send() is limited to some ports + let meta = load.meta(); + if( + meta && + meta.characterIds && + meta.characterIds !== 'undefined' && + meta.characterIds instanceof Array + ){ + // ... get ports for characterIds + sentToPorts = getPortsByCharacterIds(meta.characterIds); + } + + for (let i = 0; i < sentToPorts.length; i++) { + sentToPorts[i].postMessage(load); + } +}; + +// port functions ===================================================================================================== +let addPort = (port, characterId) => { + characterId = parseInt(characterId); + + if(characterId > 0){ + characterPorts.push({ + characterId: characterId, + port: port + }); + }else{ + ports.push(port); + } +}; + +let getPortsByCharacterIds = (characterIds) => { + let ports = []; + + for(let i = 0; i < characterPorts.length; i++){ + for(let j = 0; j < characterIds.length; j++){ + if(characterPorts[i].characterId === characterIds[j]){ + ports.push(characterPorts[i].port); + } + } + } + + return ports; +}; + +// "SharedWorker" connection ========================================================================================== +self.addEventListener('connect', (event) => { // jshint ignore:line + let port = event.ports[0]; + addPort(port); + + port.addEventListener('message', (e) => { + let MsgWorkerMessage = e.data; + Object.setPrototypeOf(MsgWorkerMessage, MsgWorker.prototype); + + switch(MsgWorkerMessage.command){ + case 'ws:init': + let data = MsgWorkerMessage.data(); + // add character specific port (for broadcast) to individual ports (tabs) + addPort(port, data.characterId); + initSocket(data.uri); + break; + case 'ws:send': + let MsgSocket = { + task: MsgWorkerMessage.task(), + load: MsgWorkerMessage.data() + }; + + socket.send(JSON.stringify(MsgSocket)); + break; + case 'ws:close': + // closeSocket(); + break; + } + }, false); + + port.start(); +}, false); \ No newline at end of file diff --git a/public/js/v1.2.0/app/worker/message.js b/public/js/v1.2.0/app/worker/message.js new file mode 100644 index 00000000..492eecc1 --- /dev/null +++ b/public/js/v1.2.0/app/worker/message.js @@ -0,0 +1,55 @@ +window.MsgWorker = class MessageWorker { + + constructor(cmd){ + /** + * "command" type (identifies this message) + */ + this.cmd = cmd; + + /** + * "task" what should be done with this message + * @type {string} + */ + this.msgTask = ''; + + /** + * "message" meta data (e.g. error/close data from WebSocket + * @type {null} + */ + this.msgMeta = null; + + /** + * "message" body (load) + * @type {null} + */ + this.msgBody = null; + } + + get command(){ + return this.cmd; + } + + task(task) { + if(task){ + this.msgTask = task; + } + + return this.msgTask; + } + + meta(metaData) { + if(metaData){ + this.msgMeta = metaData; + } + + return this.msgMeta; + } + + data(data) { + if(data){ + this.msgBody = data; + } + + return this.msgBody; + } +}; \ No newline at end of file diff --git a/public/js/v1.2.0/lib/velocity.min.js b/public/js/v1.2.0/lib/velocity.min.js index 10036035..1521826c 100644 --- a/public/js/v1.2.0/lib/velocity.min.js +++ b/public/js/v1.2.0/lib/velocity.min.js @@ -1,4 +1,4 @@ -/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */ +/*! VelocityJS.org (1.4.1). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */ /*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */ -!function(a){function b(a){var b=a.length,d=c.type(a);return"function"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[i]||{},i++),"object"!=typeof h&&"function"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,"string"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||"fx")+"queue";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||"fx";var e=c.queue(d,b),f=e.shift();"inprogress"===f&&(f=e.shift()),f&&("fx"===b&&e.unshift("inprogress"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error("Not a DOM node.")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&"html"===!a.nodeType.toLowerCase&&"static"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando="velocity"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h="Boolean Number String Function Array Date RegExp Object Error".split(" "),i=0;ie;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&"none"!==j.display){if("flex"===j.display){var A=["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex"];m.each(A,function(a,b){v.setPropertyValue(y,"display",b)})}v.setPropertyValue(y,"display",j.display)}j.visibility!==d&&"hidden"!==j.visibility&&v.setPropertyValue(y,"visibility",j.visibility);for(var B in w)if("element"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,"tween"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?"":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G]("extract",null,I[1]):I[1]),"transform"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d="(0px, 0px, 0px)",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&"none"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&"hidden"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||("none"===f.display&&v.setPropertyValue(l,"display",f.display),"hidden"===f.visibility&&v.setPropertyValue(l,"visibility",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp("^\\("+c+"[^.]").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,"velocity-animating")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&"%"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,"reverse",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement("div");if(b.innerHTML="",b.getElementsByTagName("span").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return"object"==typeof a&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||"object"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s="swing",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,"velocity",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft="pageXOffset",t.State.scrollPropertyTop="pageYOffset"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft="scrollLeft",t.State.scrollPropertyTop="scrollTop");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"]},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a=n)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":return c;case"inject":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;ae&&(e=1),f=!/(\d)$/i.test(e);break;case"skew":f=!/(deg|\d)$/i.test(e);break;case"rotate":f=!/(deg|\d)$/i.test(e)}return f||(g(c).transformCache[b]="("+e+")"),g(c).transformCache[b]}}}();for(var a=0;a=n||3!==f.split(" ").length||(f+=" 1"),f;case"inject":return 8>=n?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(8>=n?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?"deg":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?"":"px"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?"inline":/^(li)$/i.test(b)?"list-item":/^(tr)$/i.test(b)?"table-row":/^(table)$/i.test(b)?"table":/^(tbody)$/i.test(b)?"table-row-group":"block"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?" ":"")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp("(^|\\s)"+b.split(" ").join("|")+"(\\s|$)","gi")," ")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,"display","none")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,"display")&&(j=!0,v.setPropertyValue(a,"display",v.Values.getDisplayType(a))),!f){if("height"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,"borderTopWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderBottomWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingTop"))||0)-(parseFloat(v.getPropertyValue(a,"paddingBottom"))||0);return e(),k}if("width"===c&&"border-box"!==v.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,"borderLeftWidth"))||0)-(parseFloat(v.getPropertyValue(a,"borderRightWidth"))||0)-(parseFloat(v.getPropertyValue(a,"paddingLeft"))||0)-(parseFloat(v.getPropertyValue(a,"paddingRight"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),"borderColor"===c&&(c="borderTopColor"),i=9===n&&"filter"===c?o.getPropertyValue(c):o[c],(""===i||null===i)&&(i=a.style[c]),e()}if("auto"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,"position");("fixed"===p||"absolute"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+"px")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k]("extract",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c]("name",a),"transform"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c]("extract",a,o)}if(!/^[\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&"transform"===v.Normalizations.registered[c]("name",a))v.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c]("inject",a,d),c=v.Normalizations.registered[c]("name",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c="";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b("translateX"),b("translateY")],skewX:[b("skewX")],skewY:[b("skewY")],scale:1!==b("scale")?[b("scale"),b("scale")]:[b("scaleX"),b("scaleY")],rotate:[b("rotateZ"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),d[a]&&(c+=a+"("+d[a].join(" ")+") ",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],"transformPerspective"===b?(f=e,!0):(9===n&&"rotateZ"===b&&(b="rotate"),void(c+=b+e+" "))}),f&&(c="perspective"+f+" "+c)}v.setPropertyValue(a,"transform",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);"transform"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(){function a(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function l(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=v.Values.getUnitType(a)),[d,c]}function n(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,"position"),fontSize:v.getPropertyValue(f,"fontSize")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");t.init(j),a.myParent.appendChild(j),m.each(["overflow","overflowX","overflowY"],function(a,b){t.CSS.setPropertyValue(j,b,"hidden")}),t.CSS.setPropertyValue(j,"position",a.position),t.CSS.setPropertyValue(j,"fontSize",a.fontSize),t.CSS.setPropertyValue(j,"boxSizing","content-box"),m.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){t.CSS.setPropertyValue(j,b,h+"%")}),t.CSS.setPropertyValue(j,"paddingLeft",h+"em"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,"width",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,"height",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,"paddingLeft"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,"fontSize"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log("Unit ratios: "+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(r){setTimeout(function(){throw r},1)}if("scroll"===C){var u,w,z,A=/^x$/i.test(h.axis)?"Left":"Top",D=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,u=h.container["scroll"+A],z=u+m(f).position()[A.toLowerCase()]+D):h.container=null:(u=t.State.scrollAnchor[t.State["scrollProperty"+A]],w=t.State.scrollAnchor[t.State["scrollProperty"+("Left"===A?"Top":"Left")]],z=m(f).offset()[A.toLowerCase()]+D),i={scroll:{rootPropertyValue:!1,startValue:u,currentValue:u,endValue:z,unitType:"",easing:h.easing,scrollData:{container:h.container,direction:A,alternateValue:w}},element:f},t.debug&&console.log("tweensContainer (scroll): ",i.scroll,f)}else if("reverse"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);"none"===g(f).opts.display&&(g(f).opts.display="auto"),"hidden"===g(f).opts.visibility&&(g(f).opts.visibility="visible"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var E=m.extend(!0,{},g(f).tweensContainer);for(var F in E)if("element"!==F){var G=E[F].startValue;E[F].startValue=E[F].currentValue=E[F].endValue,E[F].endValue=G,p.isEmptyObject(s)||(E[F].easing=h.easing),t.debug&&console.log("reverse tweensContainer ("+F+"): "+JSON.stringify(E[F]),f)}i=E}else if("start"===C){var E;g(f).tweensContainer&&g(f).isAnimating===!0&&(E=g(f).tweensContainer),m.each(q,function(b,c){if(RegExp("^"+v.Lists.colors.join("$|^")+"$").test(b)){var e=a(c,!0),f=e[0],g=e[1],h=e[2];if(v.RegEx.isHex.test(f)){for(var i=["Red","Green","Blue"],j=v.Values.hexToRgb(f),k=h?v.Values.hexToRgb(h):d,l=0;lL;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,"reverse",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener("visibilitychange",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each(["Down","Up"],function(a,b){t.Redirects["slide"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:"",marginTop:"",marginBottom:"",paddingTop:"",paddingBottom:""},n={};i.display===d&&(i.display="Down"===b?"inline"===t.CSS.Values.getDisplayType(a)?"inline-block":"block":"none"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]="Down"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow="hidden"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each(["In","Out"],function(a,b){t.Redirects["fade"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:"In"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display="In"===b?"auto":"none"),t(this,j,i)}}),t}(window.jQuery||window.Zepto||window,window,document)}); +!function(a){"use strict";function b(a){var b=a.length,d=c.type(a);return"function"!==d&&!c.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a))}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return a&&a===a.window},c.type=function(a){return a?"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a:a+""},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;f0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0===i?h:m(b,c,c+u)}function o(){y=!0,a===c&&d===e||l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;w<4;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function l(a,b){var c=a;return s.isString(a)?w.Easings[a]||(c=!1):c=s.isArray(a)&&1===a.length?j.apply(null,a):s.isArray(a)&&2===a.length?x.apply(null,a.concat([b])):!(!s.isArray(a)||4!==a.length)&&k.apply(null,a),c===!1&&(c=w.Easings[w.defaults.easing]?w.defaults.easing:v),c}function m(a){if(a){var b=w.timestamp&&a!==!0?a:r.now(),c=w.State.calls.length;c>1e4&&(w.State.calls=e(w.State.calls),c=w.State.calls.length);for(var f=0;f4;a--){var b=c.createElement("div");if(b.innerHTML="",b.getElementsByTagName("span").length)return b=null,a}return d}(),q=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),r=function(){var a=b.performance||{};if(!a.hasOwnProperty("now")){var c=a.timing&&a.timing.domComplete?a.timing.domComplete:(new Date).getTime();a.now=function(){return(new Date).getTime()-c}}return a}(),s={isNumber:function(a){return"number"==typeof a},isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isWrapped:function(a){return a&&s.isNumber(a.length)&&!s.isString(a)&&!s.isFunction(a)&&!s.isNode(a)&&(0===a.length||s.isNode(a[0]))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}},t=!1;if(a.fn&&a.fn.jquery?(o=a,t=!0):o=b.Velocity.Utilities,p<=8&&!t)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(p<=7)return void(jQuery.fn.velocity=jQuery.fn.animate);var u=400,v="swing",w={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[],delayedElements:{count:0}},CSS:{},Utilities:o,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:u,easing:v,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0,promiseRejectEmpty:!0},init:function(a){o.data(a,"velocity",{isSVG:s.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:4,patch:1},debug:!1,timestamp:!0,pauseAll:function(a){var b=(new Date).getTime();o.each(w.State.calls,function(b,c){if(c){if(a!==d&&(c[2].queue!==a||c[2].queue===!1))return!0;c[5]={resume:!1}}}),o.each(w.State.delayedElements,function(a,c){c&&h(c,b)})},resumeAll:function(a){var b=(new Date).getTime();o.each(w.State.calls,function(b,c){if(c){if(a!==d&&(c[2].queue!==a||c[2].queue===!1))return!0;c[5]&&(c[5].resume=!0)}}),o.each(w.State.delayedElements,function(a,c){c&&i(c,b)})}};b.pageYOffset!==d?(w.State.scrollAnchor=b,w.State.scrollPropertyLeft="pageXOffset",w.State.scrollPropertyTop="pageYOffset"):(w.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,w.State.scrollPropertyLeft="scrollLeft",w.State.scrollPropertyTop="scrollTop");var x=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();w.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},o.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){w.Easings[b[0]]=k.apply(null,b[1])});var y=w.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a=0?c:""},fixColors:function(a){return a.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g,function(a,b,c){return y.Lists.colorNames.hasOwnProperty(c)?(b?b:"rgba(")+y.Lists.colorNames[c]+(b?"":",1)"):b+c})},cleanRootPropertyValue:function(a,b){return y.RegEx.valueUnwrap.test(b)&&(b=b.match(y.RegEx.valueUnwrap)[1]),y.Values.isCSSNullValue(b)&&(b=y.Hooks.templates[a][1]),b},extractValue:function(a,b){var c=y.Hooks.registered[a];if(c){var d=c[0],e=c[1];return b=y.Hooks.cleanRootPropertyValue(d,b),b.toString().match(y.RegEx.valueSplit)[e]}return b},injectValue:function(a,b,c){var d=y.Hooks.registered[a];if(d){var e,f,g=d[0],h=d[1];return c=y.Hooks.cleanRootPropertyValue(g,c),e=c.toString().match(y.RegEx.valueSplit),e[h]=b,f=e.join(" ")}return c}},Normalizations:{registered:{clip:function(a,b,c){switch(a){case"name":return"clip";case"extract":var d;return y.RegEx.wrappedValueAlreadyExtracted.test(c)?d=c:(d=c.toString().match(y.RegEx.valueUnwrap),d=d?d[1].replace(/,(\s+)?/g," "):c),d;case"inject":return"rect("+c+")"}},blur:function(a,b,c){switch(a){case"name":return w.State.isFirefox?"filter":"-webkit-filter";case"extract":var d=parseFloat(c);if(!d&&0!==d){var e=c.toString().match(/blur\(([0-9]+[A-z]+)\)/i);d=e?e[1]:0}return d;case"inject":return parseFloat(c)?"blur("+c+")":"none"}},opacity:function(a,b,c){if(p<=8)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":return c;case"inject":return c}}},register:function(){function a(a,b,c){var d="border-box"===y.getPropertyValue(b,"boxSizing").toString().toLowerCase();if(d===(c||!1)){var e,f,g=0,h="width"===a?["Left","Right"]:["Top","Bottom"],i=["padding"+h[0],"padding"+h[1],"border"+h[0]+"Width","border"+h[1]+"Width"];for(e=0;e9)||w.State.isGingerbread||(y.Lists.transformsBase=y.Lists.transformsBase.concat(y.Lists.transforms3D));for(var c=0;c8)&&3===f.split(" ").length&&(f+=" 1"),f;case"inject":return/^rgb/.test(e)?e:(p<=8?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(p<=8?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}}();y.Normalizations.registered.innerWidth=b("width",!0),y.Normalizations.registered.innerHeight=b("height",!0),y.Normalizations.registered.outerWidth=b("width"),y.Normalizations.registered.outerHeight=b("height")}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(p||w.State.isAndroid&&!w.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(w.State.prefixMatches[a])return[w.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;c=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(y.Normalizations.registered[c]&&"transform"===y.Normalizations.registered[c]("name",a))y.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(y.Hooks.registered[c]){var i=c,j=y.Hooks.getRoot(c);e=e||y.getPropertyValue(a,j),d=y.Hooks.injectValue(i,d,e),c=j}if(y.Normalizations.registered[c]&&(d=y.Normalizations.registered[c]("inject",a,d),c=y.Normalizations.registered[c]("name",a)),h=y.Names.prefixCheck(c)[0],p<=8)try{a.style[h]=d}catch(k){w.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else{var l=g(a);l&&l.isSVG&&y.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d}w.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){var b="",c=g(a);if((p||w.State.isAndroid&&!w.State.isChrome)&&c&&c.isSVG){var d=function(b){return parseFloat(y.getPropertyValue(a,b))},e={translate:[d("translateX"),d("translateY")],skewX:[d("skewX")],skewY:[d("skewY")],scale:1!==d("scale")?[d("scale"),d("scale")]:[d("scaleX"),d("scaleY")],rotate:[d("rotateZ"),0,0]};o.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),e[a]&&(b+=a+"("+e[a].join(" ")+") ",delete e[a])})}else{var f,h;o.each(g(a).transformCache,function(c){return f=g(a).transformCache[c],"transformPerspective"===c?(h=f,!0):(9===p&&"rotateZ"===c&&(c="rotate"),void(b+=c+f+" "))}),h&&(b="perspective"+h+" "+b)}y.setPropertyValue(a,"transform",b)}};y.Hooks.register(),y.Normalizations.register(),w.hook=function(a,b,c){var e;return a=f(a),o.each(a,function(a,f){if(g(f)===d&&w.init(f),c===d)e===d&&(e=y.getPropertyValue(f,b));else{var h=y.setPropertyValue(f,b,c);"transform"===h[0]&&w.CSS.flushTransformCache(f),e=h}}),e};var z=function(){function a(){return k?A.promise||null:p}function e(a,e){function f(f){var k,n;if(i.begin&&0===C)try{i.begin.call(r,r)}catch(p){setTimeout(function(){throw p},1)}if("scroll"===F){var q,u,x,z=/^x$/i.test(i.axis)?"Left":"Top",D=parseFloat(i.offset)||0;i.container?s.isWrapped(i.container)||s.isNode(i.container)?(i.container=i.container[0]||i.container,q=i.container["scroll"+z],x=q+o(a).position()[z.toLowerCase()]+D):i.container=null:(q=w.State.scrollAnchor[w.State["scrollProperty"+z]],u=w.State.scrollAnchor[w.State["scrollProperty"+("Left"===z?"Top":"Left")]],x=o(a).offset()[z.toLowerCase()]+D),j={scroll:{rootPropertyValue:!1,startValue:q,currentValue:q,endValue:x,unitType:"",easing:i.easing,scrollData:{container:i.container,direction:z,alternateValue:u}},element:a},w.debug&&console.log("tweensContainer (scroll): ",j.scroll,a)}else if("reverse"===F){if(k=g(a),!k)return;if(!k.tweensContainer)return void o.dequeue(a,i.queue);"none"===k.opts.display&&(k.opts.display="auto"),"hidden"===k.opts.visibility&&(k.opts.visibility="visible"),k.opts.loop=!1,k.opts.begin=null,k.opts.complete=null,v.easing||delete i.easing,v.duration||delete i.duration,i=o.extend({},k.opts,i),n=o.extend(!0,{},k?k.tweensContainer:null);for(var E in n)if(n.hasOwnProperty(E)&&"element"!==E){var G=n[E].startValue;n[E].startValue=n[E].currentValue=n[E].endValue,n[E].endValue=G,s.isEmptyObject(v)||(n[E].easing=i.easing),w.debug&&console.log("reverse tweensContainer ("+E+"): "+JSON.stringify(n[E]),a)}j=n}else if("start"===F){k=g(a),k&&k.tweensContainer&&k.isAnimating===!0&&(n=k.tweensContainer);var H=function(b,c){var d,f,g;return s.isFunction(b)&&(b=b.call(a,e,B)),s.isArray(b)?(d=b[0],!s.isArray(b[1])&&/^[\d-]/.test(b[1])||s.isFunction(b[1])||y.RegEx.isHex.test(b[1])?g=b[1]:s.isString(b[1])&&!y.RegEx.isHex.test(b[1])&&w.Easings[b[1]]||s.isArray(b[1])?(f=c?b[1]:l(b[1],i.duration),g=b[2]):g=b[1]||b[2]):d=b,c||(f=f||i.easing),s.isFunction(d)&&(d=d.call(a,e,B)),s.isFunction(g)&&(g=g.call(a,e,B)),[d||0,f,g]},I=function(e,f){var g,l=y.Hooks.getRoot(e),m=!1,p=f[0],q=f[1],r=f[2];if(!(k&&k.isSVG||"tween"===l||y.Names.prefixCheck(l)[1]!==!1||y.Normalizations.registered[l]!==d))return void(w.debug&&console.log("Skipping ["+l+"] due to a lack of browser support.")); + (i.display!==d&&null!==i.display&&"none"!==i.display||i.visibility!==d&&"hidden"!==i.visibility)&&/opacity|filter/.test(e)&&!r&&0!==p&&(r=0),i._cacheValues&&n&&n[e]?(r===d&&(r=n[e].endValue+n[e].unitType),m=k.rootPropertyValueCache[l]):y.Hooks.registered[e]?r===d?(m=y.getPropertyValue(a,l),r=y.getPropertyValue(a,e,m)):m=y.Hooks.templates[l][1]:r===d&&(r=y.getPropertyValue(a,e));var t,u,v,x=!1,z=function(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=y.Values.getUnitType(a)),[d,c]};if(r!==p&&s.isString(r)&&s.isString(p)){g="";var A=0,B=0,C=[],D=[],E=0,F=0,G=0;for(r=y.Hooks.fixColors(r),p=y.Hooks.fixColors(p);A=4&&"("===H?E++:(E&&E<5||E>=4&&")"===H&&--E<5)&&(E=0),0===F&&"r"===H||1===F&&"g"===H||2===F&&"b"===H||3===F&&"a"===H||F>=3&&"("===H?(3===F&&"a"===H&&(G=1),F++):G&&","===H?++G>3&&(F=G=0):(G&&F<(G?5:4)||F>=(G?4:3)&&")"===H&&--F<(G?5:4))&&(F=G=0)}}A===r.length&&B===p.length||(w.debug&&console.error('Trying to pattern match mis-matched strings ["'+p+'", "'+r+'"]'),g=d),g&&(C.length?(w.debug&&console.log('Pattern found "'+g+'" -> ',C,D,"["+r+","+p+"]"),r=C,p=D,u=v=""):g=d)}g||(t=z(e,r),r=t[0],v=t[1],t=z(e,p),p=t[0].replace(/^([+-\/*])=/,function(a,b){return x=b,""}),u=t[1],r=parseFloat(r)||0,p=parseFloat(p)||0,"%"===u&&(/^(fontSize|lineHeight)$/.test(e)?(p/=100,u="em"):/^scale/.test(e)?(p/=100,u=""):/(Red|Green|Blue)$/i.test(e)&&(p=p/100*255,u="")));var S=function(){var d={myParent:a.parentNode||c.body,position:y.getPropertyValue(a,"position"),fontSize:y.getPropertyValue(a,"fontSize")},e=d.position===L.lastPosition&&d.myParent===L.lastParent,f=d.fontSize===L.lastFontSize;L.lastParent=d.myParent,L.lastPosition=d.position,L.lastFontSize=d.fontSize;var g=100,h={};if(f&&e)h.emToPx=L.lastEmToPx,h.percentToPxWidth=L.lastPercentToPxWidth,h.percentToPxHeight=L.lastPercentToPxHeight;else{var i=k&&k.isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");w.init(i),d.myParent.appendChild(i),o.each(["overflow","overflowX","overflowY"],function(a,b){w.CSS.setPropertyValue(i,b,"hidden")}),w.CSS.setPropertyValue(i,"position",d.position),w.CSS.setPropertyValue(i,"fontSize",d.fontSize),w.CSS.setPropertyValue(i,"boxSizing","content-box"),o.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){w.CSS.setPropertyValue(i,b,g+"%")}),w.CSS.setPropertyValue(i,"paddingLeft",g+"em"),h.percentToPxWidth=L.lastPercentToPxWidth=(parseFloat(y.getPropertyValue(i,"width",null,!0))||1)/g,h.percentToPxHeight=L.lastPercentToPxHeight=(parseFloat(y.getPropertyValue(i,"height",null,!0))||1)/g,h.emToPx=L.lastEmToPx=(parseFloat(y.getPropertyValue(i,"paddingLeft"))||1)/g,d.myParent.removeChild(i)}return null===L.remToPx&&(L.remToPx=parseFloat(y.getPropertyValue(c.body,"fontSize"))||16),null===L.vwToPx&&(L.vwToPx=parseFloat(b.innerWidth)/100,L.vhToPx=parseFloat(b.innerHeight)/100),h.remToPx=L.remToPx,h.vwToPx=L.vwToPx,h.vhToPx=L.vhToPx,w.debug>=1&&console.log("Unit ratios: "+JSON.stringify(h),a),h};if(/[\/*]/.test(x))u=v;else if(v!==u&&0!==r)if(0===p)u=v;else{h=h||S();var T=/margin|padding|left|right|width|text|word|letter/i.test(e)||/X$/.test(e)||"x"===e?"x":"y";switch(v){case"%":r*="x"===T?h.percentToPxWidth:h.percentToPxHeight;break;case"px":break;default:r*=h[v+"ToPx"]}switch(u){case"%":r*=1/("x"===T?h.percentToPxWidth:h.percentToPxHeight);break;case"px":break;default:r*=1/h[u+"ToPx"]}}switch(x){case"+":p=r+p;break;case"-":p=r-p;break;case"*":p=r*p;break;case"/":p=r/p}j[e]={rootPropertyValue:m,startValue:r,currentValue:r,endValue:p,unitType:u,easing:q},g&&(j[e].pattern=g),w.debug&&console.log("tweensContainer ("+e+"): "+JSON.stringify(j[e]),a)};for(var J in t)if(t.hasOwnProperty(J)){var K=y.Names.camelCase(J),N=H(t[J]);if(y.Lists.colors.indexOf(K)>=0){var O=N[0],P=N[1],Q=N[2];if(y.RegEx.isHex.test(O)){for(var R=["Red","Green","Blue"],S=y.Values.hexToRgb(O),T=Q?y.Values.hexToRgb(Q):d,U=0;UparseFloat(e[1])):!1}if(!t.Velocity||!t.Velocity.Utilities)return void(a.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting."));var i=t.Velocity,$=i.Utilities,s=i.version,o={major:1,minor:1,patch:0};if(n(o,s)){var l="Velocity UI Pack: You need to update Velocity (jquery.velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(l),new Error(l)}i.RegisterEffect=i.RegisterUI=function(t,a){function e(t,a,e,r){var n=0,s;$.each(t.nodeType?[t]:t,function(t,a){r&&(e+=t*r),s=a.parentNode,$.each(["height","paddingTop","paddingBottom","marginTop","marginBottom"],function(t,e){n+=parseFloat(i.CSS.getPropertyValue(a,e))})}),i.animate(s,{height:("In"===a?"+":"-")+"="+n},{queue:!1,easing:"ease-in-out",duration:e*("In"===a?.6:1)})}return i.Redirects[t]=function(n,s,o,l,c,u){function f(){s.display!==r&&"none"!==s.display||!/Out$/.test(t)||$.each(c.nodeType?[c]:c,function(t,a){i.CSS.setPropertyValue(a,"display","none")}),s.complete&&s.complete.call(c,c),u&&u.resolver(c||n)}var p=o===l-1;a.defaultDuration="function"==typeof a.defaultDuration?a.defaultDuration.call(c,c):parseFloat(a.defaultDuration);for(var d=0;d1&&($.each(a.reverse(),function(t,e){var r=a[t+1];if(r){var n=e.o||e.options,s=r.o||r.options,o=n&&n.sequenceQueue===!1?"begin":"complete",l=s&&s[o],c={};c[o]=function(){var t=r.e||r.elements,a=t.nodeType?[t]:t;l&&l.call(a,a),i(e)},r.o?r.o=$.extend({},s,c):r.options=$.extend({},s,c)}}),a.reverse()),i(a[0])}}(window.jQuery||window.Zepto||window,window,document)}); \ No newline at end of file +!function(a){"use strict";"function"==typeof require&&"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(["velocity"],a):a()}(function(){"use strict";return function(a,b,c,d){function e(a,b){var c=[];return!(!a||!b)&&(g.each([a,b],function(a,b){var d=[];g.each(b,function(a,b){for(;b.toString().length<5;)b="0"+b;d.push(b)}),c.push(d.join(""))}),parseFloat(c[0])>parseFloat(c[1]))}var f=a.Velocity;if(!f||!f.Utilities)return void(b.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting."));var g=f.Utilities,h=f.version,i={major:1,minor:1,patch:0};if(e(i,h)){var j="Velocity UI Pack: You need to update Velocity (velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(j),new Error(j)}f.RegisterEffect=f.RegisterUI=function(a,b){function c(a,b,c,d){var e,h=0;g.each(a.nodeType?[a]:a,function(a,b){d&&(c+=a*d),e=b.parentNode;var i=["height","paddingTop","paddingBottom","marginTop","marginBottom"];"border-box"===f.CSS.getPropertyValue(b,"boxSizing").toString().toLowerCase()&&(i=["height"]),g.each(i,function(a,c){h+=parseFloat(f.CSS.getPropertyValue(b,c))})}),f.animate(e,{height:("In"===b?"+":"-")+"="+h},{queue:!1,easing:"ease-in-out",duration:c*("In"===b?.6:1)})}return f.Redirects[a]=function(e,h,i,j,k,l,m){var n=i===j-1,o=0;m=m||b.loop,"function"==typeof b.defaultDuration?b.defaultDuration=b.defaultDuration.call(k,k):b.defaultDuration=parseFloat(b.defaultDuration);for(var p=0;p=1?0:b.calls.length?(1-o)/b.calls.length:1;for(p=0;p1&&(g.each(b.reverse(),function(a,c){var d=b[a+1];if(d){var e=c.o||c.options,h=d.o||d.options,i=e&&e.sequenceQueue===!1?"begin":"complete",j=h&&h[i],k={};k[i]=function(){var a=d.e||d.elements,b=a.nodeType?[a]:a;j&&j.call(b,b),f(c)},d.o?d.o=g.extend({},h,k):d.options=g.extend({},h,k)}}),b.reverse()),f(b[0])}}(window.jQuery||window.Zepto||window,window,window?window.document:void 0)}); \ No newline at end of file