From a80c1e4e9795f1757638dfb8c4da5674c05cc5e3 Mon Sep 17 00:00:00 2001 From: Moe Date: Sat, 4 Aug 2018 12:48:05 -0700 Subject: [PATCH] Tickly Tiger --- camera.js | 2477 +++-- cron.js | 79 +- definitions/en_CA.json | 2 +- languages/en_CA.json | 57 +- package.json | 21 +- web/libs/css/bootstrap4.min.css | 8468 +++++++++++++++++ web/libs/css/main.dash2.css | 26 +- web/libs/css/now-ui-kit.css | 7545 +++++++++++++++ web/libs/fonts/nucleo-outline.eot | Bin 0 -> 30528 bytes web/libs/fonts/nucleo-outline.ttf | Bin 0 -> 30352 bytes web/libs/fonts/nucleo-outline.woff | Bin 0 -> 18056 bytes web/libs/fonts/nucleo-outline.woff2 | Bin 0 -> 15364 bytes web/libs/js/bootstrap4.min.js | 1586 +++ web/libs/js/jquery-1.10.2.min.map | 1 + web/libs/js/main.dash2.js | 596 +- web/libs/js/now-ui-kit.js | 220 + web/libs/js/popper.min.js | 834 ++ web/libs/sass/now-ui-kit.scss | 57 + web/libs/sass/now-ui-kit/_alerts.scss | 54 + web/libs/sass/now-ui-kit/_badges.scss | 39 + web/libs/sass/now-ui-kit/_buttons.scss | 158 + web/libs/sass/now-ui-kit/_cards.scss | 98 + web/libs/sass/now-ui-kit/_carousel.scss | 15 + .../sass/now-ui-kit/_checkboxes-radio.scss | 178 + web/libs/sass/now-ui-kit/_dropdown.scss | 106 + web/libs/sass/now-ui-kit/_example-pages.scss | 256 + web/libs/sass/now-ui-kit/_footers.scss | 44 + web/libs/sass/now-ui-kit/_images.scss | 7 + web/libs/sass/now-ui-kit/_inputs.scss | 264 + web/libs/sass/now-ui-kit/_misc.scss | 63 + web/libs/sass/now-ui-kit/_mixins.scss | 14 + web/libs/sass/now-ui-kit/_modals.scss | 173 + web/libs/sass/now-ui-kit/_navbar.scss | 193 + web/libs/sass/now-ui-kit/_nucleo-outline.scss | 533 ++ web/libs/sass/now-ui-kit/_pagination.scss | 136 + web/libs/sass/now-ui-kit/_pills.scss | 131 + web/libs/sass/now-ui-kit/_popups.scss | 85 + web/libs/sass/now-ui-kit/_progress.scss | 126 + web/libs/sass/now-ui-kit/_responsive.scss | 392 + web/libs/sass/now-ui-kit/_sections.scss | 396 + web/libs/sass/now-ui-kit/_social-buttons.scss | 39 + web/libs/sass/now-ui-kit/_tabs.scss | 110 + web/libs/sass/now-ui-kit/_typography.scss | 158 + web/libs/sass/now-ui-kit/_variables.scss | 254 + web/libs/sass/now-ui-kit/mixins/_badges.scss | 4 + web/libs/sass/now-ui-kit/mixins/_buttons.scss | 160 + .../sass/now-ui-kit/mixins/_datepicker.scss | 121 + .../sass/now-ui-kit/mixins/_dropdown.scss | 24 + web/libs/sass/now-ui-kit/mixins/_inputs.scss | 205 + web/libs/sass/now-ui-kit/mixins/_modals.scss | 12 + web/libs/sass/now-ui-kit/mixins/_navbar.scss | 226 + web/libs/sass/now-ui-kit/mixins/_pages.scss | 7 + .../sass/now-ui-kit/mixins/_popovers.scss | 29 + .../sass/now-ui-kit/mixins/_transparency.scss | 8 + .../now-ui-kit/mixins/_vendor-prefixes.scss | 160 + .../plugins/_plugin-bootstrap-switch.scss | 304 + .../plugins/_plugin-datepicker.scss | 520 + .../plugins/_plugin-nouislider.scss | 351 + web/libs/themes/Blazing Blue/style.css | 81 + web/pages/admin.ejs | 62 +- web/pages/blocks/confirm.ejs | 27 +- web/pages/blocks/header-favicon.ejs | 12 + web/pages/blocks/header-meta.ejs | 5 + web/pages/blocks/header.ejs | 41 +- web/pages/blocks/help.ejs | 2 +- web/pages/blocks/logs.ejs | 52 +- web/pages/blocks/mainpermissions.ejs | 63 +- web/pages/blocks/monitoredit.ejs | 153 +- web/pages/blocks/settings.ejs | 92 + web/pages/blocks/subpermissions.ejs | 49 +- web/pages/blocks/videoview.ejs | 8 +- web/pages/dashcam.ejs | 212 +- web/pages/embed.ejs | 9 +- web/pages/factor.ejs | 4 +- web/pages/home.ejs | 92 +- web/pages/index.ejs | 4 +- web/pages/streamer.ejs | 11 +- web/pages/super.ejs | 408 +- 78 files changed, 28107 insertions(+), 1402 deletions(-) create mode 100644 web/libs/css/bootstrap4.min.css create mode 100644 web/libs/css/now-ui-kit.css create mode 100644 web/libs/fonts/nucleo-outline.eot create mode 100644 web/libs/fonts/nucleo-outline.ttf create mode 100644 web/libs/fonts/nucleo-outline.woff create mode 100644 web/libs/fonts/nucleo-outline.woff2 create mode 100644 web/libs/js/bootstrap4.min.js create mode 100644 web/libs/js/jquery-1.10.2.min.map create mode 100644 web/libs/js/now-ui-kit.js create mode 100644 web/libs/js/popper.min.js create mode 100644 web/libs/sass/now-ui-kit.scss create mode 100644 web/libs/sass/now-ui-kit/_alerts.scss create mode 100644 web/libs/sass/now-ui-kit/_badges.scss create mode 100644 web/libs/sass/now-ui-kit/_buttons.scss create mode 100644 web/libs/sass/now-ui-kit/_cards.scss create mode 100644 web/libs/sass/now-ui-kit/_carousel.scss create mode 100644 web/libs/sass/now-ui-kit/_checkboxes-radio.scss create mode 100644 web/libs/sass/now-ui-kit/_dropdown.scss create mode 100644 web/libs/sass/now-ui-kit/_example-pages.scss create mode 100644 web/libs/sass/now-ui-kit/_footers.scss create mode 100644 web/libs/sass/now-ui-kit/_images.scss create mode 100644 web/libs/sass/now-ui-kit/_inputs.scss create mode 100644 web/libs/sass/now-ui-kit/_misc.scss create mode 100644 web/libs/sass/now-ui-kit/_mixins.scss create mode 100644 web/libs/sass/now-ui-kit/_modals.scss create mode 100644 web/libs/sass/now-ui-kit/_navbar.scss create mode 100644 web/libs/sass/now-ui-kit/_nucleo-outline.scss create mode 100644 web/libs/sass/now-ui-kit/_pagination.scss create mode 100644 web/libs/sass/now-ui-kit/_pills.scss create mode 100644 web/libs/sass/now-ui-kit/_popups.scss create mode 100644 web/libs/sass/now-ui-kit/_progress.scss create mode 100644 web/libs/sass/now-ui-kit/_responsive.scss create mode 100644 web/libs/sass/now-ui-kit/_sections.scss create mode 100644 web/libs/sass/now-ui-kit/_social-buttons.scss create mode 100644 web/libs/sass/now-ui-kit/_tabs.scss create mode 100644 web/libs/sass/now-ui-kit/_typography.scss create mode 100644 web/libs/sass/now-ui-kit/_variables.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_badges.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_buttons.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_datepicker.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_dropdown.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_inputs.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_modals.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_navbar.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_pages.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_popovers.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_transparency.scss create mode 100644 web/libs/sass/now-ui-kit/mixins/_vendor-prefixes.scss create mode 100644 web/libs/sass/now-ui-kit/plugins/_plugin-bootstrap-switch.scss create mode 100644 web/libs/sass/now-ui-kit/plugins/_plugin-datepicker.scss create mode 100644 web/libs/sass/now-ui-kit/plugins/_plugin-nouislider.scss create mode 100644 web/libs/themes/Blazing Blue/style.css create mode 100644 web/pages/blocks/header-favicon.ejs create mode 100644 web/pages/blocks/header-meta.ejs diff --git a/camera.js b/camera.js index fc3c331..51802f6 100644 --- a/camera.js +++ b/camera.js @@ -13,6 +13,9 @@ process.on('uncaughtException', function (err) { console.error('Uncaught Exception occured!'); console.error(err.stack); }); +process.on('SIGINT', function() { + process.exit(); +}); var staticFFmpeg = false; try{ staticFFmpeg = require('ffmpeg-static').path; @@ -24,7 +27,6 @@ try{ }catch(err){ staticFFmpeg = false; console.log('No Static FFmpeg. Continuing.') - //no static ffmpeg } var os = require('os'); var URL = require('url'); @@ -51,6 +53,7 @@ var jsonfile = require("jsonfile"); var connectionTester = require('connection-tester'); var events = require('events'); var onvif = require('node-onvif'); +var onvifHawk = require('onvif-nvt'); var knex = require('knex'); var Mp4Frag = require('mp4frag'); var P2P = require('pipe2pam'); @@ -88,75 +91,46 @@ try{ } process.send = process.send || function () {}; if(config.mail){ + if(config.mail.from === undefined){config.mail.from = '"ShinobiCCTV" '} var nodemailer = require('nodemailer').createTransport(config.mail); } //config defaults -if(config.cpuUsageMarker===undefined){config.cpuUsageMarker='%Cpu'} -if(config.customCpuCommand===undefined){config.customCpuCommand=null} -if(config.autoDropCache===undefined){config.autoDropCache=true} -if(config.doSnapshot===undefined){config.doSnapshot=true} -if(config.restart===undefined){config.restart={}} -if(config.systemLog===undefined){config.systemLog=true} -if(config.deleteCorruptFiles===undefined){config.deleteCorruptFiles=true} -if(config.restart.onVideoNotExist===undefined){config.restart.onVideoNotExist=true} -if(config.ip===undefined||config.ip===''||config.ip.indexOf('0.0.0.0')>-1){config.ip='localhost'}else{config.bindip=config.ip}; -if(config.cron===undefined)config.cron={}; -if(config.cron.enabled===undefined)config.cron.enabled=true; -if(config.cron.deleteOld===undefined)config.cron.deleteOld=true; -if(config.cron.deleteOrphans===undefined)config.cron.deleteOrphans=false; -if(config.cron.deleteNoVideo===undefined)config.cron.deleteNoVideo=true; -if(config.cron.deleteNoVideoRecursion===undefined)config.cron.deleteNoVideoRecursion=false; -if(config.cron.deleteOverMax===undefined)config.cron.deleteOverMax=true; -if(config.cron.deleteOverMaxOffset===undefined)config.cron.deleteOverMaxOffset=0.9; -if(config.cron.deleteLogs===undefined)config.cron.deleteLogs=true; -if(config.cron.deleteEvents===undefined)config.cron.deleteEvents=true; -if(config.cron.deleteFileBins===undefined)config.cron.deleteFileBins=true; -if(config.cron.interval===undefined)config.cron.interval=1; -if(config.databaseType===undefined){config.databaseType='mysql'} -if(config.pluginKeys===undefined)config.pluginKeys={}; -if(config.databaseLogs===undefined){config.databaseLogs=false} -if(config.useUTC===undefined){config.useUTC=false} -if(config.pipeAddition===undefined){config.pipeAddition=7}else{config.pipeAddition=parseInt(config.pipeAddition)} -//Web Paths -if(config.webPaths===undefined){config.webPaths={}} - //main access URI - if(config.webPaths.home===undefined){config.webPaths.index='/'} - //Super User URI - if(config.webPaths.super===undefined){config.webPaths.super='/super'} - //Admin URI - if(config.webPaths.admin===undefined){config.webPaths.admin='/admin'} -//Page Rander Paths -if(config.renderPaths===undefined){config.renderPaths={}} - //login page - if(config.renderPaths.index===undefined){config.renderPaths.index='pages/index'} - //dashboard page - if(config.renderPaths.home===undefined){config.renderPaths.home='pages/home'} - //sub-account administration page - if(config.renderPaths.admin===undefined){config.renderPaths.admin='pages/admin'} - //superuser page - if(config.renderPaths.super===undefined){config.renderPaths.super='pages/super'} - //2-Factor Auth page - if(config.renderPaths.factorAuth===undefined){config.renderPaths.factorAuth='pages/factor'} - //Streamer (Dashbcam Prototype) page - if(config.renderPaths.streamer===undefined){config.renderPaths.streamer='pages/streamer'} - //Streamer v2 (Dashbcam) page - if(config.renderPaths.dashcam===undefined){config.renderPaths.dashcam='pages/dashcam'} - //embeddable widget page - if(config.renderPaths.embed===undefined){config.renderPaths.embed='pages/embed'} - //mjpeg full screen page - if(config.renderPaths.mjpeg===undefined){config.renderPaths.mjpeg='pages/mjpeg'} - //gridstack only page - if(config.renderPaths.grid===undefined){config.renderPaths.grid='pages/grid'} +if(config.cpuUsageMarker === undefined){config.cpuUsageMarker='%Cpu'} +if(config.customCpuCommand === undefined){config.customCpuCommand=null} +if(config.autoDropCache === undefined){config.autoDropCache=true} +if(config.doSnapshot === undefined){config.doSnapshot=true} +if(config.restart === undefined){config.restart={}} +if(config.systemLog === undefined){config.systemLog=true} +if(config.deleteCorruptFiles === undefined){config.deleteCorruptFiles=true} +if(config.restart.onVideoNotExist === undefined){config.restart.onVideoNotExist=true} +if(config.ip === undefined||config.ip===''||config.ip.indexOf('0.0.0.0')>-1){config.ip='localhost'}else{config.bindip=config.ip}; +if(config.cron === undefined)config.cron={}; +if(config.cron.enabled === undefined)config.cron.enabled=true; +if(config.cron.deleteOld === undefined)config.cron.deleteOld=true; +if(config.cron.deleteOrphans === undefined)config.cron.deleteOrphans=false; +if(config.cron.deleteNoVideo === undefined)config.cron.deleteNoVideo=true; +if(config.cron.deleteNoVideoRecursion === undefined)config.cron.deleteNoVideoRecursion=false; +if(config.cron.deleteOverMax === undefined)config.cron.deleteOverMax=true; +if(config.cron.deleteOverMaxOffset === undefined)config.cron.deleteOverMaxOffset=0.9; +if(config.cron.deleteLogs === undefined)config.cron.deleteLogs=true; +if(config.cron.deleteEvents === undefined)config.cron.deleteEvents=true; +if(config.cron.deleteFileBins === undefined)config.cron.deleteFileBins=true; +if(config.cron.interval === undefined)config.cron.interval=1; +if(config.databaseType === undefined){config.databaseType='mysql'} +if(config.pluginKeys === undefined)config.pluginKeys={}; +if(config.databaseLogs === undefined){config.databaseLogs=false} +if(config.useUTC === undefined){config.useUTC=false} +if(config.pipeAddition === undefined){config.pipeAddition=7}else{config.pipeAddition=parseInt(config.pipeAddition)} //Child Nodes -if(config.childNodes===undefined)config.childNodes = {}; +if(config.childNodes === undefined)config.childNodes = {}; //enabled - if(config.childNodes.enabled===undefined)config.childNodes.enabled = false; + if(config.childNodes.enabled === undefined)config.childNodes.enabled = false; //mode, set value as `child` for all other machines in the cluster - if(config.childNodes.mode===undefined)config.childNodes.mode = 'master'; + if(config.childNodes.mode === undefined)config.childNodes.mode = 'master'; //child node connection port - if(config.childNodes.port===undefined)config.childNodes.port = 8288; + if(config.childNodes.port === undefined)config.childNodes.port = 8288; //child node connection key - if(config.childNodes.key===undefined)config.childNodes.key = [ + if(config.childNodes.key === undefined)config.childNodes.key = [ '3123asdasdf1dtj1hjk23sdfaasd12asdasddfdbtnkkfgvesra3asdsd3123afdsfqw345' ]; @@ -207,6 +181,7 @@ s.getDefinitonFile=function(rule){ } return file } +//sql/database connection with knex var databaseOptions = { client: config.databaseType, connection: config.db, @@ -219,42 +194,24 @@ if(databaseOptions.client === 'sqlite3' && databaseOptions.connection.filename = databaseOptions.connection.filename = __dirname+"/shinobi.sqlite" } s.databaseEngine = knex(databaseOptions) -s.sqlDate = function(value){ - var dateQueryFunction = '' - if(databaseOptions.client === 'sqlite3'){ - value = value.toLowerCase() - if (value.slice(-1) !== 's') { - value = value+'s' - } - dateQueryFunction = "datetime('now', '-"+value+"')" - }else{ - value = value.toUpperCase() - if (value.slice(-1) === 'S') { - value = value.slice(0, -1); - } - dateQueryFunction = "DATE_SUB(NOW(), INTERVAL "+value+")" - } - return dateQueryFunction -} s.mergeQueryValues = function(query,values){ if(!values){values=[]} var valuesNotFunction = true; if(typeof values === 'function'){ - var onMoveOn = values; var values = []; valuesNotFunction = false; } - if(!onMoveOn){onMoveOn=function(){}} if(values&&valuesNotFunction){ var splitQuery = query.split('?') var newQuery = '' splitQuery.forEach(function(v,n){ newQuery += v - if(values[n]){ - if(isNaN(values[n])){ - newQuery += "'"+values[n]+"'" + var value = values[n] + if(value){ + if(isNaN(value) || value instanceof Date){ + newQuery += "'"+value+"'" }else{ - newQuery += values[n] + newQuery += value } } }) @@ -263,7 +220,11 @@ s.mergeQueryValues = function(query,values){ } return newQuery } -s.sqlQuery = function(query,values,onMoveOn,hideLog){ +s.stringToSqlTime = function(value){ + newValue = new Date(value.replace('T',' ')) + return newValue +} +s.sqlQuery = function(query,values,onMoveOn){ if(!values){values=[]} if(typeof values === 'function'){ var onMoveOn = values; @@ -271,24 +232,64 @@ s.sqlQuery = function(query,values,onMoveOn,hideLog){ } if(!onMoveOn){onMoveOn=function(){}} var mergedQuery = s.mergeQueryValues(query,values) - return s.databaseEngine.raw(query,values) - .asCallback(function(err,r){ - if(err&&config.databaseLogs){ - s.systemLog('s.sqlQuery QUERY',query) - s.systemLog('s.sqlQuery ERROR',err) + s.debugLog('s.sqlQuery QUERY',mergedQuery) + return s.databaseEngine + .raw(query,values) + .asCallback(function(err,r){ + if(err){ + console.log('s.sqlQuery QUERY ERRORED',query) + console.log('s.sqlQuery ERROR',err) + } + if(onMoveOn && typeof onMoveOn === 'function'){ + switch(databaseOptions.client){ + case'sqlite3': + if(!r)r=[] + break; + default: + if(r)r=r[0] + break; } - if(onMoveOn && typeof onMoveOn === 'function'){ - switch(databaseOptions.client){ - case'sqlite3': - if(!r)r=[] - break; - default: - if(r)r=r[0] - break; + onMoveOn(err,r) + } + }) +} +//discord bot +if(config.discordBot === true){ + try{ + var Discord = require("discord.js") + s.discordMsg = function(data,files,groupKey){ + if(!data)data = {}; + var bot = s.group[groupKey].discordBot + if(!bot){ + s.log({ke:groupKey,mid:'$USER'},{type:lang.DiscordFailedText,msg:lang.DiscordNotEnabledText}) + return + } + var sendBody = Object.assign({ + color: 3447003, + title: 'Alert from Shinobi', + description: "", + fields: [], + timestamp: new Date(), + footer: { + icon_url: "https://shinobi.video/libs/assets/icon/apple-touch-icon-152x152.png", + text: "Shinobi Systems" } - onMoveOn(err,r) - } - }) + },data) + bot.channels.get(s.group[groupKey].init.discordbot_channel).send({ + embed: sendBody, + files: files + }).catch(err => { + if(err){ + s.log({ke:groupKey,mid:'$USER'},{type:lang.DiscordErrorText,msg:err}) + s.group[groupKey].discordBot = null + s.init('apps',{ke:groupKey}) + } + }) + } + }catch(err){ + console.log('Could not start Discord bot, please run "npm install discord.js" inside the Shinobi folder.') + s.discordMsg = function(){} + } } //kill any ffmpeg running s.ffmpegKill=function(){ @@ -326,8 +327,13 @@ s.ocvTx=function(data){ } } //send data to socket client function -s.tx=function(z,y,x){if(x){return x.broadcast.to(y).emit('f',z)};io.to(y).emit('f',z);} -s.txWithSubPermissions=function(z,y,permissionChoices){ +s.tx = function(z,y,x){if(x){return x.broadcast.to(y).emit('f',z)};io.to(y).emit('f',z);} +s.txToDashcamUsers = function(data,groupKey){ + Object.keys(s.group[groupKey].dashcamUsers).forEach(function(auth){ + s.tx(data,s.group[groupKey].dashcamUsers[auth].cnid) + }) +} +s.txWithSubPermissions = function(z,y,permissionChoices){ if(typeof permissionChoices==='string'){ permissionChoices=[permissionChoices] } @@ -339,7 +345,7 @@ s.txWithSubPermissions=function(z,y,permissionChoices){ var valid=0 var checked=permissionChoices.length permissionChoices.forEach(function(b){ - if(user.details[b].indexOf(z.mid)!==-1){ + if(user.details[b] && user.details[b].indexOf(z.mid)!==-1){ ++valid } }) @@ -443,6 +449,120 @@ s.getFunctionParamNames = function(func) { result = []; return result; } +s.getDetectorStreams = function(monitor){ + var pathDir = s.dir.streams+monitor.ke+'/'+monitor.id+'/' + var streamDirItems = fs.readdirSync(pathDir) + var items = [] + streamDirItems.forEach(function(filename){ + if(filename.indexOf('detectorStream') > -1 && filename.indexOf('.m3u8') === -1){ + try{ + items.push(pathDir+filename) + }catch(err){ + console.log(err) + } + } + }) + return items +} +s.createPamDiffEngine = function(e){ + var width, + height, + globalSensitivity, + fullFrame = false + if(s.group[e.ke].mon_conf[e.id].details.detector_scale_x===''||s.group[e.ke].mon_conf[e.id].details.detector_scale_y===''){ + width = s.group[e.ke].mon_conf[e.id].details.detector_scale_x; + height = s.group[e.ke].mon_conf[e.id].details.detector_scale_y; + }else{ + width = e.width + height = e.height + } + if(e.details.detector_sensitivity===''){ + globalSensitivity = 10 + }else{ + globalSensitivity = parseInt(e.details.detector_sensitivity) + } + if(e.details.detector_frame==='1'){ + fullFrame={ + name:'FULL_FRAME', + sensitivity:globalSensitivity, + points:[ + [0,0], + [0,height], + [width,height], + [width,0] + ] + }; + } + var regions = s.createPamDiffRegionArray(s.group[e.ke].mon_conf[e.id].details.cords,globalSensitivity,fullFrame); + if(!s.group[e.ke].mon[e.id].noiseFilterArray)s.group[e.ke].mon[e.id].noiseFilterArray = {} + var noiseFilterArray = s.group[e.ke].mon[e.id].noiseFilterArray + Object.keys(regions.notForPam).forEach(function(name){ + if(!noiseFilterArray[name])noiseFilterArray[name]=[]; + }) + s.group[e.ke].mon[e.id].pamDiff = new PamDiff({grayscale: 'luminosity', regions : regions.forPam}); + s.group[e.ke].mon[e.id].p2p = new P2P(); + var sendTrigger = function(trigger){ + var detectorObject = { + f:'trigger', + id:e.id, + ke:e.ke, + name:trigger.name, + details:{ + plug:'built-in', + name:trigger.name, + reason:'motion', + confidence:trigger.percent, + }, + plates:[], + imgHeight:height, + imgWidth:width + } + detectorObject.doObjectDetection = (s.ocv && e.details.detector_use_detect_object === '1') + s.camera('motion',detectorObject) + if(detectorObject.doObjectDetection === true){ + s.ocvTx({f:'frame',mon:s.group[e.ke].mon_conf[e.id].details,ke:e.ke,id:e.id,time:s.formattedTime(),frame:s.group[e.ke].mon[e.id].lastJpegDetectorFrame}); + } + } + var filterTheNoise = function(trigger){ + if(noiseFilterArray[trigger.name].length > 2){ + var thePreviousTriggerPercent = noiseFilterArray[trigger.name][noiseFilterArray[trigger.name].length - 1]; + var triggerDifference = trigger.percent - thePreviousTriggerPercent; + var noiseRange = e.details.detector_noise_filter_range + if(!noiseRange || noiseRange === ''){ + noiseRange = 6 + } + noiseRange = parseFloat(noiseRange) + if(((trigger.percent - thePreviousTriggerPercent) < noiseRange)||(thePreviousTriggerPercent - trigger.percent) > -noiseRange){ + noiseFilterArray[trigger.name].push(trigger.percent); + } + }else{ + noiseFilterArray[trigger.name].push(trigger.percent); + } + if(noiseFilterArray[trigger.name].length > 10){ + noiseFilterArray[trigger.name] = noiseFilterArray[trigger.name].splice(1,10) + } + var theNoise = 0; + noiseFilterArray[trigger.name].forEach(function(v,n){ + theNoise += v; + }) + theNoise = theNoise / noiseFilterArray[trigger.name].length; +// console.log(noiseFilterArray[trigger.name]) +// console.log(theNoise) + var triggerPercentWithoutNoise = trigger.percent - theNoise; + if(triggerPercentWithoutNoise > regions.notForPam[trigger.name].sensitivity){ + sendTrigger(trigger); + } + } + if(e.details.detector_noise_filter==='1'){ + s.group[e.ke].mon[e.id].pamDiff.on('diff', (data) => { + data.trigger.forEach(filterTheNoise) + }) + }else{ + s.group[e.ke].mon[e.id].pamDiff.on('diff', (data) => { + data.trigger.forEach(sendTrigger) + }) + } +} s.createPamDiffRegionArray = function(regions,globalSensitivity,fullFrame){ var pamDiffCompliantArray = [], arrayForOtherStuff = [], @@ -456,6 +576,7 @@ s.createPamDiffRegionArray = function(regions,globalSensitivity,fullFrame){ json[fullFrame.name]=fullFrame; } Object.values(json).forEach(function(region){ + if(!region)return false; region.polygon = []; region.points.forEach(function(points){ region.polygon.push({x:parseFloat(points[0]),y:parseFloat(points[1])}) @@ -485,9 +606,15 @@ s.getRequest = function(url,callback){ // s.systemLog("Get Snapshot Error", e); }); } -s.kill=function(x,e,p){ +s.kill = function(x,e,p){ if(s.group[e.ke]&&s.group[e.ke].mon[e.id]&&s.group[e.ke].mon[e.id].spawn !== undefined){ if(s.group[e.ke].mon[e.id].spawn){ + s.group[e.ke].mon[e.id].allowStdinWrite = false + s.txToDashcamUsers({ + f : 'disable_stream', + ke : e.ke, + mid : e.id + },e.ke) s.group[e.ke].mon[e.id].spawn.stdio[3].unpipe(); // if(s.group[e.ke].mon[e.id].p2pStream){s.group[e.ke].mon[e.id].p2pStream.unpipe();} if(s.group[e.ke].mon[e.id].p2p){s.group[e.ke].mon[e.id].p2p.unpipe();} @@ -495,15 +622,17 @@ s.kill=function(x,e,p){ delete(s.group[e.ke].mon[e.id].p2p) delete(s.group[e.ke].mon[e.id].pamDiff) try{ - s.group[e.ke].mon[e.id].spawn.removeListener('end',s.group[e.ke].mon[e.id].spawn_exit); - s.group[e.ke].mon[e.id].spawn.removeListener('exit',s.group[e.ke].mon[e.id].spawn_exit); - delete(s.group[e.ke].mon[e.id].spawn_exit); + s.group[e.ke].mon[e.id].spawn.removeListener('end',s.group[e.ke].mon[e.id].spawn_exit); + s.group[e.ke].mon[e.id].spawn.removeListener('exit',s.group[e.ke].mon[e.id].spawn_exit); + delete(s.group[e.ke].mon[e.id].spawn_exit); }catch(er){} } clearTimeout(s.group[e.ke].mon[e.id].checker); delete(s.group[e.ke].mon[e.id].checker); clearTimeout(s.group[e.ke].mon[e.id].checkStream); delete(s.group[e.ke].mon[e.id].checkStream); + clearTimeout(s.group[e.ke].mon[e.id].checkSnap); + delete(s.group[e.ke].mon[e.id].checkSnap); clearTimeout(s.group[e.ke].mon[e.id].watchdog_stop); delete(s.group[e.ke].mon[e.id].watchdog_stop); delete(s.group[e.ke].mon[e.id].lastJpegDetectorFrame); @@ -514,10 +643,11 @@ s.kill=function(x,e,p){ if(s.group[e.ke].mon[e.id].childNode){ s.cx({f:'kill',d:s.init('noReference',e)},s.group[e.ke].mon[e.id].childNodeId) }else{ + s.coSpawnClose(e) if(!x||x===1){return}; p=x.pid; if(s.group[e.ke].mon_conf[e.id].type===('dashcam'||'socket'||'jpeg'||'pipe')){ - x.stdin.pause();setTimeout(function(){x.kill('SIGTERM');delete(x);},500) + x.stdin.pause();setTimeout(function(){x.kill('SIGTERM');},500) }else{ try{ x.stdin.setEncoding('utf8');x.stdin.write('q'); @@ -537,7 +667,7 @@ s.log=function(e,x){ // s.systemLog('s.log : ',{f:'log',ke:e.ke,mid:e.mid,log:x,time:s.timeObject()},'GRP_'+e.ke) } //system log -s.systemLog=function(q,w,e){ +s.systemLog = function(q,w,e){ if(!w){w=''} if(!e){e=''} if(config.systemLog===true){ @@ -548,14 +678,25 @@ s.systemLog=function(q,w,e){ return console.log(s.timeObject().format(),q,w,e) } } +//system log +s.debugLog = function(q,w,e){ + if(!w){w = ''} + if(!e){e = ''} + if(config.debugLog === true){ + console.log(s.timeObject().format(),q,w,e) + if(config.debugLogVerbose === true){ + console.log(new Error()) + } + } +} //SSL options if(config.ssl&&config.ssl.key&&config.ssl.cert){ config.ssl.key=fs.readFileSync(s.checkRelativePath(config.ssl.key),'utf8') config.ssl.cert=fs.readFileSync(s.checkRelativePath(config.ssl.cert),'utf8') - if(config.ssl.port===undefined){ + if(config.ssl.port === undefined){ config.ssl.port=443 } - if(config.ssl.bindip===undefined){ + if(config.ssl.bindip === undefined){ config.ssl.bindip=config.bindip } if(config.ssl.ca&&config.ssl.ca instanceof Array){ @@ -592,7 +733,7 @@ s.ffmpegVersion=execSync(config.ffmpegDir+" -version").toString().split('Copyrig console.log('FFMPEG version : '+s.ffmpegVersion) if(s.ffmpegVersion.indexOf(': 2.')>-1){ s.systemLog('FFMPEG is too old : '+s.ffmpegVersion+', Needed : 3.2+',err) - return + throw (new Error()) } //directories s.group={}; @@ -647,11 +788,7 @@ s.init=function(x,e,k,fn){ switch(x){ case 0://init camera if(!s.group[e.ke]){s.group[e.ke]={}}; - if(!s.group[e.ke].fileBin){s.group[e.ke].fileBin={}}; if(!s.group[e.ke].mon){s.group[e.ke].mon={}} - if(!s.group[e.ke].sizeChangeQueue){s.group[e.ke].sizeChangeQueue=[]} - if(!s.group[e.ke].sizePurgeQueue){s.group[e.ke].sizePurgeQueue=[]} - if(!s.group[e.ke].users){s.group[e.ke].users={}} if(!s.group[e.ke].mon[e.mid]){s.group[e.ke].mon[e.mid]={}} if(!s.group[e.ke].mon[e.mid].streamIn){s.group[e.ke].mon[e.mid].streamIn={}}; if(!s.group[e.ke].mon[e.mid].emitterChannel){s.group[e.ke].mon[e.mid].emitterChannel={}}; @@ -666,7 +803,6 @@ s.init=function(x,e,k,fn){ if(!s.group[e.ke].mon[e.mid].started){s.group[e.ke].mon[e.mid].started=0}; if(s.group[e.ke].mon[e.mid].delete){clearTimeout(s.group[e.ke].mon[e.mid].delete)} if(!s.group[e.ke].mon_conf){s.group[e.ke].mon_conf={}} - s.init('apps',e) break; case'group': if(!s.group[e.ke]){ @@ -675,6 +811,11 @@ s.init=function(x,e,k,fn){ if(!s.group[e.ke].init){ s.group[e.ke].init={} } + if(!s.group[e.ke].fileBin){s.group[e.ke].fileBin={}}; + if(!s.group[e.ke].sizeChangeQueue){s.group[e.ke].sizeChangeQueue=[]} + if(!s.group[e.ke].sizePurgeQueue){s.group[e.ke].sizePurgeQueue=[]} + if(!s.group[e.ke].users){s.group[e.ke].users={}} + if(!s.group[e.ke].dashcamUsers){s.group[e.ke].dashcamUsers={}} if(!e.limit||e.limit===''){e.limit=10000}else{e.limit=parseFloat(e.limit)} //save global space limit for group key (mb) s.group[e.ke].sizeLimit=e.limit; @@ -701,15 +842,52 @@ s.init=function(x,e,k,fn){ ar.webdav_url!=='' ){ if(!ar.webdav_dir||ar.webdav_dir===''){ - ar.webdav_dir='/'; - if(ar.webdav_dir.slice(-1)!=='/'){ar.webdav_dir+='/';} + ar.webdav_dir='/' } + ar.webdav_dir = s.checkCorrectPathEnding(ar.webdav_dir) s.group[e.ke].webdav = webdav( ar.webdav_url, ar.webdav_user, ar.webdav_pass ); } + //Amazon S3 + if(!s.group[e.ke].aws && + !s.group[e.ke].aws_s3 && + ar.aws_s3 !== '0' && + ar.aws_accessKeyId !== ''&& + ar.aws_secretAccessKey && + ar.aws_secretAccessKey !== ''&& + ar.aws_region && + ar.aws_region !== ''&& + ar.aws_s3_bucket !== '' + ){ + if(!ar.aws_s3_dir || ar.aws_s3_dir === '/'){ + ar.aws_s3_dir = '' + } + if(ar.aws_s3_dir !== ''){ + ar.aws_s3_dir = s.checkCorrectPathEnding(ar.aws_s3_dir) + } + s.group[e.ke].aws = new require("aws-sdk") + s.group[e.ke].aws.config = new s.group[e.ke].aws.Config({ + accessKeyId: ar.aws_accessKeyId, + secretAccessKey: ar.aws_secretAccessKey, + region: ar.aws_region + }) + s.group[e.ke].aws_s3 = new s.group[e.ke].aws.S3(); + } + //discordbot + if(!s.group[e.ke].discordBot && + config.discordBot === true && + ar.discordbot === '1' && + ar.discordbot_token !== '' + ){ + s.group[e.ke].discordBot = new Discord.Client() + s.group[e.ke].discordBot.on('ready', () => { + console.log(`${r.mail} : Discord Bot Logged in as ${s.group[e.ke].discordBot.user.tag}!`) + }) + s.group[e.ke].discordBot.login(ar.discordbot_token) + } Object.keys(ar).forEach(function(v){ s.group[e.ke].init[v]=ar[v] }) @@ -736,6 +914,8 @@ s.init=function(x,e,k,fn){ //build a complete url from pieces e.authd=''; if(e.details.muser&&e.details.muser!==''&&e.host.indexOf('@')===-1) { + e.username = e.details.muser + e.password = e.details.mpass e.authd=e.details.muser+':'+e.details.mpass+'@'; } if(e.port==80&&e.details.port_force!=='1'){e.porty=''}else{e.porty=':'+e.port} @@ -791,6 +971,24 @@ s.init=function(x,e,k,fn){ checkQueue() } break; + case'monitorStatus': +// s.discordMsg({ +// author: { +// name: s.group[e.ke].mon_conf[e.id].name, +// icon_url: "https://shinobi.video/libs/assets/icon/apple-touch-icon-152x152.png" +// }, +// title: lang['Status Changed'], +// description: lang['Monitor is now '+e.status], +// fields: [], +// timestamp: new Date(), +// footer: { +// icon_url: "https://shinobi.video/libs/assets/icon/apple-touch-icon-152x152.png", +// text: "Shinobi Systems" +// } +// },[],e.ke) + s.group[e.ke].mon[e.id].monitorStatus = e.status + s.tx(Object.assign(e,{f:'monitor_status'}),'GRP_'+e.ke) + break; } if(typeof e.callback==='function'){setTimeout(function(){e.callback()},500);} } @@ -807,7 +1005,7 @@ s.filterEvents=function(x,d){ }) d.mailOptions = { - from: '"ShinobiCCTV" ', // sender address + from: config.mail.from, // sender address to: d.mail, // list of receivers subject: lang['Filter Matches']+' : '+d.name, // Subject line html: lang.FilterMatchesText1+' '+d.videos.length+' '+lang.FilterMatchesText2, @@ -884,25 +1082,24 @@ s.video=function(x,e,k){ }) }); break; - case'archive': - if(!e.filename&&e.time){e.filename=s.formattedTime(e.time)} - if(!e.status){e.status=0} - e.details.archived="1" - e.save=[JSON.stringify(e.details),e.id,e.ke,s.nameToTime(e.filename)]; - s.sqlQuery('UPDATE Videos SET details=? WHERE `mid`=? AND `ke`=? AND `time`=?',e.save,function(err,r){ - s.tx({f:'video_edit',status:3,filename:e.filename+'.'+e.ext,mid:e.mid,ke:e.ke,time:s.nameToTime(e.filename)},'GRP_'+e.ke); - }); - break; case'delete': - if(!e.filename&&e.time){e.filename=s.formattedTime(e.time)} - var filename + if(!e.filename && e.time){ + e.filename = s.formattedTime(e.time) + } + var filename, + time if(e.filename.indexOf('.')>-1){ filename = e.filename }else{ filename = e.filename+'.'+e.ext } - if(!e.status){e.status=0} - e.save=[e.id,e.ke,s.nameToTime(filename)]; + if(e.filename && !e.time){ + time = s.nameToTime(filename) + }else{ + time = e.time + } + time = new Date(time) + e.save=[e.id,e.ke,time]; s.sqlQuery('SELECT * FROM Videos WHERE `mid`=? AND `ke`=? AND `time`=?',e.save,function(err,r){ if(r&&r[0]){ r=r[0] @@ -917,6 +1114,9 @@ s.video=function(x,e,k){ s.tx({f:'video_delete',filename:filename,mid:e.mid,ke:e.ke,time:s.nameToTime(filename),end:s.formattedTime(new Date,'YYYY-MM-DD HH:mm:ss')},'GRP_'+e.ke); s.file('delete',dir+filename) }) + }else{ +// console.log('Delete Failed',e) +// console.error(err) } }) break; @@ -1028,7 +1228,8 @@ s.video=function(x,e,k){ }else{ queryString = '' } - v.href = '/'+k+'/videos/'+v.ke+'/'+v.mid+'/'+s.formattedTime(v.time)+'.'+v.ext; + v.filename = s.formattedTime(v.time)+'.'+v.ext; + v.href = '/'+k+'/videos/'+v.ke+'/'+v.mid+'/'+v.filename; v.links = { deleteVideo : v.href+'/delete' + queryString, changeToUnread : v.href+'/status/1' + queryString, @@ -1067,9 +1268,10 @@ s.video=function(x,e,k){ if(s.group[e.ke].usedSpace>(s.group[e.ke].sizeLimit*config.cron.deleteOverMaxOffset)){ s.sqlQuery('SELECT * FROM Videos WHERE status != 0 AND details NOT LIKE \'%"archived":"1"%\' AND ke=? ORDER BY `time` ASC LIMIT 2',[e.ke],function(err,evs){ k.del=[];k.ar=[e.ke]; + if(!evs)return console.log(err) evs.forEach(function(ev){ ev.dir=s.video('getDir',ev)+s.formattedTime(ev.time)+'.'+ev.ext; - k.del.push('(mid=? AND time=?)'); + k.del.push('(mid=? AND `time`=?)'); k.ar.push(ev.mid),k.ar.push(ev.time); s.file('delete',ev.dir); s.init('diskUsedSet',e,-(ev.size/1000000)) @@ -1130,8 +1332,6 @@ s.video=function(x,e,k){ }); k.filename = s.formattedTime(e.startTime)+'.'+e.ext }else{ - e.startTime = s.utcToLocal(e.startTime) - e.endTime = s.utcToLocal(e.endTime) k.filename = k.file } if(!e.ext){e.ext = k.filename.split('.')[1]} @@ -1174,9 +1374,9 @@ s.video=function(x,e,k){ filename:k.filename, mid:e.mid, ke:e.ke, - time:s.timeObject(e.startTime).format(), + time:e.startTime, size:e.filesize, - end:s.timeObject(e.endTime).format() + end:e.endTime },'GRP_'+e.ke,'video_view'); } //cloud auto savers @@ -1200,7 +1400,7 @@ s.video=function(x,e,k){ // }); // }); // } - if(s.group[e.ke].webdav&&s.group[e.ke].init.use_webdav!=='0'&&s.group[e.ke].init.webdav_save=="1"){ + if(s.group[e.ke].webdav&&s.group[e.ke].init.use_webdav!=='0'&&s.group[e.ke].init.webdav_save=='1'){ fs.readFile(k.dir+k.filename,function(err,data){ s.group[e.ke].webdav.putFileContents(s.group[e.ke].init.webdav_dir+e.ke+'/'+e.mid+'/'+k.filename,"binary",data) .catch(function(err) { @@ -1209,11 +1409,40 @@ s.video=function(x,e,k){ }); }); } + if(s.group[e.ke].aws_s3 && s.group[e.ke].init.use_aws_s3 !== '0' && s.group[e.ke].init.aws_s3_save === '1'){ + var fileStream = fs.createReadStream(k.dir+k.filename); + fileStream.on('error', function (err) { + console.error(err) + }) + s.group[e.ke].aws_s3.upload({ + Bucket: s.group[e.ke].init.aws_s3_bucket, + Key: s.group[e.ke].init.aws_s3_dir+e.ke+'/'+e.mid+'/'+k.filename, + Body:fileStream, + ACL:'public-read' + },function(err,data){ + if(err){ + s.log(e,{type:lang['Amazon S3 Upload Error'],msg:err}) + } + if(s.group[e.ke].init.aws_s3_log === '1' && data && data.Location){ + var save = [ + e.mid, + e.ke, + e.startTime, + 0, + '{}', + e.filesize, + e.endTime, + data.Location + ] + s.sqlQuery('INSERT INTO `Cloud Videos` (mid,ke,time,status,details,size,end,href) VALUES (?,?,?,?,?,?,?,?)',save) + } + }) + } k.details = {} if(e.details&&e.details.dir&&e.details.dir!==''){ k.details.dir = e.details.dir } - if(config.useUTC)k.details.isUTC = config.useUTC; + if(config.useUTC === true)k.details.isUTC = config.useUTC; var save = [ e.mid, e.ke, @@ -1245,256 +1474,435 @@ s.splitForFFPMEG = function (ffmpegCommandAsString) { return p; }, {a: ['']}).a }; -s.ffmpeg=function(e){ - //create input map - var createFFmpegMap = function(arrayOfMaps){ - //e.details.input_map_choices.stream - var string = ''; - if(e.details.input_maps && e.details.input_maps.length > 0){ - if(arrayOfMaps && arrayOfMaps instanceof Array && arrayOfMaps.length>0){ - arrayOfMaps.forEach(function(v){ - if(v.map==='')v.map='0' - string += ' -map '+v.map - }) - }else{ - string += ' -map 0:0' - } - } - return string; - } - var createInputMap = function(number,input){ - //fulladdress - Full Input Path - //`x` is an object used to contain temporary values. - var x = {} - x.cust_input = '' - x.hwaccel = '' - if(input.cust_input&&input.cust_input!==''){x.cust_input+=' '+input.cust_input;} - //input - analyze duration - if(input.aduration&&input.aduration!==''){x.cust_input+=' -analyzeduration '+input.aduration}; - //input - probe size - if(input.probesize&&input.probesize!==''){x.cust_input+=' -probesize '+input.probesize}; - //input - stream loop (good for static files/lists) - if(input.stream_loop==='1'){x.cust_input+=' -stream_loop -1'}; - //input - fps - if(x.cust_input.indexOf('-r ')===-1&&input.sfps&&input.sfps!==''){ - input.sfps=parseFloat(input.sfps); - if(isNaN(input.sfps)){input.sfps=1} - x.cust_input+=' -r '+input.sfps - } - //input - is mjpeg - if(input.type==='mjpeg'){ - if(x.cust_input.indexOf('-f ')===-1){ - x.cust_input+=' -f mjpeg' - } - //input - frames per second - x.cust_input+=' -reconnect 1'; - }else - //input - is h264 has rtsp in address and transport method is chosen - if((input.type==='h264'||input.type==='mp4')&&input.fulladdress.indexOf('rtsp://')>-1&&input.rtsp_transport!==''&&input.rtsp_transport!=='no'){ - x.cust_input += ' -rtsp_transport '+input.rtsp_transport; - }else - if((input.type==='mp4'||input.type==='mjpeg')&&x.cust_input.indexOf('-re')===-1){ - x.cust_input += ' -re' - } - //hardware acceleration - if(input.accelerator&&input.accelerator==='1'){ - if(input.hwaccel&&input.hwaccel!==''){ - x.hwaccel+=' -hwaccel '+input.hwaccel; - } - if(input.hwaccel_vcodec&&input.hwaccel_vcodec!==''&&input.hwaccel_vcodec!=='auto'&&input.hwaccel_vcodec!=='no'){ - x.hwaccel+=' -c:v '+input.hwaccel_vcodec; - } - if(input.hwaccel_device&&input.hwaccel_device!==''){ - switch(input.hwaccel){ - case'vaapi': - x.hwaccel+=' -vaapi_device '+input.hwaccel_device+' -hwaccel_output_format vaapi'; - break; - default: - x.hwaccel+=' -hwaccel_device '+input.hwaccel_device; - break; - } - } - } - //custom - input flags - return x.hwaccel+x.cust_input+' -i "'+input.fulladdress+'"'; - } - //create sub stream channel - var createStreamChannel = function(number,channel){ - //`x` is an object used to contain temporary values. - var x = { - pipe:'' - } - if(!number||number==''){ - x.channel_sdir = e.sdir; +s.createFFmpegMap = function(e,arrayOfMaps){ + //`e` is the monitor object + var string = ''; + if(e.details.input_maps && e.details.input_maps.length > 0){ + if(arrayOfMaps && arrayOfMaps instanceof Array && arrayOfMaps.length>0){ + arrayOfMaps.forEach(function(v){ + if(v.map==='')v.map='0' + string += ' -map '+v.map + }) }else{ - x.channel_sdir = e.sdir+'channel'+number+'/'; - if (!fs.existsSync(x.channel_sdir)){ - fs.mkdirSync(x.channel_sdir); + string += ' -map 0:0' + } + } + return string; +} +s.createInputMap = function(e,number,input){ + //`e` is the monitor object + //`x` is an object used to contain temporary values. + var x = {} + x.cust_input = '' + x.hwaccel = '' + if(input.cust_input&&input.cust_input!==''){x.cust_input+=' '+input.cust_input} + //input - analyze duration + if(input.aduration&&input.aduration!==''){x.cust_input+=' -analyzeduration '+input.aduration} + //input - probe size + if(input.probesize&&input.probesize!==''){x.cust_input+=' -probesize '+input.probesize} + //input - stream loop (good for static files/lists) + if(input.stream_loop==='1'){x.cust_input+=' -stream_loop -1'} + //input - fps + if(x.cust_input.indexOf('-r ')===-1&&input.sfps&&input.sfps!==''){ + input.sfps=parseFloat(input.sfps); + if(isNaN(input.sfps)){input.sfps=1} + x.cust_input+=' -r '+input.sfps + } + //input - is mjpeg + if(input.type==='mjpeg'){ + if(x.cust_input.indexOf('-f ')===-1){ + x.cust_input+=' -f mjpeg' + } + //input - frames per second + x.cust_input+=' -reconnect 1' + }else + //input - is h264 has rtsp in address and transport method is chosen + if((input.type==='h264'||input.type==='mp4')&&input.fulladdress.indexOf('rtsp://')>-1&&input.rtsp_transport!==''&&input.rtsp_transport!=='no'){ + x.cust_input += ' -rtsp_transport '+input.rtsp_transport + }else + if((input.type==='mp4'||input.type==='mjpeg')&&x.cust_input.indexOf('-re')===-1){ + x.cust_input += ' -re' + } + //hardware acceleration + if(input.accelerator&&input.accelerator==='1'){ + if(input.hwaccel&&input.hwaccel!==''){ + x.hwaccel+=' -hwaccel '+input.hwaccel; + } + if(input.hwaccel_vcodec&&input.hwaccel_vcodec!==''&&input.hwaccel_vcodec!=='auto'&&input.hwaccel_vcodec!=='no'){ + x.hwaccel+=' -c:v '+input.hwaccel_vcodec; + } + if(input.hwaccel_device&&input.hwaccel_device!==''){ + switch(input.hwaccel){ + case'vaapi': + x.hwaccel+=' -vaapi_device '+input.hwaccel_device+' -hwaccel_output_format vaapi'; + break; + default: + x.hwaccel+=' -hwaccel_device '+input.hwaccel_device; + break; } } - x.stream_video_filters=[] - //stream - frames per second - if(channel.stream_vcodec!=='copy'){ - if(!channel.stream_fps||channel.stream_fps===''){ - switch(channel.stream_type){ - case'rtmp': - channel.stream_fps=30 - break; - default: + } + //custom - input flags + return x.hwaccel+x.cust_input+' -i "'+input.fulladdress+'"'; +} +//create sub stream channel +s.createStreamChannel = function(e,number,channel){ + //`e` is the monitor object + //`x` is an object used to contain temporary values. + var x = { + pipe:'' + } + if(!number||number==''){ + x.channel_sdir = e.sdir; + }else{ + x.channel_sdir = e.sdir+'channel'+number+'/'; + if (!fs.existsSync(x.channel_sdir)){ + fs.mkdirSync(x.channel_sdir); + } + } + x.stream_video_filters=[] + //stream - frames per second + if(channel.stream_vcodec!=='copy'){ + if(!channel.stream_fps||channel.stream_fps===''){ + switch(channel.stream_type){ + case'rtmp': + channel.stream_fps=30 + break; + default: // channel.stream_fps=5 - break; - } + break; } } - if(channel.stream_fps&&channel.stream_fps!==''){x.stream_fps=' -r '+channel.stream_fps}else{x.stream_fps=''} + } + if(channel.stream_fps&&channel.stream_fps!==''){x.stream_fps=' -r '+channel.stream_fps}else{x.stream_fps=''} - //stream - hls vcodec - if(channel.stream_vcodec&&channel.stream_vcodec!=='no'){ - if(channel.stream_vcodec!==''){x.stream_vcodec=' -c:v '+channel.stream_vcodec}else{x.stream_vcodec=' -c:v libx264'} - }else{ - x.stream_vcodec=''; + //stream - hls vcodec + if(channel.stream_vcodec&&channel.stream_vcodec!=='no'){ + if(channel.stream_vcodec!==''){x.stream_vcodec=' -c:v '+channel.stream_vcodec}else{x.stream_vcodec=' -c:v libx264'} + }else{ + x.stream_vcodec=''; + } + //stream - hls acodec + if(channel.stream_acodec!=='no'){ + if(channel.stream_acodec&&channel.stream_acodec!==''){x.stream_acodec=' -c:a '+channel.stream_acodec}else{x.stream_acodec=''} + }else{ + x.stream_acodec=' -an'; + } + //stream - resolution + if(channel.stream_scale_x&&channel.stream_scale_x!==''&&channel.stream_scale_y&&channel.stream_scale_y!==''){ + x.dimensions = channel.stream_scale_x+'x'+channel.stream_scale_y; + } + //stream - hls segment time + if(channel.hls_time&&channel.hls_time!==''){x.hls_time=channel.hls_time}else{x.hls_time="2"} + //hls list size + if(channel.hls_list_size&&channel.hls_list_size!==''){x.hls_list_size=channel.hls_list_size}else{x.hls_list_size=2} + //stream - custom flags + if(channel.cust_stream&&channel.cust_stream!==''){x.cust_stream=' '+channel.cust_stream}else{x.cust_stream=''} + //stream - preset + if(channel.preset_stream&&channel.preset_stream!==''){x.preset_stream=' -preset '+channel.preset_stream;}else{x.preset_stream=''} + //hardware acceleration + if(e.details.accelerator&&e.details.accelerator==='1'){ + if(e.details.hwaccel&&e.details.hwaccel!==''){ + x.hwaccel+=' -hwaccel '+e.details.hwaccel; } - //stream - hls acodec - if(channel.stream_acodec!=='no'){ - if(channel.stream_acodec&&channel.stream_acodec!==''){x.stream_acodec=' -c:a '+channel.stream_acodec}else{x.stream_acodec=''} - }else{ - x.stream_acodec=' -an'; + if(e.details.hwaccel_vcodec&&e.details.hwaccel_vcodec!==''){ + x.hwaccel+=' -c:v '+e.details.hwaccel_vcodec; } - //stream - resolution - if(channel.stream_scale_x&&channel.stream_scale_x!==''&&channel.stream_scale_y&&channel.stream_scale_y!==''){ - x.dimensions = channel.stream_scale_x+'x'+channel.stream_scale_y; - } - //stream - hls segment time - if(channel.hls_time&&channel.hls_time!==''){x.hls_time=channel.hls_time}else{x.hls_time="2"} - //hls list size - if(channel.hls_list_size&&channel.hls_list_size!==''){x.hls_list_size=channel.hls_list_size}else{x.hls_list_size=2} - //stream - custom flags - if(channel.cust_stream&&channel.cust_stream!==''){x.cust_stream=' '+channel.cust_stream}else{x.cust_stream=''} - //stream - preset - if(channel.preset_stream&&channel.preset_stream!==''){x.preset_stream=' -preset '+channel.preset_stream;}else{x.preset_stream=''} - //hardware acceleration - if(e.details.accelerator&&e.details.accelerator==='1'){ - if(e.details.hwaccel&&e.details.hwaccel!==''){ - x.hwaccel+=' -hwaccel '+e.details.hwaccel; + if(e.details.hwaccel_device&&e.details.hwaccel_device!==''){ + switch(e.details.hwaccel){ + case'vaapi': + x.hwaccel+=' -vaapi_device '+e.details.hwaccel_device+' -hwaccel_output_format vaapi'; + break; + default: + x.hwaccel+=' -hwaccel_device '+e.details.hwaccel_device; + break; } - if(e.details.hwaccel_vcodec&&e.details.hwaccel_vcodec!==''){ - x.hwaccel+=' -c:v '+e.details.hwaccel_vcodec; - } - if(e.details.hwaccel_device&&e.details.hwaccel_device!==''){ - switch(e.details.hwaccel){ - case'vaapi': - x.hwaccel+=' -vaapi_device '+e.details.hwaccel_device+' -hwaccel_output_format vaapi'; - break; - default: - x.hwaccel+=' -hwaccel_device '+e.details.hwaccel_device; - break; - } - } - // else{ - // if(e.details.hwaccel==='vaapi'){ - // x.hwaccel+=' -hwaccel_device 0'; - // } - // } } +// else{ +// if(e.details.hwaccel==='vaapi'){ +// x.hwaccel+=' -hwaccel_device 0'; +// } +// } + } - if(channel.rotate_stream&&channel.rotate_stream!==""&&channel.rotate_stream!=="no"){ - x.stream_video_filters.push('transpose='+channel.rotate_stream); - } - //stream - video filter - if(channel.svf&&channel.svf!==''){ - x.stream_video_filters.push(channel.svf) - } - if(x.stream_video_filters.length>0){ - var string = x.stream_video_filters.join(',').trim() - if(string===''){ - x.stream_video_filters='' - }else{ - x.stream_video_filters=' -vf '+string - } - }else{ + if(channel.rotate_stream&&channel.rotate_stream!==""&&channel.rotate_stream!=="no"){ + x.stream_video_filters.push('transpose='+channel.rotate_stream); + } + //stream - video filter + if(channel.svf&&channel.svf!==''){ + x.stream_video_filters.push(channel.svf) + } + if(x.stream_video_filters.length>0){ + var string = x.stream_video_filters.join(',').trim() + if(string===''){ x.stream_video_filters='' + }else{ + x.stream_video_filters=' -vf '+string } - if(e.details.input_map_choices&&e.details.input_map_choices.record){ - //add input feed map - x.pipe += createFFmpegMap(e.details.input_map_choices['stream_channel-'+(number-config.pipeAddition)]) - } - if(channel.stream_vcodec!=='copy'){ - x.cust_stream+=x.stream_fps - } - switch(channel.stream_type){ - case'mp4': - x.cust_stream+=' -movflags +frag_keyframe+empty_moov+default_base_moof -metadata title="Poseidon Stream" -reset_timestamps 1' - if(channel.stream_vcodec!=='copy'){ - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; - x.cust_stream+=x.preset_stream - x.cust_stream+=x.stream_video_filters - } - x.pipe+=' -f mp4'+x.stream_acodec+x.stream_vcodec+x.cust_stream+' pipe:'+number; - break; - case'rtmp': - x.rtmp_server_url=s.checkCorrectPathEnding(channel.rtmp_server_url); - if(channel.stream_vcodec!=='copy'){ - if(channel.stream_vcodec==='libx264'){ - channel.stream_vcodec = 'h264' - } - if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; - x.cust_stream+=x.preset_stream - if(channel.stream_v_br&&channel.stream_v_br!==''){x.cust_stream+=' -b:v '+channel.stream_v_br} - } - if(channel.stream_vcodec!=='no'&&channel.stream_vcodec!==''){ - x.cust_stream+=' -vcodec '+channel.stream_vcodec - } - if(channel.stream_acodec!=='copy'){ - if(!channel.stream_acodec||channel.stream_acodec===''||channel.stream_acodec==='no'){ - channel.stream_acodec = 'aac' - } - if(!channel.stream_a_br||channel.stream_a_br===''){channel.stream_a_br='128k'} - x.cust_stream+=' -ab '+channel.stream_a_br - } - if(channel.stream_acodec!==''){ - x.cust_stream+=' -acodec '+channel.stream_acodec - } - x.pipe+=' -f flv'+x.stream_video_filters+x.cust_stream+' "'+x.rtmp_server_url+channel.rtmp_stream_key+'"'; - break; - case'h264': - if(channel.stream_vcodec!=='copy'){ - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; - x.cust_stream+=x.preset_stream - x.cust_stream+=x.stream_video_filters - } - x.pipe+=' -f mpegts'+x.stream_acodec+x.stream_vcodec+x.cust_stream+' pipe:'+number; - break; - case'flv': - if(channel.stream_vcodec!=='copy'){ - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; - x.cust_stream+=x.preset_stream - x.cust_stream+=x.stream_video_filters - } - x.pipe+=' -f flv'+x.stream_acodec+x.stream_vcodec+x.cust_stream+' pipe:'+number; - break; - case'hls': - if(channel.stream_vcodec!=='h264_vaapi'&&channel.stream_vcodec!=='copy'){ - if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; - if(x.cust_stream.indexOf('-tune')===-1){x.cust_stream+=' -tune zerolatency'} - if(x.cust_stream.indexOf('-g ')===-1){x.cust_stream+=' -g 1'} - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - x.cust_stream+=x.stream_video_filters - } - x.pipe+=x.preset_stream+x.stream_acodec+x.stream_vcodec+' -f hls'+x.cust_stream+' -hls_time '+x.hls_time+' -hls_list_size '+x.hls_list_size+' -start_number 0 -hls_allow_cache 0 -hls_flags +delete_segments+omit_endlist "'+x.channel_sdir+'s.m3u8"'; - break; - case'mjpeg': - if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -q:v '+channel.stream_quality; + }else{ + x.stream_video_filters='' + } + if(e.details.input_map_choices&&e.details.input_map_choices.record){ + //add input feed map + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices['stream_channel-'+(number-config.pipeAddition)]) + } + if(channel.stream_vcodec!=='copy'){ + x.cust_stream+=x.stream_fps + } + switch(channel.stream_type){ + case'mp4': + x.cust_stream+=' -movflags +frag_keyframe+empty_moov+default_base_moof -metadata title="Poseidon Stream" -reset_timestamps 1' + if(channel.stream_vcodec!=='copy'){ if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - x.pipe+=' -c:v mjpeg -f mpjpeg -boundary_tag shinobi'+x.cust_stream+x.stream_video_filters+' pipe:'+number; + if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; + x.cust_stream+=x.preset_stream + x.cust_stream+=x.stream_video_filters + } + x.pipe+=' -f mp4'+x.stream_acodec+x.stream_vcodec+x.cust_stream+' pipe:'+number; + break; + case'rtmp': + x.rtmp_server_url=s.checkCorrectPathEnding(channel.rtmp_server_url); + if(channel.stream_vcodec!=='copy'){ + if(channel.stream_vcodec==='libx264'){ + channel.stream_vcodec = 'h264' + } + if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; + x.cust_stream+=x.preset_stream + if(channel.stream_v_br&&channel.stream_v_br!==''){x.cust_stream+=' -b:v '+channel.stream_v_br} + } + if(channel.stream_vcodec!=='no'&&channel.stream_vcodec!==''){ + x.cust_stream+=' -vcodec '+channel.stream_vcodec + } + if(channel.stream_acodec!=='copy'){ + if(!channel.stream_acodec||channel.stream_acodec===''||channel.stream_acodec==='no'){ + channel.stream_acodec = 'aac' + } + if(!channel.stream_a_br||channel.stream_a_br===''){channel.stream_a_br='128k'} + x.cust_stream+=' -ab '+channel.stream_a_br + } + if(channel.stream_acodec!==''){ + x.cust_stream+=' -acodec '+channel.stream_acodec + } + x.pipe+=' -f flv'+x.stream_video_filters+x.cust_stream+' "'+x.rtmp_server_url+channel.rtmp_stream_key+'"'; + break; + case'h264': + if(channel.stream_vcodec!=='copy'){ + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; + x.cust_stream+=x.preset_stream + x.cust_stream+=x.stream_video_filters + } + x.pipe+=' -f mpegts'+x.stream_acodec+x.stream_vcodec+x.cust_stream+' pipe:'+number; + break; + case'flv': + if(channel.stream_vcodec!=='copy'){ + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; + x.cust_stream+=x.preset_stream + x.cust_stream+=x.stream_video_filters + } + x.pipe+=' -f flv'+x.stream_acodec+x.stream_vcodec+x.cust_stream+' pipe:'+number; + break; + case'hls': + if(channel.stream_vcodec!=='h264_vaapi'&&channel.stream_vcodec!=='copy'){ + if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -crf '+channel.stream_quality; + if(x.cust_stream.indexOf('-tune')===-1){x.cust_stream+=' -tune zerolatency'} + if(x.cust_stream.indexOf('-g ')===-1){x.cust_stream+=' -g 1'} + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + x.cust_stream+=x.stream_video_filters + } + x.pipe+=x.preset_stream+x.stream_acodec+x.stream_vcodec+' -f hls'+x.cust_stream+' -hls_time '+x.hls_time+' -hls_list_size '+x.hls_list_size+' -start_number 0 -hls_allow_cache 0 -hls_flags +delete_segments+omit_endlist "'+x.channel_sdir+'s.m3u8"'; + break; + case'mjpeg': + if(channel.stream_quality && channel.stream_quality !== '')x.cust_stream+=' -q:v '+channel.stream_quality; + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + x.pipe+=' -c:v mjpeg -f mpjpeg -boundary_tag shinobi'+x.cust_stream+x.stream_video_filters+' pipe:'+number; + break; + default: + x.pipe='' + break; + } + return x.pipe +} +s.ffmpegCoProcessor = function(e){ + if(e.coProcessor === false)return; + var x = {} + //x.input is the input and connection + if(e.details.loglevel&&e.details.loglevel!==''){x.loglevel='-loglevel '+e.details.loglevel;}else{x.loglevel='-loglevel error'} + x.input = x.loglevel+' -re -i '+e.sdir+'cpuOnly.m3u8' + + //x.pipe is the stream out methods + x.cust_input='' + x.cust_detect=' ' + x.stream_video_filters=[] + x.hwaccel='' + x.pipe='' + //main stream frames + //stream - timestamp + if(e.details.stream_timestamp&&e.details.stream_timestamp=="1"&&e.details.vcodec!=='copy'){ + //font + if(e.details.stream_timestamp_font&&e.details.stream_timestamp_font!==''){x.stream_timestamp_font=e.details.stream_timestamp_font}else{x.stream_timestamp_font='/usr/share/fonts/truetype/freefont/FreeSans.ttf'} + //position x + if(e.details.stream_timestamp_x&&e.details.stream_timestamp_x!==''){x.stream_timestamp_x=e.details.stream_timestamp_x}else{x.stream_timestamp_x='(w-tw)/2'} + //position y + if(e.details.stream_timestamp_y&&e.details.stream_timestamp_y!==''){x.stream_timestamp_y=e.details.stream_timestamp_y}else{x.stream_timestamp_y='0'} + //text color + if(e.details.stream_timestamp_color&&e.details.stream_timestamp_color!==''){x.stream_timestamp_color=e.details.stream_timestamp_color}else{x.stream_timestamp_color='white'} + //box color + if(e.details.stream_timestamp_box_color&&e.details.stream_timestamp_box_color!==''){x.stream_timestamp_box_color=e.details.stream_timestamp_box_color}else{x.stream_timestamp_box_color='0x00000000@1'} + //text size + if(e.details.stream_timestamp_font_size&&e.details.stream_timestamp_font_size!==''){x.stream_timestamp_font_size=e.details.stream_timestamp_font_size}else{x.stream_timestamp_font_size='10'} + + x.stream_video_filters.push('drawtext=fontfile='+x.stream_timestamp_font+':text=\'%{localtime}\':x='+x.stream_timestamp_x+':y='+x.stream_timestamp_y+':fontcolor='+x.stream_timestamp_color+':box=1:boxcolor='+x.stream_timestamp_box_color+':fontsize='+x.stream_timestamp_font_size); + } + //stream - watermark for -vf + if(e.details.stream_watermark&&e.details.stream_watermark=="1"&&e.details.stream_watermark_location&&e.details.stream_watermark_location!==''){ + switch(e.details.stream_watermark_position){ + case'tl'://top left + x.stream_watermark_position='10:10' break; - default: - x.pipe='' + case'tr'://top right + x.stream_watermark_position='main_w-overlay_w-10:10' + break; + case'bl'://bottom left + x.stream_watermark_position='10:main_h-overlay_h-10' + break; + default://bottom right + x.stream_watermark_position='(main_w-overlay_w-10)/2:(main_h-overlay_h-10)/2' break; } - return x.pipe + x.stream_video_filters.push('movie='+e.details.stream_watermark_location+'[watermark],[in][watermark]overlay='+x.stream_watermark_position+'[out]'); + } + //stream - rotation + if(e.details.rotate_stream&&e.details.rotate_stream!==""&&e.details.rotate_stream!=="no"&&e.details.stream_vcodec!=='copy'){ + x.stream_video_filters.push('transpose='+e.details.rotate_stream); + } + if(e.details.svf&&e.details.svf!==''){ + x.stream_video_filters.push(e.details.svf) + } + if(x.stream_video_filters.length>0){ + x.stream_video_filters=' -vf '+x.stream_video_filters.join(',') + }else{ + x.stream_video_filters='' + } + if(e.details.cust_stream&&e.details.cust_stream!==''){x.cust_stream=' '+e.details.cust_stream}else{x.cust_stream=''} + if(e.details.stream_fps&&e.details.stream_fps!==''){x.stream_fps=' -r '+e.details.stream_fps}else{x.stream_fps=''} + if(e.details.stream_vcodec!=='copy'){ + x.cust_stream+=x.stream_fps + } + switch(e.details.stream_type){ + case'mjpeg': + if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + x.pipe += ' -an -c:v mjpeg -f mpjpeg -boundary_tag shinobi'+x.cust_stream+x.stream_video_filters+' pipe:1'; + break; + case'b64':case'':case undefined:case null://base64 + if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + x.pipe += ' -an -c:v mjpeg -f image2pipe'+x.cust_stream+x.stream_video_filters+' pipe:1'; + break; + } + //detector frames + if(e.details.detector === '1'){ + if(!e.details.detector_fps||e.details.detector_fps===''){e.details.detector_fps=2} + if(e.details.detector_scale_x&&e.details.detector_scale_x!==''&&e.details.detector_scale_y&&e.details.detector_scale_y!==''){x.dratio=' -s '+e.details.detector_scale_x+'x'+e.details.detector_scale_y}else{x.dratio=' -s 320x240'} + if(e.details.cust_detect&&e.details.cust_detect!==''){x.cust_detect+=e.details.cust_detect;} + if(e.details.detector_pam==='1'){ + x.pipe += ' -an -c:v pam -pix_fmt gray -f image2pipe -r '+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:3' + if(e.details.detector_use_detect_object === '1'){ + //for object detection + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices.detector) + x.pipe += ' -f singlejpeg -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:4'; + } + }else{ + x.pipe+=' -f singlejpeg -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:3'; + } + } + //snapshot frames + if(e.details.snap === '1'){ + if(!e.details.snap_fps || e.details.snap_fps === ''){e.details.snap_fps = 1} + if(e.details.snap_vf && e.details.snap_vf !== ''){x.snap_vf=' -vf '+e.details.snap_vf}else{x.snap_vf=''} + if(e.details.snap_scale_x && e.details.snap_scale_x !== '' && e.details.snap_scale_y && e.details.snap_scale_y !== ''){x.snap_ratio = ' -s '+e.details.snap_scale_x+'x'+e.details.snap_scale_y}else{x.snap_ratio=''} + if(e.details.cust_snap && e.details.cust_snap !== ''){x.cust_snap = ' '+e.details.cust_snap}else{x.cust_snap=''} + x.pipe += ' -update 1 -r '+e.details.snap_fps+x.cust_snap+x.snap_ratio+x.snap_vf+' "'+e.sdir+'s.jpg" -y'; + } + x.stdioPipes = []; + var times = config.pipeAddition; + if(e.details.stream_channels){ + times+=e.details.stream_channels.length + } + for(var i=0; i < times; i++){ + x.stdioPipes.push('pipe') + } + var commandString = x.input+x.pipe + if(commandString === x.input){ + return false + } + s.group[e.ke].mon[e.mid].coProcessorCmd = commandString + return spawn(config.ffmpegDir,s.splitForFFPMEG((commandString).replace(/\s+/g,' ').trim()),{detached: true,stdio:x.stdioPipes}) +} +s.coSpawnLauncher = function(e){ + if(s.group[e.ke].mon[e.id].started === 1 && e.coProcessor === true){ + s.coSpawnClose(e) + s.group[e.ke].mon[e.id].coSpawnProcessor = s.ffmpegCoProcessor(e) + if(s.group[e.ke].mon[e.id].coSpawnProcessor === false){ + return + } + s.log(e,{type:lang['coProcessor Started'],msg:{msg:lang.coProcessorTextStarted,cmd:s.group[e.ke].mon[e.id].coProcessorCmd}}); + s.group[e.ke].mon[e.id].coSpawnProcessorExit = function(){ + s.log(e,{type:lang['coProcess Unexpected Exit'],msg:{msg:lang['coProcess Crashed for Monitor']+' : '+e.id,cmd:s.group[e.ke].mon[e.id].coProcessorCmd}}); + setTimeout(function(){ + s.coSpawnLauncher(e) + },2000) + } + s.group[e.ke].mon[e.id].coSpawnProcessor.on('end',s.group[e.ke].mon[e.id].coSpawnProcessorExit) + s.group[e.ke].mon[e.id].coSpawnProcessor.on('exit',s.group[e.ke].mon[e.id].coSpawnProcessorExit) + var checkLog = function(d,x){return d.indexOf(x)>-1;} + s.group[e.ke].mon[e.id].coSpawnProcessor.stderr.on('data',function(d){ + d=d.toString(); + switch(true){ + case checkLog(d,'deprecated pixel format used'): + case checkLog(d,'[hls @'): + case checkLog(d,'Past duration'): + case checkLog(d,'Last message repeated'): + case checkLog(d,'pkt->duration = 0'): + case checkLog(d,'Non-monotonous DTS'): + case checkLog(d,'NULL @'): + return + break; + } + s.log(e,{type:lang.coProcessor,msg:d}); + }) + if(e.frame_to_stream){ + s.group[e.ke].mon[e.id].coSpawnProcessor.stdout.on('data',e.frame_to_stream) + } + if(e.details.detector === '1'){ + if(e.details.detector_pam === '1'){ + s.createPamDiffEngine(e) + s.group[e.ke].mon[e.id].coSpawnProcessor.stdio[3].pipe(s.group[e.ke].mon[e.id].p2p).pipe(s.group[e.ke].mon[e.id].pamDiff) + }else{ + s.group[e.ke].mon[e.id].coSpawnProcessor.stdio[3].on('data',function(d){ + s.ocvTx({f:'frame',mon:s.group[e.ke].mon_conf[e.id].details,ke:e.ke,id:e.id,time:s.formattedTime(),frame:d}); + }) + } + } + } +} +s.coSpawnClose = function(e){ + if(s.group[e.ke].mon[e.id].coSpawnProcessor){ + s.group[e.ke].mon[e.id].coSpawnProcessor.removeListener('end',s.group[e.ke].mon[e.id].coSpawnProcessorExit); + s.group[e.ke].mon[e.id].coSpawnProcessor.removeListener('exit',s.group[e.ke].mon[e.id].coSpawnProcessorExit); + s.group[e.ke].mon[e.id].coSpawnProcessor.stdin.pause() + s.group[e.ke].mon[e.id].coSpawnProcessor.kill() + delete(s.group[e.ke].mon[e.id].coSpawnProcessor) + s.log(e,{type:lang['coProcessor Stopped'],msg:{msg:lang.coProcessorTextStopped+' : '+e.id}}); + } +} +s.ffmpeg = function(e){ + e.coProcessor = false + e.isStreamer = (e.type === 'dashcam'|| e.type === 'socket') + if(e.details.accelerator === '1' && e.details.hwaccel_vcodec !== 'auto' && e.isStreamer === false && (!e.details.input_maps || e.details.input_maps.length === 0)){ + e.coProcessor = true } //set X for temporary values so we don't break our main monitor object. var x={tmp:''}; @@ -1515,11 +1923,11 @@ s.ffmpeg=function(e){ //input - stream loop (good for static files/lists) if(e.details.stream_loop==='1'){x.cust_input+=' -stream_loop -1'}; //input + if(e.details.cust_input.indexOf('-fflags') === -1){x.cust_input+=' -fflags +igndts'} switch(e.type){ case'h264': switch(e.protocol){ case'rtsp': - if(e.details.cust_input.indexOf('-fflags') === -1){x.cust_input+=' -fflags +igndts'} if(e.details.rtsp_transport&&e.details.rtsp_transport!==''&&e.details.rtsp_transport!=='no'){x.cust_input+=' -rtsp_transport '+e.details.rtsp_transport;} break; } @@ -1679,7 +2087,7 @@ s.ffmpeg=function(e){ if(e.details.preset_stream&&e.details.preset_stream!==''){x.preset_stream=' -preset '+e.details.preset_stream;}else{x.preset_stream=''} //stream - quality //hardware acceleration - if(e.details.accelerator&&e.details.accelerator==='1'){ + if(e.details.accelerator && e.details.accelerator==='1' && e.isStreamer === false){ if(e.details.hwaccel&&e.details.hwaccel!==''){ x.hwaccel+=' -hwaccel '+e.details.hwaccel; } @@ -1721,7 +2129,7 @@ s.ffmpeg=function(e){ //stream - pipe build if(e.details.input_map_choices&&e.details.input_map_choices.stream){ //add input feed map - x.pipe += createFFmpegMap(e.details.input_map_choices.stream) + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices.stream) } if(e.details.stream_vcodec!=='copy'){ x.cust_stream+=x.stream_fps @@ -1757,19 +2165,25 @@ s.ffmpeg=function(e){ x.pipe+=x.preset_stream+x.stream_acodec+x.stream_vcodec+' -f hls'+x.cust_stream+' -hls_time '+x.hls_time+' -hls_list_size '+x.hls_list_size+' -start_number 0 -hls_allow_cache 0 -hls_flags +delete_segments+omit_endlist "'+e.sdir+'s.m3u8"'; break; case'mjpeg': - if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - x.pipe+=' -an -c:v mjpeg -f mpjpeg -boundary_tag shinobi'+x.cust_stream+x.stream_video_filters+' pipe:1'; + if(e.coProcessor === false){ + if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + x.pipe+=' -an -c:v mjpeg -f mpjpeg -boundary_tag shinobi'+x.cust_stream+x.stream_video_filters+' pipe:1'; + } break; case'pam': - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; - x.pipe+=' -an -c:v pam -pix_fmt rgba -f image2pipe'+x.cust_stream+x.stream_video_filters+' pipe:1'; + if(e.coProcessor === false){ + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; + x.pipe+=' -an -c:v pam -pix_fmt rgba -f image2pipe'+x.cust_stream+x.stream_video_filters+' pipe:1'; + } break; case'b64':case'':case undefined:case null://base64 - if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; - if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} - x.pipe+=' -an -c:v mjpeg -f image2pipe'+x.cust_stream+x.stream_video_filters+' pipe:1'; + if(e.coProcessor === false){ + if(e.details.stream_quality && e.details.stream_quality !== '')x.cust_stream+=' -q:v '+e.details.stream_quality; + if(x.dimensions && x.cust_stream.indexOf('-s ')===-1){x.cust_stream+=' -s '+x.dimensions} + x.pipe+=' -an -c:v mjpeg -f image2pipe'+x.cust_stream+x.stream_video_filters+' pipe:1'; + } break; default: x.pipe='' @@ -1777,56 +2191,64 @@ s.ffmpeg=function(e){ } if(e.details.stream_channels){ e.details.stream_channels.forEach(function(v,n){ - x.pipe+=createStreamChannel(n+config.pipeAddition,v) + x.pipe += s.createStreamChannel(e,n+config.pipeAddition,v) }) } //detector - plugins, motion if(e.details.detector==='1'&&e.details.detector_send_frames==='1'){ - if(e.details.input_map_choices&&e.details.input_map_choices.detector){ - //add input feed map - x.pipe += createFFmpegMap(e.details.input_map_choices.detector) - } - if(!e.details.detector_fps||e.details.detector_fps===''){e.details.detector_fps=2} - if(e.details.detector_scale_x&&e.details.detector_scale_x!==''&&e.details.detector_scale_y&&e.details.detector_scale_y!==''){x.dratio=' -s '+e.details.detector_scale_x+'x'+e.details.detector_scale_y}else{x.dratio=' -s 320x240'} - if(e.details.cust_detect&&e.details.cust_detect!==''){x.cust_detect+=e.details.cust_detect;} - if(e.details.detector_pam==='1'){ - x.pipe+=' -an -c:v pam -pix_fmt gray -f image2pipe -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:3' - if(e.details.detector_use_detect_object === '1'){ - //for object detection - x.pipe += createFFmpegMap(e.details.input_map_choices.detector) - x.pipe += ' -f singlejpeg -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:4'; + if(e.details.accelerator !== '1'){ + if(e.details.input_map_choices&&e.details.input_map_choices.detector){ + //add input feed map + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices.detector) + } + if(!e.details.detector_fps||e.details.detector_fps===''){e.details.detector_fps=2} + if(e.details.detector_scale_x&&e.details.detector_scale_x!==''&&e.details.detector_scale_y&&e.details.detector_scale_y!==''){x.dratio=' -s '+e.details.detector_scale_x+'x'+e.details.detector_scale_y}else{x.dratio=' -s 320x240'} + if(e.details.cust_detect&&e.details.cust_detect!==''){x.cust_detect+=e.details.cust_detect;} + if(e.details.detector_pam==='1'){ + x.pipe+=' -an -c:v pam -pix_fmt gray -f image2pipe -r '+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:3' + if(e.details.detector_use_detect_object === '1'){ + //for object detection + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices.detector) + x.pipe += ' -f singlejpeg -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:4'; + } + }else{ + x.pipe+=' -f singlejpeg -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:3'; } - }else{ - x.pipe+=' -f singlejpeg -vf fps='+e.details.detector_fps+x.cust_detect+x.dratio+' pipe:3'; } } //api - snapshot bin/ cgi.bin (JPEG Mode) - if(e.details.snap==='1'){ + if(e.details.snap === '1'){ if(e.details.input_map_choices&&e.details.input_map_choices.snap){ //add input feed map - x.pipe += createFFmpegMap(e.details.input_map_choices.snap) + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices.snap) + } + if(e.coProcessor === false){ + if(!e.details.snap_fps || e.details.snap_fps === ''){e.details.snap_fps = 1} + if(e.details.snap_vf && e.details.snap_vf !== ''){x.snap_vf=' -vf '+e.details.snap_vf}else{x.snap_vf=''} + if(e.details.snap_scale_x && e.details.snap_scale_x !== '' && e.details.snap_scale_y && e.details.snap_scale_y !== ''){x.snap_ratio = ' -s '+e.details.snap_scale_x+'x'+e.details.snap_scale_y}else{x.snap_ratio=''} + if(e.details.cust_snap && e.details.cust_snap !== ''){x.cust_snap = ' '+e.details.cust_snap}else{x.cust_snap=''} + x.pipe+=' -update 1 -r '+e.details.snap_fps+x.cust_snap+x.snap_ratio+x.snap_vf+' "'+e.sdir+'s.jpg" -y'; } - if(!e.details.snap_fps||e.details.snap_fps===''){e.details.snap_fps=1} - if(e.details.snap_vf&&e.details.snap_vf!==''){x.snap_vf=' -vf '+e.details.snap_vf}else{x.snap_vf=''} - if(e.details.snap_scale_x&&e.details.snap_scale_x!==''&&e.details.snap_scale_y&&e.details.snap_scale_y!==''){x.snap_ratio=' -s '+e.details.snap_scale_x+'x'+e.details.snap_scale_y}else{x.snap_ratio=''} - if(e.details.cust_snap&&e.details.cust_snap!==''){x.cust_snap=' '+e.details.cust_snap;}else{x.cust_snap=''} - x.pipe+=' -update 1 -r '+e.details.snap_fps+x.cust_snap+x.snap_ratio+x.snap_vf+' "'+e.sdir+'s.jpg" -y'; } //Traditional Recording Buffer if(e.details.detector=='1'&&e.details.detector_trigger=='1'&&e.details.detector_record_method==='sip'){ if(e.details.input_map_choices&&e.details.input_map_choices.detector_sip_buffer){ //add input feed map - x.pipe += createFFmpegMap(e.details.input_map_choices.detector_sip_buffer) + x.pipe += s.createFFmpegMap(e,e.details.input_map_choices.detector_sip_buffer) } x.detector_buffer_filters=[] if(!e.details.detector_buffer_vcodec||e.details.detector_buffer_vcodec===''||e.details.detector_buffer_vcodec==='auto'){ - switch(e.type){ - case'h264':case'hls':case'mp4': - e.details.detector_buffer_vcodec = 'copy' - break; - default: - e.details.detector_buffer_vcodec = 'libx264' - break; + if(e.details.accelerator === '1' && e.details.hwaccel_vcodec === 'cuvid' && e.details.hwaccel_vcodec === ('h264_cuvid' || 'hevc_cuvid' || 'mjpeg_cuvid' || 'mpeg4_cuvid')){ + e.details.detector_buffer_vcodec = 'h264_nvenc' + }else{ + switch(e.type){ + case'h264':case'hls':case'mp4': + e.details.detector_buffer_vcodec = 'copy' + break; + default: + e.details.detector_buffer_vcodec = 'libx264' + break; + } } } if(!e.details.detector_buffer_acodec||e.details.detector_buffer_acodec===''||e.details.detector_buffer_acodec==='auto'){ @@ -1873,6 +2295,10 @@ s.ffmpeg=function(e){ } x.pipe+=x.detector_buffer_fps+x.detector_buffer_acodec+' -c:v '+e.details.detector_buffer_vcodec+' -f hls -tune '+e.details.detector_buffer_tune+' -g '+e.details.detector_buffer_g+' -hls_time '+e.details.detector_buffer_hls_time+' -hls_list_size '+e.details.detector_buffer_hls_list_size+' -start_number '+e.details.detector_buffer_start_number+' -live_start_index '+e.details.detector_buffer_live_start_index+' -hls_allow_cache 0 -hls_flags +delete_segments+omit_endlist "'+e.sdir+'detectorStream.m3u8"' } + if(e.coProcessor === true){ + // the coProcessor ffmpeg consumes this HLS stream (no audio, frames only) + x.pipe += ' -q:v 1 -an -c:v copy -f hls -tune zerolatency -g 1 -hls_time 2 -hls_list_size 3 -start_number 0 -live_start_index 3 -hls_allow_cache 0 -hls_flags +delete_segments+omit_endlist "'+e.sdir+'cpuOnly.m3u8"' + } //custom - output if(e.details.custom_output&&e.details.custom_output!==''){x.pipe+=' '+e.details.custom_output;} //custom - input flags @@ -1883,7 +2309,7 @@ s.ffmpeg=function(e){ if(e.mode==='record'){ if(e.details.input_map_choices&&e.details.input_map_choices.record){ //add input feed map - x.record_string += createFFmpegMap(e.details.input_map_choices.record) + x.record_string += s.createFFmpegMap(e,e.details.input_map_choices.record) } //if h264, hls, mp4, or local add the audio codec flag switch(e.type){ @@ -1903,30 +2329,30 @@ s.ffmpeg=function(e){ //progress pipe // x.ffmpegCommandString += ' -progress pipe:5'; //add main input - if((e.type==='mp4'||e.type==='mjpeg')&&x.cust_input.indexOf('-re')===-1){ + if((e.type === 'mp4' || e.type === 'mjpeg') && x.cust_input.indexOf('-re') === -1){ x.cust_input += ' -re' } switch(e.type){ case'dashcam': - x.ffmpegCommandString += ' -i -'; + x.ffmpegCommandString += x.cust_input+x.hwaccel+' -i -'; break; case'socket':case'jpeg':case'pipe': - x.ffmpegCommandString += ' -pattern_type glob -f image2pipe'+x.record_fps+' -vcodec mjpeg'+x.cust_input+' -i -'; + x.ffmpegCommandString += ' -pattern_type glob -f image2pipe'+x.record_fps+' -vcodec mjpeg'+x.cust_input+x.hwaccel+' -i -'; break; case'mjpeg': - x.ffmpegCommandString += ' -reconnect 1 -f mjpeg'+x.cust_input+' -i "'+e.url+'"'; + x.ffmpegCommandString += ' -reconnect 1 -f mjpeg'+x.cust_input+x.hwaccel+' -i "'+e.url+'"'; break; case'h264':case'hls':case'mp4': x.ffmpegCommandString += x.cust_input+x.hwaccel+' -i "'+e.url+'"'; break; case'local': - x.ffmpegCommandString += x.cust_input+' -i "'+e.path+'"'; + x.ffmpegCommandString += x.cust_input+x.hwaccel+' -i "'+e.path+'"'; break; } //add extra input maps if(e.details.input_maps){ e.details.input_maps.forEach(function(v,n){ - x.ffmpegCommandString += createInputMap(n+1,v) + x.ffmpegCommandString += s.createInputMap(e,n+1,v) }) } //add recording and stream outputs @@ -1955,11 +2381,11 @@ s.file=function(x,e){ if(!e){return false;} return exec('rm -f '+e,{detached: true}); break; - case'delete_folder': + case'deleteFolder': if(!e){return false;} return exec('rm -rf '+e,{detached: true}); break; - case'delete_files': + case'deleteFiles': if(!e.age_type){e.age_type='min'};if(!e.age){e.age='1'}; exec('find '+e.path+' -type f -c'+e.age_type+' +'+e.age+' -exec rm -f {} +',{detached: true}); break; @@ -2004,7 +2430,10 @@ s.camera=function(x,e,cn,tx){ var monitorConfig = cn URLobject=URL.parse(e) if(monitorConfig.details.control_url_method === 'ONVIF' && monitorConfig.details.control_base_url === ''){ - URLobject.port = 8000 + if(monitorConfig.details.onvif_port === ''){ + monitorConfig.details.onvif_port = 8000 + } + URLobject.port = monitorConfig.details.onvif_port }else if(!URLobject.port){ URLobject.port = 80 } @@ -2281,6 +2710,7 @@ s.camera=function(x,e,cn,tx){ s.tx({viewers:e.ob,ke:e.ke,id:e.id},'MON_'+e.id); break; case'restart'://restart monitor + s.init('monitorStatus',{id:e.id,ke:e.ke,status:'Restarting'}); s.camera('stop',e) setTimeout(function(){ s.camera(e.mode,e) @@ -2335,6 +2765,11 @@ s.camera=function(x,e,cn,tx){ s.log(e,{type:lang['Monitor Idling'],msg:lang.MonitorIdlingText}); } } + var wantedStatus = lang.Stopped + if(x==='idle'){ + var wantedStatus = lang.Idle + } + s.init('monitorStatus',{id:e.id,ke:e.ke,status:wantedStatus}); break; case'start':case'record'://watch or record monitor url s.init(0,{ke:e.ke,mid:e.id}) @@ -2345,6 +2780,7 @@ s.camera=function(x,e,cn,tx){ return } //lock this function + s.init('monitorStatus',{id:e.id,ke:e.ke,status:lang.Starting}); s.group[e.ke].mon[e.id].started = 1; //create host string without username and password e.hosty = e.host.split('@'); @@ -2356,7 +2792,9 @@ s.camera=function(x,e,cn,tx){ e.hosty = e.hosty[0] } //set recording status + var wantedStatus = lang.Watching if(x==='record'){ + var wantedStatus = lang.Recording s.group[e.ke].mon[e.id].record.yes=1; }else{ s.group[e.ke].mon[e.mid].record.yes=0; @@ -2394,10 +2832,71 @@ s.camera=function(x,e,cn,tx){ if (!fs.existsSync(e.sdir)){ fs.mkdirSync(e.sdir); }else{ - s.file('delete_folder',e.sdir+'*') + s.file('deleteFolder',e.sdir+'*') } } setStreamDir() + //try to create HawkEye Onvif Object + if(e.details.is_onvif === '1'){ + console.log('onvifHawk',e.hosty, e.porty.replace(':',''), e.username, e.password) + var doOnvifHawk = true + var errorCount = 0 + var hawkFail = function(msg,callback){ + ++errorCount + if(errorCount > 2){ + callback() + s.log(e,msg); + } + } + var createHawkOnvif = function(){ + if(doOnvifHawk === false){ + return false + } + if(!e.details.onvif_port || e.details.onvif_port === ''){ + e.details.onvif_port = 8000 + } + onvifHawk.connect(e.hosty, e.details.onvif_port, e.username, e.password).then(function(results){ + var camera = results + // if the camera supports events, the module will already be loaded. + if (camera.events) { + camera.events.soap.username = e.username + camera.events.soap.password = e.password + camera.events.on('messages', messages => { + console.log('Messages Received:', (typeof messages)) + }) + camera.events.on('messages:error', error => { + if(error.body.indexOf('anonymous') > -1){ + hawkFail({type:lang.ONVIFEventsNotAvailable,msg:{msg:lang.ONVIFnotCompliantProfileT}},function(){ + camera.events.stopPull() + }) + } + }) + // start a pull event loop + setTimeout(function(){ + camera.events.startPull() + },3000) + // call stopPull() to end the event loop + // camera.events.stopPull() + s.group[e.ke].mon[e.id].HawkEyeOnvifConnection = camera + } + if(s.group[e.ke].mon[e.id].HawkEyeOnvifConnection){ + console.log('Found') + }else{ + console.log('Not Found') + } + }).catch(function(err){ + console.log('Error Connecting') + console.log(err.code) + hawkFail({type:lang.ONVIFEventsNotAvailable,msg:{msg:lang.ONVIFnotCompliantProfileT}},function(){ + doOnvifHawk = false + }) + setTimeout(function(){ + createHawkOnvif() + },3000) + }) + } + createHawkOnvif() + } //set up fatal error handler if(e.details.fatal_max===''){ e.details.fatal_max = 10 @@ -2405,9 +2904,7 @@ s.camera=function(x,e,cn,tx){ e.details.fatal_max = parseFloat(e.details.fatal_max) } var errorFatal = function(errorMessage){ - if(config.debugSystem === true){ - console.log(errorMessage,(new Error()).stack) - } + s.debugLog(errorMessage) clearTimeout(s.group[e.ke].mon[e.id].err_fatal_timeout); ++errorFatalCount; if(s.group[e.ke].mon[e.id].started===1){ @@ -2421,19 +2918,26 @@ s.camera=function(x,e,cn,tx){ }else{ s.kill(s.group[e.ke].mon[e.id].spawn,e); } + s.init('monitorStatus',{id:e.id,ke:e.ke,status:lang.Died}); } - errorFatalCount = 0; + var errorFatalCount = 0; + //cutoff time and recording check interval + if(!e.details.cutoff||e.details.cutoff===''){e.cutoff=15}else{e.cutoff=parseFloat(e.details.cutoff)}; + if(isNaN(e.cutoff)===true){e.cutoff=15} //set master based process launcher - launchMonitorProcesses = function(){ + var launchMonitorProcesses = function(){ + s.group[e.ke].mon[e.id].allowStdinWrite = false + s.txToDashcamUsers({ + f : 'disable_stream', + ke : e.ke, + mid : e.id + },e.ke) if(e.details.detector_trigger=='1'){ s.group[e.ke].mon[e.id].motion_lock=setTimeout(function(){ clearTimeout(s.group[e.ke].mon[e.id].motion_lock); delete(s.group[e.ke].mon[e.id].motion_lock); - },30000) + },15000) } - //cutoff time and recording check interval - if(!e.details.cutoff||e.details.cutoff===''){e.cutoff=15}else{e.cutoff=parseFloat(e.details.cutoff)}; - if(isNaN(e.cutoff)===true){e.cutoff=15} //start "no motion" checker if(e.details.detector=='1'&&e.details.detector_notrigger=='1'){ if(!e.details.detector_notrigger_timeout||e.details.detector_notrigger_timeout===''){ @@ -2445,7 +2949,7 @@ s.camera=function(x,e,cn,tx){ s.group[e.ke].mon[e.id].detector_notrigger_timeout_function=function(){ if(config.mail&&e.details.detector_notrigger_mail=='1'){ e.mailOptions = { - from: '"ShinobiCCTV" ', // sender address + from: config.mail.from, // sender address to: r.mail, // list of receivers subject: lang.NoMotionEmailText1+' '+e.name+' ('+e.id+')', // Subject line html: ''+lang.NoMotionEmailText2+' '+e.details.detector_notrigger_timeout+' '+lang.minutes+'.', @@ -2466,15 +2970,60 @@ s.camera=function(x,e,cn,tx){ s.group[e.ke].mon[e.id].detector_notrigger_timeout=setInterval(s.group[e.ke].mon[e.id].detector_notrigger_timeout_function,s.group[e.ke].mon[e.id].detector_notrigger_timeout) }) } + var resetRecordingCheck = function(){ + clearTimeout(s.group[e.ke].mon[e.id].checker) + var cutoff = e.cutoff + 0 + if(e.type === 'dashcam'){ + cutoff *= 100 + } + s.group[e.ke].mon[e.id].checker=setTimeout(function(){ + if(s.group[e.ke].mon[e.id].started === 1 && s.group[e.ke].mon_conf[e.id].mode === 'record'){ + launchMonitorProcesses(); + s.init('monitorStatus',{id:e.id,ke:e.ke,status:lang.Restarting}); + s.log(e,{type:lang['Camera is not recording'],msg:{msg:lang['Restarting Process']}}); + } + },60000 * cutoff * 1.1); + } var resetStreamCheck=function(){ clearTimeout(s.group[e.ke].mon[e.id].checkStream) - s.group[e.ke].mon[e.id].checkStream=setTimeout(function(){ + s.group[e.ke].mon[e.id].checkStream = setTimeout(function(){ if(s.group[e.ke].mon[e.id].started===1){ launchMonitorProcesses(); s.log(e,{type:lang['Camera is not streaming'],msg:{msg:lang['Restarting Process']}}); } },60000*1); } + if(e.details.snap === '1'){ + var resetSnapCheck = function(){ + clearTimeout(s.group[e.ke].mon[e.id].checkSnap) + s.group[e.ke].mon[e.id].checkSnap = setTimeout(function(){ + if(s.group[e.ke].mon[e.id].started === 1){ + fs.stat(e.sdir+'s.jpg',function(err,snap){ + var notStreaming = function(){ + if(e.coProcessor === true){ + s.coSpawnLauncher(e) + }else{ + launchMonitorProcesses() + } + s.log(e,{type:lang['Camera is not streaming'],msg:{msg:lang['Restarting Process']}}); + } + if(err){ + notStreaming() + }else{ + if(!e.checkSnapTime)e.checkSnapTime = snap.mtime + if(err || e.checkSnapTime === snap.mtime){ + e.checkSnapTime = snap.mtime + notStreaming() + }else{ + resetSnapCheck() + } + } + }) + } + },60000*1); + } + resetSnapCheck() + } if(config.childNodes.mode !== 'child' && s.platform!=='darwin' && (x==='record' || (x==='start'&&e.details.detector_record_method==='sip'))){ //check if ffmpeg is recording s.group[e.ke].mon[e.id].fswatch = fs.watch(e.dir, {encoding : 'utf8'}, (event, filename) => { @@ -2483,14 +3032,7 @@ s.camera=function(x,e,cn,tx){ s.group[e.ke].mon[e.id].open = filename.split('.')[0] break; case'change': - clearTimeout(s.group[e.ke].mon[e.id].checker) - clearTimeout(s.group[e.ke].mon[e.id].checkStream) - s.group[e.ke].mon[e.id].checker=setTimeout(function(){ - if(s.group[e.ke].mon[e.id].started===1){ - launchMonitorProcesses(); - s.log(e,{type:lang['Camera is not recording'],msg:{msg:lang['Restarting Process']}}); - } - },60000 * e.cutoff * 1.1); + resetRecordingCheck() break; } }); @@ -2520,7 +3062,18 @@ s.camera=function(x,e,cn,tx){ e.frames=0; if(!s.group[e.ke].mon[e.id].record){s.group[e.ke].mon[e.id].record={yes:1}}; //launch ffmpeg (main) - s.group[e.ke].mon[e.id].spawn = s.ffmpeg(e); + s.group[e.ke].mon[e.id].spawn = s.ffmpeg(e) + if(e.type === 'dashcam'){ + setTimeout(function(){ + s.group[e.ke].mon[e.id].allowStdinWrite = true + s.txToDashcamUsers({ + f : 'enable_stream', + ke : e.ke, + mid : e.id + },e.ke) + },30000) + } + s.init('monitorStatus',{id:e.id,ke:e.ke,status:wantedStatus}); //on unexpected exit restart s.group[e.ke].mon[e.id].spawn_exit=function(){ if(s.group[e.ke].mon[e.id].started===1){ @@ -2532,17 +3085,7 @@ s.camera=function(x,e,cn,tx){ } s.group[e.ke].mon[e.id].spawn.on('end',s.group[e.ke].mon[e.id].spawn_exit) s.group[e.ke].mon[e.id].spawn.on('exit',s.group[e.ke].mon[e.id].spawn_exit) - // -// s.group[e.ke].mon[e.id].spawn.stdio[5].on('data',function(data){ -// data = data.toString(); -// console.log('---') -// var json = {} -// data.split('\n').forEach(function(v){ -// var vv = v.split('=') -// json[vv[0]] = vv[1] -// }) -// console.log(json) -// }) + //emitter for mjpeg if(!e.details.stream_mjpeg_clients||e.details.stream_mjpeg_clients===''||isNaN(e.details.stream_mjpeg_clients)===false){e.details.stream_mjpeg_clients=20;}else{e.details.stream_mjpeg_clients=parseInt(e.details.stream_mjpeg_clients)} s.group[e.ke].mon[e.id].emitter = new events.EventEmitter().setMaxListeners(e.details.stream_mjpeg_clients); @@ -2630,120 +3173,30 @@ s.camera=function(x,e,cn,tx){ s.ocvTx({f:'init_monitor',id:e.id,ke:e.ke}) //frames from motion detect if(e.details.detector_pam==='1'){ - var width, - height, - globalSensitivity, - fullFrame = false - if(s.group[e.ke].mon_conf[e.id].details.detector_scale_x===''||s.group[e.ke].mon_conf[e.id].details.detector_scale_y===''){ - width = s.group[e.ke].mon_conf[e.id].details.detector_scale_x; - height = s.group[e.ke].mon_conf[e.id].details.detector_scale_y; - }else{ - width = e.width - height = e.height - } - if(e.details.detector_sensitivity===''){ - globalSensitivity = 10 - }else{ - globalSensitivity = parseInt(e.details.detector_sensitivity) - } - if(e.details.detector_frame==='1'){ - fullFrame={ - name:'FULL_FRAME', - sensitivity:globalSensitivity, - points:[ - [0,0], - [0,height], - [width,height], - [width,0] - ] - }; - } - var regions = s.createPamDiffRegionArray(s.group[e.ke].mon_conf[e.id].details.cords,globalSensitivity,fullFrame); - if(!s.group[e.ke].mon[e.id].noiseFilterArray)s.group[e.ke].mon[e.id].noiseFilterArray = {} - var noiseFilterArray = s.group[e.ke].mon[e.id].noiseFilterArray - Object.keys(regions.notForPam).forEach(function(name){ - if(!noiseFilterArray[name])noiseFilterArray[name]=[]; - }) - s.group[e.ke].mon[e.id].pamDiff = new PamDiff({grayscale: 'luminosity', regions : regions.forPam}); - s.group[e.ke].mon[e.id].p2p = new P2P(); - var sendTrigger = function(trigger){ - var detectorObject = { - f:'trigger', - id:e.id, - ke:e.ke, - name:trigger.name, - details:{ - plug:'built-in', - name:trigger.name, - reason:'motion', - confidence:trigger.percent, - }, - plates:[], - imgHeight:height, - imgWidth:width + if(e.coProcessor === false){ + s.createPamDiffEngine(e) + s.group[e.ke].mon[e.id].spawn.stdio[3].pipe(s.group[e.ke].mon[e.id].p2p).pipe(s.group[e.ke].mon[e.id].pamDiff) + if(e.details.detector_use_detect_object === '1'){ + s.group[e.ke].mon[e.id].spawn.stdio[4].on('data',function(d){ + s.group[e.ke].mon[e.id].lastJpegDetectorFrame = d + }) } - detectorObject.doObjectDetection = (s.ocv && e.details.detector_use_detect_object === '1') - s.camera('motion',detectorObject) - if(detectorObject.doObjectDetection === true){ - s.ocvTx({f:'frame',mon:s.group[e.ke].mon_conf[e.id].details,ke:e.ke,id:e.id,time:s.formattedTime(),frame:s.group[e.ke].mon[e.id].lastJpegDetectorFrame}); - } - } - var filterTheNoise = function(trigger){ - if(noiseFilterArray[trigger.name].length > 2){ - var thePreviousTriggerPercent = noiseFilterArray[trigger.name][noiseFilterArray[trigger.name].length - 1]; - var triggerDifference = trigger.percent - thePreviousTriggerPercent; - var noiseRange = e.details.detector_noise_filter_range - if(!noiseRange || noiseRange === ''){ - noiseRange = 6 - } - noiseRange = parseFloat(noiseRange) - if(((trigger.percent - thePreviousTriggerPercent) < noiseRange)||(thePreviousTriggerPercent - trigger.percent) > -noiseRange){ - noiseFilterArray[trigger.name].push(trigger.percent); - } - }else{ - noiseFilterArray[trigger.name].push(trigger.percent); - } - if(noiseFilterArray[trigger.name].length > 10){ - noiseFilterArray[trigger.name] = noiseFilterArray[trigger.name].splice(1,10) - } - var theNoise = 0; - noiseFilterArray[trigger.name].forEach(function(v,n){ - theNoise += v; - }) - theNoise = theNoise / noiseFilterArray[trigger.name].length; -// console.log(noiseFilterArray[trigger.name]) -// console.log(theNoise) - var triggerPercentWithoutNoise = trigger.percent - theNoise; - if(triggerPercentWithoutNoise > regions.notForPam[trigger.name].sensitivity){ - sendTrigger(trigger); - } - } - if(e.details.detector_noise_filter==='1'){ - s.group[e.ke].mon[e.id].pamDiff.on('diff', (data) => { - data.trigger.forEach(filterTheNoise) - }) - }else{ - s.group[e.ke].mon[e.id].pamDiff.on('diff', (data) => { - data.trigger.forEach(sendTrigger) - }) - } - - s.group[e.ke].mon[e.id].spawn.stdio[3].pipe(s.group[e.ke].mon[e.id].p2p).pipe(s.group[e.ke].mon[e.id].pamDiff) - if(e.details.detector_use_detect_object === '1'){ - s.group[e.ke].mon[e.id].spawn.stdio[4].on('data',function(d){ - s.group[e.ke].mon[e.id].lastJpegDetectorFrame = d - }) - } + } }else{ - s.group[e.ke].mon[e.id].spawn.stdio[3].on('data',function(d){ - s.ocvTx({f:'frame',mon:s.group[e.ke].mon_conf[e.id].details,ke:e.ke,id:e.id,time:s.formattedTime(),frame:d}); - }) + if(e.coProcessor === false){ + s.group[e.ke].mon[e.id].spawn.stdio[3].on('data',function(d){ + s.ocvTx({f:'frame',mon:s.group[e.ke].mon_conf[e.id].details,ke:e.ke,id:e.id,time:s.formattedTime(),frame:d}); + }) + } } } //frames to stream switch(e.details.stream_type){ case'mp4': s.group[e.ke].mon[e.id].mp4frag['MAIN'] = new Mp4Frag(); + s.group[e.ke].mon[e.id].mp4frag['MAIN'].on('error',function(error){ + s.log(e,{type:lang['Mp4Frag'],msg:{error:error}}) + }) s.group[e.ke].mon[e.id].spawn.stdio[1].pipe(s.group[e.ke].mon[e.id].mp4frag['MAIN']) break; case'flv': @@ -2791,7 +3244,11 @@ s.camera=function(x,e,cn,tx){ break; } if(e.frame_to_stream){ - s.group[e.ke].mon[e.id].spawn.stdout.on('data',e.frame_to_stream); + if(e.coProcessor === true && e.details.stream_type === ('b64'||'mjpeg')){ + + }else{ + s.group[e.ke].mon[e.id].spawn.stdout.on('data',e.frame_to_stream) + } } if(e.details.stream_channels&&e.details.stream_channels!==''){ var createStreamEmitter = function(channel,number){ @@ -2832,14 +3289,24 @@ s.camera=function(x,e,cn,tx){ e.details.stream_channels.forEach(createStreamEmitter) } if(x==='record'||e.type==='mjpeg'||e.type==='h264'||e.type==='local'){ + var checkLog = function(d,x){return d.indexOf(x)>-1;} s.group[e.ke].mon[e.id].spawn.stderr.on('data',function(d){ d=d.toString(); - e.chk=function(x){return d.indexOf(x)>-1;} switch(true){ + case checkLog(d,'[hls @'): + case checkLog(d,'Past duration'): + case checkLog(d,'Last message repeated'): + case checkLog(d,'pkt->duration = 0'): + case checkLog(d,'Non-monotonous DTS'): + case checkLog(d,'NULL @'): + case checkLog(d,'RTP: missed'): + case checkLog(d,'deprecated pixel format used'): + return + break; //mp4 output with webm encoder chosen - case e.chk('Could not find tag for vp8'): - case e.chk('Only VP8 or VP9 Video'): - case e.chk('Could not write header'): + case checkLog(d,'Could not find tag for vp8'): + case checkLog(d,'Only VP8 or VP9 Video'): + case checkLog(d,'Could not write header'): // switch(e.ext){ // case'mp4': // e.details.vcodec='libx264' @@ -2857,34 +3324,29 @@ s.camera=function(x,e,cn,tx){ // s.camera('restart',e) return s.log(e,{type:lang['Incorrect Settings Chosen'],msg:{msg:d}}) break; - case e.chk('NULL @'): - case e.chk('RTP: missed'): - case e.chk('deprecated pixel format used, make sure you did set range correctly'): - return - break; -// case e.chk('av_interleaved_write_frame'): - case e.chk('Connection refused'): - case e.chk('Connection timed out'): +// case checkLog(d,'av_interleaved_write_frame'): + case checkLog(d,'Connection refused'): + case checkLog(d,'Connection timed out'): //restart setTimeout(function(){ s.log(e,{type:lang['Connection timed out'],msg:lang['Retrying...']}); errorFatal('Connection timed out'); },1000) break; -// case e.chk('No such file or directory'): -// case e.chk('Unable to open RTSP for listening'): -// case e.chk('timed out'): -// case e.chk('Invalid data found when processing input'): -// case e.chk('Immediate exit requested'): -// case e.chk('reset by peer'): +// case checkLog(d,'No such file or directory'): +// case checkLog(d,'Unable to open RTSP for listening'): +// case checkLog(d,'timed out'): +// case checkLog(d,'Invalid data found when processing input'): +// case checkLog(d,'reset by peer'): // if(e.frames===0&&x==='record'){s.video('delete',e)}; // setTimeout(function(){ // if(!s.group[e.ke].mon[e.id].spawn){launchMonitorProcesses()} // },2000) // break; - case e.chk('mjpeg_decode_dc'): - case e.chk('bad vlc'): - case e.chk('error dc'): + case checkLog(d,'Immediate exit requested'): + case checkLog(d,'mjpeg_decode_dc'): + case checkLog(d,'bad vlc'): + case checkLog(d,'error dc'): launchMonitorProcesses() break; case /T[0-9][0-9]-[0-9][0-9]-[0-9][0-9]./.test(d): @@ -2911,12 +3373,18 @@ s.camera=function(x,e,cn,tx){ }) } s.group[e.ke].mon[e.id].detector_motion_count = 0 + resetRecordingCheck() return; break; } s.log(e,{type:"FFMPEG STDERR",msg:d}) }); } + if(e.coProcessor === true){ + setTimeout(function(){ + s.coSpawnLauncher(e) + },6000) + } }else{ s.log(e,{type:lang["Ping Failed"],msg:lang.skipPingText1}); errorFatal("Ping Failed");return; @@ -3027,6 +3495,8 @@ s.camera=function(x,e,cn,tx){ if(d.mon.details.detector_webhook=='1'){ var detector_webhook_url = d.mon.details.detector_webhook_url .replace(/{{TIME}}/g,s.timeObject(new Date).format()) + .replace(/{{REGION_NAME}}/g,d.details.name) + .replace(/{{SNAP_PATH}}/g,s.dir.streams+'/'+d.ke+'/'+d.id+'/s.jpg') .replace(/{{MONITOR_ID}}/g,d.id) .replace(/{{GROUP_KEY}}/g,d.ke) .replace(/{{DETAILS}}/g,detailString) @@ -3128,8 +3598,73 @@ s.camera=function(x,e,cn,tx){ }).end(); } + var screenshotName = 'Motion_'+(d.mon.name.replace(/[^\w\s]/gi,''))+'_'+d.id+'_'+d.ke+'_'+s.formattedTime() + var screenshotBuffer = null + var detectorStreamBuffers = null + + //discord bot + if(d.mon.details.detector_discordbot === '1' && !s.group[d.ke].mon[d.id].detector_discordbot){ + var detector_discordbot_timeout + if(!d.mon.details.detector_discordbot_timeout||d.mon.details.detector_discordbot_timeout===''){ + detector_discordbot_timeout = 1000*60*10; + }else{ + detector_discordbot_timeout = parseFloat(d.mon.details.detector_discordbot_timeout)*1000*60; + } + //lock mailer so you don't get emailed on EVERY trigger event. + s.group[d.ke].mon[d.id].detector_discordbot=setTimeout(function(){ + //unlock so you can mail again. + clearTimeout(s.group[d.ke].mon[d.id].detector_discordbot); + delete(s.group[d.ke].mon[d.id].detector_discordbot); + },detector_discordbot_timeout); + var files = [] + var sendAlert = function(){ + s.discordMsg({ + author: { + name: s.group[d.ke].mon_conf[d.id].name, + icon_url: "https://shinobi.video/libs/assets/icon/apple-touch-icon-152x152.png" + }, + title: lang.Event+' - '+screenshotName, + description: lang.EventText1+' '+s.timeObject(new Date).format(), + fields: [], + timestamp: new Date(), + footer: { + icon_url: "https://shinobi.video/libs/assets/icon/apple-touch-icon-152x152.png", + text: "Shinobi Systems" + } + },files,d.ke) + } + if(d.mon.details.detector_discordbot_send_video === '1'){ + if(!detectorStreamBuffers){ + detectorStreamBuffers = s.getDetectorStreams(d) + } + detectorStreamBuffers.slice(detectorStreamBuffers.length - 2,detectorStreamBuffers.length).forEach(function(filepath,n){ + files.push({ + attachment: filepath, + name: 'Video Clip '+n+'.ts' + }) + }) + } + if(screenshotBuffer){ + sendAlert() + }else if(d.mon.details.snap === '1'){ + fs.readFile(s.dir.streams+'/'+d.ke+'/'+d.id+'/s.jpg',function(err, frame){ + if(err){ + s.systemLog(lang.EventText2+' '+d.ke+' '+d.id,err) + }else{ + screenshotBuffer = frame + files.push({ + attachment: screenshotBuffer, + name: screenshotName+'.jpg' + }) + } + sendAlert() + }) + }else{ + sendAlert() + } + } //mailer - if(config.mail&&!s.group[d.ke].mon[d.id].detector_mail&&d.mon.details.detector_mail==='1'){ + if(config.mail && !s.group[d.ke].mon[d.id].detector_mail && d.mon.details.detector_mail === '1'){ s.sqlQuery('SELECT mail FROM Users WHERE ke=? AND details NOT LIKE ?',[d.ke,'%"sub"%'],function(err,r){ r=r[0]; var detector_mail_timeout @@ -3144,35 +3679,54 @@ s.camera=function(x,e,cn,tx){ clearTimeout(s.group[d.ke].mon[d.id].detector_mail); delete(s.group[d.ke].mon[d.id].detector_mail); },detector_mail_timeout); - d.frame_filename='Motion_'+(d.mon.name.replace(/[^\w\s]/gi, ''))+'_'+d.id+'_'+d.ke+'_'+s.formattedTime()+'.jpg'; - fs.readFile(s.dir.streams+'/'+d.ke+'/'+d.id+'/s.jpg',function(err, frame){ - d.mailOptions = { - from: '"ShinobiCCTV" ', // sender address - to: r.mail, // list of receivers - subject: lang.Event+' - '+d.frame_filename, // Subject line - html: ''+lang.EventText1+' '+s.timeObject(new Date).format()+'.', - }; - if(err){ - s.systemLog(lang.EventText2+' '+d.ke+' '+d.id,err) - }else{ - d.mailOptions.attachments=[ - { - filename: d.frame_filename, - content: frame - } - ] - d.mailOptions.html=''+lang.EventText3+'' - } - Object.keys(d.details).forEach(function(v,n){ - d.mailOptions.html+='
'+v+' : '+d.details[v]+'
' + var files = [] + var mailOptions = { + from: config.mail.from, // sender address + to: r.mail, // list of receivers + subject: lang.Event+' - '+screenshotName, // Subject line + html: ''+lang.EventText1+' '+s.timeObject(new Date).format()+'.', + attachments: files + } + var sendMail = function(){ + Object.keys(d.details).forEach(function(v,n){ + mailOptions.html+='
'+v+' : '+d.details[v]+'
' }) - nodemailer.sendMail(d.mailOptions, (error, info) => { + nodemailer.sendMail(mailOptions, (error, info) => { if (error) { s.systemLog(lang.MailError,error) - return ; + return false; } - }); - }) + }) + } + if(d.mon.details.detector_mail_send_video === '1'){ + if(!detectorStreamBuffers){ + detectorStreamBuffers = s.getDetectorStreams(d) + } + detectorStreamBuffers.slice(detectorStreamBuffers.length - 2,detectorStreamBuffers.length).forEach(function(filepath,n){ + files.push({ + filename: 'Video Clip '+n+'.ts', + content: fs.readFileSync(filepath) + }) + }) + } + if(screenshotBuffer){ + sendMail() + }else if(d.mon.details.snap === '1'){ + fs.readFile(s.dir.streams+'/'+d.ke+'/'+d.id+'/s.jpg',function(err, frame){ + if(err){ + s.systemLog(lang.EventText2+' '+d.ke+' '+d.id,err) + }else{ + screenshotBuffer = frame + files.push({ + filename: screenshotName+'.jpg', + content: frame + }) + } + sendMail() + }) + }else{ + sendMail() + } }); } if(d.mon.details.detector_command_enable==='1'&&!s.group[d.ke].mon[d.id].detector_command){ @@ -3189,6 +3743,8 @@ s.camera=function(x,e,cn,tx){ },detector_command_timeout); var detector_command = d.mon.details.detector_command .replace(/{{TIME}}/g,s.timeObject(new Date).format()) + .replace(/{{REGION_NAME}}/g,d.details.name) + .replace(/{{SNAP_PATH}}/g,s.dir.streams+'/'+d.ke+'/'+d.id+'/s.jpg') .replace(/{{MONITOR_ID}}/g,d.id) .replace(/{{GROUP_KEY}}/g,d.ke) .replace(/{{DETAILS}}/g,detailString) @@ -3774,57 +4330,67 @@ var tx; if(r&&r[0]){ r=r[0]; d.d=JSON.parse(r.details); - if(d.d.get_server_log==='1'){ - cn.join('GRPLOG_'+d.ke) - }else{ - cn.leave('GRPLOG_'+d.ke) - } - ///unchangeable from client side, so reset them in case they did. - d.form.details=JSON.parse(d.form.details) - //admin permissions - d.form.details.permissions=d.d.permissions - d.form.details.edit_size=d.d.edit_size - d.form.details.edit_days=d.d.edit_days - d.form.details.use_admin=d.d.use_admin - d.form.details.use_webdav=d.d.use_webdav - d.form.details.use_ldap=d.d.use_ldap - //check - if(d.d.edit_days=="0"){ - d.form.details.days=d.d.days; - } - if(d.d.edit_size=="0"){ - d.form.details.size=d.d.size; - } - if(d.d.sub){ - d.form.details.sub=d.d.sub; - if(d.d.monitors){d.form.details.monitors=d.d.monitors;} - if(d.d.allmonitors){d.form.details.allmonitors=d.d.allmonitors;} - if(d.d.video_delete){d.form.details.video_delete=d.d.video_delete;} - if(d.d.video_view){d.form.details.video_view=d.d.video_view;} - if(d.d.monitor_edit){d.form.details.monitor_edit=d.d.monitor_edit;} - if(d.d.size){d.form.details.size=d.d.size;} - if(d.d.days){d.form.details.days=d.d.days;} - delete(d.form.details.mon_groups) - } - var newSize = d.form.details.size - d.form.details=JSON.stringify(d.form.details) - /// - d.set=[],d.ar=[]; - if(d.form.pass&&d.form.pass!==''){d.form.pass=s.md5(d.form.pass);}else{delete(d.form.pass)}; - delete(d.form.password_again); - d.for=Object.keys(d.form); - d.for.forEach(function(v){ - d.set.push(v+'=?'),d.ar.push(d.form[v]); - }); - d.ar.push(d.ke),d.ar.push(d.uid); - s.sqlQuery('UPDATE Users SET '+d.set.join(',')+' WHERE ke=? AND uid=?',d.ar,function(err,r){ - if(!d.d.sub){ - s.group[d.ke].sizeLimit = parseFloat(newSize) - delete(s.group[d.ke].webdav) - s.init('apps',d) + if(!d.d.sub || d.d.user_change === "1"){ + if(d.d.get_server_log==='1'){ + cn.join('GRPLOG_'+d.ke) + }else{ + cn.leave('GRPLOG_'+d.ke) } - tx({f:'user_settings_change',uid:d.uid,ke:d.ke,form:d.form}); - }); + ///unchangeable from client side, so reset them in case they did. + d.form.details=JSON.parse(d.form.details) + //admin permissions + d.form.details.permissions=d.d.permissions + d.form.details.edit_size=d.d.edit_size + d.form.details.edit_days=d.d.edit_days + d.form.details.use_admin=d.d.use_admin + d.form.details.use_webdav=d.d.use_webdav + d.form.details.use_aws_s3=d.d.use_aws_s3 + d.form.details.use_ldap=d.d.use_ldap + //check + if(d.d.edit_days=="0"){ + d.form.details.days=d.d.days; + } + if(d.d.edit_size=="0"){ + d.form.details.size=d.d.size; + } + if(d.d.sub){ + d.form.details.sub=d.d.sub; + if(d.d.monitors){d.form.details.monitors=d.d.monitors;} + if(d.d.allmonitors){d.form.details.allmonitors=d.d.allmonitors;} + if(d.d.monitor_create){d.form.details.monitor_create=d.d.monitor_create;} + if(d.d.video_delete){d.form.details.video_delete=d.d.video_delete;} + if(d.d.video_view){d.form.details.video_view=d.d.video_view;} + if(d.d.monitor_edit){d.form.details.monitor_edit=d.d.monitor_edit;} + if(d.d.size){d.form.details.size=d.d.size;} + if(d.d.days){d.form.details.days=d.d.days;} + delete(d.form.details.mon_groups) + } + var newSize = d.form.details.size + d.form.details=JSON.stringify(d.form.details) + /// + d.set=[],d.ar=[]; + if(d.form.pass&&d.form.pass!==''){d.form.pass=s.md5(d.form.pass);}else{delete(d.form.pass)}; + delete(d.form.password_again); + d.for=Object.keys(d.form); + d.for.forEach(function(v){ + d.set.push(v+'=?'),d.ar.push(d.form[v]); + }); + d.ar.push(d.ke),d.ar.push(d.uid); + s.sqlQuery('UPDATE Users SET '+d.set.join(',')+' WHERE ke=? AND uid=?',d.ar,function(err,r){ + if(!d.d.sub){ + s.group[d.ke].sizeLimit = parseFloat(newSize) + delete(s.group[d.ke].webdav) + s.group[d.ke].aws = null + s.group[d.ke].aws_s3 = null + if(s.group[d.ke].discordBot && s.group[d.ke].discordBot.destroy){ + s.group[d.ke].discordBot.destroy() + delete(s.group[d.ke].discordBot) + } + s.init('apps',d) + } + tx({f:'user_settings_change',uid:d.uid,ke:d.ke,form:d.form}); + }); + } } }) break; @@ -3836,15 +4402,15 @@ var tx; switch(d.fff){ case'videos&events': if(!d.eventLimit){ - d.eventLimit=500 + d.eventLimit = 500 }else{ d.eventLimit = parseInt(d.eventLimit); } if(!d.eventStartDate&&d.startDate){ - d.eventStartDate=d.startDate + d.eventStartDate = s.stringToSqlTime(d.startDate) } if(!d.eventEndDate&&d.endDate){ - d.eventEndDate=d.endDate + d.eventEndDate = s.stringToSqlTime(d.endDate) } var monitorQuery = '' var monitorValues = [] @@ -3867,15 +4433,13 @@ var tx; var eventQuery = 'SELECT * FROM Events WHERE ke=?'; var eventQueryValues = [cn.ke]; if(d.eventStartDate&&d.eventStartDate!==''){ - d.eventStartDate=d.eventStartDate.replace('T',' ') if(d.eventEndDate&&d.eventEndDate!==''){ - d.eventEndDate=d.eventEndDate.replace('T',' ') eventQuery+=' AND `time` >= ? AND `time` <= ?'; - eventQueryValues.push(decodeURIComponent(d.eventStartDate)) - eventQueryValues.push(decodeURIComponent(d.eventEndDate)) + eventQueryValues.push(d.eventStartDate) + eventQueryValues.push(d.eventEndDate) }else{ eventQuery+=' AND `time` >= ?'; - eventQueryValues.push(decodeURIComponent(d.eventStartDate)) + eventQueryValues.push(d.eventStartDate) } } if(monitorValues.length>0){ @@ -3904,10 +4468,10 @@ var tx; eventQuery.push() } if(!d.videoStartDate&&d.startDate){ - d.videoStartDate=d.startDate + d.videoStartDate = s.stringToSqlTime(d.startDate) } if(!d.videoEndDate&&d.endDate){ - d.videoEndDate=d.endDate + d.videoEndDate = s.stringToSqlTime(d.endDate) } var getVideos = function(callback){ var videoQuery='SELECT * FROM Videos WHERE ke=?'; @@ -3921,19 +4485,15 @@ var tx; } switch(true){ case(d.videoStartDate&&d.videoStartDate!==''&&d.videoEndDate&&d.videoEndDate!==''): - d.videoStartDate=d.videoStartDate.replace('T',' ') - d.videoEndDate=d.videoEndDate.replace('T',' ') videoQuery+=' AND `time` '+d.videoStartDateOperator+' ? AND `end` '+d.videoEndDateOperator+' ?'; videoQueryValues.push(d.videoStartDate) videoQueryValues.push(d.videoEndDate) break; case(d.videoStartDate&&d.videoStartDate!==''): - d.videoStartDate=d.videoStartDate.replace('T',' ') videoQuery+=' AND `time` '+d.videoStartDateOperator+' ?'; videoQueryValues.push(d.videoStartDate) break; case(d.videoEndDate&&d.videoEndDate!==''): - d.videoEndDate=d.videoEndDate.replace('T',' ') videoQuery+=' AND `end` '+d.videoEndDateOperator+' ?'; videoQueryValues.push(d.videoEndDate) break; @@ -4193,8 +4753,11 @@ var tx; switch(d.ff){ case'update': s.ffmpegKill() - s.systemLog('Shinobi ordered to update',{by:cn.mail,ip:cn.ip,distro:d.distro}) - var updateProcess = spawn('sh',(__dirname+'/UPDATE.sh '+d.distro).split(' '),{detached: true}) + s.systemLog('Shinobi ordered to update',{ + by:cn.mail, + ip:cn.ip + }) + var updateProcess = spawn('sh',(__dirname+'/UPDATE.sh').split(' '),{detached: true}) updateProcess.stderr.on('data',function(data){ s.systemLog('Update Info',data.toString()) }) @@ -4243,6 +4806,8 @@ var tx; //check to see if custom key set if(!d.form.ke||d.form.ke===''){ d.form.ke=s.gid() + }else{ + d.form.ke = d.form.ke.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '') } //write user to db s.sqlQuery('INSERT INTO Users (ke,uid,mail,pass,details) VALUES (?,?,?,?,?)',[d.form.ke,d.form.uid,d.form.mail,s.md5(d.form.pass),d.form.details]) @@ -4262,34 +4827,43 @@ var tx; } break; case'edit': - if(d.form.pass&&d.form.pass!==''){ - if(d.form.pass===d.form.password_again){ - d.form.pass=s.md5(d.form.pass); - }else{ - s.tx({f:'error',ff:'account_edit',msg:lang["Passwords Don't Match"]},cn.id) - return - } - }else{ - delete(d.form.pass); - } - delete(d.form.password_again); - d.keys=Object.keys(d.form); - d.set=[]; - d.values=[]; - d.keys.forEach(function(v,n){ - if(d.set==='ke'||d.set==='password_again'||!d.form[v]){return} - d.set.push(v+'=?') - d.values.push(d.form[v]) - }) - d.values.push(d.account.mail) - s.sqlQuery('UPDATE Users SET '+d.set.join(',')+' WHERE mail=?',d.values,function(err,r) { - if(err){ - s.tx({f:'error',ff:'account_edit',msg:lang.AccountEditText1},cn.id) - return + s.sqlQuery('SELECT * FROM Users WHERE mail=?',[d.account.mail],function(err,r) { + if(r && r[0]){ + r = r[0] + var details = JSON.parse(r.details) + if(d.form.pass&&d.form.pass!==''){ + if(d.form.pass===d.form.password_again){ + d.form.pass=s.md5(d.form.pass); + }else{ + s.tx({f:'error',ff:'edit_account',msg:lang["Passwords Don't Match"]},cn.id) + return + } + }else{ + delete(d.form.pass); + } + delete(d.form.password_again); + d.keys=Object.keys(d.form); + d.set=[]; + d.values=[]; + d.keys.forEach(function(v,n){ + if(d.set==='ke'||d.set==='password_again'||!d.form[v]){return} + d.set.push(v+'=?') + if(v === 'details'){ + d.form[v] = JSON.stringify(Object.assign(details,JSON.parse(d.form[v]))) + } + d.values.push(d.form[v]) + }) + d.values.push(d.account.mail) + s.sqlQuery('UPDATE Users SET '+d.set.join(',')+' WHERE mail=?',d.values,function(err,r) { + if(err){ + s.tx({f:'error',ff:'edit_account',msg:lang.AccountEditText1},cn.id) + return + } + s.tx({f:'edit_account',form:d.form,ke:d.account.ke,uid:d.account.uid},'$'); + delete(s.group[d.account.ke].init); + s.init('apps',d.account) + }) } - s.tx({f:'edit_account',form:d.form,ke:d.account.ke,uid:d.account.uid},'$'); - delete(s.group[d.account.ke].init); - s.init('apps',d.account) }) break; case'delete': @@ -4338,10 +4912,24 @@ var tx; d.value=d.value.concat([d.ke,d.$uid]) s.sqlQuery("UPDATE Users SET "+d.condition.join(',')+" WHERE ke=? AND uid=?",d.value) s.tx({f:'edit_sub_account',ke:d.ke,uid:d.$uid,mail:d.mail,form:d.form},'ADM_'+d.ke); + s.sqlQuery("SELECT * FROM API WHERE ke=? AND uid=?",[d.ke,d.$uid],function(err,rows){ + if(rows && rows[0]){ + rows.forEach(function(row){ + delete(s.api[row.code]) + }) + } + }) break; case'delete': s.sqlQuery('DELETE FROM Users WHERE uid=? AND ke=? AND mail=?',[d.$uid,d.ke,d.mail]) - s.sqlQuery('DELETE FROM API WHERE uid=? AND ke=?',[d.$uid,d.ke]) + s.sqlQuery("SELECT * FROM API WHERE ke=? AND uid=?",[d.ke,d.$uid],function(err,rows){ + if(rows && rows[0]){ + rows.forEach(function(row){ + delete(s.api[row.code]) + }) + s.sqlQuery('DELETE FROM API WHERE uid=? AND ke=?',[d.$uid,d.ke]) + } + }) s.tx({f:'delete_sub_account',ke:d.ke,uid:d.$uid,mail:d.mail},'ADM_'+d.ke); break; } @@ -4360,21 +4948,59 @@ var tx; cn.ke=d.ke,cn.uid=d.uid,cn.auth=d.auth; if(!s.group[d.ke])s.group[d.ke]={}; if(!s.group[d.ke].users)s.group[d.ke].users={}; - s.group[d.ke].users[d.auth]={cnid:cn.id,uid:r.uid,mail:r.mail,details:JSON.parse(r.details),logged_in_at:s.timeObject(new Date).format(),login_type:'Streamer'} + if(!s.group[d.ke].dashcamUsers)s.group[d.ke].dashcamUsers={}; + s.group[d.ke].users[d.auth]={ + cnid:cn.id, + ke : d.ke, + uid:r.uid, + mail:r.mail, + details:JSON.parse(r.details), + logged_in_at:s.timeObject(new Date).format(), + login_type:'Streamer' + } + s.group[d.ke].dashcamUsers[d.auth] = s.group[d.ke].users[d.auth] + if(s.group[d.ke].mon){ + Object.keys(s.group[d.ke].mon).forEach(function(monitorId){ + var dataToClient = { + f : 'disable_stream', + mid : monitorId, + ke : d.ke + } + var mon = s.group[d.ke].mon[monitorId] + if(s.group[d.ke].mon_conf[monitorId].type === 'dashcam'){ + if(mon.allowStdinWrite === true){ + dataToClient.f = 'enable_stream' + } + s.tx(dataToClient,cn.id) + } + }) + } } }) }else{ - switch(d.f){ - case'monitor_chunk': - if(!s.group[d.ke]||!s.group[d.ke].mon[d.mid]){return} - if(s.group[d.ke].mon[d.mid].started!==1){s.tx({error:'Not Started'},cn.id);return false}; - s.group[d.ke].mon[d.mid].spawn.stdin.write(new Buffer(d.chunk, "binary")); - break; - case'monitor_frame': - if(!s.group[d.ke]||!s.group[d.ke].mon[d.mid]){return} - if(s.group[d.ke].mon[d.mid].started!==1){s.tx({error:'Not Started'},cn.id);return false}; - s.group[d.ke].mon[d.mid].spawn.stdin.write(d.frame); - break; + if(s.group[d.ke] && s.group[d.ke].mon[d.mid]){ + if(s.group[d.ke].mon[d.mid].allowStdinWrite === true){ + switch(d.f){ + case'monitor_chunk': + if(s.group[d.ke].mon[d.mid].started!==1 || !s.group[d.ke].mon[d.mid].spawn || !s.group[d.ke].mon[d.mid].spawn.stdin){ + s.tx({error:'Not Started'},cn.id); + return false + }; + s.group[d.ke].mon[d.mid].spawn.stdin.write(new Buffer(d.chunk, "binary")); + break; + case'monitor_frame': + if(s.group[d.ke].mon[d.mid].started!==1){ + s.tx({error:'Not Started'},cn.id); + return false + }; + s.group[d.ke].mon[d.mid].spawn.stdin.write(d.frame); + break; + } + }else{ + s.tx({error:'Cannot Write Yet'},cn.id) + } + }else{ + s.tx({error:'Non Existant Monitor'},cn.id) } } }) @@ -4407,6 +5033,43 @@ var tx; break; } }) + //functions for retrieving cron announcements + cn.on('cron',function(d){ + if(d.f==='init'){ + if(config.cron.key){ + if(config.cron.key===d.cronKey){ + s.cron={started:moment(),last_run:moment(),id:cn.id}; + }else{ + cn.disconnect() + } + }else{ + s.cron={started:moment(),last_run:moment(),id:cn.id}; + } + }else{ + if(s.cron&&cn.id===s.cron.id){ + delete(d.cronKey) + switch(d.f){ + case'filters': + s.filterEvents(d.ff,d); + break; + case's.tx': + s.tx(d.data,d.to) + break; + case's.video': + s.video(d.data,d.file) + break; + case'start':case'end': + d.mid='_cron';s.log(d,{type:'cron',msg:d.msg}) + break; + default: + s.systemLog('CRON : ',d) + break; + } + }else{ + cn.disconnect() + } + } + }) cn.on('disconnect', function () { if(cn.socketVideoStream){ cn.closeSocketVideoStream() @@ -4426,6 +5089,7 @@ var tx; } s.log({ke:cn.ke,mid:'$USER'},{type:lang['Websocket Disconnected'],msg:{mail:s.group[cn.ke].users[cn.auth].mail,id:cn.uid,ip:cn.ip}}) delete(s.group[cn.ke].users[cn.auth]); + if(s.group[cn.ke].dashcamUsers && s.group[cn.ke].dashcamUsers[cn.auth])delete(s.group[cn.ke].dashcamUsers[cn.auth]); } } if(cn.pluginEngine){ @@ -4433,6 +5097,9 @@ var tx; s.tx({f:'plugin_engine_unplugged',plug:cn.pluginEngine},'CPU') delete(s.api[cn.pluginEngine]) } + if(cn.cron){ + delete(s.cron); + } if(cn.ocv){ s.tx({f:'detector_unplugged',plug:s.ocv.plug},'CPU') delete(s.ocv); @@ -4582,6 +5249,53 @@ s.superAuth=function(x,callback){ return true; } } +//get page URL +if(!config.baseURL){ + config.baseURL = "" +}else if(config.baseURL !== ''){ + config.baseURL = s.checkCorrectPathEnding(config.baseURL) +} +s.getOriginalUrl = function(req){ + var url + if(config.baseURL || config.baseURL === ''){ + url = config.baseURL + }else{ + url = req.protocol + '://' + req.get('host') + '/' + } + return url +} +//Render Configurations - Web Paths +if(config.webPaths === undefined){config.webPaths={}} + //main access URI + if(config.webPaths.home === undefined){config.webPaths.home='/'} + //Super User URI + if(config.webPaths.super === undefined){config.webPaths.super='/super'} + //Admin URI + if(config.webPaths.admin === undefined){config.webPaths.admin='/admin'} + //API Prefix + if(config.webPaths.apiPrefix === undefined){config.webPaths.apiPrefix='/'}else{config.webPaths.apiPrefix = s.checkCorrectPathEnding(config.webPaths.apiPrefix)} +//Render Configurations - Page Render Paths +if(config.renderPaths === undefined){config.renderPaths={}} + //login page + if(config.renderPaths.index === undefined){config.renderPaths.index='pages/index'} + //dashboard page + if(config.renderPaths.home === undefined){config.renderPaths.home='pages/home'} + //sub-account administration page + if(config.renderPaths.admin === undefined){config.renderPaths.admin='pages/admin'} + //superuser page + if(config.renderPaths.super === undefined){config.renderPaths.super='pages/super'} + //2-Factor Auth page + if(config.renderPaths.factorAuth === undefined){config.renderPaths.factorAuth='pages/factor'} + //Streamer v1 (Dashcam Prototype) page + if(config.renderPaths.streamer === undefined){config.renderPaths.streamer='pages/streamer'} + //Streamer v2 (Dashcam) page + if(config.renderPaths.dashcam === undefined){config.renderPaths.dashcam='pages/dashcam'} + //embeddable widget page + if(config.renderPaths.embed === undefined){config.renderPaths.embed='pages/embed'} + //mjpeg full screen page + if(config.renderPaths.mjpeg === undefined){config.renderPaths.mjpeg='pages/mjpeg'} + //gridstack only page + if(config.renderPaths.grid === undefined){config.renderPaths.grid='pages/grid'} ////Pages app.enable('trust proxy'); app.use('/libs',express.static(__dirname + '/web/libs')); @@ -4592,8 +5306,8 @@ app.set('view engine','ejs'); //add template handler if(config.renderPaths.handler!==undefined){require(__dirname+'/web/'+config.renderPaths.handler+'.js').addHandlers(s,app,io)} -//readme -app.get('/:auth/logout/:ke/:id', function (req,res){ +//logout +app.get(config.webPaths.apiPrefix+':auth/logout/:ke/:id', function (req,res){ if(s.group[req.params.ke]&&s.group[req.params.ke].users[req.params.auth]){ delete(s.api[req.params.auth]); delete(s.group[req.params.ke].users[req.params.auth]); @@ -4604,8 +5318,8 @@ app.get('/:auth/logout/:ke/:id', function (req,res){ } }); //main page -app.get(config.webPaths.index, function (req,res){ - res.render(config.renderPaths.index,{lang:lang,config:config,screen:'dashboard'},function(err,html){ +app.get(config.webPaths.home, function (req,res){ + res.render(config.renderPaths.index,{lang:lang,config:config,screen:'dashboard',originalURL:s.getOriginalUrl(req)},function(err,html){ if(err){ s.systemLog(err) } @@ -4614,7 +5328,7 @@ app.get(config.webPaths.index, function (req,res){ }); //admin page app.get(config.webPaths.admin, function (req,res){ - res.render(config.renderPaths.index,{lang:lang,config:config,screen:'admin'},function(err,html){ + res.render(config.renderPaths.index,{lang:lang,config:config,screen:'admin',originalURL:s.getOriginalUrl(req)},function(err,html){ if(err){ s.systemLog(err) } @@ -4623,7 +5337,8 @@ app.get(config.webPaths.admin, function (req,res){ }); //super page app.get(config.webPaths.super, function (req,res){ - res.render(config.renderPaths.index,{lang:lang,config:config,screen:'super'},function(err,html){ + + res.render(config.renderPaths.index,{lang:lang,config:config,screen:'super',originalURL:s.getOriginalUrl(req)},function(err,html){ if(err){ s.systemLog(err) } @@ -4631,7 +5346,7 @@ app.get(config.webPaths.super, function (req,res){ }) }); //update server -app.get('/:auth/update/:key', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/update/:key', function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); req.fn=function(user){ @@ -4650,7 +5365,7 @@ app.get('/:auth/update/:key', function (req,res){ s.auth(req.params,req.fn,res,req); }); //get user details by API key -app.get('/:auth/userInfo/:ke',function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/userInfo/:ke',function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -4661,10 +5376,14 @@ app.get('/:auth/userInfo/:ke',function (req,res){ },res,req); }) //register function -app.post('/:auth/register/:ke/:uid',function (req,res){ +app.post(config.webPaths.apiPrefix+':auth/register/:ke/:uid',function (req,res){ req.resp={ok:false}; res.setHeader('Content-Type', 'application/json'); s.auth(req.params,function(user){ + if(user.details.sub){ + res.end(user.lang['Not Permitted']) + return + } s.sqlQuery('SELECT * FROM Users WHERE uid=? AND ke=? AND details NOT LIKE ? LIMIT 1',[req.params.uid,req.params.ke,'%"sub"%'],function(err,u) { if(u&&u[0]){ if(req.body.mail!==''&&req.body.pass!==''){ @@ -4703,7 +5422,7 @@ s.deleteFactorAuth=function(r){ delete(s.factorAuth[r.ke]) } } -app.post(['/','/:screen'],function (req,res){ +app.post([config.webPaths.home,s.checkCorrectPathEnding(config.webPaths.home)+':screen'],function (req,res){ req.ip=req.headers['cf-connecting-ip']||req.headers["CF-Connecting-IP"]||req.headers["'x-forwarded-for"]||req.connection.remoteAddress; if(req.query.json=='true'){ res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -4715,6 +5434,7 @@ app.post(['/','/:screen'],function (req,res){ res.setHeader('Content-Type', 'application/json'); res.end(s.s(data, null, 3)) }else{ + data.originalURL = s.getOriginalUrl(req) data.screen=req.params.screen res.render(focus,data,function(err,html){ if(err){ @@ -4729,7 +5449,7 @@ app.post(['/','/:screen'],function (req,res){ res.setHeader('Content-Type', 'application/json'); res.end(s.s({ok:false}, null, 3)) }else{ - res.render(config.renderPaths.index,{failedLogin:true,lang:lang,config:config,screen:req.params.screen},function(err,html){ + res.render(config.renderPaths.index,{failedLogin:true,lang:lang,config:config,screen:req.params.screen,originalURL:s.getOriginalUrl(req)},function(err,html){ if(err){ s.systemLog(err) } @@ -4815,7 +5535,7 @@ app.post(['/','/:screen'],function (req,res){ if(!s.factorAuth[r.ke][r.uid]){ s.factorAuth[r.ke][r.uid]={key:s.nid(),user:r} r.mailOptions = { - from: '"ShinobiCCTV" ', + from: config.mail.from, to: r.mail, subject: r.lang['2-Factor Authentication'], html: r.lang['Enter this code to proceed']+' '+s.factorAuth[r.ke][r.uid].key+'. '+r.lang.FactorAuthText1, @@ -5014,7 +5734,7 @@ app.post(['/','/:screen'],function (req,res){ } }); // Get HLS stream (m3u8) -app.get(['/:auth/hls/:ke/:id/:file','/:auth/hls/:ke/:id/:channel/:file'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/hls/:ke/:id/:file',config.webPaths.apiPrefix+':auth/hls/:ke/:id/:channel/:file'], function (req,res){ res.header("Access-Control-Allow-Origin",req.headers.origin); req.fn=function(user){ s.checkChildProxy(req.params,function(){ @@ -5035,7 +5755,7 @@ app.get(['/:auth/hls/:ke/:id/:file','/:auth/hls/:ke/:id/:channel/:file'], functi s.auth(req.params,req.fn,res,req); }); //Get JPEG snap -app.get('/:auth/jpeg/:ke/:id/s.jpg', function(req,res){ +app.get(config.webPaths.apiPrefix+':auth/jpeg/:ke/:id/s.jpg', function(req,res){ res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ s.checkChildProxy(req.params,function(){ @@ -5049,7 +5769,7 @@ app.get('/:auth/jpeg/:ke/:id/s.jpg', function(req,res){ 'Cache-Control': 'no-cache', 'Pragma': 'no-cache' }); - res.on('finish',function(){res.end();delete(res)}); + res.on('finish',function(){res.end();}); if (fs.existsSync(req.dir)){ fs.createReadStream(req.dir).pipe(res); }else{ @@ -5059,7 +5779,7 @@ app.get('/:auth/jpeg/:ke/:id/s.jpg', function(req,res){ },res,req); }); //Get FLV stream -app.get(['/:auth/flv/:ke/:id/s.flv','/:auth/flv/:ke/:id/:channel/s.flv'], function(req,res) { +app.get([config.webPaths.apiPrefix+':auth/flv/:ke/:id/s.flv',config.webPaths.apiPrefix+':auth/flv/:ke/:id/:channel/s.flv'], function(req,res) { res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ s.checkChildProxy(req.params,function(){ @@ -5095,7 +5815,7 @@ app.get(['/:auth/flv/:ke/:id/s.flv','/:auth/flv/:ke/:id/:channel/s.flv'], functi },res,req) }) //montage - stand alone squished view with gridstackjs -app.get(['/:auth/grid/:ke','/:auth/grid/:ke/:group'], function(req,res) { +app.get([config.webPaths.apiPrefix+':auth/grid/:ke',config.webPaths.apiPrefix+':auth/grid/:ke/:group'], function(req,res) { res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ if(user.permissions.get_monitors==="0"){ @@ -5187,17 +5907,18 @@ app.get(['/:auth/grid/:ke','/:auth/grid/:ke/:group'], function(req,res) { config:config, lang:user.lang, $user:user, - monitors:r + monitors:r, + originalURL:s.getOriginalUrl(req) }); }) },res,req) }); //MJPEG feed // if query string `full=true` is not present then it will load the MJPEG data directly and not the iframe ready page. -app.get(['/:auth/mjpeg/:ke/:id','/:auth/mjpeg/:ke/:id/:channel'], function(req,res) { +app.get([config.webPaths.apiPrefix+':auth/mjpeg/:ke/:id',config.webPaths.apiPrefix+':auth/mjpeg/:ke/:id/:channel'], function(req,res) { res.header("Access-Control-Allow-Origin",req.headers.origin); if(req.query.full=='true'){ - res.render(config.renderPaths.mjpeg,{url:'/'+req.params.auth+'/mjpeg/'+req.params.ke+'/'+req.params.id}); + res.render(config.renderPaths.mjpeg,{url:'/'+req.params.auth+'/mjpeg/'+req.params.ke+'/'+req.params.id,originalURL:s.getOriginalUrl(req)}); res.end() }else{ s.auth(req.params,function(user){ @@ -5242,7 +5963,7 @@ app.get(['/:auth/mjpeg/:ke/:id','/:auth/mjpeg/:ke/:id/:channel'], function(req,r } }); //embed monitor -app.get(['/:auth/embed/:ke/:id','/:auth/embed/:ke/:id/:addon'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/embed/:ke/:id',config.webPaths.apiPrefix+':auth/embed/:ke/:id/:addon'], function (req,res){ res.header("Access-Control-Allow-Origin",req.headers.origin); req.params.protocol=req.protocol; s.auth(req.params,function(user){ @@ -5253,7 +5974,7 @@ app.get(['/:auth/embed/:ke/:id','/:auth/embed/:ke/:id/:addon'], function (req,re if(s.group[req.params.ke]&&s.group[req.params.ke].mon[req.params.id]){ if(s.group[req.params.ke].mon[req.params.id].started===1){ req.params.uid=user.uid; - res.render(config.renderPaths.embed,{data:req.params,baseUrl:req.protocol+'://'+req.hostname,config:config,lang:user.lang,mon:CircularJSON.parse(CircularJSON.stringify(s.group[req.params.ke].mon_conf[req.params.id]))}); + res.render(config.renderPaths.embed,{data:req.params,baseUrl:req.protocol+'://'+req.hostname,config:config,lang:user.lang,mon:CircularJSON.parse(CircularJSON.stringify(s.group[req.params.ke].mon_conf[req.params.id])),originalURL:s.getOriginalUrl(req)}); res.end() }else{ res.end(user.lang['Cannot watch a monitor that isn\'t running.']) @@ -5264,7 +5985,7 @@ app.get(['/:auth/embed/:ke/:id','/:auth/embed/:ke/:id/:addon'], function (req,re },res,req); }); // Get TV Channels (Monitor Streams) json -app.get(['/:auth/tvChannels/:ke','/:auth/tvChannels/:ke/:id','/get.php'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/tvChannels/:ke',config.webPaths.apiPrefix+':auth/tvChannels/:ke/:id','/get.php'], function (req,res){ req.ret={ok:false}; if(req.query.username&&req.query.password){ req.params.username = req.query.username @@ -5400,7 +6121,7 @@ app.get(['/:auth/tvChannels/:ke','/:auth/tvChannels/:ke/:id','/get.php'], functi s.auth(req.params,req.fn,res,req); }); // Get monitors json -app.get(['/:auth/monitor/:ke','/:auth/monitor/:ke/:id'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/monitor/:ke',config.webPaths.apiPrefix+':auth/monitor/:ke/:id'], function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -5432,6 +6153,9 @@ app.get(['/:auth/monitor/:ke','/:auth/monitor/:ke/:id'], function (req,res){ if(s.group[v.ke]&&s.group[v.ke].mon[v.mid]&&s.group[v.ke].mon[v.mid].watch){ r[n].currentlyWatching=Object.keys(s.group[v.ke].mon[v.mid].watch).length } + if(s.group[v.ke]&&s.group[v.ke].mon[v.mid]&&s.group[v.ke].mon[v.mid].watch){ + r[n].status = s.group[v.ke].mon[v.mid].monitorStatus + } var buildStreamURL = function(type,channelNumber){ var streamURL if(channelNumber){channelNumber = '/'+channelNumber}else{channelNumber=''} @@ -5483,11 +6207,15 @@ app.get(['/:auth/monitor/:ke','/:auth/monitor/:ke/:id'], function (req,res){ s.auth(req.params,req.fn,res,req); }); // Get videos json -app.get(['/:auth/videos/:ke','/:auth/videos/:ke/:id'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/videos/:ke',config.webPaths.apiPrefix+':auth/videos/:ke/:id'], function (req,res){ res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ - if(user.permissions.watch_videos==="0"||user.details.sub&&user.details.allmonitors!=='1'&&user.details.video_view.indexOf(req.params.id)===-1){ + var hasRestrictions = user.details.sub && user.details.allmonitors !== '1' + if( + user.permissions.watch_videos==="0" || + hasRestrictions && (!user.details.video_view || user.details.video_view.indexOf(req.params.id)===-1) + ){ res.end(s.s([])) return } @@ -5517,6 +6245,12 @@ app.get(['/:auth/videos/:ke','/:auth/videos/:ke/:id'], function (req,res){ } } if(req.query.start||req.query.end){ + if(req.query.start && req.query.start !== ''){ + req.query.start = s.stringToSqlTime(req.query.start) + } + if(req.query.end && req.query.end !== ''){ + req.query.end = s.stringToSqlTime(req.query.end) + } if(!req.query.startOperator||req.query.startOperator==''){ req.query.startOperator='>=' } @@ -5525,8 +6259,6 @@ app.get(['/:auth/videos/:ke','/:auth/videos/:ke/:id'], function (req,res){ } switch(true){ case(req.query.start&&req.query.start!==''&&req.query.end&&req.query.end!==''): - req.query.start=req.query.start.replace('T',' ') - req.query.end=req.query.end.replace('T',' ') req.sql+=' AND `time` '+req.query.startOperator+' ? AND `end` '+req.query.endOperator+' ?'; req.count_sql+=' AND `time` '+req.query.startOperator+' ? AND `end` '+req.query.endOperator+' ?'; req.ar.push(req.query.start) @@ -5535,14 +6267,12 @@ app.get(['/:auth/videos/:ke','/:auth/videos/:ke/:id'], function (req,res){ req.count_ar.push(req.query.end) break; case(req.query.start&&req.query.start!==''): - req.query.start=req.query.start.replace('T',' ') req.sql+=' AND `time` '+req.query.startOperator+' ?'; req.count_sql+=' AND `time` '+req.query.startOperator+' ?'; req.ar.push(req.query.start) req.count_ar.push(req.query.start) break; case(req.query.end&&req.query.end!==''): - req.query.end=req.query.end.replace('T',' ') req.sql+=' AND `end` '+req.query.endOperator+' ?'; req.count_sql+=' AND `end` '+req.query.endOperator+' ?'; req.ar.push(req.query.end) @@ -5562,22 +6292,22 @@ app.get(['/:auth/videos/:ke','/:auth/videos/:ke/:id'], function (req,res){ res.end(s.s({total:0,limit:req.query.limit,skip:0,videos:[]}, null, 3)); return } - s.sqlQuery(req.count_sql,req.count_ar,function(err,count){ - s.video('linkBuild',r,req.params.auth) - if(req.query.limit.indexOf(',')>-1){ - req.skip=parseInt(req.query.limit.split(',')[0]) - req.query.limit=parseInt(req.query.limit.split(',')[0]) - }else{ - req.skip=0 - req.query.limit=parseInt(req.query.limit) - } - res.end(s.s({isUTC:config.useUTC,total:count[0]['COUNT(*)'],limit:req.query.limit,skip:req.skip,videos:r}, null, 3)); - }) + s.sqlQuery(req.count_sql,req.count_ar,function(err,count){ + s.video('linkBuild',r,req.params.auth) + if(req.query.limit.indexOf(',')>-1){ + req.skip=parseInt(req.query.limit.split(',')[0]) + req.query.limit=parseInt(req.query.limit.split(',')[0]) + }else{ + req.skip=0 + req.query.limit=parseInt(req.query.limit) + } + res.end(s.s({isUTC:config.useUTC,total:count[0]['COUNT(*)'],limit:req.query.limit,skip:req.skip,videos:r}, null, 3)); + }) }) },res,req); }); // Get events json (motion logs) -app.get(['/:auth/events/:ke','/:auth/events/:ke/:id','/:auth/events/:ke/:id/:limit','/:auth/events/:ke/:id/:limit/:start','/:auth/events/:ke/:id/:limit/:start/:end'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/events/:ke',config.webPaths.apiPrefix+':auth/events/:ke/:id',config.webPaths.apiPrefix+':auth/events/:ke/:id/:limit',config.webPaths.apiPrefix+':auth/events/:ke/:id/:limit/:start',config.webPaths.apiPrefix+':auth/events/:ke/:id/:limit/:start/:end'], function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -5605,9 +6335,9 @@ app.get(['/:auth/events/:ke','/:auth/events/:ke/:id','/:auth/events/:ke/:id/:lim } } if(req.params.start&&req.params.start!==''){ - req.params.start=req.params.start.replace('T',' ') + req.params.start = s.stringToSqlTime(req.params.start) if(req.params.end&&req.params.end!==''){ - req.params.end=req.params.end.replace('T',' ') + req.params.end = s.stringToSqlTime(req.params.end) req.sql+=' AND `time` >= ? AND `time` <= ?'; req.ar.push(decodeURIComponent(req.params.start)) req.ar.push(decodeURIComponent(req.params.end)) @@ -5633,12 +6363,12 @@ app.get(['/:auth/events/:ke','/:auth/events/:ke/:id','/:auth/events/:ke/:id/:lim },res,req); }); // Get logs json -app.get(['/:auth/logs/:ke','/:auth/logs/:ke/:id'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/logs/:ke',config.webPaths.apiPrefix+':auth/logs/:ke/:id'], function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ - if(user.permissions.get_logs==="0"){ + if(user.permissions.get_logs==="0" || user.details.sub && user.details.view_logs !== '1'){ res.end(s.s([])) return } @@ -5660,6 +6390,25 @@ app.get(['/:auth/logs/:ke','/:auth/logs/:ke/:id'], function (req,res){ return; } } + if(req.query.start||req.query.end){ + if(!req.query.startOperator||req.query.startOperator==''){ + req.query.startOperator='>=' + } + if(!req.query.endOperator||req.query.endOperator==''){ + req.query.endOperator='<=' + } + if(req.query.start && req.query.start !== '' && req.query.end && req.query.end !== ''){ + req.query.start = s.stringToSqlTime(req.query.start) + req.query.end = s.stringToSqlTime(req.query.end) + req.sql+=' AND `time` '+req.query.startOperator+' ? AND `time` '+req.query.endOperator+' ?'; + req.ar.push(req.query.start) + req.ar.push(req.query.end) + }else if(req.query.start && req.query.start !== ''){ + req.query.start = s.stringToSqlTime(req.query.start) + req.sql+=' AND `time` '+req.query.startOperator+' ?'; + req.ar.push(req.query.start) + } + } if(!req.query.limit||req.query.limit==''){req.query.limit=50} req.sql+=' ORDER BY `time` DESC LIMIT '+req.query.limit+''; s.sqlQuery(req.sql,req.ar,function(err,r){ @@ -5677,7 +6426,7 @@ app.get(['/:auth/logs/:ke','/:auth/logs/:ke/:id'], function (req,res){ },res,req); }); // Get monitors online json -app.get('/:auth/smonitor/:ke', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/smonitor/:ke', function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -5712,12 +6461,13 @@ app.get('/:auth/smonitor/:ke', function (req,res){ s.auth(req.params,req.fn,res,req); }); // Monitor Add,Edit,Delete -app.all(['/:auth/configureMonitor/:ke/:id','/:auth/configureMonitor/:ke/:id/:f'], function (req,res){ +app.all([config.webPaths.apiPrefix+':auth/configureMonitor/:ke/:id',config.webPaths.apiPrefix+':auth/configureMonitor/:ke/:id/:f'], function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ - if(req.params.f!=='delete'){ + var hasRestrictions = user.details.sub && user.details.allmonitors !== '1' + if(req.params.f !== 'delete'){ if(!req.body.data&&!req.query.data){ req.ret.msg='No Monitor Data found.' res.end(s.s(req.ret, null, 3)) @@ -5736,7 +6486,10 @@ app.all(['/:auth/configureMonitor/:ke/:id','/:auth/configureMonitor/:ke/:id/:f'] } return } - if(!user.details.sub||user.details.allmonitors==='1'||user.details.monitor_edit.indexOf(req.monitor.mid)>-1){ + if(!user.details.sub || + user.details.allmonitors === '1' || + hasRestrictions && user.details.monitor_edit.indexOf(req.monitor.mid) >- 1 || + hasRestrictions && user.details.monitor_create === '1'){ if(req.monitor&&req.monitor.mid&&req.monitor.name){ req.set=[],req.ar=[]; req.monitor.mid=req.params.id.replace(/[^\w\s]/gi,'').replace(/ /g,''); @@ -5813,19 +6566,47 @@ app.all(['/:auth/configureMonitor/:ke/:id','/:auth/configureMonitor/:ke/:id/:f'] res.end(s.s(req.ret, null, 3)) } }else{ - if(!user.details.sub||user.details.allmonitors==='1'||user.details.monitor_edit.indexOf(req.params.id)>-1){ + if(!user.details.sub || user.details.allmonitors === '1' || user.details.monitor_edit.indexOf(req.params.id) > -1 || hasRestrictions && user.details.monitor_create === '1'){ s.log(s.group[req.params.ke].mon_conf[req.params.id],{type:'Monitor Deleted',msg:'by user : '+user.uid}); req.params.delete=1;s.camera('stop',req.params); s.tx({f:'monitor_delete',uid:user.uid,mid:req.params.id,ke:req.params.ke},'GRP_'+req.params.ke); s.sqlQuery('DELETE FROM Monitors WHERE ke=? AND mid=?',[req.params.ke,req.params.id]) +// s.sqlQuery('DELETE FROM Files WHERE ke=? AND mid=?',[req.params.ke,req.params.id]) + if(req.query.deleteFiles === 'true'){ + //videos + s.dir.addStorage.forEach(function(v,n){ + var videosDir = v.path+req.params.ke+'/'+req.params.id+'/' + fs.stat(videosDir,function(err,stat){ + if(!err){ + s.file('deleteFolder',videosDir) + } + }) + }) + var videosDir = s.dir.videos+req.params.ke+'/'+req.params.id+'/' + fs.stat(videosDir,function(err,stat){ + if(!err){ + s.file('deleteFolder',videosDir) + } + }) + //fileBin + var binDir = s.dir.fileBin+req.params.ke+'/'+req.params.id+'/' + fs.stat(binDir,function(err,stat){ + if(!err){ + s.file('deleteFolder',binDir) + } + }) + } req.ret.ok=true; req.ret.msg='Monitor Deleted by user : '+user.uid res.end(s.s(req.ret, null, 3)) + }else{ + req.ret.msg=user.lang['Not Permitted']; + res.end(s.s(req.ret, null, 3)) } } }) }) -app.get(['/:auth/monitor/:ke/:id/:f','/:auth/monitor/:ke/:id/:f/:ff','/:auth/monitor/:ke/:id/:f/:ff/:fff'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/monitor/:ke/:id/:f',config.webPaths.apiPrefix+':auth/monitor/:ke/:id/:f/:ff',config.webPaths.apiPrefix+':auth/monitor/:ke/:id/:f/:ff/:fff'], function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -5919,7 +6700,7 @@ app.get(['/:auth/monitor/:ke/:id/:f','/:auth/monitor/:ke/:id/:f/:ff','/:auth/mon },res,req); }) //get file from fileBin bin -app.get(['/:auth/fileBin/:ke','/:auth/fileBin/:ke/:id'],function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/fileBin/:ke',config.webPaths.apiPrefix+':auth/fileBin/:ke/:id'],function (req,res){ res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); req.fn=function(user){ @@ -5951,7 +6732,7 @@ app.get(['/:auth/fileBin/:ke','/:auth/fileBin/:ke/:id'],function (req,res){ s.auth(req.params,req.fn,res,req); }); //get file from fileBin bin -app.get('/:auth/fileBin/:ke/:id/:year/:month/:day/:file', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/fileBin/:ke/:id/:year/:month/:day/:file', function (req,res){ res.header("Access-Control-Allow-Origin",req.headers.origin); req.fn=function(user){ req.failed=function(){ @@ -5979,18 +6760,107 @@ app.get('/:auth/fileBin/:ke/:id/:year/:month/:day/:file', function (req,res){ } s.auth(req.params,req.fn,res,req); }); +//zip videos and get link from fileBin +app.get(config.webPaths.apiPrefix+':auth/zipVideos/:ke', function (req,res){ + res.header("Access-Control-Allow-Origin",req.headers.origin); + var failed = function(resp){ + res.setHeader('Content-Type', 'application/json'); + res.end(s.s(resp)) + } + if(req.query.videos && req.query.videos !== ''){ + s.auth(req.params,function(user){ + var videosSelected = JSON.parse(req.query.videos) + var where = [] + var values = [] + videosSelected.forEach(function(video){ + where.push("(ke=? AND mid=? AND `time`=?)") + if(!video.ke)video.ke = req.params.ke + values.push(video.ke) + values.push(video.mid) + var time = s.nameToTime(video.filename) + if(req.query.isUTC === 'true'){ + time = s.utcToLocal(time) + } + time = new Date(time) + values.push(time) + }) + s.sqlQuery('SELECT * FROM Videos WHERE '+where.join(' OR '),values,function(err,r){ + var resp = {ok:false} + if(r && r[0]){ + resp.ok = true + var zipDownload = null + var tempFiles = [] + var fileId = s.gid() + var fileBinDir = s.dir.fileBin+req.params.ke+'/' + var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' + var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Recordings.zip' + var zippedFile = fileBinDir+zippedFilename + var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile + res.on('close', () => { + if(zipDownload && zipDownload.destroy){ + zipDownload.destroy() + } + fs.unlink(zippedFile); + }) + if(!fs.existsSync(fileBinDir)){ + fs.mkdirSync(fileBinDir); + } + r.forEach(function(video){ + timeFormatted = s.formattedTime(video.time) + video.filename = timeFormatted+'.'+video.ext + var dir = s.video('getDir',video)+video.filename + var tempVideoFile = timeFormatted+' - '+video.mid+'.'+video.ext + fs.writeFileSync(fileBinDir+tempVideoFile, fs.readFileSync(dir)) + tempFiles.push(fileBinDir+tempVideoFile) + script += ' "'+tempVideoFile+'"' + }) + fs.writeFileSync(tempScript,script,'utf8') + var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) + zipCreate.stderr.on('data',function(data){ + s.log({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) + }) + zipCreate.on('exit',function(data){ + fs.unlinkSync(tempScript) + tempFiles.forEach(function(file){ + fs.unlink(file,function(){}) + }) + res.setHeader('Content-Disposition', 'attachment; filename="'+zippedFilename+'"') + var zipDownload = fs.createReadStream(zippedFile) + zipDownload.pipe(res) + zipDownload.on('error', function (error) { + s.log({ke:req.params.ke,mid:'$USER'},{title:'Zip Download Error',msg:error.toString()}) + if(zipDownload && zipDownload.destroy){ + zipDownload.destroy() + } + }); + zipDownload.on('close', function () { + res.end() + zipDownload.destroy(); + fs.unlinkSync(zippedFile); + }); + }) + }else{ + failed({ok:false,msg:'No Videos Found'}) + } + }) + },res,req); + }else{ + failed({ok:false,msg:'"videos" query variable is missing from request.'}) + } +}); // Get video file -app.get('/:auth/videos/:ke/:id/:file', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/videos/:ke/:id/:file', function (req,res){ s.auth(req.params,function(user){ if(user.permissions.watch_videos==="0"||user.details.sub&&user.details.allmonitors!=='1'&&user.details.monitors.indexOf(req.params.id)===-1){ res.end(user.lang['Not Permitted']) return } - var filename = s.nameToTime(req.params.file) + var time = s.nameToTime(req.params.file) if(req.query.isUTC === 'true'){ - filename = s.utcToLocal(filename) + time = s.utcToLocal(time) } - s.sqlQuery('SELECT * FROM Videos WHERE ke=? AND mid=? AND time=?',[req.params.ke,req.params.id,filename],function(err,r){ + time = new Date(time) + s.sqlQuery('SELECT * FROM Videos WHERE ke=? AND mid=? AND `time`=?',[req.params.ke,req.params.id,time],function(err,r){ if(r&&r[0]){ req.dir=s.video('getDir',r[0])+req.params.file if (fs.existsSync(req.dir)){ @@ -6031,7 +6901,7 @@ app.get('/:auth/videos/:ke/:id/:file', function (req,res){ },res,req); }); //motion trigger -app.get('/:auth/motion/:ke/:id', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/motion/:ke/:id', function (req,res){ s.auth(req.params,function(user){ if(req.query.data){ try{ @@ -6054,7 +6924,7 @@ app.get('/:auth/motion/:ke/:id', function (req,res){ },res,req); }) //hookTester trigger -app.get('/:auth/hookTester/:ke/:id', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/hookTester/:ke/:id', function (req,res){ res.setHeader('Content-Type', 'application/json'); s.auth(req.params,function(user){ s.log(req.params,{type:'Test',msg:'Hook Test'}) @@ -6062,7 +6932,7 @@ app.get('/:auth/hookTester/:ke/:id', function (req,res){ },res,req); }) //control trigger -app.get('/:auth/control/:ke/:id/:direction', function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/control/:ke/:id/:direction', function (req,res){ res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ @@ -6072,7 +6942,7 @@ app.get('/:auth/control/:ke/:id/:direction', function (req,res){ },res,req); }) //modify video file -app.get(['/:auth/videos/:ke/:id/:file/:mode','/:auth/videos/:ke/:id/:file/:mode/:f'], function (req,res){ +app.get([config.webPaths.apiPrefix+':auth/videos/:ke/:id/:file/:mode',config.webPaths.apiPrefix+':auth/videos/:ke/:id/:file/:mode/:f'], function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -6081,12 +6951,13 @@ app.get(['/:auth/videos/:ke/:id/:file/:mode','/:auth/videos/:ke/:id/:file/:mode/ res.end(user.lang['Not Permitted']) return } - var filename = s.nameToTime(req.params.file) + var time = s.nameToTime(req.params.file) if(req.query.isUTC === 'true'){ - filename = s.utcToLocal(filename) + time = s.utcToLocal(time) } - req.sql='SELECT * FROM Videos WHERE ke=? AND mid=? AND time=?'; - req.ar=[req.params.ke,req.params.id,filename]; + time = new Date(time) + req.sql='SELECT * FROM Videos WHERE ke=? AND mid=? AND `time`=?'; + req.ar=[req.params.ke,req.params.id,time]; s.sqlQuery(req.sql,req.ar,function(err,r){ if(r&&r[0]){ r=r[0];r.filename=s.formattedTime(r.time)+'.'+r.ext; @@ -6096,13 +6967,14 @@ app.get(['/:auth/videos/:ke/:id/:file/:mode','/:auth/videos/:ke/:id/:file/:mode/ s.video('fix',r) break; case'status': - req.params.f=parseInt(req.params.f) + r.f = 'video_edit' + r.status = parseInt(req.params.f) if(isNaN(req.params.f)||req.params.f===0){ req.ret.msg='Not a valid value.'; }else{ req.ret.ok=true; - s.sqlQuery('UPDATE Videos SET status=? WHERE ke=? AND mid=? AND time=?',[req.params.f,req.params.ke,req.params.id,filename]) - s.tx({f:'video_edit',status:req.params.f,filename:r.filename,mid:r.mid,ke:r.ke,time:s.nameToTime(r.filename),end:s.formattedTime(new Date,'YYYY-MM-DD HH:mm:ss')},'GRP_'+r.ke); + s.sqlQuery('UPDATE Videos SET status=? WHERE ke=? AND mid=? AND `time`=?',[req.params.f,req.params.ke,req.params.id,time]) + s.tx(r,'GRP_'+r.ke); } break; case'delete': @@ -6141,7 +7013,7 @@ app.all(['/streamIn/:ke/:id','/streamIn/:ke/:id/:feed'], function (req, res) { } }) //MP4 Stream -app.get(['/:auth/mp4/:ke/:id/:channel/s.mp4','/:auth/mp4/:ke/:id/s.mp4','/:auth/mp4/:ke/:id/:channel/s.ts','/:auth/mp4/:ke/:id/s.ts'], function (req, res) { +app.get([config.webPaths.apiPrefix+':auth/mp4/:ke/:id/:channel/s.mp4',config.webPaths.apiPrefix+':auth/mp4/:ke/:id/s.mp4',config.webPaths.apiPrefix+':auth/mp4/:ke/:id/:channel/s.ts',config.webPaths.apiPrefix+':auth/mp4/:ke/:id/s.ts'], function (req, res) { s.auth(req.params,function(user){ if(!s.group[req.params.ke] || !s.group[req.params.ke].mon[req.params.id]){ res.status(404); @@ -6184,11 +7056,11 @@ app.get(['/:auth/mp4/:ke/:id/:channel/s.mp4','/:auth/mp4/:ke/:id/s.mp4','/:auth/ }); //simulate RTSP over HTTP app.get([ - '/:auth/mpegts/:ke/:id/:feed/:file', - '/:auth/mpegts/:ke/:id/:feed/', - '/:auth/h264/:ke/:id/:feed/:file', - '/:auth/h264/:ke/:id/:feed', - '/:auth/h264/:ke/:id' + config.webPaths.apiPrefix+':auth/mpegts/:ke/:id/:feed/:file', + config.webPaths.apiPrefix+':auth/mpegts/:ke/:id/:feed/', + config.webPaths.apiPrefix+':auth/h264/:ke/:id/:feed/:file', + config.webPaths.apiPrefix+':auth/h264/:ke/:id/:feed', + config.webPaths.apiPrefix+':auth/h264/:ke/:id' ], function (req, res) { res.header("Access-Control-Allow-Origin",req.headers.origin); s.auth(req.params,function(user){ @@ -6221,7 +7093,7 @@ app.get([ },res,req); }); //FFprobe by API -app.get('/:auth/probe/:ke',function (req,res){ +app.get(config.webPaths.apiPrefix+':auth/probe/:ke',function (req,res){ req.ret={ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -6266,7 +7138,7 @@ app.get('/:auth/probe/:ke',function (req,res){ },res,req); }) //ONVIF requesting with Shinobi API structure -app.all(['/:auth/onvif/:ke/:id/:action','/:auth/onvif/:ke/:id/:service/:action'],function (req,res){ +app.all([config.webPaths.apiPrefix+':auth/onvif/:ke/:id/:action',config.webPaths.apiPrefix+':auth/onvif/:ke/:id/:service/:action'],function (req,res){ var response = {ok:false}; res.setHeader('Content-Type', 'application/json'); res.header("Access-Control-Allow-Origin",req.headers.origin); @@ -6541,9 +7413,9 @@ if(config.childNodes.enabled === true && config.childNodes.mode === 'master'){ filename:d.filename, mid:d.mid, ke:d.ke, - time:s.timeObject(d.startTime).format(), + time:d.startTime, size:d.filesize, - end:s.timeObject(d.endTime).format() + end:d.endTime },'GRP_'+d.ke,'video_view'); clearTimeout(s.group[d.ke].mon[d.mid].checker) clearTimeout(s.group[d.ke].mon[d.mid].checkStream) @@ -6692,6 +7564,10 @@ if(config.childNodes.mode === 'child'){ // }) // }) }else{ + //add Cloud Videos table, will remove in future + s.sqlQuery('CREATE TABLE IF NOT EXISTS `Cloud Videos` (`mid` varchar(50) NOT NULL,`ke` varchar(50) DEFAULT NULL,`href` text NOT NULL,`size` float DEFAULT NULL,`time` timestamp NULL DEFAULT NULL,`end` timestamp NULL DEFAULT NULL,`status` int(1) DEFAULT \'0\' COMMENT \'0:Complete,1:Read,2:Archive\',`details` text) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;',[],function(err){ + if(err)console.log(err) + }) //master node - startup functions setInterval(function(){ s.cpuUsage(function(cpu){ @@ -6718,6 +7594,7 @@ if(config.childNodes.mode === 'child'){ } s.systemLog(v.mail+' : '+lang.startUpText0+' : '+rr.length,v.size) s.init('group',v) + s.init('apps',v) s.systemLog(v.mail+' : '+lang.startUpText1,countFinished+'/'+count) if(countFinished===count){ s.systemLog(lang.startUpText4) @@ -6751,4 +7628,4 @@ if(config.childNodes.mode === 'child'){ } }) },1500) -} \ No newline at end of file +} diff --git a/cron.js b/cron.js index b257850..c8ad615 100644 --- a/cron.js +++ b/cron.js @@ -64,6 +64,7 @@ s.sqlDate = function(value){ return dateQueryFunction } s.sqlQuery = function(query,values,onMoveOn,hideLog){ + s.debugLog(query,values) if(!values){values=[]} var valuesNotFunction = true; if(typeof values === 'function'){ @@ -176,9 +177,9 @@ s.checkFilterRules=function(v,callback){ } //delete old videos with filter if(config.cron.deleteOld===true){ - v.d.filters.deleteOldByCron={ - "id":"deleteOldByCron", - "name":"deleteOldByCron", + v.d.filters.deleteOldVideosByCron={ + "id":"deleteOldVideosByCron", + "name":"deleteOldVideosByCron", "sort_by":"time", "sort_by_direction":"ASC", "limit":"", @@ -195,10 +196,13 @@ s.checkFilterRules=function(v,callback){ }] }; } + s.debugLog('Filters') var keys = Object.keys(v.d.filters) if(keys.length>0){ keys.forEach(function(m,current){ - var b=v.d.filters[m]; + // b = filter + var b = v.d.filters[m]; + s.debugLog(b) if(b.enabled==="1"){ b.ar=[v.ke]; b.sql=[]; @@ -223,6 +227,9 @@ s.checkFilterRules=function(v,callback){ } s.sqlQuery('SELECT * FROM Videos '+b.sql,b.ar,function(err,r){ if(r&&r[0]){ + if(r.length > 0 || config.debugLog === true){ + s.cx({f:'filterMatch',msg:r.length+' SQL rows match "'+m+'"',ke:v.ke,time:moment()}) + } b.cx={ f:'filters', name:b.name, @@ -233,10 +240,8 @@ s.checkFilterRules=function(v,callback){ }; if(b.archive==="1"){ s.cx({f:'filters',ff:'archive',videos:r,time:moment(),ke:v.ke,id:b.id}); - }else{ - if(b.delete==="1"){ - s.cx({f:'filters',ff:'delete',videos:r,time:moment(),ke:v.ke,id:b.id}); - } + }else if(b.delete==="1"){ + s.cx({f:'filters',ff:'delete',videos:r,time:moment(),ke:v.ke,id:b.id}); } if(b.email==="1"){ b.cx.ff='email'; @@ -277,21 +282,30 @@ s.deleteRowsWithNoVideo=function(v,callback){ if(evs&&evs[0]){ es.del=[];es.ar=[v.ke]; evs.forEach(function(ev){ - var details = JSON.parse(ev.details) - var filename = ev.time - var dir = s.getVideoDirectory(ev)+s.moment(filename)+'.'+ev.ext; - var fileExists = fs.existsSync(dir) - if(details.isUTC === true){ - filename = s.localToUtc(filename).format('YYYY-MM-DDTHH-mm-ss') - dir = s.getVideoDirectory(ev)+filename+'.'+ev.ext; - fileExists = fs.existsSync(dir) + var filename + var details + try{ + details = JSON.parse(ev.details) + }catch(err){ + if(details instanceof Object){ + details = ev.details + }else{ + details = {} + } } + var dir = s.getVideoDirectory(ev) + if(details.isUTC === true){ + filename = s.localToUtc(ev.time).format('YYYY-MM-DDTHH-mm-ss')+'.'+ev.ext + }else{ + filename = s.moment(ev.time)+'.'+ev.ext + } + fileExists = fs.existsSync(dir+filename) if(fileExists !== true){ s.video('delete',ev) s.tx({f:'video_delete',filename:filename+'.'+ev.ext,mid:ev.mid,ke:ev.ke,time:ev.time,end:s.moment(new Date,'YYYY-MM-DD HH:mm:ss')},'GRP_'+ev.ke); } }); - if(es.del.length>0){ + if(es.del.length>0 || config.debugLog === true){ s.cx({f:'deleteNoVideo',msg:es.del.length+' SQL rows with no file deleted',ke:v.ke,time:moment()}) } } @@ -310,8 +324,8 @@ s.deleteOldLogs=function(v,callback){ s.sqlQuery("DELETE FROM Logs WHERE ke=? AND `time` < "+s.sqlDate('? DAYS'),[v.ke,v.d.log_days],function(err,rrr){ callback() if(err)return console.error(err); - if(rrr.affectedRows && rrr.affectedRows.length>0){ - s.cx({f:'deleteLogs',msg:rrr.affectedRows+' SQL rows older than '+v.d.log_days+' days deleted',ke:v.ke,time:moment()}) + if(rrr.affectedRows && rrr.affectedRows.length>0 || config.debugLog === true){ + s.cx({f:'deleteLogs',msg:(rrr.affectedRows || 0)+' SQL rows older than '+v.d.log_days+' days deleted',ke:v.ke,time:moment()}) } }) }else{ @@ -325,8 +339,8 @@ s.deleteOldEvents=function(v,callback){ s.sqlQuery("DELETE FROM Events WHERE ke=? AND `time` < "+s.sqlDate('? DAYS'),[v.ke,v.d.event_days],function(err,rrr){ callback() if(err)return console.error(err); - if(rrr.affectedRows && rrr.affectedRows.length>0){ - s.cx({f:'deleteEvents',msg:rrr.affectedRows+' SQL rows older than '+v.d.event_days+' days deleted',ke:v.ke,time:moment()}) + if(rrr.affectedRows && rrr.affectedRows.length>0 || config.debugLog === true){ + s.cx({f:'deleteEvents',msg:(rrr.affectedRows || 0)+' SQL rows older than '+v.d.event_days+' days deleted',ke:v.ke,time:moment()}) } }) }else{ @@ -350,8 +364,8 @@ s.deleteOldFileBins=function(v,callback){ s.sqlQuery("DELETE"+fileBinQuery,[v.ke,v.d.fileBin_days],function(err,rrr){ callback() if(err)return console.error(err); - if(rrr.affectedRows && rrr.affectedRows.length>0){ - s.cx({f:'deleteFileBins',msg:rrr.affectedRows+' files older than '+v.d.fileBin_days+' days deleted',ke:v.ke,time:moment()}) + if(rrr.affectedRows && rrr.affectedRows.length>0 || config.debugLog === true){ + s.cx({f:'deleteFileBins',msg:(rrr.affectedRows || 0)+' files older than '+v.d.fileBin_days+' days deleted',ke:v.ke,time:moment()}) } }) }else{ @@ -366,7 +380,7 @@ s.deleteOldFileBins=function(v,callback){ s.checkForOrphanedFiles=function(v,callback){ if(config.cron.deleteOrphans===true){ var finish=function(count){ - if(count>0){ + if(count>0 || config.debugLog === true){ s.cx({f:'deleteOrphanedFiles',msg:count+' SQL rows with no database row deleted',ke:v.ke,time:moment()}) } callback() @@ -445,9 +459,9 @@ s.processUser = function(number,rows){ rr.forEach(function(b,m){ b.details=JSON.parse(b.details); if(b.details.max_keep_days&&b.details.max_keep_days!==''){ - v.d.filters['deleteOldByCron'+b.mid]={ - "id":'deleteOldByCron'+b.mid, - "name":'deleteOldByCron'+b.mid, + v.d.filters['deleteOldVideosByCron'+b.mid]={ + "id":'deleteOldVideosByCron'+b.mid, + "name":'deleteOldVideosByCron'+b.mid, "sort_by":"time", "sort_by_direction":"ASC", "limit":"", @@ -470,16 +484,17 @@ s.processUser = function(number,rows){ } }) s.deleteOldLogs(v,function(){ - s.debugLog('deleteOldLogs') + s.debugLog('--- deleteOldLogs Complete') s.deleteOldFileBins(v,function(){ - s.debugLog('deleteOldFileBins') + s.debugLog('--- deleteOldFileBins Complete') s.deleteOldEvents(v,function(){ - s.debugLog('deleteOldEvents') + s.debugLog('--- deleteOldEvents Complete') s.checkFilterRules(v,function(){ - s.debugLog('checkFilterRules') + s.debugLog('--- checkFilterRules Complete') s.deleteRowsWithNoVideo(v,function(){ - s.debugLog('deleteRowsWithNoVideo') + s.debugLog('--- deleteRowsWithNoVideo Complete') s.checkForOrphanedFiles(v,function(){ + s.debugLog('--- checkForOrphanedFiles Complete') //done user, unlock current, and do next s.overlapLock[v.ke]=false; s.processUser(number+1,rows) diff --git a/definitions/en_CA.json b/definitions/en_CA.json index 223b35e..37b9494 100644 --- a/definitions/en_CA.json +++ b/definitions/en_CA.json @@ -872,7 +872,7 @@ { "name": "detail=detector_sensitivity", "field": "Indifference", - "description": "How much Shinobi doesn't care about motion before doing something. The opposite of sensitivity; a lower number means it will trigger sooner. The value ranges up to 15(+) decimal places. 10 is default, 0.005 is pretty sensitive to motion changes. Note: If using Region Editor, leave this blank, and set indifference in the Region Editor (below).", + "description": "How much Shinobi doesn't care about motion before doing something. The opposite of sensitivity; a lower number means it will trigger sooner. The value ranges up to 15(+) decimal places. 10 is default, 0.005 is pretty sensitive to motion changes. Note: If using Region Editor, leave this blank, and set indifference in the Region Editor (above).", "default": "10", "example": "10", "possible": "" diff --git a/languages/en_CA.json b/languages/en_CA.json index 5fed55e..2815577 100644 --- a/languages/en_CA.json +++ b/languages/en_CA.json @@ -104,6 +104,8 @@ "Can View Streams": "Can View Streams", "Can View Videos": "Can View Videos", "Can View Monitor": "Can View Monitor", + "Can Change User Settings": "Can Change User Settings", + "Can Create and Delete Monitors": "Can Create and Delete Monitors", "Can Edit Monitor": "Can Edit Monitor", "Can Delete Videos": "Can Delete Videos", "Delete Video": "Delete Video", @@ -154,6 +156,8 @@ "FFmpegTip": "FFprobe is a simple multimedia streams analyzer. You can use it to output all kinds of information about an input including duration, frame rate, frame size, etc.", "Complete Stream URL": "Complete Stream URL", "ONVIF Scanner": "ONVIF Scanner", + "ONVIFEventsNotAvailable": "ONVIF Events not Available", + "ONVIFnotCompliantProfileT": "Camera is not ONVIF Profile T Compliant", "Scan Settings": "Scan Settings", "ONVIFnote": "Discover ONVIF devices on networks outside your own or leave it blank to scan your current network.
Username and Password can be left blank.", "Range or Single": "Range or Single", @@ -178,6 +182,14 @@ "Monitor Groups": "Monitor Groups", "Group Name": "Group Name", "WebDAV": "WebDAV", + "Amazon S3": "Amazon S3", + "Save Links to Database": "Save Links to Database", + "Bucket": "Bucket", + "Region": "Region", + "Amazon S3 Upload Error": "Amazon S3 Upload Error", + "aws_accessKeyId": "Access Key Id", + "aws_secretAccessKey": "Secret Access Key", + "Discord Bot": "Discord Bot", "URL": "URL", "Autosave": "Autosave", "Save Directory": "Save Directory", @@ -185,6 +197,8 @@ "Force Monitors Per Row": "Force Monitors Per Row", "Monitors per row": "Monitors per row for Montage", "Browser Console Log": "Browser Console Log", + "Log Stream": "Log Stream", + "Privileges": "Privileges", "All Monitors and Privileges": "All Monitors and Privileges", "Permissions": "Permissions", "Time-lapse Tool": "Time-lapse Tool", @@ -210,9 +224,13 @@ "Set to Watch Only": "Set to Watch Only", "Save as": "Save as", "Add New": "Add New", + "Zip and Download": "Zip and Download", + "Export Selected Videos": "Export Selected Videos", "Delete Selected Videos": "Delete Selected Videos", "DeleteSelectedVideosMsg": "Do you want to delete these videos? You cannot recover them.", + "ExportSelectedVideosMsg": "Do you want to export these videos? It may take some time to zip and download.", "clientStreamFailedattemptingReconnect": "Client side ctream check failed, attempting reconnect.", + "Export Video": "Export Video", "Delete Filter": "Delete Filter", "confirmDeleteFilter": "Do you want to delete this filter? You cannot recover it.", "Fix Video": "Fix Video", @@ -236,8 +254,8 @@ "ImportMonitorConfigurationText": "Doing this will overrwrite any changes currently not saved. Imported changes will only be applied when you press Save.", "Paste JSON here.": "Paste JSON here.", "Delete Monitor": "Delete Monitor", - "DeleteMonitorText": "Do you want to delete this monitor? You cannot recover it. The files for this ID will remain in the filesystem. If you choose to recreate a monitor with the same ID the videos and events will become visible in the dashboard.", - "DeleteMonitorsText": "Do you want to delete these monitors? You cannot recover them. The files for these IDs will remain in the filesystem. If you choose to recreate a monitor with one of the IDs the videos and events will become visible in the dashboard.", + "DeleteMonitorText": "Do you want to delete this monitor? You cannot recover it. You can choose for the files to remain in the filesystem. If you choose to recreate a monitor with the same ID the videos and events will become visible in the dashboard.", + "DeleteMonitorsText": "Do you want to delete these monitors? You cannot recover them. You can choose to keep the files for these IDs in the filesystem. If you choose to recreate a monitor with one of the IDs the videos and events will become visible in the dashboard.", "Invalid JSON": "Invalid JSON", "InvalidJSONText": "Please ensure this is a valid JSON string for Shinobi monitor configuration.", "Passwords don't match": "Passwords don't match", @@ -248,6 +266,7 @@ "Unable to Launch": "Unable to Launch", "UnabletoLaunchText": "Please save new monitor first. Then attempt to launch the region editor.", "NoVideosFoundForDateRange": "No Videos found in this date range. Try setting the start date further back.", + "NoLogsFoundForDateRange": "No Logs found in this date range. Try widening the date range.", "monitorEditFailedMaxReached": "Your account has reached the maximum number of cameras that can be created. Speak to an administrator if you would like this changed.", "in": "in", "ago": "ago", @@ -292,7 +311,7 @@ "noSpecialCharacters": "No spaces or special characters.", "NotesPlacholder": "Comments you want to leave for this cameras settings.", "InputText1": "This section tells Shinobi how to consume a stream. For optimal performance try tuning your camera's internal settings. Find the following options and set them as shown. To find your camera you can use the built in ONVIF Scanner of Shinobi. Some ONVIF cameras require the use of a management tool to modify their internal settings. If you can't find your cameras you can try ONVIF Device Manager for Windows.", - "InputText2": "
  • Framerate (FPS) : High : 10 - 15 FPS, Low : 2-5 FPS
  • I-frame interval : 80
  • Bit Rate Type : CBR (Constant Bit Rate)
  • Bit Rate : between 256kbps - 500kbps
", + "InputText2": "
  • Framerate (FPS) : High : 10 - 15 FPS, Low : 2-5 FPS
  • I-frame interval : 1
  • Bit Rate Type : VBR (Variable Bit Rate)
  • Bit Rate : between 256kbps - 1000kbps
", "InputText3": "If you need help figuring out what input type your camera is you can take a look in the Camera URLs List on the Shinobi website.", "StreamText": "

This section will designate the primary method of streaming out and its settings. This stream will be displayed in the dashboard. If you choose to use HLS, JPEG, or MJPEG then you can consume the stream through other programs.

Using JPEG stream essentially turns off the primary stream and uses the snapshot bin to get frames.

", "DetectorText": "

When the Width and Height boxes are shown you should set them to 640x480 or below. This will optimize the read speed of frames.

", @@ -368,7 +387,13 @@ "Allow Next Trigger": "Allow Next Trigger in Milliseconds", "Save Events to SQL": "Save Events to SQL", "Email on Trigger": "Email on Trigger Emails go to the main account holder's login address.", + "Attach Video Clip": "Attach Video Clip", + "Discord Alert on Trigger": "Discord Alert on Trigger", "Allow Next Email": "Allow Next Email in Minutes", + "Allow Next Discord Alert": "Allow Next Discord Alert in Minutes", + "DiscordFailedText": "Sending to Discord Failed", + "DiscordErrorText": "Sending to Discord caused an Error", + "DiscordNotEnabledText": "Discord Bot Not Enabled, Enable it in your Account Settings.", "How to Record": "How to Record", "Trigger Record": "Trigger Record", "Recording Timeout": "Recording Timeout in Minutes", @@ -431,6 +456,8 @@ "libx264": "libx264", "libx265": "libx265", "copy": "copy", + "Audio": "Audio", + "Mute Audio": "Mute Audio", "No Audio": "No Audio", "aac": "aac", "ac3": "ac3", @@ -493,6 +520,12 @@ "Camera is not recording": "Camera is not recording", "Camera is not streaming": "Camera is not streaming", "Restarting Process": "Restarting Process", + "Restarting": "Restarting", + "Starting": "Starting", + "Watching": "Watching", + "Recording": "Recording", + "Stopped": "Stopped", + "Died": "Died", "Restart": "Restart", "Monitor Stopped": "Monitor Stopped", "MonitorStoppedText": "Monitor session has been ordered to stop.", @@ -501,8 +534,21 @@ "NoMotionEmailText1": "No Motion for", "NoMotionEmailText2": "There hasn't been any motion detected on camera for", "Monitor Name": "Monitor Name", + "Mp4Frag": "Mp4Frag", + "Status Changed": "Status Changed", + "Monitor is now Idle": "Monitor is now Idle", + "Monitor is now Disabled": "Monitor is now Disabled", + "Monitor is now Watching": "Monitor is now Watching", + "Monitor is now Recording": "Monitor is now Recording", + "coProcessor": "coProcessor", + "coProcessor Stopped": "coProcessor Stopped", + "coProcessor Started": "coProcessor Started", + "coProcessorTextStarted": "coProcessor has started for CPU only outputs.", + "coProcessorTextStopped": "coProcessor has ended.", "Process Unexpected Exit": "Process Unexpected Exit", + "coProcess Unexpected Exit": "coProcess Unexpected Exit", "Process Crashed for Monitor": "Process Crashed for Monitor", + "coProcess Crashed for Monitor": "coProcess Crashed for Monitor", "FFmpegCantStart": "FFmpeg Couldn't Start", "FFmpegCantStartText": "The recording engine for this camera could not start. There may be something wrong with your camera configuration. If there are any logs other than this one please post them in the Issues on Github.", "JPEG Error": "JPEG Error", @@ -569,6 +615,8 @@ "Preview":"Preview", "Websocket Connected":"Websocket Connected", "Websocket Disconnected":"Websocket Disconnected", + "Token":"Token", + "Channel ID":"Channel ID", "New Authentication Token":"New Authentication Token", "All Logs":"All Logs", "For Group":"For Group", @@ -581,8 +629,11 @@ "in Days":"in Days", "Can edit how long to keep Logs":"Can edit how long to keep Logs", "Can use Admin Panel":"Can use Admin Panel", + "Can use Discord Bot":"Can use Discord Bot", "Can use WebDAV":"Can use WebDAV", + "Can use Amazon S3":"Can use Amazon S3", "Can use LDAP":"Can use LDAP", + "Can View Logs":"Can View Logs", "Can edit how long to keep Events":"Can edit how long to keep Events", "Leave blank for unlimited":"Leave blank for unlimited", "Limited":"Limited", diff --git a/package.json b/package.json index badfe02..86d398b 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,48 @@ { "name": "shinobi", - "version": "1.0.37", - "description": "CCTV and NVR in Node.js, Version : daf882caf6053a7c2c8f4e69427620356f8a440c", + "productName": "Shinobi", + "version": "1.0.38", + "description": "CCTV and NVR in Node.js", "main": "camera.js", + "bin": "camera.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "chmod +x INSTALL/start.sh && INSTALL/start.sh" }, "repository": { "type": "git", - "url": "git+https://github.com/moeiscool/Shinobi.git" + "url": "git+https://gitlab.com/Shinobi-Systems/Shinobi.git" }, - "author": "Moe Alam", + "author": "Moe Alam, Shinobi Systems", "bugs": { - "url": "https://github.com/ShinobiCCTV/Shinobi/issues" + "url": "https://gitlab.com/Shinobi-Systems/Shinobi/issues" }, - "homepage": "https://github.com/moeiscool/Shinobi#readme", + "homepage": "https://gitlab.com/Shinobi-Systems/Shinobi#readme", "dependencies": { "body-parser": "^1.15.2", "circular-json": "0.3.1", "connection-tester": "^0.1.1", - "chokidar": "^2.0.3", - "mp4frag": "^0.0.15", + "mp4frag": "^0.0.22", "ejs": "^2.5.5", "express": "^4.14.0", "jsonfile": "^3.0.1", "moment": "^2.17.0", "mysql": "^2.12.0", + "sqlite3": "^3.1.8", "knex": "^0.14.2", + "aws-sdk": "^2.279.1", "pam-diff": "^0.10.2", "pipe2pam": "^0.6.2", "nodemailer": "^4.0.1", "node-onvif": "^0.1.4", + "onvif-nvt": "0.2.8", "path": "^0.12.7", "request": "^2.79.0", "socket.io": "^1.7.1", "socket.io-client": "^1.7.2", "http-proxy": "^1.17.0", "webdav": "^0.3.1", + "discord.js": "^11.3.2", "ldapauth-fork": "^4.0.2" }, "devDependencies": {} diff --git a/web/libs/css/bootstrap4.min.css b/web/libs/css/bootstrap4.min.css new file mode 100644 index 0000000..e66b07a --- /dev/null +++ b/web/libs/css/bootstrap4.min.css @@ -0,0 +1,8468 @@ +/*! + * Bootstrap v4.0.0-beta (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +@media print { + *, + ::after, + ::before { + text-shadow: none!important; + box-shadow: none!important + } + a, + a:visited { + text-decoration: underline + } + abbr[title]::after { + content: " (" attr(title) ")" + } + pre { + white-space: pre-wrap!important + } + blockquote, + pre { + border: 1px solid #999; + page-break-inside: avoid + } + thead { + display: table-header-group + } + img, + tr { + page-break-inside: avoid + } + h2, + h3, + p { + orphans: 3; + widows: 3 + } + h2, + h3 { + page-break-after: avoid + } + .navbar { + display: none + } + .badge { + border: 1px solid #000 + } + .table { + border-collapse: collapse!important + } + .table td, + .table th { + background-color: #fff!important + } + .table-bordered td, + .table-bordered th { + border: 1px solid #ddd!important + } +} + +html { + box-sizing: border-box; + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: transparent +} + +*, +::after, +::before { + box-sizing: inherit +} + +@-ms-viewport { + width: device-width +} + +article, +aside, +dialog, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section { + display: block +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff +} + +[tabindex="-1"]:focus { + outline: 0!important +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: .5rem +} + +p { + margin-top: 0; + margin-bottom: 1rem +} + +abbr[data-original-title], +abbr[title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0 +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit +} + +dl, +ol, +ul { + margin-top: 0; + margin-bottom: 1rem +} + +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0 +} + +dt { + font-weight: 700 +} + +dd { + margin-bottom: .5rem; + margin-left: 0 +} + +blockquote { + margin: 0 0 1rem +} + +dfn { + font-style: italic +} + +b, +strong { + font-weight: bolder +} + +small { + font-size: 80% +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects +} + +a:hover { + color: #0056b3; + text-decoration: underline +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus, +a:not([href]):not([tabindex]):hover { + color: inherit; + text-decoration: none +} + +a:not([href]):not([tabindex]):focus { + outline: 0 +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto +} + +figure { + margin: 0 0 1rem +} + +img { + vertical-align: middle; + border-style: none +} + +svg:not(:root) { + overflow: hidden +} + +[role=button], +a, +area, +button, +input, +label, +select, +summary, +textarea { + -ms-touch-action: manipulation; + touch-action: manipulation +} + +table { + border-collapse: collapse +} + +caption { + padding-top: .75rem; + padding-bottom: .75rem; + color: #868e96; + text-align: left; + caption-side: bottom +} + +th { + text-align: left +} + +label { + display: inline-block; + margin-bottom: .5rem +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color +} + +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=reset], +[type=submit], +button, +html [type=button] { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + padding: 0; + border-style: none +} + +input[type=checkbox], +input[type=radio] { + box-sizing: border-box; + padding: 0 +} + +input[type=date], +input[type=datetime-local], +input[type=month], +input[type=time] { + -webkit-appearance: listbox +} + +textarea { + overflow: auto; + resize: vertical +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal +} + +progress { + vertical-align: baseline +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: none +} + +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button +} + +output { + display: inline-block +} + +summary { + display: list-item +} + +template { + display: none +} + +[hidden] { + display: none!important +} + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: .5rem; + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit +} + +.h1, +h1 { + font-size: 2.5rem +} + +.h2, +h2 { + font-size: 2rem +} + +.h3, +h3 { + font-size: 1.75rem +} + +.h4, +h4 { + font-size: 1.5rem +} + +.h5, +h5 { + font-size: 1.25rem +} + +.h6, +h6 { + font-size: 1rem +} + +.lead { + font-size: 1.25rem; + font-weight: 300 +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.1 +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.1 +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.1 +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.1 +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.small, +small { + font-size: 80%; + font-weight: 400 +} + +.mark, +mark { + padding: .2em; + background-color: #fcf8e3 +} + +.list-unstyled { + padding-left: 0; + list-style: none +} + +.list-inline { + padding-left: 0; + list-style: none +} + +.list-inline-item { + display: inline-block +} + +.list-inline-item:not(:last-child) { + margin-right: 5px +} + +.initialism { + font-size: 90%; + text-transform: uppercase +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #868e96 +} + +.blockquote-footer::before { + content: "\2014 \00A0" +} + +.img-fluid { + max-width: 100%; + height: auto +} + +.img-thumbnail { + padding: .25rem; + background-color: #fff; + border: 1px solid #ddd; + border-radius: .25rem; + transition: all .2s ease-in-out; + max-width: 100%; + height: auto +} + +.figure { + display: inline-block +} + +.figure-img { + margin-bottom: .5rem; + line-height: 1 +} + +.figure-caption { + font-size: 90%; + color: #868e96 +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace +} + +code { + padding: .2rem .4rem; + font-size: 90%; + color: #bd4147; + background-color: #f8f9fa; + border-radius: .25rem +} + +a>code { + padding: 0; + color: inherit; + background-color: inherit +} + +kbd { + padding: .2rem .4rem; + font-size: 90%; + color: #fff; + background-color: #212529; + border-radius: .2rem +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700 +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + font-size: 90%; + color: #212529 +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + background-color: transparent; + border-radius: 0 +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container { + margin-right: auto; + margin-left: auto; + padding-right: 15px; + padding-left: 15px; + width: 100% +} + +@media (min-width:576px) { + .container { + max-width: 540px + } +} + +@media (min-width:768px) { + .container { + max-width: 720px + } +} + +@media (min-width:992px) { + .container { + max-width: 960px + } +} + +@media (min-width:1200px) { + .container { + max-width: 1140px + } +} + +.container-fluid { + width: 100%; + margin-right: auto; + margin-left: auto; + padding-right: 15px; + padding-left: 15px; + width: 100% +} + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px +} + +.no-gutters { + margin-right: 0; + margin-left: 0 +} + +.no-gutters>.col, +.no-gutters>[class*=col-] { + padding-right: 0; + padding-left: 0 +} + +.col, +.col-1, +.col-10, +.col-11, +.col-12, +.col-2, +.col-3, +.col-4, +.col-5, +.col-6, +.col-7, +.col-8, +.col-9, +.col-auto, +.col-lg, +.col-lg-1, +.col-lg-10, +.col-lg-11, +.col-lg-12, +.col-lg-2, +.col-lg-3, +.col-lg-4, +.col-lg-5, +.col-lg-6, +.col-lg-7, +.col-lg-8, +.col-lg-9, +.col-lg-auto, +.col-md, +.col-md-1, +.col-md-10, +.col-md-11, +.col-md-12, +.col-md-2, +.col-md-3, +.col-md-4, +.col-md-5, +.col-md-6, +.col-md-7, +.col-md-8, +.col-md-9, +.col-md-auto, +.col-sm, +.col-sm-1, +.col-sm-10, +.col-sm-11, +.col-sm-12, +.col-sm-2, +.col-sm-3, +.col-sm-4, +.col-sm-5, +.col-sm-6, +.col-sm-7, +.col-sm-8, +.col-sm-9, +.col-sm-auto, +.col-xl, +.col-xl-1, +.col-xl-10, +.col-xl-11, +.col-xl-12, +.col-xl-2, +.col-xl-3, +.col-xl-4, +.col-xl-5, +.col-xl-6, +.col-xl-7, +.col-xl-8, +.col-xl-9, +.col-xl-auto { + position: relative; + width: 100%; + min-height: 1px; + padding-right: 15px; + padding-left: 15px +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none +} + +.col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% +} + +.order-1 { + -ms-flex-order: 1; + order: 1 +} + +.order-2 { + -ms-flex-order: 2; + order: 2 +} + +.order-3 { + -ms-flex-order: 3; + order: 3 +} + +.order-4 { + -ms-flex-order: 4; + order: 4 +} + +.order-5 { + -ms-flex-order: 5; + order: 5 +} + +.order-6 { + -ms-flex-order: 6; + order: 6 +} + +.order-7 { + -ms-flex-order: 7; + order: 7 +} + +.order-8 { + -ms-flex-order: 8; + order: 8 +} + +.order-9 { + -ms-flex-order: 9; + order: 9 +} + +.order-10 { + -ms-flex-order: 10; + order: 10 +} + +.order-11 { + -ms-flex-order: 11; + order: 11 +} + +.order-12 { + -ms-flex-order: 12; + order: 12 +} + +@media (min-width:576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-sm-1 { + -ms-flex-order: 1; + order: 1 + } + .order-sm-2 { + -ms-flex-order: 2; + order: 2 + } + .order-sm-3 { + -ms-flex-order: 3; + order: 3 + } + .order-sm-4 { + -ms-flex-order: 4; + order: 4 + } + .order-sm-5 { + -ms-flex-order: 5; + order: 5 + } + .order-sm-6 { + -ms-flex-order: 6; + order: 6 + } + .order-sm-7 { + -ms-flex-order: 7; + order: 7 + } + .order-sm-8 { + -ms-flex-order: 8; + order: 8 + } + .order-sm-9 { + -ms-flex-order: 9; + order: 9 + } + .order-sm-10 { + -ms-flex-order: 10; + order: 10 + } + .order-sm-11 { + -ms-flex-order: 11; + order: 11 + } + .order-sm-12 { + -ms-flex-order: 12; + order: 12 + } +} + +@media (min-width:768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-md-1 { + -ms-flex-order: 1; + order: 1 + } + .order-md-2 { + -ms-flex-order: 2; + order: 2 + } + .order-md-3 { + -ms-flex-order: 3; + order: 3 + } + .order-md-4 { + -ms-flex-order: 4; + order: 4 + } + .order-md-5 { + -ms-flex-order: 5; + order: 5 + } + .order-md-6 { + -ms-flex-order: 6; + order: 6 + } + .order-md-7 { + -ms-flex-order: 7; + order: 7 + } + .order-md-8 { + -ms-flex-order: 8; + order: 8 + } + .order-md-9 { + -ms-flex-order: 9; + order: 9 + } + .order-md-10 { + -ms-flex-order: 10; + order: 10 + } + .order-md-11 { + -ms-flex-order: 11; + order: 11 + } + .order-md-12 { + -ms-flex-order: 12; + order: 12 + } +} + +@media (min-width:992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-lg-1 { + -ms-flex-order: 1; + order: 1 + } + .order-lg-2 { + -ms-flex-order: 2; + order: 2 + } + .order-lg-3 { + -ms-flex-order: 3; + order: 3 + } + .order-lg-4 { + -ms-flex-order: 4; + order: 4 + } + .order-lg-5 { + -ms-flex-order: 5; + order: 5 + } + .order-lg-6 { + -ms-flex-order: 6; + order: 6 + } + .order-lg-7 { + -ms-flex-order: 7; + order: 7 + } + .order-lg-8 { + -ms-flex-order: 8; + order: 8 + } + .order-lg-9 { + -ms-flex-order: 9; + order: 9 + } + .order-lg-10 { + -ms-flex-order: 10; + order: 10 + } + .order-lg-11 { + -ms-flex-order: 11; + order: 11 + } + .order-lg-12 { + -ms-flex-order: 12; + order: 12 + } +} + +@media (min-width:1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100% + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: none + } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333% + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667% + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25% + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333% + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667% + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50% + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333% + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667% + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75% + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333% + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667% + } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100% + } + .order-xl-1 { + -ms-flex-order: 1; + order: 1 + } + .order-xl-2 { + -ms-flex-order: 2; + order: 2 + } + .order-xl-3 { + -ms-flex-order: 3; + order: 3 + } + .order-xl-4 { + -ms-flex-order: 4; + order: 4 + } + .order-xl-5 { + -ms-flex-order: 5; + order: 5 + } + .order-xl-6 { + -ms-flex-order: 6; + order: 6 + } + .order-xl-7 { + -ms-flex-order: 7; + order: 7 + } + .order-xl-8 { + -ms-flex-order: 8; + order: 8 + } + .order-xl-9 { + -ms-flex-order: 9; + order: 9 + } + .order-xl-10 { + -ms-flex-order: 10; + order: 10 + } + .order-xl-11 { + -ms-flex-order: 11; + order: 11 + } + .order-xl-12 { + -ms-flex-order: 12; + order: 12 + } +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 1rem; + background-color: transparent +} + +.table td, +.table th { + padding: .75rem; + vertical-align: top; + border-top: 1px solid #e9ecef +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #e9ecef +} + +.table tbody+tbody { + border-top: 2px solid #e9ecef +} + +.table .table { + background-color: #fff +} + +.table-sm td, +.table-sm th { + padding: .3rem +} + +.table-bordered { + border: 1px solid #e9ecef +} + +.table-bordered td, +.table-bordered th { + border: 1px solid #e9ecef +} + +.table-bordered thead td, +.table-bordered thead th { + border-bottom-width: 2px +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, .05) +} + +.table-hover tbody tr:hover { + background-color: rgba(0, 0, 0, .075) +} + +.table-primary, +.table-primary>td, +.table-primary>th { + background-color: #b8daff +} + +.table-hover .table-primary:hover { + background-color: #9fcdff +} + +.table-hover .table-primary:hover>td, +.table-hover .table-primary:hover>th { + background-color: #9fcdff +} + +.table-secondary, +.table-secondary>td, +.table-secondary>th { + background-color: #dddfe2 +} + +.table-hover .table-secondary:hover { + background-color: #cfd2d6 +} + +.table-hover .table-secondary:hover>td, +.table-hover .table-secondary:hover>th { + background-color: #cfd2d6 +} + +.table-success, +.table-success>td, +.table-success>th { + background-color: #c3e6cb +} + +.table-hover .table-success:hover { + background-color: #b1dfbb +} + +.table-hover .table-success:hover>td, +.table-hover .table-success:hover>th { + background-color: #b1dfbb +} + +.table-info, +.table-info>td, +.table-info>th { + background-color: #bee5eb +} + +.table-hover .table-info:hover { + background-color: #abdde5 +} + +.table-hover .table-info:hover>td, +.table-hover .table-info:hover>th { + background-color: #abdde5 +} + +.table-warning, +.table-warning>td, +.table-warning>th { + background-color: #ffeeba +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1 +} + +.table-hover .table-warning:hover>td, +.table-hover .table-warning:hover>th { + background-color: #ffe8a1 +} + +.table-danger, +.table-danger>td, +.table-danger>th { + background-color: #f5c6cb +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7 +} + +.table-hover .table-danger:hover>td, +.table-hover .table-danger:hover>th { + background-color: #f1b0b7 +} + +.table-light, +.table-light>td, +.table-light>th { + background-color: #fdfdfe +} + +.table-hover .table-light:hover { + background-color: #ececf6 +} + +.table-hover .table-light:hover>td, +.table-hover .table-light:hover>th { + background-color: #ececf6 +} + +.table-dark, +.table-dark>td, +.table-dark>th { + background-color: #c6c8ca +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe +} + +.table-hover .table-dark:hover>td, +.table-hover .table-dark:hover>th { + background-color: #b9bbbe +} + +.table-active, +.table-active>td, +.table-active>th { + background-color: rgba(0, 0, 0, .075) +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, .075) +} + +.table-hover .table-active:hover>td, +.table-hover .table-active:hover>th { + background-color: rgba(0, 0, 0, .075) +} + +.thead-inverse th { + color: #fff; + background-color: #212529 +} + +.thead-default th { + color: #495057; + background-color: #e9ecef +} + +.table-inverse { + color: #fff; + background-color: #212529 +} + +.table-inverse td, +.table-inverse th, +.table-inverse thead th { + border-color: #32383e +} + +.table-inverse.table-bordered { + border: 0 +} + +.table-inverse.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, .05) +} + +.table-inverse.table-hover tbody tr:hover { + background-color: rgba(255, 255, 255, .075) +} + +@media (max-width:991px) { + .table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -ms-overflow-style: -ms-autohiding-scrollbar + } + .table-responsive.table-bordered { + border: 0 + } +} + +.form-control { + display: block; + width: 100%; + padding: .5rem .75rem; + font-size: 1rem; + line-height: 1.25; + color: #495057; + background-color: #fff; + background-image: none; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0 +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0 +} + +.form-control::-webkit-input-placeholder { + color: #868e96; + opacity: 1 +} + +.form-control:-ms-input-placeholder { + color: #868e96; + opacity: 1 +} + +.form-control::placeholder { + color: #868e96; + opacity: 1 +} + +.form-control:disabled, +.form-control[readonly] { + background-color: #e9ecef; + opacity: 1 +} + +select.form-control:not([size]):not([multiple]) { + height: calc(2.25rem + 2px) +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff +} + +.form-control-file, +.form-control-range { + display: block +} + +.col-form-label { + padding-top: calc(.5rem - 1px * 2); + padding-bottom: calc(.5rem - 1px * 2); + margin-bottom: 0 +} + +.col-form-label-lg { + padding-top: calc(.5rem - 1px * 2); + padding-bottom: calc(.5rem - 1px * 2); + font-size: 1.25rem +} + +.col-form-label-sm { + padding-top: calc(.25rem - 1px * 2); + padding-bottom: calc(.25rem - 1px * 2); + font-size: .875rem +} + +.col-form-legend { + padding-top: .5rem; + padding-bottom: .5rem; + margin-bottom: 0; + font-size: 1rem +} + +.form-control-plaintext { + padding-top: .5rem; + padding-bottom: .5rem; + margin-bottom: 0; + line-height: 1.25; + border: solid transparent; + border-width: 1px 0 +} + +.form-control-plaintext.form-control-lg, +.form-control-plaintext.form-control-sm, +.input-group-lg>.form-control-plaintext.form-control, +.input-group-lg>.form-control-plaintext.input-group-addon, +.input-group-lg>.input-group-btn>.form-control-plaintext.btn, +.input-group-sm>.form-control-plaintext.form-control, +.input-group-sm>.form-control-plaintext.input-group-addon, +.input-group-sm>.input-group-btn>.form-control-plaintext.btn { + padding-right: 0; + padding-left: 0 +} + +.form-control-sm, +.input-group-sm>.form-control, +.input-group-sm>.input-group-addon, +.input-group-sm>.input-group-btn>.btn { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]), +.input-group-sm>select.form-control:not([size]):not([multiple]), +.input-group-sm>select.input-group-addon:not([size]):not([multiple]), +select.form-control-sm:not([size]):not([multiple]) { + height: calc(1.8125rem + 2px) +} + +.form-control-lg, +.input-group-lg>.form-control, +.input-group-lg>.input-group-addon, +.input-group-lg>.input-group-btn>.btn { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]), +.input-group-lg>select.form-control:not([size]):not([multiple]), +.input-group-lg>select.input-group-addon:not([size]):not([multiple]), +select.form-control-lg:not([size]):not([multiple]) { + height: calc(2.3125rem + 2px) +} + +.form-group { + margin-bottom: 1rem +} + +.form-text { + display: block; + margin-top: .25rem +} + +.form-row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px +} + +.form-row>.col, +.form-row>[class*=col-] { + padding-right: 5px; + padding-left: 5px +} + +.form-check { + position: relative; + display: block; + margin-bottom: .5rem +} + +.form-check.disabled .form-check-label { + color: #868e96 +} + +.form-check-label { + padding-left: 1.25rem; + margin-bottom: 0 +} + +.form-check-input { + position: absolute; + margin-top: .25rem; + margin-left: -1.25rem +} + +.form-check-input:only-child { + position: static +} + +.form-check-inline { + display: inline-block +} + +.form-check-inline .form-check-label { + vertical-align: middle +} + +.form-check-inline+.form-check-inline { + margin-left: .75rem +} + +.invalid-feedback { + display: none; + margin-top: .25rem; + font-size: .875rem; + color: #dc3545 +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + width: 250px; + padding: .5rem; + margin-top: .1rem; + font-size: .875rem; + line-height: 1; + color: #fff; + background-color: rgba(220, 53, 69, .8); + border-radius: .2rem +} + +.custom-select.is-valid, +.form-control.is-valid, +.was-validated .custom-select:valid, +.was-validated .form-control:valid { + border-color: #28a745 +} + +.custom-select.is-valid:focus, +.form-control.is-valid:focus, +.was-validated .custom-select:valid:focus, +.was-validated .form-control:valid:focus { + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.custom-select.is-valid~.invalid-feedback, +.custom-select.is-valid~.invalid-tooltip, +.form-control.is-valid~.invalid-feedback, +.form-control.is-valid~.invalid-tooltip, +.was-validated .custom-select:valid~.invalid-feedback, +.was-validated .custom-select:valid~.invalid-tooltip, +.was-validated .form-control:valid~.invalid-feedback, +.was-validated .form-control:valid~.invalid-tooltip { + display: block +} + +.form-check-input.is-valid+.form-check-label, +.was-validated .form-check-input:valid+.form-check-label { + color: #28a745 +} + +.custom-control-input.is-valid~.custom-control-indicator, +.was-validated .custom-control-input:valid~.custom-control-indicator { + background-color: rgba(40, 167, 69, .25) +} + +.custom-control-input.is-valid~.custom-control-description, +.was-validated .custom-control-input:valid~.custom-control-description { + color: #28a745 +} + +.custom-file-input.is-valid~.custom-file-control, +.was-validated .custom-file-input:valid~.custom-file-control { + border-color: #28a745 +} + +.custom-file-input.is-valid~.custom-file-control::before, +.was-validated .custom-file-input:valid~.custom-file-control::before { + border-color: inherit +} + +.custom-file-input.is-valid:focus, +.was-validated .custom-file-input:valid:focus { + box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25) +} + +.custom-select.is-invalid, +.form-control.is-invalid, +.was-validated .custom-select:invalid, +.was-validated .form-control:invalid { + border-color: #dc3545 +} + +.custom-select.is-invalid:focus, +.form-control.is-invalid:focus, +.was-validated .custom-select:invalid:focus, +.was-validated .form-control:invalid:focus { + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.custom-select.is-invalid~.invalid-feedback, +.custom-select.is-invalid~.invalid-tooltip, +.form-control.is-invalid~.invalid-feedback, +.form-control.is-invalid~.invalid-tooltip, +.was-validated .custom-select:invalid~.invalid-feedback, +.was-validated .custom-select:invalid~.invalid-tooltip, +.was-validated .form-control:invalid~.invalid-feedback, +.was-validated .form-control:invalid~.invalid-tooltip { + display: block +} + +.form-check-input.is-invalid+.form-check-label, +.was-validated .form-check-input:invalid+.form-check-label { + color: #dc3545 +} + +.custom-control-input.is-invalid~.custom-control-indicator, +.was-validated .custom-control-input:invalid~.custom-control-indicator { + background-color: rgba(220, 53, 69, .25) +} + +.custom-control-input.is-invalid~.custom-control-description, +.was-validated .custom-control-input:invalid~.custom-control-description { + color: #dc3545 +} + +.custom-file-input.is-invalid~.custom-file-control, +.was-validated .custom-file-input:invalid~.custom-file-control { + border-color: #dc3545 +} + +.custom-file-input.is-invalid~.custom-file-control::before, +.was-validated .custom-file-input:invalid~.custom-file-control::before { + border-color: inherit +} + +.custom-file-input.is-invalid:focus, +.was-validated .custom-file-input:invalid:focus { + box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25) +} + +.form-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center +} + +.form-inline .form-check { + width: 100% +} + +@media (min-width:576px) { + .form-inline label { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0 + } + .form-inline .form-group { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0 + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + .form-inline .form-control-plaintext { + display: inline-block + } + .form-inline .input-group { + width: auto + } + .form-inline .form-control-label { + margin-bottom: 0; + vertical-align: middle + } + .form-inline .form-check { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + margin-top: 0; + margin-bottom: 0 + } + .form-inline .form-check-label { + padding-left: 0 + } + .form-inline .form-check-input { + position: relative; + margin-top: 0; + margin-right: .25rem; + margin-left: 0 + } + .form-inline .custom-control { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0 + } + .form-inline .custom-control-indicator { + position: static; + display: inline-block; + margin-right: .25rem; + vertical-align: text-bottom + } + .form-inline .has-feedback .form-control-feedback { + top: 0 + } +} + +.btn { + display: inline-block; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: .5rem .75rem; + font-size: 1rem; + line-height: 1.25; + border-radius: .25rem; + transition: all .15s ease-in-out +} + +.btn:focus, +.btn:hover { + text-decoration: none +} + +.btn.focus, +.btn:focus { + outline: 0; + box-shadow: 0 0 0 3px rgba(0, 123, 255, .25) +} + +.btn.disabled, +.btn:disabled { + opacity: .65 +} + +.btn.active, +.btn:active { + background-image: none +} + +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc +} + +.btn-primary.focus, +.btn-primary:focus { + box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) +} + +.btn-primary.disabled, +.btn-primary:disabled { + background-color: #007bff; + border-color: #007bff +} + +.btn-primary.active, +.btn-primary:active, +.show>.btn-primary.dropdown-toggle { + background-color: #0069d9; + background-image: none; + border-color: #0062cc +} + +.btn-secondary { + color: #fff; + background-color: #868e96; + border-color: #868e96 +} + +.btn-secondary:hover { + color: #fff; + background-color: #727b84; + border-color: #6c757d +} + +.btn-secondary.focus, +.btn-secondary:focus { + box-shadow: 0 0 0 3px rgba(134, 142, 150, .5) +} + +.btn-secondary.disabled, +.btn-secondary:disabled { + background-color: #868e96; + border-color: #868e96 +} + +.btn-secondary.active, +.btn-secondary:active, +.show>.btn-secondary.dropdown-toggle { + background-color: #727b84; + background-image: none; + border-color: #6c757d +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34 +} + +.btn-success.focus, +.btn-success:focus { + box-shadow: 0 0 0 3px rgba(40, 167, 69, .5) +} + +.btn-success.disabled, +.btn-success:disabled { + background-color: #28a745; + border-color: #28a745 +} + +.btn-success.active, +.btn-success:active, +.show>.btn-success.dropdown-toggle { + background-color: #218838; + background-image: none; + border-color: #1e7e34 +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b +} + +.btn-info.focus, +.btn-info:focus { + box-shadow: 0 0 0 3px rgba(23, 162, 184, .5) +} + +.btn-info.disabled, +.btn-info:disabled { + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-info.active, +.btn-info:active, +.show>.btn-info.dropdown-toggle { + background-color: #138496; + background-image: none; + border-color: #117a8b +} + +.btn-warning { + color: #111; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-warning:hover { + color: #111; + background-color: #e0a800; + border-color: #d39e00 +} + +.btn-warning.focus, +.btn-warning:focus { + box-shadow: 0 0 0 3px rgba(255, 193, 7, .5) +} + +.btn-warning.disabled, +.btn-warning:disabled { + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-warning.active, +.btn-warning:active, +.show>.btn-warning.dropdown-toggle { + background-color: #e0a800; + background-image: none; + border-color: #d39e00 +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130 +} + +.btn-danger.focus, +.btn-danger:focus { + box-shadow: 0 0 0 3px rgba(220, 53, 69, .5) +} + +.btn-danger.disabled, +.btn-danger:disabled { + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-danger.active, +.btn-danger:active, +.show>.btn-danger.dropdown-toggle { + background-color: #c82333; + background-image: none; + border-color: #bd2130 +} + +.btn-light { + color: #111; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-light:hover { + color: #111; + background-color: #e2e6ea; + border-color: #dae0e5 +} + +.btn-light.focus, +.btn-light:focus { + box-shadow: 0 0 0 3px rgba(248, 249, 250, .5) +} + +.btn-light.disabled, +.btn-light:disabled { + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-light.active, +.btn-light:active, +.show>.btn-light.dropdown-toggle { + background-color: #e2e6ea; + background-image: none; + border-color: #dae0e5 +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124 +} + +.btn-dark.focus, +.btn-dark:focus { + box-shadow: 0 0 0 3px rgba(52, 58, 64, .5) +} + +.btn-dark.disabled, +.btn-dark:disabled { + background-color: #343a40; + border-color: #343a40 +} + +.btn-dark.active, +.btn-dark:active, +.show>.btn-dark.dropdown-toggle { + background-color: #23272b; + background-image: none; + border-color: #1d2124 +} + +.btn-outline-primary { + color: #007bff; + background-color: transparent; + background-image: none; + border-color: #007bff +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-outline-primary.focus, +.btn-outline-primary:focus { + box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) +} + +.btn-outline-primary.disabled, +.btn-outline-primary:disabled { + color: #007bff; + background-color: transparent +} + +.btn-outline-primary.active, +.btn-outline-primary:active, +.show>.btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.btn-outline-secondary { + color: #868e96; + background-color: transparent; + background-image: none; + border-color: #868e96 +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #868e96; + border-color: #868e96 +} + +.btn-outline-secondary.focus, +.btn-outline-secondary:focus { + box-shadow: 0 0 0 3px rgba(134, 142, 150, .5) +} + +.btn-outline-secondary.disabled, +.btn-outline-secondary:disabled { + color: #868e96; + background-color: transparent +} + +.btn-outline-secondary.active, +.btn-outline-secondary:active, +.show>.btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #868e96; + border-color: #868e96 +} + +.btn-outline-success { + color: #28a745; + background-color: transparent; + background-image: none; + border-color: #28a745 +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-outline-success.focus, +.btn-outline-success:focus { + box-shadow: 0 0 0 3px rgba(40, 167, 69, .5) +} + +.btn-outline-success.disabled, +.btn-outline-success:disabled { + color: #28a745; + background-color: transparent +} + +.btn-outline-success.active, +.btn-outline-success:active, +.show>.btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745 +} + +.btn-outline-info { + color: #17a2b8; + background-color: transparent; + background-image: none; + border-color: #17a2b8 +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-outline-info.focus, +.btn-outline-info:focus { + box-shadow: 0 0 0 3px rgba(23, 162, 184, .5) +} + +.btn-outline-info.disabled, +.btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent +} + +.btn-outline-info.active, +.btn-outline-info:active, +.show>.btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8 +} + +.btn-outline-warning { + color: #ffc107; + background-color: transparent; + background-image: none; + border-color: #ffc107 +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-outline-warning.focus, +.btn-outline-warning:focus { + box-shadow: 0 0 0 3px rgba(255, 193, 7, .5) +} + +.btn-outline-warning.disabled, +.btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent +} + +.btn-outline-warning.active, +.btn-outline-warning:active, +.show>.btn-outline-warning.dropdown-toggle { + color: #fff; + background-color: #ffc107; + border-color: #ffc107 +} + +.btn-outline-danger { + color: #dc3545; + background-color: transparent; + background-image: none; + border-color: #dc3545 +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-outline-danger.focus, +.btn-outline-danger:focus { + box-shadow: 0 0 0 3px rgba(220, 53, 69, .5) +} + +.btn-outline-danger.disabled, +.btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent +} + +.btn-outline-danger.active, +.btn-outline-danger:active, +.show>.btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545 +} + +.btn-outline-light { + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa +} + +.btn-outline-light:hover { + color: #fff; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-outline-light.focus, +.btn-outline-light:focus { + box-shadow: 0 0 0 3px rgba(248, 249, 250, .5) +} + +.btn-outline-light.disabled, +.btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent +} + +.btn-outline-light.active, +.btn-outline-light:active, +.show>.btn-outline-light.dropdown-toggle { + color: #fff; + background-color: #f8f9fa; + border-color: #f8f9fa +} + +.btn-outline-dark { + color: #343a40; + background-color: transparent; + background-image: none; + border-color: #343a40 +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-outline-dark.focus, +.btn-outline-dark:focus { + box-shadow: 0 0 0 3px rgba(52, 58, 64, .5) +} + +.btn-outline-dark.disabled, +.btn-outline-dark:disabled { + color: #343a40; + background-color: transparent +} + +.btn-outline-dark.active, +.btn-outline-dark:active, +.show>.btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40 +} + +.btn-link { + font-weight: 400; + color: #007bff; + border-radius: 0 +} + +.btn-link, +.btn-link.active, +.btn-link:active, +.btn-link:disabled { + background-color: transparent +} + +.btn-link, +.btn-link:active, +.btn-link:focus { + border-color: transparent; + box-shadow: none +} + +.btn-link:hover { + border-color: transparent +} + +.btn-link:focus, +.btn-link:hover { + color: #0056b3; + text-decoration: underline; + background-color: transparent +} + +.btn-link:disabled { + color: #868e96 +} + +.btn-link:disabled:focus, +.btn-link:disabled:hover { + text-decoration: none +} + +.btn-group-lg>.btn, +.btn-lg { + padding: .5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: .3rem +} + +.btn-group-sm>.btn, +.btn-sm { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5; + border-radius: .2rem +} + +.btn-block { + display: block; + width: 100% +} + +.btn-block+.btn-block { + margin-top: .5rem +} + +input[type=button].btn-block, +input[type=reset].btn-block, +input[type=submit].btn-block { + width: 100% +} + +.fade { + opacity: 0; + transition: opacity .15s linear +} + +.fade.show { + opacity: 1 +} + +.collapse { + display: none +} + +.collapse.show { + display: block +} + +tr.collapse.show { + display: table-row +} + +tbody.collapse.show { + display: table-row-group +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height .35s ease +} + +.dropdown, +.dropup { + position: relative +} + +.dropdown-toggle::after { + display: inline-block; + width: 0; + height: 0; + margin-left: .255em; + vertical-align: .255em; + content: ""; + border-top: .3em solid; + border-right: .3em solid transparent; + border-left: .3em solid transparent +} + +.dropdown-toggle:empty::after { + margin-left: 0 +} + +.dropup .dropdown-menu { + margin-top: 0; + margin-bottom: .125rem +} + +.dropup .dropdown-toggle::after { + border-top: 0; + border-bottom: .3em solid +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: .5rem 0; + margin: .125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.dropdown-divider { + height: 0; + margin: .5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef +} + +.dropdown-item { + display: block; + width: 100%; + padding: .25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background: 0 0; + border: 0 +} + +.dropdown-item:focus, +.dropdown-item:hover { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa +} + +.dropdown-item.active, +.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff +} + +.dropdown-item.disabled, +.dropdown-item:disabled { + color: #868e96; + background-color: transparent +} + +.show>a { + outline: 0 +} + +.dropdown-menu.show { + display: block +} + +.dropdown-header { + display: block; + padding: .5rem 1.5rem; + margin-bottom: 0; + font-size: .875rem; + color: #868e96; + white-space: nowrap +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle +} + +.btn-group-vertical>.btn, +.btn-group>.btn { + position: relative; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + margin-bottom: 0 +} + +.btn-group-vertical>.btn:hover, +.btn-group>.btn:hover { + z-index: 2 +} + +.btn-group-vertical>.btn.active, +.btn-group-vertical>.btn:active, +.btn-group-vertical>.btn:focus, +.btn-group>.btn.active, +.btn-group>.btn:active, +.btn-group>.btn:focus { + z-index: 2 +} + +.btn-group .btn+.btn, +.btn-group .btn+.btn-group, +.btn-group .btn-group+.btn, +.btn-group .btn-group+.btn-group, +.btn-group-vertical .btn+.btn, +.btn-group-vertical .btn+.btn-group, +.btn-group-vertical .btn-group+.btn, +.btn-group-vertical .btn-group+.btn-group { + margin-left: -1px +} + +.btn-toolbar { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-pack: start; + justify-content: flex-start +} + +.btn-toolbar .input-group { + width: auto +} + +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0 +} + +.btn-group>.btn:first-child { + margin-left: 0 +} + +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn:last-child:not(:first-child), +.btn-group>.dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group>.btn-group { + float: left +} + +.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0 +} + +.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child, +.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.btn+.dropdown-toggle-split { + padding-right: .5625rem; + padding-left: .5625rem +} + +.btn+.dropdown-toggle-split::after { + margin-left: 0 +} + +.btn-group-sm>.btn+.dropdown-toggle-split, +.btn-sm+.dropdown-toggle-split { + padding-right: .375rem; + padding-left: .375rem +} + +.btn-group-lg>.btn+.dropdown-toggle-split, +.btn-lg+.dropdown-toggle-split { + padding-right: .75rem; + padding-left: .75rem +} + +.btn-group-vertical { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: center; + justify-content: center +} + +.btn-group-vertical .btn, +.btn-group-vertical .btn-group { + width: 100% +} + +.btn-group-vertical>.btn+.btn, +.btn-group-vertical>.btn+.btn-group, +.btn-group-vertical>.btn-group+.btn, +.btn-group-vertical>.btn-group+.btn-group { + margin-top: -1px; + margin-left: 0 +} + +.btn-group-vertical>.btn:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn { + border-radius: 0 +} + +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child, +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +[data-toggle=buttons]>.btn input[type=checkbox], +[data-toggle=buttons]>.btn input[type=radio], +[data-toggle=buttons]>.btn-group>.btn input[type=checkbox], +[data-toggle=buttons]>.btn-group>.btn input[type=radio] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} + +.input-group { + position: relative; + display: -ms-flexbox; + display: flex; + width: 100% +} + +.input-group .form-control { + position: relative; + z-index: 2; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0 +} + +.input-group .form-control:active, +.input-group .form-control:focus, +.input-group .form-control:hover { + z-index: 3 +} + +.input-group .form-control, +.input-group-addon, +.input-group-btn { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center +} + +.input-group .form-control:not(:first-child):not(:last-child), +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.input-group-addon, +.input-group-btn { + white-space: nowrap; + vertical-align: middle +} + +.input-group-addon { + padding: .5rem .75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.25; + color: #495057; + text-align: center; + background-color: #e9ecef; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.input-group-addon.form-control-sm, +.input-group-sm>.input-group-addon, +.input-group-sm>.input-group-btn>.input-group-addon.btn { + padding: .25rem .5rem; + font-size: .875rem; + border-radius: .2rem +} + +.input-group-addon.form-control-lg, +.input-group-lg>.input-group-addon, +.input-group-lg>.input-group-btn>.input-group-addon.btn { + padding: .5rem 1rem; + font-size: 1.25rem; + border-radius: .3rem +} + +.input-group-addon input[type=checkbox], +.input-group-addon input[type=radio] { + margin-top: 0 +} + +.input-group .form-control:not(:last-child), +.input-group-addon:not(:last-child), +.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn, +.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:not(:last-child)>.btn, +.input-group-btn:not(:last-child)>.btn-group>.btn, +.input-group-btn:not(:last-child)>.dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group-addon:not(:last-child) { + border-right: 0 +} + +.input-group .form-control:not(:first-child), +.input-group-addon:not(:first-child), +.input-group-btn:not(:first-child)>.btn, +.input-group-btn:not(:first-child)>.btn-group>.btn, +.input-group-btn:not(:first-child)>.dropdown-toggle, +.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn, +.input-group-btn:not(:last-child)>.btn:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.form-control+.input-group-addon:not(:first-child) { + border-left: 0 +} + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap +} + +.input-group-btn>.btn { + position: relative +} + +.input-group-btn>.btn+.btn { + margin-left: -1px +} + +.input-group-btn>.btn:active, +.input-group-btn>.btn:focus, +.input-group-btn>.btn:hover { + z-index: 3 +} + +.input-group-btn:not(:last-child)>.btn, +.input-group-btn:not(:last-child)>.btn-group { + margin-right: -1px +} + +.input-group-btn:not(:first-child)>.btn, +.input-group-btn:not(:first-child)>.btn-group { + z-index: 2; + margin-left: -1px +} + +.input-group-btn:not(:first-child)>.btn-group:active, +.input-group-btn:not(:first-child)>.btn-group:focus, +.input-group-btn:not(:first-child)>.btn-group:hover, +.input-group-btn:not(:first-child)>.btn:active, +.input-group-btn:not(:first-child)>.btn:focus, +.input-group-btn:not(:first-child)>.btn:hover { + z-index: 3 +} + +.custom-control { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + min-height: 1.5rem; + padding-left: 1.5rem; + margin-right: 1rem +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0 +} + +.custom-control-input:checked~.custom-control-indicator { + color: #fff; + background-color: #007bff +} + +.custom-control-input:focus~.custom-control-indicator { + box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007bff +} + +.custom-control-input:active~.custom-control-indicator { + color: #fff; + background-color: #b3d7ff +} + +.custom-control-input:disabled~.custom-control-indicator { + background-color: #e9ecef +} + +.custom-control-input:disabled~.custom-control-description { + color: #868e96 +} + +.custom-control-indicator { + position: absolute; + top: .25rem; + left: 0; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #ddd; + background-repeat: no-repeat; + background-position: center center; + background-size: 50% 50% +} + +.custom-checkbox .custom-control-indicator { + border-radius: .25rem +} + +.custom-checkbox .custom-control-input:checked~.custom-control-indicator { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") +} + +.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator { + background-color: #007bff; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E") +} + +.custom-radio .custom-control-indicator { + border-radius: 50% +} + +.custom-radio .custom-control-input:checked~.custom-control-indicator { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E") +} + +.custom-controls-stacked { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column +} + +.custom-controls-stacked .custom-control { + margin-bottom: .25rem +} + +.custom-controls-stacked .custom-control+.custom-control { + margin-left: 0 +} + +.custom-select { + display: inline-block; + max-width: 100%; + height: calc(2.25rem + 2px); + padding: .375rem 1.75rem .375rem .75rem; + line-height: 1.25; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center; + background-size: 8px 10px; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0 +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff +} + +.custom-select:disabled { + color: #868e96; + background-color: #e9ecef +} + +.custom-select::-ms-expand { + opacity: 0 +} + +.custom-select-sm { + height: calc(1.8125rem + 2px); + padding-top: .375rem; + padding-bottom: .375rem; + font-size: 75% +} + +.custom-file { + position: relative; + display: inline-block; + max-width: 100%; + height: 2.5rem; + margin-bottom: 0 +} + +.custom-file-input { + min-width: 14rem; + max-width: 100%; + height: 2.5rem; + margin: 0; + opacity: 0 +} + +.custom-file-control { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 5; + height: 2.5rem; + padding: .5rem 1rem; + line-height: 1.5; + color: #495057; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: .25rem +} + +.custom-file-control:lang(en):empty::after { + content: "Choose file..." +} + +.custom-file-control::before { + position: absolute; + top: -1px; + right: -1px; + bottom: -1px; + z-index: 6; + display: block; + height: 2.5rem; + padding: .5rem 1rem; + line-height: 1.5; + color: #495057; + background-color: #e9ecef; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 0 .25rem .25rem 0 +} + +.custom-file-control:lang(en)::before { + content: "Browse" +} + +.nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav-link { + display: block; + padding: .5rem 1rem +} + +.nav-link:focus, +.nav-link:hover { + text-decoration: none +} + +.nav-link.disabled { + color: #868e96 +} + +.nav-tabs { + border-bottom: 1px solid #ddd +} + +.nav-tabs .nav-item { + margin-bottom: -1px +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + border-color: #e9ecef #e9ecef #ddd +} + +.nav-tabs .nav-link.disabled { + color: #868e96; + background-color: transparent; + border-color: transparent +} + +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: #495057; + background-color: #fff; + border-color: #ddd #ddd #fff +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.nav-pills .nav-link { + border-radius: .25rem +} + +.nav-pills .nav-link.active, +.show>.nav-pills .nav-link { + color: #fff; + background-color: #007bff +} + +.nav-fill .nav-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center +} + +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center +} + +.tab-content>.tab-pane { + display: none +} + +.tab-content>.active { + display: block +} + +.navbar { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: .5rem 1rem +} + +.navbar>.container, +.navbar>.container-fluid { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between +} + +.navbar-brand { + display: inline-block; + padding-top: .3125rem; + padding-bottom: .3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap +} + +.navbar-brand:focus, +.navbar-brand:hover { + text-decoration: none +} + +.navbar-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0 +} + +.navbar-nav .dropdown-menu { + position: static; + float: none +} + +.navbar-text { + display: inline-block; + padding-top: .5rem; + padding-bottom: .5rem +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -ms-flex-align: center; + align-items: center +} + +.navbar-toggler { + padding: .25rem .75rem; + font-size: 1.25rem; + line-height: 1; + background: 0 0; + border: 1px solid transparent; + border-radius: .25rem +} + +.navbar-toggler:focus, +.navbar-toggler:hover { + text-decoration: none +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100% +} + +@media (max-width:575px) { + .navbar-expand-sm>.container, + .navbar-expand-sm>.container-fluid { + padding-right: 0; + padding-left: 0 + } +} + +@media (min-width:576px) { + .navbar-expand-sm { + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start + } + .navbar-expand-sm .navbar-nav { + -ms-flex-direction: row; + flex-direction: row + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute + } + .navbar-expand-sm .navbar-nav .dropdown-menu-right { + right: 0; + left: auto + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + .navbar-expand-sm>.container, + .navbar-expand-sm>.container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap + } + .navbar-expand-sm .navbar-collapse { + display: -ms-flexbox!important; + display: flex!important + } + .navbar-expand-sm .navbar-toggler { + display: none + } +} + +@media (max-width:767px) { + .navbar-expand-md>.container, + .navbar-expand-md>.container-fluid { + padding-right: 0; + padding-left: 0 + } +} + +@media (min-width:768px) { + .navbar-expand-md { + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start + } + .navbar-expand-md .navbar-nav { + -ms-flex-direction: row; + flex-direction: row + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute + } + .navbar-expand-md .navbar-nav .dropdown-menu-right { + right: 0; + left: auto + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + .navbar-expand-md>.container, + .navbar-expand-md>.container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap + } + .navbar-expand-md .navbar-collapse { + display: -ms-flexbox!important; + display: flex!important + } + .navbar-expand-md .navbar-toggler { + display: none + } +} + +@media (max-width:991px) { + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid { + padding-right: 0; + padding-left: 0 + } +} + +@media (min-width:992px) { + .navbar-expand-lg { + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start + } + .navbar-expand-lg .navbar-nav { + -ms-flex-direction: row; + flex-direction: row + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute + } + .navbar-expand-lg .navbar-nav .dropdown-menu-right { + right: 0; + left: auto + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap + } + .navbar-expand-lg .navbar-collapse { + display: -ms-flexbox!important; + display: flex!important + } + .navbar-expand-lg .navbar-toggler { + display: none + } +} + +@media (max-width:1199px) { + .navbar-expand-xl>.container, + .navbar-expand-xl>.container-fluid { + padding-right: 0; + padding-left: 0 + } +} + +@media (min-width:1200px) { + .navbar-expand-xl { + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start + } + .navbar-expand-xl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute + } + .navbar-expand-xl .navbar-nav .dropdown-menu-right { + right: 0; + left: auto + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem + } + .navbar-expand-xl>.container, + .navbar-expand-xl>.container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap + } + .navbar-expand-xl .navbar-collapse { + display: -ms-flexbox!important; + display: flex!important + } + .navbar-expand-xl .navbar-toggler { + display: none + } +} + +.navbar-expand { + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start +} + +.navbar-expand>.container, +.navbar-expand>.container-fluid { + padding-right: 0; + padding-left: 0 +} + +.navbar-expand .navbar-nav { + -ms-flex-direction: row; + flex-direction: row +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute +} + +.navbar-expand .navbar-nav .dropdown-menu-right { + right: 0; + left: auto +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: .5rem; + padding-left: .5rem +} + +.navbar-expand>.container, +.navbar-expand>.container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap +} + +.navbar-expand .navbar-collapse { + display: -ms-flexbox!important; + display: flex!important +} + +.navbar-expand .navbar-toggler { + display: none +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-brand:focus, +.navbar-light .navbar-brand:hover { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, .5) +} + +.navbar-light .navbar-nav .nav-link:focus, +.navbar-light .navbar-nav .nav-link:hover { + color: rgba(0, 0, 0, .7) +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, .3) +} + +.navbar-light .navbar-nav .active>.nav-link, +.navbar-light .navbar-nav .nav-link.active, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .show>.nav-link { + color: rgba(0, 0, 0, .9) +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, .5); + border-color: rgba(0, 0, 0, .1) +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, .5) +} + +.navbar-dark .navbar-brand { + color: #fff +} + +.navbar-dark .navbar-brand:focus, +.navbar-dark .navbar-brand:hover { + color: #fff +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, .5) +} + +.navbar-dark .navbar-nav .nav-link:focus, +.navbar-dark .navbar-nav .nav-link:hover { + color: rgba(255, 255, 255, .75) +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, .25) +} + +.navbar-dark .navbar-nav .active>.nav-link, +.navbar-dark .navbar-nav .nav-link.active, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .show>.nav-link { + color: #fff +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, .5); + border-color: rgba(255, 255, 255, .1) +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, .5) +} + +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, .125); + border-radius: .25rem +} + +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem +} + +.card-title { + margin-bottom: .75rem +} + +.card-subtitle { + margin-top: -.375rem; + margin-bottom: 0 +} + +.card-text:last-child { + margin-bottom: 0 +} + +.card-link:hover { + text-decoration: none +} + +.card-link+.card-link { + margin-left: 1.25rem +} + +.card>.list-group:first-child .list-group-item:first-child { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.card>.list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.card-header { + padding: .75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, .03); + border-bottom: 1px solid rgba(0, 0, 0, .125) +} + +.card-header:first-child { + border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0 +} + +.card-footer { + padding: .75rem 1.25rem; + background-color: rgba(0, 0, 0, .03); + border-top: 1px solid rgba(0, 0, 0, .125) +} + +.card-footer:last-child { + border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px) +} + +.card-header-tabs { + margin-right: -.625rem; + margin-bottom: -.75rem; + margin-left: -.625rem; + border-bottom: 0 +} + +.card-header-pills { + margin-right: -.625rem; + margin-left: -.625rem +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem +} + +.card-img { + width: 100%; + border-radius: calc(.25rem - 1px) +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(.25rem - 1px); + border-top-right-radius: calc(.25rem - 1px) +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(.25rem - 1px); + border-bottom-left-radius: calc(.25rem - 1px) +} + +@media (min-width:576px) { + .card-deck { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px + } + .card-deck .card { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + -ms-flex-direction: column; + flex-direction: column; + margin-right: 15px; + margin-left: 15px + } +} + +@media (min-width:576px) { + .card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap + } + .card-group .card { + -ms-flex: 1 0 0%; + flex: 1 0 0% + } + .card-group .card+.card { + margin-left: 0; + border-left: 0 + } + .card-group .card:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0 + } + .card-group .card:first-child .card-img-top { + border-top-right-radius: 0 + } + .card-group .card:first-child .card-img-bottom { + border-bottom-right-radius: 0 + } + .card-group .card:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0 + } + .card-group .card:last-child .card-img-top { + border-top-left-radius: 0 + } + .card-group .card:last-child .card-img-bottom { + border-bottom-left-radius: 0 + } + .card-group .card:not(:first-child):not(:last-child) { + border-radius: 0 + } + .card-group .card:not(:first-child):not(:last-child) .card-img-bottom, + .card-group .card:not(:first-child):not(:last-child) .card-img-top { + border-radius: 0 + } +} + +.card-columns .card { + margin-bottom: .75rem +} + +@media (min-width:576px) { + .card-columns { + -webkit-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + column-gap: 1.25rem + } + .card-columns .card { + display: inline-block; + width: 100% + } +} + +.breadcrumb { + padding: .75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: .25rem +} + +.breadcrumb::after { + display: block; + clear: both; + content: "" +} + +.breadcrumb-item { + float: left +} + +.breadcrumb-item+.breadcrumb-item::before { + display: inline-block; + padding-right: .5rem; + padding-left: .5rem; + color: #868e96; + content: "/" +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: underline +} + +.breadcrumb-item+.breadcrumb-item:hover::before { + text-decoration: none +} + +.breadcrumb-item.active { + color: #868e96 +} + +.pagination { + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: .25rem +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.page-item:last-child .page-link { + border-top-right-radius: .25rem; + border-bottom-right-radius: .25rem +} + +.page-item.active .page-link { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.page-item.disabled .page-link { + color: #868e96; + pointer-events: none; + background-color: #fff; + border-color: #ddd +} + +.page-link { + position: relative; + display: block; + padding: .5rem .75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #ddd +} + +.page-link:focus, +.page-link:hover { + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #ddd +} + +.pagination-lg .page-link { + padding: .75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5 +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: .3rem; + border-bottom-left-radius: .3rem +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: .3rem; + border-bottom-right-radius: .3rem +} + +.pagination-sm .page-link { + padding: .25rem .5rem; + font-size: .875rem; + line-height: 1.5 +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: .2rem; + border-bottom-left-radius: .2rem +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: .2rem; + border-bottom-right-radius: .2rem +} + +.badge { + display: inline-block; + padding: .25em .4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25rem +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.badge-pill { + padding-right: .6em; + padding-left: .6em; + border-radius: 10rem +} + +.badge-primary { + color: #fff; + background-color: #007bff +} + +.badge-primary[href]:focus, +.badge-primary[href]:hover { + color: #fff; + text-decoration: none; + background-color: #0062cc +} + +.badge-secondary { + color: #fff; + background-color: #868e96 +} + +.badge-secondary[href]:focus, +.badge-secondary[href]:hover { + color: #fff; + text-decoration: none; + background-color: #6c757d +} + +.badge-success { + color: #fff; + background-color: #28a745 +} + +.badge-success[href]:focus, +.badge-success[href]:hover { + color: #fff; + text-decoration: none; + background-color: #1e7e34 +} + +.badge-info { + color: #fff; + background-color: #17a2b8 +} + +.badge-info[href]:focus, +.badge-info[href]:hover { + color: #fff; + text-decoration: none; + background-color: #117a8b +} + +.badge-warning { + color: #111; + background-color: #ffc107 +} + +.badge-warning[href]:focus, +.badge-warning[href]:hover { + color: #111; + text-decoration: none; + background-color: #d39e00 +} + +.badge-danger { + color: #fff; + background-color: #dc3545 +} + +.badge-danger[href]:focus, +.badge-danger[href]:hover { + color: #fff; + text-decoration: none; + background-color: #bd2130 +} + +.badge-light { + color: #111; + background-color: #f8f9fa +} + +.badge-light[href]:focus, +.badge-light[href]:hover { + color: #111; + text-decoration: none; + background-color: #dae0e5 +} + +.badge-dark { + color: #fff; + background-color: #343a40 +} + +.badge-dark[href]:focus, +.badge-dark[href]:hover { + color: #fff; + text-decoration: none; + background-color: #1d2124 +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: .3rem +} + +@media (min-width:576px) { + .jumbotron { + padding: 4rem 2rem + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0 +} + +.alert { + padding: .75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: .25rem +} + +.alert-heading { + color: inherit +} + +.alert-link { + font-weight: 700 +} + +.alert-dismissible .close { + position: relative; + top: -.75rem; + right: -1.25rem; + padding: .75rem 1.25rem; + color: inherit +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff +} + +.alert-primary hr { + border-top-color: #9fcdff +} + +.alert-primary .alert-link { + color: #002752 +} + +.alert-secondary { + color: #464a4e; + background-color: #e7e8ea; + border-color: #dddfe2 +} + +.alert-secondary hr { + border-top-color: #cfd2d6 +} + +.alert-secondary .alert-link { + color: #2e3133 +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb +} + +.alert-success hr { + border-top-color: #b1dfbb +} + +.alert-success .alert-link { + color: #0b2e13 +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb +} + +.alert-info hr { + border-top-color: #abdde5 +} + +.alert-info .alert-link { + color: #062c33 +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba +} + +.alert-warning hr { + border-top-color: #ffe8a1 +} + +.alert-warning .alert-link { + color: #533f03 +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb +} + +.alert-danger hr { + border-top-color: #f1b0b7 +} + +.alert-danger .alert-link { + color: #491217 +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe +} + +.alert-light hr { + border-top-color: #ececf6 +} + +.alert-light .alert-link { + color: #686868 +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca +} + +.alert-dark hr { + border-top-color: #b9bbbe +} + +.alert-dark .alert-link { + color: #040505 +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + to { + background-position: 0 0 + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0 + } + to { + background-position: 0 0 + } +} + +.progress { + display: -ms-flexbox; + display: flex; + overflow: hidden; + font-size: .75rem; + line-height: 1rem; + text-align: center; + background-color: #e9ecef; + border-radius: .25rem +} + +.progress-bar { + height: 1rem; + line-height: 1rem; + color: #fff; + background-color: #007bff; + transition: width .6s ease +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite +} + +.media { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start +} + +.media-body { + -ms-flex: 1; + flex: 1 +} + +.list-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0 +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit +} + +.list-group-item-action:focus, +.list-group-item-action:hover { + color: #495057; + text-decoration: none; + background-color: #f8f9fa +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef +} + +.list-group-item { + position: relative; + display: block; + padding: .75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, .125) +} + +.list-group-item:first-child { + border-top-left-radius: .25rem; + border-top-right-radius: .25rem +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: .25rem; + border-bottom-left-radius: .25rem +} + +.list-group-item:focus, +.list-group-item:hover { + text-decoration: none +} + +.list-group-item.disabled, +.list-group-item:disabled { + color: #868e96; + background-color: #fff +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0 +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0 +} + +.list-group-flush:last-child .list-group-item:last-child { + border-bottom: 0 +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff +} + +a.list-group-item-primary, +button.list-group-item-primary { + color: #004085 +} + +a.list-group-item-primary:focus, +a.list-group-item-primary:hover, +button.list-group-item-primary:focus, +button.list-group-item-primary:hover { + color: #004085; + background-color: #9fcdff +} + +a.list-group-item-primary.active, +button.list-group-item-primary.active { + color: #fff; + background-color: #004085; + border-color: #004085 +} + +.list-group-item-secondary { + color: #464a4e; + background-color: #dddfe2 +} + +a.list-group-item-secondary, +button.list-group-item-secondary { + color: #464a4e +} + +a.list-group-item-secondary:focus, +a.list-group-item-secondary:hover, +button.list-group-item-secondary:focus, +button.list-group-item-secondary:hover { + color: #464a4e; + background-color: #cfd2d6 +} + +a.list-group-item-secondary.active, +button.list-group-item-secondary.active { + color: #fff; + background-color: #464a4e; + border-color: #464a4e +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb +} + +a.list-group-item-success, +button.list-group-item-success { + color: #155724 +} + +a.list-group-item-success:focus, +a.list-group-item-success:hover, +button.list-group-item-success:focus, +button.list-group-item-success:hover { + color: #155724; + background-color: #b1dfbb +} + +a.list-group-item-success.active, +button.list-group-item-success.active { + color: #fff; + background-color: #155724; + border-color: #155724 +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb +} + +a.list-group-item-info, +button.list-group-item-info { + color: #0c5460 +} + +a.list-group-item-info:focus, +a.list-group-item-info:hover, +button.list-group-item-info:focus, +button.list-group-item-info:hover { + color: #0c5460; + background-color: #abdde5 +} + +a.list-group-item-info.active, +button.list-group-item-info.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460 +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #856404 +} + +a.list-group-item-warning:focus, +a.list-group-item-warning:hover, +button.list-group-item-warning:focus, +button.list-group-item-warning:hover { + color: #856404; + background-color: #ffe8a1 +} + +a.list-group-item-warning.active, +button.list-group-item-warning.active { + color: #fff; + background-color: #856404; + border-color: #856404 +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #721c24 +} + +a.list-group-item-danger:focus, +a.list-group-item-danger:hover, +button.list-group-item-danger:focus, +button.list-group-item-danger:hover { + color: #721c24; + background-color: #f1b0b7 +} + +a.list-group-item-danger.active, +button.list-group-item-danger.active { + color: #fff; + background-color: #721c24; + border-color: #721c24 +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe +} + +a.list-group-item-light, +button.list-group-item-light { + color: #818182 +} + +a.list-group-item-light:focus, +a.list-group-item-light:hover, +button.list-group-item-light:focus, +button.list-group-item-light:hover { + color: #818182; + background-color: #ececf6 +} + +a.list-group-item-light.active, +button.list-group-item-light.active { + color: #fff; + background-color: #818182; + border-color: #818182 +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca +} + +a.list-group-item-dark, +button.list-group-item-dark { + color: #1b1e21 +} + +a.list-group-item-dark:focus, +a.list-group-item-dark:hover, +button.list-group-item-dark:focus, +button.list-group-item-dark:hover { + color: #1b1e21; + background-color: #b9bbbe +} + +a.list-group-item-dark.active, +button.list-group-item-dark.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21 +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5 +} + +.close:focus, +.close:hover { + color: #000; + text-decoration: none; + opacity: .75 +} + +button.close { + padding: 0; + background: 0 0; + border: 0; + -webkit-appearance: none +} + +.modal-open { + overflow: hidden +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + outline: 0 +} + +.modal.fade .modal-dialog { + transition: -webkit-transform .3s ease-out; + transition: transform .3s ease-out; + transition: transform .3s ease-out, -webkit-transform .3s ease-out; + -webkit-transform: translate(0, -25%); + transform: translate(0, -25%) +} + +.modal.show .modal-dialog { + -webkit-transform: translate(0, 0); + transform: translate(0, 0) +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px +} + +.modal-content { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem; + outline: 0 +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000 +} + +.modal-backdrop.fade { + opacity: 0 +} + +.modal-backdrop.show { + opacity: .5 +} + +.modal-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 15px; + border-bottom: 1px solid #e9ecef +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5 +} + +.modal-body { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 15px +} + +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 15px; + border-top: 1px solid #e9ecef +} + +.modal-footer>:not(:first-child) { + margin-left: .25rem +} + +.modal-footer>:not(:last-child) { + margin-right: .25rem +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} + +@media (min-width:576px) { + .modal-dialog { + max-width: 500px; + margin: 30px auto + } + .modal-sm { + max-width: 300px + } +} + +@media (min-width:992px) { + .modal-lg { + max-width: 800px + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + opacity: 0 +} + +.tooltip.show { + opacity: .9 +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 5px; + height: 5px +} + +.tooltip.bs-tooltip-auto[x-placement^=top], +.tooltip.bs-tooltip-top { + padding: 5px 0 +} + +.tooltip.bs-tooltip-auto[x-placement^=top] .arrow, +.tooltip.bs-tooltip-top .arrow { + bottom: 0 +} + +.tooltip.bs-tooltip-auto[x-placement^=top] .arrow::before, +.tooltip.bs-tooltip-top .arrow::before { + margin-left: -3px; + content: ""; + border-width: 5px 5px 0; + border-top-color: #000 +} + +.tooltip.bs-tooltip-auto[x-placement^=right], +.tooltip.bs-tooltip-right { + padding: 0 5px +} + +.tooltip.bs-tooltip-auto[x-placement^=right] .arrow, +.tooltip.bs-tooltip-right .arrow { + left: 0 +} + +.tooltip.bs-tooltip-auto[x-placement^=right] .arrow::before, +.tooltip.bs-tooltip-right .arrow::before { + margin-top: -3px; + content: ""; + border-width: 5px 5px 5px 0; + border-right-color: #000 +} + +.tooltip.bs-tooltip-auto[x-placement^=bottom], +.tooltip.bs-tooltip-bottom { + padding: 5px 0 +} + +.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow, +.tooltip.bs-tooltip-bottom .arrow { + top: 0 +} + +.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow::before, +.tooltip.bs-tooltip-bottom .arrow::before { + margin-left: -3px; + content: ""; + border-width: 0 5px 5px; + border-bottom-color: #000 +} + +.tooltip.bs-tooltip-auto[x-placement^=left], +.tooltip.bs-tooltip-left { + padding: 0 5px +} + +.tooltip.bs-tooltip-auto[x-placement^=left] .arrow, +.tooltip.bs-tooltip-left .arrow { + right: 0 +} + +.tooltip.bs-tooltip-auto[x-placement^=left] .arrow::before, +.tooltip.bs-tooltip-left .arrow::before { + right: 0; + margin-top: -3px; + content: ""; + border-width: 5px 0 5px 5px; + border-left-color: #000 +} + +.tooltip .arrow::before { + position: absolute; + border-color: transparent; + border-style: solid +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: .25rem +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + padding: 1px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: .875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: .3rem +} + +.popover .arrow { + position: absolute; + display: block; + width: 10px; + height: 5px +} + +.popover .arrow::after, +.popover .arrow::before { + position: absolute; + display: block; + border-color: transparent; + border-style: solid +} + +.popover .arrow::before { + content: ""; + border-width: 11px +} + +.popover .arrow::after { + content: ""; + border-width: 11px +} + +.popover.bs-popover-auto[x-placement^=top], +.popover.bs-popover-top { + margin-bottom: 10px +} + +.popover.bs-popover-auto[x-placement^=top] .arrow, +.popover.bs-popover-top .arrow { + bottom: 0 +} + +.popover.bs-popover-auto[x-placement^=top] .arrow::after, +.popover.bs-popover-auto[x-placement^=top] .arrow::before, +.popover.bs-popover-top .arrow::after, +.popover.bs-popover-top .arrow::before { + border-bottom-width: 0 +} + +.popover.bs-popover-auto[x-placement^=top] .arrow::before, +.popover.bs-popover-top .arrow::before { + bottom: -11px; + margin-left: -6px; + border-top-color: rgba(0, 0, 0, .25) +} + +.popover.bs-popover-auto[x-placement^=top] .arrow::after, +.popover.bs-popover-top .arrow::after { + bottom: -10px; + margin-left: -6px; + border-top-color: #fff +} + +.popover.bs-popover-auto[x-placement^=right], +.popover.bs-popover-right { + margin-left: 10px +} + +.popover.bs-popover-auto[x-placement^=right] .arrow, +.popover.bs-popover-right .arrow { + left: 0 +} + +.popover.bs-popover-auto[x-placement^=right] .arrow::after, +.popover.bs-popover-auto[x-placement^=right] .arrow::before, +.popover.bs-popover-right .arrow::after, +.popover.bs-popover-right .arrow::before { + margin-top: -8px; + border-left-width: 0 +} + +.popover.bs-popover-auto[x-placement^=right] .arrow::before, +.popover.bs-popover-right .arrow::before { + left: -11px; + border-right-color: rgba(0, 0, 0, .25) +} + +.popover.bs-popover-auto[x-placement^=right] .arrow::after, +.popover.bs-popover-right .arrow::after { + left: -10px; + border-right-color: #fff +} + +.popover.bs-popover-auto[x-placement^=bottom], +.popover.bs-popover-bottom { + margin-top: 10px +} + +.popover.bs-popover-auto[x-placement^=bottom] .arrow, +.popover.bs-popover-bottom .arrow { + top: 0 +} + +.popover.bs-popover-auto[x-placement^=bottom] .arrow::after, +.popover.bs-popover-auto[x-placement^=bottom] .arrow::before, +.popover.bs-popover-bottom .arrow::after, +.popover.bs-popover-bottom .arrow::before { + margin-left: -7px; + border-top-width: 0 +} + +.popover.bs-popover-auto[x-placement^=bottom] .arrow::before, +.popover.bs-popover-bottom .arrow::before { + top: -11px; + border-bottom-color: rgba(0, 0, 0, .25) +} + +.popover.bs-popover-auto[x-placement^=bottom] .arrow::after, +.popover.bs-popover-bottom .arrow::after { + top: -10px; + border-bottom-color: #fff +} + +.popover.bs-popover-auto[x-placement^=bottom] .popover-header::before, +.popover.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 20px; + margin-left: -10px; + content: ""; + border-bottom: 1px solid #f7f7f7 +} + +.popover.bs-popover-auto[x-placement^=left], +.popover.bs-popover-left { + margin-right: 10px +} + +.popover.bs-popover-auto[x-placement^=left] .arrow, +.popover.bs-popover-left .arrow { + right: 0 +} + +.popover.bs-popover-auto[x-placement^=left] .arrow::after, +.popover.bs-popover-auto[x-placement^=left] .arrow::before, +.popover.bs-popover-left .arrow::after, +.popover.bs-popover-left .arrow::before { + margin-top: -8px; + border-right-width: 0 +} + +.popover.bs-popover-auto[x-placement^=left] .arrow::before, +.popover.bs-popover-left .arrow::before { + right: -11px; + border-left-color: rgba(0, 0, 0, .25) +} + +.popover.bs-popover-auto[x-placement^=left] .arrow::after, +.popover.bs-popover-left .arrow::after { + right: -10px; + border-left-color: #fff +} + +.popover-header { + padding: 8px 14px; + margin-bottom: 0; + font-size: 1rem; + color: inherit; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(.3rem - 1px); + border-top-right-radius: calc(.3rem - 1px) +} + +.popover-header:empty { + display: none +} + +.popover-body { + padding: 9px 14px; + color: #212529 +} + +.carousel { + position: relative +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-item { + position: relative; + display: none; + -ms-flex-align: center; + align-items: center; + width: 100%; + transition: -webkit-transform .6s ease; + transition: transform .6s ease; + transition: transform .6s ease, -webkit-transform .6s ease; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px +} + +.carousel-item-next, +.carousel-item-prev, +.carousel-item.active { + display: block +} + +.carousel-item-next, +.carousel-item-prev { + position: absolute; + top: 0 +} + +.carousel-item-next.carousel-item-left, +.carousel-item-prev.carousel-item-right { + -webkit-transform: translateX(0); + transform: translateX(0) +} + +@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)) { + .carousel-item-next.carousel-item-left, + .carousel-item-prev.carousel-item-right { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.active.carousel-item-right, +.carousel-item-next { + -webkit-transform: translateX(100%); + transform: translateX(100%) +} + +@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)) { + .active.carousel-item-right, + .carousel-item-next { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } +} + +.active.carousel-item-left, +.carousel-item-prev { + -webkit-transform: translateX(-100%); + transform: translateX(-100%) +} + +@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)) { + .active.carousel-item-left, + .carousel-item-prev { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } +} + +.carousel-control-next, +.carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: .5 +} + +.carousel-control-next:focus, +.carousel-control-next:hover, +.carousel-control-prev:focus, +.carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: .9 +} + +.carousel-control-prev { + left: 0 +} + +.carousel-control-next { + right: 0 +} + +.carousel-control-next-icon, +.carousel-control-prev-icon { + display: inline-block; + width: 20px; + height: 20px; + background: transparent no-repeat center center; + background-size: 100% 100% +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E") +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E") +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 10px; + left: 0; + z-index: 15; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none +} + +.carousel-indicators li { + position: relative; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + background-color: rgba(255, 255, 255, .5) +} + +.carousel-indicators li::before { + position: absolute; + top: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: "" +} + +.carousel-indicators li::after { + position: absolute; + bottom: -10px; + left: 0; + display: inline-block; + width: 100%; + height: 10px; + content: "" +} + +.carousel-indicators .active { + background-color: #fff +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center +} + +.align-baseline { + vertical-align: baseline!important +} + +.align-top { + vertical-align: top!important +} + +.align-middle { + vertical-align: middle!important +} + +.align-bottom { + vertical-align: bottom!important +} + +.align-text-bottom { + vertical-align: text-bottom!important +} + +.align-text-top { + vertical-align: text-top!important +} + +.bg-primary { + background-color: #007bff!important +} + +a.bg-primary:focus, +a.bg-primary:hover { + background-color: #0062cc!important +} + +.bg-secondary { + background-color: #868e96!important +} + +a.bg-secondary:focus, +a.bg-secondary:hover { + background-color: #6c757d!important +} + +.bg-success { + background-color: #28a745!important +} + +a.bg-success:focus, +a.bg-success:hover { + background-color: #1e7e34!important +} + +.bg-info { + background-color: #17a2b8!important +} + +a.bg-info:focus, +a.bg-info:hover { + background-color: #117a8b!important +} + +.bg-warning { + background-color: #ffc107!important +} + +a.bg-warning:focus, +a.bg-warning:hover { + background-color: #d39e00!important +} + +.bg-danger { + background-color: #dc3545!important +} + +a.bg-danger:focus, +a.bg-danger:hover { + background-color: #bd2130!important +} + +.bg-light { + background-color: #f8f9fa!important +} + +a.bg-light:focus, +a.bg-light:hover { + background-color: #dae0e5!important +} + +.bg-dark { + background-color: #343a40!important +} + +a.bg-dark:focus, +a.bg-dark:hover { + background-color: #1d2124!important +} + +.bg-white { + background-color: #fff!important +} + +.bg-transparent { + background-color: transparent!important +} + +.border { + border: 1px solid #e9ecef!important +} + +.border-0 { + border: 0!important +} + +.border-top-0 { + border-top: 0!important +} + +.border-right-0 { + border-right: 0!important +} + +.border-bottom-0 { + border-bottom: 0!important +} + +.border-left-0 { + border-left: 0!important +} + +.border-primary { + border-color: #007bff!important +} + +.border-secondary { + border-color: #868e96!important +} + +.border-success { + border-color: #28a745!important +} + +.border-info { + border-color: #17a2b8!important +} + +.border-warning { + border-color: #ffc107!important +} + +.border-danger { + border-color: #dc3545!important +} + +.border-light { + border-color: #f8f9fa!important +} + +.border-dark { + border-color: #343a40!important +} + +.border-white { + border-color: #fff!important +} + +.rounded { + border-radius: .25rem!important +} + +.rounded-top { + border-top-left-radius: .25rem!important; + border-top-right-radius: .25rem!important +} + +.rounded-right { + border-top-right-radius: .25rem!important; + border-bottom-right-radius: .25rem!important +} + +.rounded-bottom { + border-bottom-right-radius: .25rem!important; + border-bottom-left-radius: .25rem!important +} + +.rounded-left { + border-top-left-radius: .25rem!important; + border-bottom-left-radius: .25rem!important +} + +.rounded-circle { + border-radius: 50% +} + +.rounded-0 { + border-radius: 0 +} + +.clearfix::after { + display: block; + clear: both; + content: "" +} + +.d-none { + display: none!important +} + +.d-inline { + display: inline!important +} + +.d-inline-block { + display: inline-block!important +} + +.d-block { + display: block!important +} + +.d-table { + display: table!important +} + +.d-table-cell { + display: table-cell!important +} + +.d-flex { + display: -ms-flexbox!important; + display: flex!important +} + +.d-inline-flex { + display: -ms-inline-flexbox!important; + display: inline-flex!important +} + +@media (min-width:576px) { + .d-sm-none { + display: none!important + } + .d-sm-inline { + display: inline!important + } + .d-sm-inline-block { + display: inline-block!important + } + .d-sm-block { + display: block!important + } + .d-sm-table { + display: table!important + } + .d-sm-table-cell { + display: table-cell!important + } + .d-sm-flex { + display: -ms-flexbox!important; + display: flex!important + } + .d-sm-inline-flex { + display: -ms-inline-flexbox!important; + display: inline-flex!important + } +} + +@media (min-width:768px) { + .d-md-none { + display: none!important + } + .d-md-inline { + display: inline!important + } + .d-md-inline-block { + display: inline-block!important + } + .d-md-block { + display: block!important + } + .d-md-table { + display: table!important + } + .d-md-table-cell { + display: table-cell!important + } + .d-md-flex { + display: -ms-flexbox!important; + display: flex!important + } + .d-md-inline-flex { + display: -ms-inline-flexbox!important; + display: inline-flex!important + } +} + +@media (min-width:992px) { + .d-lg-none { + display: none!important + } + .d-lg-inline { + display: inline!important + } + .d-lg-inline-block { + display: inline-block!important + } + .d-lg-block { + display: block!important + } + .d-lg-table { + display: table!important + } + .d-lg-table-cell { + display: table-cell!important + } + .d-lg-flex { + display: -ms-flexbox!important; + display: flex!important + } + .d-lg-inline-flex { + display: -ms-inline-flexbox!important; + display: inline-flex!important + } +} + +@media (min-width:1200px) { + .d-xl-none { + display: none!important + } + .d-xl-inline { + display: inline!important + } + .d-xl-inline-block { + display: inline-block!important + } + .d-xl-block { + display: block!important + } + .d-xl-table { + display: table!important + } + .d-xl-table-cell { + display: table-cell!important + } + .d-xl-flex { + display: -ms-flexbox!important; + display: flex!important + } + .d-xl-inline-flex { + display: -ms-inline-flexbox!important; + display: inline-flex!important + } +} + +.d-print-block { + display: none!important +} + +@media print { + .d-print-block { + display: block!important + } +} + +.d-print-inline { + display: none!important +} + +@media print { + .d-print-inline { + display: inline!important + } +} + +.d-print-inline-block { + display: none!important +} + +@media print { + .d-print-inline-block { + display: inline-block!important + } +} + +@media print { + .d-print-none { + display: none!important + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden +} + +.embed-responsive::before { + display: block; + content: "" +} + +.embed-responsive .embed-responsive-item, +.embed-responsive embed, +.embed-responsive iframe, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0 +} + +.embed-responsive-21by9::before { + padding-top: 42.857143% +} + +.embed-responsive-16by9::before { + padding-top: 56.25% +} + +.embed-responsive-4by3::before { + padding-top: 75% +} + +.embed-responsive-1by1::before { + padding-top: 100% +} + +.flex-row { + -ms-flex-direction: row!important; + flex-direction: row!important +} + +.flex-column { + -ms-flex-direction: column!important; + flex-direction: column!important +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse!important; + flex-direction: row-reverse!important +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse!important; + flex-direction: column-reverse!important +} + +.flex-wrap { + -ms-flex-wrap: wrap!important; + flex-wrap: wrap!important +} + +.flex-nowrap { + -ms-flex-wrap: nowrap!important; + flex-wrap: nowrap!important +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse!important; + flex-wrap: wrap-reverse!important +} + +.justify-content-start { + -ms-flex-pack: start!important; + justify-content: flex-start!important +} + +.justify-content-end { + -ms-flex-pack: end!important; + justify-content: flex-end!important +} + +.justify-content-center { + -ms-flex-pack: center!important; + justify-content: center!important +} + +.justify-content-between { + -ms-flex-pack: justify!important; + justify-content: space-between!important +} + +.justify-content-around { + -ms-flex-pack: distribute!important; + justify-content: space-around!important +} + +.align-items-start { + -ms-flex-align: start!important; + align-items: flex-start!important +} + +.align-items-end { + -ms-flex-align: end!important; + align-items: flex-end!important +} + +.align-items-center { + -ms-flex-align: center!important; + align-items: center!important +} + +.align-items-baseline { + -ms-flex-align: baseline!important; + align-items: baseline!important +} + +.align-items-stretch { + -ms-flex-align: stretch!important; + align-items: stretch!important +} + +.align-content-start { + -ms-flex-line-pack: start!important; + align-content: flex-start!important +} + +.align-content-end { + -ms-flex-line-pack: end!important; + align-content: flex-end!important +} + +.align-content-center { + -ms-flex-line-pack: center!important; + align-content: center!important +} + +.align-content-between { + -ms-flex-line-pack: justify!important; + align-content: space-between!important +} + +.align-content-around { + -ms-flex-line-pack: distribute!important; + align-content: space-around!important +} + +.align-content-stretch { + -ms-flex-line-pack: stretch!important; + align-content: stretch!important +} + +.align-self-auto { + -ms-flex-item-align: auto!important; + align-self: auto!important +} + +.align-self-start { + -ms-flex-item-align: start!important; + align-self: flex-start!important +} + +.align-self-end { + -ms-flex-item-align: end!important; + align-self: flex-end!important +} + +.align-self-center { + -ms-flex-item-align: center!important; + align-self: center!important +} + +.align-self-baseline { + -ms-flex-item-align: baseline!important; + align-self: baseline!important +} + +.align-self-stretch { + -ms-flex-item-align: stretch!important; + align-self: stretch!important +} + +@media (min-width:576px) { + .flex-sm-row { + -ms-flex-direction: row!important; + flex-direction: row!important + } + .flex-sm-column { + -ms-flex-direction: column!important; + flex-direction: column!important + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse!important; + flex-direction: row-reverse!important + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse!important; + flex-direction: column-reverse!important + } + .flex-sm-wrap { + -ms-flex-wrap: wrap!important; + flex-wrap: wrap!important + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap!important; + flex-wrap: nowrap!important + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse!important; + flex-wrap: wrap-reverse!important + } + .justify-content-sm-start { + -ms-flex-pack: start!important; + justify-content: flex-start!important + } + .justify-content-sm-end { + -ms-flex-pack: end!important; + justify-content: flex-end!important + } + .justify-content-sm-center { + -ms-flex-pack: center!important; + justify-content: center!important + } + .justify-content-sm-between { + -ms-flex-pack: justify!important; + justify-content: space-between!important + } + .justify-content-sm-around { + -ms-flex-pack: distribute!important; + justify-content: space-around!important + } + .align-items-sm-start { + -ms-flex-align: start!important; + align-items: flex-start!important + } + .align-items-sm-end { + -ms-flex-align: end!important; + align-items: flex-end!important + } + .align-items-sm-center { + -ms-flex-align: center!important; + align-items: center!important + } + .align-items-sm-baseline { + -ms-flex-align: baseline!important; + align-items: baseline!important + } + .align-items-sm-stretch { + -ms-flex-align: stretch!important; + align-items: stretch!important + } + .align-content-sm-start { + -ms-flex-line-pack: start!important; + align-content: flex-start!important + } + .align-content-sm-end { + -ms-flex-line-pack: end!important; + align-content: flex-end!important + } + .align-content-sm-center { + -ms-flex-line-pack: center!important; + align-content: center!important + } + .align-content-sm-between { + -ms-flex-line-pack: justify!important; + align-content: space-between!important + } + .align-content-sm-around { + -ms-flex-line-pack: distribute!important; + align-content: space-around!important + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch!important; + align-content: stretch!important + } + .align-self-sm-auto { + -ms-flex-item-align: auto!important; + align-self: auto!important + } + .align-self-sm-start { + -ms-flex-item-align: start!important; + align-self: flex-start!important + } + .align-self-sm-end { + -ms-flex-item-align: end!important; + align-self: flex-end!important + } + .align-self-sm-center { + -ms-flex-item-align: center!important; + align-self: center!important + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline!important; + align-self: baseline!important + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch!important; + align-self: stretch!important + } +} + +@media (min-width:768px) { + .flex-md-row { + -ms-flex-direction: row!important; + flex-direction: row!important + } + .flex-md-column { + -ms-flex-direction: column!important; + flex-direction: column!important + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse!important; + flex-direction: row-reverse!important + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse!important; + flex-direction: column-reverse!important + } + .flex-md-wrap { + -ms-flex-wrap: wrap!important; + flex-wrap: wrap!important + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap!important; + flex-wrap: nowrap!important + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse!important; + flex-wrap: wrap-reverse!important + } + .justify-content-md-start { + -ms-flex-pack: start!important; + justify-content: flex-start!important + } + .justify-content-md-end { + -ms-flex-pack: end!important; + justify-content: flex-end!important + } + .justify-content-md-center { + -ms-flex-pack: center!important; + justify-content: center!important + } + .justify-content-md-between { + -ms-flex-pack: justify!important; + justify-content: space-between!important + } + .justify-content-md-around { + -ms-flex-pack: distribute!important; + justify-content: space-around!important + } + .align-items-md-start { + -ms-flex-align: start!important; + align-items: flex-start!important + } + .align-items-md-end { + -ms-flex-align: end!important; + align-items: flex-end!important + } + .align-items-md-center { + -ms-flex-align: center!important; + align-items: center!important + } + .align-items-md-baseline { + -ms-flex-align: baseline!important; + align-items: baseline!important + } + .align-items-md-stretch { + -ms-flex-align: stretch!important; + align-items: stretch!important + } + .align-content-md-start { + -ms-flex-line-pack: start!important; + align-content: flex-start!important + } + .align-content-md-end { + -ms-flex-line-pack: end!important; + align-content: flex-end!important + } + .align-content-md-center { + -ms-flex-line-pack: center!important; + align-content: center!important + } + .align-content-md-between { + -ms-flex-line-pack: justify!important; + align-content: space-between!important + } + .align-content-md-around { + -ms-flex-line-pack: distribute!important; + align-content: space-around!important + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch!important; + align-content: stretch!important + } + .align-self-md-auto { + -ms-flex-item-align: auto!important; + align-self: auto!important + } + .align-self-md-start { + -ms-flex-item-align: start!important; + align-self: flex-start!important + } + .align-self-md-end { + -ms-flex-item-align: end!important; + align-self: flex-end!important + } + .align-self-md-center { + -ms-flex-item-align: center!important; + align-self: center!important + } + .align-self-md-baseline { + -ms-flex-item-align: baseline!important; + align-self: baseline!important + } + .align-self-md-stretch { + -ms-flex-item-align: stretch!important; + align-self: stretch!important + } +} + +@media (min-width:992px) { + .flex-lg-row { + -ms-flex-direction: row!important; + flex-direction: row!important + } + .flex-lg-column { + -ms-flex-direction: column!important; + flex-direction: column!important + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse!important; + flex-direction: row-reverse!important + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse!important; + flex-direction: column-reverse!important + } + .flex-lg-wrap { + -ms-flex-wrap: wrap!important; + flex-wrap: wrap!important + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap!important; + flex-wrap: nowrap!important + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse!important; + flex-wrap: wrap-reverse!important + } + .justify-content-lg-start { + -ms-flex-pack: start!important; + justify-content: flex-start!important + } + .justify-content-lg-end { + -ms-flex-pack: end!important; + justify-content: flex-end!important + } + .justify-content-lg-center { + -ms-flex-pack: center!important; + justify-content: center!important + } + .justify-content-lg-between { + -ms-flex-pack: justify!important; + justify-content: space-between!important + } + .justify-content-lg-around { + -ms-flex-pack: distribute!important; + justify-content: space-around!important + } + .align-items-lg-start { + -ms-flex-align: start!important; + align-items: flex-start!important + } + .align-items-lg-end { + -ms-flex-align: end!important; + align-items: flex-end!important + } + .align-items-lg-center { + -ms-flex-align: center!important; + align-items: center!important + } + .align-items-lg-baseline { + -ms-flex-align: baseline!important; + align-items: baseline!important + } + .align-items-lg-stretch { + -ms-flex-align: stretch!important; + align-items: stretch!important + } + .align-content-lg-start { + -ms-flex-line-pack: start!important; + align-content: flex-start!important + } + .align-content-lg-end { + -ms-flex-line-pack: end!important; + align-content: flex-end!important + } + .align-content-lg-center { + -ms-flex-line-pack: center!important; + align-content: center!important + } + .align-content-lg-between { + -ms-flex-line-pack: justify!important; + align-content: space-between!important + } + .align-content-lg-around { + -ms-flex-line-pack: distribute!important; + align-content: space-around!important + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch!important; + align-content: stretch!important + } + .align-self-lg-auto { + -ms-flex-item-align: auto!important; + align-self: auto!important + } + .align-self-lg-start { + -ms-flex-item-align: start!important; + align-self: flex-start!important + } + .align-self-lg-end { + -ms-flex-item-align: end!important; + align-self: flex-end!important + } + .align-self-lg-center { + -ms-flex-item-align: center!important; + align-self: center!important + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline!important; + align-self: baseline!important + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch!important; + align-self: stretch!important + } +} + +@media (min-width:1200px) { + .flex-xl-row { + -ms-flex-direction: row!important; + flex-direction: row!important + } + .flex-xl-column { + -ms-flex-direction: column!important; + flex-direction: column!important + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse!important; + flex-direction: row-reverse!important + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse!important; + flex-direction: column-reverse!important + } + .flex-xl-wrap { + -ms-flex-wrap: wrap!important; + flex-wrap: wrap!important + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap!important; + flex-wrap: nowrap!important + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse!important; + flex-wrap: wrap-reverse!important + } + .justify-content-xl-start { + -ms-flex-pack: start!important; + justify-content: flex-start!important + } + .justify-content-xl-end { + -ms-flex-pack: end!important; + justify-content: flex-end!important + } + .justify-content-xl-center { + -ms-flex-pack: center!important; + justify-content: center!important + } + .justify-content-xl-between { + -ms-flex-pack: justify!important; + justify-content: space-between!important + } + .justify-content-xl-around { + -ms-flex-pack: distribute!important; + justify-content: space-around!important + } + .align-items-xl-start { + -ms-flex-align: start!important; + align-items: flex-start!important + } + .align-items-xl-end { + -ms-flex-align: end!important; + align-items: flex-end!important + } + .align-items-xl-center { + -ms-flex-align: center!important; + align-items: center!important + } + .align-items-xl-baseline { + -ms-flex-align: baseline!important; + align-items: baseline!important + } + .align-items-xl-stretch { + -ms-flex-align: stretch!important; + align-items: stretch!important + } + .align-content-xl-start { + -ms-flex-line-pack: start!important; + align-content: flex-start!important + } + .align-content-xl-end { + -ms-flex-line-pack: end!important; + align-content: flex-end!important + } + .align-content-xl-center { + -ms-flex-line-pack: center!important; + align-content: center!important + } + .align-content-xl-between { + -ms-flex-line-pack: justify!important; + align-content: space-between!important + } + .align-content-xl-around { + -ms-flex-line-pack: distribute!important; + align-content: space-around!important + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch!important; + align-content: stretch!important + } + .align-self-xl-auto { + -ms-flex-item-align: auto!important; + align-self: auto!important + } + .align-self-xl-start { + -ms-flex-item-align: start!important; + align-self: flex-start!important + } + .align-self-xl-end { + -ms-flex-item-align: end!important; + align-self: flex-end!important + } + .align-self-xl-center { + -ms-flex-item-align: center!important; + align-self: center!important + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline!important; + align-self: baseline!important + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch!important; + align-self: stretch!important + } +} + +.float-left { + float: left!important +} + +.float-right { + float: right!important +} + +.float-none { + float: none!important +} + +@media (min-width:576px) { + .float-sm-left { + float: left!important + } + .float-sm-right { + float: right!important + } + .float-sm-none { + float: none!important + } +} + +@media (min-width:768px) { + .float-md-left { + float: left!important + } + .float-md-right { + float: right!important + } + .float-md-none { + float: none!important + } +} + +@media (min-width:992px) { + .float-lg-left { + float: left!important + } + .float-lg-right { + float: right!important + } + .float-lg-none { + float: none!important + } +} + +@media (min-width:1200px) { + .float-xl-left { + float: left!important + } + .float-xl-right { + float: right!important + } + .float-xl-none { + float: none!important + } +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030 +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030 +} + +@supports ((position:-webkit-sticky) or (position:sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020 + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + border: 0 +} + +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; + -webkit-clip-path: none; + clip-path: none +} + +.w-25 { + width: 25%!important +} + +.w-50 { + width: 50%!important +} + +.w-75 { + width: 75%!important +} + +.w-100 { + width: 100%!important +} + +.h-25 { + height: 25%!important +} + +.h-50 { + height: 50%!important +} + +.h-75 { + height: 75%!important +} + +.h-100 { + height: 100%!important +} + +.mw-100 { + max-width: 100%!important +} + +.mh-100 { + max-height: 100%!important +} + +.m-0 { + margin: 0!important +} + +.mt-0 { + margin-top: 0!important +} + +.mr-0 { + margin-right: 0!important +} + +.mb-0 { + margin-bottom: 0!important +} + +.ml-0 { + margin-left: 0!important +} + +.mx-0 { + margin-right: 0!important; + margin-left: 0!important +} + +.my-0 { + margin-top: 0!important; + margin-bottom: 0!important +} + +.m-1 { + margin: .25rem!important +} + +.mt-1 { + margin-top: .25rem!important +} + +.mr-1 { + margin-right: .25rem!important +} + +.mb-1 { + margin-bottom: .25rem!important +} + +.ml-1 { + margin-left: .25rem!important +} + +.mx-1 { + margin-right: .25rem!important; + margin-left: .25rem!important +} + +.my-1 { + margin-top: .25rem!important; + margin-bottom: .25rem!important +} + +.m-2 { + margin: .5rem!important +} + +.mt-2 { + margin-top: .5rem!important +} + +.mr-2 { + margin-right: .5rem!important +} + +.mb-2 { + margin-bottom: .5rem!important +} + +.ml-2 { + margin-left: .5rem!important +} + +.mx-2 { + margin-right: .5rem!important; + margin-left: .5rem!important +} + +.my-2 { + margin-top: .5rem!important; + margin-bottom: .5rem!important +} + +.m-3 { + margin: 1rem!important +} + +.mt-3 { + margin-top: 1rem!important +} + +.mr-3 { + margin-right: 1rem!important +} + +.mb-3 { + margin-bottom: 1rem!important +} + +.ml-3 { + margin-left: 1rem!important +} + +.mx-3 { + margin-right: 1rem!important; + margin-left: 1rem!important +} + +.my-3 { + margin-top: 1rem!important; + margin-bottom: 1rem!important +} + +.m-4 { + margin: 1.5rem!important +} + +.mt-4 { + margin-top: 1.5rem!important +} + +.mr-4 { + margin-right: 1.5rem!important +} + +.mb-4 { + margin-bottom: 1.5rem!important +} + +.ml-4 { + margin-left: 1.5rem!important +} + +.mx-4 { + margin-right: 1.5rem!important; + margin-left: 1.5rem!important +} + +.my-4 { + margin-top: 1.5rem!important; + margin-bottom: 1.5rem!important +} + +.m-5 { + margin: 3rem!important +} + +.mt-5 { + margin-top: 3rem!important +} + +.mr-5 { + margin-right: 3rem!important +} + +.mb-5 { + margin-bottom: 3rem!important +} + +.ml-5 { + margin-left: 3rem!important +} + +.mx-5 { + margin-right: 3rem!important; + margin-left: 3rem!important +} + +.my-5 { + margin-top: 3rem!important; + margin-bottom: 3rem!important +} + +.p-0 { + padding: 0!important +} + +.pt-0 { + padding-top: 0!important +} + +.pr-0 { + padding-right: 0!important +} + +.pb-0 { + padding-bottom: 0!important +} + +.pl-0 { + padding-left: 0!important +} + +.px-0 { + padding-right: 0!important; + padding-left: 0!important +} + +.py-0 { + padding-top: 0!important; + padding-bottom: 0!important +} + +.p-1 { + padding: .25rem!important +} + +.pt-1 { + padding-top: .25rem!important +} + +.pr-1 { + padding-right: .25rem!important +} + +.pb-1 { + padding-bottom: .25rem!important +} + +.pl-1 { + padding-left: .25rem!important +} + +.px-1 { + padding-right: .25rem!important; + padding-left: .25rem!important +} + +.py-1 { + padding-top: .25rem!important; + padding-bottom: .25rem!important +} + +.p-2 { + padding: .5rem!important +} + +.pt-2 { + padding-top: .5rem!important +} + +.pr-2 { + padding-right: .5rem!important +} + +.pb-2 { + padding-bottom: .5rem!important +} + +.pl-2 { + padding-left: .5rem!important +} + +.px-2 { + padding-right: .5rem!important; + padding-left: .5rem!important +} + +.py-2 { + padding-top: .5rem!important; + padding-bottom: .5rem!important +} + +.p-3 { + padding: 1rem!important +} + +.pt-3 { + padding-top: 1rem!important +} + +.pr-3 { + padding-right: 1rem!important +} + +.pb-3 { + padding-bottom: 1rem!important +} + +.pl-3 { + padding-left: 1rem!important +} + +.px-3 { + padding-right: 1rem!important; + padding-left: 1rem!important +} + +.py-3 { + padding-top: 1rem!important; + padding-bottom: 1rem!important +} + +.p-4 { + padding: 1.5rem!important +} + +.pt-4 { + padding-top: 1.5rem!important +} + +.pr-4 { + padding-right: 1.5rem!important +} + +.pb-4 { + padding-bottom: 1.5rem!important +} + +.pl-4 { + padding-left: 1.5rem!important +} + +.px-4 { + padding-right: 1.5rem!important; + padding-left: 1.5rem!important +} + +.py-4 { + padding-top: 1.5rem!important; + padding-bottom: 1.5rem!important +} + +.p-5 { + padding: 3rem!important +} + +.pt-5 { + padding-top: 3rem!important +} + +.pr-5 { + padding-right: 3rem!important +} + +.pb-5 { + padding-bottom: 3rem!important +} + +.pl-5 { + padding-left: 3rem!important +} + +.px-5 { + padding-right: 3rem!important; + padding-left: 3rem!important +} + +.py-5 { + padding-top: 3rem!important; + padding-bottom: 3rem!important +} + +.m-auto { + margin: auto!important +} + +.mt-auto { + margin-top: auto!important +} + +.mr-auto { + margin-right: auto!important +} + +.mb-auto { + margin-bottom: auto!important +} + +.ml-auto { + margin-left: auto!important +} + +.mx-auto { + margin-right: auto!important; + margin-left: auto!important +} + +.my-auto { + margin-top: auto!important; + margin-bottom: auto!important +} + +@media (min-width:576px) { + .m-sm-0 { + margin: 0!important + } + .mt-sm-0 { + margin-top: 0!important + } + .mr-sm-0 { + margin-right: 0!important + } + .mb-sm-0 { + margin-bottom: 0!important + } + .ml-sm-0 { + margin-left: 0!important + } + .mx-sm-0 { + margin-right: 0!important; + margin-left: 0!important + } + .my-sm-0 { + margin-top: 0!important; + margin-bottom: 0!important + } + .m-sm-1 { + margin: .25rem!important + } + .mt-sm-1 { + margin-top: .25rem!important + } + .mr-sm-1 { + margin-right: .25rem!important + } + .mb-sm-1 { + margin-bottom: .25rem!important + } + .ml-sm-1 { + margin-left: .25rem!important + } + .mx-sm-1 { + margin-right: .25rem!important; + margin-left: .25rem!important + } + .my-sm-1 { + margin-top: .25rem!important; + margin-bottom: .25rem!important + } + .m-sm-2 { + margin: .5rem!important + } + .mt-sm-2 { + margin-top: .5rem!important + } + .mr-sm-2 { + margin-right: .5rem!important + } + .mb-sm-2 { + margin-bottom: .5rem!important + } + .ml-sm-2 { + margin-left: .5rem!important + } + .mx-sm-2 { + margin-right: .5rem!important; + margin-left: .5rem!important + } + .my-sm-2 { + margin-top: .5rem!important; + margin-bottom: .5rem!important + } + .m-sm-3 { + margin: 1rem!important + } + .mt-sm-3 { + margin-top: 1rem!important + } + .mr-sm-3 { + margin-right: 1rem!important + } + .mb-sm-3 { + margin-bottom: 1rem!important + } + .ml-sm-3 { + margin-left: 1rem!important + } + .mx-sm-3 { + margin-right: 1rem!important; + margin-left: 1rem!important + } + .my-sm-3 { + margin-top: 1rem!important; + margin-bottom: 1rem!important + } + .m-sm-4 { + margin: 1.5rem!important + } + .mt-sm-4 { + margin-top: 1.5rem!important + } + .mr-sm-4 { + margin-right: 1.5rem!important + } + .mb-sm-4 { + margin-bottom: 1.5rem!important + } + .ml-sm-4 { + margin-left: 1.5rem!important + } + .mx-sm-4 { + margin-right: 1.5rem!important; + margin-left: 1.5rem!important + } + .my-sm-4 { + margin-top: 1.5rem!important; + margin-bottom: 1.5rem!important + } + .m-sm-5 { + margin: 3rem!important + } + .mt-sm-5 { + margin-top: 3rem!important + } + .mr-sm-5 { + margin-right: 3rem!important + } + .mb-sm-5 { + margin-bottom: 3rem!important + } + .ml-sm-5 { + margin-left: 3rem!important + } + .mx-sm-5 { + margin-right: 3rem!important; + margin-left: 3rem!important + } + .my-sm-5 { + margin-top: 3rem!important; + margin-bottom: 3rem!important + } + .p-sm-0 { + padding: 0!important + } + .pt-sm-0 { + padding-top: 0!important + } + .pr-sm-0 { + padding-right: 0!important + } + .pb-sm-0 { + padding-bottom: 0!important + } + .pl-sm-0 { + padding-left: 0!important + } + .px-sm-0 { + padding-right: 0!important; + padding-left: 0!important + } + .py-sm-0 { + padding-top: 0!important; + padding-bottom: 0!important + } + .p-sm-1 { + padding: .25rem!important + } + .pt-sm-1 { + padding-top: .25rem!important + } + .pr-sm-1 { + padding-right: .25rem!important + } + .pb-sm-1 { + padding-bottom: .25rem!important + } + .pl-sm-1 { + padding-left: .25rem!important + } + .px-sm-1 { + padding-right: .25rem!important; + padding-left: .25rem!important + } + .py-sm-1 { + padding-top: .25rem!important; + padding-bottom: .25rem!important + } + .p-sm-2 { + padding: .5rem!important + } + .pt-sm-2 { + padding-top: .5rem!important + } + .pr-sm-2 { + padding-right: .5rem!important + } + .pb-sm-2 { + padding-bottom: .5rem!important + } + .pl-sm-2 { + padding-left: .5rem!important + } + .px-sm-2 { + padding-right: .5rem!important; + padding-left: .5rem!important + } + .py-sm-2 { + padding-top: .5rem!important; + padding-bottom: .5rem!important + } + .p-sm-3 { + padding: 1rem!important + } + .pt-sm-3 { + padding-top: 1rem!important + } + .pr-sm-3 { + padding-right: 1rem!important + } + .pb-sm-3 { + padding-bottom: 1rem!important + } + .pl-sm-3 { + padding-left: 1rem!important + } + .px-sm-3 { + padding-right: 1rem!important; + padding-left: 1rem!important + } + .py-sm-3 { + padding-top: 1rem!important; + padding-bottom: 1rem!important + } + .p-sm-4 { + padding: 1.5rem!important + } + .pt-sm-4 { + padding-top: 1.5rem!important + } + .pr-sm-4 { + padding-right: 1.5rem!important + } + .pb-sm-4 { + padding-bottom: 1.5rem!important + } + .pl-sm-4 { + padding-left: 1.5rem!important + } + .px-sm-4 { + padding-right: 1.5rem!important; + padding-left: 1.5rem!important + } + .py-sm-4 { + padding-top: 1.5rem!important; + padding-bottom: 1.5rem!important + } + .p-sm-5 { + padding: 3rem!important + } + .pt-sm-5 { + padding-top: 3rem!important + } + .pr-sm-5 { + padding-right: 3rem!important + } + .pb-sm-5 { + padding-bottom: 3rem!important + } + .pl-sm-5 { + padding-left: 3rem!important + } + .px-sm-5 { + padding-right: 3rem!important; + padding-left: 3rem!important + } + .py-sm-5 { + padding-top: 3rem!important; + padding-bottom: 3rem!important + } + .m-sm-auto { + margin: auto!important + } + .mt-sm-auto { + margin-top: auto!important + } + .mr-sm-auto { + margin-right: auto!important + } + .mb-sm-auto { + margin-bottom: auto!important + } + .ml-sm-auto { + margin-left: auto!important + } + .mx-sm-auto { + margin-right: auto!important; + margin-left: auto!important + } + .my-sm-auto { + margin-top: auto!important; + margin-bottom: auto!important + } +} + +@media (min-width:768px) { + .m-md-0 { + margin: 0!important + } + .mt-md-0 { + margin-top: 0!important + } + .mr-md-0 { + margin-right: 0!important + } + .mb-md-0 { + margin-bottom: 0!important + } + .ml-md-0 { + margin-left: 0!important + } + .mx-md-0 { + margin-right: 0!important; + margin-left: 0!important + } + .my-md-0 { + margin-top: 0!important; + margin-bottom: 0!important + } + .m-md-1 { + margin: .25rem!important + } + .mt-md-1 { + margin-top: .25rem!important + } + .mr-md-1 { + margin-right: .25rem!important + } + .mb-md-1 { + margin-bottom: .25rem!important + } + .ml-md-1 { + margin-left: .25rem!important + } + .mx-md-1 { + margin-right: .25rem!important; + margin-left: .25rem!important + } + .my-md-1 { + margin-top: .25rem!important; + margin-bottom: .25rem!important + } + .m-md-2 { + margin: .5rem!important + } + .mt-md-2 { + margin-top: .5rem!important + } + .mr-md-2 { + margin-right: .5rem!important + } + .mb-md-2 { + margin-bottom: .5rem!important + } + .ml-md-2 { + margin-left: .5rem!important + } + .mx-md-2 { + margin-right: .5rem!important; + margin-left: .5rem!important + } + .my-md-2 { + margin-top: .5rem!important; + margin-bottom: .5rem!important + } + .m-md-3 { + margin: 1rem!important + } + .mt-md-3 { + margin-top: 1rem!important + } + .mr-md-3 { + margin-right: 1rem!important + } + .mb-md-3 { + margin-bottom: 1rem!important + } + .ml-md-3 { + margin-left: 1rem!important + } + .mx-md-3 { + margin-right: 1rem!important; + margin-left: 1rem!important + } + .my-md-3 { + margin-top: 1rem!important; + margin-bottom: 1rem!important + } + .m-md-4 { + margin: 1.5rem!important + } + .mt-md-4 { + margin-top: 1.5rem!important + } + .mr-md-4 { + margin-right: 1.5rem!important + } + .mb-md-4 { + margin-bottom: 1.5rem!important + } + .ml-md-4 { + margin-left: 1.5rem!important + } + .mx-md-4 { + margin-right: 1.5rem!important; + margin-left: 1.5rem!important + } + .my-md-4 { + margin-top: 1.5rem!important; + margin-bottom: 1.5rem!important + } + .m-md-5 { + margin: 3rem!important + } + .mt-md-5 { + margin-top: 3rem!important + } + .mr-md-5 { + margin-right: 3rem!important + } + .mb-md-5 { + margin-bottom: 3rem!important + } + .ml-md-5 { + margin-left: 3rem!important + } + .mx-md-5 { + margin-right: 3rem!important; + margin-left: 3rem!important + } + .my-md-5 { + margin-top: 3rem!important; + margin-bottom: 3rem!important + } + .p-md-0 { + padding: 0!important + } + .pt-md-0 { + padding-top: 0!important + } + .pr-md-0 { + padding-right: 0!important + } + .pb-md-0 { + padding-bottom: 0!important + } + .pl-md-0 { + padding-left: 0!important + } + .px-md-0 { + padding-right: 0!important; + padding-left: 0!important + } + .py-md-0 { + padding-top: 0!important; + padding-bottom: 0!important + } + .p-md-1 { + padding: .25rem!important + } + .pt-md-1 { + padding-top: .25rem!important + } + .pr-md-1 { + padding-right: .25rem!important + } + .pb-md-1 { + padding-bottom: .25rem!important + } + .pl-md-1 { + padding-left: .25rem!important + } + .px-md-1 { + padding-right: .25rem!important; + padding-left: .25rem!important + } + .py-md-1 { + padding-top: .25rem!important; + padding-bottom: .25rem!important + } + .p-md-2 { + padding: .5rem!important + } + .pt-md-2 { + padding-top: .5rem!important + } + .pr-md-2 { + padding-right: .5rem!important + } + .pb-md-2 { + padding-bottom: .5rem!important + } + .pl-md-2 { + padding-left: .5rem!important + } + .px-md-2 { + padding-right: .5rem!important; + padding-left: .5rem!important + } + .py-md-2 { + padding-top: .5rem!important; + padding-bottom: .5rem!important + } + .p-md-3 { + padding: 1rem!important + } + .pt-md-3 { + padding-top: 1rem!important + } + .pr-md-3 { + padding-right: 1rem!important + } + .pb-md-3 { + padding-bottom: 1rem!important + } + .pl-md-3 { + padding-left: 1rem!important + } + .px-md-3 { + padding-right: 1rem!important; + padding-left: 1rem!important + } + .py-md-3 { + padding-top: 1rem!important; + padding-bottom: 1rem!important + } + .p-md-4 { + padding: 1.5rem!important + } + .pt-md-4 { + padding-top: 1.5rem!important + } + .pr-md-4 { + padding-right: 1.5rem!important + } + .pb-md-4 { + padding-bottom: 1.5rem!important + } + .pl-md-4 { + padding-left: 1.5rem!important + } + .px-md-4 { + padding-right: 1.5rem!important; + padding-left: 1.5rem!important + } + .py-md-4 { + padding-top: 1.5rem!important; + padding-bottom: 1.5rem!important + } + .p-md-5 { + padding: 3rem!important + } + .pt-md-5 { + padding-top: 3rem!important + } + .pr-md-5 { + padding-right: 3rem!important + } + .pb-md-5 { + padding-bottom: 3rem!important + } + .pl-md-5 { + padding-left: 3rem!important + } + .px-md-5 { + padding-right: 3rem!important; + padding-left: 3rem!important + } + .py-md-5 { + padding-top: 3rem!important; + padding-bottom: 3rem!important + } + .m-md-auto { + margin: auto!important + } + .mt-md-auto { + margin-top: auto!important + } + .mr-md-auto { + margin-right: auto!important + } + .mb-md-auto { + margin-bottom: auto!important + } + .ml-md-auto { + margin-left: auto!important + } + .mx-md-auto { + margin-right: auto!important; + margin-left: auto!important + } + .my-md-auto { + margin-top: auto!important; + margin-bottom: auto!important + } +} + +@media (min-width:992px) { + .m-lg-0 { + margin: 0!important + } + .mt-lg-0 { + margin-top: 0!important + } + .mr-lg-0 { + margin-right: 0!important + } + .mb-lg-0 { + margin-bottom: 0!important + } + .ml-lg-0 { + margin-left: 0!important + } + .mx-lg-0 { + margin-right: 0!important; + margin-left: 0!important + } + .my-lg-0 { + margin-top: 0!important; + margin-bottom: 0!important + } + .m-lg-1 { + margin: .25rem!important + } + .mt-lg-1 { + margin-top: .25rem!important + } + .mr-lg-1 { + margin-right: .25rem!important + } + .mb-lg-1 { + margin-bottom: .25rem!important + } + .ml-lg-1 { + margin-left: .25rem!important + } + .mx-lg-1 { + margin-right: .25rem!important; + margin-left: .25rem!important + } + .my-lg-1 { + margin-top: .25rem!important; + margin-bottom: .25rem!important + } + .m-lg-2 { + margin: .5rem!important + } + .mt-lg-2 { + margin-top: .5rem!important + } + .mr-lg-2 { + margin-right: .5rem!important + } + .mb-lg-2 { + margin-bottom: .5rem!important + } + .ml-lg-2 { + margin-left: .5rem!important + } + .mx-lg-2 { + margin-right: .5rem!important; + margin-left: .5rem!important + } + .my-lg-2 { + margin-top: .5rem!important; + margin-bottom: .5rem!important + } + .m-lg-3 { + margin: 1rem!important + } + .mt-lg-3 { + margin-top: 1rem!important + } + .mr-lg-3 { + margin-right: 1rem!important + } + .mb-lg-3 { + margin-bottom: 1rem!important + } + .ml-lg-3 { + margin-left: 1rem!important + } + .mx-lg-3 { + margin-right: 1rem!important; + margin-left: 1rem!important + } + .my-lg-3 { + margin-top: 1rem!important; + margin-bottom: 1rem!important + } + .m-lg-4 { + margin: 1.5rem!important + } + .mt-lg-4 { + margin-top: 1.5rem!important + } + .mr-lg-4 { + margin-right: 1.5rem!important + } + .mb-lg-4 { + margin-bottom: 1.5rem!important + } + .ml-lg-4 { + margin-left: 1.5rem!important + } + .mx-lg-4 { + margin-right: 1.5rem!important; + margin-left: 1.5rem!important + } + .my-lg-4 { + margin-top: 1.5rem!important; + margin-bottom: 1.5rem!important + } + .m-lg-5 { + margin: 3rem!important + } + .mt-lg-5 { + margin-top: 3rem!important + } + .mr-lg-5 { + margin-right: 3rem!important + } + .mb-lg-5 { + margin-bottom: 3rem!important + } + .ml-lg-5 { + margin-left: 3rem!important + } + .mx-lg-5 { + margin-right: 3rem!important; + margin-left: 3rem!important + } + .my-lg-5 { + margin-top: 3rem!important; + margin-bottom: 3rem!important + } + .p-lg-0 { + padding: 0!important + } + .pt-lg-0 { + padding-top: 0!important + } + .pr-lg-0 { + padding-right: 0!important + } + .pb-lg-0 { + padding-bottom: 0!important + } + .pl-lg-0 { + padding-left: 0!important + } + .px-lg-0 { + padding-right: 0!important; + padding-left: 0!important + } + .py-lg-0 { + padding-top: 0!important; + padding-bottom: 0!important + } + .p-lg-1 { + padding: .25rem!important + } + .pt-lg-1 { + padding-top: .25rem!important + } + .pr-lg-1 { + padding-right: .25rem!important + } + .pb-lg-1 { + padding-bottom: .25rem!important + } + .pl-lg-1 { + padding-left: .25rem!important + } + .px-lg-1 { + padding-right: .25rem!important; + padding-left: .25rem!important + } + .py-lg-1 { + padding-top: .25rem!important; + padding-bottom: .25rem!important + } + .p-lg-2 { + padding: .5rem!important + } + .pt-lg-2 { + padding-top: .5rem!important + } + .pr-lg-2 { + padding-right: .5rem!important + } + .pb-lg-2 { + padding-bottom: .5rem!important + } + .pl-lg-2 { + padding-left: .5rem!important + } + .px-lg-2 { + padding-right: .5rem!important; + padding-left: .5rem!important + } + .py-lg-2 { + padding-top: .5rem!important; + padding-bottom: .5rem!important + } + .p-lg-3 { + padding: 1rem!important + } + .pt-lg-3 { + padding-top: 1rem!important + } + .pr-lg-3 { + padding-right: 1rem!important + } + .pb-lg-3 { + padding-bottom: 1rem!important + } + .pl-lg-3 { + padding-left: 1rem!important + } + .px-lg-3 { + padding-right: 1rem!important; + padding-left: 1rem!important + } + .py-lg-3 { + padding-top: 1rem!important; + padding-bottom: 1rem!important + } + .p-lg-4 { + padding: 1.5rem!important + } + .pt-lg-4 { + padding-top: 1.5rem!important + } + .pr-lg-4 { + padding-right: 1.5rem!important + } + .pb-lg-4 { + padding-bottom: 1.5rem!important + } + .pl-lg-4 { + padding-left: 1.5rem!important + } + .px-lg-4 { + padding-right: 1.5rem!important; + padding-left: 1.5rem!important + } + .py-lg-4 { + padding-top: 1.5rem!important; + padding-bottom: 1.5rem!important + } + .p-lg-5 { + padding: 3rem!important + } + .pt-lg-5 { + padding-top: 3rem!important + } + .pr-lg-5 { + padding-right: 3rem!important + } + .pb-lg-5 { + padding-bottom: 3rem!important + } + .pl-lg-5 { + padding-left: 3rem!important + } + .px-lg-5 { + padding-right: 3rem!important; + padding-left: 3rem!important + } + .py-lg-5 { + padding-top: 3rem!important; + padding-bottom: 3rem!important + } + .m-lg-auto { + margin: auto!important + } + .mt-lg-auto { + margin-top: auto!important + } + .mr-lg-auto { + margin-right: auto!important + } + .mb-lg-auto { + margin-bottom: auto!important + } + .ml-lg-auto { + margin-left: auto!important + } + .mx-lg-auto { + margin-right: auto!important; + margin-left: auto!important + } + .my-lg-auto { + margin-top: auto!important; + margin-bottom: auto!important + } +} + +@media (min-width:1200px) { + .m-xl-0 { + margin: 0!important + } + .mt-xl-0 { + margin-top: 0!important + } + .mr-xl-0 { + margin-right: 0!important + } + .mb-xl-0 { + margin-bottom: 0!important + } + .ml-xl-0 { + margin-left: 0!important + } + .mx-xl-0 { + margin-right: 0!important; + margin-left: 0!important + } + .my-xl-0 { + margin-top: 0!important; + margin-bottom: 0!important + } + .m-xl-1 { + margin: .25rem!important + } + .mt-xl-1 { + margin-top: .25rem!important + } + .mr-xl-1 { + margin-right: .25rem!important + } + .mb-xl-1 { + margin-bottom: .25rem!important + } + .ml-xl-1 { + margin-left: .25rem!important + } + .mx-xl-1 { + margin-right: .25rem!important; + margin-left: .25rem!important + } + .my-xl-1 { + margin-top: .25rem!important; + margin-bottom: .25rem!important + } + .m-xl-2 { + margin: .5rem!important + } + .mt-xl-2 { + margin-top: .5rem!important + } + .mr-xl-2 { + margin-right: .5rem!important + } + .mb-xl-2 { + margin-bottom: .5rem!important + } + .ml-xl-2 { + margin-left: .5rem!important + } + .mx-xl-2 { + margin-right: .5rem!important; + margin-left: .5rem!important + } + .my-xl-2 { + margin-top: .5rem!important; + margin-bottom: .5rem!important + } + .m-xl-3 { + margin: 1rem!important + } + .mt-xl-3 { + margin-top: 1rem!important + } + .mr-xl-3 { + margin-right: 1rem!important + } + .mb-xl-3 { + margin-bottom: 1rem!important + } + .ml-xl-3 { + margin-left: 1rem!important + } + .mx-xl-3 { + margin-right: 1rem!important; + margin-left: 1rem!important + } + .my-xl-3 { + margin-top: 1rem!important; + margin-bottom: 1rem!important + } + .m-xl-4 { + margin: 1.5rem!important + } + .mt-xl-4 { + margin-top: 1.5rem!important + } + .mr-xl-4 { + margin-right: 1.5rem!important + } + .mb-xl-4 { + margin-bottom: 1.5rem!important + } + .ml-xl-4 { + margin-left: 1.5rem!important + } + .mx-xl-4 { + margin-right: 1.5rem!important; + margin-left: 1.5rem!important + } + .my-xl-4 { + margin-top: 1.5rem!important; + margin-bottom: 1.5rem!important + } + .m-xl-5 { + margin: 3rem!important + } + .mt-xl-5 { + margin-top: 3rem!important + } + .mr-xl-5 { + margin-right: 3rem!important + } + .mb-xl-5 { + margin-bottom: 3rem!important + } + .ml-xl-5 { + margin-left: 3rem!important + } + .mx-xl-5 { + margin-right: 3rem!important; + margin-left: 3rem!important + } + .my-xl-5 { + margin-top: 3rem!important; + margin-bottom: 3rem!important + } + .p-xl-0 { + padding: 0!important + } + .pt-xl-0 { + padding-top: 0!important + } + .pr-xl-0 { + padding-right: 0!important + } + .pb-xl-0 { + padding-bottom: 0!important + } + .pl-xl-0 { + padding-left: 0!important + } + .px-xl-0 { + padding-right: 0!important; + padding-left: 0!important + } + .py-xl-0 { + padding-top: 0!important; + padding-bottom: 0!important + } + .p-xl-1 { + padding: .25rem!important + } + .pt-xl-1 { + padding-top: .25rem!important + } + .pr-xl-1 { + padding-right: .25rem!important + } + .pb-xl-1 { + padding-bottom: .25rem!important + } + .pl-xl-1 { + padding-left: .25rem!important + } + .px-xl-1 { + padding-right: .25rem!important; + padding-left: .25rem!important + } + .py-xl-1 { + padding-top: .25rem!important; + padding-bottom: .25rem!important + } + .p-xl-2 { + padding: .5rem!important + } + .pt-xl-2 { + padding-top: .5rem!important + } + .pr-xl-2 { + padding-right: .5rem!important + } + .pb-xl-2 { + padding-bottom: .5rem!important + } + .pl-xl-2 { + padding-left: .5rem!important + } + .px-xl-2 { + padding-right: .5rem!important; + padding-left: .5rem!important + } + .py-xl-2 { + padding-top: .5rem!important; + padding-bottom: .5rem!important + } + .p-xl-3 { + padding: 1rem!important + } + .pt-xl-3 { + padding-top: 1rem!important + } + .pr-xl-3 { + padding-right: 1rem!important + } + .pb-xl-3 { + padding-bottom: 1rem!important + } + .pl-xl-3 { + padding-left: 1rem!important + } + .px-xl-3 { + padding-right: 1rem!important; + padding-left: 1rem!important + } + .py-xl-3 { + padding-top: 1rem!important; + padding-bottom: 1rem!important + } + .p-xl-4 { + padding: 1.5rem!important + } + .pt-xl-4 { + padding-top: 1.5rem!important + } + .pr-xl-4 { + padding-right: 1.5rem!important + } + .pb-xl-4 { + padding-bottom: 1.5rem!important + } + .pl-xl-4 { + padding-left: 1.5rem!important + } + .px-xl-4 { + padding-right: 1.5rem!important; + padding-left: 1.5rem!important + } + .py-xl-4 { + padding-top: 1.5rem!important; + padding-bottom: 1.5rem!important + } + .p-xl-5 { + padding: 3rem!important + } + .pt-xl-5 { + padding-top: 3rem!important + } + .pr-xl-5 { + padding-right: 3rem!important + } + .pb-xl-5 { + padding-bottom: 3rem!important + } + .pl-xl-5 { + padding-left: 3rem!important + } + .px-xl-5 { + padding-right: 3rem!important; + padding-left: 3rem!important + } + .py-xl-5 { + padding-top: 3rem!important; + padding-bottom: 3rem!important + } + .m-xl-auto { + margin: auto!important + } + .mt-xl-auto { + margin-top: auto!important + } + .mr-xl-auto { + margin-right: auto!important + } + .mb-xl-auto { + margin-bottom: auto!important + } + .ml-xl-auto { + margin-left: auto!important + } + .mx-xl-auto { + margin-right: auto!important; + margin-left: auto!important + } + .my-xl-auto { + margin-top: auto!important; + margin-bottom: auto!important + } +} + +.text-justify { + text-align: justify!important +} + +.text-nowrap { + white-space: nowrap!important +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.text-left { + text-align: left!important +} + +.text-right { + text-align: right!important +} + +.text-center { + text-align: center!important +} + +@media (min-width:576px) { + .text-sm-left { + text-align: left!important + } + .text-sm-right { + text-align: right!important + } + .text-sm-center { + text-align: center!important + } +} + +@media (min-width:768px) { + .text-md-left { + text-align: left!important + } + .text-md-right { + text-align: right!important + } + .text-md-center { + text-align: center!important + } +} + +@media (min-width:992px) { + .text-lg-left { + text-align: left!important + } + .text-lg-right { + text-align: right!important + } + .text-lg-center { + text-align: center!important + } +} + +@media (min-width:1200px) { + .text-xl-left { + text-align: left!important + } + .text-xl-right { + text-align: right!important + } + .text-xl-center { + text-align: center!important + } +} + +.text-lowercase { + text-transform: lowercase!important +} + +.text-uppercase { + text-transform: uppercase!important +} + +.text-capitalize { + text-transform: capitalize!important +} + +.font-weight-normal { + font-weight: 400 +} + +.font-weight-bold { + font-weight: 700 +} + +.font-italic { + font-style: italic +} + +.text-white { + color: #fff!important +} + +.text-primary { + color: #007bff!important +} + +a.text-primary:focus, +a.text-primary:hover { + color: #0062cc!important +} + +.text-secondary { + color: #868e96!important +} + +a.text-secondary:focus, +a.text-secondary:hover { + color: #6c757d!important +} + +.text-success { + color: #28a745!important +} + +a.text-success:focus, +a.text-success:hover { + color: #1e7e34!important +} + +.text-info { + color: #17a2b8!important +} + +a.text-info:focus, +a.text-info:hover { + color: #117a8b!important +} + +.text-warning { + color: #ffc107!important +} + +a.text-warning:focus, +a.text-warning:hover { + color: #d39e00!important +} + +.text-danger { + color: #dc3545!important +} + +a.text-danger:focus, +a.text-danger:hover { + color: #bd2130!important +} + +.text-light { + color: #f8f9fa!important +} + +a.text-light:focus, +a.text-light:hover { + color: #dae0e5!important +} + +.text-dark { + color: #343a40!important +} + +a.text-dark:focus, +a.text-dark:hover { + color: #1d2124!important +} + +.text-muted { + color: #868e96!important +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.visible { + visibility: visible!important +} + +.invisible { + visibility: hidden!important +} + +h4.modal-title { + margin:0 +} +/*# sourceMappingURL=bootstrap4.min.css.map */ \ No newline at end of file diff --git a/web/libs/css/main.dash2.css b/web/libs/css/main.dash2.css index 10da0f5..d210341 100644 --- a/web/libs/css/main.dash2.css +++ b/web/libs/css/main.dash2.css @@ -65,11 +65,13 @@ nav h4{cursor:default;font-size:95%;padding:16px 40px;font-weight:100;text-trans .m-b{margin-bottom:10px} .m-t{margin-top:10px} .m-l{margin-left:10px} +.overflow-hidden{overflow: hidden!important} .list-inline{list-style:none} .list-inline li{display:inline-block;vertical-align: top;margin:0;} .truncate{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} img{max-width:100%} .display-table{display:table;width:100%} +.display-inline{display:inline-block} .display-table-cell{display:table-cell} .small{font-size:80%} .super-center{position:absolute;left:0;top:0;right:0;bottom:0;margin:auto;width: 4em;height: 1em;} @@ -80,6 +82,13 @@ img{max-width:100%} .nodata .divider{margin:5px 0} .loading .divider{margin:5px 0} +#accbtn{ + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding: 0; +} + .monitor_item .stream-hud{opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2} .monitor_item .stream-hud .controls{position:absolute;top:10px;left:10px;} .monitor_item .stream-hud:hover{opacity:1} @@ -90,12 +99,13 @@ img{max-width:100%} .monitor_item[mode="Watch Only"] .stream-hud .lamp{color:#5da8e8} .monitor_item[mode="Idle"] .stream-hud .lamp{color:#fff} .monitor_item[mode="Record"] .stream-hud .lamp{color:#d9534f} -/*.monitor_item .data-menu{max-height:700px}*/ -.monitor_item .data-menu:not(:last-child){border-right:1px solid #fff;} -.monitor_item .data-menu.logs{list-style:none;} +/*.data-menu{max-height:700px}*/ +.data-menu:not(:last-child){border-right:1px solid #fff;} +.data-menu.logs{list-style:none;} .monitor_item .motionVision{display:none} -.monitor_item .grid-stack-item-content{width:100%!important;left:0;right:0} +.monitor_item .grid-stack-item-content{width:100%!important;left:0!important;right:0!important} +.monitor_item .ui-resizable-se {bottom: 10px!important;} .monitor_item .stream-block{position: relative;text-align: center} .monitor_item .mdl-data_window{overflow-x: auto;background:rgba(0,0,0,0.7);color:#fff;height:100%} .monitor_item .mdl-data_window:not(.col-md-6){width:0;min-width:0;height:0px;min-height:0} @@ -107,7 +117,7 @@ img{max-width:100%} .monitor_item{position:relative;padding:0;} .monitor_item{transition:none;} .monitor_item .mdl-card{min-height:auto;border:1px solid #272727;border-radius:0px;overflow:hidden} -.monitor_item .mdl-card__media{position:relative;padding:0!important;display:block!important;background:#000;min-height:250px;} +.monitor_item .mdl-card__media{position:relative;padding:0!important;display:block!important;background:#000;} .monitor_item.selected .stream-element{height:600px} .monitor_item.selected .fa-expand:before{content:"\f066"} .monitor_item .mdl-card__supporting-text{background:#222;color:#fff!important;display:block;min-height:auto!important} @@ -713,4 +723,10 @@ ul.msg_list li .message { .marc-toggle label:active:after { width: 10px; +} + +/*hexagon pattern*/ +.bg-hexagon { + background-color: #054e9f; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'%3E%3Cg fill-rule='evenodd'%3E%3Cg id='hexagons' fill='%23fdfdfd' fill-opacity='0.4' fill-rule='nonzero'%3E%3Cpath d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); } \ No newline at end of file diff --git a/web/libs/css/now-ui-kit.css b/web/libs/css/now-ui-kit.css new file mode 100644 index 0000000..4036ed5 --- /dev/null +++ b/web/libs/css/now-ui-kit.css @@ -0,0 +1,7545 @@ +/*! + + ========================================================= + * Now-ui-kit - v1.1.0 + ========================================================= + + * Product Page: http://www.creative-tim.com/product/now-ui-kit + * Copyright 2017 Creative Tim (http://www.creative-tim.com) + * Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md) + + * Designed by www.invisionapp.com Coded by www.creative-tim.com + + ========================================================= + + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + */ + + +/* brand Colors */ + + +/* light colors */ + + +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +.bootstrap-switch { + display: inline-block; + direction: ltr; + cursor: pointer; + border-radius: 30px; + border: 0; + position: relative; + text-align: left; + margin-bottom: 10px; + line-height: 8px; + width: 59px !important; + height: 22px; + outline: none; + z-index: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: middle; + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + margin-right: 20px; + background: rgba(44, 44, 44, 0.2); +} + +.bootstrap-switch .bootstrap-switch-container { + display: inline-flex; + top: 0; + height: 22px; + border-radius: 4px; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + width: 100px !important; +} + +.bootstrap-switch .bootstrap-switch-handle-on, +.bootstrap-switch .bootstrap-switch-handle-off, +.bootstrap-switch .bootstrap-switch-label { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; + display: inline-block !important; + height: 100%; + color: #fff; + padding: 6px 12px; + font-size: 11px; + text-indent: -5px; + line-height: 15px; + -webkit-transition: 0.25s ease-out; + transition: 0.25s ease-out; +} + +.bootstrap-switch .bootstrap-switch-handle-on, +.bootstrap-switch .bootstrap-switch-handle-off { + text-align: center; + z-index: 1; + float: left; + line-height: 11px; + width: 50% !important; +} + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-brown, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-brown { + color: #fff; + background: #f96332; +} + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-blue, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-blue { + color: #fff; + background: #2CA8FF; +} + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-green, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-green { + color: #fff; + background: #18ce0f; +} + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-orange, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-orange { + background: #FFB236; + color: #fff; +} + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-red, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-red { + color: #fff; + background: #FF3636; +} + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default { + color: #fff; +} + +.bootstrap-switch .bootstrap-switch-label { + text-align: center; + z-index: 100; + color: #333333; + background: #ffffff; + width: 22px !important; + height: 22px !important; + margin: 0px -11px; + border-radius: 20px; + position: absolute; + float: left; + top: 0; + left: 50%; + padding: 0; + box-shadow: 0 1px 11px rgba(0, 0, 0, 0.25); +} + +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label { + background-color: rgba(23, 23, 23, 0.4); +} + +.bootstrap-switch.bootstrap-switch-on:hover .bootstrap-switch-label { + width: 27px !important; + margin-left: -16px; +} + +.bootstrap-switch.bootstrap-switch-off:hover .bootstrap-switch-label { + width: 27px !important; + margin-left: -11px; +} + +.bootstrap-switch .bootstrap-switch-handle-on { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.bootstrap-switch .bootstrap-switch-handle-off { + text-indent: 6px; +} + +.bootstrap-switch input[type='radio'], +.bootstrap-switch input[type='checkbox'] { + position: absolute !important; + top: 0; + left: 0; + opacity: 0; + filter: alpha(opacity=0); + z-index: -1; +} + +.bootstrap-switch input[type='radio'].form-control, +.bootstrap-switch input[type='checkbox'].form-control { + height: auto; +} + +.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on, +.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off, +.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; +} + +.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on, +.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off, +.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} + +.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on, +.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off, +.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label { + padding: 6px 16px; + font-size: 18px; + line-height: 1.33; +} + +.bootstrap-switch.bootstrap-switch-disabled, +.bootstrap-switch.bootstrap-switch-readonly, +.bootstrap-switch.bootstrap-switch-indeterminate { + cursor: default !important; +} + +.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on, +.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on, +.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on, +.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off, +.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off, +.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off, +.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label, +.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label, +.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default !important; +} + +.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container { + -webkit-transition: margin-left 0.5s; + transition: margin-left 0.5s; +} + +.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-container { + margin-left: -2px !important; +} + +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-container { + margin-left: -39px !important; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label:before { + background-color: #FFFFFF; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-red~.bootstrap-switch-default { + background-color: #FF3636; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-orange~.bootstrap-switch-default { + background-color: #FFB236; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-green~.bootstrap-switch-default { + background-color: #18ce0f; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-brown~.bootstrap-switch-default { + background-color: #f96332; +} + +.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-blue~.bootstrap-switch-default { + background-color: #2CA8FF; +} + +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-red, +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-brown, +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-blue, +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-orange, +.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-green { + background-color: #E3E3E3; +} + +.bootstrap-switch-off .bootstrap-switch-handle-on { + opacity: 0; +} + +.bootstrap-switch-on .bootstrap-switch-handle-off { + opacity: 0; +} + + +/*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */ + + +/* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. + */ + +.noUi-target, +.noUi-target * { + -webkit-touch-callout: none; + -webkit-tap-highlight-color: transparent; + -webkit-user-select: none; + -ms-touch-action: none; + touch-action: none; + -ms-user-select: none; + -moz-user-select: none; + user-select: none; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.noUi-target { + position: relative; + direction: ltr; +} + +.noUi-base { + width: 100%; + height: 100%; + position: relative; + z-index: 1; + /* Fix 401 */ +} + +.noUi-connect { + position: absolute; + right: 0; + top: 0; + left: 0; + bottom: 0; +} + +.noUi-origin { + position: absolute; + height: 0; + width: 0; +} + +.noUi-handle { + position: relative; + z-index: 1; +} + +.noUi-state-tap .noUi-connect, +.noUi-state-tap .noUi-origin { + -webkit-transition: top 0.3s, right 0.3s, bottom 0.3s, left 0.3s; + transition: top 0.3s, right 0.3s, bottom 0.3s, left 0.3s; +} + +.noUi-state-drag * { + cursor: inherit !important; +} + + +/* Painting and performance; + * Browsers can paint handles in their own layer. + */ + +.noUi-base, +.noUi-handle { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + + +/* Slider size and handle placement; + */ + +.noUi-horizontal { + height: 1px; +} + +.noUi-horizontal .noUi-handle { + border-radius: 50%; + background-color: #FFFFFF; + box-shadow: 0 1px 13px 0 rgba(0, 0, 0, 0.2); + height: 15px; + width: 15px; + cursor: pointer; + margin-left: -10px; + margin-top: -7px; +} + +.noUi-vertical { + width: 18px; +} + +.noUi-vertical .noUi-handle { + width: 28px; + height: 34px; + left: -6px; + top: -17px; +} + + +/* Styling; + */ + +.noUi-target { + background-color: rgba(182, 182, 182, 0.3); + border-radius: 3px; +} + +.noUi-connect { + background: #888; + border-radius: 3px; + -webkit-transition: background 450ms; + transition: background 450ms; +} + + +/* Handles and cursors; + */ + +.noUi-draggable { + cursor: ew-resize; +} + +.noUi-vertical .noUi-draggable { + cursor: ns-resize; +} + +.noUi-handle { + border-radius: 3px; + background: #FFF; + cursor: default; + box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; + -webkit-transition: 300ms ease 0s; + -moz-transition: 300ms ease 0s; + -ms-transition: 300ms ease 0s; + -o-transform: 300ms ease 0s; + transition: 300ms ease 0s; +} + +.noUi-active { + -webkit-transform: scale3d(1.5, 1.5, 1); + -moz-transform: scale3d(1.5, 1.5, 1); + -ms-transform: scale3d(1.5, 1.5, 1); + -o-transform: scale3d(1.5, 1.5, 1); + transform: scale3d(1.5, 1.5, 1); +} + + +/* Disabled state; + */ + +[disabled] .noUi-connect { + background: #B8B8B8; +} + +[disabled].noUi-target, +[disabled].noUi-handle, +[disabled] .noUi-handle { + cursor: not-allowed; +} + + +/* Base; + * + */ + +.noUi-pips, +.noUi-pips * { + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.noUi-pips { + position: absolute; + color: #999; +} + + +/* Values; + * + */ + +.noUi-value { + position: absolute; + text-align: center; +} + +.noUi-value-sub { + color: #ccc; + font-size: 10px; +} + + +/* Markings; + * + */ + +.noUi-marker { + position: absolute; + background: #CCC; +} + +.noUi-marker-sub { + background: #AAA; +} + +.noUi-marker-large { + background: #AAA; +} + + +/* Horizontal layout; + * + */ + +.noUi-pips-horizontal { + padding: 10px 0; + height: 80px; + top: 100%; + left: 0; + width: 100%; +} + +.noUi-value-horizontal { + -webkit-transform: translate3d(-50%, 50%, 0); + transform: translate3d(-50%, 50%, 0); +} + +.noUi-marker-horizontal.noUi-marker { + margin-left: -1px; + width: 2px; + height: 5px; +} + +.noUi-marker-horizontal.noUi-marker-sub { + height: 10px; +} + +.noUi-marker-horizontal.noUi-marker-large { + height: 15px; +} + + +/* Vertical layout; + * + */ + +.noUi-pips-vertical { + padding: 0 10px; + height: 100%; + top: 0; + left: 100%; +} + +.noUi-value-vertical { + -webkit-transform: translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0); + padding-left: 25px; +} + +.noUi-marker-vertical.noUi-marker { + width: 5px; + height: 2px; + margin-top: -1px; +} + +.noUi-marker-vertical.noUi-marker-sub { + width: 10px; +} + +.noUi-marker-vertical.noUi-marker-large { + width: 15px; +} + +.noUi-tooltip { + display: block; + position: absolute; + border: 1px solid #D9D9D9; + border-radius: 3px; + background: #fff; + color: #000; + padding: 5px; + text-align: center; +} + +.noUi-horizontal .noUi-tooltip { + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); + left: 50%; + bottom: 120%; +} + +.noUi-vertical .noUi-tooltip { + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + top: 50%; + right: 120%; +} + +.slider.slider-neutral .noUi-connect, +.slider.slider-neutral.noUi-connect { + background-color: #FFFFFF; +} + +.slider.slider-neutral.noUi-target { + background-color: rgba(255, 255, 255, 0.3); +} + +.slider.slider-neutral .noUi-handle { + background-color: #FFFFFF; +} + +.slider.slider-primary .noUi-connect, +.slider.slider-primary.noUi-connect { + background-color: #f96332; +} + +.slider.slider-primary.noUi-target { + background-color: rgba(249, 99, 50, 0.3); +} + +.slider.slider-primary .noUi-handle { + background-color: #f96332; +} + +.slider.slider-info .noUi-connect, +.slider.slider-info.noUi-connect { + background-color: #2CA8FF; +} + +.slider.slider-info.noUi-target { + background-color: rgba(44, 168, 255, 0.3); +} + +.slider.slider-info .noUi-handle { + background-color: #2CA8FF; +} + +.slider.slider-success .noUi-connect, +.slider.slider-success.noUi-connect { + background-color: #18ce0f; +} + +.slider.slider-success.noUi-target { + background-color: rgba(24, 206, 15, 0.3); +} + +.slider.slider-success .noUi-handle { + background-color: #18ce0f; +} + +.slider.slider-warning .noUi-connect, +.slider.slider-warning.noUi-connect { + background-color: #FFB236; +} + +.slider.slider-warning.noUi-target { + background-color: rgba(255, 178, 54, 0.3); +} + +.slider.slider-warning .noUi-handle { + background-color: #FFB236; +} + +.slider.slider-danger .noUi-connect, +.slider.slider-danger.noUi-connect { + background-color: #FF3636; +} + +.slider.slider-danger.noUi-target { + background-color: rgba(255, 54, 54, 0.3); +} + +.slider.slider-danger .noUi-handle { + background-color: #FF3636; +} + + +/*! + * Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +.datepicker { + padding: 8px 6px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; + -webkit-transform: translate3d(0, -40px, 0); + -moz-transform: translate3d(0, -40px, 0); + -o-transform: translate3d(0, -40px, 0); + -ms-transform: translate3d(0, -40px, 0); + transform: translate3d(0, -40px, 0); + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1) 0s, opacity 0.3s ease 0s, height 0s linear 0.35s; + opacity: 0; + filter: alpha(opacity=0); + visibility: hidden; + display: block; + width: 254px; + max-width: 254px; +} + +.datepicker.dropdown-menu:before { + display: none; +} + +.datepicker.datepicker-primary { + background-color: #f96332; +} + +.datepicker.datepicker-primary th, +.datepicker.datepicker-primary .day div, +.datepicker.datepicker-primary table tr td span { + color: #FFFFFF; +} + +.datepicker.datepicker-primary:after { + border-bottom-color: #f96332; +} + +.datepicker.datepicker-primary.datepicker-orient-top:after { + border-top-color: #f96332; +} + +.datepicker.datepicker-primary .dow { + color: rgba(255, 255, 255, 0.8); +} + +.datepicker.datepicker-primary table tr td.old div, +.datepicker.datepicker-primary table tr td.new div, +.datepicker.datepicker-primary table tr td span.old, +.datepicker.datepicker-primary table tr td span.new { + color: rgba(255, 255, 255, 0.4); +} + +.datepicker.datepicker-primary table tr td span:hover, +.datepicker.datepicker-primary table tr td span.focused { + background: rgba(255, 255, 255, 0.1); +} + +.datepicker.datepicker-primary .datepicker-switch:hover, +.datepicker.datepicker-primary .prev:hover, +.datepicker.datepicker-primary .next:hover, +.datepicker.datepicker-primary tfoot tr th:hover { + background: rgba(255, 255, 255, 0.2); +} + +.datepicker.datepicker-primary table tr td.active div, +.datepicker.datepicker-primary table tr td.active:hover div, +.datepicker.datepicker-primary table tr td.active.disabled div, +.datepicker.datepicker-primary table tr td.active.disabled:hover div { + background-color: #FFFFFF; + color: #f96332; +} + +.datepicker.datepicker-primary table tr td.day:hover div, +.datepicker.datepicker-primary table tr td.day.focused div { + background: rgba(255, 255, 255, 0.2); +} + +.datepicker.datepicker-primary table tr td.active:hover div, +.datepicker.datepicker-primary table tr td.active:hover:hover div, +.datepicker.datepicker-primary table tr td.active.disabled:hover div, +.datepicker.datepicker-primary table tr td.active.disabled:hover:hover div, +.datepicker.datepicker-primary table tr td.active:active div, +.datepicker.datepicker-primary table tr td.active:hover:active div, +.datepicker.datepicker-primary table tr td.active.disabled:active div, +.datepicker.datepicker-primary table tr td.active.disabled:hover:active div, +.datepicker.datepicker-primary table tr td.active.active div, +.datepicker.datepicker-primary table tr td.active:hover.active div, +.datepicker.datepicker-primary table tr td.active.disabled.active div, +.datepicker.datepicker-primary table tr td.active.disabled:hover.active div, +.datepicker.datepicker-primary table tr td.active.disabled div, +.datepicker.datepicker-primary table tr td.active:hover.disabled div, +.datepicker.datepicker-primary table tr td.active.disabled.disabled div, +.datepicker.datepicker-primary table tr td.active.disabled:hover.disabled div, +.datepicker.datepicker-primary table tr td.active[disabled] div, +.datepicker.datepicker-primary table tr td.active:hover[disabled] div, +.datepicker.datepicker-primary table tr td.active.disabled[disabled] div, +.datepicker.datepicker-primary table tr td.active.disabled:hover[disabled] div, +.datepicker.datepicker-primary table tr td span.active:hover, +.datepicker.datepicker-primary table tr td span.active:hover:hover, +.datepicker.datepicker-primary table tr td span.active.disabled:hover, +.datepicker.datepicker-primary table tr td span.active.disabled:hover:hover, +.datepicker.datepicker-primary table tr td span.active:active, +.datepicker.datepicker-primary table tr td span.active:hover:active, +.datepicker.datepicker-primary table tr td span.active.disabled:active, +.datepicker.datepicker-primary table tr td span.active.disabled:hover:active, +.datepicker.datepicker-primary table tr td span.active.active, +.datepicker.datepicker-primary table tr td span.active:hover.active, +.datepicker.datepicker-primary table tr td span.active.disabled.active, +.datepicker.datepicker-primary table tr td span.active.disabled:hover.active, +.datepicker.datepicker-primary table tr td span.active.disabled, +.datepicker.datepicker-primary table tr td span.active:hover.disabled, +.datepicker.datepicker-primary table tr td span.active.disabled.disabled, +.datepicker.datepicker-primary table tr td span.active.disabled:hover.disabled, +.datepicker.datepicker-primary table tr td span.active[disabled], +.datepicker.datepicker-primary table tr td span.active:hover[disabled], +.datepicker.datepicker-primary table tr td span.active.disabled[disabled], +.datepicker.datepicker-primary table tr td span.active.disabled:hover[disabled] { + background-color: #FFFFFF; +} + +.datepicker.datepicker-primary table tr td span.active:hover, +.datepicker.datepicker-primary table tr td span.active:hover:hover, +.datepicker.datepicker-primary table tr td span.active.disabled:hover, +.datepicker.datepicker-primary table tr td span.active.disabled:hover:hover, +.datepicker.datepicker-primary table tr td span.active:active, +.datepicker.datepicker-primary table tr td span.active:hover:active, +.datepicker.datepicker-primary table tr td span.active.disabled:active, +.datepicker.datepicker-primary table tr td span.active.disabled:hover:active, +.datepicker.datepicker-primary table tr td span.active.active, +.datepicker.datepicker-primary table tr td span.active:hover.active, +.datepicker.datepicker-primary table tr td span.active.disabled.active, +.datepicker.datepicker-primary table tr td span.active.disabled:hover.active, +.datepicker.datepicker-primary table tr td span.active.disabled, +.datepicker.datepicker-primary table tr td span.active:hover.disabled, +.datepicker.datepicker-primary table tr td span.active.disabled.disabled, +.datepicker.datepicker-primary table tr td span.active.disabled:hover.disabled, +.datepicker.datepicker-primary table tr td span.active[disabled], +.datepicker.datepicker-primary table tr td span.active:hover[disabled], +.datepicker.datepicker-primary table tr td span.active.disabled[disabled], +.datepicker.datepicker-primary table tr td span.active.disabled:hover[disabled] { + color: #f96332; +} + +.datepicker-inline { + width: 220px; +} + +.datepicker.datepicker-rtl { + direction: rtl; +} + +.datepicker.datepicker-rtl.dropdown-menu { + left: auto; +} + +.datepicker.datepicker-rtl table tr td span { + float: right; +} + +.datepicker-dropdown { + top: 0; + left: 0; +} + +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid transparent; + border-top: 0; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; +} + +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-top: 0; + position: absolute; +} + +.datepicker-dropdown.datepicker-orient-left:before { + left: 6px; +} + +.datepicker-dropdown.datepicker-orient-left:after { + left: 7px; +} + +.datepicker-dropdown.datepicker-orient-right:before { + right: 6px; +} + +.datepicker-dropdown.datepicker-orient-right:after { + right: 7px; +} + +.datepicker-dropdown.datepicker-orient-bottom:before { + top: -7px; +} + +.datepicker-dropdown.datepicker-orient-bottom:after { + top: -6px; +} + +.datepicker-dropdown.datepicker-orient-top:before { + bottom: -7px; + border-bottom: 0; + border-top: 7px solid transparent; +} + +.datepicker-dropdown.datepicker-orient-top:after { + bottom: -6px; + border-bottom: 0; + border-top: 6px solid #fff; +} + +.datepicker table { + margin: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 241px; + max-width: 241px; +} + +.datepicker .day div, +.datepicker th { + -webkit-transition: all 300ms ease 0s; + -moz-transition: all 300ms ease 0s; + -o-transition: all 300ms ease 0s; + -ms-transition: all 300ms ease 0s; + transition: all 300ms ease 0s; + text-align: center; + width: 30px; + height: 30px; + line-height: 2.2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 50%; + font-weight: 300; + font-size: 14px; + border: none; + position: relative; + cursor: pointer; +} + +.datepicker th { + color: #f96332; +} + +.table-condensed>tbody>tr>td, +.table-condensed>tbody>tr>th, +.table-condensed>tfoot>tr>td, +.table-condensed>tfoot>tr>th, +.table-condensed>thead>tr>td, +.table-condensed>thead>tr>th { + padding: 2px; + text-align: center; + cursor: pointer; +} + +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} + +.datepicker table tr td.day:hover div, +.datepicker table tr td.day.focused div { + background: #eee; + cursor: pointer; +} + +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #888; +} + +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #888; + cursor: default; +} + +.datepicker table tr td.highlighted { + background: #d9edf7; + border-radius: 0; +} + +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a); + background-image: linear-gradient(to bottom, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; +} + +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} + +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; +} + +.datepicker table tr td.today:hover:hover { + color: #000; +} + +.datepicker table tr td.today.active:hover { + color: #fff; +} + +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: #eee; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a); + background-image: linear-gradient(to bottom, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; +} + +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; +} + +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + background-color: #9e9e9e; + background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080); + background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); + background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080); + background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080); + background-image: linear-gradient(to bottom, #b3b3b3, #808080); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); + border-color: #808080 #808080 #595959; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled] { + background-color: #808080; +} + +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active { + background-color: #666666 \9; +} + +.datepicker table tr td.active div, +.datepicker table tr td.active:hover div, +.datepicker table tr td.active.disabled div, +.datepicker table tr td.active.disabled:hover div { + background-color: #f96332; + color: #FFFFFF; + box-shadow: 0px 1px 10px 0px rgba(0, 0, 0, 0.2); +} + +.datepicker table tr td.active:hover div, +.datepicker table tr td.active:hover:hover div, +.datepicker table tr td.active.disabled:hover div, +.datepicker table tr td.active.disabled:hover:hover div, +.datepicker table tr td.active:active div, +.datepicker table tr td.active:hover:active div, +.datepicker table tr td.active.disabled:active div, +.datepicker table tr td.active.disabled:hover:active div, +.datepicker table tr td.active.active div, +.datepicker table tr td.active:hover.active div, +.datepicker table tr td.active.disabled.active div, +.datepicker table tr td.active.disabled:hover.active div, +.datepicker table tr td.active.disabled div, +.datepicker table tr td.active:hover.disabled div, +.datepicker table tr td.active.disabled.disabled div, +.datepicker table tr td.active.disabled:hover.disabled div, +.datepicker table tr td.active[disabled] div, +.datepicker table tr td.active:hover[disabled] div, +.datepicker table tr td.active.disabled[disabled] div, +.datepicker table tr td.active.disabled:hover[disabled] div { + background-color: #f96332; +} + +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; +} + +.datepicker table tr td span { + display: block; + width: 41px; + height: 41px; + line-height: 41px; + float: left; + margin: 1%; + font-size: 14px; + cursor: pointer; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + border-radius: 50%; +} + +.datepicker table tr td span:hover, +.datepicker table tr td span.focused { + background: #eee; +} + +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #888; + cursor: default; +} + +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + color: #fff; + background-color: #f96332; +} + +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #f96332; + box-shadow: 0px 1px 10px 0px rgba(0, 0, 0, 0.2); +} + +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; +} + +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #888; +} + +.datepicker .datepicker-switch { + width: auto; + border-radius: 0.1875rem; +} + +.datepicker .datepicker-switch, +.datepicker .prev, +.datepicker .next, +.datepicker tfoot tr th { + cursor: pointer; +} + +.datepicker .prev, +.datepicker .next { + width: 35px; + height: 35px; +} + +.datepicker i { + position: relative; + top: 2px; +} + +.datepicker .prev i { + left: -1px; +} + +.datepicker .next i { + right: -1px; +} + +.datepicker .datepicker-switch:hover, +.datepicker .prev:hover, +.datepicker .next:hover, +.datepicker tfoot tr th:hover { + background: #eee; +} + +.datepicker .prev.disabled, +.datepicker .next.disabled { + visibility: hidden; +} + +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} + +.input-append.date .add-on, +.input-prepend.date .add-on { + cursor: pointer; +} + +.input-append.date .add-on i, +.input-prepend.date .add-on i { + margin-top: 3px; +} + +.input-daterange input { + text-align: center; +} + +.input-daterange input:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-daterange input:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-daterange .add-on { + display: inline-block; + width: auto; + min-width: 16px; + height: 18px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #fff; + vertical-align: middle; + background-color: #eee; + border: 1px solid #ccc; + margin-left: -5px; + margin-right: -5px; +} + +.btn, +.navbar .navbar-nav>a.btn { + border-width: 2px; + font-weight: 400; + font-size: 0.8571em; + line-height: 1.35em; + margin: 5px 1px; + border: none; + border-radius: 0.1875rem; + padding: 11px 22px; + cursor: pointer; + background-color: #888; + color: #FFFFFF; +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn:active:focus, +.btn:active:hover, +.btn.active:focus, +.btn.active:hover, +.show>.btn.dropdown-toggle, +.show>.btn.dropdown-toggle:focus, +.show>.btn.dropdown-toggle:hover, +.navbar .navbar-nav>a.btn:hover, +.navbar .navbar-nav>a.btn:focus, +.navbar .navbar-nav>a.btn:active, +.navbar .navbar-nav>a.btn.active, +.navbar .navbar-nav>a.btn:active:focus, +.navbar .navbar-nav>a.btn:active:hover, +.navbar .navbar-nav>a.btn.active:focus, +.navbar .navbar-nav>a.btn.active:hover, +.show>.navbar .navbar-nav>a.btn.dropdown-toggle, +.show>.navbar .navbar-nav>a.btn.dropdown-toggle:focus, +.show>.navbar .navbar-nav>a.btn.dropdown-toggle:hover { + background-color: #979797; + color: #FFFFFF; + box-shadow: none; +} + +.btn:hover, +.navbar .navbar-nav>a.btn:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn.disabled, +.btn.disabled:hover, +.btn.disabled:focus, +.btn.disabled.focus, +.btn.disabled:active, +.btn.disabled.active, +.btn:disabled, +.btn:disabled:hover, +.btn:disabled:focus, +.btn:disabled.focus, +.btn:disabled:active, +.btn:disabled.active, +.btn[disabled], +.btn[disabled]:hover, +.btn[disabled]:focus, +.btn[disabled].focus, +.btn[disabled]:active, +.btn[disabled].active, +fieldset[disabled] .btn, +fieldset[disabled] .btn:hover, +fieldset[disabled] .btn:focus, +fieldset[disabled] .btn.focus, +fieldset[disabled] .btn:active, +fieldset[disabled] .btn.active, +.navbar .navbar-nav>a.btn.disabled, +.navbar .navbar-nav>a.btn.disabled:hover, +.navbar .navbar-nav>a.btn.disabled:focus, +.navbar .navbar-nav>a.btn.disabled.focus, +.navbar .navbar-nav>a.btn.disabled:active, +.navbar .navbar-nav>a.btn.disabled.active, +.navbar .navbar-nav>a.btn:disabled, +.navbar .navbar-nav>a.btn:disabled:hover, +.navbar .navbar-nav>a.btn:disabled:focus, +.navbar .navbar-nav>a.btn:disabled.focus, +.navbar .navbar-nav>a.btn:disabled:active, +.navbar .navbar-nav>a.btn:disabled.active, +.navbar .navbar-nav>a.btn[disabled], +.navbar .navbar-nav>a.btn[disabled]:hover, +.navbar .navbar-nav>a.btn[disabled]:focus, +.navbar .navbar-nav>a.btn[disabled].focus, +.navbar .navbar-nav>a.btn[disabled]:active, +.navbar .navbar-nav>a.btn[disabled].active, +fieldset[disabled] .navbar .navbar-nav>a.btn, +fieldset[disabled] .navbar .navbar-nav>a.btn:hover, +fieldset[disabled] .navbar .navbar-nav>a.btn:focus, +fieldset[disabled] .navbar .navbar-nav>a.btn.focus, +fieldset[disabled] .navbar .navbar-nav>a.btn:active, +fieldset[disabled] .navbar .navbar-nav>a.btn.active { + background-color: #888; + border-color: #888; +} + +.btn.btn-simple, +.navbar .navbar-nav>a.btn.btn-simple { + color: #888; + border-color: #888; +} + +.btn.btn-simple:hover, +.btn.btn-simple:focus, +.btn.btn-simple:active, +.navbar .navbar-nav>a.btn.btn-simple:hover, +.navbar .navbar-nav>a.btn.btn-simple:focus, +.navbar .navbar-nav>a.btn.btn-simple:active { + background-color: transparent; + color: #979797; + border-color: #979797; + box-shadow: none; +} + +.btn.btn-link, +.navbar .navbar-nav>a.btn.btn-link { + color: #888; +} + +.btn.btn-link:hover, +.btn.btn-link:focus, +.btn.btn-link:active, +.navbar .navbar-nav>a.btn.btn-link:hover, +.navbar .navbar-nav>a.btn.btn-link:focus, +.navbar .navbar-nav>a.btn.btn-link:active { + background-color: transparent; + color: #979797; + text-decoration: none; + box-shadow: none; +} + +.btn:hover, +.btn:focus, +.navbar .navbar-nav>a.btn:hover, +.navbar .navbar-nav>a.btn:focus { + opacity: 1; + filter: alpha(opacity=100); + outline: 0 !important; +} + +.btn:active, +.btn.active, +.open>.btn.dropdown-toggle, +.navbar .navbar-nav>a.btn:active, +.navbar .navbar-nav>a.btn.active, +.open>.navbar .navbar-nav>a.btn.dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; + outline: 0 !important; +} + +.btn.btn-icon, +.navbar .navbar-nav>a.btn.btn-icon { + height: 2.375rem; + min-width: 2.375rem; + width: 2.375rem; + padding: 0; + font-size: 0.9375rem; + overflow: hidden; + position: relative; + line-height: normal; +} + +.btn.btn-icon.btn-simple, +.navbar .navbar-nav>a.btn.btn-icon.btn-simple { + padding: 0; +} + +.btn.btn-icon.btn-sm, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm { + height: 1.875rem; + min-width: 1.875rem; + width: 1.875rem; +} + +.btn.btn-icon.btn-sm i.fa, +.btn.btn-icon.btn-sm i.now-ui-icons, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm i.fa, +.navbar .navbar-nav>a.btn.btn-icon.btn-sm i.now-ui-icons { + font-size: 0.6875rem; +} + +.btn.btn-icon.btn-lg, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg { + height: 3.6rem; + min-width: 3.6rem; + width: 3.6rem; +} + +.btn.btn-icon.btn-lg i.now-ui-icons, +.btn.btn-icon.btn-lg i.fa, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg i.now-ui-icons, +.navbar .navbar-nav>a.btn.btn-icon.btn-lg i.fa { + font-size: 1.325rem; +} + +.btn.btn-icon:not(.btn-footer) i.now-ui-icons, +.btn.btn-icon:not(.btn-footer) i.fa, +.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) i.now-ui-icons, +.navbar .navbar-nav>a.btn.btn-icon:not(.btn-footer) i.fa { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-12px, -12px); + line-height: 1.5626rem; + width: 25px; +} + +.btn:not(.btn-icon) .now-ui-icons, +.navbar .navbar-nav>a.btn:not(.btn-icon) .now-ui-icons { + position: relative; + top: 1px; +} + +.btn-primary { + background-color: #f96332; + color: #FFFFFF; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary:active:focus, +.btn-primary:active:hover, +.btn-primary.active:focus, +.btn-primary.active:hover, +.show>.btn-primary.dropdown-toggle, +.show>.btn-primary.dropdown-toggle:focus, +.show>.btn-primary.dropdown-toggle:hover { + background-color: #fa7a50; + color: #FFFFFF; + box-shadow: none; +} + +.btn-primary:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn-primary.disabled, +.btn-primary.disabled:hover, +.btn-primary.disabled:focus, +.btn-primary.disabled.focus, +.btn-primary.disabled:active, +.btn-primary.disabled.active, +.btn-primary:disabled, +.btn-primary:disabled:hover, +.btn-primary:disabled:focus, +.btn-primary:disabled.focus, +.btn-primary:disabled:active, +.btn-primary:disabled.active, +.btn-primary[disabled], +.btn-primary[disabled]:hover, +.btn-primary[disabled]:focus, +.btn-primary[disabled].focus, +.btn-primary[disabled]:active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-primary:hover, +fieldset[disabled] .btn-primary:focus, +fieldset[disabled] .btn-primary.focus, +fieldset[disabled] .btn-primary:active, +fieldset[disabled] .btn-primary.active { + background-color: #f96332; + border-color: #f96332; +} + +.btn-primary.btn-simple { + color: #f96332; + border-color: #f96332; +} + +.btn-primary.btn-simple:hover, +.btn-primary.btn-simple:focus, +.btn-primary.btn-simple:active { + background-color: transparent; + color: #fa7a50; + border-color: #fa7a50; + box-shadow: none; +} + +.btn-primary.btn-link { + color: #f96332; +} + +.btn-primary.btn-link:hover, +.btn-primary.btn-link:focus, +.btn-primary.btn-link:active { + background-color: transparent; + color: #fa7a50; + text-decoration: none; + box-shadow: none; +} + +.btn-success { + background-color: #18ce0f; + color: #FFFFFF; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success:active:focus, +.btn-success:active:hover, +.btn-success.active:focus, +.btn-success.active:hover, +.show>.btn-success.dropdown-toggle, +.show>.btn-success.dropdown-toggle:focus, +.show>.btn-success.dropdown-toggle:hover { + background-color: #1beb11; + color: #FFFFFF; + box-shadow: none; +} + +.btn-success:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn-success.disabled, +.btn-success.disabled:hover, +.btn-success.disabled:focus, +.btn-success.disabled.focus, +.btn-success.disabled:active, +.btn-success.disabled.active, +.btn-success:disabled, +.btn-success:disabled:hover, +.btn-success:disabled:focus, +.btn-success:disabled.focus, +.btn-success:disabled:active, +.btn-success:disabled.active, +.btn-success[disabled], +.btn-success[disabled]:hover, +.btn-success[disabled]:focus, +.btn-success[disabled].focus, +.btn-success[disabled]:active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-success:hover, +fieldset[disabled] .btn-success:focus, +fieldset[disabled] .btn-success.focus, +fieldset[disabled] .btn-success:active, +fieldset[disabled] .btn-success.active { + background-color: #18ce0f; + border-color: #18ce0f; +} + +.btn-success.btn-simple { + color: #18ce0f; + border-color: #18ce0f; +} + +.btn-success.btn-simple:hover, +.btn-success.btn-simple:focus, +.btn-success.btn-simple:active { + background-color: transparent; + color: #1beb11; + border-color: #1beb11; + box-shadow: none; +} + +.btn-success.btn-link { + color: #18ce0f; +} + +.btn-success.btn-link:hover, +.btn-success.btn-link:focus, +.btn-success.btn-link:active { + background-color: transparent; + color: #1beb11; + text-decoration: none; + box-shadow: none; +} + +.btn-info { + background-color: #2CA8FF; + color: #FFFFFF; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info:active:focus, +.btn-info:active:hover, +.btn-info.active:focus, +.btn-info.active:hover, +.show>.btn-info.dropdown-toggle, +.show>.btn-info.dropdown-toggle:focus, +.show>.btn-info.dropdown-toggle:hover { + background-color: #4bb5ff; + color: #FFFFFF; + box-shadow: none; +} + +.btn-info:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn-info.disabled, +.btn-info.disabled:hover, +.btn-info.disabled:focus, +.btn-info.disabled.focus, +.btn-info.disabled:active, +.btn-info.disabled.active, +.btn-info:disabled, +.btn-info:disabled:hover, +.btn-info:disabled:focus, +.btn-info:disabled.focus, +.btn-info:disabled:active, +.btn-info:disabled.active, +.btn-info[disabled], +.btn-info[disabled]:hover, +.btn-info[disabled]:focus, +.btn-info[disabled].focus, +.btn-info[disabled]:active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-info:hover, +fieldset[disabled] .btn-info:focus, +fieldset[disabled] .btn-info.focus, +fieldset[disabled] .btn-info:active, +fieldset[disabled] .btn-info.active { + background-color: #2CA8FF; + border-color: #2CA8FF; +} + +.btn-info.btn-simple { + color: #2CA8FF; + border-color: #2CA8FF; +} + +.btn-info.btn-simple:hover, +.btn-info.btn-simple:focus, +.btn-info.btn-simple:active { + background-color: transparent; + color: #4bb5ff; + border-color: #4bb5ff; + box-shadow: none; +} + +.btn-info.btn-link { + color: #2CA8FF; +} + +.btn-info.btn-link:hover, +.btn-info.btn-link:focus, +.btn-info.btn-link:active { + background-color: transparent; + color: #4bb5ff; + text-decoration: none; + box-shadow: none; +} + +.btn-warning { + background-color: #FFB236; + color: #FFFFFF; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning:active:focus, +.btn-warning:active:hover, +.btn-warning.active:focus, +.btn-warning.active:hover, +.show>.btn-warning.dropdown-toggle, +.show>.btn-warning.dropdown-toggle:focus, +.show>.btn-warning.dropdown-toggle:hover { + background-color: #ffbe55; + color: #FFFFFF; + box-shadow: none; +} + +.btn-warning:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn-warning.disabled, +.btn-warning.disabled:hover, +.btn-warning.disabled:focus, +.btn-warning.disabled.focus, +.btn-warning.disabled:active, +.btn-warning.disabled.active, +.btn-warning:disabled, +.btn-warning:disabled:hover, +.btn-warning:disabled:focus, +.btn-warning:disabled.focus, +.btn-warning:disabled:active, +.btn-warning:disabled.active, +.btn-warning[disabled], +.btn-warning[disabled]:hover, +.btn-warning[disabled]:focus, +.btn-warning[disabled].focus, +.btn-warning[disabled]:active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-warning:hover, +fieldset[disabled] .btn-warning:focus, +fieldset[disabled] .btn-warning.focus, +fieldset[disabled] .btn-warning:active, +fieldset[disabled] .btn-warning.active { + background-color: #FFB236; + border-color: #FFB236; +} + +.btn-warning.btn-simple { + color: #FFB236; + border-color: #FFB236; +} + +.btn-warning.btn-simple:hover, +.btn-warning.btn-simple:focus, +.btn-warning.btn-simple:active { + background-color: transparent; + color: #ffbe55; + border-color: #ffbe55; + box-shadow: none; +} + +.btn-warning.btn-link { + color: #FFB236; +} + +.btn-warning.btn-link:hover, +.btn-warning.btn-link:focus, +.btn-warning.btn-link:active { + background-color: transparent; + color: #ffbe55; + text-decoration: none; + box-shadow: none; +} + +.btn-danger { + background-color: #FF3636; + color: #FFFFFF; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger:active:focus, +.btn-danger:active:hover, +.btn-danger.active:focus, +.btn-danger.active:hover, +.show>.btn-danger.dropdown-toggle, +.show>.btn-danger.dropdown-toggle:focus, +.show>.btn-danger.dropdown-toggle:hover { + background-color: #ff5555; + color: #FFFFFF; + box-shadow: none; +} + +.btn-danger:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn-danger.disabled, +.btn-danger.disabled:hover, +.btn-danger.disabled:focus, +.btn-danger.disabled.focus, +.btn-danger.disabled:active, +.btn-danger.disabled.active, +.btn-danger:disabled, +.btn-danger:disabled:hover, +.btn-danger:disabled:focus, +.btn-danger:disabled.focus, +.btn-danger:disabled:active, +.btn-danger:disabled.active, +.btn-danger[disabled], +.btn-danger[disabled]:hover, +.btn-danger[disabled]:focus, +.btn-danger[disabled].focus, +.btn-danger[disabled]:active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger, +fieldset[disabled] .btn-danger:hover, +fieldset[disabled] .btn-danger:focus, +fieldset[disabled] .btn-danger.focus, +fieldset[disabled] .btn-danger:active, +fieldset[disabled] .btn-danger.active { + background-color: #FF3636; + border-color: #FF3636; +} + +.btn-danger.btn-simple { + color: #FF3636; + border-color: #FF3636; +} + +.btn-danger.btn-simple:hover, +.btn-danger.btn-simple:focus, +.btn-danger.btn-simple:active { + background-color: transparent; + color: #ff5555; + border-color: #ff5555; + box-shadow: none; +} + +.btn-danger.btn-link { + color: #FF3636; +} + +.btn-danger.btn-link:hover, +.btn-danger.btn-link:focus, +.btn-danger.btn-link:active { + background-color: transparent; + color: #ff5555; + text-decoration: none; + box-shadow: none; +} + +.btn-neutral { + background-color: #FFFFFF; + color: #f96332; +} + +.btn-neutral:hover, +.btn-neutral:focus, +.btn-neutral:active, +.btn-neutral.active, +.btn-neutral:active:focus, +.btn-neutral:active:hover, +.btn-neutral.active:focus, +.btn-neutral.active:hover, +.show>.btn-neutral.dropdown-toggle, +.show>.btn-neutral.dropdown-toggle:focus, +.show>.btn-neutral.dropdown-toggle:hover { + background-color: #FFFFFF; + color: #FFFFFF; + box-shadow: none; +} + +.btn-neutral:hover { + box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.17); +} + +.btn-neutral.disabled, +.btn-neutral.disabled:hover, +.btn-neutral.disabled:focus, +.btn-neutral.disabled.focus, +.btn-neutral.disabled:active, +.btn-neutral.disabled.active, +.btn-neutral:disabled, +.btn-neutral:disabled:hover, +.btn-neutral:disabled:focus, +.btn-neutral:disabled.focus, +.btn-neutral:disabled:active, +.btn-neutral:disabled.active, +.btn-neutral[disabled], +.btn-neutral[disabled]:hover, +.btn-neutral[disabled]:focus, +.btn-neutral[disabled].focus, +.btn-neutral[disabled]:active, +.btn-neutral[disabled].active, +fieldset[disabled] .btn-neutral, +fieldset[disabled] .btn-neutral:hover, +fieldset[disabled] .btn-neutral:focus, +fieldset[disabled] .btn-neutral.focus, +fieldset[disabled] .btn-neutral:active, +fieldset[disabled] .btn-neutral.active { + background-color: #FFFFFF; + border-color: #FFFFFF; +} + +.btn-neutral.btn-danger { + color: #FF3636; +} + +.btn-neutral.btn-danger:hover, +.btn-neutral.btn-danger:focus, +.btn-neutral.btn-danger:active { + color: #ff5555; +} + +.btn-neutral.btn-info { + color: #2CA8FF; +} + +.btn-neutral.btn-info:hover, +.btn-neutral.btn-info:focus, +.btn-neutral.btn-info:active { + color: #4bb5ff; +} + +.btn-neutral.btn-warning { + color: #FFB236; +} + +.btn-neutral.btn-warning:hover, +.btn-neutral.btn-warning:focus, +.btn-neutral.btn-warning:active { + color: #ffbe55; +} + +.btn-neutral.btn-success { + color: #18ce0f; +} + +.btn-neutral.btn-success:hover, +.btn-neutral.btn-success:focus, +.btn-neutral.btn-success:active { + color: #1beb11; +} + +.btn-neutral.btn-default { + color: #888; +} + +.btn-neutral.btn-default:hover, +.btn-neutral.btn-default:focus, +.btn-neutral.btn-default:active { + color: #979797; +} + +.btn-neutral.active, +.btn-neutral:active, +.btn-neutral:active:focus, +.btn-neutral:active:hover, +.btn-neutral.active:focus, +.btn-neutral.active:hover, +.show>.btn-neutral.dropdown-toggle, +.show>.btn-neutral.dropdown-toggle:focus, +.show>.btn-neutral.dropdown-toggle:hover { + background-color: #FFFFFF; + color: #fa7a50; + box-shadow: none; +} + +.btn-neutral:hover, +.btn-neutral:focus { + color: #fa7a50; +} + +.btn-neutral:hover:not(.nav-link), +.btn-neutral:focus:not(.nav-link) { + box-shadow: none; +} + +.btn-neutral.btn-simple { + color: #FFFFFF; + border-color: #FFFFFF; +} + +.btn-neutral.btn-simple:hover, +.btn-neutral.btn-simple:focus, +.btn-neutral.btn-simple:active { + background-color: transparent; + color: #FFFFFF; + border-color: #FFFFFF; + box-shadow: none; +} + +.btn-neutral.btn-link { + color: #FFFFFF; +} + +.btn-neutral.btn-link:hover, +.btn-neutral.btn-link:focus, +.btn-neutral.btn-link:active { + background-color: transparent; + color: #FFFFFF; + text-decoration: none; + box-shadow: none; +} + +.btn:disabled, +.btn[disabled], +.btn.disabled { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.btn-round { + border-width: 1px; + border-radius: 30px !important; + padding: 11px 23px; +} + +.btn-round.btn-simple { + padding: 10px 22px; +} + +.btn-simple { + border: 1px solid; + border-color: #888; + padding: 10px 22px; + background-color: transparent; +} + +.btn-simple.disabled, +.btn-simple.disabled:hover, +.btn-simple.disabled:focus, +.btn-simple.disabled.focus, +.btn-simple.disabled:active, +.btn-simple.disabled.active, +.btn-simple:disabled, +.btn-simple:disabled:hover, +.btn-simple:disabled:focus, +.btn-simple:disabled.focus, +.btn-simple:disabled:active, +.btn-simple:disabled.active, +.btn-simple[disabled], +.btn-simple[disabled]:hover, +.btn-simple[disabled]:focus, +.btn-simple[disabled].focus, +.btn-simple[disabled]:active, +.btn-simple[disabled].active, +fieldset[disabled] .btn-simple, +fieldset[disabled] .btn-simple:hover, +fieldset[disabled] .btn-simple:focus, +fieldset[disabled] .btn-simple.focus, +fieldset[disabled] .btn-simple:active, +fieldset[disabled] .btn-simple.active, +.btn-link.disabled, +.btn-link.disabled:hover, +.btn-link.disabled:focus, +.btn-link.disabled.focus, +.btn-link.disabled:active, +.btn-link.disabled.active, +.btn-link:disabled, +.btn-link:disabled:hover, +.btn-link:disabled:focus, +.btn-link:disabled.focus, +.btn-link:disabled:active, +.btn-link:disabled.active, +.btn-link[disabled], +.btn-link[disabled]:hover, +.btn-link[disabled]:focus, +.btn-link[disabled].focus, +.btn-link[disabled]:active, +.btn-link[disabled].active, +fieldset[disabled] .btn-link, +fieldset[disabled] .btn-link:hover, +fieldset[disabled] .btn-link:focus, +fieldset[disabled] .btn-link.focus, +fieldset[disabled] .btn-link:active, +fieldset[disabled] .btn-link.active { + background-color: transparent; +} + +.btn-lg { + font-size: 1em; + border-radius: 0.25rem; + padding: 15px 48px; +} + +.btn-lg.btn-simple { + padding: 14px 47px; +} + +.btn-sm { + font-size: 14px; + border-radius: 0.1875rem; + padding: 5px 15px; +} + +.btn-sm.btn-simple { + padding: 4px 14px; +} + +.btn-link { + border: 0; + padding: 0.5rem 0.7rem; + background-color: transparent; +} + +.btn-wd { + min-width: 140px; +} + +.btn-group.select { + width: 100%; +} + +.btn-group.select .btn { + text-align: left; +} + +.btn-group.select .caret { + position: absolute; + top: 50%; + margin-top: -1px; + right: 8px; +} + +.form-control::-moz-placeholder { + color: #DDDDDD; + opacity: 1; + filter: alpha(opacity=100); +} + +.form-control:-moz-placeholder { + color: #DDDDDD; + opacity: 1; + filter: alpha(opacity=100); +} + +.form-control::-webkit-input-placeholder { + color: #DDDDDD; + opacity: 1; + filter: alpha(opacity=100); +} + +.form-control:-ms-input-placeholder { + color: #DDDDDD; + opacity: 1; + filter: alpha(opacity=100); +} + +.form-control { + background-color: transparent; + border: 1px solid #E3E3E3; + border-radius: 30px; + color: #2c2c2c; + line-height: normal; + font-size: 0.8571em; + -webkit-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -moz-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -ms-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -webkit-box-shadow: none; + box-shadow: none; +} + +.has-success .form-control { + border-color: #E3E3E3; +} + +.form-control:focus { + border: 1px solid #f96332; + -webkit-box-shadow: none; + box-shadow: none; + outline: 0 !important; + color: #2c2c2c; +} + +.form-control:focus+.input-group-addon, +.form-control:focus~.input-group-addon { + border: 1px solid #f96332; + border-left: none; + background-color: transparent; +} + +.has-success .form-control, +.has-error .form-control, +.has-success .form-control:focus, +.has-error .form-control:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.has-success .form-control:focus { + border-color: #1be611; +} + +.has-danger .form-control.form-control-success, +.has-danger .form-control.form-control-danger, +.has-success .form-control.form-control-success, +.has-success .form-control.form-control-danger { + background-image: none; +} + +.has-danger .form-control { + border-color: #ffcfcf; + color: #FF3636; + background-color: rgba(222, 222, 222, 0.1); +} + +.has-danger .form-control:focus { + background-color: #FFFFFF; +} + +.form-control+.form-control-feedback { + border-radius: 0.25rem; + font-size: 14px; + margin-top: 0; + position: absolute; + left: 18px; + bottom: -20px; + vertical-align: middle; +} + +.open .form-control { + border-radius: 0.25rem 0.25rem 0 0; + border-bottom-color: transparent; +} + +.form-control+.input-group-addon { + background-color: #FFFFFF; +} + +.has-success:after, +.has-danger:after { + font-family: 'Nucleo Outline'; + content: "\ea22"; + display: inline-block; + position: absolute; + right: 15px; + bottom: 10px; + color: #18ce0f; + font-size: 11px; +} + +.has-success.input-lg:after, +.has-danger.input-lg:after { + font-size: 13px; + top: 13px; +} + +.has-danger:after { + content: "\ea53"; + color: #FF3636; +} + +.form-group.form-group-no-border.input-lg .input-group-addon, +.input-group.form-group-no-border.input-lg .input-group-addon { + padding: 15px 0 15px 19px; +} + +.form-group.form-group-no-border.input-lg .form-control, +.input-group.form-group-no-border.input-lg .form-control { + padding: 15px 19px; +} + +.form-group.form-group-no-border.input-lg .form-control+.input-group-addon, +.input-group.form-group-no-border.input-lg .form-control+.input-group-addon { + padding: 15px 19px 15px 0; +} + +.form-group.input-lg .form-control, +.input-group.input-lg .form-control { + padding: 14px 18px; +} + +.form-group.input-lg .form-control+.input-group-addon, +.input-group.input-lg .form-control+.input-group-addon { + padding: 14px 18px 14px 0; +} + +.form-group.input-lg .input-group-addon, +.input-group.input-lg .input-group-addon { + padding: 14px 0 15px 18px; +} + +.form-group.input-lg .input-group-addon+.form-control, +.input-group.input-lg .input-group-addon+.form-control { + padding: 15px 18px 15px 16px; +} + +.form-group.form-group-no-border .form-control, +.input-group.form-group-no-border .form-control { + padding: 11px 19px; +} + +.form-group.form-group-no-border .form-control+.input-group-addon, +.input-group.form-group-no-border .form-control+.input-group-addon { + padding: 11px 19px 11px 0; +} + +.form-group.form-group-no-border .input-group-addon, +.input-group.form-group-no-border .input-group-addon { + padding: 11px 0 11px 19px; +} + +.form-group .form-control, +.input-group .form-control { + padding: 10px 18px 10px 18px; +} + +.form-group .form-control+.input-group-addon, +.input-group .form-control+.input-group-addon { + padding: 10px 18px 10px 0; +} + +.form-group .input-group-addon, +.input-group .input-group-addon { + padding: 10px 0 10px 18px; +} + +.form-group .input-group-addon+.form-control, +.form-group .input-group-addon~.form-control, +.input-group .input-group-addon+.form-control, +.input-group .input-group-addon~.form-control { + padding: 10px 19px 11px 16px; +} + +.form-group.form-group-no-border .form-control, +.form-group.form-group-no-border .form-control+.input-group-addon, +.input-group.form-group-no-border .form-control, +.input-group.form-group-no-border .form-control+.input-group-addon { + background-color: rgba(222, 222, 222, 0.3); + border: medium none; +} + +.form-group.form-group-no-border .form-control:focus, +.form-group.form-group-no-border .form-control:active, +.form-group.form-group-no-border .form-control:active, +.form-group.form-group-no-border .form-control+.input-group-addon:focus, +.form-group.form-group-no-border .form-control+.input-group-addon:active, +.form-group.form-group-no-border .form-control+.input-group-addon:active, +.input-group.form-group-no-border .form-control:focus, +.input-group.form-group-no-border .form-control:active, +.input-group.form-group-no-border .form-control:active, +.input-group.form-group-no-border .form-control+.input-group-addon:focus, +.input-group.form-group-no-border .form-control+.input-group-addon:active, +.input-group.form-group-no-border .form-control+.input-group-addon:active { + border: medium none; + background-color: rgba(222, 222, 222, 0.5); +} + +.form-group.form-group-no-border .form-control:focus+.input-group-addon, +.input-group.form-group-no-border .form-control:focus+.input-group-addon { + background-color: rgba(222, 222, 222, 0.5); +} + +.form-group.form-group-no-border .input-group-addon, +.input-group.form-group-no-border .input-group-addon { + background-color: rgba(222, 222, 222, 0.3); + border: none; +} + +.has-error .form-control-feedback, +.has-error .control-label { + color: #FF3636; +} + +.has-success .form-control-feedback, +.has-success .control-label { + color: #18ce0f; +} + +.input-group-addon { + background-color: #FFFFFF; + border: 1px solid #E3E3E3; + border-radius: 30px; + color: #555555; + padding: -0.5rem 0 -0.5rem -0.3rem; + -webkit-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -moz-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + -ms-transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; + transition: color 0.3s ease-in-out, border-color 0.3s ease-in-out, background-color 0.3s ease-in-out; +} + +.has-success .input-group-addon, +.has-danger .input-group-addon { + background-color: #FFFFFF; +} + +.has-danger .form-control:focus+.input-group-addon { + color: #FF3636; +} + +.has-success .form-control:focus+.input-group-addon { + color: #18ce0f; +} + +.input-group-addon+.form-control, +.input-group-addon~.form-control { + padding: -0.5rem 0.7rem; + padding-left: 18px; +} + +.input-group-addon i { + width: 17px; +} + +.input-group-focus .input-group-addon { + background-color: #FFFFFF; + border-color: #f96332; +} + +.input-group-focus.form-group-no-border .input-group-addon { + background-color: rgba(222, 222, 222, 0.5); +} + +.input-group, +.form-group { + margin-bottom: 10px; +} + +.input-group[disabled] .input-group-addon { + background-color: #E3E3E3; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child>.dropdown-toggle, +.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-right: 0 none; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child>.dropdown-toggle, +.input-group-btn:first-child>.btn:not(:first-child) { + border-left: 0 none; +} + +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #E3E3E3; + color: #888; + cursor: not-allowed; +} + +.input-group-btn .btn { + border-width: 1px; + padding: 11px 0.7rem; +} + +.input-group-btn .btn-default:not(.btn-fill) { + border-color: #DDDDDD; +} + +.input-group-btn:last-child>.btn { + margin-left: 0; +} + +textarea.form-control { + max-width: 100%; + padding: 10px 10px 0 0; + resize: none; + border: none; + border-bottom: 1px solid #E3E3E3; + border-radius: 0; + line-height: 2; +} + +textarea.form-control:focus, +textarea.form-control:active { + border-left: none; + border-top: none; + border-right: none; +} + +.has-success.form-group .form-control, +.has-success.form-group.form-group-no-border .form-control, +.has-danger.form-group .form-control, +.has-danger.form-group.form-group-no-border .form-control { + padding-right: 40px; +} + +.form-group { + position: relative; +} + +.form-group.has-error, +.form-group.has-danger { + margin-bottom: 20px; +} + +.checkbox, +.radio { + margin-bottom: 12px; +} + +.checkbox label, +.radio label { + display: inline-block; + position: relative; + cursor: pointer; + padding-left: 35px; + line-height: 26px; + margin-bottom: 0; +} + +.radio label { + padding-left: 28px; +} + +.checkbox label::before, +.checkbox label::after { + content: " "; + display: inline-block; + position: absolute; + width: 26px; + height: 26px; + left: 0; + cursor: pointer; + border-radius: 3px; + top: 0; + background-color: transparent; + border: 1px solid #E3E3E3; + -webkit-transition: opacity 0.3s linear; + -moz-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + -ms-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; +} + +.checkbox label::after { + font-family: 'Nucleo Outline'; + content: "\ea22"; + top: 0px; + text-align: center; + font-size: 14px; + opacity: 0; + color: #555555; + border: 0; + background-color: inherit; +} + +.checkbox input[type="checkbox"], +.radio input[type="radio"] { + opacity: 0; + position: absolute; + visibility: hidden; +} + +.checkbox input[type="checkbox"]:checked+label::after { + opacity: 1; +} + +.checkbox input[type="checkbox"]:disabled+label, +.radio input[type="radio"]:disabled+label { + color: #9A9A9A; + opacity: .5; +} + +.checkbox input[type="checkbox"]:disabled+label::before, +.checkbox input[type="checkbox"]:disabled+label::after { + cursor: not-allowed; +} + +.checkbox input[type="checkbox"]:disabled+label, +.radio input[type="radio"]:disabled+label { + 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 { + background-color: #428bca; + border-color: #428bca; +} + +.checkbox-primary input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-danger input[type="checkbox"]:checked+label::before { + background-color: #d9534f; + border-color: #d9534f; +} + +.checkbox-danger input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-info input[type="checkbox"]:checked+label::before { + background-color: #5bc0de; + border-color: #5bc0de; +} + +.checkbox-info input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-warning input[type="checkbox"]:checked+label::before { + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.checkbox-warning input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-success input[type="checkbox"]:checked+label::before { + background-color: #5cb85c; + border-color: #5cb85c; +} + +.checkbox-success input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.radio label::before, +.radio label::after { + content: " "; + width: 20px; + height: 20px; + border-radius: 50%; + border: 1px solid #E3E3E3; + display: inline-block; + position: absolute; + left: 3px; + top: 3px; + padding: 1px; + -webkit-transition: opacity 0.3s linear; + -moz-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + -ms-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; +} + +.radio input[type="radio"]+label:after, +.radio input[type="radio"] { + opacity: 0; +} + +.radio input[type="radio"]:checked+label::after { + width: 4px; + height: 4px; + background-color: #555555; + border-color: #555555; + top: 11px; + left: 11px; + opacity: 1; +} + +.radio input[type="radio"]:checked+label::after { + opacity: 1; +} + +.radio input[type="radio"]:disabled+label { + color: #9A9A9A; +} + +.radio input[type="radio"]:disabled+label::before, +.radio input[type="radio"]:disabled+label::after { + color: #9A9A9A; +} + +.radio.radio-inline { + margin-top: 0; +} + +.progress-container { + position: relative; +} + +.progress-container+.progress-container, +.progress-container~.progress-container { + margin-top: 15px; +} + +.progress-container .progress-badge { + color: #888; + font-size: 0.8571em; + text-transform: uppercase; +} + +.progress-container .progress { + height: 1px; + border-radius: 0; + box-shadow: none; + background: rgba(222, 222, 222, 0.8); + margin-top: 14px; +} + +.progress-container .progress .progress-bar { + box-shadow: none; + background-color: #888; +} + +.progress-container .progress .progress-value { + position: absolute; + top: 2px; + right: 0; + color: #888; + font-size: 0.8571em; +} + +.progress-container.progress-neutral .progress { + background: rgba(255, 255, 255, 0.3); +} + +.progress-container.progress-neutral .progress-bar { + background: #FFFFFF; +} + +.progress-container.progress-neutral .progress-value, +.progress-container.progress-neutral .progress-badge { + color: #FFFFFF; +} + +.progress-container.progress-primary .progress { + background: rgba(249, 99, 50, 0.3); +} + +.progress-container.progress-primary .progress-bar { + background: #f96332; +} + +.progress-container.progress-primary .progress-value, +.progress-container.progress-primary .progress-badge { + color: #f96332; +} + +.progress-container.progress-info .progress { + background: rgba(44, 168, 255, 0.3); +} + +.progress-container.progress-info .progress-bar { + background: #2CA8FF; +} + +.progress-container.progress-info .progress-value, +.progress-container.progress-info .progress-badge { + color: #2CA8FF; +} + +.progress-container.progress-success .progress { + background: rgba(24, 206, 15, 0.3); +} + +.progress-container.progress-success .progress-bar { + background: #18ce0f; +} + +.progress-container.progress-success .progress-value, +.progress-container.progress-success .progress-badge { + color: #18ce0f; +} + +.progress-container.progress-warning .progress { + background: rgba(255, 178, 54, 0.3); +} + +.progress-container.progress-warning .progress-bar { + background: #FFB236; +} + +.progress-container.progress-warning .progress-value, +.progress-container.progress-warning .progress-badge { + color: #FFB236; +} + +.progress-container.progress-danger .progress { + background: rgba(255, 54, 54, 0.3); +} + +.progress-container.progress-danger .progress-bar { + background: #FF3636; +} + +.progress-container.progress-danger .progress-value, +.progress-container.progress-danger .progress-badge { + color: #FF3636; +} + + +/* badges */ + +.badge { + border-radius: 8px; + padding: 4px 8px; + text-transform: uppercase; + font-size: 0.7142em; + line-height: 12px; + background-color: transparent; + border: 1px solid; + margin-bottom: 5px; + border-radius: 0.875rem; +} + +.badge-icon { + padding: 0.4em 0.55em; +} + +.badge-icon i { + font-size: 0.8em; +} + +.badge-default { + border-color: #888; + color: #888; +} + +.badge-primary { + border-color: #f96332; + color: #f96332; +} + +.badge-info { + border-color: #2CA8FF; + color: #2CA8FF; +} + +.badge-success { + border-color: #18ce0f; + color: #18ce0f; +} + +.badge-warning { + border-color: #FFB236; + color: #FFB236; +} + +.badge-danger { + border-color: #FF3636; + color: #FF3636; +} + +.badge-neutral { + border-color: #FFFFFF; + color: #FFFFFF; +} + +.pagination .page-item .page-link { + border: 0; + border-radius: 30px !important; + transition: all .3s; + padding: 0px 11px; + margin: 0 3px; + min-width: 30px; + text-align: center; + height: 30px; + line-height: 30px; + color: #2c2c2c; + cursor: pointer; + font-size: 14px; + text-transform: uppercase; + background: transparent; +} + +.pagination .page-item .page-link:hover, +.pagination .page-item .page-link:focus { + color: #2c2c2c; + background-color: rgba(222, 222, 222, 0.3); + border: none; +} + +.pagination .arrow-margin-left, +.pagination .arrow-margin-right { + position: absolute; +} + +.pagination .arrow-margin-right { + right: 0; +} + +.pagination .arrow-margin-left { + left: 0; +} + +.pagination .page-item.active>.page-link { + color: #E3E3E3; + box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); +} + +.pagination .page-item.active>.page-link, +.pagination .page-item.active>.page-link:focus, +.pagination .page-item.active>.page-link:hover { + background-color: #888; + border-color: #888; + color: #FFFFFF; +} + +.pagination .page-item.disabled>.page-link { + opacity: .5; + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.pagination.pagination-info .page-item.active>.page-link, +.pagination.pagination-info .page-item.active>.page-link:focus, +.pagination.pagination-info .page-item.active>.page-link:hover { + background-color: #2CA8FF; + border-color: #2CA8FF; +} + +.pagination.pagination-success .page-item.active>.page-link, +.pagination.pagination-success .page-item.active>.page-link:focus, +.pagination.pagination-success .page-item.active>.page-link:hover { + background-color: #18ce0f; + border-color: #18ce0f; +} + +.pagination.pagination-primary .page-item.active>.page-link, +.pagination.pagination-primary .page-item.active>.page-link:focus, +.pagination.pagination-primary .page-item.active>.page-link:hover { + background-color: #f96332; + border-color: #f96332; +} + +.pagination.pagination-warning .page-item.active>.page-link, +.pagination.pagination-warning .page-item.active>.page-link:focus, +.pagination.pagination-warning .page-item.active>.page-link:hover { + background-color: #FFB236; + border-color: #FFB236; +} + +.pagination.pagination-danger .page-item.active>.page-link, +.pagination.pagination-danger .page-item.active>.page-link:focus, +.pagination.pagination-danger .page-item.active>.page-link:hover { + background-color: #FF3636; + border-color: #FF3636; +} + +.pagination.pagination-neutral .page-item>.page-link { + color: #FFFFFF; +} + +.pagination.pagination-neutral .page-item>.page-link:focus, +.pagination.pagination-neutral .page-item>.page-link:hover { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.pagination.pagination-neutral .page-item.active>.page-link, +.pagination.pagination-neutral .page-item.active>.page-link:focus, +.pagination.pagination-neutral .page-item.active>.page-link:hover { + background-color: #FFFFFF; + border-color: #FFFFFF; + color: #f96332; +} + +button, +input, +optgroup, +select, +textarea { +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 400; +} + +small { + font-size: 60%; +} + +a { + color: #f96332; +} + +a:hover, +a:focus { + color: #f96332; +} + +h1, +.h1 { + font-size: 3.5em; + line-height: 1.15; + margin-bottom: 30px; +} + +h1 small, +.h1 small { + font-weight: 700; + text-transform: uppercase; + opacity: .8; +} + +h2, +.h2 { + font-size: 2.5em; + margin-bottom: 30px; +} + +h3, +.h3 { + font-size: 2em; + margin-bottom: 30px; + line-height: 1.4em; +} + +h4, +.h4 { + font-size: 1.714em; + line-height: 1.45em; + margin-top: 30px; + margin-bottom: 15px; +} + +h4+.category, +h4.title+.category, +.h4+.category, +.h4.title+.category { + margin-top: -10px; +} + +h5, +.h5 { + font-size: 1.57em; + line-height: 1.4em; + margin-bottom: 15px; +} + +h6, +.h6 { + font-size: 1em; + font-weight: 700; + text-transform: uppercase; +} + +p { + line-height: 1.61em; +} + +.description p, +p.description { + font-size: 1.14em; +} + +.title { + font-weight: 700; +} + +.title.title-up { + text-transform: uppercase; +} + +.title.title-up a { + color: #2c2c2c; + text-decoration: none; +} + +.title+.category { + margin-top: -25px; +} + +.description, +.card-description, +.footer-big p { + color: #9A9A9A; + font-weight: 300; +} + +.category { + text-transform: uppercase; + font-weight: 700; + color: #9A9A9A; +} + +.text-primary { + color: #f96332 !important; +} + +.text-info { + color: #2CA8FF !important; +} + +.text-success { + color: #18ce0f !important; +} + +.text-warning { + color: #FFB236 !important; +} + +.text-danger { + color: #FF3636 !important; +} + +.text-black { + color: #444; +} + +.blockquote { + border-left: none; + border: 1px solid #888; + padding: 20px; + font-size: 1.1em; + line-height: 1.8; +} + +.blockquote small { + color: #888; + font-size: 0.8571em; + text-transform: uppercase; +} + +.blockquote.blockquote-primary { + border-color: #f96332; + color: #f96332; +} + +.blockquote.blockquote-primary small { + color: #f96332; +} + +.blockquote.blockquote-danger { + border-color: #FF3636; + color: #FF3636; +} + +.blockquote.blockquote-danger small { + color: #FF3636; +} + +.blockquote.blockquote-white { + border-color: rgba(255, 255, 255, 0.8); + color: #FFFFFF; +} + +.blockquote.blockquote-white small { + color: rgba(255, 255, 255, 0.8); +} + +body { + color: #2c2c2c; + font-size: 14px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +.main { + position: relative; + background: #FFFFFF; +} + + +/* Animations */ + +.nav-pills .nav-link, +.nav-item .nav-link, +.navbar, +.nav-tabs .nav-link { + -webkit-transition: all 300ms ease 0s; + -moz-transition: all 300ms ease 0s; + -o-transition: all 300ms ease 0s; + -ms-transition: all 300ms ease 0s; + transition: all 300ms ease 0s; +} + +.dropdown-toggle:after, +.bootstrap-switch-label:before { + -webkit-transition: all 150ms ease 0s; + -moz-transition: all 150ms ease 0s; + -o-transition: all 150ms ease 0s; + -ms-transition: all 150ms ease 0s; + transition: all 150ms ease 0s; +} + +.dropdown-toggle[aria-expanded="true"]:after { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.button-bar { + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: #FFFFFF; +} + +.button-bar+.button-bar { + margin-top: 7px; +} + +.button-bar:nth-child(2) { + width: 17px; +} + +.open { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + filter: alpha(opacity=100); + visibility: visible; +} + +.separator { + height: 2px; + width: 44px; + background-color: #888; + margin: 20px auto; +} + +.separator.separator-primary { + background-color: #f96332; +} + +.nav-pills .nav-item .nav-link { + padding: 0 15.5px; + text-align: center; + height: 60px; + width: 60px; + font-weight: 400; + color: #9A9A9A; + margin-right: 19px; + background-color: rgba(222, 222, 222, 0.3); + border-radius: 30px; +} + +.nav-pills .nav-item .nav-link:hover { + background-color: rgba(222, 222, 222, 0.3); +} + +.nav-pills .nav-item .nav-link.active, +.nav-pills .nav-item .nav-link.active:focus, +.nav-pills .nav-item .nav-link.active:hover { + background-color: #9A9A9A; + color: #FFFFFF; + box-shadow: 0px 5px 35px 0px rgba(0, 0, 0, 0.3); +} + +.nav-pills .nav-item .nav-link.disabled, +.nav-pills .nav-item .nav-link:disabled, +.nav-pills .nav-item .nav-link[disabled] { + opacity: .5; +} + +.nav-pills .nav-item i { + display: block; + font-size: 20px; + line-height: 60px; +} + +.nav-pills.nav-pills-neutral .nav-item .nav-link { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.nav-pills.nav-pills-neutral .nav-item .nav-link.active, +.nav-pills.nav-pills-neutral .nav-item .nav-link.active:focus, +.nav-pills.nav-pills-neutral .nav-item .nav-link.active:hover { + background-color: #FFFFFF; + color: #f96332; +} + +.nav-pills.nav-pills-primary .nav-item .nav-link.active, +.nav-pills.nav-pills-primary .nav-item .nav-link.active:focus, +.nav-pills.nav-pills-primary .nav-item .nav-link.active:hover { + background-color: #f96332; +} + +.nav-pills.nav-pills-info .nav-item .nav-link.active, +.nav-pills.nav-pills-info .nav-item .nav-link.active:focus, +.nav-pills.nav-pills-info .nav-item .nav-link.active:hover { + background-color: #2CA8FF; +} + +.nav-pills.nav-pills-success .nav-item .nav-link.active, +.nav-pills.nav-pills-success .nav-item .nav-link.active:focus, +.nav-pills.nav-pills-success .nav-item .nav-link.active:hover { + background-color: #18ce0f; +} + +.nav-pills.nav-pills-warning .nav-item .nav-link.active, +.nav-pills.nav-pills-warning .nav-item .nav-link.active:focus, +.nav-pills.nav-pills-warning .nav-item .nav-link.active:hover { + background-color: #FFB236; +} + +.nav-pills.nav-pills-danger .nav-item .nav-link.active, +.nav-pills.nav-pills-danger .nav-item .nav-link.active:focus, +.nav-pills.nav-pills-danger .nav-item .nav-link.active:hover { + background-color: #FF3636; +} + +.tab-space { + padding: 20px 0 50px 0px; +} + +.nav-align-center { + text-align: center; +} + +.nav-align-center .nav-pills { + display: inline-flex; +} + +.btn-twitter { + color: #55acee; +} + +.btn-twitter:hover, +.btn-twitter:focus, +.btn-twitter:active { + color: #3ea1ec; +} + +.btn-facebook { + color: #3b5998; +} + +.btn-facebook:hover, +.btn-facebook:focus, +.btn-facebook:active { + color: #344e86; +} + +.btn-google { + color: #dd4b39; +} + +.btn-google:hover, +.btn-google:focus, +.btn-google:active { + color: #d73925; +} + +.btn-linkedin { + color: #0077B5; +} + +.btn-linkedin:hover, +.btn-linkedin:focus, +.btn-linkedin:active { + color: #00669c; +} + +.nav-tabs { + border: 0; + padding: 15px 0.7rem; +} + +.nav-tabs>.nav-item>.nav-link { + color: #888; + margin: 0; + margin-right: 5px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 30px; + font-size: 14px; + padding: 11px 23px; + line-height: 1.5; +} + +.nav-tabs>.nav-item>.nav-link:hover { + background-color: transparent; +} + +.nav-tabs>.nav-item>.nav-link.active { + border: 1px solid #888; + border-radius: 30px; +} + +.nav-tabs>.nav-item>.nav-link i.now-ui-icons { + font-size: 14px; + position: relative; + top: 1px; + margin-right: 3px; +} + +.nav-tabs>.nav-item.disabled>.nav-link, +.nav-tabs>.nav-item.disabled>.nav-link:hover { + color: rgba(255, 255, 255, 0.5); +} + +.nav-tabs.nav-tabs-neutral>.nav-item>.nav-link { + color: #FFFFFF; +} + +.nav-tabs.nav-tabs-neutral>.nav-item>.nav-link.active { + border-color: rgba(255, 255, 255, 0.5); + color: #FFFFFF; +} + +.nav-tabs.nav-tabs-primary>.nav-item>.nav-link.active { + border-color: #f96332; + color: #f96332; +} + +.nav-tabs.nav-tabs-info>.nav-item>.nav-link.active { + border-color: #2CA8FF; + color: #2CA8FF; +} + +.nav-tabs.nav-tabs-danger>.nav-item>.nav-link.active { + border-color: #FF3636; + color: #FF3636; +} + +.nav-tabs.nav-tabs-warning>.nav-item>.nav-link.active { + border-color: #FFB236; + color: #FFB236; +} + +.nav-tabs.nav-tabs-success>.nav-item>.nav-link.active { + border-color: #18ce0f; + color: #18ce0f; +} + +.navbar-rounded { + border-radius: 15px; +} +.navbar { + padding-top: 0.625rem; + padding-bottom: 0.625rem; + min-height: 53px; + margin-bottom: 20px; + box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.15); +} + +.navbar a { + vertical-align: middle; +} + +.navbar a:not(.btn):not(.dropdown-item) { + color: #FFFFFF; +} + +.navbar p { + display: inline-block; + margin: 0; + line-height: 21px; +} + +.navbar .navbar-nav.navbar-logo { + position: absolute; + left: 0; + right: 0; + margin: 0 auto; + width: 49px; + top: -4px; +} + +.navbar .navbar-nav .nav-link.btn { + padding: 11px 22px; +} + +.navbar .navbar-nav .nav-link.btn.btn-lg { + padding: 15px 48px; +} + +.navbar .navbar-nav .nav-link.btn.btn-sm { + padding: 5px 15px; +} + +.navbar .navbar-nav .nav-link:not(.btn) { + text-transform: uppercase; + font-size: 0.7142em; + padding: 0.5rem 0.7rem; + line-height: 1.625rem; +} + +.navbar .navbar-nav .nav-link:not(.btn) i.fa+p, +.navbar .navbar-nav .nav-link:not(.btn) i.now-ui-icons+p { + margin-left: 5px; +} + +.navbar .navbar-nav .nav-link:not(.btn) i.fa, +.navbar .navbar-nav .nav-link:not(.btn) i.now-ui-icons { + font-size: 18px; + position: relative; + top: 2px; + text-align: center; + width: 21px; +} + +.navbar .navbar-nav .nav-link:not(.btn) i.now-ui-icons { + top: 4px; + font-size: 16px; +} + +.navbar .navbar-nav .nav-link:not(.btn).profile-photo .profile-photo-small { + width: 27px; + height: 27px; +} + +.navbar .navbar-nav .nav-link:not(.btn).disabled { + opacity: .5; + color: #FFFFFF; +} + +.navbar .navbar-nav .nav-item.active .nav-link:not(.btn), +.navbar .navbar-nav .nav-item .nav-link:not(.btn):focus, +.navbar .navbar-nav .nav-item .nav-link:not(.btn):hover, +.navbar .navbar-nav .nav-item .nav-link:not(.btn):active { + background-color: rgba(255, 255, 255, 0.2); + border-radius: 0.1875rem; +} + +.navbar .logo-container { + width: 27px; + height: 27px; + overflow: hidden; + margin: 0 auto; + border-radius: 50%; + border: 1px solid transparent; +} + +.navbar .navbar-brand { + text-transform: uppercase; + font-size: 0.8571em; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + line-height: 1.625rem; +} + +.navbar .navbar-toggler { + width: 37px; + height: 27px; + outline: 0; + cursor: pointer; +} + +.navbar .navbar-toggler.navbar-toggler-left { + position: relative; + left: 0; + padding-left: 0; +} + +.navbar .navbar-toggler:hover .navbar-toggler-bar.bar2 { + width: 22px; +} + +.navbar .button-dropdown .navbar-toggler-bar:nth-child(2) { + width: 17px; +} + +.navbar.navbar-transparent { + background-color: transparent !important; + box-shadow: none; + color: #FFFFFF; + padding-top: 20px; +} + +.navbar.bg-white:not(.navbar-transparent) a:not(.dropdown-item) { + color: #888; +} + +.navbar.bg-white:not(.navbar-transparent) a:not(.dropdown-item).disabled { + opacity: .5; + color: #888; +} + +.navbar.bg-white:not(.navbar-transparent) .button-bar { + background: #888; +} + +.navbar.bg-white:not(.navbar-transparent) .nav-item.active .nav-link:not(.btn), +.navbar.bg-white:not(.navbar-transparent) .nav-item .nav-link:not(.btn):focus, +.navbar.bg-white:not(.navbar-transparent) .nav-item .nav-link:not(.btn):hover, +.navbar.bg-white:not(.navbar-transparent) .nav-item .nav-link:not(.btn):active { + background-color: rgba(222, 222, 222, 0.3); +} + +.navbar.bg-white:not(.navbar-transparent) .logo-container { + border: 1px solid #888; +} + +.bg-default { + background-color: #888 !important; +} + +.bg-primary { + background-color: #f96332 !important; +} + +.bg-info { + background-color: #2CA8FF !important; +} + +.bg-success { + background-color: #18ce0f !important; +} + +.bg-danger { + background-color: #FF3636 !important; +} + +.bg-warning { + background-color: #FFB236 !important; +} + +.bg-white { + background-color: #FFFFFF !important; +} + +.dropdown-menu { + border: 0; + box-shadow: 0px 10px 50px 0px rgba(0, 0, 0, 0.2); + border-radius: 0.125rem; + -webkit-transition: all 150ms linear; + -moz-transition: all 150ms linear; + -o-transition: all 150ms linear; + -ms-transition: all 150ms linear; + transition: all 150ms linear; + font-size: 14px; +} + +.dropdown-menu.dropdown-menu-right:before { + left: auto; + right: 10px; +} + +.dropdown-menu:before { + display: inline-block; + position: absolute; + width: 0; + height: 0; + vertical-align: middle; + content: ""; + top: -5px; + left: 10px; + right: auto; + color: #FFFFFF; + border-bottom: .4em solid; + border-right: .4em solid transparent; + border-left: .4em solid transparent; +} + +.dropdown-menu .dropdown-item { + font-size: 0.8571em; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + -webkit-transition: all 150ms linear; + -moz-transition: all 150ms linear; + -o-transition: all 150ms linear; + -ms-transition: all 150ms linear; + transition: all 150ms linear; +} + +.dropdown-menu .dropdown-item:hover, +.dropdown-menu .dropdown-item:focus { + background-color: rgba(222, 222, 222, 0.3); +} + +.dropdown-menu .dropdown-divider { + background-color: rgba(222, 222, 222, 0.5); +} + +.dropdown-menu .dropdown-header:not([href]):not([tabindex]) { + color: rgba(182, 182, 182, 0.6); + font-size: 0.7142em; + text-transform: uppercase; + font-weight: 700; +} + +.dropdown-menu.dropdown-primary { + background-color: #f95823; +} + +.dropdown-menu.dropdown-primary:before { + color: #f95823; +} + +.dropdown-menu.dropdown-primary .dropdown-header:not([href]):not([tabindex]) { + color: rgba(255, 255, 255, 0.8); +} + +.dropdown-menu.dropdown-primary .dropdown-item { + color: #FFFFFF; +} + +.dropdown-menu.dropdown-primary .dropdown-item:hover, +.dropdown-menu.dropdown-primary .dropdown-item:focus { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-primary .dropdown-divider { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-info { + background-color: #1da2ff; +} + +.dropdown-menu.dropdown-info:before { + color: #1da2ff; +} + +.dropdown-menu.dropdown-info .dropdown-header:not([href]):not([tabindex]) { + color: rgba(255, 255, 255, 0.8); +} + +.dropdown-menu.dropdown-info .dropdown-item { + color: #FFFFFF; +} + +.dropdown-menu.dropdown-info .dropdown-item:hover, +.dropdown-menu.dropdown-info .dropdown-item:focus { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-info .dropdown-divider { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-danger { + background-color: #ff2727; +} + +.dropdown-menu.dropdown-danger:before { + color: #ff2727; +} + +.dropdown-menu.dropdown-danger .dropdown-header:not([href]):not([tabindex]) { + color: rgba(255, 255, 255, 0.8); +} + +.dropdown-menu.dropdown-danger .dropdown-item { + color: #FFFFFF; +} + +.dropdown-menu.dropdown-danger .dropdown-item:hover, +.dropdown-menu.dropdown-danger .dropdown-item:focus { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-danger .dropdown-divider { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-success { + background-color: #16c00e; +} + +.dropdown-menu.dropdown-success:before { + color: #16c00e; +} + +.dropdown-menu.dropdown-success .dropdown-header:not([href]):not([tabindex]) { + color: rgba(255, 255, 255, 0.8); +} + +.dropdown-menu.dropdown-success .dropdown-item { + color: #FFFFFF; +} + +.dropdown-menu.dropdown-success .dropdown-item:hover, +.dropdown-menu.dropdown-success .dropdown-item:focus { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-success .dropdown-divider { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-warning { + background-color: #ffac27; +} + +.dropdown-menu.dropdown-warning:before { + color: #ffac27; +} + +.dropdown-menu.dropdown-warning .dropdown-header:not([href]):not([tabindex]) { + color: rgba(255, 255, 255, 0.8); +} + +.dropdown-menu.dropdown-warning .dropdown-item { + color: #FFFFFF; +} + +.dropdown-menu.dropdown-warning .dropdown-item:hover, +.dropdown-menu.dropdown-warning .dropdown-item:focus { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown-menu.dropdown-warning .dropdown-divider { + background-color: rgba(255, 255, 255, 0.2); +} + +.dropdown .dropdown-menu { + -webkit-transform: translate3d(0, -25px, 0); + -moz-transform: translate3d(0, -25px, 0); + -o-transform: translate3d(0, -25px, 0); + -ms-transform: translate3d(0, -25px, 0); + transform: translate3d(0, -25px, 0); + visibility: hidden; + display: block; + opacity: 0; + filter: alpha(opacity=0); +} + +.dropdown.show .dropdown-menu, +.dropdown-menu.open { + opacity: 1; + filter: alpha(opacity=100); + visibility: visible; + -webkit-transform: translate3d(0, 0px, 0); + -moz-transform: translate3d(0, 0px, 0); + -o-transform: translate3d(0, 0px, 0); + -ms-transform: translate3d(0, 0px, 0); + transform: translate3d(0, 0px, 0); +} + +.navbar .dropdown.show .dropdown-menu { + -webkit-transform: translate3d(0, 7px, 0); + -moz-transform: translate3d(0, 7px, 0); + -o-transform: translate3d(0, 7px, 0); + -ms-transform: translate3d(0, 7px, 0); + transform: translate3d(0, 7px, 0); +} + +.button-dropdown { + padding-right: 0.7rem; + cursor: pointer; +} + +.button-dropdown .dropdown-toggle { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + display: block; +} + +.button-dropdown .dropdown-toggle:after { + display: none; +} + +.alert { + border: 0; + border-radius: 0; + color: #FFFFFF; + padding-top: .9rem; + padding-bottom: .9rem; + position: relative; +} + +.alert.alert-success { + background-color: rgba(24, 206, 15, 0.8); +} + +.alert.alert-danger { + background-color: rgba(255, 54, 54, 0.8); +} + +.alert.alert-warning { + background-color: rgba(255, 178, 54, 0.8); +} + +.alert.alert-info { + background-color: rgba(44, 168, 255, 0.8); +} + +.alert.alert-primary { + background-color: rgba(249, 99, 50, 0.8); +} + +.alert .alert-icon { + display: block; + float: left; + margin-right: 15px; + margin-top: -1px; +} + +.alert strong { + text-transform: uppercase; + font-size: 12px; +} + +.alert i.fa, +.alert i.now-ui-icons { + font-size: 20px; +} + +.alert .close { + color: #FFFFFF; + opacity: .9; + text-shadow: none; + line-height: 0; + outline: 0; +} + +img { + max-width: 100%; + border-radius: 1px; +} + +.img-raised { + box-shadow: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); +} + +.popover { + font-size: 14px; + box-shadow: 0px 10px 50px 0px rgba(0, 0, 0, 0.2); + border: none; + line-height: 1.7; + max-width: 240px; +} + +.popover.bs-popover-top .arrow:before, +.popover.bs-popover-left .arrow:before, +.popover.bs-popover-right .arrow:before, +.popover.bs-popover-bottom .arrow:before { + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-color: transparent; +} + +.popover .popover-header { + color: rgba(182, 182, 182, 0.6); + font-size: 14px; + text-transform: capitalize; + font-weight: 600; + margin: 0; + margin-top: 5px; + border: none; + background-color: transparent; +} + +.popover:before { + display: none; +} + +.popover.bs-tether-element-attached-top:after { + border-bottom-color: #FFFFFF; + top: -9px; +} + +.popover.popover-primary { + background-color: #f96332; +} + +.popover.popover-primary .popover-body { + color: #FFFFFF; +} + +.popover.popover-primary.bs-popover-right .arrow:after { + border-right-color: #f96332; +} + +.popover.popover-primary.bs-popover-top .arrow:after { + border-top-color: #f96332; +} + +.popover.popover-primary.bs-popover-bottom .arrow:after { + border-bottom-color: #f96332; +} + +.popover.popover-primary.bs-popover-left .arrow:after { + border-left-color: #f96332; +} + +.popover.popover-primary .popover-header { + color: #FFFFFF; + opacity: .6; +} + +.popover.popover-info { + background-color: #2CA8FF; +} + +.popover.popover-info .popover-body { + color: #FFFFFF; +} + +.popover.popover-info.bs-popover-right .arrow:after { + border-right-color: #2CA8FF; +} + +.popover.popover-info.bs-popover-top .arrow:after { + border-top-color: #2CA8FF; +} + +.popover.popover-info.bs-popover-bottom .arrow:after { + border-bottom-color: #2CA8FF; +} + +.popover.popover-info.bs-popover-left .arrow:after { + border-left-color: #2CA8FF; +} + +.popover.popover-info .popover-header { + color: #FFFFFF; + opacity: .6; +} + +.popover.popover-warning { + background-color: #FFB236; +} + +.popover.popover-warning .popover-body { + color: #FFFFFF; +} + +.popover.popover-warning.bs-popover-right .arrow:after { + border-right-color: #FFB236; +} + +.popover.popover-warning.bs-popover-top .arrow:after { + border-top-color: #FFB236; +} + +.popover.popover-warning.bs-popover-bottom .arrow:after { + border-bottom-color: #FFB236; +} + +.popover.popover-warning.bs-popover-left .arrow:after { + border-left-color: #FFB236; +} + +.popover.popover-warning .popover-header { + color: #FFFFFF; + opacity: .6; +} + +.popover.popover-danger { + background-color: #FF3636; +} + +.popover.popover-danger .popover-body { + color: #FFFFFF; +} + +.popover.popover-danger.bs-popover-right .arrow:after { + border-right-color: #FF3636; +} + +.popover.popover-danger.bs-popover-top .arrow:after { + border-top-color: #FF3636; +} + +.popover.popover-danger.bs-popover-bottom .arrow:after { + border-bottom-color: #FF3636; +} + +.popover.popover-danger.bs-popover-left .arrow:after { + border-left-color: #FF3636; +} + +.popover.popover-danger .popover-header { + color: #FFFFFF; + opacity: .6; +} + +.popover.popover-success { + background-color: #18ce0f; +} + +.popover.popover-success .popover-body { + color: #FFFFFF; +} + +.popover.popover-success.bs-popover-right .arrow:after { + border-right-color: #18ce0f; +} + +.popover.popover-success.bs-popover-top .arrow:after { + border-top-color: #18ce0f; +} + +.popover.popover-success.bs-popover-bottom .arrow:after { + border-bottom-color: #18ce0f; +} + +.popover.popover-success.bs-popover-left .arrow:after { + border-left-color: #18ce0f; +} + +.popover.popover-success .popover-header { + color: #FFFFFF; + opacity: .6; +} + +.tooltip.bs-tooltip-right .arrow:before { + border-right-color: #FFFFFF; +} + +.tooltip.bs-tooltip-top .arrow:before { + border-top-color: #FFFFFF; +} + +.tooltip.bs-tooltip-bottom .arrow:before { + border-bottom-color: #FFFFFF; +} + +.tooltip.bs-tooltip-left .arrow:before { + border-left-color: #FFFFFF; +} + +.tooltip-inner { + padding: 0.5rem 0.7rem; + min-width: 130px; + background-color: #FFFFFF; + font-size: 14px; + color: inherit; + box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); +} + + +/* -------------------------------- + +Nucleo Outline Web Font - nucleoapp.com/ +License - nucleoapp.com/license/ +Created using IcoMoon - icomoon.io + +-------------------------------- */ + +@font-face { + font-family: 'Nucleo Outline'; + src: url("../fonts/nucleo-outline.eot"); + src: url("../fonts/nucleo-outline.eot") format("embedded-opentype"), url("../fonts/nucleo-outline.woff2") format("woff2"), url("../fonts/nucleo-outline.woff") format("woff"), url("../fonts/nucleo-outline.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + +/*------------------------ + base class definition +-------------------------*/ + +.now-ui-icons { + display: inline-block; + font: normal normal normal 14px/1 'Nucleo Outline'; + font-size: inherit; + speak: none; + text-transform: none; + /* Better Font Rendering */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + + +/*------------------------ + change icon size +-------------------------*/ + + +/*---------------------------------- + add a square/circle background +-----------------------------------*/ + +.now-ui-icons.circle { + padding: 0.33333333em; + vertical-align: -16%; + background-color: #eee; +} + +.now-ui-icons.circle { + border-radius: 50%; +} + + +/*------------------------ + list icons +-------------------------*/ + +.nc-icon-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} + +.nc-icon-ul>li { + position: relative; +} + +.nc-icon-ul>li>.now-ui-icons { + position: absolute; + left: -1.57142857em; + top: 0.14285714em; + text-align: center; +} + +.nc-icon-ul>li>.now-ui-icons.circle { + top: -0.19047619em; + left: -1.9047619em; +} + + +/*------------------------ + spinning icons +-------------------------*/ + +.now-ui-icons.spin { + -webkit-animation: nc-icon-spin 2s infinite linear; + -moz-animation: nc-icon-spin 2s infinite linear; + animation: nc-icon-spin 2s infinite linear; +} + +@-webkit-keyframes nc-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} + +@-moz-keyframes nc-icon-spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(360deg); + } +} + +@keyframes nc-icon-spin { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -o-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} + + +/*------------------------ + rotated/flipped icons +-------------------------*/ + + +/*------------------------ + font icons +-------------------------*/ + +.now-ui-icons.ui-1_check:before { + content: "\ea22"; +} + +.now-ui-icons.ui-1_email-85:before { + content: "\ea2a"; +} + +.now-ui-icons.arrows-1_cloud-download-93:before { + content: "\ea21"; +} + +.now-ui-icons.arrows-1_cloud-upload-94:before { + content: "\ea24"; +} + +.now-ui-icons.arrows-1_minimal-down:before { + content: "\ea39"; +} + +.now-ui-icons.arrows-1_minimal-left:before { + content: "\ea3a"; +} + +.now-ui-icons.arrows-1_minimal-right:before { + content: "\ea3b"; +} + +.now-ui-icons.arrows-1_minimal-up:before { + content: "\ea3c"; +} + +.now-ui-icons.arrows-1_refresh-69:before { + content: "\ea44"; +} + +.now-ui-icons.arrows-1_share-66:before { + content: "\ea4c"; +} + +.now-ui-icons.business_badge:before { + content: "\ea09"; +} + +.now-ui-icons.business_bank:before { + content: "\ea0a"; +} + +.now-ui-icons.business_briefcase-24:before { + content: "\ea13"; +} + +.now-ui-icons.business_bulb-63:before { + content: "\ea15"; +} + +.now-ui-icons.business_chart-bar-32:before { + content: "\ea1e"; +} + +.now-ui-icons.business_chart-pie-36:before { + content: "\ea1f"; +} + +.now-ui-icons.business_globe:before { + content: "\ea2f"; +} + +.now-ui-icons.business_money-coins:before { + content: "\ea40"; +} + +.now-ui-icons.clothes_tie-bow:before { + content: "\ea5b"; +} + +.now-ui-icons.design_vector:before { + content: "\ea61"; +} + +.now-ui-icons.design_app:before { + content: "\ea08"; +} + +.now-ui-icons.design_bullet-list-67:before { + content: "\ea14"; +} + +.now-ui-icons.design_image:before { + content: "\ea33"; +} + +.now-ui-icons.design_palette:before { + content: "\ea41"; +} + +.now-ui-icons.design_scissors:before { + content: "\ea4a"; +} + +.now-ui-icons.design-2_html5:before { + content: "\ea32"; +} + +.now-ui-icons.design-2_ruler-pencil:before { + content: "\ea48"; +} + +.now-ui-icons.emoticons_satisfied:before { + content: "\ea49"; +} + +.now-ui-icons.files_box:before { + content: "\ea12"; +} + +.now-ui-icons.files_paper:before { + content: "\ea43"; +} + +.now-ui-icons.files_single-copy-04:before { + content: "\ea52"; +} + +.now-ui-icons.health_ambulance:before { + content: "\ea07"; +} + +.now-ui-icons.loader_gear:before { + content: "\ea4e"; +} + +.now-ui-icons.loader_refresh:before { + content: "\ea44"; +} + +.now-ui-icons.location_bookmark:before { + content: "\ea10"; +} + +.now-ui-icons.location_compass-05:before { + content: "\ea25"; +} + +.now-ui-icons.location_map-big:before { + content: "\ea3d"; +} + +.now-ui-icons.location_pin:before { + content: "\ea47"; +} + +.now-ui-icons.location_world:before { + content: "\ea63"; +} + +.now-ui-icons.media-1_album:before { + content: "\ea02"; +} + +.now-ui-icons.media-1_button-pause:before { + content: "\ea16"; +} + +.now-ui-icons.media-1_button-play:before { + content: "\ea18"; +} + +.now-ui-icons.media-1_button-power:before { + content: "\ea19"; +} + +.now-ui-icons.media-1_camera-compact:before { + content: "\ea1c"; +} + +.now-ui-icons.media-2_note-03:before { + content: "\ea3f"; +} + +.now-ui-icons.media-2_sound-wave:before { + content: "\ea57"; +} + +.now-ui-icons.objects_diamond:before { + content: "\ea29"; +} + +.now-ui-icons.objects_globe:before { + content: "\ea2f"; +} + +.now-ui-icons.objects_key-25:before { + content: "\ea38"; +} + +.now-ui-icons.objects_planet:before { + content: "\ea46"; +} + +.now-ui-icons.objects_spaceship:before { + content: "\ea55"; +} + +.now-ui-icons.objects_support-17:before { + content: "\ea56"; +} + +.now-ui-icons.objects_umbrella-13:before { + content: "\ea5f"; +} + +.now-ui-icons.education_agenda-bookmark:before { + content: "\ea01"; +} + +.now-ui-icons.education_atom:before { + content: "\ea0c"; +} + +.now-ui-icons.education_glasses:before { + content: "\ea2d"; +} + +.now-ui-icons.education_hat:before { + content: "\ea30"; +} + +.now-ui-icons.education_paper:before { + content: "\ea42"; +} + +.now-ui-icons.shopping_bag-16:before { + content: "\ea0d"; +} + +.now-ui-icons.shopping_basket:before { + content: "\ea0b"; +} + +.now-ui-icons.shopping_box:before { + content: "\ea11"; +} + +.now-ui-icons.shopping_cart-simple:before { + content: "\ea1d"; +} + +.now-ui-icons.shopping_credit-card:before { + content: "\ea28"; +} + +.now-ui-icons.shopping_delivery-fast:before { + content: "\ea27"; +} + +.now-ui-icons.shopping_shop:before { + content: "\ea50"; +} + +.now-ui-icons.shopping_tag-content:before { + content: "\ea59"; +} + +.now-ui-icons.sport_trophy:before { + content: "\ea5d"; +} + +.now-ui-icons.sport_user-run:before { + content: "\ea60"; +} + +.now-ui-icons.tech_controller-modern:before { + content: "\ea26"; +} + +.now-ui-icons.tech_headphones:before { + content: "\ea31"; +} + +.now-ui-icons.tech_laptop:before { + content: "\ea36"; +} + +.now-ui-icons.tech_mobile:before { + content: "\ea3e"; +} + +.now-ui-icons.tech_tablet:before { + content: "\ea58"; +} + +.now-ui-icons.tech_tv:before { + content: "\ea5e"; +} + +.now-ui-icons.tech_watch-time:before { + content: "\ea62"; +} + +.now-ui-icons.text_align-center:before { + content: "\ea05"; +} + +.now-ui-icons.text_align-left:before { + content: "\ea06"; +} + +.now-ui-icons.text_bold:before { + content: "\ea0e"; +} + +.now-ui-icons.text_caps-small:before { + content: "\ea1b"; +} + +.now-ui-icons.gestures_tap-01:before { + content: "\ea5a"; +} + +.now-ui-icons.transportation_air-baloon:before { + content: "\ea03"; +} + +.now-ui-icons.transportation_bus-front-12:before { + content: "\ea17"; +} + +.now-ui-icons.travel_info:before { + content: "\ea04"; +} + +.now-ui-icons.travel_istanbul:before { + content: "\ea34"; +} + +.now-ui-icons.ui-1_bell-53:before { + content: "\ea0f"; +} + +.now-ui-icons.ui-1_calendar-60:before { + content: "\ea1a"; +} + +.now-ui-icons.ui-1_lock-circle-open:before { + content: "\ea35"; +} + +.now-ui-icons.ui-1_send:before { + content: "\ea4d"; +} + +.now-ui-icons.ui-1_settings-gear-63:before { + content: "\ea4e"; +} + +.now-ui-icons.ui-1_simple-add:before { + content: "\ea4f"; +} + +.now-ui-icons.ui-1_simple-delete:before { + content: "\ea54"; +} + +.now-ui-icons.ui-1_simple-remove:before { + content: "\ea53"; +} + +.now-ui-icons.ui-1_zoom-bold:before { + content: "\ea64"; +} + +.now-ui-icons.ui-2_chat-round:before { + content: "\ea20"; +} + +.now-ui-icons.ui-2_favourite-28:before { + content: "\ea2b"; +} + +.now-ui-icons.ui-2_like:before { + content: "\ea37"; +} + +.now-ui-icons.ui-2_settings-90:before { + content: "\ea4b"; +} + +.now-ui-icons.ui-2_time-alarm:before { + content: "\ea5c"; +} + +.now-ui-icons.users_circle-08:before { + content: "\ea23"; +} + +.now-ui-icons.users_single-02:before { + content: "\ea51"; +} + +.modal-content { + border-radius: 0.1875rem; + border: none; + box-shadow: 0px 10px 50px 0px rgba(0, 0, 0, 0.5); +} + +.modal-content .modal-header { + border-bottom: none; + padding-top: 24px; + padding-right: 24px; + padding-bottom: 0; + padding-left: 24px; +} + +.modal-content .modal-header button { + position: absolute; + right: 27px; + top: 30px; + outline: 0; +} + +.modal-content .modal-header .title { + margin-top: 5px; + margin-bottom: 0; +} + +.modal-content .modal-body { + padding-top: 24px; + padding-right: 24px; + padding-bottom: 16px; + padding-left: 24px; + line-height: 1.9; +} + +.modal-content .modal-footer { + border-top: none; + padding-right: 24px; + padding-bottom: 16px; + padding-left: 24px; + -webkit-justify-content: space-between; + /* Safari 6.1+ */ + justify-content: space-between; +} + +.modal-content .modal-footer button { + margin: 0; + padding-left: 16px; + padding-right: 16px; + width: auto; +} + +.modal-content .modal-footer button.pull-left { + padding-left: 5px; + padding-right: 5px; + position: relative; + left: -5px; +} + +.modal-content .modal-body+.modal-footer { + padding-top: 0; +} + +.modal-backdrop { + background: rgba(0, 0, 0, 0.3); +} + +.modal.modal-mini p { + text-align: center; +} + +.modal.modal-mini .modal-dialog { + max-width: 255px; + margin: 0 auto; +} + +.modal.modal-mini .modal-profile { + width: 70px; + height: 70px; + background-color: #FFFFFF; + border-radius: 50%; + text-align: center; + line-height: 5.9; + box-shadow: 0px 5px 50px 0px rgba(0, 0, 0, 0.3); +} + +.modal.modal-mini .modal-profile i { + color: #f96332; + font-size: 21px; +} + +.modal.modal-mini .modal-profile[class*="modal-profile-"] i { + color: #FFFFFF; +} + +.modal.modal-mini .modal-profile.modal-profile-primary { + background-color: #f96332; +} + +.modal.modal-mini .modal-profile.modal-profile-danger { + background-color: #FF3636; +} + +.modal.modal-mini .modal-profile.modal-profile-warning { + background-color: #FFB236; +} + +.modal.modal-mini .modal-profile.modal-profile-success { + background-color: #18ce0f; +} + +.modal.modal-mini .modal-profile.modal-profile-info { + background-color: #2CA8FF; +} + +.modal.modal-mini .modal-footer button { + text-transform: uppercase; +} + +.modal.modal-mini .modal-footer button:first-child { + opacity: .5; +} + +.modal.modal-default .modal-content { + background-color: #FFFFFF; + color: #2c2c2c; +} + +.modal.modal-default .modal-header .close { + color: #2c2c2c; +} + +.modal.modal-primary .modal-content { + background-color: #f96332; + color: #FFFFFF; +} + +.modal.modal-primary .modal-header .close { + color: #FFFFFF; +} + +.modal.modal-danger .modal-content { + background-color: #FF3636; + color: #FFFFFF; +} + +.modal.modal-danger .modal-header .close { + color: #FFFFFF; +} + +.modal.modal-warning .modal-content { + background-color: #FFB236; + color: #FFFFFF; +} + +.modal.modal-warning .modal-header .close { + color: #FFFFFF; +} + +.modal.modal-success .modal-content { + background-color: #18ce0f; + color: #FFFFFF; +} + +.modal.modal-success .modal-header .close { + color: #FFFFFF; +} + +.modal.modal-info .modal-content { + background-color: #2CA8FF; + color: #FFFFFF; +} + +.modal.modal-info .modal-header .close { + color: #FFFFFF; +} + +.modal.show.modal-mini .modal-dialog { + -webkit-transform: translate(0, 30%); + -o-transform: translate(0, 30%); + transform: translate(0, 30%); +} + +.modal .modal-header .close { + color: #FF3636; + text-shadow: none; +} + +.modal .modal-header .close:hover, +.modal .modal-header .close:focus { + opacity: 1; +} + +.carousel-item-next, +.carousel-item-prev, +.carousel-item.active { + display: block; +} + +.carousel .carousel-inner { + box-shadow: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); +} + +.carousel .now-ui-icons { + font-size: 2em; +} + +.card { + border: 0; + border-radius: 0.1875rem; + display: inline-block; + position: relative; + overflow: hidden; + width: 100%; + margin-bottom: 20px; + box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); +} + +.card .card-body { + min-height: 190px; +} + +.card[data-background-color="orange"] { + background-color: #f96332; +} + +.card[data-background-color="red"] { + background-color: #FF3636; +} + +.card[data-background-color="yellow"] { + background-color: #FFB236; +} + +.card[data-background-color="blue"] { + background-color: #2CA8FF; +} + +.card[data-background-color="green"] { + background-color: #18ce0f; +} + +.card-signup { + max-width: 350px; + margin: 0 auto; +} + +.card-signup .header { + margin-left: 20px; + margin-right: 20px; + padding: 30px 0; +} + +.card-signup .text-divider { + margin-top: 30px; + margin-bottom: 0px; + text-align: center; +} + +.card-signup .card-body { + padding-top: 0px; + padding-bottom: 0px; + min-height: auto; +} + +.card-signup .checkbox { + margin-top: 20px; +} + +.card-signup .checkbox label { + margin-left: 17px; +} + +.card-signup .checkbox .checkbox-material { + padding-right: 12px; +} + +.card-signup .social-line { + margin-top: 20px; + text-align: center; +} + +.card-signup .social-line .btn.btn-icon, +.card-signup .social-line .btn.btn-icon .btn-icon -mini { + margin-left: 5px; + margin-right: 5px; + box-shadow: 0px 5px 50px 0px rgba(0, 0, 0, 0.2); +} + +.card-signup .footer { + margin-bottom: 10px; + margin-top: 24px; +} + +.card-plain { + background: transparent; + box-shadow: none; +} + +.card-plain .header { + margin-left: 0; + margin-right: 0; +} + +.card-plain .content { + padding-left: 0; + padding-right: 0; +} + +.footer { + padding: 24px 0; +} + +.footer.footer-default { + background-color: #f2f2f2; +} + +.footer nav { + display: inline-block; + float: left; +} + +.footer ul { + margin-bottom: 0; + padding: 0; + list-style: none; +} + +.footer ul li { + display: inline-block; +} + +.footer ul li a { + color: inherit; + padding: 0.5rem; + font-size: 0.8571em; + text-transform: uppercase; + text-decoration: none; +} + +.footer ul li a:hover { + text-decoration: none; +} + +.footer .copyright { + font-size: 0.8571em; +} + +.footer:after { + display: table; + clear: both; + content: " "; +} + +.index-page .page-header { + height: 100vh; +} + +.index-page .page-header .container>.content-center { + top: 37%; +} + +.index-page .page-header .category-absolute { + position: absolute; + top: 100vh; + margin-top: -60px; + padding: 0 15px; + width: 100%; + color: rgba(255, 255, 255, 0.5); +} + +.landing-page .header { + height: 100vh; + position: relative; +} + +.landing-page .header .container { + padding-top: 26vh; + color: #FFFFFF; + z-index: 2; + position: relative; +} + +.landing-page .header .share { + margin-top: 150px; +} + +.landing-page .header h1 { + font-weight: 600; +} + +.landing-page .header .title { + color: #FFFFFF; +} + +.landing-page .section-team .team .team-player img { + max-width: 100px; +} + +.landing-page .section-team .team-player { + margin-bottom: 15px; +} + +.landing-page .section-contact-us .title { + margin-bottom: 15px; +} + +.landing-page .section-contact-us .description { + margin-bottom: 30px; +} + +.landing-page .section-contact-us .input-group, +.landing-page .section-contact-us .send-button, +.landing-page .section-contact-us .textarea-container { + padding: 0 40px; +} + +.landing-page .section-contact-us .textarea-container { + margin: 40px 0; +} + +.landing-page .section-contact-us a.btn { + margin-top: 35px; +} + +.profile-page .page-header { + min-height: 550px; +} + +.profile-page .profile-container { + color: #FFFFFF; +} + +.profile-page .photo-container { + width: 123px; + height: 123px; + border-radius: 50%; + overflow: hidden; + margin: 0 auto; + box-shadow: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); +} + +.profile-page .title { + text-align: center; + margin-top: 30px; +} + +.profile-page .description, +.profile-page .category { + text-align: center; +} + +.profile-page h5.description { + max-width: 700px; + margin: 20px auto 75px; +} + +.profile-page .nav-align-center { + margin-top: 30px; +} + +.profile-page .content { + max-width: 450px; + margin: 0 auto; +} + +.profile-page .content .social-description { + display: inline-block; + max-width: 150px; + width: 145px; + text-align: center; + margin: 15px 0 0px; +} + +.profile-page .content .social-description h2 { + margin-bottom: 15px; +} + +.profile-page .button-container { + text-align: center; + margin-top: -106px; +} + +.profile-page .collections img { + margin-bottom: 30px; +} + +.profile-page .gallery { + margin-top: 45px; + padding-bottom: 50px; +} + +.section-full-page:after, +.section-full-page:before { + display: block; + content: ""; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 2; +} + +.section-full-page:before { + background-color: rgba(0, 0, 0, 0.5); +} + +.section-full-page[filter-color="purple"]:after, +.section-full-page[filter-color="primary"]:after { + background: rgba(227, 227, 227, 0.26); + /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(90deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(90deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(90deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* For Firefox 3.6 to 15 */ + background: linear-gradient(0deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* Standard syntax */ +} + +.section-full-page[data-image]:after { + opacity: .5; +} + +.section-full-page>.content, +.section-full-page>.footer { + position: relative; + z-index: 4; +} + +.section-full-page>.content { + min-height: calc(100vh - 80px); +} + +.section-full-page .full-page-background { + position: absolute; + z-index: 1; + height: 100%; + width: 100%; + display: block; + top: 0; + left: 0; + background-size: cover; + background-position: center center; +} + +.section-full-page .footer nav>ul a:not(.btn), +.section-full-page .footer, +.section-full-page .footer .copyright a { + color: #FFFFFF; +} + +.login-page .card-login { + border-radius: 0.25rem; + padding-bottom: 0.7rem; + max-width: 320px; +} + +.login-page .card-login .btn-wd { + min-width: 180px; +} + +.login-page .card-login .logo-container { + width: 65px; + margin: 0 auto; + margin-bottom: 55px; +} + +.login-page .card-login .logo-container img { + width: 100%; +} + +.login-page .card-login .input-group:last-child { + margin-bottom: 40px; +} + +.login-page .card-login.card-plain .form-control::-moz-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +.login-page .card-login.card-plain .form-control:-moz-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +.login-page .card-login.card-plain .form-control::-webkit-input-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +.login-page .card-login.card-plain .form-control:-ms-input-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +.login-page .card-login.card-plain .form-control { + border-color: rgba(255, 255, 255, 0.5); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-control:focus { + border-color: #FFFFFF; + background-color: transparent; + color: #FFFFFF; +} + +.login-page .card-login.card-plain .has-success:after, +.login-page .card-login.card-plain .has-danger:after { + color: #FFFFFF; +} + +.login-page .card-login.card-plain .has-danger .form-control { + background-color: transparent; +} + +.login-page .card-login.card-plain .input-group-addon { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.5); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .input-group-focus .input-group-addon { + background-color: transparent; + border-color: #FFFFFF; + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control { + background-color: rgba(255, 255, 255, 0.1); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control:focus, +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control:active, +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control:active, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control:focus, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control:active, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control:active { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control+.input-group-addon, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control+.input-group-addon { + background-color: rgba(255, 255, 255, 0.1); +} + +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control+.input-group-addon:focus, +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control+.input-group-addon:active, +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control+.input-group-addon:active, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control+.input-group-addon:focus, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control+.input-group-addon:active, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control+.input-group-addon:active { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-group.form-group-no-border .form-control:focus+.input-group-addon, +.login-page .card-login.card-plain .input-group.form-group-no-border .form-control:focus+.input-group-addon { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-group.form-group-no-border .input-group-addon, +.login-page .card-login.card-plain .input-group.form-group-no-border .input-group-addon { + background-color: rgba(255, 255, 255, 0.1); + border: none; + color: #FFFFFF; +} + +.login-page .card-login.card-plain .form-group.form-group-no-border.input-group-focus .input-group-addon, +.login-page .card-login.card-plain .input-group.form-group-no-border.input-group-focus .input-group-addon { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +.login-page .card-login.card-plain .input-group-addon, +.login-page .card-login.card-plain .form-group.form-group-no-border .input-group-addon, +.login-page .card-login.card-plain .input-group.form-group-no-border .input-group-addon { + color: rgba(255, 255, 255, 0.8); +} + +.login-page .link { + font-size: 10px; + color: #FFFFFF; + text-decoration: none; +} + +.section { + padding: 70px 0; + position: relative; + background: #FFFFFF; +} + +.section .row+.category { + margin-top: 15px; +} + +.section-navbars { + padding-bottom: 0; +} + +.section-full-screen { + height: 100vh; +} + +.section-signup { + padding-top: 20vh; +} + +.page-header { + height: 100vh; + max-height: 1050px; + padding: 0; + position: relative; + background-position: center center; + background-size: cover; +} + +.page-header .page-header-image { + position: absolute; + background-size: cover; + background-position: center center; + width: 100%; + height: 100%; + z-index: -1; +} + +.page-header footer { + position: absolute; + bottom: 0; + width: 100%; +} + +.page-header .container { + height: 100%; + z-index: 1; + text-align: center; + position: relative; +} + +.page-header .container>.content-center { + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + padding: 0 15px; + width: 100%; + max-width: 880px; +} + +.page-header .category, +.page-header .description { + color: rgba(255, 255, 255, 0.5); +} + +.page-header.page-header-small { + height: 60vh; + max-height: 440px; +} + +.page-header:after, +.page-header:before { + position: absolute; + z-index: 0; + width: 100%; + height: 100%; + display: block; + left: 0; + top: 0; + content: ""; +} + +.page-header:before { + background-color: rgba(0, 0, 0, 0.5); +} + +.page-header[filter-color="orange"] { + background: rgba(44, 44, 44, 0.2); + /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(90deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(90deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(90deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* For Firefox 3.6 to 15 */ + background: linear-gradient(0deg, rgba(44, 44, 44, 0.2), rgba(224, 23, 3, 0.6)); + /* Standard syntax */ +} +.page-header[filter-color="primary"] { + background: rgba(227, 227, 227, 0.26); + /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(90deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(90deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(90deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* For Firefox 3.6 to 15 */ + background: linear-gradient(0deg, rgba(227, 227, 227, 0.26), rgba(249, 99, 50, 0.95)); + /* Standard syntax */ +} +.page-header .container { + z-index: 2; +} + +.clear-filter:after, +.clear-filter:before { + display: none; +} + +.section-story-overview { + padding: 50px 0; +} + +.section-story-overview .image-container { + height: 335px; + position: relative; + background-position: center center; + background-size: cover; + box-shadow: 0px 10px 25px 0px rgba(0, 0, 0, 0.3); + border-radius: .25rem; +} + +.section-story-overview .image-container+.category { + padding-top: 15px; +} + +.section-story-overview .image-container.image-right { + z-index: 2; +} + +.section-story-overview .image-container.image-right+h3.title { + margin-top: 120px; +} + +.section-story-overview .image-container.image-left { + z-index: 1; +} + +.section-story-overview .image-container:nth-child(2) { + margin-top: 420px; + margin-left: -105px; +} + +.section-story-overview p.blockquote { + width: 220px; + min-height: 180px; + text-align: left; + position: absolute; + top: 376px; + right: 155px; + z-index: 0; +} + +.section-nucleo-icons .nucleo-container img { + width: auto; + left: 0; + top: 0; + height: 100%; + position: absolute; +} + +.section-nucleo-icons .nucleo-container { + height: 335px; + position: relative; +} + +.section-nucleo-icons h5 { + margin-bottom: 35px; +} + +.section-nucleo-icons .icons-container { + position: relative; + max-width: 450px; + height: 300px; + max-height: 300px; + margin: 0 auto; +} + +.section-nucleo-icons .icons-container i { + font-size: 34px; + position: absolute; + left: 0; + top: 0; +} + +.section-nucleo-icons .icons-container i:nth-child(1) { + top: 5%; + left: 7%; +} + +.section-nucleo-icons .icons-container i:nth-child(2) { + top: 28%; + left: 24%; +} + +.section-nucleo-icons .icons-container i:nth-child(3) { + top: 40%; +} + +.section-nucleo-icons .icons-container i:nth-child(4) { + top: 18%; + left: 62%; +} + +.section-nucleo-icons .icons-container i:nth-child(5) { + top: 74%; + left: 3%; +} + +.section-nucleo-icons .icons-container i:nth-child(6) { + top: 36%; + left: 44%; + font-size: 65px; + color: #f96332; + padding: 1px; +} + +.section-nucleo-icons .icons-container i:nth-child(7) { + top: 59%; + left: 26%; +} + +.section-nucleo-icons .icons-container i:nth-child(8) { + top: 60%; + left: 69%; +} + +.section-nucleo-icons .icons-container i:nth-child(9) { + top: 72%; + left: 47%; +} + +.section-nucleo-icons .icons-container i:nth-child(10) { + top: 88%; + left: 27%; +} + +.section-nucleo-icons .icons-container i:nth-child(11) { + top: 31%; + left: 80%; +} + +.section-nucleo-icons .icons-container i:nth-child(12) { + top: 88%; + left: 68%; +} + +.section-nucleo-icons .icons-container i:nth-child(13) { + top: 5%; + left: 81%; +} + +.section-nucleo-icons .icons-container i:nth-child(14) { + top: 58%; + left: 90%; +} + +.section-nucleo-icons .icons-container i:nth-child(15) { + top: 6%; + left: 40%; +} + +.section-images { + max-height: 670px; + height: 670px; +} + +.section-images .hero-images-container, +.section-images .hero-images-container-1, +.section-images .hero-images-container-2 { + margin-top: -38vh; +} + +.section-images .hero-images-container { + max-width: 670px; +} + +.section-images .hero-images-container-1 { + max-width: 390px; + position: absolute; + top: 55%; + right: 18%; +} + +.section-images .hero-images-container-2 { + max-width: 225px; + position: absolute; + top: 68%; + right: 12%; +} + +[data-background-color="orange"] { + background-color: #e95e38; +} + +[data-background-color="black"] { + background-color: #2c2c2c; +} + +[data-background-color] { + color: #FFFFFF; +} + +[data-background-color] .title, +[data-background-color] .social-description h2, +[data-background-color] p, +[data-background-color] p.blockquote, +[data-background-color] p.blockquote small, +[data-background-color] h1, +[data-background-color] h2, +[data-background-color] h3, +[data-background-color] h4, +[data-background-color] h5, +[data-background-color] h6, +[data-background-color] a:not(.btn):not(.dropdown-item), +[data-background-color] .icons-container i { + color: #FFFFFF; +} + +[data-background-color] .separator { + background-color: #FFFFFF; +} + +[data-background-color] .navbar.bg-white p { + color: #888; +} + +[data-background-color] .description, +[data-background-color] .social-description p { + color: rgba(255, 255, 255, 0.8); +} + +[data-background-color] p.blockquote { + border-color: rgba(255, 255, 255, 0.2); +} + +[data-background-color] .checkbox label::before, +[data-background-color] .checkbox label::after, +[data-background-color] .radio label::before, +[data-background-color] .radio label::after { + border-color: rgba(255, 255, 255, 0.2); +} + +[data-background-color] .checkbox label::after, +[data-background-color] .checkbox label, +[data-background-color] .radio label { + color: #FFFFFF; +} + +[data-background-color] .checkbox input[type="checkbox"]:disabled+label, +[data-background-color] .radio input[type="radio"]:disabled+label { + color: #FFFFFF; +} + +[data-background-color] .radio input[type="radio"]:not(:disabled):hover+label::after, +[data-background-color] .radio input[type="radio"]:checked+label::after { + background-color: #FFFFFF; + border-color: #FFFFFF; +} + +[data-background-color] .form-control::-moz-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +[data-background-color] .form-control:-moz-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +[data-background-color] .form-control::-webkit-input-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +[data-background-color] .form-control:-ms-input-placeholder { + color: #ebebeb; + opacity: 1; + filter: alpha(opacity=100); +} + +[data-background-color] .form-control { + border-color: rgba(255, 255, 255, 0.5); + color: #FFFFFF; +} + +[data-background-color] .form-control:focus { + border-color: #FFFFFF; + background-color: transparent; + color: #FFFFFF; +} + +[data-background-color] .has-success:after, +[data-background-color] .has-danger:after { + color: #FFFFFF; +} + +[data-background-color] .has-danger .form-control { + background-color: transparent; +} + +[data-background-color] .input-group-addon { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.5); + color: #FFFFFF; +} + +[data-background-color] .input-group-focus .input-group-addon { + background-color: transparent; + border-color: #FFFFFF; + color: #FFFFFF; +} + +[data-background-color] .form-group.form-group-no-border .form-control, +[data-background-color] .input-group.form-group-no-border .form-control { + background-color: rgba(255, 255, 255, 0.1); + color: #FFFFFF; +} + +[data-background-color] .form-group.form-group-no-border .form-control:focus, +[data-background-color] .form-group.form-group-no-border .form-control:active, +[data-background-color] .form-group.form-group-no-border .form-control:active, +[data-background-color] .input-group.form-group-no-border .form-control:focus, +[data-background-color] .input-group.form-group-no-border .form-control:active, +[data-background-color] .input-group.form-group-no-border .form-control:active { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +[data-background-color] .form-group.form-group-no-border .form-control+.input-group-addon, +[data-background-color] .input-group.form-group-no-border .form-control+.input-group-addon { + background-color: rgba(255, 255, 255, 0.1); +} + +[data-background-color] .form-group.form-group-no-border .form-control+.input-group-addon:focus, +[data-background-color] .form-group.form-group-no-border .form-control+.input-group-addon:active, +[data-background-color] .form-group.form-group-no-border .form-control+.input-group-addon:active, +[data-background-color] .input-group.form-group-no-border .form-control+.input-group-addon:focus, +[data-background-color] .input-group.form-group-no-border .form-control+.input-group-addon:active, +[data-background-color] .input-group.form-group-no-border .form-control+.input-group-addon:active { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +[data-background-color] .form-group.form-group-no-border .form-control:focus+.input-group-addon, +[data-background-color] .input-group.form-group-no-border .form-control:focus+.input-group-addon { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +[data-background-color] .form-group.form-group-no-border .input-group-addon, +[data-background-color] .input-group.form-group-no-border .input-group-addon { + background-color: rgba(255, 255, 255, 0.1); + border: none; + color: #FFFFFF; +} + +[data-background-color] .form-group.form-group-no-border.input-group-focus .input-group-addon, +[data-background-color] .input-group.form-group-no-border.input-group-focus .input-group-addon { + background-color: rgba(255, 255, 255, 0.2); + color: #FFFFFF; +} + +[data-background-color] .input-group-addon, +[data-background-color] .form-group.form-group-no-border .input-group-addon, +[data-background-color] .input-group.form-group-no-border .input-group-addon { + color: rgba(255, 255, 255, 0.8); +} + +[data-background-color] .btn.btn-simple { + background-color: transparent; + border-color: rgba(255, 255, 255, 0.5); + color: #FFFFFF; +} + +[data-background-color] .btn.btn-simple:hover, +[data-background-color] .btn.btn-simple:hover, +[data-background-color] .btn.btn-simple:focus, +[data-background-color] .btn.btn-simple:active { + background-color: transparent; + border-color: #FFFFFF; +} + +[data-background-color] .nav-tabs>.nav-item>.nav-link i.now-ui-icons { + color: #FFFFFF; +} + +[data-background-color].section-nucleo-icons .icons-container i:nth-child(6) { + color: #FFFFFF; +} + +@media screen and (max-width: 991px) { + .sidebar-collapse .navbar-collapse { + position: fixed; + display: block; + top: 0; + height: 100% !important; + width: 300px; + right: 0; + z-index: 1032; + visibility: visible; + background-color: #999; + overflow-y: visible; + border-top: none; + text-align: left; + max-height: none !important; + -webkit-transform: translate3d(300px, 0, 0); + -moz-transform: translate3d(300px, 0, 0); + -o-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .sidebar-collapse .navbar-collapse:before { + background: #f96332; + /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(#f96332 0%, #000 80%); + /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(#f96332 0%, #000 80%); + /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(#f96332 0%, #000 80%); + /* For Firefox 3.6 to 15 */ + background: linear-gradient(#f96332 0%, #000 80%); + /* Standard syntax (must be last) */ + opacity: 0.76; + filter: alpha(opacity=76); + display: block; + content: ""; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: -1; + } + .sidebar-collapse .navbar-collapse .navbar-nav:not(.navbar-logo) .nav-link { + margin: 0 1rem; + margin-top: 0.3125rem; + } + .sidebar-collapse .navbar-collapse .navbar-nav:not(.navbar-logo) .nav-link:not(.btn) { + color: #FFFFFF; + } + .sidebar-collapse .navbar-collapse .dropdown-menu .dropdown-item { + color: #FFFFFF; + } + .sidebar-collapse .navbar .navbar-nav { + margin-top: 53px; + } + .sidebar-collapse .navbar .navbar-nav .nav-link { + padding-top: 0.75rem; + padding-bottom: .75rem; + } + .sidebar-collapse .navbar .navbar-nav.navbar-logo { + top: 0; + height: 53px; + } + .sidebar-collapse .navbar .dropdown.show .dropdown-menu, + .sidebar-collapse .navbar .dropdown .dropdown-menu { + background-color: transparent; + border: 0; + transition: none; + -webkit-box-shadow: none; + box-shadow: none; + width: auto; + margin: 0 1rem; + margin-bottom: 15px; + padding-top: 0; + height: 150px; + overflow-y: scroll; + } + .sidebar-collapse .navbar .dropdown.show .dropdown-menu:before, + .sidebar-collapse .navbar .dropdown .dropdown-menu:before { + display: none; + } + .sidebar-collapse .navbar .dropdown .dropdown-item { + padding-left: 2.5rem; + } + .sidebar-collapse .navbar .dropdown .dropdown-menu { + display: none; + } + .sidebar-collapse .navbar .dropdown.show .dropdown-menu { + display: block; + } + .sidebar-collapse .navbar .dropdown-menu .dropdown-item:focus, + .sidebar-collapse .navbar .dropdown-menu .dropdown-item:hover { + color: #FFFFFF; + } + .sidebar-collapse .navbar .navbar-translate { + width: 100%; + position: relative; + display: flex; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + -ms-flex-align: center; + align-items: center; + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .sidebar-collapse .navbar .navbar-toggler-bar { + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: #FFFFFF; + } + .sidebar-collapse .navbar .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 7px; + } + .sidebar-collapse .navbar .navbar-toggler-bar.bar2 { + width: 17px; + transition: width .2s linear; + } + .sidebar-collapse .navbar.bg-white:not(.navbar-transparent) .navbar-toggler-bar { + background: #888; + } + .sidebar-collapse .navbar .toggled .navbar-toggler-bar { + width: 24px; + } + .sidebar-collapse .navbar .toggled .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 5px; + } + .sidebar-collapse .bar1, + .sidebar-collapse .bar2, + .sidebar-collapse .bar3 { + outline: 1px solid transparent; + } + .sidebar-collapse .bar1 { + top: 0px; + -webkit-animation: topbar-back 500ms linear 0s; + -moz-animation: topbar-back 500ms linear 0s; + animation: topbar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .sidebar-collapse .bar2 { + opacity: 1; + } + .sidebar-collapse .bar3 { + bottom: 0px; + -webkit-animation: bottombar-back 500ms linear 0s; + -moz-animation: bottombar-back 500ms linear 0s; + animation: bottombar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .sidebar-collapse .toggled .bar1 { + top: 6px; + -webkit-animation: topbar-x 500ms linear 0s; + -moz-animation: topbar-x 500ms linear 0s; + animation: topbar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .sidebar-collapse .toggled .bar2 { + opacity: 0; + } + .sidebar-collapse .toggled .bar3 { + bottom: 6px; + -webkit-animation: bottombar-x 500ms linear 0s; + -moz-animation: bottombar-x 500ms linear 0s; + animation: bottombar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + @keyframes topbar-x { + 0% { + top: 0px; + transform: rotate(0deg); + } + 45% { + top: 6px; + transform: rotate(145deg); + } + 75% { + transform: rotate(130deg); + } + 100% { + transform: rotate(135deg); + } + } + @-webkit-keyframes topbar-x { + 0% { + top: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + top: 6px; + -webkit-transform: rotate(145deg); + } + 75% { + -webkit-transform: rotate(130deg); + } + 100% { + -webkit-transform: rotate(135deg); + } + } + @-moz-keyframes topbar-x { + 0% { + top: 0px; + -moz-transform: rotate(0deg); + } + 45% { + top: 6px; + -moz-transform: rotate(145deg); + } + 75% { + -moz-transform: rotate(130deg); + } + 100% { + -moz-transform: rotate(135deg); + } + } + @keyframes topbar-back { + 0% { + top: 6px; + transform: rotate(135deg); + } + 45% { + transform: rotate(-10deg); + } + 75% { + transform: rotate(5deg); + } + 100% { + top: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes topbar-back { + 0% { + top: 6px; + -webkit-transform: rotate(135deg); + } + 45% { + -webkit-transform: rotate(-10deg); + } + 75% { + -webkit-transform: rotate(5deg); + } + 100% { + top: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes topbar-back { + 0% { + top: 6px; + -moz-transform: rotate(135deg); + } + 45% { + -moz-transform: rotate(-10deg); + } + 75% { + -moz-transform: rotate(5deg); + } + 100% { + top: 0px; + -moz-transform: rotate(0); + } + } + @keyframes bottombar-x { + 0% { + bottom: 0px; + transform: rotate(0deg); + } + 45% { + bottom: 6px; + transform: rotate(-145deg); + } + 75% { + transform: rotate(-130deg); + } + 100% { + transform: rotate(-135deg); + } + } + @-webkit-keyframes bottombar-x { + 0% { + bottom: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -webkit-transform: rotate(-145deg); + } + 75% { + -webkit-transform: rotate(-130deg); + } + 100% { + -webkit-transform: rotate(-135deg); + } + } + @-moz-keyframes bottombar-x { + 0% { + bottom: 0px; + -moz-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -moz-transform: rotate(-145deg); + } + 75% { + -moz-transform: rotate(-130deg); + } + 100% { + -moz-transform: rotate(-135deg); + } + } + @keyframes bottombar-back { + 0% { + bottom: 6px; + transform: rotate(-135deg); + } + 45% { + transform: rotate(10deg); + } + 75% { + transform: rotate(-5deg); + } + 100% { + bottom: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes bottombar-back { + 0% { + bottom: 6px; + -webkit-transform: rotate(-135deg); + } + 45% { + -webkit-transform: rotate(10deg); + } + 75% { + -webkit-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes bottombar-back { + 0% { + bottom: 6px; + -moz-transform: rotate(-135deg); + } + 45% { + -moz-transform: rotate(10deg); + } + 75% { + -moz-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -moz-transform: rotate(0); + } + } + @-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @-moz-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + .sidebar-collapse [class*="navbar-expand-"] .navbar-collapse { + width: 300px; + } + .sidebar-collapse .wrapper { + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .sidebar-collapse #bodyClick { + height: 100%; + width: 100%; + position: fixed; + opacity: 1; + top: 0; + left: auto; + right: 300px; + content: ""; + z-index: 9999; + overflow-x: hidden; + background-color: transparent; + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .sidebar-collapse.menu-on-left .navbar-collapse { + right: auto; + left: 0; + -webkit-transform: translate3d(-300px, 0, 0); + -moz-transform: translate3d(-300px, 0, 0); + -o-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + .nav-open .sidebar-collapse .navbar-collapse { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + } + .nav-open .sidebar-collapse .wrapper { + -webkit-transform: translate3d(-150px, 0, 0); + -moz-transform: translate3d(-150px, 0, 0); + -o-transform: translate3d(-150px, 0, 0); + -ms-transform: translate3d(-150px, 0, 0); + transform: translate3d(-150px, 0, 0); + } + .nav-open .sidebar-collapse .navbar-translate { + -webkit-transform: translate3d(-300px, 0, 0); + -moz-transform: translate3d(-300px, 0, 0); + -o-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + .nav-open .sidebar-collapse.menu-on-left .navbar-collapse { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + } + .nav-open .sidebar-collapse.menu-on-left .navbar-translate { + -webkit-transform: translate3d(300px, 0, 0); + -moz-transform: translate3d(300px, 0, 0); + -o-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + .nav-open .sidebar-collapse.menu-on-left .wrapper { + -webkit-transform: translate3d(150px, 0, 0); + -moz-transform: translate3d(150px, 0, 0); + -o-transform: translate3d(150px, 0, 0); + -ms-transform: translate3d(150px, 0, 0); + transform: translate3d(150px, 0, 0); + } + .nav-open .sidebar-collapse.menu-on-left #bodyClick { + right: auto; + left: 300px; + } + .bootstrap-collapse .navbar .navbar-collapse { + background: none !important; + } + .bootstrap-collapse .navbar .navbar-nav { + margin-top: 53px; + } + .bootstrap-collapse .navbar .navbar-nav .nav-link { + padding-top: 0.75rem; + padding-bottom: .75rem; + } + .bootstrap-collapse .navbar .navbar-nav.navbar-logo { + top: 0; + height: 53px; + } + .bootstrap-collapse .navbar .dropdown.show .dropdown-menu, + .bootstrap-collapse .navbar .dropdown .dropdown-menu { + background-color: transparent; + border: 0; + transition: none; + -webkit-box-shadow: none; + box-shadow: none; + width: auto; + margin: 0 1rem; + margin-bottom: 15px; + padding-top: 0; + height: 150px; + overflow-y: scroll; + } + .bootstrap-collapse .navbar .dropdown.show .dropdown-menu:before, + .bootstrap-collapse .navbar .dropdown .dropdown-menu:before { + display: none; + } + .bootstrap-collapse .navbar .dropdown .dropdown-item { + padding-left: 2.5rem; + } + .bootstrap-collapse .navbar .dropdown .dropdown-menu { + display: none; + } + .bootstrap-collapse .navbar .dropdown.show .dropdown-menu { + display: block; + } + .bootstrap-collapse .navbar .dropdown-menu .dropdown-item:focus, + .bootstrap-collapse .navbar .dropdown-menu .dropdown-item:hover { + color: #FFFFFF; + } + .bootstrap-collapse .navbar .navbar-translate { + width: 100%; + position: relative; + display: flex; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + -ms-flex-align: center; + align-items: center; + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .bootstrap-collapse .navbar .navbar-toggler-bar { + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: #FFFFFF; + } + .bootstrap-collapse .navbar .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 7px; + } + .bootstrap-collapse .navbar .navbar-toggler-bar.bar2 { + width: 17px; + transition: width .2s linear; + } + .bootstrap-collapse .navbar.bg-white:not(.navbar-transparent) .navbar-toggler-bar { + background: #888; + } + .bootstrap-collapse .navbar .toggled .navbar-toggler-bar { + width: 24px; + } + .bootstrap-collapse .navbar .toggled .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 5px; + } + .bootstrap-collapse .bar1, + .bootstrap-collapse .bar2, + .bootstrap-collapse .bar3 { + outline: 1px solid transparent; + } + .bootstrap-collapse .bar1 { + top: 0px; + -webkit-animation: topbar-back 500ms linear 0s; + -moz-animation: topbar-back 500ms linear 0s; + animation: topbar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .bootstrap-collapse .bar2 { + opacity: 1; + } + .bootstrap-collapse .bar3 { + bottom: 0px; + -webkit-animation: bottombar-back 500ms linear 0s; + -moz-animation: bottombar-back 500ms linear 0s; + animation: bottombar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .bootstrap-collapse .toggled .bar1 { + top: 6px; + -webkit-animation: topbar-x 500ms linear 0s; + -moz-animation: topbar-x 500ms linear 0s; + animation: topbar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .bootstrap-collapse .toggled .bar2 { + opacity: 0; + } + .bootstrap-collapse .toggled .bar3 { + bottom: 6px; + -webkit-animation: bottombar-x 500ms linear 0s; + -moz-animation: bottombar-x 500ms linear 0s; + animation: bottombar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + @keyframes topbar-x { + 0% { + top: 0px; + transform: rotate(0deg); + } + 45% { + top: 6px; + transform: rotate(145deg); + } + 75% { + transform: rotate(130deg); + } + 100% { + transform: rotate(135deg); + } + } + @-webkit-keyframes topbar-x { + 0% { + top: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + top: 6px; + -webkit-transform: rotate(145deg); + } + 75% { + -webkit-transform: rotate(130deg); + } + 100% { + -webkit-transform: rotate(135deg); + } + } + @-moz-keyframes topbar-x { + 0% { + top: 0px; + -moz-transform: rotate(0deg); + } + 45% { + top: 6px; + -moz-transform: rotate(145deg); + } + 75% { + -moz-transform: rotate(130deg); + } + 100% { + -moz-transform: rotate(135deg); + } + } + @keyframes topbar-back { + 0% { + top: 6px; + transform: rotate(135deg); + } + 45% { + transform: rotate(-10deg); + } + 75% { + transform: rotate(5deg); + } + 100% { + top: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes topbar-back { + 0% { + top: 6px; + -webkit-transform: rotate(135deg); + } + 45% { + -webkit-transform: rotate(-10deg); + } + 75% { + -webkit-transform: rotate(5deg); + } + 100% { + top: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes topbar-back { + 0% { + top: 6px; + -moz-transform: rotate(135deg); + } + 45% { + -moz-transform: rotate(-10deg); + } + 75% { + -moz-transform: rotate(5deg); + } + 100% { + top: 0px; + -moz-transform: rotate(0); + } + } + @keyframes bottombar-x { + 0% { + bottom: 0px; + transform: rotate(0deg); + } + 45% { + bottom: 6px; + transform: rotate(-145deg); + } + 75% { + transform: rotate(-130deg); + } + 100% { + transform: rotate(-135deg); + } + } + @-webkit-keyframes bottombar-x { + 0% { + bottom: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -webkit-transform: rotate(-145deg); + } + 75% { + -webkit-transform: rotate(-130deg); + } + 100% { + -webkit-transform: rotate(-135deg); + } + } + @-moz-keyframes bottombar-x { + 0% { + bottom: 0px; + -moz-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -moz-transform: rotate(-145deg); + } + 75% { + -moz-transform: rotate(-130deg); + } + 100% { + -moz-transform: rotate(-135deg); + } + } + @keyframes bottombar-back { + 0% { + bottom: 6px; + transform: rotate(-135deg); + } + 45% { + transform: rotate(10deg); + } + 75% { + transform: rotate(-5deg); + } + 100% { + bottom: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes bottombar-back { + 0% { + bottom: 6px; + -webkit-transform: rotate(-135deg); + } + 45% { + -webkit-transform: rotate(10deg); + } + 75% { + -webkit-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes bottombar-back { + 0% { + bottom: 6px; + -moz-transform: rotate(-135deg); + } + 45% { + -moz-transform: rotate(10deg); + } + 75% { + -moz-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -moz-transform: rotate(0); + } + } + @-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @-moz-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + .profile-photo .profile-photo-small { + margin-left: -2px; + } + .button-dropdown { + display: none; + } + .section-nucleo-icons .container .row>[class*="col-"]:first-child { + text-align: center; + } + .footer .copyright { + text-align: right; + } + .section-nucleo-icons .icons-container { + margin-top: 65px; + } + .navbar-nav .nav-link i.fa, + .navbar-nav .nav-link i.now-ui-icons { + opacity: .5; + } + .section-images { + height: 500px; + max-height: 500px; + } + .section-images .hero-images-container { + max-width: 500px; + } + .section-images .hero-images-container-1 { + right: 10%; + top: 68%; + max-width: 269px; + } + .section-images .hero-images-container-2 { + right: 5%; + max-width: 135px; + top: 93%; + } +} + +@media screen and (min-width: 992px) { + .burger-menu .navbar-collapse { + position: fixed; + display: block; + top: 0; + height: 100% !important; + width: 300px; + right: 0; + z-index: 1032; + visibility: visible; + background-color: #999; + overflow-y: visible; + border-top: none; + text-align: left; + max-height: none !important; + -webkit-transform: translate3d(300px, 0, 0); + -moz-transform: translate3d(300px, 0, 0); + -o-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .burger-menu .navbar-collapse:before { + background: #f96332; + /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(#f96332 0%, #000 80%); + /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(#f96332 0%, #000 80%); + /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(#f96332 0%, #000 80%); + /* For Firefox 3.6 to 15 */ + background: linear-gradient(#f96332 0%, #000 80%); + /* Standard syntax (must be last) */ + opacity: 0.76; + filter: alpha(opacity=76); + display: block; + content: ""; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: -1; + } + .burger-menu .navbar-collapse .navbar-nav:not(.navbar-logo) .nav-link { + margin: 0 1rem; + margin-top: 0.3125rem; + } + .burger-menu .navbar-collapse .navbar-nav:not(.navbar-logo) .nav-link:not(.btn) { + color: #FFFFFF; + } + .burger-menu .navbar-collapse .dropdown-menu .dropdown-item { + color: #FFFFFF; + } + .burger-menu .navbar .navbar-nav { + margin-top: 53px; + } + .burger-menu .navbar .navbar-nav .nav-link { + padding-top: 0.75rem; + padding-bottom: .75rem; + } + .burger-menu .navbar .navbar-nav.navbar-logo { + top: 0; + height: 53px; + } + .burger-menu .navbar .dropdown.show .dropdown-menu, + .burger-menu .navbar .dropdown .dropdown-menu { + background-color: transparent; + border: 0; + transition: none; + -webkit-box-shadow: none; + box-shadow: none; + width: auto; + margin: 0 1rem; + margin-bottom: 15px; + padding-top: 0; + height: 150px; + overflow-y: scroll; + } + .burger-menu .navbar .dropdown.show .dropdown-menu:before, + .burger-menu .navbar .dropdown .dropdown-menu:before { + display: none; + } + .burger-menu .navbar .dropdown .dropdown-item { + padding-left: 2.5rem; + } + .burger-menu .navbar .dropdown .dropdown-menu { + display: none; + } + .burger-menu .navbar .dropdown.show .dropdown-menu { + display: block; + } + .burger-menu .navbar .dropdown-menu .dropdown-item:focus, + .burger-menu .navbar .dropdown-menu .dropdown-item:hover { + color: #FFFFFF; + } + .burger-menu .navbar .navbar-translate { + width: 100%; + position: relative; + display: flex; + -ms-flex-pack: justify !important; + justify-content: space-between !important; + -ms-flex-align: center; + align-items: center; + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .burger-menu .navbar .navbar-toggler-bar { + display: block; + position: relative; + width: 22px; + height: 1px; + border-radius: 1px; + background: #FFFFFF; + } + .burger-menu .navbar .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 7px; + } + .burger-menu .navbar .navbar-toggler-bar.bar2 { + width: 17px; + transition: width .2s linear; + } + .burger-menu .navbar.bg-white:not(.navbar-transparent) .navbar-toggler-bar { + background: #888; + } + .burger-menu .navbar .toggled .navbar-toggler-bar { + width: 24px; + } + .burger-menu .navbar .toggled .navbar-toggler-bar+.navbar-toggler-bar { + margin-top: 5px; + } + .burger-menu .bar1, + .burger-menu .bar2, + .burger-menu .bar3 { + outline: 1px solid transparent; + } + .burger-menu .bar1 { + top: 0px; + -webkit-animation: topbar-back 500ms linear 0s; + -moz-animation: topbar-back 500ms linear 0s; + animation: topbar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .burger-menu .bar2 { + opacity: 1; + } + .burger-menu .bar3 { + bottom: 0px; + -webkit-animation: bottombar-back 500ms linear 0s; + -moz-animation: bottombar-back 500ms linear 0s; + animation: bottombar-back 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .burger-menu .toggled .bar1 { + top: 6px; + -webkit-animation: topbar-x 500ms linear 0s; + -moz-animation: topbar-x 500ms linear 0s; + animation: topbar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + .burger-menu .toggled .bar2 { + opacity: 0; + } + .burger-menu .toggled .bar3 { + bottom: 6px; + -webkit-animation: bottombar-x 500ms linear 0s; + -moz-animation: bottombar-x 500ms linear 0s; + animation: bottombar-x 500ms 0s; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + animation-fill-mode: forwards; + } + @keyframes topbar-x { + 0% { + top: 0px; + transform: rotate(0deg); + } + 45% { + top: 6px; + transform: rotate(145deg); + } + 75% { + transform: rotate(130deg); + } + 100% { + transform: rotate(135deg); + } + } + @-webkit-keyframes topbar-x { + 0% { + top: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + top: 6px; + -webkit-transform: rotate(145deg); + } + 75% { + -webkit-transform: rotate(130deg); + } + 100% { + -webkit-transform: rotate(135deg); + } + } + @-moz-keyframes topbar-x { + 0% { + top: 0px; + -moz-transform: rotate(0deg); + } + 45% { + top: 6px; + -moz-transform: rotate(145deg); + } + 75% { + -moz-transform: rotate(130deg); + } + 100% { + -moz-transform: rotate(135deg); + } + } + @keyframes topbar-back { + 0% { + top: 6px; + transform: rotate(135deg); + } + 45% { + transform: rotate(-10deg); + } + 75% { + transform: rotate(5deg); + } + 100% { + top: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes topbar-back { + 0% { + top: 6px; + -webkit-transform: rotate(135deg); + } + 45% { + -webkit-transform: rotate(-10deg); + } + 75% { + -webkit-transform: rotate(5deg); + } + 100% { + top: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes topbar-back { + 0% { + top: 6px; + -moz-transform: rotate(135deg); + } + 45% { + -moz-transform: rotate(-10deg); + } + 75% { + -moz-transform: rotate(5deg); + } + 100% { + top: 0px; + -moz-transform: rotate(0); + } + } + @keyframes bottombar-x { + 0% { + bottom: 0px; + transform: rotate(0deg); + } + 45% { + bottom: 6px; + transform: rotate(-145deg); + } + 75% { + transform: rotate(-130deg); + } + 100% { + transform: rotate(-135deg); + } + } + @-webkit-keyframes bottombar-x { + 0% { + bottom: 0px; + -webkit-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -webkit-transform: rotate(-145deg); + } + 75% { + -webkit-transform: rotate(-130deg); + } + 100% { + -webkit-transform: rotate(-135deg); + } + } + @-moz-keyframes bottombar-x { + 0% { + bottom: 0px; + -moz-transform: rotate(0deg); + } + 45% { + bottom: 6px; + -moz-transform: rotate(-145deg); + } + 75% { + -moz-transform: rotate(-130deg); + } + 100% { + -moz-transform: rotate(-135deg); + } + } + @keyframes bottombar-back { + 0% { + bottom: 6px; + transform: rotate(-135deg); + } + 45% { + transform: rotate(10deg); + } + 75% { + transform: rotate(-5deg); + } + 100% { + bottom: 0px; + transform: rotate(0); + } + } + @-webkit-keyframes bottombar-back { + 0% { + bottom: 6px; + -webkit-transform: rotate(-135deg); + } + 45% { + -webkit-transform: rotate(10deg); + } + 75% { + -webkit-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -webkit-transform: rotate(0); + } + } + @-moz-keyframes bottombar-back { + 0% { + bottom: 6px; + -moz-transform: rotate(-135deg); + } + 45% { + -moz-transform: rotate(10deg); + } + 75% { + -moz-transform: rotate(-5deg); + } + 100% { + bottom: 0px; + -moz-transform: rotate(0); + } + } + @-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @-moz-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + @keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + .burger-menu [class*="navbar-expand-"] .navbar-collapse { + width: 300px; + } + .burger-menu .wrapper { + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .burger-menu #bodyClick { + height: 100%; + width: 100%; + position: fixed; + opacity: 1; + top: 0; + left: auto; + right: 300px; + content: ""; + z-index: 9999; + overflow-x: hidden; + background-color: transparent; + -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); + } + .nav-open .burger-menu .navbar-collapse { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + } + .burger-menu .navbar-collapse { + display: block !important; + } + .burger-menu .navbar-collapse .navbar-nav { + margin-top: 53px; + height: 100%; + z-index: 2; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + } + .burger-menu .navbar-collapse .navbar-nav .nav-item { + margin: 0; + } + .burger-menu.menu-on-left .navbar-collapse { + right: auto; + left: 0; + -webkit-transform: translate3d(-300px, 0, 0); + -moz-transform: translate3d(-300px, 0, 0); + -o-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + .burger-menu [class*="navbar-expand-"] .navbar-nav .dropdown-menu { + position: static; + float: none; + } + .burger-menu [class*="navbar-expand-"] .navbar-toggler { + display: inline-block; + } + .burger-menu .section-navbars .navbar-collapse { + display: none !important; + } + .nav-open .burger-menu.menu-on-left .navbar .navbar-translate { + -webkit-transform: translate3d(300px, 0, 0); + -moz-transform: translate3d(300px, 0, 0); + -o-transform: translate3d(300px, 0, 0); + -ms-transform: translate3d(300px, 0, 0); + transform: translate3d(300px, 0, 0); + } + .nav-open .burger-menu .navbar .navbar-translate { + -webkit-transform: translate3d(-300px, 0, 0); + -moz-transform: translate3d(-300px, 0, 0); + -o-transform: translate3d(-300px, 0, 0); + -ms-transform: translate3d(-300px, 0, 0); + transform: translate3d(-300px, 0, 0); + } + .nav-open .burger-menu.menu-on-left .navbar-collapse { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate3d(0px, 0, 0); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); + } + .nav-open .burger-menu.menu-on-left #bodyClick { + right: auto; + left: 300px; + } + .burger-menu.menu-on-left .navbar-brand { + float: right; + margin-right: 0; + margin-left: 1rem; + } + .navbar-nav .nav-link.profile-photo { + padding: 0; + margin: 7px 0.7rem; + } + .navbar-nav .nav-link.btn:not(.btn-sm) { + margin: 0; + } + .navbar-nav .nav-item:not(:last-child) { + margin-right: 5px; + } + .section-nucleo-icons .icons-container { + margin: 0 0 0 auto; + } + .dropdown-menu .dropdown-item { + color: inherit; + } + .footer .copyright { + float: right; + } +} + +@media screen and (min-width: 768px) { + .image-container.image-right { + top: 80px; + margin-left: -100px; + margin-bottom: 130px; + } + .image-container.image-left { + margin-right: -100px; + } +} + +@media screen and (max-width: 768px) { + .image-container.image-left { + margin-bottom: 220px; + } + .image-container.image-left p.blockquote { + margin: 0 auto; + position: relative; + right: 0; + } + .nav-tabs { + display: inline-block; + width: 100%; + padding-left: 100px; + padding-right: 100px; + text-align: center; + } + .nav-tabs .nav-item>.nav-link { + margin-bottom: 5px; + } + .landing-page .section-story-overview .image-container:nth-child(2) { + margin-left: 0; + margin-bottom: 30px; + } +} + +@media screen and (max-width: 576px) { + .navbar[class*='navbar-expand-'] .container { + margin-left: 0; + margin-right: 0; + } + .footer .copyright { + text-align: center; + } + .section-nucleo-icons .icons-container i { + font-size: 30px; + } + .section-nucleo-icons .icons-container i:nth-child(6) { + font-size: 48px; + } + .page-header .container h6.category-absolute { + width: 90%; + } +} + +@media screen and (min-width: 991px) and (max-width: 1200px) { + .section-images .hero-images-container-1 { + right: 9%; + max-width: 370px; + } + .section-images .hero-images-container-2 { + right: 2%; + max-width: 216px; + } +} + +@media screen and (max-width: 768px) { + .section-images { + height: 300px; + max-height: 300px; + } + .section-images .hero-images-container { + max-width: 380px; + } + .section-images .hero-images-container-1 { + right: 7%; + top: 87%; + max-width: 210px; + } + .section-images .hero-images-container-2 { + right: 1%; + max-width: 133px; + top: 99%; + } +} + +@media screen and (max-width: 517px) { + .alert .alert-icon { + margin-top: 10px; + } +} + +@media screen and (min-width: 1200px) { + .section-images .hero-images-container-1 { + top: 51%; + right: 21%; + } + .section-images .hero-images-container-2 { + top: 66%; + right: 14%; + } +} + +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait) { + .section-images .hero-images-container, + .section-images .hero-images-container-1, + .section-images .hero-images-container-2 { + margin-top: -15vh; + margin-left: 80px; + } + .section-images .hero-images-container { + max-width: 300px; + } + .section-images .hero-images-container-1 { + right: 28%; + top: 40%; + } + .section-images .hero-images-container-2 { + right: 21%; + top: 55%; + } + .index-page .category-absolute { + top: 90vh; + } +} + +@media screen and (max-width: 580px) { + .alert button.close { + position: absolute; + right: 11px; + top: 50%; + transform: translateY(-50%); + } +} \ No newline at end of file diff --git a/web/libs/fonts/nucleo-outline.eot b/web/libs/fonts/nucleo-outline.eot new file mode 100644 index 0000000000000000000000000000000000000000..3625494fa6d1e2fff9a775ceef5f14173ad376b1 GIT binary patch literal 30528 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 literal 0 HcmV?d00001 diff --git a/web/libs/fonts/nucleo-outline.woff b/web/libs/fonts/nucleo-outline.woff new file mode 100644 index 0000000000000000000000000000000000000000..425ee841b3c573b2a7ffc8ad09ce8d0c17a7cbef GIT binary patch literal 18056 zcmV)(K#RY3Pew)n0RR9107i%a3jhEB0Ctc70RR91000000000000000000000000- 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 4) throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0") +}(), +function() { + function t(t, e) { + if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !e || "object" != typeof e && "function" != typeof e ? t : e + } + + function e(t, e) { + if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) + } + + function n(t, e) { + if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") + } + var i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t) { + return typeof t + } : function(t) { + return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t + }, + o = function() { + function t(t, e) { + for (var n = 0; n < e.length; n++) { + var i = e[n]; + i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(t, i.key, i) + } + } + return function(e, n, i) { + return n && t(e.prototype, n), i && t(e, i), e + } + }(), + r = function(t) { + function e(t) { + return {}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase() + } + + function n(t) { + return (t[0] || t).nodeType + } + + function i() { + return { + bindType: s.end, + delegateType: s.end, + handle: function(e) { + if (t(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + } + + function o() { + if (window.QUnit) return !1; + var t = document.createElement("bootstrap"); + for (var e in a) + if (void 0 !== t.style[e]) return { + end: a[e] + }; + return !1 + } + + function r(e) { + var n = this, + i = !1; + return t(this).one(l.TRANSITION_END, function() { + i = !0 + }), setTimeout(function() { + i || l.triggerTransitionEnd(n) + }, e), this + } + var s = !1, + a = { + WebkitTransition: "webkitTransitionEnd", + MozTransition: "transitionend", + OTransition: "oTransitionEnd otransitionend", + transition: "transitionend" + }, + l = { + TRANSITION_END: "bsTransitionEnd", + getUID: function(t) { + do { + t += ~~(1e6 * Math.random()) + } while (document.getElementById(t)); + return t + }, + getSelectorFromElement: function(e) { + var n = e.getAttribute("data-target"); + n && "#" !== n || (n = e.getAttribute("href") || ""); + try { + return t(n).length > 0 ? n : null + } catch (t) { + return null + } + }, + reflow: function(t) { + return t.offsetHeight + }, + triggerTransitionEnd: function(e) { + t(e).trigger(s.end) + }, + supportsTransitionEnd: function() { + return Boolean(s) + }, + typeCheckConfig: function(t, i, o) { + for (var r in o) + if (o.hasOwnProperty(r)) { + var s = o[r], + a = i[r], + l = a && n(a) ? "element" : e(a); + if (!new RegExp(s).test(l)) throw new Error(t.toUpperCase() + ': Option "' + r + '" provided type "' + l + '" but expected type "' + s + '".') + } + } + }; + return s = o(), t.fn.emulateTransitionEnd = r, l.supportsTransitionEnd() && (t.event.special[l.TRANSITION_END] = i()), l + }(jQuery), + s = (function(t) { + var e = "alert", + i = t.fn[e], + s = { + DISMISS: '[data-dismiss="alert"]' + }, + a = { + CLOSE: "close.bs.alert", + CLOSED: "closed.bs.alert", + CLICK_DATA_API: "click.bs.alert.data-api" + }, + l = { + ALERT: "alert", + FADE: "fade", + SHOW: "show" + }, + h = function() { + function e(t) { + n(this, e), this._element = t + } + return e.prototype.close = function(t) { + t = t || this._element; + var e = this._getRootElement(t); + this._triggerCloseEvent(e).isDefaultPrevented() || this._removeElement(e) + }, e.prototype.dispose = function() { + t.removeData(this._element, "bs.alert"), this._element = null + }, e.prototype._getRootElement = function(e) { + var n = r.getSelectorFromElement(e), + i = !1; + return n && (i = t(n)[0]), i || (i = t(e).closest("." + l.ALERT)[0]), i + }, e.prototype._triggerCloseEvent = function(e) { + var n = t.Event(a.CLOSE); + return t(e).trigger(n), n + }, e.prototype._removeElement = function(e) { + var n = this; + t(e).removeClass(l.SHOW), r.supportsTransitionEnd() && t(e).hasClass(l.FADE) ? t(e).one(r.TRANSITION_END, function(t) { + return n._destroyElement(e, t) + }).emulateTransitionEnd(150) : this._destroyElement(e) + }, e.prototype._destroyElement = function(e) { + t(e).detach().trigger(a.CLOSED).remove() + }, e._jQueryInterface = function(n) { + return this.each(function() { + var i = t(this), + o = i.data("bs.alert"); + o || (o = new e(this), i.data("bs.alert", o)), "close" === n && o[n](this) + }) + }, e._handleDismiss = function(t) { + return function(e) { + e && e.preventDefault(), t.close(this) + } + }, o(e, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }]), e + }(); + t(document).on(a.CLICK_DATA_API, s.DISMISS, h._handleDismiss(new h)), t.fn[e] = h._jQueryInterface, t.fn[e].Constructor = h, t.fn[e].noConflict = function() { + return t.fn[e] = i, h._jQueryInterface + } + }(jQuery), function(t) { + var e = "button", + i = t.fn[e], + r = { + ACTIVE: "active", + BUTTON: "btn", + FOCUS: "focus" + }, + s = { + DATA_TOGGLE_CARROT: '[data-toggle^="button"]', + DATA_TOGGLE: '[data-toggle="buttons"]', + INPUT: "input", + ACTIVE: ".active", + BUTTON: ".btn" + }, + a = { + CLICK_DATA_API: "click.bs.button.data-api", + FOCUS_BLUR_DATA_API: "focus.bs.button.data-api blur.bs.button.data-api" + }, + l = function() { + function e(t) { + n(this, e), this._element = t + } + return e.prototype.toggle = function() { + var e = !0, + n = !0, + i = t(this._element).closest(s.DATA_TOGGLE)[0]; + if (i) { + var o = t(this._element).find(s.INPUT)[0]; + if (o) { + if ("radio" === o.type) + if (o.checked && t(this._element).hasClass(r.ACTIVE)) e = !1; + else { + var a = t(i).find(s.ACTIVE)[0]; + a && t(a).removeClass(r.ACTIVE) + } + if (e) { + if (o.hasAttribute("disabled") || i.hasAttribute("disabled") || o.classList.contains("disabled") || i.classList.contains("disabled")) return; + o.checked = !t(this._element).hasClass(r.ACTIVE), t(o).trigger("change") + } + o.focus(), n = !1 + } + } + n && this._element.setAttribute("aria-pressed", !t(this._element).hasClass(r.ACTIVE)), e && t(this._element).toggleClass(r.ACTIVE) + }, e.prototype.dispose = function() { + t.removeData(this._element, "bs.button"), this._element = null + }, e._jQueryInterface = function(n) { + return this.each(function() { + var i = t(this).data("bs.button"); + i || (i = new e(this), t(this).data("bs.button", i)), "toggle" === n && i[n]() + }) + }, o(e, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }]), e + }(); + t(document).on(a.CLICK_DATA_API, s.DATA_TOGGLE_CARROT, function(e) { + e.preventDefault(); + var n = e.target; + t(n).hasClass(r.BUTTON) || (n = t(n).closest(s.BUTTON)), l._jQueryInterface.call(t(n), "toggle") + }).on(a.FOCUS_BLUR_DATA_API, s.DATA_TOGGLE_CARROT, function(e) { + var n = t(e.target).closest(s.BUTTON)[0]; + t(n).toggleClass(r.FOCUS, /^focus(in)?$/.test(e.type)) + }), t.fn[e] = l._jQueryInterface, t.fn[e].Constructor = l, t.fn[e].noConflict = function() { + return t.fn[e] = i, l._jQueryInterface + } + }(jQuery), function(t) { + var e = "carousel", + s = "bs.carousel", + a = "." + s, + l = t.fn[e], + h = { + interval: 5e3, + keyboard: !0, + slide: !1, + pause: "hover", + wrap: !0 + }, + c = { + interval: "(number|boolean)", + keyboard: "boolean", + slide: "(boolean|string)", + pause: "(string|boolean)", + wrap: "boolean" + }, + u = { + NEXT: "next", + PREV: "prev", + LEFT: "left", + RIGHT: "right" + }, + d = { + SLIDE: "slide" + a, + SLID: "slid" + a, + KEYDOWN: "keydown" + a, + MOUSEENTER: "mouseenter" + a, + MOUSELEAVE: "mouseleave" + a, + TOUCHEND: "touchend" + a, + LOAD_DATA_API: "load.bs.carousel.data-api", + CLICK_DATA_API: "click.bs.carousel.data-api" + }, + f = { + CAROUSEL: "carousel", + ACTIVE: "active", + SLIDE: "slide", + RIGHT: "carousel-item-right", + LEFT: "carousel-item-left", + NEXT: "carousel-item-next", + PREV: "carousel-item-prev", + ITEM: "carousel-item" + }, + p = { + ACTIVE: ".active", + ACTIVE_ITEM: ".active.carousel-item", + ITEM: ".carousel-item", + NEXT_PREV: ".carousel-item-next, .carousel-item-prev", + INDICATORS: ".carousel-indicators", + DATA_SLIDE: "[data-slide], [data-slide-to]", + DATA_RIDE: '[data-ride="carousel"]' + }, + _ = function() { + function l(e, i) { + n(this, l), this._items = null, this._interval = null, this._activeElement = null, this._isPaused = !1, this._isSliding = !1, this.touchTimeout = null, this._config = this._getConfig(i), this._element = t(e)[0], this._indicatorsElement = t(this._element).find(p.INDICATORS)[0], this._addEventListeners() + } + return l.prototype.next = function() { + this._isSliding || this._slide(u.NEXT) + }, l.prototype.nextWhenVisible = function() { + document.hidden || this.next() + }, l.prototype.prev = function() { + this._isSliding || this._slide(u.PREV) + }, l.prototype.pause = function(e) { + e || (this._isPaused = !0), t(this._element).find(p.NEXT_PREV)[0] && r.supportsTransitionEnd() && (r.triggerTransitionEnd(this._element), this.cycle(!0)), clearInterval(this._interval), this._interval = null + }, l.prototype.cycle = function(t) { + t || (this._isPaused = !1), this._interval && (clearInterval(this._interval), this._interval = null), this._config.interval && !this._isPaused && (this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval)) + }, l.prototype.to = function(e) { + var n = this; + this._activeElement = t(this._element).find(p.ACTIVE_ITEM)[0]; + var i = this._getItemIndex(this._activeElement); + if (!(e > this._items.length - 1 || e < 0)) + if (this._isSliding) t(this._element).one(d.SLID, function() { + return n.to(e) + }); + else { + if (i === e) return this.pause(), void this.cycle(); + var o = e > i ? u.NEXT : u.PREV; + this._slide(o, this._items[e]) + } + }, l.prototype.dispose = function() { + t(this._element).off(a), t.removeData(this._element, s), this._items = null, this._config = null, this._element = null, this._interval = null, this._isPaused = null, this._isSliding = null, this._activeElement = null, this._indicatorsElement = null + }, l.prototype._getConfig = function(n) { + return n = t.extend({}, h, n), r.typeCheckConfig(e, n, c), n + }, l.prototype._addEventListeners = function() { + var e = this; + this._config.keyboard && t(this._element).on(d.KEYDOWN, function(t) { + return e._keydown(t) + }), "hover" === this._config.pause && (t(this._element).on(d.MOUSEENTER, function(t) { + return e.pause(t) + }).on(d.MOUSELEAVE, function(t) { + return e.cycle(t) + }), "ontouchstart" in document.documentElement && t(this._element).on(d.TOUCHEND, function() { + e.pause(), e.touchTimeout && clearTimeout(e.touchTimeout), e.touchTimeout = setTimeout(function(t) { + return e.cycle(t) + }, 500 + e._config.interval) + })) + }, l.prototype._keydown = function(t) { + if (!/input|textarea/i.test(t.target.tagName)) switch (t.which) { + case 37: + t.preventDefault(), this.prev(); + break; + case 39: + t.preventDefault(), this.next(); + break; + default: + return + } + }, l.prototype._getItemIndex = function(e) { + return this._items = t.makeArray(t(e).parent().find(p.ITEM)), this._items.indexOf(e) + }, l.prototype._getItemByDirection = function(t, e) { + var n = t === u.NEXT, + i = t === u.PREV, + o = this._getItemIndex(e), + r = this._items.length - 1; + if ((i && 0 === o || n && o === r) && !this._config.wrap) return e; + var s = (o + (t === u.PREV ? -1 : 1)) % this._items.length; + return -1 === s ? this._items[this._items.length - 1] : this._items[s] + }, l.prototype._triggerSlideEvent = function(e, n) { + var i = this._getItemIndex(e), + o = this._getItemIndex(t(this._element).find(p.ACTIVE_ITEM)[0]), + r = t.Event(d.SLIDE, { + relatedTarget: e, + direction: n, + from: o, + to: i + }); + return t(this._element).trigger(r), r + }, l.prototype._setActiveIndicatorElement = function(e) { + if (this._indicatorsElement) { + t(this._indicatorsElement).find(p.ACTIVE).removeClass(f.ACTIVE); + var n = this._indicatorsElement.children[this._getItemIndex(e)]; + n && t(n).addClass(f.ACTIVE) + } + }, l.prototype._slide = function(e, n) { + var i = this, + o = t(this._element).find(p.ACTIVE_ITEM)[0], + s = this._getItemIndex(o), + a = n || o && this._getItemByDirection(e, o), + l = this._getItemIndex(a), + h = Boolean(this._interval), + c = void 0, + _ = void 0, + g = void 0; + if (e === u.NEXT ? (c = f.LEFT, _ = f.NEXT, g = u.LEFT) : (c = f.RIGHT, _ = f.PREV, g = u.RIGHT), a && t(a).hasClass(f.ACTIVE)) this._isSliding = !1; + else if (!this._triggerSlideEvent(a, g).isDefaultPrevented() && o && a) { + this._isSliding = !0, h && this.pause(), this._setActiveIndicatorElement(a); + var m = t.Event(d.SLID, { + relatedTarget: a, + direction: g, + from: s, + to: l + }); + r.supportsTransitionEnd() && t(this._element).hasClass(f.SLIDE) ? (t(a).addClass(_), r.reflow(a), t(o).addClass(c), t(a).addClass(c), t(o).one(r.TRANSITION_END, function() { + t(a).removeClass(c + " " + _).addClass(f.ACTIVE), t(o).removeClass(f.ACTIVE + " " + _ + " " + c), i._isSliding = !1, setTimeout(function() { + return t(i._element).trigger(m) + }, 0) + }).emulateTransitionEnd(600)) : (t(o).removeClass(f.ACTIVE), t(a).addClass(f.ACTIVE), this._isSliding = !1, t(this._element).trigger(m)), h && this.cycle() + } + }, l._jQueryInterface = function(e) { + return this.each(function() { + var n = t(this).data(s), + o = t.extend({}, h, t(this).data()); + "object" === (void 0 === e ? "undefined" : i(e)) && t.extend(o, e); + var r = "string" == typeof e ? e : o.slide; + if (n || (n = new l(this, o), t(this).data(s, n)), "number" == typeof e) n.to(e); + else if ("string" == typeof r) { + if (void 0 === n[r]) throw new Error('No method named "' + r + '"'); + n[r]() + } else o.interval && (n.pause(), n.cycle()) + }) + }, l._dataApiClickHandler = function(e) { + var n = r.getSelectorFromElement(this); + if (n) { + var i = t(n)[0]; + if (i && t(i).hasClass(f.CAROUSEL)) { + var o = t.extend({}, t(i).data(), t(this).data()), + a = this.getAttribute("data-slide-to"); + a && (o.interval = !1), l._jQueryInterface.call(t(i), o), a && t(i).data(s).to(a), e.preventDefault() + } + } + }, o(l, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return h + } + }]), l + }(); + t(document).on(d.CLICK_DATA_API, p.DATA_SLIDE, _._dataApiClickHandler), t(window).on(d.LOAD_DATA_API, function() { + t(p.DATA_RIDE).each(function() { + var e = t(this); + _._jQueryInterface.call(e, e.data()) + }) + }), t.fn[e] = _._jQueryInterface, t.fn[e].Constructor = _, t.fn[e].noConflict = function() { + return t.fn[e] = l, _._jQueryInterface + } + }(jQuery), function(t) { + var e = "collapse", + s = "bs.collapse", + a = t.fn[e], + l = { + toggle: !0, + parent: "" + }, + h = { + toggle: "boolean", + parent: "string" + }, + c = { + SHOW: "show.bs.collapse", + SHOWN: "shown.bs.collapse", + HIDE: "hide.bs.collapse", + HIDDEN: "hidden.bs.collapse", + CLICK_DATA_API: "click.bs.collapse.data-api" + }, + u = { + SHOW: "show", + COLLAPSE: "collapse", + COLLAPSING: "collapsing", + COLLAPSED: "collapsed" + }, + d = { + WIDTH: "width", + HEIGHT: "height" + }, + f = { + ACTIVES: ".show, .collapsing", + DATA_TOGGLE: '[data-toggle="collapse"]' + }, + p = function() { + function a(e, i) { + n(this, a), this._isTransitioning = !1, this._element = e, this._config = this._getConfig(i), this._triggerArray = t.makeArray(t('[data-toggle="collapse"][href="#' + e.id + '"],[data-toggle="collapse"][data-target="#' + e.id + '"]')); + for (var o = t(f.DATA_TOGGLE), s = 0; s < o.length; s++) { + var l = o[s], + h = r.getSelectorFromElement(l); + null !== h && t(h).filter(e).length > 0 && this._triggerArray.push(l) + } + this._parent = this._config.parent ? this._getParent() : null, this._config.parent || this._addAriaAndCollapsedClass(this._element, this._triggerArray), this._config.toggle && this.toggle() + } + return a.prototype.toggle = function() { + t(this._element).hasClass(u.SHOW) ? this.hide() : this.show() + }, a.prototype.show = function() { + var e = this; + if (!this._isTransitioning && !t(this._element).hasClass(u.SHOW)) { + var n = void 0, + i = void 0; + if (this._parent && ((n = t.makeArray(t(this._parent).children().children(f.ACTIVES))).length || (n = null)), !(n && (i = t(n).data(s)) && i._isTransitioning)) { + var o = t.Event(c.SHOW); + if (t(this._element).trigger(o), !o.isDefaultPrevented()) { + n && (a._jQueryInterface.call(t(n), "hide"), i || t(n).data(s, null)); + var l = this._getDimension(); + t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING), this._element.style[l] = 0, this._triggerArray.length && t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded", !0), this.setTransitioning(!0); + var h = function() { + t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW), e._element.style[l] = "", e.setTransitioning(!1), t(e._element).trigger(c.SHOWN) + }; + if (r.supportsTransitionEnd()) { + var d = "scroll" + (l[0].toUpperCase() + l.slice(1)); + t(this._element).one(r.TRANSITION_END, h).emulateTransitionEnd(600), this._element.style[l] = this._element[d] + "px" + } else h() + } + } + } + }, a.prototype.hide = function() { + var e = this; + if (!this._isTransitioning && t(this._element).hasClass(u.SHOW)) { + var n = t.Event(c.HIDE); + if (t(this._element).trigger(n), !n.isDefaultPrevented()) { + var i = this._getDimension(); + if (this._element.style[i] = this._element.getBoundingClientRect()[i] + "px", r.reflow(this._element), t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW), this._triggerArray.length) + for (var o = 0; o < this._triggerArray.length; o++) { + var s = this._triggerArray[o], + a = r.getSelectorFromElement(s); + null !== a && (t(a).hasClass(u.SHOW) || t(s).addClass(u.COLLAPSED).attr("aria-expanded", !1)) + } + this.setTransitioning(!0); + var l = function() { + e.setTransitioning(!1), t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).trigger(c.HIDDEN) + }; + this._element.style[i] = "", r.supportsTransitionEnd() ? t(this._element).one(r.TRANSITION_END, l).emulateTransitionEnd(600) : l() + } + } + }, a.prototype.setTransitioning = function(t) { + this._isTransitioning = t + }, a.prototype.dispose = function() { + t.removeData(this._element, s), this._config = null, this._parent = null, this._element = null, this._triggerArray = null, this._isTransitioning = null + }, a.prototype._getConfig = function(n) { + return n = t.extend({}, l, n), n.toggle = Boolean(n.toggle), r.typeCheckConfig(e, n, h), n + }, a.prototype._getDimension = function() { + return t(this._element).hasClass(d.WIDTH) ? d.WIDTH : d.HEIGHT + }, a.prototype._getParent = function() { + var e = this, + n = t(this._config.parent)[0], + i = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]'; + return t(n).find(i).each(function(t, n) { + e._addAriaAndCollapsedClass(a._getTargetFromElement(n), [n]) + }), n + }, a.prototype._addAriaAndCollapsedClass = function(e, n) { + if (e) { + var i = t(e).hasClass(u.SHOW); + n.length && t(n).toggleClass(u.COLLAPSED, !i).attr("aria-expanded", i) + } + }, a._getTargetFromElement = function(e) { + var n = r.getSelectorFromElement(e); + return n ? t(n)[0] : null + }, a._jQueryInterface = function(e) { + return this.each(function() { + var n = t(this), + o = n.data(s), + r = t.extend({}, l, n.data(), "object" === (void 0 === e ? "undefined" : i(e)) && e); + if (!o && r.toggle && /show|hide/.test(e) && (r.toggle = !1), o || (o = new a(this, r), n.data(s, o)), "string" == typeof e) { + if (void 0 === o[e]) throw new Error('No method named "' + e + '"'); + o[e]() + } + }) + }, o(a, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return l + } + }]), a + }(); + t(document).on(c.CLICK_DATA_API, f.DATA_TOGGLE, function(e) { + /input|textarea/i.test(e.target.tagName) || e.preventDefault(); + var n = t(this), + i = r.getSelectorFromElement(this); + t(i).each(function() { + var e = t(this), + i = e.data(s) ? "toggle" : n.data(); + p._jQueryInterface.call(e, i) + }) + }), t.fn[e] = p._jQueryInterface, t.fn[e].Constructor = p, t.fn[e].noConflict = function() { + return t.fn[e] = a, p._jQueryInterface + } + }(jQuery), function(t) { + if ("undefined" == typeof Popper) throw new Error("Bootstrap dropdown require Popper.js (https://popper.js.org)"); + var e = "dropdown", + s = "bs.dropdown", + a = "." + s, + l = t.fn[e], + h = new RegExp("38|40|27"), + c = { + HIDE: "hide" + a, + HIDDEN: "hidden" + a, + SHOW: "show" + a, + SHOWN: "shown" + a, + CLICK: "click" + a, + CLICK_DATA_API: "click.bs.dropdown.data-api", + KEYDOWN_DATA_API: "keydown.bs.dropdown.data-api", + KEYUP_DATA_API: "keyup.bs.dropdown.data-api" + }, + u = { + DISABLED: "disabled", + SHOW: "show", + DROPUP: "dropup", + MENURIGHT: "dropdown-menu-right", + MENULEFT: "dropdown-menu-left" + }, + d = { + DATA_TOGGLE: '[data-toggle="dropdown"]', + FORM_CHILD: ".dropdown form", + MENU: ".dropdown-menu", + NAVBAR_NAV: ".navbar-nav", + VISIBLE_ITEMS: ".dropdown-menu .dropdown-item:not(.disabled)" + }, + f = { + TOP: "top-start", + TOPEND: "top-end", + BOTTOM: "bottom-start", + BOTTOMEND: "bottom-end" + }, + p = { + placement: f.BOTTOM, + offset: 0, + flip: !0 + }, + _ = { + placement: "string", + offset: "(number|string)", + flip: "boolean" + }, + g = function() { + function l(t, e) { + n(this, l), this._element = t, this._popper = null, this._config = this._getConfig(e), this._menu = this._getMenuElement(), this._inNavbar = this._detectNavbar(), this._addEventListeners() + } + return l.prototype.toggle = function() { + if (!this._element.disabled && !t(this._element).hasClass(u.DISABLED)) { + var e = l._getParentFromElement(this._element), + n = t(this._menu).hasClass(u.SHOW); + if (l._clearMenus(), !n) { + var i = { + relatedTarget: this._element + }, + o = t.Event(c.SHOW, i); + if (t(e).trigger(o), !o.isDefaultPrevented()) { + var r = this._element; + t(e).hasClass(u.DROPUP) && (t(this._menu).hasClass(u.MENULEFT) || t(this._menu).hasClass(u.MENURIGHT)) && (r = e), this._popper = new Popper(r, this._menu, this._getPopperConfig()), "ontouchstart" in document.documentElement && !t(e).closest(d.NAVBAR_NAV).length && t("body").children().on("mouseover", null, t.noop), this._element.focus(), this._element.setAttribute("aria-expanded", !0), t(this._menu).toggleClass(u.SHOW), t(e).toggleClass(u.SHOW).trigger(t.Event(c.SHOWN, i)) + } + } + } + }, l.prototype.dispose = function() { + t.removeData(this._element, s), t(this._element).off(a), this._element = null, this._menu = null, null !== this._popper && this._popper.destroy(), this._popper = null + }, l.prototype.update = function() { + this._inNavbar = this._detectNavbar(), null !== this._popper && this._popper.scheduleUpdate() + }, l.prototype._addEventListeners = function() { + var e = this; + t(this._element).on(c.CLICK, function(t) { + t.preventDefault(), t.stopPropagation(), e.toggle() + }) + }, l.prototype._getConfig = function(n) { + var i = t(this._element).data(); + return void 0 !== i.placement && (i.placement = f[i.placement.toUpperCase()]), n = t.extend({}, this.constructor.Default, t(this._element).data(), n), r.typeCheckConfig(e, n, this.constructor.DefaultType), n + }, l.prototype._getMenuElement = function() { + if (!this._menu) { + var e = l._getParentFromElement(this._element); + this._menu = t(e).find(d.MENU)[0] + } + return this._menu + }, l.prototype._getPlacement = function() { + var e = t(this._element).parent(), + n = this._config.placement; + return e.hasClass(u.DROPUP) || this._config.placement === f.TOP ? (n = f.TOP, t(this._menu).hasClass(u.MENURIGHT) && (n = f.TOPEND)) : t(this._menu).hasClass(u.MENURIGHT) && (n = f.BOTTOMEND), n + }, l.prototype._detectNavbar = function() { + return t(this._element).closest(".navbar").length > 0 + }, l.prototype._getPopperConfig = function() { + var t = { + placement: this._getPlacement(), + modifiers: { + offset: { + offset: this._config.offset + }, + flip: { + enabled: this._config.flip + } + } + }; + return this._inNavbar && (t.modifiers.applyStyle = { + enabled: !this._inNavbar + }), t + }, l._jQueryInterface = function(e) { + return this.each(function() { + var n = t(this).data(s), + o = "object" === (void 0 === e ? "undefined" : i(e)) ? e : null; + if (n || (n = new l(this, o), t(this).data(s, n)), "string" == typeof e) { + if (void 0 === n[e]) throw new Error('No method named "' + e + '"'); + n[e]() + } + }) + }, l._clearMenus = function(e) { + if (!e || 3 !== e.which && ("keyup" !== e.type || 9 === e.which)) + for (var n = t.makeArray(t(d.DATA_TOGGLE)), i = 0; i < n.length; i++) { + var o = l._getParentFromElement(n[i]), + r = t(n[i]).data(s), + a = { + relatedTarget: n[i] + }; + if (r) { + var h = r._menu; + if (t(o).hasClass(u.SHOW) && !(e && ("click" === e.type && /input|textarea/i.test(e.target.tagName) || "keyup" === e.type && 9 === e.which) && t.contains(o, e.target))) { + var f = t.Event(c.HIDE, a); + t(o).trigger(f), f.isDefaultPrevented() || ("ontouchstart" in document.documentElement && t("body").children().off("mouseover", null, t.noop), n[i].setAttribute("aria-expanded", "false"), t(h).removeClass(u.SHOW), t(o).removeClass(u.SHOW).trigger(t.Event(c.HIDDEN, a))) + } + } + } + }, l._getParentFromElement = function(e) { + var n = void 0, + i = r.getSelectorFromElement(e); + return i && (n = t(i)[0]), n || e.parentNode + }, l._dataApiKeydownHandler = function(e) { + if (!(!h.test(e.which) || /button/i.test(e.target.tagName) && 32 === e.which || /input|textarea/i.test(e.target.tagName) || (e.preventDefault(), e.stopPropagation(), this.disabled || t(this).hasClass(u.DISABLED)))) { + var n = l._getParentFromElement(this), + i = t(n).hasClass(u.SHOW); + if ((i || 27 === e.which && 32 === e.which) && (!i || 27 !== e.which && 32 !== e.which)) { + var o = t(n).find(d.VISIBLE_ITEMS).get(); + if (o.length) { + var r = o.indexOf(e.target); + 38 === e.which && r > 0 && r--, 40 === e.which && r < o.length - 1 && r++, r < 0 && (r = 0), o[r].focus() + } + } else { + if (27 === e.which) { + var s = t(n).find(d.DATA_TOGGLE)[0]; + t(s).trigger("focus") + } + t(this).trigger("click") + } + } + }, o(l, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return p + } + }, { + key: "DefaultType", + get: function() { + return _ + } + }]), l + }(); + t(document).on(c.KEYDOWN_DATA_API, d.DATA_TOGGLE, g._dataApiKeydownHandler).on(c.KEYDOWN_DATA_API, d.MENU, g._dataApiKeydownHandler).on(c.CLICK_DATA_API + " " + c.KEYUP_DATA_API, g._clearMenus).on(c.CLICK_DATA_API, d.DATA_TOGGLE, function(e) { + e.preventDefault(), e.stopPropagation(), g._jQueryInterface.call(t(this), "toggle") + }).on(c.CLICK_DATA_API, d.FORM_CHILD, function(t) { + t.stopPropagation() + }), t.fn[e] = g._jQueryInterface, t.fn[e].Constructor = g, t.fn[e].noConflict = function() { + return t.fn[e] = l, g._jQueryInterface + } + }(jQuery), function(t) { + var e = "modal", + s = ".bs.modal", + a = t.fn[e], + l = { + backdrop: !0, + keyboard: !0, + focus: !0, + show: !0 + }, + h = { + backdrop: "(boolean|string)", + keyboard: "boolean", + focus: "boolean", + show: "boolean" + }, + c = { + HIDE: "hide.bs.modal", + HIDDEN: "hidden.bs.modal", + SHOW: "show.bs.modal", + SHOWN: "shown.bs.modal", + FOCUSIN: "focusin.bs.modal", + RESIZE: "resize.bs.modal", + CLICK_DISMISS: "click.dismiss.bs.modal", + KEYDOWN_DISMISS: "keydown.dismiss.bs.modal", + MOUSEUP_DISMISS: "mouseup.dismiss.bs.modal", + MOUSEDOWN_DISMISS: "mousedown.dismiss.bs.modal", + CLICK_DATA_API: "click.bs.modal.data-api" + }, + u = { + SCROLLBAR_MEASURER: "modal-scrollbar-measure", + BACKDROP: "modal-backdrop", + OPEN: "modal-open", + FADE: "fade", + SHOW: "show" + }, + d = { + DIALOG: ".modal-dialog", + DATA_TOGGLE: '[data-toggle="modal"]', + DATA_DISMISS: '[data-dismiss="modal"]', + FIXED_CONTENT: ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", + NAVBAR_TOGGLER: ".navbar-toggler" + }, + f = function() { + function a(e, i) { + n(this, a), this._config = this._getConfig(i), this._element = e, this._dialog = t(e).find(d.DIALOG)[0], this._backdrop = null, this._isShown = !1, this._isBodyOverflowing = !1, this._ignoreBackdropClick = !1, this._originalBodyPadding = 0, this._scrollbarWidth = 0 + } + return a.prototype.toggle = function(t) { + return this._isShown ? this.hide() : this.show(t) + }, a.prototype.show = function(e) { + var n = this; + if (!this._isTransitioning) { + r.supportsTransitionEnd() && t(this._element).hasClass(u.FADE) && (this._isTransitioning = !0); + var i = t.Event(c.SHOW, { + relatedTarget: e + }); + t(this._element).trigger(i), this._isShown || i.isDefaultPrevented() || (this._isShown = !0, this._checkScrollbar(), this._setScrollbar(), t(document.body).addClass(u.OPEN), this._setEscapeEvent(), this._setResizeEvent(), t(this._element).on(c.CLICK_DISMISS, d.DATA_DISMISS, function(t) { + return n.hide(t) + }), t(this._dialog).on(c.MOUSEDOWN_DISMISS, function() { + t(n._element).one(c.MOUSEUP_DISMISS, function(e) { + t(e.target).is(n._element) && (n._ignoreBackdropClick = !0) + }) + }), this._showBackdrop(function() { + return n._showElement(e) + })) + } + }, a.prototype.hide = function(e) { + var n = this; + if (e && e.preventDefault(), !this._isTransitioning && this._isShown) { + var i = r.supportsTransitionEnd() && t(this._element).hasClass(u.FADE); + i && (this._isTransitioning = !0); + var o = t.Event(c.HIDE); + t(this._element).trigger(o), this._isShown && !o.isDefaultPrevented() && (this._isShown = !1, this._setEscapeEvent(), this._setResizeEvent(), t(document).off(c.FOCUSIN), t(this._element).removeClass(u.SHOW), t(this._element).off(c.CLICK_DISMISS), t(this._dialog).off(c.MOUSEDOWN_DISMISS), i ? t(this._element).one(r.TRANSITION_END, function(t) { + return n._hideModal(t) + }).emulateTransitionEnd(300) : this._hideModal()) + } + }, a.prototype.dispose = function() { + t.removeData(this._element, "bs.modal"), t(window, document, this._element, this._backdrop).off(s), this._config = null, this._element = null, this._dialog = null, this._backdrop = null, this._isShown = null, this._isBodyOverflowing = null, this._ignoreBackdropClick = null, this._scrollbarWidth = null + }, a.prototype.handleUpdate = function() { + this._adjustDialog() + }, a.prototype._getConfig = function(n) { + return n = t.extend({}, l, n), r.typeCheckConfig(e, n, h), n + }, a.prototype._showElement = function(e) { + var n = this, + i = r.supportsTransitionEnd() && t(this._element).hasClass(u.FADE); + this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE || document.body.appendChild(this._element), this._element.style.display = "block", this._element.removeAttribute("aria-hidden"), this._element.scrollTop = 0, i && r.reflow(this._element), t(this._element).addClass(u.SHOW), this._config.focus && this._enforceFocus(); + var o = t.Event(c.SHOWN, { + relatedTarget: e + }), + s = function() { + n._config.focus && n._element.focus(), n._isTransitioning = !1, t(n._element).trigger(o) + }; + i ? t(this._dialog).one(r.TRANSITION_END, s).emulateTransitionEnd(300) : s() + }, a.prototype._enforceFocus = function() { + var e = this; + t(document).off(c.FOCUSIN).on(c.FOCUSIN, function(n) { + document === n.target || e._element === n.target || t(e._element).has(n.target).length || e._element.focus() + }) + }, a.prototype._setEscapeEvent = function() { + var e = this; + this._isShown && this._config.keyboard ? t(this._element).on(c.KEYDOWN_DISMISS, function(t) { + 27 === t.which && (t.preventDefault(), e.hide()) + }) : this._isShown || t(this._element).off(c.KEYDOWN_DISMISS) + }, a.prototype._setResizeEvent = function() { + var e = this; + this._isShown ? t(window).on(c.RESIZE, function(t) { + return e.handleUpdate(t) + }) : t(window).off(c.RESIZE) + }, a.prototype._hideModal = function() { + var e = this; + this._element.style.display = "none", this._element.setAttribute("aria-hidden", !0), this._isTransitioning = !1, this._showBackdrop(function() { + t(document.body).removeClass(u.OPEN), e._resetAdjustments(), e._resetScrollbar(), t(e._element).trigger(c.HIDDEN) + }) + }, a.prototype._removeBackdrop = function() { + this._backdrop && (t(this._backdrop).remove(), this._backdrop = null) + }, a.prototype._showBackdrop = function(e) { + var n = this, + i = t(this._element).hasClass(u.FADE) ? u.FADE : ""; + if (this._isShown && this._config.backdrop) { + var o = r.supportsTransitionEnd() && i; + if (this._backdrop = document.createElement("div"), this._backdrop.className = u.BACKDROP, i && t(this._backdrop).addClass(i), t(this._backdrop).appendTo(document.body), t(this._element).on(c.CLICK_DISMISS, function(t) { + n._ignoreBackdropClick ? n._ignoreBackdropClick = !1 : t.target === t.currentTarget && ("static" === n._config.backdrop ? n._element.focus() : n.hide()) + }), o && r.reflow(this._backdrop), t(this._backdrop).addClass(u.SHOW), !e) return; + if (!o) return void e(); + t(this._backdrop).one(r.TRANSITION_END, e).emulateTransitionEnd(150) + } else if (!this._isShown && this._backdrop) { + t(this._backdrop).removeClass(u.SHOW); + var s = function() { + n._removeBackdrop(), e && e() + }; + r.supportsTransitionEnd() && t(this._element).hasClass(u.FADE) ? t(this._backdrop).one(r.TRANSITION_END, s).emulateTransitionEnd(150) : s() + } else e && e() + }, a.prototype._adjustDialog = function() { + var t = this._element.scrollHeight > document.documentElement.clientHeight; + !this._isBodyOverflowing && t && (this._element.style.paddingLeft = this._scrollbarWidth + "px"), this._isBodyOverflowing && !t && (this._element.style.paddingRight = this._scrollbarWidth + "px") + }, a.prototype._resetAdjustments = function() { + this._element.style.paddingLeft = "", this._element.style.paddingRight = "" + }, a.prototype._checkScrollbar = function() { + this._isBodyOverflowing = document.body.clientWidth < window.innerWidth, this._scrollbarWidth = this._getScrollbarWidth() + }, a.prototype._setScrollbar = function() { + var e = this; + if (this._isBodyOverflowing) { + t(d.FIXED_CONTENT).each(function(n, i) { + var o = t(i)[0].style.paddingRight, + r = t(i).css("padding-right"); + t(i).data("padding-right", o).css("padding-right", parseFloat(r) + e._scrollbarWidth + "px") + }), t(d.NAVBAR_TOGGLER).each(function(n, i) { + var o = t(i)[0].style.marginRight, + r = t(i).css("margin-right"); + t(i).data("margin-right", o).css("margin-right", parseFloat(r) + e._scrollbarWidth + "px") + }); + var n = document.body.style.paddingRight, + i = t("body").css("padding-right"); + t("body").data("padding-right", n).css("padding-right", parseFloat(i) + this._scrollbarWidth + "px") + } + }, a.prototype._resetScrollbar = function() { + t(d.FIXED_CONTENT).each(function(e, n) { + var i = t(n).data("padding-right"); + void 0 !== i && t(n).css("padding-right", i).removeData("padding-right") + }), t(d.NAVBAR_TOGGLER).each(function(e, n) { + var i = t(n).data("margin-right"); + void 0 !== i && t(n).css("margin-right", i).removeData("margin-right") + }); + var e = t("body").data("padding-right"); + void 0 !== e && t("body").css("padding-right", e).removeData("padding-right") + }, a.prototype._getScrollbarWidth = function() { + var t = document.createElement("div"); + t.className = u.SCROLLBAR_MEASURER, document.body.appendChild(t); + var e = t.getBoundingClientRect().width - t.clientWidth; + return document.body.removeChild(t), e + }, a._jQueryInterface = function(e, n) { + return this.each(function() { + var o = t(this).data("bs.modal"), + r = t.extend({}, a.Default, t(this).data(), "object" === (void 0 === e ? "undefined" : i(e)) && e); + if (o || (o = new a(this, r), t(this).data("bs.modal", o)), "string" == typeof e) { + if (void 0 === o[e]) throw new Error('No method named "' + e + '"'); + o[e](n) + } else r.show && o.show(n) + }) + }, o(a, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return l + } + }]), a + }(); + t(document).on(c.CLICK_DATA_API, d.DATA_TOGGLE, function(e) { + var n = this, + i = void 0, + o = r.getSelectorFromElement(this); + o && (i = t(o)[0]); + var s = t(i).data("bs.modal") ? "toggle" : t.extend({}, t(i).data(), t(this).data()); + "A" !== this.tagName && "AREA" !== this.tagName || e.preventDefault(); + var a = t(i).one(c.SHOW, function(e) { + e.isDefaultPrevented() || a.one(c.HIDDEN, function() { + t(n).is(":visible") && n.focus() + }) + }); + f._jQueryInterface.call(t(i), s, this) + }), t.fn[e] = f._jQueryInterface, t.fn[e].Constructor = f, t.fn[e].noConflict = function() { + return t.fn[e] = a, f._jQueryInterface + } + }(jQuery), function(t) { + var e = "scrollspy", + s = t.fn[e], + a = { + offset: 10, + method: "auto", + target: "" + }, + l = { + offset: "number", + method: "string", + target: "(string|element)" + }, + h = { + ACTIVATE: "activate.bs.scrollspy", + SCROLL: "scroll.bs.scrollspy", + LOAD_DATA_API: "load.bs.scrollspy.data-api" + }, + c = { + DROPDOWN_ITEM: "dropdown-item", + DROPDOWN_MENU: "dropdown-menu", + ACTIVE: "active" + }, + u = { + DATA_SPY: '[data-spy="scroll"]', + ACTIVE: ".active", + NAV_LIST_GROUP: ".nav, .list-group", + NAV_LINKS: ".nav-link", + LIST_ITEMS: ".list-group-item", + DROPDOWN: ".dropdown", + DROPDOWN_ITEMS: ".dropdown-item", + DROPDOWN_TOGGLE: ".dropdown-toggle" + }, + d = { + OFFSET: "offset", + POSITION: "position" + }, + f = function() { + function s(e, i) { + var o = this; + n(this, s), this._element = e, this._scrollElement = "BODY" === e.tagName ? window : e, this._config = this._getConfig(i), this._selector = this._config.target + " " + u.NAV_LINKS + "," + this._config.target + " " + u.LIST_ITEMS + "," + this._config.target + " " + u.DROPDOWN_ITEMS, this._offsets = [], this._targets = [], this._activeTarget = null, this._scrollHeight = 0, t(this._scrollElement).on(h.SCROLL, function(t) { + return o._process(t) + }), this.refresh(), this._process() + } + return s.prototype.refresh = function() { + var e = this, + n = this._scrollElement !== this._scrollElement.window ? d.POSITION : d.OFFSET, + i = "auto" === this._config.method ? n : this._config.method, + o = i === d.POSITION ? this._getScrollTop() : 0; + this._offsets = [], this._targets = [], this._scrollHeight = this._getScrollHeight(), t.makeArray(t(this._selector)).map(function(e) { + var n = void 0, + s = r.getSelectorFromElement(e); + if (s && (n = t(s)[0]), n) { + var a = n.getBoundingClientRect(); + if (a.width || a.height) return [t(n)[i]().top + o, s] + } + return null + }).filter(function(t) { + return t + }).sort(function(t, e) { + return t[0] - e[0] + }).forEach(function(t) { + e._offsets.push(t[0]), e._targets.push(t[1]) + }) + }, s.prototype.dispose = function() { + t.removeData(this._element, "bs.scrollspy"), t(this._scrollElement).off(".bs.scrollspy"), this._element = null, this._scrollElement = null, this._config = null, this._selector = null, this._offsets = null, this._targets = null, this._activeTarget = null, this._scrollHeight = null + }, s.prototype._getConfig = function(n) { + if ("string" != typeof(n = t.extend({}, a, n)).target) { + var i = t(n.target).attr("id"); + i || (i = r.getUID(e), t(n.target).attr("id", i)), n.target = "#" + i + } + return r.typeCheckConfig(e, n, l), n + }, s.prototype._getScrollTop = function() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop + }, s.prototype._getScrollHeight = function() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) + }, s.prototype._getOffsetHeight = function() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height + }, s.prototype._process = function() { + var t = this._getScrollTop() + this._config.offset, + e = this._getScrollHeight(), + n = this._config.offset + e - this._getOffsetHeight(); + if (this._scrollHeight !== e && this.refresh(), t >= n) { + var i = this._targets[this._targets.length - 1]; + this._activeTarget !== i && this._activate(i) + } else { + if (this._activeTarget && t < this._offsets[0] && this._offsets[0] > 0) return this._activeTarget = null, void this._clear(); + for (var o = this._offsets.length; o--;) this._activeTarget !== this._targets[o] && t >= this._offsets[o] && (void 0 === this._offsets[o + 1] || t < this._offsets[o + 1]) && this._activate(this._targets[o]) + } + }, s.prototype._activate = function(e) { + this._activeTarget = e, this._clear(); + var n = this._selector.split(","); + n = n.map(function(t) { + return t + '[data-target="' + e + '"],' + t + '[href="' + e + '"]' + }); + var i = t(n.join(",")); + i.hasClass(c.DROPDOWN_ITEM) ? (i.closest(u.DROPDOWN).find(u.DROPDOWN_TOGGLE).addClass(c.ACTIVE), i.addClass(c.ACTIVE)) : (i.addClass(c.ACTIVE), i.parents(u.NAV_LIST_GROUP).prev(u.NAV_LINKS + ", " + u.LIST_ITEMS).addClass(c.ACTIVE)), t(this._scrollElement).trigger(h.ACTIVATE, { + relatedTarget: e + }) + }, s.prototype._clear = function() { + t(this._selector).filter(u.ACTIVE).removeClass(c.ACTIVE) + }, s._jQueryInterface = function(e) { + return this.each(function() { + var n = t(this).data("bs.scrollspy"), + o = "object" === (void 0 === e ? "undefined" : i(e)) && e; + if (n || (n = new s(this, o), t(this).data("bs.scrollspy", n)), "string" == typeof e) { + if (void 0 === n[e]) throw new Error('No method named "' + e + '"'); + n[e]() + } + }) + }, o(s, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return a + } + }]), s + }(); + t(window).on(h.LOAD_DATA_API, function() { + for (var e = t.makeArray(t(u.DATA_SPY)), n = e.length; n--;) { + var i = t(e[n]); + f._jQueryInterface.call(i, i.data()) + } + }), t.fn[e] = f._jQueryInterface, t.fn[e].Constructor = f, t.fn[e].noConflict = function() { + return t.fn[e] = s, f._jQueryInterface + } + }(jQuery), function(t) { + var e = t.fn.tab, + i = { + HIDE: "hide.bs.tab", + HIDDEN: "hidden.bs.tab", + SHOW: "show.bs.tab", + SHOWN: "shown.bs.tab", + CLICK_DATA_API: "click.bs.tab.data-api" + }, + s = { + DROPDOWN_MENU: "dropdown-menu", + ACTIVE: "active", + DISABLED: "disabled", + FADE: "fade", + SHOW: "show" + }, + a = { + DROPDOWN: ".dropdown", + NAV_LIST_GROUP: ".nav, .list-group", + ACTIVE: ".active", + DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]', + DROPDOWN_TOGGLE: ".dropdown-toggle", + DROPDOWN_ACTIVE_CHILD: "> .dropdown-menu .active" + }, + l = function() { + function e(t) { + n(this, e), this._element = t + } + return e.prototype.show = function() { + var e = this; + if (!(this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && t(this._element).hasClass(s.ACTIVE) || t(this._element).hasClass(s.DISABLED))) { + var n = void 0, + o = void 0, + l = t(this._element).closest(a.NAV_LIST_GROUP)[0], + h = r.getSelectorFromElement(this._element); + l && (o = t.makeArray(t(l).find(a.ACTIVE)), o = o[o.length - 1]); + var c = t.Event(i.HIDE, { + relatedTarget: this._element + }), + u = t.Event(i.SHOW, { + relatedTarget: o + }); + if (o && t(o).trigger(c), t(this._element).trigger(u), !u.isDefaultPrevented() && !c.isDefaultPrevented()) { + h && (n = t(h)[0]), this._activate(this._element, l); + var d = function() { + var n = t.Event(i.HIDDEN, { + relatedTarget: e._element + }), + r = t.Event(i.SHOWN, { + relatedTarget: o + }); + t(o).trigger(n), t(e._element).trigger(r) + }; + n ? this._activate(n, n.parentNode, d) : d() + } + } + }, e.prototype.dispose = function() { + t.removeData(this._element, "bs.tab"), this._element = null + }, e.prototype._activate = function(e, n, i) { + var o = this, + l = t(n).find(a.ACTIVE)[0], + h = i && r.supportsTransitionEnd() && l && t(l).hasClass(s.FADE), + c = function() { + return o._transitionComplete(e, l, h, i) + }; + l && h ? t(l).one(r.TRANSITION_END, c).emulateTransitionEnd(150) : c(), l && t(l).removeClass(s.SHOW) + }, e.prototype._transitionComplete = function(e, n, i, o) { + if (n) { + t(n).removeClass(s.ACTIVE); + var l = t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0]; + l && t(l).removeClass(s.ACTIVE), n.setAttribute("aria-expanded", !1) + } + if (t(e).addClass(s.ACTIVE), e.setAttribute("aria-expanded", !0), i ? (r.reflow(e), t(e).addClass(s.SHOW)) : t(e).removeClass(s.FADE), e.parentNode && t(e.parentNode).hasClass(s.DROPDOWN_MENU)) { + var h = t(e).closest(a.DROPDOWN)[0]; + h && t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE), e.setAttribute("aria-expanded", !0) + } + o && o() + }, e._jQueryInterface = function(n) { + return this.each(function() { + var i = t(this), + o = i.data("bs.tab"); + if (o || (o = new e(this), i.data("bs.tab", o)), "string" == typeof n) { + if (void 0 === o[n]) throw new Error('No method named "' + n + '"'); + o[n]() + } + }) + }, o(e, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }]), e + }(); + t(document).on(i.CLICK_DATA_API, a.DATA_TOGGLE, function(e) { + e.preventDefault(), l._jQueryInterface.call(t(this), "show") + }), t.fn.tab = l._jQueryInterface, t.fn.tab.Constructor = l, t.fn.tab.noConflict = function() { + return t.fn.tab = e, l._jQueryInterface + } + }(jQuery), function(t) { + if ("undefined" == typeof Popper) throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)"); + var e = "tooltip", + s = ".bs.tooltip", + a = t.fn[e], + l = new RegExp("(^|\\s)bs-tooltip\\S+", "g"), + h = { + animation: "boolean", + template: "string", + title: "(string|element|function)", + trigger: "string", + delay: "(number|object)", + html: "boolean", + selector: "(string|boolean)", + placement: "(string|function)", + offset: "(number|string)", + container: "(string|element|boolean)", + fallbackPlacement: "(string|array)" + }, + c = { + AUTO: "auto", + TOP: "top", + RIGHT: "right", + BOTTOM: "bottom", + LEFT: "left" + }, + u = { + animation: !0, + template: '

', + trigger: "hover focus", + title: "", + delay: 0, + html: !1, + selector: !1, + placement: "top", + offset: 0, + container: !1, + fallbackPlacement: "flip" + }, + d = { + SHOW: "show", + OUT: "out" + }, + f = { + HIDE: "hide" + s, + HIDDEN: "hidden" + s, + SHOW: "show" + s, + SHOWN: "shown" + s, + INSERTED: "inserted" + s, + CLICK: "click" + s, + FOCUSIN: "focusin" + s, + FOCUSOUT: "focusout" + s, + MOUSEENTER: "mouseenter" + s, + MOUSELEAVE: "mouseleave" + s + }, + p = { + FADE: "fade", + SHOW: "show" + }, + _ = { + TOOLTIP: ".tooltip", + TOOLTIP_INNER: ".tooltip-inner", + ARROW: ".arrow" + }, + g = { + HOVER: "hover", + FOCUS: "focus", + CLICK: "click", + MANUAL: "manual" + }, + m = function() { + function a(t, e) { + n(this, a), this._isEnabled = !0, this._timeout = 0, this._hoverState = "", this._activeTrigger = {}, this._popper = null, this.element = t, this.config = this._getConfig(e), this.tip = null, this._setListeners() + } + return a.prototype.enable = function() { + this._isEnabled = !0 + }, a.prototype.disable = function() { + this._isEnabled = !1 + }, a.prototype.toggleEnabled = function() { + this._isEnabled = !this._isEnabled + }, a.prototype.toggle = function(e) { + if (e) { + var n = this.constructor.DATA_KEY, + i = t(e.currentTarget).data(n); + i || (i = new this.constructor(e.currentTarget, this._getDelegateConfig()), t(e.currentTarget).data(n, i)), i._activeTrigger.click = !i._activeTrigger.click, i._isWithActiveTrigger() ? i._enter(null, i) : i._leave(null, i) + } else { + if (t(this.getTipElement()).hasClass(p.SHOW)) return void this._leave(null, this); + this._enter(null, this) + } + }, a.prototype.dispose = function() { + clearTimeout(this._timeout), t.removeData(this.element, this.constructor.DATA_KEY), t(this.element).off(this.constructor.EVENT_KEY), t(this.element).closest(".modal").off("hide.bs.modal"), this.tip && t(this.tip).remove(), this._isEnabled = null, this._timeout = null, this._hoverState = null, this._activeTrigger = null, null !== this._popper && this._popper.destroy(), this._popper = null, this.element = null, this.config = null, this.tip = null + }, a.prototype.show = function() { + var e = this; + if ("none" === t(this.element).css("display")) throw new Error("Please use show on visible elements"); + var n = t.Event(this.constructor.Event.SHOW); + if (this.isWithContent() && this._isEnabled) { + t(this.element).trigger(n); + var i = t.contains(this.element.ownerDocument.documentElement, this.element); + if (n.isDefaultPrevented() || !i) return; + var o = this.getTipElement(), + s = r.getUID(this.constructor.NAME); + o.setAttribute("id", s), this.element.setAttribute("aria-describedby", s), this.setContent(), this.config.animation && t(o).addClass(p.FADE); + var l = "function" == typeof this.config.placement ? this.config.placement.call(this, o, this.element) : this.config.placement, + h = this._getAttachment(l); + this.addAttachmentClass(h); + var c = !1 === this.config.container ? document.body : t(this.config.container); + t(o).data(this.constructor.DATA_KEY, this), t.contains(this.element.ownerDocument.documentElement, this.tip) || t(o).appendTo(c), t(this.element).trigger(this.constructor.Event.INSERTED), this._popper = new Popper(this.element, o, { + placement: h, + modifiers: { + offset: { + offset: this.config.offset + }, + flip: { + behavior: this.config.fallbackPlacement + }, + arrow: { + element: _.ARROW + } + }, + onCreate: function(t) { + t.originalPlacement !== t.placement && e._handlePopperPlacementChange(t) + }, + onUpdate: function(t) { + e._handlePopperPlacementChange(t) + } + }), t(o).addClass(p.SHOW), "ontouchstart" in document.documentElement && t("body").children().on("mouseover", null, t.noop); + var u = function() { + e.config.animation && e._fixTransition(); + var n = e._hoverState; + e._hoverState = null, t(e.element).trigger(e.constructor.Event.SHOWN), n === d.OUT && e._leave(null, e) + }; + r.supportsTransitionEnd() && t(this.tip).hasClass(p.FADE) ? t(this.tip).one(r.TRANSITION_END, u).emulateTransitionEnd(a._TRANSITION_DURATION) : u() + } + }, a.prototype.hide = function(e) { + var n = this, + i = this.getTipElement(), + o = t.Event(this.constructor.Event.HIDE), + s = function() { + n._hoverState !== d.SHOW && i.parentNode && i.parentNode.removeChild(i), n._cleanTipClass(), n.element.removeAttribute("aria-describedby"), t(n.element).trigger(n.constructor.Event.HIDDEN), null !== n._popper && n._popper.destroy(), e && e() + }; + t(this.element).trigger(o), o.isDefaultPrevented() || (t(i).removeClass(p.SHOW), "ontouchstart" in document.documentElement && t("body").children().off("mouseover", null, t.noop), this._activeTrigger[g.CLICK] = !1, this._activeTrigger[g.FOCUS] = !1, this._activeTrigger[g.HOVER] = !1, r.supportsTransitionEnd() && t(this.tip).hasClass(p.FADE) ? t(i).one(r.TRANSITION_END, s).emulateTransitionEnd(150) : s(), this._hoverState = "") + }, a.prototype.update = function() { + null !== this._popper && this._popper.scheduleUpdate() + }, a.prototype.isWithContent = function() { + return Boolean(this.getTitle()) + }, a.prototype.addAttachmentClass = function(e) { + t(this.getTipElement()).addClass("bs-tooltip-" + e) + }, a.prototype.getTipElement = function() { + return this.tip = this.tip || t(this.config.template)[0] + }, a.prototype.setContent = function() { + var e = t(this.getTipElement()); + this.setElementContent(e.find(_.TOOLTIP_INNER), this.getTitle()), e.removeClass(p.FADE + " " + p.SHOW) + }, a.prototype.setElementContent = function(e, n) { + var o = this.config.html; + "object" === (void 0 === n ? "undefined" : i(n)) && (n.nodeType || n.jquery) ? o ? t(n).parent().is(e) || e.empty().append(n) : e.text(t(n).text()): e[o ? "html" : "text"](n) + }, a.prototype.getTitle = function() { + var t = this.element.getAttribute("data-original-title"); + return t || (t = "function" == typeof this.config.title ? this.config.title.call(this.element) : this.config.title), t + }, a.prototype._getAttachment = function(t) { + return c[t.toUpperCase()] + }, a.prototype._setListeners = function() { + var e = this; + this.config.trigger.split(" ").forEach(function(n) { + if ("click" === n) t(e.element).on(e.constructor.Event.CLICK, e.config.selector, function(t) { + return e.toggle(t) + }); + else if (n !== g.MANUAL) { + var i = n === g.HOVER ? e.constructor.Event.MOUSEENTER : e.constructor.Event.FOCUSIN, + o = n === g.HOVER ? e.constructor.Event.MOUSELEAVE : e.constructor.Event.FOCUSOUT; + t(e.element).on(i, e.config.selector, function(t) { + return e._enter(t) + }).on(o, e.config.selector, function(t) { + return e._leave(t) + }) + } + t(e.element).closest(".modal").on("hide.bs.modal", function() { + return e.hide() + }) + }), this.config.selector ? this.config = t.extend({}, this.config, { + trigger: "manual", + selector: "" + }) : this._fixTitle() + }, a.prototype._fixTitle = function() { + var t = i(this.element.getAttribute("data-original-title")); + (this.element.getAttribute("title") || "string" !== t) && (this.element.setAttribute("data-original-title", this.element.getAttribute("title") || ""), this.element.setAttribute("title", "")) + }, a.prototype._enter = function(e, n) { + var i = this.constructor.DATA_KEY; + (n = n || t(e.currentTarget).data(i)) || (n = new this.constructor(e.currentTarget, this._getDelegateConfig()), t(e.currentTarget).data(i, n)), e && (n._activeTrigger["focusin" === e.type ? g.FOCUS : g.HOVER] = !0), t(n.getTipElement()).hasClass(p.SHOW) || n._hoverState === d.SHOW ? n._hoverState = d.SHOW : (clearTimeout(n._timeout), n._hoverState = d.SHOW, n.config.delay && n.config.delay.show ? n._timeout = setTimeout(function() { + n._hoverState === d.SHOW && n.show() + }, n.config.delay.show) : n.show()) + }, a.prototype._leave = function(e, n) { + var i = this.constructor.DATA_KEY; + (n = n || t(e.currentTarget).data(i)) || (n = new this.constructor(e.currentTarget, this._getDelegateConfig()), t(e.currentTarget).data(i, n)), e && (n._activeTrigger["focusout" === e.type ? g.FOCUS : g.HOVER] = !1), n._isWithActiveTrigger() || (clearTimeout(n._timeout), n._hoverState = d.OUT, n.config.delay && n.config.delay.hide ? n._timeout = setTimeout(function() { + n._hoverState === d.OUT && n.hide() + }, n.config.delay.hide) : n.hide()) + }, a.prototype._isWithActiveTrigger = function() { + for (var t in this._activeTrigger) + if (this._activeTrigger[t]) return !0; + return !1 + }, a.prototype._getConfig = function(n) { + return (n = t.extend({}, this.constructor.Default, t(this.element).data(), n)).delay && "number" == typeof n.delay && (n.delay = { + show: n.delay, + hide: n.delay + }), n.title && "number" == typeof n.title && (n.title = n.title.toString()), n.content && "number" == typeof n.content && (n.content = n.content.toString()), r.typeCheckConfig(e, n, this.constructor.DefaultType), n + }, a.prototype._getDelegateConfig = function() { + var t = {}; + if (this.config) + for (var e in this.config) this.constructor.Default[e] !== this.config[e] && (t[e] = this.config[e]); + return t + }, a.prototype._cleanTipClass = function() { + var e = t(this.getTipElement()), + n = e.attr("class").match(l); + null !== n && n.length > 0 && e.removeClass(n.join("")) + }, a.prototype._handlePopperPlacementChange = function(t) { + this._cleanTipClass(), this.addAttachmentClass(this._getAttachment(t.placement)) + }, a.prototype._fixTransition = function() { + var e = this.getTipElement(), + n = this.config.animation; + null === e.getAttribute("x-placement") && (t(e).removeClass(p.FADE), this.config.animation = !1, this.hide(), this.show(), this.config.animation = n) + }, a._jQueryInterface = function(e) { + return this.each(function() { + var n = t(this).data("bs.tooltip"), + o = "object" === (void 0 === e ? "undefined" : i(e)) && e; + if ((n || !/dispose|hide/.test(e)) && (n || (n = new a(this, o), t(this).data("bs.tooltip", n)), "string" == typeof e)) { + if (void 0 === n[e]) throw new Error('No method named "' + e + '"'); + n[e]() + } + }) + }, o(a, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return u + } + }, { + key: "NAME", + get: function() { + return e + } + }, { + key: "DATA_KEY", + get: function() { + return "bs.tooltip" + } + }, { + key: "Event", + get: function() { + return f + } + }, { + key: "EVENT_KEY", + get: function() { + return s + } + }, { + key: "DefaultType", + get: function() { + return h + } + }]), a + }(); + return t.fn[e] = m._jQueryInterface, t.fn[e].Constructor = m, t.fn[e].noConflict = function() { + return t.fn[e] = a, m._jQueryInterface + }, m + }(jQuery)); + ! function(r) { + var a = "popover", + l = ".bs.popover", + h = r.fn[a], + c = new RegExp("(^|\\s)bs-popover\\S+", "g"), + u = r.extend({}, s.Default, { + placement: "right", + trigger: "click", + content: "", + template: '' + }), + d = r.extend({}, s.DefaultType, { + content: "(string|element|function)" + }), + f = { + FADE: "fade", + SHOW: "show" + }, + p = { + TITLE: ".popover-header", + CONTENT: ".popover-body" + }, + _ = { + HIDE: "hide" + l, + HIDDEN: "hidden" + l, + SHOW: "show" + l, + SHOWN: "shown" + l, + INSERTED: "inserted" + l, + CLICK: "click" + l, + FOCUSIN: "focusin" + l, + FOCUSOUT: "focusout" + l, + MOUSEENTER: "mouseenter" + l, + MOUSELEAVE: "mouseleave" + l + }, + g = function(s) { + function h() { + return n(this, h), t(this, s.apply(this, arguments)) + } + return e(h, s), h.prototype.isWithContent = function() { + return this.getTitle() || this._getContent() + }, h.prototype.addAttachmentClass = function(t) { + r(this.getTipElement()).addClass("bs-popover-" + t) + }, h.prototype.getTipElement = function() { + return this.tip = this.tip || r(this.config.template)[0] + }, h.prototype.setContent = function() { + var t = r(this.getTipElement()); + this.setElementContent(t.find(p.TITLE), this.getTitle()), this.setElementContent(t.find(p.CONTENT), this._getContent()), t.removeClass(f.FADE + " " + f.SHOW) + }, h.prototype._getContent = function() { + return this.element.getAttribute("data-content") || ("function" == typeof this.config.content ? this.config.content.call(this.element) : this.config.content) + }, h.prototype._cleanTipClass = function() { + var t = r(this.getTipElement()), + e = t.attr("class").match(c); + null !== e && e.length > 0 && t.removeClass(e.join("")) + }, h._jQueryInterface = function(t) { + return this.each(function() { + var e = r(this).data("bs.popover"), + n = "object" === (void 0 === t ? "undefined" : i(t)) ? t : null; + if ((e || !/destroy|hide/.test(t)) && (e || (e = new h(this, n), r(this).data("bs.popover", e)), "string" == typeof t)) { + if (void 0 === e[t]) throw new Error('No method named "' + t + '"'); + e[t]() + } + }) + }, o(h, null, [{ + key: "VERSION", + get: function() { + return "4.0.0-beta" + } + }, { + key: "Default", + get: function() { + return u + } + }, { + key: "NAME", + get: function() { + return a + } + }, { + key: "DATA_KEY", + get: function() { + return "bs.popover" + } + }, { + key: "Event", + get: function() { + return _ + } + }, { + key: "EVENT_KEY", + get: function() { + return l + } + }, { + key: "DefaultType", + get: function() { + return d + } + }]), h + }(s); + r.fn[a] = g._jQueryInterface, r.fn[a].Constructor = g, r.fn[a].noConflict = function() { + return r.fn[a] = h, g._jQueryInterface + } + }(jQuery) +}(); \ No newline at end of file diff --git a/web/libs/js/jquery-1.10.2.min.map b/web/libs/js/jquery-1.10.2.min.map new file mode 100644 index 0000000..eda3462 --- /dev/null +++ b/web/libs/js/jquery-1.10.2.min.map @@ -0,0 +1 @@ +{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","key","e","support","ownLast","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","swap","old","style","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","opt","eventName","isSupported","cssText","getSetAttribute","leadingWhitespace","tbody","htmlSerialize","hrefNormalized","opacity","cssFloat","checkOn","optSelected","enctype","html5Clone","cloneNode","outerHTML","inlineBlockNeedsLayout","shrinkWrapBlocks","pixelPosition","deleteExpando","noCloneEvent","reliableMarginRight","boxSizingReliable","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","click","change","focusin","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","isNode","toJSON","internalRemoveData","isEmptyDataObject","cleanData","noData","applet","embed","hasData","removeData","_data","_removeData","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","set","option","one","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","tabindex","parseInt","getter","setAttributeNode","createAttribute","coords","contenteditable","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","global","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","content","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","wrap","safe","nodes","url","ajax","dataType","throws","wrapAll","wrapInner","unwrap","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":"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"} \ No newline at end of file diff --git a/web/libs/js/main.dash2.js b/web/libs/js/main.dash2.js index ccf8f3f..e50738e 100644 --- a/web/libs/js/main.dash2.js +++ b/web/libs/js/main.dash2.js @@ -12,15 +12,40 @@ $.ccio={ fr:$('#files_recent'), mon:{} }; -<% if(config.useUTC){ %> -$.ccio.timeObject = function(date){ - return moment.utc(date).local() +$.ccio.permissionCheck = function(toCheck,monitorId){ + var details = $user.details + if(details.sub && details.allmonitors === '0'){ + var chosenValue = details[toCheck] + if(details[toCheck] instanceof Array && chosenValue.indexOf(monitorId) > -1){ + return true + }else if(chosenValue === '1'){ + return true + } + }else{ + return true + } + return false } -<% }else{ %> -$.ccio.timeObject = function(date){ - return moment(date) +$.ccio.downloadJSON = function(jsonToDownload,filename,errorResponse){ + var arr = jsonToDownload; + if(arr.length===0 && errorResponse){ + errorResponse.type = 'error' + $.ccio.init('note',errorResponse); + return + } + var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(arr,null,3)); + $('#temp').html('') + .find('a') + .attr('href',dataStr) + .attr('download',filename) + [0].click() +} +$.ccio.timeObject = function(time,isUTC){ + if(isUTC === true){ + return moment(time).utc() + } + return moment(time) } -<% } %> if(!$user.details.lang||$user.details.lang==''){ $user.details.lang="<%-config.language%>" } @@ -158,10 +183,40 @@ switch($user.details.lang){ url=url+'/' } }else{ - url='' + url = '<%-originalURL%>' } return url break; + case'videoUrlBuild': + var url + if(d.href){ + url = d.href + }else if(!d.href && d.hrefNoAuth){ + url = $.ccio.init('location',user)+user.auth_token+d.hrefNoAuth + } + if(user!==$user&&url.charAt(0)==='/'){ + url = $.ccio.init('location',user)+d.href.substring(1) + } + return url + break; + case'videoHrefToDelete': + var urlSplit = d.split('?') + var url = urlSplit[0]+'/delete' + if(urlSplit[1])url += '?' + urlSplit[1] + return url + break; + case'videoHrefToUnread': + var urlSplit = d.split('?') + var url = urlSplit[0]+'/status/1' + if(urlSplit[1])url += '?' + urlSplit[1] + return url + break; + case'videoHrefToRead': + var urlSplit = d.split('?') + var url = urlSplit[0]+'/status/2' + if(urlSplit[1])url += '?' + urlSplit[1] + return url + break; // case'streamWindow': // return $('.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]') // break; @@ -369,6 +424,7 @@ switch($user.details.lang){ d.e.find('.monitor_ext').text(d.mon.ext); d.mode=$.ccio.init('humanReadMode',d.mon.mode,user) d.e.find('.monitor_mode').text(d.mode) + d.e.find('.monitor_status').text(d.status) d.e.attr('mode',d.mode) d.e.find('.lamp').attr('title',d.mode) break; @@ -463,6 +519,19 @@ switch($user.details.lang){ }) return $.ccio.mon_groups; break; + case'closeVideo': + var el = $('#monitor_live_'+d.mid+user.auth_token) + var video = el.find('video') + if(video.length === 1){ + if(!video[0].paused){ + video[0].onerror = function(){} + video[0].pause() + } + video.prop('src',''); + video.find('source').remove(); + video.remove(); + } + break; case'jpegModeStop': clearTimeout($.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval); delete($.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval); @@ -492,15 +561,6 @@ switch($user.details.lang){ $.ccio.init('jpegMode',v,user) }); break; - case'dragWindows': - console.log('Deprecated : dragWindows') -// k.e=$("#monitors_live"); -// if(k.e.disableSelection){k.e.disableSelection()}; -// k.e.sortable({ -// handle: ".mdl-card__supporting-text", -// placeholder: "ui-state-highlight col-md-6" -// }); - break; case'getLocation': var l = document.createElement("a"); l.href = d; @@ -834,25 +894,18 @@ switch($user.details.lang){ if(d.id&&!d.mid){d.mid=d.id;} switch(x){ case 0://video - var href - if(d.href){ - href = d.href - }else if(!d.href && d.hrefNoAuth){ - href = $.ccio.init('location',user)+user.auth_token+d.hrefNoAuth - } - if(user!==$user&&href.charAt(0)==='/'){ - href = $.ccio.init('location',user)+d.href.substring(1) - } - href = 'href="'+href+'"' - if(!d.filename){d.filename=$.ccio.init('tf',d.time)+'.'+d.ext;} + var url = $.ccio.init('videoUrlBuild',d) + href = 'href="'+url+'"' +// if(!d.filename){d.filename=$.ccio.init('tf',d.time)+'.'+d.ext;} d.dlname=d.mid+'-'+d.filename; - d.mom=$.ccio.timeObject(d.time), - d.hr=parseInt(d.mom.format('HH')), + d.startMoment=$.ccio.timeObject(d.time), + d.endMoment=$.ccio.timeObject(d.end), + d.hr=parseInt(d.startMoment.format('HH')), d.per=parseInt(d.hr/24*100); - d.circle='
'+d.hr+'
' - tmp+='
  • '+d.circle+'
    <%-cleanLang(lang.Start)%> : '+$.ccio.timeObject(d.time).format('h:mm:ss , MMMM Do YYYY')+'
    <%-cleanLang(lang.End)%> : '+$.ccio.timeObject(d.end).format('h:mm:ss , MMMM Do YYYY')+'
    '+(parseInt(d.size)/1000000).toFixed(2)+'mb
    ' + d.circle='
    '+d.hr+'
    ' + tmp+='
  • '+d.circle+'
    <%-cleanLang(lang.Start)%> : '+d.startMoment.format('h:mm:ss , MMMM Do YYYY')+'
    <%-cleanLang(lang.End)%> : '+d.endMoment.format('h:mm:ss , MMMM Do YYYY')+'
    '+(parseInt(d.size)/1000000).toFixed(2)+'mb
    ' <% if(config.DropboxAppKey){ %> tmp+='' <% } %> - tmp+='
  • '; + tmp+=''; $(z).each(function(n,v){ v=$(v); if(v.find('.video-item').length>10){v.find('.video-item:last').remove()} @@ -860,7 +913,46 @@ switch($user.details.lang){ break; case 1://monitor icon d.src=placeholder.getData(placeholder.plcimg({bgcolor:'#b57d00',text:'...'})); - tmp+='
    '+d.name+'
    '+d.mid+'
    <%-cleanLang(lang['Save as'])%> : '+d.ext+'
    Mode : '+d.mode+'
    '; + tmp+='
    '+d.name+'
    '+d.mid+'
    <%-cleanLang(lang['Save as'])%> : '+d.ext+'
    Status : '+d.status+'
    ' + tmp+='
    ' + var buttons = { + "Pop": { + "label": "Pop", + "attr": "monitor=\"pop\"", + "class": "default", + "icon": "external-link" + }, + "Power Viewer": { + "label": "Power Viewer", + "attr": "monitor=\"powerview\"", + "class": "default", + "icon": "map-marker" + }, + "Videos List": { + "label": "Videos List", + "attr": "monitor=\"videos_table\"", + "class": "default", + "icon": "film" + }, + "Monitor Settings": { + "label": "Monitor Settings", + "attr": "monitor=\"edit\"", + "class": "default", + "icon": "wrench" + } + } + if(!$.ccio.permissionCheck('video_view',d.mid)){ + delete(buttons["Videos List"]) + delete(buttons["Power Viewer"]) + } + if(!$.ccio.permissionCheck('monitor_edit',d.mid)){ + delete(buttons["Monitor Settings"]) + } + $.each(buttons,function(n,v){ + tmp+='' + }) + tmp+='
    \ +
    '; delete(d.src); break; case 2://monitor stream @@ -876,30 +968,97 @@ switch($user.details.lang){ ],function(n,v){ tmp+='
    '+v.label+' :
    ' }) - tmp+=''; + tmp+='' tmp+='
    '; tmp+='
    '; tmp+='
    '; tmp+='
    '+d.name+', <%-cleanLang(lang['Recording FPS'])%> : '+d.fps+'
    '; tmp+='
    '; tmp+='
    '//start of btn list - $.each([ - {label:"<%-cleanLang(lang.Snapshot)%>",attr:'monitor="snapshot"',class:'primary',icon:'camera'}, - {label:"<%-cleanLang(lang['Show Logs'])%>",attr:'monitor="show_data"',class:'warning',icon:'exclamation-triangle'}, -// {label:"<%-cleanLang(lang['Show Logs'])%>",attr:'class_toggle="show_data" data-target="'+dataTarget+'"',class:'warning',icon:'exclamation-triangle'}, - {label:"<%-cleanLang(lang.Control)%>",attr:'monitor="control_toggle"',class:'default arrows',icon:'arrows'}, - {label:"<%-cleanLang(lang['Status Indicator'])%>",attr:'monitor="watch_on"',class:'success signal',icon:'plug'}, - {label:"<%-cleanLang(lang['Detector'])%>",attr:'monitor="motion"',class:'warning',icon:'grav'}, - {label:"<%-cleanLang(lang.Pop)%>",attr:'monitor="pop"',class:'default',icon:'external-link'}, -// {label:"<%-cleanLang(lang.Magnify)%>",attr:'monitor="magnify"',class:'default',icon:'search-plus'}, - {label:"<%-cleanLang(lang.Calendar)%>",attr:'monitor="calendar"',class:'default',icon:'calendar'}, - {label:"<%-cleanLang(lang['Power Viewer'])%>",attr:'monitor="powerview"',class:'default',icon:'map-marker'}, - {label:"<%-cleanLang(lang['Time-lapse'])%>",attr:'monitor="timelapse"',class:'default',icon:'angle-double-right'}, - {label:"<%-cleanLang(lang['Videos List'])%>",attr:'monitor="videos_table"',class:'default',icon:'film'}, - {label:"<%-cleanLang(lang['Monitor Settings'])%>",attr:'monitor="edit"',class:'default permission_monitor_edit',icon:'wrench'}, - {label:"<%-cleanLang(lang.Fullscreen)%>",attr:'monitor="fullscreen"',class:'default',icon:'arrows-alt'}, - {label:"<%-cleanLang(lang.Close)%>",attr:'monitor="watch_off"',class:'danger',icon:'times'}, - ],function(n,v){ + var buttons = { + "Snapshot": { + "label": "Snapshot", + "attr": "monitor=\"snapshot\"", + "class": "primary", + "icon": "camera" + }, + "Show Logs": { + "label": "Show Logs", + "attr": "monitor=\"show_data\"", + "class": "warning", + "icon": "exclamation-triangle" + }, + "Control": { + "label": "Control", + "attr": "monitor=\"control_toggle\"", + "class": "default arrows", + "icon": "arrows" + }, + "Status Indicator": { + "label": "Status Indicator", + "attr": "monitor=\"watch_on\"", + "class": "success signal", + "icon": "plug" + }, + "Pop": { + "label": "Pop", + "attr": "monitor=\"pop\"", + "class": "default", + "icon": "external-link" + }, + "Calendar": { + "label": "Calendar", + "attr": "monitor=\"calendar\"", + "class": "default ", + "icon": "calendar" + }, + "Power Viewer": { + "label": "Power Viewer", + "attr": "monitor=\"powerview\"", + "class": "default", + "icon": "map-marker" + }, + "Time-lapse": { + "label": "Time-lapse", + "attr": "monitor=\"timelapse\"", + "class": "default", + "icon": "angle-double-right" + }, + "Videos List": { + "label": "Videos List", + "attr": "monitor=\"videos_table\"", + "class": "default", + "icon": "film" + }, + "Monitor Settings": { + "label": "Monitor Settings", + "attr": "monitor=\"edit\"", + "class": "default", + "icon": "wrench" + }, + "Fullscreen": { + "label": "Fullscreen", + "attr": "monitor=\"fullscreen\"", + "class": "default", + "icon": "arrows-alt" + }, + "Close": { + "label": "Close", + "attr": "monitor=\"watch_off\"", + "class": "danger", + "icon": "times" + } + } + if(!$.ccio.permissionCheck('video_view',d.mid)){ + delete(buttons["Videos List"]) + delete(buttons["Time-lapse"]) + delete(buttons["Power Viewer"]) + delete(buttons["Calendar"]) + } + if(!$.ccio.permissionCheck('monitor_edit',d.mid)){ + delete(buttons["Monitor Settings"]) + } + $.each(buttons,function(n,v){ tmp+='' }) tmp+='
    ';//end of btn list @@ -976,6 +1135,11 @@ switch($user.details.lang){ } } k.e.append(tmp).find('.stream-element').resize(); + if($.ccio.op().switches.monitorMuteAudio === 1){ + k.e.find('video').each(function(n,el){ + el.muted = "muted" + }) + } break; case'user-row': d.e=$('.user-row[uid="'+d.uid+'"][ke="'+d.ke+'"]') @@ -1287,7 +1451,7 @@ switch($user.details.lang){ tmp+='
    ' tmp+='
    ' tmp+='