diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..1ff0c4230 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..fd8bd0585 --- /dev/null +++ b/.gitignore @@ -0,0 +1,202 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +build/ +bld/ +#[Bb]in/ +[Oo]bj/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +## TODO: Comment the next line if you want to checkin your +## web deploy settings but do note that will include unencrypted +## passwords +#*.pubxml + +# NuGet Packages Directory +packages/* +## TODO: If the tool you use requires repositories.config +## uncomment the next line +#!packages/repositories.config + +# Enable "build/" folder in the NuGet Packages folder since +# NuGet packages use it for MSBuild targets. +# This line needs to be after the ignore of the build folder +# (and the packages folder if the line above has been uncommented) +!packages/build/ + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# Ignore the bower packages folder since these contain lots of files +# Including them causes massive CPU usage due to file watching + +td/bower-packages/ +td/[Oo]bj/ +#td/[Bb]in/ +td/node_modules/ +threatdragon.tests/node_modules/ +threatdragon.tests/[Oo]bj/ +*/.ntvs_analysis.dat +td/.ntvs_analysis.dat +threatdragon.tests/.ntvs_analysis.dat diff --git a/README.md b/README.md new file mode 100644 index 000000000..d716d335b --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# [OWASP](https://www.owasp.org) Threat Dragon # + +An online threat modelling web application including system diagramming and a rule engine to auto-generate threats/mitigations. +The focus will be on great UX, a powerful rule engine and integration with other development lifecycle tools. + +We are currently maintaining [a working protoype](http://babydragon.azurewebsites.net/#/) in sych with the main code branch. + +An [OWASP Incubator Project](https://www.owasp.org/index.php/OWASP_Threat_Dragon). + +**Project leader:** Mike Goodwin (mike.goodwin@owasp.org) + +##Getting started + +ThreatDragon is a Single Page Application (SPA) using Angular on the client and node.js on the server, althought the server side code does almost nothing so far. +To build and run locally, follow these steps: + +Install Git and node.js. Threat Dragon uses Grunt for its build workflow, so + +`npm install -g grunt-cli` + +To get the code, go to where you want your code to be located and do + +`git init` + +`git clone https://bitbucket.org/theblacklabrador/threatmodellingtool.git` + +This installs code in two sub-folders. One for the main application (`td`) and one for the unit tests (`threatdragon.tests`). In the `td` folder get all the node +packages: + +`npm install` + +All the build workflow task are in the default grunt task, so just do + +`grunt` + +and then start the node web serverdie td + + +`node bin\www` + +If you then browse to `http://localhost:3000` you should see the running application. + +##Running the unit tests + +The unit tests are written using Jasmine and can be run with Karma using a Grunt task. Install recent versions of Chrome, Firefox and IE. To install all packages for the unit tests go to the `threatdragon.tests` folder and do + +`npm install` + +then run the tests using + +`grunt` + +Note: If you are on Windows and are having problems installing Karma, the simplest way to resolve this seems to be to install Python v2.7.x (not v3+) and then install Visual Studio Express as per the SO answer suggested in [this link](http://codedmi.com/questions/298619/npm-install-g-karma-error-msb4019-the-imported-project-c-microsoft-cpp-defau). This sounds mad, but the alternative is a world of pain installing various patches and components one by one. At least it's free :o/ + +More documentation will follow soon... \ No newline at end of file diff --git a/ThreatModellingTool.sln b/ThreatModellingTool.sln new file mode 100644 index 000000000..42261cf46 --- /dev/null +++ b/ThreatModellingTool.sln @@ -0,0 +1,35 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}") = "BabyDragon_Azure", "td\BabyDragon_Azure.njsproj", "{926F91E5-0963-44E4-A785-03C101B080AD}" +EndProject +Project("{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}") = "threatdragon.tests", "threatdragon.tests\threatdragon.tests.njsproj", "{6F3FEC96-4A11-4387-80D4-5CCF6C9B20BC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C35A158F-7E3F-40FB-BBD4-7A8C7D327F5E}" + ProjectSection(SolutionItems) = preProject + .gitattributes = .gitattributes + .gitignore = .gitignore + README.md = README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {926F91E5-0963-44E4-A785-03C101B080AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {926F91E5-0963-44E4-A785-03C101B080AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {926F91E5-0963-44E4-A785-03C101B080AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {926F91E5-0963-44E4-A785-03C101B080AD}.Release|Any CPU.Build.0 = Release|Any CPU + {6F3FEC96-4A11-4387-80D4-5CCF6C9B20BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F3FEC96-4A11-4387-80D4-5CCF6C9B20BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F3FEC96-4A11-4387-80D4-5CCF6C9B20BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F3FEC96-4A11-4387-80D4-5CCF6C9B20BC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/td/.bowerrc b/td/.bowerrc new file mode 100644 index 000000000..061ad1f26 --- /dev/null +++ b/td/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "bower-packages" +} \ No newline at end of file diff --git a/td/BabyDragon_Azure.njsproj b/td/BabyDragon_Azure.njsproj new file mode 100644 index 000000000..b2f220ea8 --- /dev/null +++ b/td/BabyDragon_Azure.njsproj @@ -0,0 +1,234 @@ + + + + 11.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + BabyDragon_Azure + BabyDragon_Azure + babydragon + + + + Debug + 2.0 + 926f91e5-0963-44e4-a785-03c101b080ad + + + bin\www + + + . + . + v4.0 + {3AF33F2E-1136-4D97-BBB7-1795711AC8B8};{349c5851-65df-11da-9384-00065b846f21};{9092AA53-FB77-4645-B42D-1CCCA6BD08BD} + ShowAllFiles + 1337 + true + + + true + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + True + 0 + / + http://localhost:48022/ + False + True + http://localhost:1337 + False + + + + + + + CurrentPage + True + False + False + False + + + + + + + + + False + False + + + + + \ No newline at end of file diff --git a/td/Web.Debug.config b/td/Web.Debug.config new file mode 100644 index 000000000..cf0d99fd0 --- /dev/null +++ b/td/Web.Debug.config @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/td/Web.config b/td/Web.config new file mode 100644 index 000000000..47c4d5abc --- /dev/null +++ b/td/Web.config @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/td/app.js b/td/app.js new file mode 100644 index 000000000..7516054e3 --- /dev/null +++ b/td/app.js @@ -0,0 +1,55 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +var routes = require('./routes/index'); + +var app = express(); + +// uncomment after placing your favicon in /public +//app.use(favicon(__dirname + '/public/favicon.ico')); +app.use(logger('dev')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(require('stylus').middleware(path.join(__dirname, 'public'))); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', routes); + +//// catch 404 and forward to error handler +//app.use(function (req, res, next) { +// var err = new Error('Not Found'); +// err.status = 404; +// next(err); +//}); + +//// error handlers + +//// development error handler +//// will print stacktrace +//if (app.get('env') === 'development') { +// app.use(function (err, req, res, next) { +// res.status(err.status || 500); +// res.render('error', { +// message: err.message, +// error: err +// }); +// }); +//} + +//// production error handler +//// no stacktraces leaked to user +//app.use(function (err, req, res, next) { +// res.status(err.status || 500); +// res.render('error', { +// message: err.message, +// error: {} +// }); +//}); + + +module.exports = app; diff --git a/td/babydragon.pubxml b/td/babydragon.pubxml new file mode 100644 index 000000000..3297b0830 --- /dev/null +++ b/td/babydragon.pubxml @@ -0,0 +1,25 @@ + + + + + MSDeploy + Release + Any CPU + http://babydragon.azurewebsites.net + True + False + babydragon.scm.azurewebsites.net:443 + babydragon + + False + WMSVC + True + $babydragon + <_SavePWD>True + <_DestinationType>AzureWebSite + False + + \ No newline at end of file diff --git a/td/bin/ChangeConfig.ps1 b/td/bin/ChangeConfig.ps1 new file mode 100644 index 000000000..044634574 --- /dev/null +++ b/td/bin/ChangeConfig.ps1 @@ -0,0 +1,15 @@ +$configFile = $args[0] + +Write-Host "Adding iisnode section to config file '$configFile'" +$config = New-Object System.Xml.XmlDocument +$config.load($configFile) +$xpath = $config.CreateNavigator() +$parentElement = $xpath.SelectSingleNode("//configuration/configSections/sectionGroup[@name='system.webServer']") +$iisnodeElement = $parentElement.SelectSingleNode("//section[@name='iisnode']") +if ($iisnodeElement) { + Write-Host "Removing existing iisnode section from config file '$configFile'" + $iisnodeElement.DeleteSelf() +} + +$parentElement.AppendChild("
") +$config.Save($configFile) diff --git a/td/bin/Microsoft.NodejsTools.WebRole.dll b/td/bin/Microsoft.NodejsTools.WebRole.dll new file mode 100644 index 000000000..0b45e470f Binary files /dev/null and b/td/bin/Microsoft.NodejsTools.WebRole.dll differ diff --git a/td/bin/download.ps1 b/td/bin/download.ps1 new file mode 100644 index 000000000..9e46b09ad --- /dev/null +++ b/td/bin/download.ps1 @@ -0,0 +1,87 @@ +$runtimeUrl = $args[0] +$overrideUrl = $args[1] +$current = [string] (Get-Location -PSProvider FileSystem) +$client = New-Object System.Net.WebClient + +function downloadWithRetry { + param([string]$url, [string]$dest, [int]$retry) + Write-Host + Write-Host "Attempt: $retry" + Write-Host + trap { + Write-Host $_.Exception.ToString() + if ($retry -lt 5) { + $retry=$retry+1 + Write-Host + Write-Host "Waiting 5 seconds and retrying" + Write-Host + Start-Sleep -s 5 + downloadWithRetry $url $dest $retry $client + } + else { + Write-Host "Download failed" + throw "Max number of retries downloading [5] exceeded" + } + } + $client.downloadfile($url, $dest) +} + +function download($url, $dest) { + Write-Host "Downloading $url" + downloadWithRetry $url $dest 1 +} + +function copyOnVerify($file, $output) { + Write-Host "Verifying $file" + $verify = Get-AuthenticodeSignature $file + Out-Host -InputObject $verify + if ($verify.Status -ne "Valid") { + throw "Invalid signature for runtime package $file" + } + else { + mv $file $output + } +} + +if ($overrideUrl) { + Write-Host "Using override url: $overrideUrl" + $url = $overrideUrl +} +else { + $url = $runtimeUrl +} + +foreach($singleUrl in $url -split ";") +{ + $suffix = Get-Random + $downloaddir = $current + "\sandbox" + $suffix + mkdir $downloaddir + $dest = $downloaddir + "\sandbox.exe" + download $singleUrl $dest + $final = $downloaddir + "\runtime.exe" + copyOnVerify $dest $final + if (Test-Path -LiteralPath $final) + { + cd $downloaddir + if ($host.Version.Major -eq 3) + { + .\runtime.exe -y | Out-Null + .\setup.cmd + } + else + { + Start-Process -FilePath $final -ArgumentList -y -Wait + $cmd = $downloaddir + "\setup.cmd" + Start-Process -FilePath $cmd -Wait + } + } + else + { + throw "Unable to verify package" + } + cd $current + if (Test-Path -LiteralPath $downloaddir) + { + Remove-Item -LiteralPath $downloaddir -Force -Recurse + } +} diff --git a/td/bin/node.cmd b/td/bin/node.cmd new file mode 100644 index 000000000..c69a72af9 --- /dev/null +++ b/td/bin/node.cmd @@ -0,0 +1 @@ +node.exe %1 %2 %3 \ No newline at end of file diff --git a/td/bin/setup_web.cmd b/td/bin/setup_web.cmd new file mode 100644 index 000000000..f02e6d5c4 --- /dev/null +++ b/td/bin/setup_web.cmd @@ -0,0 +1,57 @@ +@echo on + +cd /d "%~dp0" + +if "%EMULATED%"=="true" if DEFINED APPCMD goto emulator_setup +if "%EMULATED%"== "true" exit /b 0 + +echo Granting permissions for Network Service to the web root directory... +icacls ..\ /grant "Network Service":(OI)(CI)W +if %ERRORLEVEL% neq 0 goto error +echo OK + +echo Configuring powershell permissions +powershell -c "set-executionpolicy unrestricted" + +echo Downloading and installing runtime components +powershell .\download.ps1 '%RUNTIMEURL%' '%RUNTIMEURLOVERRIDE%' +if %ERRORLEVEL% neq 0 goto error + +echo SUCCESS +exit /b 0 + +:error +echo FAILED +exit /b -1 + +:emulator_setup +echo Running in emulator adding iisnode to application host config +FOR /F "tokens=1,2 delims=/" %%a in ("%APPCMD%") DO set FN=%%a&set OPN=%%b +if "%OPN%"=="%OPN:apphostconfig:=%" ( + echo "Could not parse appcmd '%appcmd% for configuration file, exiting" + goto error +) + +set IISNODE_BINARY_DIRECTORY=%programfiles(x86)%\iisnode-dev\release\x64 +set IISNODE_SCHEMA=%programfiles(x86)%\iisnode-dev\release\x64\iisnode_schema.xml + +if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto start +set IISNODE_BINARY_DIRECTORY=%programfiles%\iisnode-dev\release\x86 +set IISNODE_SCHEMA=%programfiles%\iisnode-dev\release\x86\iisnode_schema_x86.xml + + +:start +set + +echo Using iisnode binaries location '%IISNODE_BINARY_DIRECTORY%' +echo installing iisnode module using AppCMD alias %appcmd% +%appcmd% install module /name:"iisnode" /image:"%IISNODE_BINARY_DIRECTORY%\iisnode.dll" + +set apphostconfigfile=%OPN:apphostconfig:=% +powershell -c "set-executionpolicy unrestricted" +powershell .\ChangeConfig.ps1 %apphostconfigfile% +if %ERRORLEVEL% neq 0 goto error + +copy /y "%IISNODE_SCHEMA%" "%programfiles%\IIS Express\config\schema\iisnode_schema.xml" +if %ERRORLEVEL% neq 0 goto error +exit /b 0 diff --git a/td/bin/www b/td/bin/www new file mode 100644 index 000000000..caa441326 --- /dev/null +++ b/td/bin/www @@ -0,0 +1,9 @@ +#!/usr/bin/env node +var debug = require('debug')('BabyDragon_Azure'); +var app = require('../app'); + +app.set('port', process.env.PORT || 3000); + +var server = app.listen(app.get('port'), function() { + debug('Express server listening on port ' + server.address().port); +}); diff --git a/td/bower.json b/td/bower.json new file mode 100644 index 000000000..f1d026dd6 --- /dev/null +++ b/td/bower.json @@ -0,0 +1,76 @@ +{ + "name": "bower.json", + "version": "0.0.0", + "authors": [ + "mike-goodwin " + ], + "description": "OWASP Threat Dragon", + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "public/scripts/", + "test", + "tests" + ], + "dependencies": { + "angular": "~1.4.3", + "angular-route": "~1.4.3", + "angular-ui-bootstrap-bower": "~0.13.0", + "nools": "*", + "jquery": "~2.0.3", + "lodash": "~3.10.1", + "backbone": "~1.2.1", + "toastr": "~2.1.1", + "bootstrap": "~3.3.5", + "joint": "git://github.com/clientIO/joint#~0.9.3", + "font-awesome": "~4.3.0" + }, + "devDependencies": { + "angular-mocks": "~1.4.7" +}, + "exportsOverride": { + "joint": { + ".": [ + "dist/joint.js", + "dist/joint.css" + ] + }, + "bootstrap": { + ".": [ + "dist/js/bootstrap.js", + "dist/css/bootstrap.css" + ], + "../fonts": "fonts/*" + }, + "nools": { + ".": "nools.js" + }, + "font-awesome": { + "../fonts": "fonts/*" + } + }, + "overrides": { + "joint": { + "dependencies": {}, + "main": [ + "dist/joint.js", + "dist/joint.css" + ] + }, + "backbone": { + "dependencies": {} + }, + "bootstrap": { + "main": [ + "dist/js/bootstrap.js", + "dist/css/bootstrap.css" + ] + } + }, + "resolutions": { + "jquery": "~2.0.3", + "angular": ">=1.3.0" + } +} diff --git a/td/gruntfile.js b/td/gruntfile.js new file mode 100644 index 000000000..d578a4046 --- /dev/null +++ b/td/gruntfile.js @@ -0,0 +1,92 @@ +/// +module.exports = function (grunt) { + + grunt.loadNpmTasks('grunt-wiredep'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-bower-installer'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + + grunt.initConfig({ + bower: { + install: { + options: { + targetDir: './public/libs', + layout: 'byComponent', + install: true, + verbose: false, + overrideBowerDirectory: false, + cleanTargetDir: false, + cleanBowerDir: false, + bowerOptions: {} + } + } + }, + uglify: { + minifyjs: { + files: [{ + expand: true, + cwd: 'public/libs', + src: '**/*.js', + dest: 'public/libs', + ext: '.min.js', + extDot: 'first' + }] + }, + options: { + sourceMap: true + } + }, + cssmin: { + options: { + shorthandCompacting: false, + roundingPrecision: -1 + }, + minifycss: { + files: [{ + expand: true, + cwd: 'public/libs', + src: '**/*.css', + dest: 'public/libs', + ext: '.min.css', + extDot: 'first' + }] + } + }, + wiredep: { + task: { + src: ['public/index.html'], + options: { + devDependencies: false, + fileTypes: { + html: { + replace: { + js: function (filePath) { + var prefixLength = '../bower-packages'.length; + var trimmedPath = filePath.slice(prefixLength); + var packageName = trimmedPath.slice(1).split('/')[0]; + var fileName = trimmedPath.slice(trimmedPath.lastIndexOf('/')); + var minFileName = fileName.split('.')[0] + '.min.js'; + + return ''; + }, + + css: function (filePath) { + var prefixLength = '../bower-packages'.length; + var trimmedPath = filePath.slice(prefixLength); + var packageName = trimmedPath.slice(1).split('/')[0]; + var fileName = trimmedPath.slice(trimmedPath.lastIndexOf('/')); + var minFileName = fileName.split('.')[0] + '.min.css'; + + return ''; + } + } + } + } + } + } + } + }); + + grunt.registerTask('default', ['bower', 'uglify', 'cssmin', 'wiredep']); +}; \ No newline at end of file diff --git a/td/package.json b/td/package.json new file mode 100644 index 000000000..335954847 --- /dev/null +++ b/td/package.json @@ -0,0 +1,34 @@ +{ + "name": "OWASP-Threat-Dragon", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "description": "OWASP Threat Dragon - a free, open source threat modelling tool", + "author": { + "name": "mike.goodwin", + "email": "mike.goodwin@owasp.org" + }, + "dependencies": { + "body-parser": "~1.8.1", + "cookie-parser": "^1.3.5", + "debug": "~2.0.0", + "express": "~4.9.0", + "morgan": "~1.3.0", + "serve-favicon": "~2.1.3", + "stylus": "0.42.3" + }, + "devDependencies": { + "bower": "^1.3.12", + "grunt": "^0.4.5", + "grunt-bower-installer": "^0.3.6", + "grunt-contrib-concat": "^0.5.1", + "grunt-contrib-cssmin": "^0.12.3", + "grunt-contrib-uglify": "^0.9.1", + "grunt-contrib-watch": "^0.6.1", + "grunt-filerev": "^2.3.1", + "grunt-wiredep": "^2.0.0", + "requirejs": "^2.1.17" + } +} diff --git a/td/public/app/app.js b/td/public/app/app.js new file mode 100644 index 000000000..32feeb1ee --- /dev/null +++ b/td/public/app/app.js @@ -0,0 +1,22 @@ +(function () { + 'use strict'; + + var app = angular.module('app', [ + + 'ui.bootstrap', + 'ngRoute', + 'common' + ]) + + app.run(['$rootScope', 'common', + function ($rootScope, common) { + + }]); + + // Handle routing errors and success events + app.run(['$route', '$rootScope', 'routemediator', + function ($route, $rootScope, routemediator) { + routemediator.setRoutingHandlers(); + }]); + +})(); \ No newline at end of file diff --git a/td/public/app/common/common.js b/td/public/app/common/common.js new file mode 100644 index 000000000..c48d4800f --- /dev/null +++ b/td/public/app/common/common.js @@ -0,0 +1,70 @@ +(function () { + 'use strict'; + + // Define the common module + // Contains services: + // - common + // - logger + // - spinner + var commonModule = angular.module('common', []); + + // Must configure the common service and set its + // events via the commonConfigProvider + commonModule.provider('commonConfig', function () { + this.config = { + // These are the properties we need to set + //controllerActivateSuccessEvent: '', + //spinnerToggleEvent: '' + }; + + this.$get = function () { + return { + config: this.config + }; + }; + }); + + commonModule.factory('common', + ['$q','$rootScope', 'commonConfig', 'logger', common]); + + function common($q, $rootScope, commonConfig, logger) { + + var service = { + // common angular dependencies + $broadcast: $broadcast, + // generic + activateController: activateController, + logger: logger, + utils: {stringToFunction: stringToFunction} + }; + + return service; + + function stringToFunction(str) { + var arr = str.split("."); + + var fn = (window || this); + for (var i = 0, len = arr.length; i < len; i++) { + fn = fn[arr[i]]; + } + + if (typeof fn !== "function") { + throw new Error("function not found"); + } + + return fn; + }; + + + function activateController(promises, controllerId) { + return $q.all(promises).then(function (eventArgs) { + var data = { controllerId: controllerId }; + $broadcast(commonConfig.config.controllerActivateSuccessEvent, data); + }); + } + + function $broadcast() { + return $rootScope.$broadcast.apply($rootScope, arguments); + } + } +})(); \ No newline at end of file diff --git a/td/public/app/common/logger.js b/td/public/app/common/logger.js new file mode 100644 index 000000000..edd28df0b --- /dev/null +++ b/td/public/app/common/logger.js @@ -0,0 +1,69 @@ +(function () { + 'use strict'; + + angular.module('common').factory('logger', ['$log', logger]); + + function logger($log) { + var service = { + getLogFn: getLogFn, + log: log, + logError: logError, + logSuccess: logSuccess, + logWarning: logWarning + }; + + return service; + + function getLogFn(moduleId, fnName) { + fnName = fnName || 'log'; + switch (fnName.toLowerCase()) { // convert aliases + case 'success': + fnName = 'logSuccess'; break; + case 'error': + fnName = 'logError'; break; + case 'warn': + fnName = 'logWarning'; break; + case 'warning': + fnName = 'logWarning'; break; + } + + var logFn = service[fnName] || service.log; + return function (msg, data, showToast) { + logFn(msg, data, moduleId, (showToast === undefined) ? true : showToast); + }; + } + + function log(message, data, source, showToast) { + logIt(message, data, source, showToast, 'info'); + } + + function logWarning(message, data, source, showToast) { + logIt(message, data, source, showToast, 'warning'); + } + + function logSuccess(message, data, source, showToast) { + logIt(message, data, source, showToast, 'success'); + } + + function logError(message, data, source, showToast) { + logIt(message, data, source, showToast, 'error'); + } + + function logIt(message, data, source, showToast, toastType) { + var write = (toastType === 'error') ? $log.error : $log.log; + source = source ? '[' + source + '] ' : ''; + write(source, message, data); + if (showToast) { + if (toastType === 'error') { + toastr.error(message); + } else if (toastType === 'warning') { + toastr.warning(message); + } else if (toastType === 'success') { + toastr.success(message); + } else { + toastr.info(message); + } + } + } + } +})(); \ No newline at end of file diff --git a/td/public/app/config.exceptionHandler.js b/td/public/app/config.exceptionHandler.js new file mode 100644 index 000000000..5000e2ab8 --- /dev/null +++ b/td/public/app/config.exceptionHandler.js @@ -0,0 +1,29 @@ +// Include in index.html so that app level exceptions are handled. +// Exclude from testRunner.html which should run exactly what it wants to run +(function () { + 'use strict'; + + var app = angular.module('app'); + + // Configure by setting an optional string value for appErrorPrefix. + // Accessible via config.appErrorPrefix (via config value). + + app.config(['$provide', function ($provide) { + $provide.decorator('$exceptionHandler', + ['$delegate', 'config', 'logger', extendExceptionHandler]); + }]); + + // Extend the $exceptionHandler service to also display a toast. + function extendExceptionHandler($delegate, config, logger) { + var appErrorPrefix = config.appErrorPrefix; + var logError = logger.getLogFn('app', 'error'); + return function (exception, cause) { + $delegate(exception, cause); + if (appErrorPrefix && exception.message.indexOf(appErrorPrefix) === 0) { return; } + + var errorData = { exception: exception, cause: cause }; + var msg = appErrorPrefix + exception.message; + logError(msg, errorData, true); + }; + } +})(); \ No newline at end of file diff --git a/td/public/app/config.js b/td/public/app/config.js new file mode 100644 index 000000000..750155992 --- /dev/null +++ b/td/public/app/config.js @@ -0,0 +1,35 @@ +(function () { + 'use strict'; + + var app = angular.module('app'); + + // Configure Toastr + toastr.options.timeOut = 4000; + toastr.options.positionClass = 'toast-bottom-right'; + + var events = { + controllerActivateSuccess: 'controller.activateSuccess', + }; + + var config = { + appErrorPrefix: '[Error] ', //Configure the exceptionHandler decorator + docTitle: 'Threat Dragon: ', + events: events, + version: '0.0.1', + }; + + app.value('config', config); + + app.config(['$logProvider', function ($logProvider) { + // turn debugging off/on (no info or warn) + if ($logProvider.debugEnabled) { + $logProvider.debugEnabled(true); + } + }]); + + //#region Configure the common services via commonConfig + app.config(['commonConfigProvider', function (cfg) { + cfg.config.controllerActivateSuccessEvent = config.events.controllerActivateSuccess; + }]); + //#endregion +})(); \ No newline at end of file diff --git a/td/public/app/config.route.js b/td/public/app/config.route.js new file mode 100644 index 000000000..7d95b7c22 --- /dev/null +++ b/td/public/app/config.route.js @@ -0,0 +1,91 @@ +(function () { + 'use strict'; + + var app = angular.module('app'); + + // Collect the routes + app.constant('routes', getRoutes()); + + // Configure the routes and route resolvers + app.config(['$routeProvider', 'routes', routeConfigurator]); + function routeConfigurator($routeProvider, routes) { + + routes.forEach(function (r) { + setRoute(r.url, r.config); + }); + + $routeProvider.otherwise({ redirectTo: '/' }); + + function setRoute(url, config) { + + $routeProvider.when(url, config); + + return $routeProvider; + } + } + + // Define the routes + function getRoutes() { + return [ + { + url: '/', + config: { + templateUrl: 'app/welcome/welcome.html', + title: 'welcome', + settings: { + } + } + }, { + url: '/welcome', + config: { + templateUrl: 'app/welcome/welcome.html', + title: 'welcome', + settings: { + } + } + }, { + url: '/threatmodels', + config: { + title: 'threatmodels', + templateUrl: 'app/threatmodels/threatmodels.html', + settings: { + } + } + }, { + url: '/threatmodel/:threatModelId', + config: { + title: 'threatmodelsdetail', + templateUrl: 'app/threatmodels/threatmodeldetail.html', + settings: { + } + } + }, { + url: '/threatmodel/edit/:threatModelId', + config: { + title: 'threatmodeledit', + templateUrl: 'app/threatmodels/threatmodeledit.html', + settings: { + } + } + }, { + url: '/threatmodel/report/:threatModelId', + config: { + title: 'threatmodelreport', + templateUrl: 'app/report/threatmodelreport.html', + settings: { + } + } + }, { + url: '/threatmodel/:threatModelId/diagram/:diagramId', + config: { + title: 'diagram', + templateUrl: 'app/diagrams/diagrameditor.html', + reloadOnSearch: false, + settings: { + } + } + } + ]; + } +})(); + diff --git a/td/public/app/diagrams/ElementPropertiesPane.html b/td/public/app/diagrams/ElementPropertiesPane.html new file mode 100644 index 000000000..91ebdd72d --- /dev/null +++ b/td/public/app/diagrams/ElementPropertiesPane.html @@ -0,0 +1,68 @@ +
+
+
+ + +
+
+
+ +
+
+ + +
+
+
+ + +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+ +
+
+ +
+
+
diff --git a/td/public/app/diagrams/ThreatEditPane.html b/td/public/app/diagrams/ThreatEditPane.html new file mode 100644 index 000000000..ee71bbdf2 --- /dev/null +++ b/td/public/app/diagrams/ThreatEditPane.html @@ -0,0 +1,78 @@ +
+ + + + +
diff --git a/td/public/app/diagrams/ThreatSummaryPane.html b/td/public/app/diagrams/ThreatSummaryPane.html new file mode 100644 index 000000000..3869f10c5 --- /dev/null +++ b/td/public/app/diagrams/ThreatSummaryPane.html @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/td/public/app/diagrams/confirmReloadOnDirty.html b/td/public/app/diagrams/confirmReloadOnDirty.html new file mode 100644 index 000000000..67ebdadbf --- /dev/null +++ b/td/public/app/diagrams/confirmReloadOnDirty.html @@ -0,0 +1,13 @@ +
+ + + +
diff --git a/td/public/app/diagrams/diagram.js b/td/public/app/diagrams/diagram.js new file mode 100644 index 000000000..049fe28c2 --- /dev/null +++ b/td/public/app/diagrams/diagram.js @@ -0,0 +1,378 @@ +(function () { + 'use strict'; + + // Controller name is handy for logging + var controllerId = 'diagram'; + + // Define the controller on the module. + // Inject the dependencies. + // Point to the controller definition function. + angular.module('app').controller(controllerId, + ['$scope', '$location', '$routeParams', '$timeout', 'dialogs', 'common', 'datacontext', 'threatengine', 'diagramming', diagram]); + + function diagram($scope, $location, $routeParams, $timeout, dialogs, common, datacontext, threatengine, diagramming) { + + // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel). + var vm = this; + var getLogFn = common.logger.getLogFn; + var log = getLogFn(controllerId); + var logError = getLogFn(controllerId, 'error'); + var scope = $scope; + var elementPropertiesCache = {}; + var deletedElements = {}; + var diagram = {}; + var scaleFactor = 1.25; + + // Bindable properties and functions are placed on vm. + vm.title = 'ThreatModelDiagram'; + vm.initialise = initialise, + vm.dirty = false; + vm.graph = diagramming.newGraph(); + vm.newProcess = newProcess; + vm.newStore = newStore; + vm.newFlow = newFlow; + vm.newActor = newActor; + vm.newBoundary = newBoundary; + vm.select = select; + vm.edit = edit; + vm.generateThreats = generateThreats; + vm.selected = {}; + vm.viewStencil = true; + vm.viewThreats = false; + vm.stencils = getStencils(); + vm.zoomIn = zoomIn; + vm.zoomOut = zoomOut; + vm.reload = reload; + vm.save = save; + vm.clear = clear; + vm.threatModelId = $routeParams.threatModelId; + vm.diagramId = $routeParams.diagramId; + vm.currentZoomLevel = 0; + vm.maxZoom = 4; + + //structured exit + $scope.$on('$locationChangeStart', function (event, current, previous) + { + //suppress structured exit when only search changes + var absPathCurrent = current.split('?')[0]; + var absPathPrevious = previous.split('?')[0]; + + if (vm.dirty && absPathCurrent != absPathPrevious) { + dialogs.stucturedExit(event, function () { }, function () { vm.dirty = false; }); + } + }); + + //element select + $scope.$on('$locationChangeSuccess', function (event, current, previous) + { + onSelectElement(); + }); + + activate(); + + function activate() { + common.activateController([], controllerId) + .then(function () { log('Activated Threat Model Diagram View'); }); + } + + function getStencils() { + + var shapes = [ + { shape: { className: 'joint.shapes.tm.Process', label: 'Process' }, action: newProcess }, + { shape: { className: 'joint.shapes.tm.Store', label: 'Store'}, action: newStore }, + { shape: { className: 'joint.shapes.tm.Actor', label: 'Actor'}, action: newActor }, + { shape: { className: 'joint.shapes.tm.Flow', label: 'Data Flow'}, action: newFlow }, + { shape: { className: 'joint.shapes.tm.Boundary', label: 'Trust\nBoundary' }, action: newBoundary }]; + + return shapes; + } + + function save() + { + var diagramJson = JSON.stringify(vm.graph); + var size = { height: diagram.options.height, width: diagram.options.width }; + var diagramData = { diagramJson: diagramJson, size: size }; + + datacontext.saveThreatModelDiagram(vm.threatModelId, vm.diagramId, diagramData) + .then(flushElementPropertiesCache) + .then(flushDeletedElements) + .then(onSaveDiagram); + } + + function onSaveDiagram() + { + vm.dirty = false; + addDirtyEventHandlers(); + } + + function initialise(newDiagram) + { + diagram = newDiagram + datacontext.getThreatModelDiagram(vm.threatModelId, vm.diagramId).then(onGetThreatModelDiagram, onError); + + function onGetThreatModelDiagram(data) { + + if (angular.isDefined(data.diagramJson)) { + diagramming.initialise(vm.graph, data.diagramJson); + } + + if (angular.isDefined(data.size)) { + diagramming.resize(diagram, data.size); + } + + vm.graph.on('remove', removeElement); + addDirtyEventHandlers(); + vm.loaded = true; + vm.diagramTitle = data.title; + elementPropertiesCache = {}; + deletedElements = {}; + vm.dirty = false; + + if ($routeParams.element) { + var element = diagramming.getCellById(vm.graph, $routeParams.element); + initialSelect(element); + //a bit ugly - can we remove the dependency on the diagram? + diagram.setSelected(element); + + //more ugliness, but $evalAsync does not work!? + //This is to ensure the stencils are rendered before they are collapsed + //It is a bit jank though as you see the stencil accordian element collapse :( + $timeout(function () { + vm.viewStencil = false; + vm.viewThreats = true; + }); + } + } + } + + function reload() + { + //only ask for confirmation if diagram is dirty AND it has some cells + //avoids the confirmation if you are reloading after an accidental clear of the model + if (vm.dirty && diagramming.cellCount(vm.graph) > 0) + { + dialogs.confirm('./app/diagrams/confirmReloadOnDirty.html', function () { initialise(diagram) }); + } + else + { + initialise(diagram); + } + } + + function clear() + { + diagramming.getElements(vm.graph).forEach(function (element) { addToDeletedElements(element) }); + diagramming.getLinks(vm.graph).forEach(function (element) { addToDeletedElements(element) }); + diagramming.clear(vm.graph); + } + + function zoomIn() + { + if (vm.currentZoomLevel < vm.maxZoom) + { + vm.currentZoomLevel++; + diagramming.zoom(diagram, vm.currentZoomLevel); + } + } + + function zoomOut() + { + if (vm.currentZoomLevel > -vm.maxZoom) { + vm.currentZoomLevel--; + diagramming.zoom(diagram, vm.currentZoomLevel); + } + } + + function onError(error) + { + vm.loaded = false; + logError(error); + } + + function edit() + { + vm.dirty = true; + } + + function generateThreats() + { + if (vm.selected.element) + { + threatengine.generateForElement(vm.selected.element).then(onGenerateThreats); + }; + } + + function onGenerateThreats(threats) + { + var threatList = threats; + var currentThreat; + suggestThreat(); + + function suggestThreat() + { + if (threatList.length > 0) { + currentThreat = threatList.shift(); + dialogs.confirm('./app/diagrams/ThreatEditPane.html', addThreat, function () { return { heading: 'Add this threat?', threat: currentThreat, editing: false } }, ignoreThreat, 'fade-right'); + } + } + + function addThreat() + { + vm.dirty = true; + vm.selected.elementProperties.threats.push(currentThreat); + $timeout(suggestThreat, 500); + } + + function ignoreThreat() + { + $timeout(suggestThreat, 500); + } + } + + function onSelectElement() + { + if (vm.selected.elementProperties) + { + elementPropertiesCache[vm.selected.element.id] = vm.selected.elementProperties; + } + + var element = null; + var elementId = $routeParams.element; + + if (elementId) + { + var element = diagramming.getCellById(vm.graph, elementId); + } + + vm.selected.element = element; + + if (element) + { + if (elementPropertiesCache[element.id]) + { + vm.selected.elementProperties = elementPropertiesCache[element.id]; + } + else + { + datacontext.getElementProperties(vm.threatModelId, vm.diagramId, element.id).then(onGetElementProperties); + } + } + else + { + vm.selected.elementProperties = null; + } + + //existence test is required to support unit tests where diagram is not initialised + if (typeof diagram.setSelected === 'function' || typeof diagram.setSelected === 'object') { + diagram.setSelected(element); + } + } + + function initialSelect(element) + { + vm.selected.element = element; + datacontext.getElementProperties(vm.threatModelId, vm.diagramId, element.id).then(onGetElementProperties); + } + + function select(element) + { + var elementId = null; + + if (element) + { + elementId = element.id; + } + + $location.search('element', elementId); + scope.$apply(); + } + + function onGetElementProperties(data) + { + vm.selected.elementProperties = data; + //this could be made more efficient - only add to the cache when dirty? + elementPropertiesCache[vm.selected.elementProperties.elementId] = vm.selected.elementProperties; + } + + function removeElement(element, graph, clearing) + { + vm.dirty = true; + addToDeletedElements(element); + vm.selected = {}; + $location.search('element', null); + //scope.$apply cause an exception when clearing all elements (digest already in progress) + if (!clearing) { scope.$apply() } + } + + function newProcess() + { + var process = diagramming.newProcess(vm.graph); + elementPropertiesCache[process.id] = { threatModelId: vm.threatModelId, diagramId: vm.diagramId, elementId: process.id, threats: [] }; + } + + function newStore() + { + var store = diagramming.newStore(vm.graph); + elementPropertiesCache[store.id] = { threatModelId: vm.threatModelId, diagramId: vm.diagramId, elementId: store.id, threats: [] }; + } + + function newActor() + { + var actor = diagramming.newActor(vm.graph); + elementPropertiesCache[actor.id] = { threatModelId: vm.threatModelId, diagramId: vm.diagramId, elementId: actor.id, threats: [] }; + } + + function newFlow(source, target) { + + var flow = diagramming.newFlow(vm.graph, source, target) + elementPropertiesCache[flow.id] = { threatModelId: vm.threatModelId, diagramId: vm.diagramId, elementId: flow.id, threats: [] }; + } + + function newBoundary() { + var boundary = diagramming.newBoundary(vm.graph); + elementPropertiesCache[boundary.id] = { threatModelId: vm.threatModelId, diagramId: vm.diagramId, elementId: boundary.id, threats: []}; + } + + function addDirtyEventHandlers() { + + vm.graph.on('change add', setDirty); + + function setDirty() + { + vm.dirty = true; + vm.graph.off('change add', setDirty) + scope.$apply(); + } + } + + function flushElementPropertiesCache() + { + for (var key in elementPropertiesCache) + { + if (elementPropertiesCache.hasOwnProperty(key)) + { + datacontext.saveElementProperties(elementPropertiesCache[key]); + } + } + } + + function flushDeletedElements() + { + for (var key in deletedElements) + { + if (deletedElements.hasOwnProperty(key)) + { + datacontext.deleteElementProperties(vm.threatModelId, vm.diagramId, key); + } + } + + deletedElements = {}; + } + + function addToDeletedElements(element) + { + delete elementPropertiesCache[element.id]; + deletedElements[element.id] = element; + } + } +})(); diff --git a/td/public/app/diagrams/diagramdirectives.js b/td/public/app/diagrams/diagramdirectives.js new file mode 100644 index 000000000..57bdacfbd --- /dev/null +++ b/td/public/app/diagrams/diagramdirectives.js @@ -0,0 +1,277 @@ +(function () { + 'use strict'; + + var app = angular.module('app'); + + app.directive('tmtStencil', ['common', function (common) { + + var directive = { + link: link, + restrict: 'E', + scope: { + shape: '=', + action: '&', + padding: '=', + scale: '=' + } + }; + + return directive; + + function link(scope, element, attrs) { + + if (!scope.scale) { + scope.scale = 1.0; + } + + if (!scope.padding) { + scope.padding = 0.0; + } + + var graph = new joint.dia.Graph; + var ShapeClass = common.utils.stringToFunction(scope.shape.className); + var cell = new ShapeClass(); + + if (cell.isLink()) { + var diagram = linkStencil(cell, scope.shape.label, element, scope.scale, scope.padding, graph); + } + else { + var diagram = elementStencil(cell, scope.shape.label, element, scope.scale, scope.padding, graph) + } + + diagram.on('cell:pointerclick', scope.action); + var toolTip = 'Add a new ' + scope.shape.label + ' to the model'; + cell.attr({'.tooltip': { text: toolTip }}); + graph.addCell(cell); + } + + function linkStencil(shape, label, element, scale, padding, graph) { + + var elementWidth = $(element).parent('div').width(); + shape.attributes.source = { x: (1.0 - scale) * elementWidth + padding, y: padding }; + shape.attributes.target = { x: scale * elementWidth - padding, y: 0.5 * scale * elementWidth - padding }; + shape.setLabel(label); + + return newDiagram(0.5 * elementWidth + 2.0 * padding, elementWidth, 1, graph, element[0], false); + } + + function elementStencil(shape, label, element, scale, padding, graph) { + + var elementWidth = $(element).parent('div').width(); + shape.resize(shape.get('size').width * scale, shape.get('size').height * scale); + var shapeHeight = shape.get('size').height; + shape.translate(0.5 * (elementWidth - shape.get('size').width), padding); + shape.attr('text/text', label); + + return newDiagram(shapeHeight + 2.0 * padding, elementWidth, 1, graph, element[0], false); + } + + }]); + + app.directive('tmtDiagram', ['common', function (common) { + + var directive = { + link: link, + restrict: 'E', + scope: { + height: '=', + width: '=', + gridSize: '=', + graph: '=', + select: '&', + newFlow: '&', + initialiseGraph: '&', + interactive: '=' + } + }; + + var selected = null; + var selectOnScope = null; + var getLogFn = common.logger.getLogFn; + var log = getLogFn(); + + return directive; + + function link(scope, element, attrs) { + + $(element).parent().height(scope.height); + var diagram = newDiagram(scope.height - 10, scope.width - 10, scope.gridSize, scope.graph, element[0], scope.interactive); + + selectOnScope = scope.select; + + scope.graph.on('add', function (newCell) { newCell.translate($(element).parent().scrollLeft(), $(element).parent().scrollTop())}); + + diagram.on('cell:pointerclick', function (cellView, evt, x, y) { + if (!cellView.model.isLink()) { + + if (cellView._action == 'linkFrom') { + + addLinkFrom(cellView); + + } + else if (cellView._action == 'removeLinkFrom') { + + removeLinkFrom(cellView); + + } + else { + + if (selected && !selected.model.isLink() && selected.linkFrom) { + + scope.newFlow({ source: selected.model, target: cellView.model }); + removeLinkFrom(selected); + } + + setSelected(cellView); + } + } + }); + + diagram.on('blank:pointerclick', function (evt, x, y) { + + if (selected && !selected.model.isLink()) { + removeLinkFrom(selected); + } + + setSelected(null); + }); + + diagram.on('link:options', function (evt, cellView, x, y) { + + if (selected && !selected.model.isLink()) { + removeLinkFrom(selected); + } + + setSelected(cellView); + }); + + diagram.on('cell:pointermove', function (cellView, evt, x, y) { + + var bbox = cellView.getBBox(); + var constrained = false; + var constrainedX = x; + var constrainedY = y; + + //minimum x + if (bbox.x <= 0) { + constrainedX = x + scope.gridSize; + constrained = true; + } + + //expand the diagram right + if (bbox.x + bbox.width >= diagram.options.width) { + diagram.setDimensions(bbox.x + bbox.width, diagram.options.height); + $(element).parent().scrollLeft(diagram.options.width - scope.width); + } + + //scroll the diagram left + if (bbox.x <= $(element).parent().scrollLeft()) { + $(element).parent().scrollLeft(bbox.x); + } + + //scroll the diagram right + if (bbox.x + bbox.width - $(element).parent().scrollLeft() >= $(element).parent().width() && bbox.x + bbox.width < diagram.options.width) { + $(element).parent().scrollLeft(bbox.x + bbox.width - $(element).parent().width()); + } + + //minimum y + if (bbox.y <= 0) { + constrainedY = y + scope.gridSize; + constrained = true; + } + + //expand the diagram down + if (bbox.y + bbox.height >= diagram.options.height) { + diagram.setDimensions(diagram.options.width, bbox.y + bbox.height); + $(element).parent().scrollTop(diagram.options.height - scope.height); + } + + //scroll the diagram up + if (bbox.y <= $(element).parent().scrollTop()) { + $(element).parent().scrollTop(bbox.y); + } + + //scroll the diagram up + if (bbox.y <= $(element).parent().scrollTop()) { + $(element).parent().scrollTop(bbox.y); + } + + //scroll the diagram down + if (bbox.y + bbox.height - $(element).parent().scrollTop() >= $(element).parent().height() && bbox.y + bbox.height < diagram.options.height) { + $(element).parent().scrollTop(bbox.y + bbox.height - $(element).parent().height()); + } + + if (constrained) + { + cellView.pointermove(evt, constrainedX, constrainedY); + } + }); + + diagram.setSelected = function (cell) { + + if (selected) + { + selected.setUnselected(); + } + + if (cell) + { + var cellView = diagram.findViewByModel(cell); + + if (cellView) + { + cellView.setSelected(); + selected = cellView; + } + } + else + { + selected = null; + } + } + + scope.initialiseGraph({ diagram: diagram }); + } + + function addLinkFrom(cellView) { + cellView.linkFrom = true; + V(cellView.$el.find('.element-tool-link')[0]).addClass("linking"); + log('Select another model element to add a data flow'); + } + + function removeLinkFrom(cellView) { + cellView.linkFrom = false; + V(cellView.$el.find('.element-tool-link')[0]).removeClass("linking"); + } + + function setSelected(cellView) + { + var element = null; + + if (cellView) + { + element = cellView.model; + } + + selectOnScope({ element: element }); + } + + }]); + + function newDiagram(height, width, gridSize, graph, target, interactive) { + + var paper = new joint.dia.Paper({ + el: target, + width: width, + height: height, + gridSize: gridSize, + model: graph, + interactive: interactive + }); + + return paper; + } + +})(); + + diff --git a/td/public/app/diagrams/diagrameditor.html b/td/public/app/diagrams/diagrameditor.html new file mode 100644 index 000000000..daa430923 --- /dev/null +++ b/td/public/app/diagrams/diagrameditor.html @@ -0,0 +1,105 @@ +
+

+ Home + Threat models + Threat model detail + Edit diagram +

+
+
+ + + + Edit diagram + +
+
+ +
+
+
+ + + Edit threats + +
+
+ +
+
+ The selected element is out of scope +
+
+
+ Select an element in the diagram to see or edit its threats +
+
+
+
+ +
+
+
Threat model diagram: {{vm.diagramTitle}}
+
+
+
+
+ + + + + + + + + +
+
+
+
+ +
+
+
+
+ +
+
+
Properties
+
+
+ +
+
+ Select an element in the diagram to see or edit its properties +
+
+
+
+
+
+
+

oooops!

+

+ It looks like you tried to edit a threat model diagram that doesn't exist. Maybe you typed the + address wrong? Or if you clicked a link to get here, the diagram might have been + deleted since you made the link +

+

+ Take me back to the list of threat models +

+
+
+
diff --git a/td/public/app/diagrams/elementPropertyDirectives.js b/td/public/app/diagrams/elementPropertyDirectives.js new file mode 100644 index 000000000..fca6047f8 --- /dev/null +++ b/td/public/app/diagrams/elementPropertyDirectives.js @@ -0,0 +1,167 @@ +(function () { + 'use strict'; + + var app = angular.module('app'); + + app.directive('tmtModalClose', [function () { + + var directive = + { + link: link, + templateUrl: function (elem, attrs) { return attrs.templateUrl }, + restrict: 'E', + scope: + { + action: '&', + newClass: '@', + } + }; + + var selectedElement = null; + + return directive; + + function link(scope, element, attrs) { + + scope.onAction = function () { + + var el = $("[role='dialog']"); + var windowClass = el.attr("window-class"); + el.removeClass(windowClass); + el.addClass(scope.newClass); + scope.action(); + } + } + + }]); + + + app.directive('tmtElementProperties', ['common', function (common) { + + var directive = + { + link: link, + templateUrl: './app/diagrams/ElementPropertiesPane.html', + restrict: 'E', + scope: + { + selected: '=', + elementType: '@', + edit: '&' + } + }; + + var selectedElement = null; + + return directive; + + function link(scope, element, attrs) + { + } + + }]); + + app.directive('tmtElementThreats', ['$routeParams', '$location', 'common', 'dialogs', function ($routeParams, $location, common, dialogs) { + + var directive = + { + link: link, + templateUrl: './app/diagrams/ThreatSummaryPane.html', + restrict: 'E', + scope: + { + threats: '=', + save: '&' + } + }; + + var newThreat = initialiseThreat(); + var editIndex = null; + var originalThreat = {}; + var getLogFn = common.logger.getLogFn; + var log = getLogFn('tmtElementThreats'); + var logError = getLogFn('tmtElementThreats', 'error'); + + return directive; + + function link(scope, element, attrs) + { + if (!scope.threats) + { + scope.threats = []; + } + + scope.onNewThreat = function () { + dialogs.confirm('./app/diagrams/ThreatEditPane.html', scope.addThreat, function () { return {heading: 'New Threat', threat: newThreat, editing: true }; }, reset); + } + + scope.onEditThreat = function (index) { + editIndex = index; + originalThreat = angular.copy(scope.threats[index]); + $location.search('threat', originalThreat.id); + dialogs.confirm('./app/diagrams/ThreatEditPane.html', scope.editThreat, function () { return { heading: 'Edit Threat', threat: scope.threats[index], editing: true }; }, scope.cancelEdit); + } + + scope.removeThreat = function (index) { + scope.threats.splice(index,1); + scope.save(); + } + + scope.addThreat = function () { + scope.threats.push(newThreat); + scope.save({ threat: newThreat }); + reset(); + } + + scope.editThreat = function(index) { + scope.save({ threat: scope.threats[index] }); + reset(); + } + + scope.cancelEdit = function() { + scope.threats[editIndex] = originalThreat; + reset(); + } + + var threatId = $routeParams.threat; + + if (angular.isDefined(threatId)) + { + var matchingIndex = -1; + + scope.threats.forEach(function (threat, index) { + if (threat.id == threatId) + { + matchingIndex = index; + } + }) + + if (matchingIndex >= 0) + { + scope.onEditThreat(matchingIndex) + } + else + { + logError('Invalid threat ID') + $location.search('threat', null); + } + } + } + + function reset() + { + initialiseThreat(); + editIndex = null; + $location.search('threat', null); + } + + function initialiseThreat() + { + return { status: 'Open', severity: 'Medium' }; + } + + }]); + +})(); + + diff --git a/td/public/app/diagrams/joint.shapes.tm.js b/td/public/app/diagrams/joint.shapes.tm.js new file mode 100644 index 000000000..e41d68584 --- /dev/null +++ b/td/public/app/diagrams/joint.shapes.tm.js @@ -0,0 +1,226 @@ + +if (typeof exports === 'object') { + + var joint = { + util: require('../src/core').util, + shapes: { + basic: require('./joint.shapes.basic') + }, + dia: { + Element: require('../src/joint.dia.element').Element, + Link: require('../src/joint.dia.link').Link + } + }; +} + +joint.shapes.tm = {}; + +joint.shapes.tm.Flow = joint.dia.Link.extend({ + + arrowheadMarkup: [ + '', + '', + '' + ].join(''), + + setLabel: function (labelText) { this.attributes.labels = [{ position: .5, attrs: { text: { text: labelText, 'font-weight': '400', 'font-size': 'small' } } }]; }, + + defaults: joint.util.deepSupplement({ + type: 'tm.Flow', + attrs: { + '.marker-target': { d: 'M 10 0 L 0 5 L 10 10 z' } + }, + smooth: true + }, joint.dia.Link.prototype.defaults) +}); + +joint.shapes.tm.Boundary = joint.dia.Link.extend({ + + markup: [ + '', + '', + '', + '', + '', + '', + '', + '' + ].join(''), + + arrowheadMarkup: [ + '', + '', + '' + ].join(''), + + setLabel: function (labelText) { this.attributes.labels = [{ position: .5, attrs: { text: { text: labelText, 'font-weight': '400', 'font-size': 'small' } } }]; }, + + defaults: joint.util.deepSupplement({ + type: 'tm.Boundary', + attrs: { + '.connection': { stroke: 'red', 'stroke-dasharray': '10,5' } + }, + smooth: true + }, joint.dia.Link.prototype.defaults) +}); + +joint.shapes.tm.toolElement = joint.shapes.basic.Generic.extend({ + + toolMarkup: ['', + '', + '', + 'Remove this element from the model', + '', + '', + ' ', + 'Link from here', + '', + ''].join(''), + + defaults: joint.util.deepSupplement({ + attrs: { + text: { 'font-weight': 400, 'font-size': 'small', fill: 'black', 'text-anchor': 'middle', 'ref-x': .5, 'ref-y': .5, 'y-alignment': 'middle' }, + }, + }, joint.shapes.basic.Generic.prototype.defaults) + +}); + +joint.shapes.tm.Process = joint.shapes.tm.toolElement.extend({ + + markup: '</g><text/></g>', + + defaults: joint.util.deepSupplement({ + type: 'tm.Process', + attrs: { + '.element-process': { 'stroke-width': 1, r: 30, stroke: 'black', transform: 'translate(30, 30)' }, + text: { ref: '.element-process'} + }, + size: { width: 100, height: 100 } + }, joint.shapes.tm.toolElement.prototype.defaults) +}); + +joint.shapes.tm.Store = joint.shapes.tm.toolElement.extend({ + + markup: '<g class="rotatable"><g class="scalable"><rect/><path class="element-store"/><title class="tooltip"/></g><text/></g>', + + defaults: joint.util.deepSupplement({ + + type: 'tm.Store', + attrs: { + rect: { fill: 'white', stroke: 'white', 'follow-scale': true, width: 160, height: 80 }, + '.element-store': { d: 'M0 0 H160 M0 80 H160', stroke: 'black', fill: 'white', 'stroke-width': 1, 'follow-scale': true}, + text: { ref: 'path' } + }, + size: { width: 160, height: 80 } + }, joint.shapes.tm.toolElement.prototype.defaults) +}); + +joint.shapes.tm.Actor = joint.shapes.tm.toolElement.extend({ + + markup: '<g class="rotatable"><g class="scalable"><rect/><title class="tooltip"/></g><text/></g>', + + defaults: joint.util.deepSupplement({ + + type: 'tm.Actor', + attrs: { + rect: { fill: 'white', stroke: 'black', 'stroke-width': 1, 'follow-scale': true, width: 160, height: 80 }, + text: { ref: 'rect'} + }, + size: { width: 160, height: 80 } + }, joint.shapes.tm.toolElement.prototype.defaults) +}); + +joint.shapes.tm.ToolElementView = joint.dia.ElementView.extend({ + + initialize: function() { + + joint.dia.ElementView.prototype.initialize.apply(this, arguments); + }, + + render: function () { + + joint.dia.ElementView.prototype.render.apply(this, arguments); + + this.renderTools(); + this.update(); + + return this; + }, + + renderTools: function () { + + var toolMarkup = this.model.toolMarkup || this.model.get('toolMarkup'); + + if (toolMarkup) { + + var nodes = V(toolMarkup); + V(this.el).append(nodes); + + } + + return this; + }, + + pointerclick: function (evt, x, y) { + + this._dx = x; + this._dy = y; + this._action = ''; + + var className = evt.target.parentNode.getAttribute('class'); + + switch (className) { + + case 'element-tool-remove': + this.model.remove(); + return; + break; + + case 'element-tool-link': + this._action = 'linkFrom'; + break; + + case 'element-tool-link linking': + this._action = 'removeLinkFrom'; + break; + + default: + } + + joint.dia.CellView.prototype.pointerclick.apply(this, arguments); + }, + + setSelected: function () { + this.highlight(); + }, + + setUnselected: function () { + this.unhighlight(); + } +}); + +joint.shapes.tm.StoreView = joint.shapes.tm.ToolElementView; + +joint.shapes.tm.ActorView = joint.shapes.tm.ToolElementView; + +joint.shapes.tm.ProcessView = joint.shapes.tm.ToolElementView; + +joint.shapes.tm.LinkView = joint.dia.LinkView.extend({ + + setSelected: function () { + this.highlight(); + }, + setUnselected: function () { + this.unhighlight(); + } +}); + +joint.shapes.tm.FlowView = joint.shapes.tm.LinkView; + +joint.shapes.tm.BoundaryView = joint.shapes.tm.LinkView; + +if (typeof exports === 'object') { + + module.exports = joint.shapes.tm; +} + diff --git a/td/public/app/diagrams/modalAccept.html b/td/public/app/diagrams/modalAccept.html new file mode 100644 index 000000000..5c6a12916 --- /dev/null +++ b/td/public/app/diagrams/modalAccept.html @@ -0,0 +1,3 @@ +<button class="btn btn-primary" ng-disabled="parameter.editing && (!threatEditForm.$dirty || !threatEditForm.$valid)" ng-click="onAction()"> + Accept +</button> \ No newline at end of file diff --git a/td/public/app/diagrams/modalIgnore.html b/td/public/app/diagrams/modalIgnore.html new file mode 100644 index 000000000..3901a63d1 --- /dev/null +++ b/td/public/app/diagrams/modalIgnore.html @@ -0,0 +1,3 @@ +<button class="btn btn-default" ng-click="onAction()"> + Ignore +</button> \ No newline at end of file diff --git a/td/public/app/directives.js b/td/public/app/directives.js new file mode 100644 index 000000000..96487410d --- /dev/null +++ b/td/public/app/directives.js @@ -0,0 +1,49 @@ +(function () { + 'use strict'; + + var app = angular.module('app'); + + app.directive('tmtFileReadString', [function () { + + var directive = { + template: '<a href=""><span class="fa fa-folder-open"></span> {{labelText}}</a><input type="file" id="fileReader" style="display: none" />', + link: link, + restrict: 'E', + scope: { + labelText: '@', + action: '&' + } + }; + + return directive; + + function link(scope, element, attrs) { + + var fileSelect = $(element).children("#fileReader"); + fileSelect.on('change', function () { readFile() }); + + $(element).click(function (e) { + if (fileSelect) { + fileSelect[0].click(); + } + }); + + function readFile() { + var reader = new FileReader(); + reader.onloadend = onLoadEnd; + reader.readAsText(fileSelect[0].files[0]); + + function onLoadEnd() + { + var content = reader.result; + scope.action({ content: content }); + } + + } + } + + }]); + +})(); + + diff --git a/td/public/app/layout/shell.html b/td/public/app/layout/shell.html new file mode 100644 index 000000000..87cee79b5 --- /dev/null +++ b/td/public/app/layout/shell.html @@ -0,0 +1,8 @@ +<div ng-controller="shell as vm"> + <header ng-if="!vm.suppressBanner" class="clearfix"> + <div ng-include="'/app/layout/topnav.html'"></div> + </header> + <section id="content"> + <div ng-view></div> + </section> +</div> diff --git a/td/public/app/layout/shell.js b/td/public/app/layout/shell.js new file mode 100644 index 000000000..ac39e87dc --- /dev/null +++ b/td/public/app/layout/shell.js @@ -0,0 +1,40 @@ +(function () { + 'use strict'; + + var controllerId = 'shell'; + angular.module('app').controller(controllerId, + ['$rootScope', '$location', 'common', 'config', shell]); + + function shell($rootScope, $location, common, config) { + var vm = this; + var logSuccess = common.logger.getLogFn(controllerId, 'success'); + var events = config.events; + + activate(); + + function activate() + { + if (angular.isDefined($location.search().suppressbanner)) + { + vm.suppressBanner = $location.search().suppressbanner; + } + else + { + vm.suppressBanner = false; + } + + logSuccess('Threat Modelling application loaded!', null, true); + common.activateController([], controllerId); + } + + function toggleSpinner(on) { vm.isBusy = on; } + + $rootScope.$on('$routeChangeStart', + function (event, next, current) { } + ); + + $rootScope.$on(events.controllerActivateSuccess, + function (data) { } + ); + }; +})(); \ No newline at end of file diff --git a/td/public/app/layout/structuredExit.html b/td/public/app/layout/structuredExit.html new file mode 100644 index 000000000..9925b8d2d --- /dev/null +++ b/td/public/app/layout/structuredExit.html @@ -0,0 +1,14 @@ +<div> + <div class="modal-header"> + <h3>Are you sure you want to leave this page?</h3> + </div> + <div class="modal-body"> + You have unsaved changes and if you leave this page they will be lost! + Press Cancel to stay where you are and keep the unsaved changes, + or press OK to leave and lose the unsaved changes. + </div> + <div class="modal-footer"> + <button class="btn btn-default" ng-click="onOK()">OK</button> + <button class="btn btn-primary" ng-click="onCancel()">Cancel</button> + </div> +</div> diff --git a/td/public/app/layout/topnav.html b/td/public/app/layout/topnav.html new file mode 100644 index 000000000..abd779e64 --- /dev/null +++ b/td/public/app/layout/topnav.html @@ -0,0 +1,128 @@ +<nav class="navbar navbar-default navbar-fixed-top"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a href="#/" class="navbar-brand"> + <div> + <svg xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + id="svg2" + viewBox="0 0 2305.9131 371.80446" + height="50px" + width="350px"> + <defs id="defs4" /> + <metadata id="metadata7"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g transform="translate(-11.560426,-613.96281)" + id="layer1"> + <path id="path4160" + d="m 1852.0157,959.08791 c -19.19,-4.06843 -20.0894,-4.9564 -17.5033,-17.28201 1.8823,-8.97173 3.615,-10.63682 10.3205,-9.91782 40.8487,4.38003 56.6917,4.56499 65.8563,0.76886 14.3686,-5.95168 23.0608,-18.43104 23.0608,-33.10831 l 0,-12.43329 -15.6767,4.85867 c -19.0925,5.91742 -41.743,3.92734 -59.7276,-5.24771 -22.9549,-11.71073 -33.5214,-32.93665 -33.4747,-67.24423 0.083,-61.18281 39.1096,-89.40738 107.9338,-78.05891 l 28.9981,4.78154 0.8905,74.24518 c 1.2152,101.32334 -2.6906,116.94951 -33.1105,132.46854 -15.3886,7.85072 -54.8373,10.98837 -77.5672,6.16949 z m 70.2892,-93.90239 11.4451,-4.78213 0,-46.02012 c 0,-52.24809 1.2649,-50.02666 -28.4868,-50.02666 -34.5924,0 -50.7215,17.0228 -50.7215,53.53208 0,33.32386 15.6677,51.92048 43.8356,52.03029 6.8653,0.0268 17.6326,-2.10332 23.9276,-4.73346 z m -1090.15859,35.0635 c -20.72082,-7.41552 -31.3613,-16.68679 -40.1169,-34.95471 -20.07999,-41.89544 -5.22288,-103.02334 29.32328,-120.64749 26.02939,-13.27922 57.87634,-11.82627 77.40021,3.53122 13.57717,10.67979 22.58348,31.59223 24.37917,56.60777 l 1.59912,22.27734 -56.4668,0 -56.46683,0 2.00061,10.72611 c 5.71628,30.64769 25.46543,43.80286 61.88423,41.22197 12.87512,-0.91241 25.83505,-2.67033 28.79985,-3.90644 4.29826,-1.79209 5.67624,0.19943 6.80036,9.8285 1.22891,10.52664 0.32574,12.49404 -7.04072,15.3341 -17.16597,6.61828 -53.57709,6.60901 -72.09558,-0.0185 z M 894.14118,792.0795 c 0,-5.35821 -4.21428,-12.79519 -11.22118,-19.80207 -9.15586,-9.15585 -13.74188,-11.22119 -24.91648,-11.22119 -22.93658,0 -34.27102,8.20855 -42.98618,31.13112 l -3.22143,8.47302 41.17264,0 41.17263,0 0,-8.58088 z m 94.85364,109.70804 c -22.81153,-8.56906 -32.77752,-23.05068 -33.15659,-48.18002 -0.29241,-19.3826 8.00769,-33.56689 25.46484,-43.51758 11.28235,-6.43104 18.23995,-7.70131 42.37663,-7.73685 l 28.8781,-0.0425 0,-10.97999 c 0,-7.85265 -2.8828,-13.86279 -10.1214,-21.1014 l -10.1214,-10.1214 -29.4828,1.91011 -29.48274,1.91011 0,-11.27402 c 0,-13.91114 6.38884,-16.24976 44.55464,-16.30918 31.6918,-0.0494 45.3089,6.38562 55.784,26.36163 6.1611,11.74927 7.0465,19.95618 8.0492,74.61 l 1.1266,61.40862 -11.0277,2.2361 c -24.9809,5.06547 -70.3518,5.51807 -82.84138,0.8264 z m 62.87668,-47.49655 -0.9639,-25.57767 -25.3179,0 c -22.2543,0 -26.34764,0.96815 -33.82853,8.00108 -13.43875,12.63406 -10.63012,30.06082 6.34088,39.34324 3.63035,1.98566 17.43055,3.65545 30.66705,3.71065 l 24.0663,0.10039 -0.9639,-25.57766 z m 108.4179,48.7834 c -5.1868,-1.66237 -12.4462,-5.70727 -16.1321,-8.98868 -14.3369,-12.76366 -15.6916,-22.52996 -15.6916,-113.1214 l 0,-85.91494 7.981,0 c 4.3895,0 10.3301,-0.90148 13.2014,-2.00327 4.4783,-1.71854 5.2204,1.56522 5.2204,23.1024 l 0,25.10568 31.3533,0 31.3532,0 0,13.20138 0,13.20138 -31.3532,0 -31.3533,0 0.019,40.42921 c 0.02,45.3763 3.6292,63.36914 13.8007,68.81276 6.1287,3.28002 32.2794,2.87679 45.3088,-0.69863 3.0588,-0.83939 5.495,2.49882 7.0545,9.66682 2.1288,9.78381 1.456,11.30995 -6.3225,14.34129 -12.342,4.80986 -43.2902,6.43916 -54.439,2.866 z m 184.349,0.25343 -13.2014,-2.00694 0,-107.26118 0,-107.26121 26.2156,-3.05424 c 52.6937,-6.1391 97.6052,6.9117 122.9771,35.73578 16.6845,18.9545 24.0754,41.84965 24.0754,74.57967 0,32.73001 -7.3909,55.62517 -24.0754,74.57967 -27.1978,30.89851 -77.1341,43.63614 -135.9913,34.68845 z m 75.6983,-27.05101 c 18.3541,-4.62164 35.7769,-19.0911 44.3515,-36.83337 14.7358,-30.49149 11.8884,-76.01208 -6.3276,-101.15863 -14.6618,-20.23985 -31.9662,-27.68105 -68.3425,-29.38848 l -30.5282,-1.43292 0,86.20262 0,86.20262 23.2911,0 c 12.8101,0 29.7102,-1.61633 37.5557,-3.59184 z m 271.6318,25.51073 c -22.8116,-8.56906 -32.7776,-23.05068 -33.1567,-48.18002 -0.2923,-19.3826 8.0077,-33.56689 25.4648,-43.51758 11.2825,-6.43104 18.2401,-7.70131 42.3766,-7.73685 l 28.8782,-0.0425 0,-10.97999 c 0,-7.85265 -2.8828,-13.86279 -10.1215,-21.1014 l -10.1214,-10.1214 -29.4826,1.91011 -29.4829,1.91011 0,-11.27402 c 0,-13.91114 6.3889,-16.24976 44.5548,-16.30918 31.6917,-0.0494 45.3088,6.38562 55.784,26.36163 6.1611,11.74927 7.0465,19.95618 8.0491,74.61 l 1.1265,61.40862 -11.0276,2.2361 c -24.981,5.06547 -70.3518,5.51807 -82.8413,0.8264 z m 62.8766,-47.49655 -0.964,-25.57767 -25.3178,0 c -22.2543,0 -26.3477,0.96815 -33.8285,8.00108 -13.4388,12.63406 -10.6301,30.06082 6.3408,39.34324 3.6304,1.98566 17.4306,3.65545 30.6671,3.71065 l 24.0663,0.10039 -0.9639,-25.57766 z m 303.1578,48.59221 c -45.2741,-13.57044 -67.322,-73.82215 -45.2567,-123.67505 25.1062,-56.72322 103.6757,-58.96939 133.1376,-3.80621 6.0855,11.39376 7.321,18.99897 7.321,45.06052 0,26.06155 -1.2355,33.66673 -7.321,45.06049 -17.0139,31.85627 -53.9114,47.54223 -87.8809,37.36025 z m 47.5607,-31.93639 c 14.0301,-11.8056 19.6064,-26.16403 19.6064,-50.48435 0,-24.32034 -5.5763,-38.67875 -19.6064,-50.48436 -19.5493,-16.44958 -48.7744,-10.32659 -63.3641,13.27546 -11.064,17.89848 -11.0728,56.50513 -0.017,74.39047 14.6537,23.70582 43.7578,29.81437 63.3808,13.30278 z m -1739.47767,-63.68573 0,-95.71 -34.65363,0 -34.65362,0 0,-13.20138 0,-13.20137 84.1588,0 84.1588,0 0,13.20137 0,13.20138 -34.65362,0 -34.65364,0 0,95.71 0,95.71 -14.85154,0 -14.85155,0 0,-95.71 z m 128.71346,-23.10242 0,-118.81241 7.98094,0 c 4.38952,0 10.33013,-0.90145 13.20138,-2.00327 4.59167,-1.76198 5.22044,3.05068 5.22044,39.95724 0,36.94333 0.6255,41.72049 5.23132,39.95306 11.94653,-4.58431 40.24639,-5.75765 53.39314,-2.21372 18.50553,4.98844 35.01014,19.87715 39.81604,35.91775 2.30687,7.69966 3.87022,35.75991 3.87022,69.46572 l 0,56.54805 -13.20138,0 -13.2014,0 -0.0786,-48.68009 c -0.0432,-26.77405 -1.45069,-54.6207 -3.12754,-61.88146 -4.48254,-19.40926 -16.1964,-28.05292 -38.01722,-28.05292 -9.76414,0 -21.56258,1.44839 -26.21872,3.21864 l -8.46572,3.21867 0,66.08857 0,66.08859 -13.20139,0 -13.20137,0 0,-118.81242 z m 174.91831,41.47942 0,-77.33297 25.17725,-5.60141 c 22.73564,-5.05819 61.4552,-5.02651 66.53618,0.0544 0.81872,0.81874 0.52145,6.6438 -0.6606,12.94461 l -2.14916,11.456 -17.72437,-1.82931 c -9.74839,-1.00612 -23.06852,-0.82674 -29.60027,0.39861 l -11.87592,2.22794 0,67.50752 0,67.50752 -14.85157,0 -14.85154,0 0,-77.33299 z m 877.8919,0 0,-77.33297 25.1772,-5.60141 c 22.7357,-5.05819 61.4552,-5.02651 66.5363,0.0544 0.8186,0.81874 0.5215,6.6438 -0.6606,12.94461 l -2.1491,11.45603 -17.7244,-1.82931 c -9.7485,-1.00612 -23.0687,-0.82673 -29.6003,0.39862 l -11.8759,2.22793 0,67.50753 0,67.50752 -14.8517,0 -14.8515,0 0,-77.333 z m 650.1682,-1.39162 0,-78.72459 22.9129,-3.78402 c 43.8844,-7.24735 68.5031,-3.64947 87.1688,12.73927 15.8256,13.89503 18.6317,27.74254 18.6317,91.94591 l 0,56.54805 -13.2015,0 -13.2014,0 -0.078,-48.68009 c -0.1255,-78.1092 -5.9631,-89.93438 -44.39,-89.93438 -33.848,0 -31.4392,-5.46374 -31.4392,71.3105 l 0,67.30397 -13.2013,0 -13.2013,0 0,-78.72462 z" + style="fill:#ffffff" /> + <g style="fill:#000000" + transform="translate(-1001.7512,190.26858)" + id="layer1-1"> + <path d="m 1057.5436,709.86713 c -5.6788,0.73545 -11.1484,1.63398 -14.8584,4.52718 -3.534,2.75591 -5.4452,7.41402 -5.4452,11.8417 0,9.07594 9.1246,16.36887 20.3036,16.36887 5.5124,0 9.3972,-3.76635 13.0628,-6.6523 3.7682,-2.96666 7.2408,-5.11601 7.2408,-9.71657 0,-10.28093 -9.1246,-17.81663 -20.3036,-16.36888 z m 0.423,2.1297 c 5.7442,0.002 9.3152,0.84657 12.861,3.87799 3.4195,2.92354 4.769,5.52393 4.769,9.79175 0,4.49048 -2.7728,4.85771 -6.5526,7.74209 -3.5374,2.69946 -6.4941,6.49709 -11.7824,6.49709 -5.3104,0 -8.5671,-0.53723 -12.1088,-3.25667 -3.7538,-2.88231 -5.0982,-5.94013 -5.0982,-10.41307 0,-4.11761 0.2867,-7.04432 3.5309,-9.79269 3.6048,-3.05396 8.5165,-4.44794 14.3811,-4.44649 z m 124.2452,-288.30185 c -1.826,-0.0336 -4.0585,1.06603 -7.2034,3.12911 -3.4657,2.27362 -8.5165,6.32239 -11.2233,8.99643 -4.6835,4.62698 -5.4661,4.933 -16.192,6.33859 -6.1988,0.81233 -15.5879,3.05706 -20.8653,4.98761 -29.2909,10.71514 -34.137,12.03655 -37.5666,10.2461 -4.1054,-2.1433 -13.6194,-3.61904 -16.7875,-2.6039 -2.728,0.87411 -5.0314,6.44459 -4.9851,12.05616 0.017,2.06506 1.3951,7.56942 3.0624,12.23126 4.6628,13.03725 4.8991,14.49362 2.1812,13.43134 -1.252,-0.48933 -4.8399,-1.19929 -7.9733,-1.57776 -5.5913,-0.67533 -5.6973,-0.62542 -5.6973,2.67108 0,1.84741 -0.6073,6.69093 -1.3491,10.76358 -1.3215,7.2554 -1.2704,7.53903 2.5084,14.06444 2.1211,3.66285 6.4204,9.1544 9.5547,12.20261 6.2783,6.10597 6.4387,6.69286 8.3703,30.78343 1.0206,12.729 2.0919,15.74847 7.8839,22.2208 3.954,4.41843 8.5803,7.29895 15.7067,9.53374 2.4672,0.7737 5.2295,1.47153 8.3736,2.12719 10.6707,2.22513 12.1986,3.25657 15.8998,10.73824 3.3351,6.74166 3.292,7.69082 -0.6064,13.52274 -3.876,5.79852 -5.73,7.34789 -10.9495,9.14398 -3.4363,1.18246 -4.2074,1.0636 -5.6591,-0.87091 -1.9798,-2.63818 -2.1831,-9.80452 -0.4886,-17.22437 1.869,-8.18415 -2.4797,-12.60862 -9.4478,-10.75697 -1.1776,0.31292 -2.4275,0.80028 -3.7375,1.48418 -9.9825,5.21148 -26.8099,31.92759 -33.6863,53.48208 l -2.7374,8.57915 c -7.7558,1.44517 -10.5283,5.07152 -15.7318,8.97113 -0.5989,-0.73859 -4.6775,-0.39123 -8.7073,1.8541 -3.4905,3.12197 -4.4695,5.91176 -8.5622,8.80267 -4.6768,3.25548 -7.0321,7.88719 -11.0957,12.54503 -3.1845,16.34901 0.7706,15.52941 3.2009,22.02152 0.899,2.40157 4.2459,3.59777 6.6362,4.39527 2.0038,0.66855 1.507,0.37753 2.8061,0.81035 3.7328,1.24371 1.3134,4.71064 1.0088,9.10435 -1.4115,20.36276 3.62,26.31357 6.4138,32.31055 4.1138,8.88456 7.5113,17.27193 18.5445,22.13163 8.1112,4.13126 15.7341,5.59099 30.6598,5.87284 2.4989,0.0472 4.5635,0.0552 6.3811,-0.002 5.5054,-0.17384 8.7254,-0.94892 14.7285,-3.06194 l 9.3365,-3.28654 c 0.4901,2.74516 5.5728,2.72991 7.9703,3.67078 5.247,2.05907 10.4237,3.57393 10.4237,3.57393 0.3469,0.56672 9.4203,0.96749 20.1629,0.88963 17.9142,-0.12973 20.0106,-0.3778 25.3105,-2.99148 l 5.778,-2.84944 3.2172,3.02341 c 1.7693,1.66313 4.0262,3.35563 5.0157,3.76108 3.5519,1.45544 25.7302,-0.16214 31.6981,-2.31214 5.1029,-1.83839 7.7119,-1.97936 19.1028,-1.03276 33.213,2.76012 72.6598,-3.99004 83.1175,-14.22298 2.207,-2.15954 4.0134,-4.6671 4.0134,-5.57227 0,-0.90516 -3.1039,-3.03031 -6.897,-4.72227 -29.9267,-13.34919 -38.8166,-19.12816 -47.5182,-30.89024 -2.6725,-3.61239 -3.4863,-6.41771 -4.3929,-15.13574 -0.6122,-5.88586 -2.1684,-14.516 -3.4583,-19.17758 -1.9293,-6.97215 -2.0878,-9.01178 -0.8921,-11.50236 1.562,-3.25384 3.6173,-3.51986 13.7098,-1.77264 7.0062,1.21289 9.1633,-1.0396 13.0512,-13.62844 5.3276,-17.25093 3.4996,-26.75426 -9.7292,-50.5919 -4.0845,-7.35999 -8.9907,-13.89251 -15.1124,-20.12226 -7.6623,-7.7976 -11.1861,-10.29095 -22.788,-16.11894 -25.8243,-12.97249 -33.0276,-9.53316 -23.9188,11.41868 4.1673,9.58574 4.4679,12.76319 1.3686,14.43769 -2.9101,1.57233 -4.2134,-1.28061 -7.4269,-16.25437 -1.3367,-6.22853 -4.0455,-16.13308 -6.0201,-22.00942 -5.3641,-15.96377 -5.6699,-22.0783 -1.6522,-33.08456 4.5148,-12.36843 4.9388,-18.68611 1.8398,-27.42754 -1.3809,-3.89531 -2.6947,-8.17203 -2.9195,-9.50399 -0.2248,-1.33196 -0.8122,-3.882 -1.3044,-5.66587 -0.5942,-2.15391 -0.085,-5.61115 1.516,-10.29234 1.3256,-3.87693 2.7761,-8.86445 3.2238,-11.08397 1.1916,-5.90833 -1.6615,-19.56698 -4.9099,-23.50569 -1.5075,-1.82786 -3.0842,-4.41509 -3.5041,-5.75063 -1.1268,-3.58407 -4.431,-2.91849 -7.4978,1.5106 l -2.6992,3.89762 -0.012,-8.45915 c -0.01,-6.37716 -0.722,-9.99964 -2.8988,-14.71955 -2.5045,-5.43033 -4.3035,-7.90237 -6.9722,-7.95157 z m -2.1757,4.17948 c 1.0252,0.19019 3.0788,2.77692 4.563,5.74842 2.1095,4.22325 2.6981,7.46138 2.6981,14.83296 0,5.18669 -0.4049,9.40396 -0.8997,9.37189 -0.4948,-0.0321 -2.4911,-1.74168 -4.4365,-3.79963 -3.9667,-4.19608 -14.1896,-9.43202 -18.4518,-9.45006 -1.6971,-0.007 -2.6058,-0.60706 -2.3088,-1.52492 0.8479,-2.61984 16.8823,-15.54107 18.8357,-15.17866 z m -32.5553,16.96453 c 2.2397,0.0107 4.4971,0.26706 6.0495,0.73328 2.4098,0.72372 6.9312,1.64158 10.0465,2.04018 6.9762,0.89262 16.4953,7.05621 18.6743,12.09031 0.8648,1.99794 2.0917,4.44999 2.7254,5.44896 0.6337,0.99897 2.2001,3.99506 3.4811,6.65898 2.8102,5.84379 5.2761,9.08231 6.9177,9.08231 0.6694,0 1.5411,1.63434 1.9369,3.63227 0.3958,1.99794 1.3364,3.63227 2.0896,3.63227 0.8396,0 1.0821,-1.05316 0.6281,-2.72393 -2.3553,-8.66901 -2.2705,-11.96771 0.4003,-15.61467 3.006,-4.10481 2.6389,-5.49826 -0.939,-3.56511 -1.3222,0.7144 -2.8034,3.07421 -3.2925,5.24416 l -0.89,3.94606 -0.9891,-3.73135 c -0.5441,-2.0521 -2.0571,-4.70677 -3.3623,-5.89928 -2.3462,-2.14357 -2.3153,-2.24227 2.6654,-8.68044 2.7708,-3.58166 5.3669,-6.51254 5.7703,-6.51254 0.4034,0 1.6375,2.0432 2.7418,4.54061 1.1043,2.4974 2.9035,6.17605 3.9981,8.17397 1.2474,2.27698 1.993,6.42311 1.9969,11.1104 0,6.16395 -0.5637,8.30905 -3.2402,12.20812 -3.0906,4.50249 -3.1925,5.11322 -2.131,12.68046 0.6134,4.37254 1.7647,9.17576 2.5585,10.6733 1.7602,3.54899 5.8128,13.54405 2.9752,22.0061 -0.5336,6.49061 -2.9558,10.59064 -6.8413,18.7691 -7.0918,14.92734 -12.0251,21.38462 -23.1053,30.24945 -11.8908,9.51329 -19.1194,13.04117 -30.2586,14.76689 -4.744,0.73495 -8.7917,1.2654 -8.9952,1.17809 -0.685,-0.29396 -14.713,-2.1741 -20.4715,-2.74375 -5.2585,-0.52018 -10.8508,-1.84154 -15.8856,-3.61355 -6.3747,-2.24353 -11.8534,-5.21048 -14.6129,-8.19929 -4.4776,-4.84972 -7.5163,-13.17841 -7.5447,-20.68048 -0.014,-3.817 -0.6496,-10.62804 -1.4113,-15.13574 -1.0243,-6.06214 -1.0579,-14.58073 -0.1297,-32.72233 l 1.2541,-24.52635 4.369,-9.28599 c 4.2404,-9.01463 4.4211,-9.20959 6.1945,-6.65348 2.7522,3.96687 4.5076,3.28149 3.7451,-1.46215 -0.8374,-5.20963 0.756,-6.77917 6.0059,-5.91909 3.6345,0.59545 4.1217,0.3854 3.743,-1.613 -0.2967,-1.56525 -1.769,-2.50398 -4.6198,-2.94524 l -4.1846,-0.64738 4.7975,-1.69338 c 2.6387,-0.93109 7.1041,-1.78281 9.9233,-1.89266 3.3887,-0.13207 6.0548,-1.08053 7.8665,-2.79879 3.0901,-2.93077 17.1507,-8.08898 25.4937,-9.35208 1.1744,-0.17779 2.5125,-0.25961 3.8564,-0.25322 z m -5.019,3.40545 c -3.1314,-0.0283 -5.5391,1.72104 -5.5391,5.04047 0,2.87362 1.0382,2.74907 4.5456,-0.545 l 2.901,-2.72502 3.0264,3.93615 c 3.2455,4.21898 4.4771,4.75155 5.839,2.52684 0.5019,-0.81983 -0.7281,-2.843 -2.9457,-4.84339 -2.5176,-2.27096 -5.3916,-3.36801 -7.8272,-3.39005 z m -66.6047,8.80267 c 2.1492,-0.0893 4.9833,1.0036 8.8938,3.26232 l 6.5861,3.80402 -2.9315,3.88 c -1.6123,2.13396 -4.6292,7.54376 -6.705,12.02205 -2.0758,4.47828 -4.0238,8.14205 -4.3286,8.14205 -1.1042,0 -5.3882,-11.10985 -6.6788,-17.32126 -1.0609,-5.10647 -0.985,-7.07164 0.3817,-9.95874 1.1692,-2.46978 2.6331,-3.74114 4.7823,-3.83044 z m -14.2672,35.72812 4.3831,0.80815 c 8.1965,1.51107 9.2306,2.91074 8.7815,11.88221 -0.4422,8.83341 -1.7468,9.53134 -5.5773,2.98487 -1.2384,-2.11647 -2.4618,-3.21305 -2.7178,-2.43765 -0.6848,2.07403 3.2431,9.81924 5.9503,11.73357 1.4056,0.99389 2.6043,3.63834 3.0002,6.61824 0.806,6.06618 -0.4615,6.30163 -6.2578,1.16378 -6.2241,-5.51712 -6.9501,-7.59555 -7.2721,-20.81921 z m 121.6961,17.63065 c -5.8104,0.0287 -12.4798,2.58567 -17.1452,7.28215 -9.2873,9.34929 -11.8543,28.52187 -5.4704,40.85888 1.847,3.5693 4.6808,7.16544 6.2971,7.9912 3.7535,1.91768 4.2778,1.90382 11.6268,-0.29947 7.1635,-2.14769 10.7751,-5.96466 15.842,-16.74432 6.2039,-13.19884 5.6491,-27.80006 -1.3469,-35.4716 -2.2548,-2.47253 -5.8278,-3.63645 -9.8034,-3.61684 z m -0.2628,1.95762 c 1.0472,-0.0265 3.4047,1.41257 6.6025,4.3292 7.8692,7.17731 8.9424,15.68599 3.5586,28.20486 -2.2678,5.2733 -8.0057,12.73694 -12.0129,15.62568 -2.8278,2.0385 -10.6093,2.68681 -13.9411,1.16157 -3.0447,-1.39384 -7.5196,-9.87536 -7.5196,-14.2527 0,-2.69896 0.2294,-2.58599 2.9511,1.45774 1.6229,2.41111 4.6721,4.98933 6.7759,5.72972 15.8324,5.57197 23.9513,-6.83609 18.443,-28.18614 -0.9983,-3.86937 -2.6172,-8.19175 -3.5979,-9.6053 -2.0437,-2.94579 -2.3068,-4.43817 -1.2596,-4.46463 z m -84.9845,20.60999 c -1.769,-0.0342 -3.4574,0.20315 -4.8401,0.73879 -3.3482,1.29711 -5.7896,7.80753 -5.6863,15.16436 0.1825,12.99526 7.3205,21.82805 21.6581,26.80545 0.056,0.0195 0.1096,0.0401 0.1657,0.0595 4.0594,1.39524 8.4365,0.65323 11.292,-1.91467 l 3.0297,-2.72504 -1.7428,-8.16186 c -3.0441,-14.25891 -7.951,-23.06073 -15.4166,-27.65655 -2.3416,-1.44148 -5.5114,-2.25292 -8.4597,-2.30994 z m -4.165,3.70715 c 0.6037,-0.0702 0.8176,0.99308 0.1985,3.2414 -1.3659,4.96011 0.317,16.01582 2.0677,20.28301 2.397,5.84215 10.0379,9.21701 16.6043,7.17975 0.8876,-0.27537 1.7564,-0.64579 2.5891,-1.12634 4.0321,-2.32701 4.7975,-2.23743 4.7975,0.56263 0,1.30851 -1.0437,2.94395 -2.3197,3.63335 -1.9998,1.08052 -2.805,1.28897 -6.6962,0.71346 -0.9857,-0.14578 -2.1167,-0.32852 -3.5771,-0.57583 -6.4984,-1.10044 -10.9111,-4.27899 -14.4842,-10.43437 -3.3806,-5.8236 -4.0941,-14.11744 -1.7144,-19.91747 0.9376,-2.28536 1.9308,-3.48935 2.5345,-3.55959 z m 107.189,26.47184 c 0.4432,-0.0498 0.82,0.33569 1.3044,1.03385 4.4741,6.44875 13.1179,40.82632 14.9128,50.81872 3.0705,5.39452 4.7348,6.47957 8.2743,14.986 3.5088,6.23774 9.9558,16.78978 14.3271,23.44953 5.3214,8.25019 10.7909,18.3537 15.2116,26.17237 3.2551,9.80766 12.8615,19.90475 12.0402,32.10026 4.316,23.09901 1.2416,43.1878 -8.8687,57.95993 -5.7535,8.40644 -8.6787,10.8589 -17.2881,14.49054 l -4.4856,1.89156 4.7833,-6.36941 c 6.4803,-8.62912 6.0606,-11.09283 -0.7089,-4.16076 -3.1153,3.19019 -9.344,7.55184 -14.3576,10.05343 -7.9097,3.94654 -10.045,4.46387 -19.9852,4.84009 -6.1209,0.23164 -11.9384,0.0782 -12.9279,-0.34023 -10.8651,-4.5943 -19.3765,-24.03599 -19.3787,-44.26434 -9e-4,-9.8573 0.4497,-12.3585 3.4201,-18.986 1.0127,-2.25953 1.9141,-5.39237 2.0034,-6.96175 0.089,-1.56937 0.5664,-2.85339 1.0611,-2.85385 0.4948,-4.7e-4 0.8998,-2.42089 0.8998,-5.37848 0,-2.95759 0.54,-5.71449 1.1996,-6.12608 2.3823,-1.48639 1.3417,-9.73497 -1.577,-12.5032 -3.3053,-3.13489 -5.9463,-3.34012 -8.5917,-0.66942 -1.7924,1.80953 -1.881,1.69118 -1.1353,-1.5139 1.1439,-4.91623 4.031,-10.98687 6.0168,-12.65073 1.3706,-1.14834 1.6942,-0.87277 1.7155,1.45885 0.035,3.78417 3.8436,12.04604 6.7006,14.53459 4.2887,3.73555 7.5355,3.93453 10.7784,0.66061 4.0218,-4.0603 5.2874,-9.00238 3.6273,-14.17015 -2.4092,-7.49984 -10.8268,-9.17949 -16.4593,-3.28434 l -2.589,2.70962 0.7252,-4.81477 c 0.9179,-6.09288 3.9299,-10.21685 9.8906,-13.54585 7.6111,-4.25069 15.1505,-4.18425 17.9697,0.15965 1.7618,2.71453 1.772,3.46682 0.1015,8.17397 -3.2318,9.10649 -0.9944,13.70275 1.5944,16.93039 1.8483,2.3044 1.0617,5.13155 6.9973,5.46658 6.7128,0.37886 7.4765,0.16295 9.2951,-2.63915 5.8386,-8.99603 -9.5174,-22.47519 -15.6064,-13.6989 -1.1469,1.65304 -1.8671,2.03238 -1.8671,0.98321 0,-2.68596 5.0688,-9.46541 8.1304,-10.87368 8.8054,-4.0504 19.343,1.79266 24.9931,13.85855 3.8321,8.18344 3.7727,18.58385 -0.1941,33.99731 -4.0548,15.75527 -3.2153,19.92779 1.1996,5.96092 4.3863,-13.87631 5.4668,-30.18966 2.5804,-38.96291 -3.143,-9.5532 -7.6694,-14.02709 -18.6775,-18.46191 -9.7223,-1.56548 -9.9016,3.60805 -17.0874,-4.55053 -12.9557,-5.8106 -23.7125,-3.94203 -30.3131,11.42199 -3.0545,6.35351 -9.7671,6.15996 -12.0064,18.27254 -0.7843,10.47181 0.6832,16.87994 4.7496,20.73663 3.19,3.02554 3.363,6.12648 0.711,12.75532 -0.7992,1.99793 -1.7412,10.4444 -2.0928,18.7691 -0.7137,16.89603 0.8774,26.58166 6.1924,37.70446 1.666,3.48648 3.0286,6.46496 3.0286,6.61823 0,1.41315 -12.787,4.6602 -18.0755,4.59017 -7.4301,-0.0984 -21.9181,-5.99456 -26.0772,-10.61275 -5.3942,-5.98952 -6.1399,-26.84424 -1.8453,-51.62025 0.9812,-5.6608 2.0198,-12.7178 2.3077,-15.68295 1.2043,-12.40513 7.0991,-29.19262 16.3916,-46.67667 10.4174,-19.60057 16.6816,-33.29489 16.2095,-35.43525 -0.2891,-1.31045 -1.894,1.02267 -4.2642,6.19874 -5.0205,10.96396 -15.7572,29.84207 -16.9729,29.84207 -2.0521,0 -3.8134,-3.69723 -5.1084,-10.72724 -1.5636,-8.48827 -4.0159,-8.78777 -2.7046,-0.33031 0.4782,3.08464 1.0299,7.44175 1.2258,9.68237 0.1958,2.24061 0.9631,5.55496 1.7057,7.36474 1.0958,2.67077 0.913,4.4116 -0.9696,9.24526 -1.2756,3.27536 -3.4931,10.31439 -4.9284,15.6422 -1.4352,5.32782 -2.9294,10.5045 -3.3208,11.50347 -0.3914,0.99897 -0.9121,2.36073 -1.1561,3.02671 -0.4047,1.10498 -2.9368,15.74756 -6.4912,37.5371 -0.7604,4.66184 -1.7739,10.80421 -2.2531,13.64936 -0.557,3.30668 -0.3565,6.17562 0.5562,7.95157 0.7852,1.52809 1.7673,4.14416 2.1823,5.81339 0.4149,1.66924 2.0652,4.98528 3.6676,7.36913 l 2.9141,4.33361 -3.7833,-1.0834 c -5.7262,-1.64066 -10.3792,-3.72082 -10.3792,-4.6397 0,0 -4.7437,-2.48848 -9.9702,-11.93836 -1.8358,-3.31929 -3.7305,-7.4898 -5.5009,-12.7234 -2.1413,-6.59378 -3.0362,-9.94822 -5.5621,-20.84122 -6.8061,-29.35202 0.055,-66.2298 17.6131,-94.67568 2.8001,-4.53628 6.8737,-11.71897 9.0531,-15.9615 l 3.9621,-7.71376 0,8.55054 c 0,5.18834 0.5481,8.89272 1.3938,9.42033 1.0471,0.65335 1.1692,-2.5655 0.4896,-12.9458 -1.5096,-23.05975 -1.3689,-23.53763 6.7704,-22.88252 8.2067,0.66054 14.4062,0.52504 19.1334,-0.41838 9.5198,-1.89995 33.0138,-20.45381 39.9714,-31.56627 1.9161,-3.06043 2.8396,-4.35081 3.5782,-4.43381 z m -47.3012,13.00525 c -0.8696,-0.0186 -1.8764,0.12642 -3.1442,0.41509 -4.6304,1.05431 -10.0967,5.41781 -10.0967,8.05947 0,2.37867 0.9994,1.97626 4.0875,-1.64822 2.3776,-2.79049 3.6808,-3.2467 9.1545,-3.20177 6.2695,0.0514 6.3374,0.0151 3.7854,-2.07102 -1.2672,-1.03598 -2.3372,-1.52262 -3.7865,-1.55355 z m 70.8635,7.16984 c 0.4004,-0.003 0.8494,0.005 1.3534,0.021 5.8099,0.17841 24.4082,9.2828 34.1378,16.71129 9.5437,7.28656 17.7723,18.37519 26.4349,35.62132 6.7323,13.40313 6.8931,13.95214 6.8697,23.6114 -0.018,7.57712 -0.6259,11.16345 -2.5978,15.33831 l -2.5738,5.44896 -0.1407,-11.50346 c -0.1205,-9.841 -0.7033,-12.99071 -4.0298,-21.79581 -5.3532,-14.16994 -14.1398,-29.98067 -19.6786,-35.40993 -6.4733,-6.34517 -26.6098,-17.05271 -28.7296,-15.27666 -1.7033,1.42722 -2.1628,6.12146 -0.7394,7.5585 1.6326,1.64823 3.8354,12.27845 3.888,18.76801 0.037,4.60391 -0.6965,7.74055 -2.4986,10.6843 -2.9017,4.7399 -2.958,4.70663 -8.5546,-4.9689 -4.0209,-6.95143 -4.0715,-7.20142 -1.9096,-9.38401 3.3342,-3.36612 2.8122,-10.76876 -1.4505,-20.57368 -2.0192,-4.6446 -3.5042,-9.91226 -3.299,-11.70605 0.2926,-2.55863 0.7157,-3.12566 3.5182,-3.14451 z m -63.6471,1.75394 c -1.0443,0.0141 -2.4658,1.56743 -2.4658,3.04432 0,0.95965 0.4819,1.74512 1.071,1.74512 1.2158,0 2.8716,-3.68836 2.035,-4.5329 -0.1787,-0.18044 -0.3992,-0.25979 -0.6402,-0.25654 z m -17.8061,4.91496 c -0.4747,-5.7e-4 -0.8947,0.11824 -1.1691,0.39527 -0.4472,0.45148 -0.018,1.32814 0.9521,1.9477 2.3217,1.48241 3.563,1.45313 3.563,-0.0848 0,-1.17055 -1.9219,-2.2561 -3.346,-2.2582 z m 96.2678,9.56016 c 2.8878,0 18.8706,9.90451 23.4194,14.51255 5.926,6.00304 16.2127,24.90663 20.3593,37.4138 2.8747,8.67098 3.4164,22.21569 1.2182,30.45753 -1.1726,4.39621 -1.679,4.93725 -3.9644,4.23672 -1.4411,-0.44176 -4.8356,-1.10251 -7.5436,-1.46875 -3.9268,-0.53109 -5.3842,-0.17465 -7.1968,1.76273 -2.2549,2.41005 -2.2991,2.37052 -5.586,-5.00853 -5.1704,-11.52849 -11.5105,-21.28762 -19.5402,-31.82612 l -4.0407,-6.22627 2.2979,-4.80265 c 1.8804,-3.92933 2.2258,-6.87003 1.8955,-16.1751 -0.2221,-6.25492 -0.8076,-13.96079 -1.3011,-17.12418 -0.4935,-3.16339 -0.5015,-5.75173 -0.017,-5.75173 z M 1102.4,602.04934 c 1.2998,0.0792 2.4099,0.6166 3.2707,1.66365 1.0563,1.28505 1.0952,2.92928 0.1526,6.35619 -0.6994,2.54284 -1.2748,7.50888 -1.2781,11.03552 0,5.19877 0.5511,6.97428 2.938,9.384 1.6192,1.63467 4.048,2.97276 5.3974,2.97276 2.8633,0 3.0217,0.95605 0.6772,4.08149 -2.136,2.8475 -8.8239,1.90281 -12.0565,-1.70328 -2.425,-2.70518 -2.9292,-11.17875 -1.24,-20.84453 0.9558,-5.4691 0.872,-5.75063 -1.7144,-5.75063 -1.5283,0 -3.1849,0.88101 -4.9448,2.57639 -3.3759,3.25226 -7.1396,9.55544 -11.1567,18.7669 -3.158,7.24136 -7.3691,16.81006 -9.3584,21.26402 -1.9894,4.45393 -4.8352,9.25318 -6.3244,10.66559 l -2.7079,2.56867 -0.7569,-3.04322 c -0.8257,-3.32149 3.5001,-15.45495 10.5231,-29.51506 7.0424,-14.09869 16.2874,-25.07609 23.3366,-28.96126 1.945,-1.072 3.7245,-1.6097 5.2425,-1.5172 z m -3.5586,9.01075 -1.0492,4.23783 c -1.5726,6.35105 -1.2654,17.04142 0.6195,21.55249 0.929,2.22348 3.3805,4.90776 5.5293,6.05451 l 3.8596,2.06002 -10.028,15.13572 c -5.8657,8.85341 -10.917,17.99539 -12.17,22.02482 l -2.1419,6.88798 -2.1507,-6.11176 c -1.1827,-3.36185 -4.226,-8.38705 -6.7638,-11.16655 l -4.5903,-5.02727 -0.024,-0.0264 9.2918,-21.86958 c 3.1147,-7.33049 5.4747,-12.72736 7.4346,-16.87315 3.9061,-8.26234 6.1954,-11.46307 9.5056,-14.45639 l 2.6774,-2.42226 z m 7.488,41.77493 c 0.352,0 -0.2421,2.0432 -1.3207,4.54062 -3.7233,8.62091 -7.4315,21.52244 -8.7881,30.57424 -0.7485,4.99482 -1.7553,12.351 -2.2368,16.34686 l -0.8757,7.26563 -1.5868,-4.23783 c -0.8733,-2.33091 -2.3496,-5.68512 -3.2805,-7.4528 -3.2927,-7.31215 1.7038,-17.89689 5.5031,-26.35404 0,-2.13408 11.2869,-20.68268 12.5855,-20.68268 z m -46.1801,14.53127 c 1.8856,0 5.2075,1.31312 8.2187,3.02781 2.1879,1.24588 4.2131,2.70198 5.3995,4.02644 2.2763,2.54114 11.581,24.79187 11.581,27.69397 0,2.1274 5.4974,10.89486 7.1881,11.46383 0.7513,0.25284 1.5517,4.83712 1.8715,10.71623 0.3074,5.65103 0.8306,12.87791 1.1626,16.0606 0.8963,8.59453 6.5912,25.40204 11.0618,33.0218 0.2768,0.47171 0.5499,0.91644 0.8158,1.31353 l 4.1639,6.21747 -7.0234,2.58519 c -2.8247,1.03975 -6.6581,2.36349 -9.7706,3.38564 -1.1446,0.37585 -2.2036,0.71575 -3.0624,0.9788 -6.2486,1.9139 -17.1483,2.15026 -25.1851,0.54502 -21.9614,-4.38645 -37.8738,-40.67413 -35.4051,-57.28832 0,0 1.5152,-10.39138 1.9522,-17.11757 0.211,-3.24815 -1.1671,-5.56107 -1.469,-6.75255 l 6.2861,1.89704 c 7.878,-0.63559 10.0433,-2.71731 10.0433,-2.71731 1.1084,-3.75963 -3.4281,-8.80598 -4.7462,-10.50374 -2.0566,-2.64888 -3.4224,-3.64935 -6.897,-2.88798 -3.0501,0.66837 -3.7619,0.98953 -4.3602,6.07983 -0.5747,4.88993 -0.2333,5.4756 -1.6947,3.99671 -0.9325,-0.94358 -1.9367,-4.65118 -2.2314,-8.23894 -0.7971,-9.70423 3.4387,-16.62923 11.6203,-18.9981 4.4845,-1.29844 5.9368,0.59537 3.6971,4.82026 -2.2961,4.33125 0.5822,13.72229 5.5566,18.13161 1.8757,1.66266 3.8467,2.74766 5.767,3.32069 6.4426,1.92238 12.3046,-1.98115 11.9955,-9.71212 -0.1678,-4.19674 -1.5514,-7.64033 -3.5706,-9.84312 -2.5897,-2.82511 -6.2258,-3.60909 -9.6845,-1.32124 -2.872,1.89981 -3.0957,2.61829 -2.5618,8.22794 0.5618,5.90271 0.5176,6.01582 -1.12,2.86045 -2.7857,-5.3674 -3.4069,-14.48186 -1.1179,-16.3997 1.0645,-0.89187 1.9358,-2.35871 1.9358,-3.25903 0,-1.95883 6.0622,-5.33114 9.5831,-5.33114 z m 157.533,8.60118 c 1.7016,-0.0484 3.5735,0.76449 5.2087,2.59841 3.3432,3.74968 4.2018,6.71578 2.7406,9.47208 -2.6468,4.99302 -13.1471,0.6868 -13.1471,-5.39169 0,-4.12508 2.3618,-6.59812 5.1978,-6.6788 z m -26.6083,0.0165 c 1.3924,0.0143 2.7355,0.87354 4.3056,2.58189 3.6758,3.99951 4.019,9.10307 0.8278,12.32483 -2.7456,2.77186 -5.0512,2.35337 -9.0029,-1.63612 -4.2286,-4.26904 -4.4313,-7.26919 -0.7296,-10.7801 1.7651,-1.67403 3.2066,-2.50483 4.5991,-2.4905 z m -133.925,6.71292 c 1.6602,0.0719 3.3732,1.27962 4.6143,3.0278 1.2191,1.71707 1.9829,3.9553 1.7701,6.18113 -0.3036,3.17449 -0.9534,3.98335 -3.4354,4.27528 -0.9505,0.11179 -1.8461,-0.0483 -2.6643,-0.40518 -4.5587,-1.98818 -6.6807,-10.17857 -2.0623,-12.67385 0.5668,-0.30628 1.1682,-0.43155 1.7776,-0.40518 z m -32.4386,4.5307 c 0.6598,0.12064 0.6685,1.58491 0.6685,5.45666 0,3.43251 0.6569,8.16202 1.7177,10.39364 l 2.118,4.45472 -3.6841,-0.96449 c -4.2103,-0.85012 -6.6577,1.98104 -6.5021,7.52218 0.064,2.27213 2.0543,3.72915 1.8649,3.72915 -1.3519,0 -6.3054,-8.80139 -6.2894,-13.09993 0.022,-5.91021 3.8214,-13.66681 8.0758,-16.4867 1.0046,-0.6658 1.6348,-1.07761 2.0307,-1.00523 z m 150.7506,6.65568 c 0.9008,-0.0231 2.0008,0.39653 3.2238,1.39719 1.9556,1.60011 2.6688,3.27441 2.3993,5.63612 -0.4885,4.28127 -3.7493,4.98909 -6.2665,1.36086 -2.9657,-4.27457 -2.059,-8.32475 0.6434,-8.39417 z m -137.9121,1.11313 c 1.2183,-0.0309 2.5603,0.44306 3.9141,1.78474 2.3132,2.29252 4.713,7.27075 4.0014,9.14288 -0.5575,1.16053 -7.1984,2.24198 -9.0541,0.42721 -2.6275,-1.85799 -3.546,-9.21366 -1.4254,-10.53678 0.7444,-0.46444 1.6164,-0.79405 2.564,-0.81805 z m 168.9679,1.58986 c -3.4209,-0.0715 -6.9952,0.61217 -10.4446,2.19324 -10.7094,4.90868 -15.5808,20.38228 -8.6277,27.40551 1.7303,1.7478 4.9691,3.61214 7.1968,4.14314 6.2095,1.48008 8.4794,1.3731 15.4941,-0.72998 8.9999,-2.69825 15.5435,-9.34216 15.5377,-15.77432 -0.01,-10.00737 -8.8936,-17.02311 -19.1563,-17.23759 z m -1.0285,2.55217 c 0.8139,0.0134 1.6426,0.0853 2.4855,0.22131 17.3972,2.80851 20.7312,18.39199 5.6013,26.18447 -5.6388,2.90422 -13.5406,3.89784 -18.5794,2.33637 -16.124,-4.99672 -6.0563,-29.01492 10.4926,-28.74215 z m -181.3112,9.75065 c 0.5397,-0.0318 1.1643,0.18884 1.9947,0.63749 3.7485,2.02533 5.4707,4.72875 4.6579,7.31408 -1.0423,3.31543 -3.3759,3.89679 -6.2513,1.55794 -3.3152,-2.69666 -4.1402,-5.57059 -2.3207,-8.08259 0.6718,-0.92756 1.2254,-1.38601 1.9194,-1.42692 z m 247.3805,30.93538 4.3471,4.13983 c 6.1158,5.82413 18.0064,12.98777 31.3328,18.87701 16.2366,7.17531 17.3906,7.87334 17.3906,10.51695 0,5.11799 -19.7941,12.33349 -41.3793,15.08398 -11.0209,1.40387 -23.7609,1.40889 -26.9857,0.01 -1.3193,-0.57237 -3.9634,-1.0784 -5.875,-1.12525 l -3.4757,-0.0848 4.0461,-2.75366 c 8.8746,-6.03775 16.7791,-22.00117 19.8183,-40.0265 l 0.7808,-4.6375 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path3431" /> + </g> + </g> + </svg> + </div> + <!--<div class="visible-xs"> + <svg xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + id="svg2" + viewBox="0 0 2305.9131 371.80446" + height="50px" + width="350px"> + <defs id="defs4" /> + <metadata id="metadata7"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g transform="translate(-98.113343,-367.1257)" + id="layer1"> + <path id="path3448" + d="m 1071.6872,736.1752 c -9.1351,-2.50308 -9.797,-3.17 -9.1809,-9.25096 0.3651,-3.60435 1.6242,-10.21006 2.7979,-14.67928 2.0303,-7.73089 2.4234,-8.01532 8.0871,-5.8516 7.7948,2.97788 28.4946,2.82784 36.6803,-0.26586 8.4044,-3.17634 17.5648,-11.95463 24.1792,-23.17065 l 5.2918,-8.97318 -16.2301,-33.68792 c -19.9419,-41.3924 -37.899,-86.45402 -48.2974,-121.19788 -4.3215,-14.43914 -8.3937,-28.01532 -9.0494,-30.16928 -1.0917,-3.58612 0.4088,-3.86279 17.7989,-3.28162 l 18.9912,0.63467 7.2602,25.15912 c 9.3304,32.33277 23.2678,71.83087 35.125,99.54258 9.1489,21.38194 9.4154,21.73422 11.7717,15.55256 5.4202,-14.22026 20.4172,-65.32925 27.631,-94.16495 4.2343,-16.92628 8.6697,-34.46689 9.8564,-38.97912 l 2.1574,-8.20407 17.4177,0 c 11.2296,0 17.4176,0.85666 17.4176,2.41125 0,1.32618 -4.0044,17.32411 -8.8987,35.55093 -16.9686,63.1913 -47.6598,148.43375 -62.7263,174.21749 -9.0712,15.52366 -23.6896,29.71114 -36.2008,35.13344 -13.6255,5.90513 -37.5535,7.5998 -51.8798,3.67433 z m 805.0917,1.49059 c -3.0082,-0.54466 -12.6964,-2.61185 -21.5294,-4.5938 l -16.06,-3.60346 1.3509,-6.73662 c 0.7429,-3.70513 1.9568,-10.51646 2.6974,-15.13627 1.1471,-7.15507 2.0299,-8.23867 5.9582,-7.31301 31.5893,7.44369 38.8097,8.39941 56.3466,7.45813 21.835,-1.17196 35.1519,-6.99348 41.6947,-18.22695 3.7599,-6.45542 9.5559,-30.96777 7.7494,-32.77419 -0.4686,-0.46862 -6.6894,1.20464 -13.8239,3.71833 -18.4678,6.50679 -49.3927,5.23566 -66.5717,-2.73632 -15.0781,-6.99703 -29.7662,-21.50949 -36.4442,-36.00858 -11.623,-25.23538 -11.503,-66.40893 0.2686,-92.12122 6.8574,-14.97866 23.0456,-30.99527 39.4851,-39.06679 12.7263,-6.24838 14.0312,-6.43116 45.9149,-6.43116 29.184,0 40.0572,1.23612 60.7099,6.90171 3.5698,0.97925 3.8269,7.29066 3.8026,93.33526 -0.028,100.00624 -0.7375,107.37095 -11.9784,124.35722 -6.6992,10.12311 -21.8221,20.30425 -37.2199,25.05759 -10.7192,3.30906 -51.5488,5.876 -62.3508,3.92013 z m 67.2483,-109.53531 8.2289,-4.02064 0.5846,-53.8658 0.5845,-53.8658 -6.8742,-1.37487 c -14.2243,-2.84483 -39.9789,-1.39794 -48.9885,2.75218 -19.6409,9.04712 -29.388,24.88796 -31.1523,50.62836 -2.5125,36.65617 11.8118,60.82699 38.8093,65.48692 10.5206,1.8159 28.9095,-0.90417 38.8077,-5.74035 z m 162.9639,47.32712 c -15.3966,-2.21225 -33.1879,-11.20278 -45.1225,-22.80184 -28.9155,-28.10262 -36.3223,-81.06404 -17.3032,-123.72429 14.5943,-32.73517 53.7466,-52.72524 90.5649,-46.23981 49.7828,8.76905 79.2449,55.16195 71.986,113.35386 -6.7247,53.90971 -48.2726,86.86249 -100.1252,79.41208 z m 33.6853,-34.12234 c 9.8178,-4.65886 23.3446,-20.19072 26.7643,-30.73152 4.8335,-14.89839 5.5825,-39.79858 1.6577,-55.10019 -7.1697,-27.95132 -23.1716,-42.3126 -47.1464,-42.3126 -31.9013,0 -51.0392,24.77401 -51.0392,66.07002 0,29.75574 10.9872,52.87379 29.4551,61.97533 9.4293,4.64711 30.6144,4.69912 40.3085,0.0989 z M 724.42841,672.15304 c -26.92108,-7.25063 -39.93578,-23.00704 -41.6991,-50.48354 -1.23501,-19.24402 2.55327,-31.36013 13.24867,-42.37332 15.30088,-15.7555 48.57523,-23.83702 80.13681,-19.46326 8.78967,1.21806 16.4156,1.78028 16.9465,1.24939 2.153,-2.15303 -3.79494,-29.17789 -7.5199,-34.16708 -9.11246,-12.20514 -14.63207,-14.38686 -36.16472,-14.29467 -11.03969,0.0472 -25.29386,1.38882 -31.67594,2.98122 -6.38206,1.59242 -12.11107,2.38798 -12.73112,1.76793 -0.62006,-0.62005 -1.30528,-7.36176 -1.52272,-14.98159 l -0.39536,-13.8542 10.93874,-2.95233 c 6.0163,-1.62379 21.7681,-3.08064 35.00398,-3.23746 32.49063,-0.38496 46.6511,3.82365 60.30049,17.92184 16.10626,16.63583 17.3646,24.05776 17.3646,102.41968 l 0,65.7987 -4.99456,1.25355 c -23.32106,5.85323 -79.30786,7.24382 -97.23637,2.41514 z m 55.96728,-26.47738 13.44741,-1.40552 0,-26.79804 0,-26.79803 -6.0163,-1.52084 c -10.51686,-2.65846 -43.47478,-1.54557 -51.32147,1.73299 -10.40318,4.34673 -19.23344,15.50953 -19.23344,24.31401 0,25.9689 18.90707,35.09701 63.1238,30.47543 z m 135.96136,28.49049 c -3.00815,-0.52958 -12.60691,-2.47732 -21.33054,-4.32828 l -15.86119,-3.36537 0,-133.02164 0,-133.02162 11.24549,-1.49176 c 6.18503,-0.82048 14.06093,-2.05487 17.502,-2.74308 l 6.25649,-1.25129 0,48.40394 c 0,26.62218 0.52386,48.40396 1.16414,48.40396 0.64028,0 4.77459,-1.50854 9.18737,-3.35232 12.24444,-5.11605 33.9232,-7.48987 48.97325,-5.36256 43.26284,6.11517 69.70054,42.19872 69.70054,95.13097 0,44.04132 -16.4195,73.49534 -49.77459,89.28782 -14.00166,6.62933 -16.08551,6.9828 -43.15284,7.3199 -15.64242,0.19472 -30.90197,-0.0791 -33.91012,-0.60867 z m 59.20885,-35.289 c 13.5083,-6.85076 24.5994,-20.00306 28.6733,-34.00211 1.4735,-5.06326 2.5697,-18.06633 2.4361,-28.89568 -0.3825,-30.98321 -8.97325,-48.78046 -27.99016,-57.98637 -13.79716,-6.6791 -37.05451,-5.64085 -52.58007,2.34727 l -10.84189,5.5783 -0.5824,58.24484 -0.58238,58.24484 6.05175,0.91481 c 3.32848,0.50316 14.4895,1.06232 24.8023,1.24261 16.49344,0.28833 20.17847,-0.39641 30.61345,-5.68851 z m 711.9727,34.56004 c -18.6501,-4.65133 -33.1499,-14.4946 -39.6317,-26.90427 -9.0809,-17.38531 -7.9484,-45.40338 2.4716,-61.14906 13.6803,-20.6722 49.2369,-30.62083 89.4409,-25.02523 l 12.9013,1.79561 -1.2071,-13.31182 c -1.556,-17.1599 -6.9405,-26.31956 -19.0929,-32.47923 -12.8096,-6.4928 -34.6376,-6.29175 -61.742,0.56866 -6.6684,1.68783 -7.8355,-0.74361 -8.8431,-18.42289 l -0.55,-9.65018 10.9386,-3.06759 c 13.6156,-3.81827 58.1455,-4.46767 70.1376,-1.02285 22.9135,6.58212 37.6346,23.79129 42.3421,49.49864 1.342,7.32798 2.3773,39.40809 2.3773,73.6627 l 0,60.68136 -6.0164,1.22466 c -25.5447,5.1998 -78.8822,7.25371 -93.5262,3.60149 z m 51.0911,-27.76153 13.4474,-1.40552 0,-26.88779 c 0,-31.55429 1.7872,-29.68292 -28.3468,-29.68292 -35.13,0 -47.8731,9.82086 -46.3769,35.74148 1.0183,17.64039 24.3238,26.09705 61.2763,22.23475 z m -1255.44695,24.68771 -14.22037,-2.49855 -0.56574,-118.59836 c -0.54632,-114.52709 -0.42326,-118.67461 3.58483,-120.81968 6.82044,-3.65019 54.55687,-7.26299 76.43291,-5.78461 38.15774,2.5787 59.57314,10.0288 75.01135,26.09538 23.34719,24.29748 18.10965,71.54192 -9.52498,85.91862 -7.7342,4.02365 -7.58957,6.21057 0.63604,9.61772 23.53598,9.74893 34.85831,27.53514 34.8935,54.81405 0.0114,9.30047 -1.46988,20.94194 -3.37899,26.54485 -7.53078,22.10165 -28.87101,37.66535 -60.64361,44.22816 -19.80064,4.08992 -80.07409,4.37438 -102.22494,0.48242 z m 92.98131,-31.03173 c 22.99827,-5.99029 36.07303,-20.05147 36.0877,-38.81037 0.0102,-12.32868 -3.94816,-22.66113 -11.25784,-29.3904 -10.08476,-9.284 -22.5421,-12.00665 -60.38276,-13.19716 l -35.55093,-1.11847 0,42.94523 0,42.94523 29.07497,0 c 19.14037,0 33.50116,-1.15287 42.02886,-3.37406 z m -5.21401,-114.7773 c 19.29426,-5.41344 29.28186,-17.63994 29.07545,-35.59319 -0.14251,-12.39418 -5.15,-20.21109 -17.38684,-27.14162 -13.9758,-7.91544 -46.99126,-11.74351 -69.37436,-8.0438 l -8.20407,1.35604 0,37.24465 0,37.24467 28.98768,-1.42309 c 15.94321,-0.7827 32.54918,-2.42236 36.90214,-3.64366 z m 709.12025,146.12234 -13.6735,-2.10001 0,-119.90112 c 0,-105.00001 0.4113,-120.05894 3.3089,-121.17089 1.82,-0.69836 14.3721,-2.39407 27.8939,-3.76824 79.9093,-8.12096 137.4474,14.91927 160.1394,64.1253 8.9492,19.40571 12.1185,35.59876 12.1185,61.91649 0,62.98123 -31.2797,104.12639 -90.5946,119.16772 -14.0029,3.55092 -23.8131,4.33508 -51.4121,4.1095 -18.7589,-0.15336 -40.2601,-1.22376 -47.7805,-2.37875 z m 90.2447,-33.10799 c 16.4174,-4.42251 27.6376,-10.91156 37.6514,-21.77525 14.2907,-15.50364 19.0252,-26.55888 22.3492,-52.18756 4.1705,-32.15386 -4.4784,-64.90552 -21.8936,-82.90684 -18.3498,-18.96729 -40.1277,-26.05475 -80.2212,-26.10743 l -24.6123,-0.0323 0,92.79703 c 0,72.10474 0.6098,93.07897 2.7348,94.0615 4.635,2.14309 52.4163,-0.73093 63.9917,-3.84911 z m 148.1954,-55.54056 0.5714,-89.1183 14.2204,-4.03412 c 18.2447,-5.17573 62.3338,-7.33168 79.0188,-3.86398 l 12.2923,2.55476 -3.0486,14.54364 c -1.6767,7.999 -3.3257,14.82076 -3.6644,15.15946 -0.3387,0.33869 -4.468,-0.44783 -9.1761,-1.74784 -9.2065,-2.54197 -48.4884,-1.77395 -52.9975,1.03618 -2.1031,1.31066 -2.7347,19.36018 -2.7347,78.14641 l 0,76.44211 -17.5266,0 -17.5265,0 z m 735.0839,-1.03719 0.5712,-90.15549 13.1266,-2.90941 c 7.2195,-1.60018 27.4497,-3.49056 44.9558,-4.20086 25.9321,-1.05217 34.0389,-0.62727 43.755,2.29334 15.9388,4.79112 27.7424,13.4053 35.3455,25.79468 10.5659,17.2172 12.5976,33.24567 12.6399,99.71708 l 0.038,59.61617 -17.3264,0 -17.3264,0 -0.7225,-62.89779 c -0.713,-62.05734 -0.7957,-63.04244 -6.1919,-73.72284 -3.0082,-5.95377 -8.0585,-12.70293 -11.2227,-14.99812 -6.9169,-5.01696 -27.9297,-7.13611 -48.7022,-4.91159 l -14.4586,1.54841 0,77.49095 0,77.49098 -17.5263,0 -17.5262,0 0.5711,-90.15551 z" + style="fill:#ffffff" /> + <path d="m 142.34546,653.29858 c -5.67879,0.73545 -11.14841,1.63398 -14.85842,4.52718 -3.53395,2.75591 -5.44517,7.41402 -5.44517,11.8417 0,9.07594 9.12462,16.36887 20.30359,16.36887 5.51241,0 9.39719,-3.76635 13.06282,-6.6523 3.76815,-2.96666 7.24077,-5.11601 7.24077,-9.71657 0,-10.28093 -9.12464,-17.81663 -20.30359,-16.36888 z m 0.42303,2.1297 c 5.74413,0.002 9.3152,0.84657 12.86092,3.87799 3.41956,2.92354 4.76908,5.52393 4.76908,9.79175 0,4.49048 -2.77287,4.85771 -6.55262,7.74209 -3.53744,2.69946 -6.49416,6.49709 -11.78244,6.49709 -5.31037,0 -8.56705,-0.53723 -12.10874,-3.25667 -3.75383,-2.88231 -5.09823,-5.94013 -5.09823,-10.41307 0,-4.11761 0.28673,-7.04432 3.53086,-9.79269 3.60486,-3.05396 8.51648,-4.44794 14.38117,-4.44649 z M 267.01366,367.12643 c -1.82597,-0.0336 -4.05855,1.06603 -7.20337,3.12911 -3.46577,2.27362 -8.51657,6.32239 -11.22331,8.99643 -4.68353,4.62698 -5.46618,4.933 -16.19205,6.33859 -6.1988,0.81233 -15.5879,3.05706 -20.86525,4.98761 -29.29093,10.71514 -34.13704,12.03655 -37.5666,10.2461 -4.10543,-2.1433 -13.61942,-3.61904 -16.78751,-2.6039 -2.72806,0.87411 -5.03139,6.44459 -4.9851,12.05616 0.0171,2.06506 1.39509,7.56942 3.06238,12.23126 4.66277,13.03725 4.89911,14.49362 2.18119,13.43134 -1.25198,-0.48933 -4.8399,-1.19929 -7.97333,-1.57776 -5.59124,-0.67533 -5.69727,-0.62542 -5.69727,2.67108 0,1.84741 -0.60729,6.69093 -1.34906,10.76358 -1.32149,7.2554 -1.27041,7.53903 2.50836,14.06444 2.12113,3.66285 6.42042,9.1544 9.55469,12.20261 6.27833,6.10597 6.4387,6.69286 8.37032,30.78343 1.02063,12.729 2.09192,15.74847 7.8839,22.2208 3.95397,4.41843 8.58028,7.29895 15.70673,9.53374 2.46719,0.7737 5.22944,1.47153 8.37359,2.12719 10.67063,2.22513 12.19862,3.25657 15.89976,10.73824 3.33507,6.74166 3.29198,7.69082 -0.60637,13.52274 -3.87601,5.79852 -5.73002,7.34789 -10.94956,9.14398 -3.43626,1.18246 -4.20737,1.0636 -5.65909,-0.87091 -1.97977,-2.63818 -2.18309,-9.80452 -0.48859,-17.22437 1.86903,-8.18415 -2.4797,-12.60862 -9.44781,-10.75697 -1.17758,0.31292 -2.42746,0.80028 -3.73747,1.48418 -9.98246,5.21148 -26.80992,31.92759 -33.68627,53.48208 l -2.73739,8.57915 c -7.75586,1.44517 -10.52838,5.07152 -15.73181,8.97113 -0.59892,-0.73859 -4.67757,-0.39123 -8.70731,1.8541 -3.49051,3.12197 -4.46953,5.91176 -8.56225,8.80267 -4.67672,3.25548 -7.03209,7.88719 -11.095706,12.54503 -3.184425,16.34901 0.770616,15.52941 3.200906,22.02152 0.89901,2.40157 4.24595,3.59777 6.63626,4.39527 2.00375,0.66855 1.50701,0.37753 2.80609,0.81035 3.73277,1.24371 1.31337,4.71064 1.0088,9.10435 -1.41156,20.36276 3.62,26.31357 6.41378,32.31055 4.11383,8.88456 7.51134,17.27193 18.54448,22.13163 8.11126,4.13126 15.73413,5.59099 30.65986,5.87284 2.49891,0.0472 4.56349,0.0552 6.38106,-0.002 5.50545,-0.17384 8.72538,-0.94892 14.72848,-3.06194 l 9.33656,-3.28654 c 0.4901,2.74516 5.57273,2.72991 7.97028,3.67078 5.24702,2.05907 10.42368,3.57393 10.42368,3.57393 0.34692,0.56672 9.42033,0.96749 20.1629,0.88963 17.91421,-0.12973 20.01057,-0.3778 25.31052,-2.99148 l 5.77796,-2.84944 3.21725,3.02341 c 1.76932,1.66313 4.02614,3.35563 5.01564,3.76108 3.55195,1.45544 25.73028,-0.16214 31.69812,-2.31214 5.10291,-1.83839 7.71196,-1.97936 19.10284,-1.03276 33.21297,2.76012 72.65973,-3.99004 83.11745,-14.22298 2.20699,-2.15954 4.01338,-4.6671 4.01338,-5.57227 0,-0.90516 -3.10382,-3.03031 -6.89692,-4.72227 -29.9267,-13.34919 -38.81667,-19.12816 -47.51826,-30.89024 -2.67244,-3.61239 -3.48625,-6.41771 -4.39292,-15.13574 -0.61213,-5.88586 -2.16836,-14.516 -3.45827,-19.17758 -1.92929,-6.97215 -2.08775,-9.01178 -0.89211,-11.50236 1.56202,-3.25384 3.61734,-3.51986 13.70986,-1.77264 7.00614,1.21289 9.16329,-1.0396 13.05113,-13.62844 5.32763,-17.25093 3.4996,-26.75426 -9.72919,-50.5919 -4.08444,-7.35999 -8.99067,-13.89251 -15.11236,-20.12226 -7.66231,-7.7976 -11.18616,-10.29095 -22.78797,-16.11894 -25.82435,-12.97249 -33.02763,-9.53316 -23.91889,11.41868 4.16735,9.58574 4.4679,12.76319 1.36869,14.43769 -2.91012,1.57233 -4.21348,-1.28061 -7.42694,-16.25437 -1.3367,-6.22853 -4.04552,-16.13308 -6.02009,-22.00942 -5.36412,-15.96377 -5.66987,-22.0783 -1.65224,-33.08456 4.51484,-12.36843 4.93882,-18.68611 1.83983,-27.42754 -1.38095,-3.89531 -2.6947,-8.17203 -2.91952,-9.50399 -0.22483,-1.33196 -0.81217,-3.882 -1.30435,-5.66587 -0.59427,-2.15391 -0.0846,-5.61115 1.51593,-10.29234 1.32561,-3.87693 2.77612,-8.86445 3.22379,-11.08397 1.19166,-5.90833 -1.66146,-19.56698 -4.90985,-23.50569 -1.50746,-1.82786 -3.08422,-4.41509 -3.50408,-5.75063 -1.12678,-3.58407 -4.43098,-2.91849 -7.49784,1.5106 l -2.69922,3.89762 -0.0121,-8.45915 c -0.008,-6.37716 -0.72201,-9.99964 -2.89879,-14.71955 -2.50443,-5.43033 -4.30346,-7.90237 -6.97217,-7.95157 z m -2.17574,4.17948 c 1.02521,0.19019 3.07878,2.77692 4.56304,5.74842 2.1095,4.22325 2.69813,7.46138 2.69813,14.83296 0,5.18669 -0.40499,9.40396 -0.89973,9.37189 -0.49477,-0.0321 -2.49111,-1.74168 -4.43654,-3.79963 -3.96672,-4.19608 -14.18958,-9.43202 -18.45176,-9.45006 -1.69708,-0.007 -2.60585,-0.60706 -2.30879,-1.52492 0.84791,-2.61984 16.88229,-15.54107 18.83565,-15.17866 z m -32.55532,16.96453 c 2.23976,0.0107 4.4971,0.26706 6.04952,0.73328 2.40983,0.72372 6.93122,1.64158 10.04655,2.04018 6.97622,0.89262 16.49524,7.05621 18.67424,12.09031 0.8648,1.99794 2.0917,4.44999 2.7254,5.44896 0.6337,0.99897 2.20014,3.99506 3.48117,6.65898 2.8102,5.84379 5.27607,9.08231 6.91765,9.08231 0.66941,0 1.54109,1.63434 1.93689,3.63227 0.3958,1.99794 1.33646,3.63227 2.08958,3.63227 0.83969,0 1.08211,-1.05316 0.62818,-2.72393 -2.35536,-8.66901 -2.27055,-11.96771 0.40024,-15.61467 3.00607,-4.10481 2.63893,-5.49826 -0.939,-3.56511 -1.32222,0.7144 -2.80339,3.07421 -3.29251,5.24416 l -0.88992,3.94606 -0.98917,-3.73135 c -0.54404,-2.0521 -2.05707,-4.70677 -3.3623,-5.89928 -2.34617,-2.14357 -2.31526,-2.24227 2.66541,-8.68044 2.77081,-3.58166 5.36695,-6.51254 5.77035,-6.51254 0.40336,0 1.63743,2.0432 2.74174,4.54061 1.10435,2.4974 2.90356,6.17605 3.99812,8.17397 1.24742,2.27698 1.99296,6.42311 1.99687,11.1104 0.005,6.16395 -0.56369,8.30905 -3.24014,12.20812 -3.09067,4.50249 -3.19254,5.11322 -2.13104,12.68046 0.61339,4.37254 1.76469,9.17576 2.55854,10.6733 1.76016,3.54899 5.81274,13.54405 2.97515,22.0061 -0.53356,6.49061 -2.95581,10.59064 -6.8413,18.7691 -7.09182,14.92734 -12.02508,21.38462 -23.10532,30.24945 -11.89078,9.51329 -19.11934,13.04117 -30.25853,14.76689 -4.74406,0.73495 -8.79174,1.2654 -8.99522,1.17809 -0.68502,-0.29396 -14.71305,-2.1741 -20.47155,-2.74375 -5.25849,-0.52018 -10.85071,-1.84154 -15.88558,-3.61355 -6.37468,-2.24353 -11.85338,-5.21048 -14.61287,-8.19929 -4.47761,-4.84972 -7.51631,-13.17841 -7.54473,-20.68048 -0.0144,-3.817 -0.64958,-10.62804 -1.41123,-15.13574 -1.0243,-6.06214 -1.05796,-14.58073 -0.12978,-32.72233 l 1.25418,-24.52635 4.36892,-9.28599 c 4.24048,-9.01463 4.42117,-9.20959 6.19458,-6.65348 2.75219,3.96687 4.50758,3.28149 3.7451,-1.46215 -0.83741,-5.20963 0.75597,-6.77917 6.00589,-5.91909 3.63451,0.59545 4.12168,0.3854 3.74292,-1.613 -0.29667,-1.56525 -1.76898,-2.50398 -4.61975,-2.94524 l -4.18461,-0.64738 4.79751,-1.69338 c 2.63869,-0.93109 7.10411,-1.78281 9.92332,-1.89266 3.3887,-0.13207 6.05478,-1.08053 7.86646,-2.79879 3.09013,-2.93077 17.15067,-8.08898 25.49372,-9.35208 1.17439,-0.17779 2.51248,-0.25961 3.85635,-0.25322 z m -5.01891,3.40545 c -3.13145,-0.0283 -5.53914,1.72104 -5.53914,5.04047 0,2.87362 1.03818,2.74907 4.5456,-0.545 l 2.90098,-2.72502 3.02639,3.93615 c 3.24548,4.21898 4.47711,4.75155 5.83905,2.52684 0.50189,-0.81983 -0.72809,-2.843 -2.94569,-4.84339 -2.51759,-2.27096 -5.39164,-3.36801 -7.82719,-3.39005 z m -66.60476,8.80267 c 2.14921,-0.0893 4.98334,1.0036 8.89379,3.26232 l 6.5861,3.80402 -2.93152,3.88 c -1.61222,2.13396 -4.62916,7.54376 -6.70497,12.02205 -2.07581,4.47828 -4.02381,8.14205 -4.32856,8.14205 -1.10418,0 -5.38826,-11.10985 -6.67881,-17.32126 -1.06094,-5.10647 -0.98498,-7.07164 0.38171,-9.95874 1.16914,-2.46978 2.63303,-3.74114 4.78226,-3.83044 z m -14.26716,35.72812 4.3831,0.80815 c 8.19644,1.51107 9.23055,2.91074 8.78147,11.88221 -0.44216,8.83341 -1.74684,9.53134 -5.5773,2.98487 -1.2384,-2.11647 -2.46175,-3.21305 -2.71776,-2.43765 -0.6848,2.07403 3.24308,9.81924 5.95029,11.73357 1.40553,0.99389 2.60428,3.63834 3.00022,6.61824 0.80593,6.06618 -0.46155,6.30163 -6.25783,1.16378 -6.22415,-5.51712 -6.95009,-7.59555 -7.27208,-20.81921 z m 121.69612,17.63065 c -5.81041,0.0287 -12.47987,2.58567 -17.14522,7.28215 -9.28735,9.34929 -11.85433,28.52187 -5.47043,40.85888 1.84697,3.5693 4.6808,7.16544 6.29709,7.9912 3.75348,1.91768 4.27777,1.90382 11.62683,-0.29947 7.16353,-2.14769 10.77511,-5.96466 15.84196,-16.74432 6.20394,-13.19884 5.64917,-27.80006 -1.34689,-35.4716 -2.25482,-2.47253 -5.8278,-3.63645 -9.80334,-3.61684 z m -0.26283,1.95762 c 1.04722,-0.0265 3.40468,1.41257 6.60245,4.3292 7.8692,7.17731 8.94239,15.68599 3.55861,28.20486 -2.26781,5.2733 -8.00569,12.73694 -12.01289,15.62568 -2.82775,2.0385 -10.60932,2.68681 -13.94107,1.16157 -3.0447,-1.39384 -7.51964,-9.87536 -7.51964,-14.2527 0,-2.69896 0.22938,-2.58599 2.95114,1.45774 1.62289,2.41111 4.67212,4.98933 6.77586,5.72972 15.83242,5.57197 23.95136,-6.83609 18.44303,-28.18614 -0.99829,-3.86937 -2.61716,-8.19175 -3.59786,-9.6053 -2.04377,-2.94579 -2.30687,-4.43817 -1.25963,-4.46463 z m -84.98454,20.60999 c -1.76897,-0.0342 -3.45742,0.20315 -4.84006,0.73879 -3.34817,1.29711 -5.78962,7.80753 -5.68636,15.16436 0.18251,12.99526 7.32059,21.82805 21.65811,26.80545 0.056,0.0195 0.10959,0.0401 0.16578,0.0595 4.05935,1.39524 8.43646,0.65323 11.292,-1.91467 l 3.02968,-2.72504 -1.74278,-8.16186 c -3.04418,-14.25891 -7.95105,-23.06073 -15.41663,-27.65655 -2.34162,-1.44148 -5.51146,-2.25292 -8.45974,-2.30994 z m -4.16498,3.70715 c 0.60366,-0.0702 0.81763,0.99308 0.19849,3.2414 -1.3659,4.96011 0.31697,16.01582 2.06776,20.28301 2.39699,5.84215 10.03782,9.21701 16.60429,7.17975 0.88759,-0.27537 1.75639,-0.64579 2.58907,-1.12634 4.03213,-2.32701 4.79753,-2.23743 4.79753,0.56263 0,1.30851 -1.04372,2.94395 -2.31969,3.63335 -1.99985,1.08052 -2.80501,1.28897 -6.69625,0.71346 -0.98574,-0.14578 -2.11671,-0.32852 -3.57714,-0.57583 -6.49831,-1.10044 -10.91105,-4.27899 -14.48418,-10.43437 -3.38053,-5.8236 -4.09411,-14.11744 -1.71442,-19.91747 0.93767,-2.28536 1.93086,-3.48935 2.53454,-3.55959 z m 107.18903,26.47184 c 0.4432,-0.0498 0.81998,0.33569 1.30435,1.03385 4.4741,6.44875 13.11797,40.82632 14.91278,50.81872 3.07051,5.39452 4.73485,6.47957 8.27433,14.986 3.50877,6.23774 9.95577,16.78978 14.32714,23.44953 5.32137,8.25019 10.79085,18.3537 15.2116,26.17237 3.25508,9.80766 12.86152,19.90475 12.04016,32.10026 4.31598,23.09901 1.24162,43.1878 -8.86871,57.95993 -5.7535,8.40644 -8.67867,10.8589 -17.28809,14.49054 l -4.48562,1.89156 4.78334,-6.36941 c 6.48028,-8.62912 6.06057,-11.09283 -0.70888,-4.16076 -3.11531,3.19019 -9.34399,7.55184 -14.35766,10.05343 -7.90969,3.94654 -10.04496,4.46387 -19.98514,4.84009 -6.12095,0.23164 -11.9384,0.0782 -12.92791,-0.34023 -10.86507,-4.5943 -19.37652,-24.03599 -19.37875,-44.26434 -9e-4,-9.8573 0.44969,-12.3585 3.4201,-18.986 1.01269,-2.25953 1.91417,-5.39237 2.00341,-6.96175 0.0893,-1.56937 0.56641,-2.85339 1.06115,-2.85385 0.49477,-4.7e-4 0.89974,-2.42089 0.89974,-5.37848 0,-2.95759 0.53999,-5.71449 1.19966,-6.12608 2.38225,-1.48639 1.34171,-9.73497 -1.577,-12.5032 -3.30535,-3.13489 -5.9463,-3.34012 -8.5917,-0.66942 -1.79238,1.80953 -1.88102,1.69118 -1.1353,-1.5139 1.14385,-4.91623 4.03097,-10.98687 6.0168,-12.65073 1.37055,-1.14834 1.69418,-0.87277 1.71551,1.45885 0.0348,3.78417 3.8436,12.04604 6.7006,14.53459 4.28867,3.73555 7.53542,3.93453 10.77834,0.66061 4.02186,-4.0603 5.28742,-9.00238 3.62732,-14.17015 -2.40924,-7.49984 -10.82681,-9.17949 -16.45925,-3.28434 l -2.58907,2.70962 0.72524,-4.81477 c 0.91793,-6.09288 3.92984,-10.21685 9.89061,-13.54585 7.61104,-4.25069 15.15044,-4.18425 17.96971,0.15965 1.76177,2.71453 1.77193,3.46682 0.10142,8.17397 -3.23172,9.10649 -0.99437,13.70275 1.59445,16.93039 1.84834,2.3044 1.06169,5.13155 6.99725,5.46658 6.71289,0.37886 7.47651,0.16295 9.29515,-2.63915 5.8386,-8.99603 -9.51745,-22.47519 -15.60641,-13.6989 -1.14686,1.65304 -1.8671,2.03238 -1.8671,0.98321 0,-2.68596 5.06884,-9.46541 8.13038,-10.87368 8.80546,-4.0504 19.34301,1.79266 24.99314,13.85855 3.83209,8.18344 3.7727,18.58385 -0.19411,33.99731 -4.05481,15.75527 -3.21526,19.92779 1.19964,5.96092 4.38629,-13.87631 5.46675,-30.18966 2.58035,-38.96291 -3.14301,-9.5532 -7.6694,-14.02709 -18.67752,-18.46191 -9.72226,-1.56548 -9.90162,3.60805 -17.08742,-4.55053 -12.95567,-5.8106 -23.71241,-3.94203 -30.31306,11.42199 -3.05451,6.35351 -9.76711,6.15996 -12.00635,18.27254 -0.78434,10.47181 0.68316,16.87994 4.74954,20.73663 3.19005,3.02554 3.36306,6.12648 0.71106,12.75532 -0.79929,1.99793 -1.74122,10.4444 -2.09285,18.7691 -0.71367,16.89603 0.87739,26.58166 6.19239,37.70446 1.666,3.48648 3.02858,6.46496 3.02858,6.61823 0,1.41315 -12.78692,4.6602 -18.0755,4.59017 -7.4301,-0.0984 -21.91802,-5.99456 -26.07719,-10.61275 -5.39419,-5.98952 -6.13984,-26.84424 -1.84529,-51.62025 0.98122,-5.6608 2.01982,-12.7178 2.3077,-15.68295 1.20432,-12.40513 7.09914,-29.19262 16.39163,-46.67667 10.41735,-19.60057 16.68161,-33.29489 16.2095,-35.43525 -0.28907,-1.31045 -1.89406,1.02267 -4.26423,6.19874 -5.02044,10.96396 -15.75717,29.84207 -16.97291,29.84207 -2.05208,0 -3.81336,-3.69723 -5.10834,-10.72724 -1.56361,-8.48827 -4.01596,-8.78777 -2.70468,-0.33031 0.47827,3.08464 1.02999,7.44175 1.22583,9.68237 0.19584,2.24061 0.96314,5.55496 1.70569,7.36474 1.09579,2.67077 0.91301,4.4116 -0.96954,9.24526 -1.27563,3.27536 -3.49318,10.31439 -4.92839,15.6422 -1.43522,5.32782 -2.92947,10.5045 -3.32086,11.50347 -0.3914,0.99897 -0.91209,2.36073 -1.15604,3.02671 -0.40475,1.10498 -2.93687,15.74756 -6.49121,37.5371 -0.76044,4.66184 -1.77392,10.80421 -2.25317,13.64936 -0.55699,3.30668 -0.35645,6.17562 0.55621,7.95157 0.78527,1.52809 1.76728,4.14416 2.18228,5.81339 0.41498,1.66924 2.06526,4.98528 3.66767,7.36913 l 2.91406,4.33361 -3.78327,-1.0834 c -5.72625,-1.64066 -10.37918,-3.72082 -10.37918,-4.6397 0,0 -4.74378,-2.48848 -9.97021,-11.93836 -1.83578,-3.31929 -3.7305,-7.4898 -5.50095,-12.7234 -2.14132,-6.59378 -3.03618,-9.94822 -5.56203,-20.84122 -6.80615,-29.35202 0.0547,-66.2298 17.61308,-94.67568 2.80006,-4.53628 6.87367,-11.71897 9.05303,-15.9615 l 3.96213,-7.71376 0,8.55054 c 0,5.18834 0.54815,8.89272 1.39377,9.42033 1.04711,0.65335 1.16924,-2.5655 0.48968,-12.9458 -1.50959,-23.05975 -1.3689,-23.53763 6.7704,-22.88252 8.20671,0.66054 14.40618,0.52504 19.13339,-0.41838 9.51977,-1.89995 33.01377,-20.45381 39.97136,-31.56627 1.91616,-3.06043 2.83958,-4.35081 3.57824,-4.43381 z m -47.30125,13.00525 c -0.86962,-0.0186 -1.87638,0.12642 -3.14417,0.41509 -4.63041,1.05431 -10.09673,5.41781 -10.09673,8.05947 0,2.37867 0.99943,1.97626 4.08755,-1.64822 2.37756,-2.79049 3.68073,-3.2467 9.15444,-3.20177 6.26957,0.0514 6.33739,0.0151 3.78547,-2.07102 -1.26728,-1.03598 -2.33719,-1.52262 -3.78656,-1.55355 z m 70.86352,7.16984 c 0.40037,-0.003 0.84936,0.005 1.35344,0.021 5.8099,0.17841 24.40812,9.2828 34.13777,16.71129 9.54374,7.28656 17.77232,18.37519 26.4349,35.62132 6.73229,13.40313 6.89305,13.95214 6.86966,23.6114 -0.0183,7.57712 -0.62588,11.16345 -2.5978,15.33831 l -2.57379,5.44896 -0.14069,-11.50346 c -0.12051,-9.841 -0.70324,-12.99071 -4.02974,-21.79581 -5.35329,-14.16994 -14.13986,-29.98067 -19.67868,-35.40993 -6.47323,-6.34517 -26.6098,-17.05271 -28.72952,-15.27666 -1.70339,1.42722 -2.16287,6.12146 -0.73942,7.5585 1.63259,1.64823 3.83535,12.27845 3.88796,18.76801 0.0374,4.60391 -0.69644,7.74055 -2.49854,10.6843 -2.9017,4.7399 -2.95806,4.70663 -8.55462,-4.9689 -4.02089,-6.95143 -4.07155,-7.20142 -1.90964,-9.38401 3.33424,-3.36612 2.81217,-10.76876 -1.45048,-20.57368 -2.01923,-4.6446 -3.50418,-9.91226 -3.29905,-11.70605 0.29261,-2.55863 0.71572,-3.12566 3.51824,-3.14451 z m -63.64706,1.75394 c -1.04434,0.0141 -2.46583,1.56743 -2.46583,3.04432 0,0.95965 0.48188,1.74512 1.07097,1.74512 1.21582,0 2.87159,-3.68836 2.03505,-4.5329 -0.17873,-0.18044 -0.39918,-0.25979 -0.64019,-0.25654 z m -17.80612,4.91496 c -0.47471,-5.7e-4 -0.89473,0.11824 -1.16912,0.39527 -0.44719,0.45148 -0.0183,1.32814 0.95208,1.9477 2.32175,1.48241 3.56298,1.45313 3.56298,-0.0848 0,-1.17055 -1.92182,-2.2561 -3.34594,-2.2582 z m 96.26782,9.56016 c 2.88779,0 18.87053,9.90451 23.41941,14.51255 5.92597,6.00304 16.21269,24.90663 20.35921,37.4138 2.87471,8.67098 3.41646,22.21569 1.2182,30.45753 -1.17258,4.39621 -1.67896,4.93725 -3.96431,4.23672 -1.44116,-0.44176 -4.83562,-1.10251 -7.54364,-1.46875 -3.92682,-0.53109 -5.3842,-0.17465 -7.19682,1.76273 -2.25485,2.41005 -2.29906,2.37052 -5.58603,-5.00853 -5.17038,-11.52849 -11.5105,-21.28762 -19.54018,-31.82612 l -4.04065,-6.22627 2.29789,-4.80265 c 1.8804,-3.92933 2.22574,-6.87003 1.89545,-16.1751 -0.22203,-6.25492 -0.80756,-13.96079 -1.30108,-17.12418 -0.49347,-3.16339 -0.50152,-5.75173 -0.0174,-5.75173 z m -137.03968,2.49271 c 1.29984,0.0792 2.40995,0.6166 3.2707,1.66365 1.05639,1.28505 1.09527,2.92928 0.15268,6.35619 -0.69943,2.54284 -1.27483,7.50888 -1.27818,11.03552 -0.005,5.19877 0.55114,6.97428 2.93805,9.384 1.6192,1.63467 4.04803,2.97276 5.39736,2.97276 2.86338,0 3.02176,0.95605 0.67726,4.08149 -2.136,2.8475 -8.82395,1.90281 -12.05652,-1.70328 -2.42498,-2.70518 -2.92923,-11.17875 -1.24,-20.84453 0.9558,-5.4691 0.87203,-5.75063 -1.71442,-5.75063 -1.52832,0 -3.18487,0.88101 -4.94475,2.57639 -3.37598,3.25226 -7.13965,9.55544 -11.15678,18.7669 -3.15796,7.24136 -7.36905,16.81006 -9.35839,21.26402 -1.98932,4.45393 -4.83517,9.25318 -6.32435,10.66559 l -2.70794,2.56867 -0.75687,-3.04322 c -0.82575,-3.32149 3.5001,-15.45495 10.52314,-29.51506 7.04231,-14.09869 16.28734,-25.07609 23.33652,-28.96126 1.94506,-1.072 3.72457,-1.6097 5.24249,-1.5172 z m -3.5586,9.01075 -1.04916,4.23783 c -1.57264,6.35105 -1.26542,17.04142 0.61946,21.55249 0.92905,2.22348 3.38059,4.90776 5.52931,6.05451 l 3.85962,2.06002 -10.02802,15.13572 c -5.86562,8.85341 -10.91699,17.99539 -12.16995,22.02482 l -2.14191,6.88798 -2.15066,-6.11176 c -1.18272,-3.36185 -4.22607,-8.38705 -6.76386,-11.16655 l -4.59031,-5.02727 -0.024,-0.0264 9.29186,-21.86958 c 3.11463,-7.33049 5.47462,-12.72736 7.43458,-16.87315 3.90607,-8.26234 6.1954,-11.46307 9.50562,-14.45639 l 2.67741,-2.42226 z m 7.48801,41.77493 c 0.35201,0 -0.24208,2.0432 -1.32071,4.54062 -3.72329,8.62091 -7.43147,21.52244 -8.78801,30.57424 -0.74855,4.99482 -1.75533,12.351 -2.2368,16.34686 l -0.87575,7.26563 -1.58682,-4.23783 c -0.87326,-2.33091 -2.34956,-5.68512 -3.2805,-7.4528 -3.29267,-7.31215 1.70381,-17.89689 5.50314,-26.35404 0,-2.13408 11.28687,-20.68268 12.58545,-20.68268 z m -46.18011,14.53127 c 1.88569,0 5.2075,1.31312 8.21871,3.02781 2.18792,1.24588 4.21311,2.70198 5.39953,4.02644 2.27634,2.54114 11.58102,24.79187 11.58102,27.69397 0,2.1274 5.49734,10.89486 7.18811,11.46383 0.75128,0.25284 1.55166,4.83712 1.87146,10.71623 0.3074,5.65103 0.83063,12.87791 1.16257,16.0606 0.89633,8.59453 6.59123,25.40204 11.06189,33.0218 0.27677,0.47171 0.54983,0.91644 0.81578,1.31353 l 4.16389,6.21747 -7.02343,2.58519 c -2.82465,1.03975 -6.65805,2.36349 -9.77063,3.38564 -1.14453,0.37585 -2.20357,0.71575 -3.0624,0.9788 -6.24852,1.9139 -17.14824,2.15026 -25.18508,0.54502 -21.96138,-4.38645 -37.87373,-40.67413 -35.40504,-57.28832 0,0 1.51516,-10.39138 1.95216,-17.11757 0.21103,-3.24815 -1.16711,-5.56107 -1.46903,-6.75255 l 6.28618,1.89704 c 7.87798,-0.63559 10.04328,-2.71731 10.04328,-2.71731 1.10837,-3.75963 -3.42816,-8.80598 -4.74626,-10.50374 -2.05656,-2.64888 -3.42232,-3.64935 -6.89692,-2.88798 -3.05014,0.66837 -3.76192,0.98953 -4.3602,6.07983 -0.57471,4.88993 -0.23332,5.4756 -1.69478,3.99671 -0.93245,-0.94358 -1.93664,-4.65118 -2.23135,-8.23894 -0.79714,-9.70423 3.43866,-16.62923 11.62028,-18.9981 4.48447,-1.29844 5.9368,0.59537 3.69711,4.82026 -2.29606,4.33125 0.58222,13.72229 5.55658,18.13161 1.87572,1.66266 3.84668,2.74766 5.76705,3.32069 6.44253,1.92238 12.30453,-1.98115 11.99545,-9.71212 -0.16779,-4.19674 -1.55137,-7.64033 -3.5706,-9.84312 -2.58973,-2.82511 -6.2258,-3.60909 -9.68448,-1.32124 -2.87198,1.89981 -3.09573,2.61829 -2.5618,8.22794 0.56179,5.90271 0.51757,6.01582 -1.12005,2.86045 -2.78562,-5.3674 -3.40684,-14.48186 -1.11786,-16.3997 1.06446,-0.89187 1.93582,-2.35871 1.93582,-3.25903 0,-1.95883 6.06219,-5.33114 9.58304,-5.33114 z m 157.53303,8.60118 c 1.70157,-0.0484 3.57353,0.76449 5.20868,2.59841 3.34326,3.74968 4.20181,6.71578 2.74066,9.47208 -2.64687,4.99302 -13.14712,0.6868 -13.14712,-5.39169 0,-4.12508 2.36183,-6.59812 5.19778,-6.6788 z m -26.60831,0.0165 c 1.39247,0.0143 2.73557,0.87354 4.30566,2.58189 3.67579,3.99951 4.019,9.10307 0.82776,12.32483 -2.74558,2.77186 -5.05115,2.35337 -9.00285,-1.63612 -4.22862,-4.26904 -4.43138,-7.26919 -0.72961,-10.7801 1.76505,-1.67403 3.20657,-2.50483 4.59904,-2.4905 z m -133.92494,6.71292 c 1.66017,0.0719 3.37312,1.27962 4.6143,3.0278 1.21908,1.71707 1.98286,3.9553 1.77003,6.18113 -0.30353,3.17449 -0.95339,3.98335 -3.43537,4.27528 -0.95045,0.11179 -1.84605,-0.0483 -2.66432,-0.40518 -4.55864,-1.98818 -6.68063,-10.17857 -2.06232,-12.67385 0.56687,-0.30628 1.16827,-0.43155 1.77768,-0.40518 z m -32.43863,4.5307 c 0.65982,0.12064 0.66854,1.58491 0.66854,5.45666 0,3.43251 0.6569,8.16202 1.71768,10.39364 l 2.11793,4.45472 -3.68403,-0.96449 c -4.21037,-0.85012 -6.6577,1.98104 -6.50212,7.52218 0.0638,2.27213 2.05431,3.72915 1.86492,3.72915 -1.35193,0 -6.305477,-8.80139 -6.289454,-13.09993 0.02215,-5.91021 3.821434,-13.66681 8.075844,-16.4867 1.00454,-0.6658 1.6348,-1.07761 2.03069,-1.00523 z m 150.75062,6.65568 c 0.9008,-0.0231 2.00081,0.39653 3.22381,1.39719 1.95561,1.60011 2.66876,3.27441 2.3993,5.63612 -0.48852,4.28127 -3.74932,4.98909 -6.26656,1.36086 -2.96568,-4.27457 -2.05894,-8.32475 0.64345,-8.39417 z m -137.91215,1.11313 c 1.21831,-0.0309 2.56033,0.44306 3.91414,1.78474 2.31321,2.29252 4.71301,7.27075 4.0014,9.14288 -0.55753,1.16053 -7.19842,2.24198 -9.05412,0.42721 -2.62753,-1.85799 -3.54599,-9.21366 -1.4254,-10.53678 0.74437,-0.46444 1.61641,-0.79405 2.56398,-0.81805 z m 168.96791,1.58986 c -3.4209,-0.0715 -6.99516,0.61217 -10.44462,2.19324 -10.70932,4.90868 -15.58077,20.38228 -8.62769,27.40551 1.73036,1.7478 4.96915,3.61214 7.19683,4.14314 6.20951,1.48008 8.47936,1.3731 15.49408,-0.72998 8.99996,-2.69825 15.54355,-9.34216 15.53769,-15.77432 -0.01,-10.00737 -8.89359,-17.02311 -19.15629,-17.23759 z m -1.02844,2.55217 c 0.81389,0.0134 1.64258,0.0853 2.48547,0.22131 17.39722,2.80851 20.73118,18.39199 5.6013,26.18447 -5.63881,2.90422 -13.54061,3.89784 -18.57937,2.33637 -16.12406,-4.99672 -6.05632,-29.01492 10.4926,-28.74215 z m -181.31124,9.75065 c 0.53974,-0.0318 1.16433,0.18884 1.99469,0.63749 3.74851,2.02533 5.47072,4.72875 4.65794,7.31408 -1.04232,3.31543 -3.37595,3.89679 -6.25129,1.55794 -3.31522,-2.69666 -4.14021,-5.57059 -2.32079,-8.08259 0.67184,-0.92756 1.22548,-1.38601 1.91945,-1.42692 z m 247.38053,30.93538 4.34711,4.13983 c 6.1158,5.82413 18.00637,12.98777 31.33275,18.87701 16.23656,7.17531 17.39062,7.87334 17.39062,10.51695 0,5.11799 -19.79408,12.33349 -41.37932,15.08398 -11.02092,1.40387 -23.7609,1.40889 -26.98566,0.01 -1.31933,-0.57237 -3.96339,-1.0784 -5.87503,-1.12525 l -3.47572,-0.0848 4.0461,-2.75366 c 8.87459,-6.03775 16.77916,-22.00117 19.81827,-40.0265 l 0.78088,-4.6375 z" + style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path3431" /> + </g> + </svg> + </div>--> + </a> + </div> + + <!-- Navigation starts --> + <div class="navbar-collapse collapse" id="navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right"> + <li> + <a class="navbar-link" href="https://www.owasp.org/index.php/OWASP_Threat_Dragon" target="_blank"> + Threat Dragon project page + </a> + </li> + <li> + <a class="navbar-link" href="https://www.owasp.org" target="_blank"> + <div> + <?xml version="1.0" encoding="UTF-8" standalone="no" ?> + <svg xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + version="1.1" + id="svg4185" + viewBox="0 0 1666.5741 510.50331" + height="25px" + width="82px"> + <defs id="defs4187" /> + <metadata id="metadata4190"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g transform="translate(-46.777852,-288.4997)" + id="layer1"> + <path id="path4215" + d="m 278.125,798.40643 c -51.84067,-4.86516 -100.85267,-25.41155 -141.25,-59.21359 -7.24254,-6.06011 -24.34475,-23.16265 -30.40149,-30.40208 -32.498186,-38.84399 -51.469146,-82.35022 -58.458166,-134.0625 -1.64999,-12.20837 -1.64999,-49.66663 0,-61.875 5.40432,-39.987 17.4235,-73.63539 37.83736,-105.92789 10.11659,-16.00336 20.792956,-29.2257 35.362076,-43.79482 20.68993,-20.68993 40.44831,-35.01188 65.97272,-47.82065 28.99671,-14.55125 59.53413,-23.23162 92.1875,-26.20464 8.86429,-0.80708 36.12885,-0.8075 45,-7e-4 51.63149,4.69572 97.46124,23.22347 138.93184,56.16649 8.84706,7.02783 30.2223,28.48074 37.75753,37.89471 47.49079,59.33161 66.25749,134.90525 51.9927,209.375 -7.79282,40.68265 -25.49217,78.76713 -51.9927,111.875 -7.53523,9.41397 -28.91047,30.86688 -37.75753,37.89472 -41.4706,32.94301 -87.30035,51.47077 -138.93184,56.16648 -8.0812,0.73496 -38.15584,0.68909 -46.25,-0.0705 z m 35.625,-39.30644 c 62.69347,-3.91108 118.25949,-32.66232 157.02134,-81.24673 25.57584,-32.05697 40.41109,-68.13029 45.88037,-111.5625 1.02902,-8.17158 1.02902,-36.82842 0,-45 -4.17339,-33.1414 -13.34166,-60.77296 -28.77966,-86.73681 -49.08306,-82.5486 -144.84545,-122.91884 -237.50804,-100.1255 -30.39664,7.47704 -58.43095,21.35085 -83.48901,41.31765 -8.83159,7.03719 -26.00747,24.21307 -33.04468,33.04466 -26.65842,33.45598 -42.127646,71.44747 -46.697986,114.6875 -0.97712,9.24452 -0.97712,31.38048 0,40.625 4.57034,43.24002 20.039566,81.23152 46.697986,114.6875 7.03721,8.83159 24.21309,26.00747 33.04468,33.04466 36.35656,28.96967 79.98744,45.41571 125.9375,47.47034 9.21603,0.41209 11.37322,0.39089 20.9375,-0.20577 z m 65.7271,-37.68441 c -10.86864,-11.15679 -32.33536,-49.08423 -36.95288,-65.2884 -4.2034,-14.75093 -7.04094,-34.94966 -6.28521,-44.74066 0.57505,-7.45021 1.55719,-10.41409 5.63407,-17.00244 7.69372,-12.43327 9.21042,-16.6603 9.96799,-27.78082 0.22247,-3.26562 1.3758,-15.58619 2.56295,-27.37902 1.18716,-11.79285 2.15847,-21.69607 2.15847,-22.00717 0,-0.3111 -1.19532,-0.88237 -2.65625,-1.2695 -1.46094,-0.38712 -4.36477,-1.60496 -6.45295,-2.70631 l -3.79671,-2.00244 1.10875,2.91798 c 4.34016,11.42237 -0.13105,23.45686 -15.561,41.88327 -7.72808,9.22885 -27.44935,29.17803 -34.82933,35.23184 -17.02055,13.96198 -41.55268,28.81836 -71.25,43.1482 -16.315,7.87247 -23.96167,11.24232 -24.43541,10.76858 -0.96068,-0.96068 18.23103,-40.21925 27.79634,-56.86021 13.62258,-23.69949 23.75388,-37.35116 39.10354,-52.69108 22.95078,-22.93622 36.71304,-33.52637 47.80521,-36.78642 4.85579,-1.42715 12.75937,-1.29741 16.20482,0.26601 1.49848,0.67994 2.81811,1.23627 2.93251,1.23627 0.1144,0 -0.47547,-1.19531 -1.31083,-2.65625 -0.83537,-1.46094 -2.11199,-4.4272 -2.83694,-6.5917 l -1.31809,-3.93544 -2.59558,0.35173 c -4.1145,0.55758 -39.27721,3.98235 -48.11772,4.68657 -10.18822,0.81156 -14.25664,2.20583 -24.26127,8.31444 -11.12615,6.79337 -11.79806,6.98024 -24.90408,6.92625 -11.87819,-0.0489 -18.64222,-0.98228 -34.05848,-4.69959 -11.61779,-2.80139 -20.66238,-6.71423 -38.2963,-16.56759 -11.02521,-6.16058 -19.23197,-11.34653 -26.16184,-16.53196 -7.02657,-5.25778 -9.60839,-8.09104 -9.60839,-10.54412 0,-2.05597 1.07582,-2.51123 8.75,-3.70272 14.41511,-2.23808 57.71548,-2.44491 83.75001,-0.40004 28.11934,2.20863 66.23462,7.62711 105.20836,14.95646 11.11354,2.09 11.14725,2.09234 11.62377,0.80419 0.42905,-1.15983 -0.29501,-1.66687 -7.08337,-4.96035 -4.1587,-2.01766 -8.8724,-4.23387 -10.47489,-4.92492 -2.12914,-0.91817 -3.98647,-2.54629 -6.89824,-6.04696 -7.30967,-8.78804 -11.75063,-15.07477 -11.75063,-16.63446 0,-0.18895 0.49218,-0.34172 1.09375,-0.3395 1.57105,0.006 6.35791,4.29805 12.48746,11.1972 5.19166,5.8435 5.43882,6.02719 10.36365,7.70233 l 5.04515,1.71607 -2.02688,-2.09122 c -2.237,-2.30799 -2.66062,-3.61468 -6.02409,-18.5822 -2.87098,-12.77589 -2.88098,-17.61753 -0.028,-13.5443 0.54007,0.77106 2.87633,7.24419 5.19169,14.38474 l 4.20975,12.98282 5.46875,2.83218 c 3.00781,1.5577 5.46875,2.62365 5.46875,2.36876 0,-0.25488 -1.29499,-3.77473 -2.87776,-7.82189 l -2.87776,-7.35849 1.01336,-7.98876 c 1.85268,-14.60547 3.63549,-21.50247 5.15981,-19.96117 0.73472,0.74292 0.52884,12.03937 -0.35694,19.5854 l -0.74693,6.363 5.34524,8.20381 c 2.93989,4.51209 5.60749,8.04173 5.92801,7.84364 2.22647,-1.37604 13.07324,-1.39803 18.27099,-0.0371 l 1.67054,0.43741 -1.27042,-3.9619 c -0.83234,-2.59573 -1.2935,-5.81281 -1.33737,-9.32952 -0.0607,-4.86848 0.12263,-5.75272 1.97184,-9.509 2.1427,-4.35245 5.23138,-7.44275 8.69314,-8.69773 1.42997,-0.5184 2.22111,-1.33297 2.69797,-2.77787 1.31249,-3.97688 6.77272,-6.91169 11.28789,-6.0671 4.2745,0.79957 8.58063,4.8029 8.73213,8.11809 0.13673,2.99223 6.19625,-12.43286 6.19625,-15.77317 0,-2.79128 -1.8942,-7.65308 -5.3252,-13.66811 -3.03882,-5.32746 -3.34093,-7.38592 -1.13025,-7.70077 1.10183,-0.15692 1.8596,0.66591 4.02908,4.375 7.8937,13.49569 8.14164,17.35626 2.01644,31.39846 -1.7814,4.08392 -2.00451,5.04301 -1.26893,5.45466 5.09549,2.85158 12.8328,10.43556 15.83966,15.52577 1.31173,2.22059 0.83541,2.28507 9.2767,-1.25601 10.87898,-4.5637 15.45295,-4.12489 27.34375,2.62326 4.5182,2.56413 5.46875,3.367 5.46875,4.61911 0,2.1642 -2.32286,1.99753 -6.30443,-0.45235 -4.68602,-2.88334 -12.46809,-6.14072 -14.69148,-6.14949 -2.1344,-0.008 -6.5942,1.4341 -12.66535,4.09661 l -3.97376,1.7427 2.6213,1.23371 c 8.14378,3.83287 8.03771,16.43305 -0.16261,19.31873 -1.07422,0.37802 -2.07129,1.40755 -2.6086,2.69352 -1.36198,3.25968 -5.67982,7.50066 -9.26067,9.09581 -4.43586,1.97604 -13.40674,2.04455 -18.76971,0.14337 -2.74333,-0.97252 -3.54751,-1.07682 -3.29844,-0.42778 0.18114,0.47207 0.6531,2.71736 1.04878,4.98955 0.66182,3.80046 0.55655,6.87513 -0.43765,12.78204 l -0.37675,2.2384 7.965,5.17663 7.96499,5.17664 6.63094,-0.68155 c 6.44032,-0.66196 12.29846,-0.93017 17.09969,-0.7829 3.25055,0.0997 3.12087,1.68945 -0.211,2.58663 -3.61305,0.97289 -11.02187,2.21604 -18.79063,3.15294 l -6.65788,0.80294 -6.77962,-2.58955 c -3.72879,-1.42425 -7.26246,-2.76602 -7.8526,-2.9817 -0.78257,-0.28602 -0.27509,1.14723 1.875,5.29551 2.72674,5.26084 3.13288,5.73854 5.4119,6.36534 6.22488,1.71208 23.16582,7.50388 24.49377,8.37399 5.63771,3.69396 -4.48921,2.657 -24.19903,-2.47791 -4.06512,-1.05907 -6.24121,-1.98938 -7.52071,-3.21522 -0.99023,-0.94873 -1.80043,-1.58097 -1.80043,-1.40499 0,0.17597 0.67585,2.30704 1.50188,4.73569 1.22192,3.59257 2.0666,4.9178 4.53125,7.10907 7.13942,6.34752 13.96687,13.62256 13.96687,14.88249 0,0.72141 -0.29115,1.31165 -0.64699,1.31165 -1.2732,0 -7.90113,-4.75121 -16.02161,-11.48504 -4.40469,-3.65253 -4.56768,-3.8954 -9.5572,-14.24043 -4.83882,-10.03257 -6.35535,-12.04401 -7.27459,-9.64854 -0.18488,0.48179 0.79793,7.02085 2.18402,14.53125 8.81665,47.77224 13.25856,81.44557 15.11614,114.59276 0.97442,17.38777 0.4285,59.82632 -0.88439,68.75 -1.34592,9.14823 -1.94089,10.625 -4.28067,10.625 -1.43313,0 -2.61925,-0.77117 -5.0951,-3.31268 z m 1020.8354,-73.59662 c -40.4992,-2.45539 -59.8943,-13.66813 -65.1087,-37.64067 -1.0053,-4.62204 -1.3198,-9.00959 -1.5885,-22.16878 l -0.3351,-16.40625 13.5161,0 13.5162,0 0.022,12.34375 c 0.014,7.73091 0.3489,14.17901 0.8971,17.25482 3.4043,19.10041 17.8569,25.60477 56.8936,25.60477 37.9159,0 52.6065,-6.2214 56.5609,-23.95334 1.137,-5.09836 1.5552,-22.10844 0.6701,-27.25382 -1.3739,-7.98604 -5.5425,-14.47223 -11.5724,-18.00599 -5.8965,-3.45554 -11.6339,-4.6905 -51.1652,-11.01313 -42.7517,-6.83772 -39.9919,-6.33556 -46.9934,-8.5505 -16.2283,-5.13392 -26.4863,-15.32578 -30.6868,-30.48906 -1.3587,-4.90491 -1.9331,-27.61608 -0.9385,-37.11436 3.009,-28.73811 17.793,-40.40077 57.2503,-45.16298 10.4577,-1.26215 44.4825,-1.09102 55.625,0.27979 27.9666,3.44058 43.1753,11.18303 50.3138,25.61374 3.6185,7.31494 4.9496,14.36243 5.4262,28.72756 l 0.3887,11.71875 -13.4445,0 -13.4444,0 -0.3651,-9.84375 c -0.4752,-12.80795 -1.7993,-17.83674 -6.157,-23.38286 -4.2614,-5.42352 -13.8634,-9.56591 -26.7802,-11.5533 -5.5918,-0.86037 -11.0725,-1.10588 -24.6875,-1.10588 -19.8162,0 -27.8747,0.87823 -37.5,4.08686 -16.3247,5.44188 -20.7018,13.88497 -20.2028,38.96925 0.2157,10.84709 0.2909,11.41276 2.0168,15.17185 2.8057,6.11081 7.6377,9.97782 15.3735,12.3033 1.8907,0.56834 20.5938,3.83085 41.5625,7.25001 43.4197,7.07999 45.5625,7.48318 52.5253,9.8832 17.2326,5.9398 27.0937,17.07982 30.0334,33.92856 0.839,4.80886 0.9587,8.64762 0.6696,21.48026 -0.3622,16.07521 -0.9483,20.77361 -3.5023,28.07506 -4.6891,13.40515 -16.0415,22.20089 -34.7935,26.95773 -15.2259,3.86238 -40.3338,5.42995 -63.995,3.99541 z m -727.18751,-0.61595 c -34.38477,-3.01318 -52.07594,-12.34014 -58.8607,-31.03193 -3.26332,-8.99036 -3.32178,-10.40157 -3.32178,-80.19282 0,-69.79125 0.0584,-71.20246 3.32178,-80.19282 6.84291,-18.85201 24.51257,-28.17132 58.94032,-31.08622 13.6045,-1.15185 46.33494,-0.46787 57.00519,1.19126 29.07512,4.52096 43.736,14.53027 48.82194,33.33195 2.37343,8.77413 2.53075,13.54525 2.53075,76.75583 0,63.33483 -0.15419,67.97136 -2.55575,76.84683 -5.19463,19.19815 -21.00975,29.47752 -51.50675,33.47788 -9.38788,1.23143 -44.04675,1.80512 -54.375,0.90004 z m 50.35968,-22.37746 c 18.05194,-3.21572 25.937,-8.9008 29.83007,-21.50725 0.89687,-2.90432 1.03662,-10.21655 1.22718,-64.21504 0.22413,-63.50159 0.0958,-67.43492 -2.41393,-74.01779 -3.73944,-9.80822 -12.57825,-15.36671 -29.11038,-18.30668 -9.12537,-1.6228 -45.29606,-1.58898 -54.18118,0.0507 -19.07379,3.51984 -27.00964,9.73797 -30.28671,23.73113 -0.94407,4.03123 -1.04923,10.52389 -1.04947,64.79267 -2.9e-4,66.51731 -0.0255,66.03335 3.84333,73.7667 2.52527,5.04772 6.23334,8.58801 11.73814,11.207 5.98804,2.84891 11.87513,4.15357 26.60577,5.89619 1.20312,0.14233 9.92187,0.17607 19.375,0.075 14.01012,-0.14981 18.52493,-0.42205 24.42218,-1.47257 z m 151.89475,22.35133 c -28.98543,-3.24003 -44.33462,-13.74003 -49.40131,-33.79418 -2.42406,-9.59455 -2.54062,-14.26291 -2.54062,-101.75481 l 0,-85.02463 13.42068,0 13.42075,0 0.19457,87.03125 c 0.18268,81.71388 0.26337,87.26036 1.32087,90.78125 4.35644,14.50473 12.94331,19.94032 34.13025,21.60497 14.69225,1.15438 29.61206,-0.72631 37.50931,-4.72818 4.00882,-2.0314 8.35338,-5.97132 10.35963,-9.3947 0.83475,-1.42439 2.14812,-4.81557 2.91869,-7.53595 l 1.40093,-4.94614 0.17907,-86.40625 0.17906,-86.40625 13.40369,0 13.40368,0 0.17907,86.40625 0.17906,86.40625 1.40094,4.94614 c 0.77056,2.72038 2.08393,6.11156 2.91868,7.53595 2.00625,3.42338 6.35082,7.3633 10.35963,9.3947 7.89725,4.00187 22.81705,5.88256 37.50925,4.72818 18.2192,-1.43147 26.8114,-5.58333 31.5236,-15.23248 4.1944,-8.58869 4.0886,-6.00377 4.0886,-99.89186 l 0,-84.29313 13.4375,0 13.4375,0 0,85.02463 c 0,56.02646 -0.2272,87.06195 -0.6661,90.99819 -1.5308,13.72832 -5.0356,22.21446 -12.0712,29.22824 -5.3954,5.37867 -9.7614,8.02398 -17.7672,10.76503 -11.2396,3.84824 -18.8043,4.81704 -37.933,4.85807 -15.01245,0.0322 -17.53033,-0.11045 -22.81251,-1.29246 -15.45163,-3.45766 -26.6845,-9.75777 -34.05307,-19.09905 l -3.1155,-3.94964 -2.99525,3.73212 c -5.78287,7.20563 -12.93731,12.23774 -22.53862,15.85275 -10.09725,3.80174 -15.23413,4.59297 -31.36006,4.83043 -7.90625,0.11642 -16.7355,-0.0522 -19.62057,-0.37468 z m 248.21518,-91.35487 0.1896,-90.15625 1.387,-5.18709 c 4.6372,-17.3412 15.2931,-26.77703 36.2034,-32.05798 13.6844,-3.45606 19.8902,-3.98914 46.4379,-3.98914 26.062,0 32.2878,0.51055 45.5335,3.73401 21.6707,5.27376 32.3508,14.59984 37.1375,32.42919 l 1.3615,5.07101 0.1855,90.15625 0.1855,90.15625 -13.1392,0 -13.1393,0 0,-40.625 0,-40.625 -58.125,0 -58.125,0 0,40.625 0,40.625 -13.1413,0 -13.1412,0 0.1896,-90.15625 z m 142.1714,-48.4375 c -0.2353,-27.30001 -0.47,-34.36298 -1.2528,-37.69963 -3.1529,-13.43909 -10.8443,-19.37988 -29.5997,-22.8625 -9.0593,-1.6822 -45.1427,-1.6822 -54.2021,0 -14.8649,2.76022 -22.4241,6.94885 -26.5666,14.72099 -3.7906,7.11201 -3.9463,8.77843 -4.2836,45.84114 l -0.3056,33.59375 58.2499,0 58.25,0 -0.2895,-33.59375 z m 278.9215,28.90625 0,-109.6875 54.968,0 c 45.038,0 56.248,0.1678 62.0537,0.92886 25.6801,3.36637 40.956,13.48708 47.7973,31.6672 3.7845,10.05674 4.0322,13.20305 3.7714,47.8944 -0.2234,29.70837 -0.2947,31.30519 -1.6247,36.38454 -5.4792,20.92418 -19.7578,32.79432 -45.2224,37.59446 -6.6751,1.25826 -9.4421,1.34476 -51.2746,1.6029 l -44.2187,0.27286 0,31.51489 0,31.51489 -13.125,0 -13.125,0 0,-109.6875 z m 107.9552,24.64001 c 11.4191,-1.27331 20.0538,-5.14125 25.6371,-11.48429 3.2706,-3.71556 5.3519,-7.91181 7.1449,-14.40572 1.315,-4.76286 1.3819,-6.18571 1.4091,-30 0.024,-21.51925 -0.1217,-25.65264 -1.0502,-29.6875 -2.4712,-10.7384 -8.3806,-18.70041 -16.8583,-22.71388 -9.5606,-4.52617 -7.9063,-4.3877 -55.3316,-4.63112 l -42.6562,-0.21894 0,56.90697 0,56.90697 37.8371,0 c 22.8527,0 40.2256,-0.26632 43.8681,-0.67249 z" + style="fill:#ffffff" /> + </g> + </svg> + </div> + <!--<img src="../../Content/images/owasp.png" height="25" />--> + </a> + </li> + </ul> + </div> + </div> +</nav> \ No newline at end of file diff --git a/td/public/app/report/ElementSummaryPane.html b/td/public/app/report/ElementSummaryPane.html new file mode 100644 index 000000000..7acdb1522 --- /dev/null +++ b/td/public/app/report/ElementSummaryPane.html @@ -0,0 +1,75 @@ +<div ng-if="element.properties.outOfScope"> + <p> + This element is out of scope. The stated reason is: {{element.properties.reasonOutOfScope}} + </p> +</div> +<div ng-if="!element.properties.outOfScope" ng-switch="element.type"> + <div ng-switch-when="Process"> + <p> + <strong>Privilege level:</strong> {{element.properties.privilegeLevel}} + </p> + </div> + <div ng-switch-when="Actor"> + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="element.properties.providesAuthentication" /> Provides authentication + </label> + </div> + </div> + <div ng-switch-when="Store"> + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="element.properties.isALog" /> Is a log + </label> + </div> + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="element.properties.storesCredentials" /> Stores credentials + </label> + </div> + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="element.properties.isEncrypted" /> Is encrypted + </label> + </div> + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="element.properties.isSigned" /> Is signed + </label> + </div> + </div> + <div ng-switch-when="Flow"> + <strong>Protocol:</strong> {{element.properties.protocol}} + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="selected.elementProperties.isEncrypted" /> Is encrypted + </label> + </div> + <div class="checkbox"> + <label> + <input ng-disabled="true" type="checkbox" ng-model="selected.elementProperties.isPublicNetwork" /> Is over a public network + </label> + </div> + </div> + <div ng-switch-default></div> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + Threats + </div> + <div class="panel-body"> + <ul class="list-group"> + <li class="list-group-item" ng-repeat="threat in element.properties.threats"> + <p><strong>{{threat.title}}</strong> ({{threat.type}}, + <span ng-class="{Open:'severity-high', Mitigated:'severity-low'}[threat.status]">{{threat.status}}</span>, + <span ng-class="{Low:'severity-low', Medium:'severity-medium', High:'severity-high'}[threat.severity]"> {{threat.severity}} severity</span>) + </p> + <p><strong>Description</strong></p> + <p>{{threat.description}}</p> + <p><strong>Mitigations</strong></p> + <p>{{threat.mitigation}}</p> + <p ng-if="!threat.mitigation || threat.mitigation.length == 0">None</p> + </li> + </ul> + </div> + </div> +</div> diff --git a/td/public/app/report/report.js b/td/public/app/report/report.js new file mode 100644 index 000000000..685f6cfea --- /dev/null +++ b/td/public/app/report/report.js @@ -0,0 +1,75 @@ +(function () { + 'use strict'; + + // Controller name is handy for logging + var controllerId = 'report'; + + // Define the controller on the module. + // Inject the dependencies. + // Point to the controller definition function. + angular.module('app').controller(controllerId, + ['$routeParams', '$window', 'common', 'datacontext', 'diagramming', report]); + + function report($routeParams, $window, common, datacontext, diagramming) { + // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel). + var vm = this; + var getLogFn = common.logger.getLogFn; + var log = getLogFn(controllerId); + + // Bindable properties and functions are placed on vm. + vm.title = 'Report'; + vm.threatModel = {}; + vm.print = print; + vm.initialise = initialise; + + + activate(); + + function activate() { + common.activateController([getThreatModel()], controllerId).then(function () { log('Activated Report View'); }); + } + + function getThreatModel() + { + return datacontext.getThreatModelDetail($routeParams.threatModelId).then(function (data) { + vm.threatModel = data; + + vm.threatModel.detail.diagrams.forEach(function (diagram) + { + var graph = diagramming.newGraph(); + graph.diagramId = diagram.id; + diagram.graph = graph; + }) + }); + } + + function initialise(diagram) + { + datacontext.getThreatModelDiagram(vm.threatModel.summary.id, diagram.model.diagramId).then(onGetThreatModelDiagram, onError); + + function onGetThreatModelDiagram(data) + { + diagramming.initialise(diagram.model, data.diagramJson); + diagramming.scaleContent(diagram, { maxScale: 4 }); + diagram.model.attributes.cells.models.forEach(function (element) { getElementProperties(diagram.model.diagramId, element) }); + } + } + + function getElementProperties(diagramId, element) + { + datacontext.getElementProperties(diagramId, element.id).then(function (data) { + element.properties = data + }); + } + + function print() + { + $window.print(); + } + + function onError(error) { + vm.loaded = false; + logError(error); + } + } +})(); diff --git a/td/public/app/report/reportdirectives.js b/td/public/app/report/reportdirectives.js new file mode 100644 index 000000000..5e3312441 --- /dev/null +++ b/td/public/app/report/reportdirectives.js @@ -0,0 +1,31 @@ +(function () { + 'use strict'; + + var app = angular.module('app'); + + app.directive('tmtElementSummary', ['common', function (common) { + + var directive = + { + link: link, + templateUrl: './app/report/ElementSummaryPane.html', + restrict: 'E', + scope: + { + element: '=' + } + }; + + return directive; + + function link(scope, element, attrs) + { + var type = scope.element.attributes.type.split('.')[1]; + scope.element.type = type; + } + + }]); + +})(); + + diff --git a/td/public/app/report/threatmodelreport.html b/td/public/app/report/threatmodelreport.html new file mode 100644 index 000000000..fa19dac4e --- /dev/null +++ b/td/public/app/report/threatmodelreport.html @@ -0,0 +1,81 @@ +<div data-ng-controller="report as vm" class="container-fluid"> + <button class="btn btn-link" ng-click="vm.print()"> + <span class="glyphicon glyphicon-print"></span> Print + </button> + <div ng-if="vm.threatModel.summary"> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <a href="#/threatmodel/edit/{{vm.threatModel.summary.id}}"><h4>{{vm.threatModel.summary.title}}</h4></a> + </div> + <div class="panel-body"> + <div class="col-md-2"> + <div><strong>Owner: </strong></div> + <div>{{vm.threatModel.summary.owner}}</div> + </div> + <div class="col-md-2"> + <div><strong>Reviewer: </strong></div> + <div>{{vm.threatModel.detail.reviewer}}</div> + </div> + <div class="col-md-8"> + <div><strong>Contributors: </strong></div> + <div> + <span ng-repeat="contributor in vm.threatModel.detail.contributors"> {{contributor.name}}<span ng-show=" ! $last ">;</span></span> + </div> + </div> + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <h4>High level system description</h4> + </div> + <div class="panel-body"> + <div class="col-md-12">{{vm.threatModel.summary.description}}</div> + </div> + </div> + <div ng-repeat="diagram in vm.threatModel.detail.diagrams"> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <h4>Diagram: {{diagram.title}}</h4> + </div> + <div class="tmt-diagram panel-body"> + <tmt-diagram graph="diagram.graph" initialise-graph="vm.initialise(diagram)" height="600" width="800" grid-size="1" interactive="false" /> + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <h4>Diagram elements</h4> + </div> + <div class="panel-body"> + <div ng-repeat="element in diagram.graph.attributes.cells.models"> + <div ng-if="element.attributes.type != 'tm.Boundary' "> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <strong>{{element.name}}</strong> ({{element.type}}) + </div> + <div class="panel-body"> + <tmt-element-summary element="element"> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + <div ng-if="!vm.threatModel.summary"> + <div class="jumbotron"> + <h1>oooops!</h1> + <p> + It looks like you tried to view a threat model that doesn't exist. Maybe you typed the + address wrong? Or if you clicked a link to get here, the threat model might have been + deleted since you made the link <span class="fa fa-frown-o"></span> + </p> + <p> + <a href="#/threatmodels">Take me back to the list of threat models</a> + </p> + </div> + </div> + <button class="btn btn-link" ng-click="vm.print()"> + <span class="glyphicon glyphicon-print"></span> Print + </button> +</div> diff --git a/td/public/app/services/datacontext.js b/td/public/app/services/datacontext.js new file mode 100644 index 000000000..f0e0944d8 --- /dev/null +++ b/td/public/app/services/datacontext.js @@ -0,0 +1,195 @@ +(function () { + 'use strict'; + + var serviceId = 'datacontext'; + angular.module('app').factory(serviceId, + ['$q', 'common', 'config', datacontext]); + + function datacontext($q, common, config) { + + var getLogFn = common.logger.getLogFn; + var log = getLogFn(serviceId); + var logError = getLogFn(serviceId, 'error'); + var logSuccess = getLogFn(serviceId, 'success'); + + var modelsJson = localStorage.models; + var models = []; + + if (angular.isDefined(modelsJson)) { models = JSON.parse(modelsJson); } + + var service = { + clearStorage: clearStorage, + getThreatModelCount: getThreatModelCount, + getThreatModelSummaries: getThreatModelSummaries, + saveThreatModel: saveThreatModel, + deleteThreatModel: deleteThreatModel, + getThreatModelDetail: getThreatModelDetail, + getAllThreatModelDetails: getAllThreatModelDetails, + getThreatModelDiagram: getThreatModelDiagram, + saveThreatModelDiagram: saveThreatModelDiagram, + getElementProperties: getElementProperties, + saveElementProperties: saveElementProperties, + deleteElementProperties: deleteElementProperties + }; + + return service; + + function clearStorage() + { + models = []; + localStorage.clear() + return $q.when(models); + } + + //threat models + + function getThreatModelCount() + { + var count = models.length; + return $q.when(count); + } + + function getThreatModelSummaries() + { + var threatModelSummaries = []; + models.forEach(addThreatModelSummary); + return $q.when(threatModelSummaries); + + function addThreatModelSummary(threatModel) + { + threatModelSummaries.push(threatModel.summary); + } + } + + function saveThreatModel(threatModel) + { + if (threatModel) + { + if (angular.isUndefined(threatModel.summary.id)) + { + //new model + var newId = getNewThreatModelKey(); + threatModel.summary.id = newId; + } + + models[threatModel.summary.id] = threatModel; + localStorage.models = JSON.stringify(models); + } + + return $q.when(threatModel); + } + + function deleteThreatModel(threatModel) + { + models.splice(threatModel.summary.id, 1); + localStorage.models = JSON.stringify(models); + return $q.when(threatModel); + } + + function getAllThreatModelDetails() + { + return $q.when(models); + } + + function getThreatModelDetail(id) + { + var threatModel = models[id]; + return $q.when(threatModel); + } + + // diagrams + + function getThreatModelDiagram(threatModelId, diagramId) + { + var deferred = $q.defer(); + var diagram = {}; + + var threatModel = models[threatModelId]; + + if (threatModel) { + + diagram = threatModel.detail.diagrams[diagramId]; + + if (angular.isDefined(diagram)) { + deferred.resolve(diagram); + } + else { + deferred.reject('datacontext: Unable to find diagram id = ' + diagramId); + } + } + else + { + deferred.reject('datacontext: Unable to find threatmodel id = ' + threatModelId); + } + + return deferred.promise; + } + + function saveThreatModelDiagram(threatModelId, diagramId, diagramData) + { + var threatModel = models[threatModelId]; + var diagram = threatModel.detail.diagrams[diagramId]; + diagram.diagramJson = diagramData.diagramJson; + diagram.size = diagramData.size; + localStorage.models = JSON.stringify(models); + return $q.when(null); + } + + //diagram element properties + + function getElementProperties(threatModelId, diagramId, elementId) + { + var elementProperties = models[threatModelId].elementProperties[elementId] + return $q.when(elementProperties); + } + + function saveElementProperties(elementProperties) + { + //generate a key for new threats + if (angular.isDefined(elementProperties.threats)) + { + elementProperties.threats.forEach(function (threat, index, threats) { + if (angular.isUndefined(threat.id)) { + var newKey = 0; + var keys = _.keys(threats); + + if (keys.length > 0) { newKey = parseInt(_.max(keys)) + 1; } + threat.id = newKey;; + } + }); + } + + var threatModelId = elementProperties.threatModelId + var diagramId = elementProperties.diagramId; + var elementId = elementProperties.elementId; + + var model = models[threatModelId]; + + if (angular.isUndefined(model.elementProperties)) { model.elementProperties = {} } + + model.elementProperties[elementId] = elementProperties; + localStorage.models = JSON.stringify(models); + + return $q.when(elementProperties); + } + + function deleteElementProperties(threatModelId, diagramId, elementId) + { + delete models[threatModelId].elementProperties[elementId]; + localStorage.models = JSON.stringify(models); + } + + + //key management methods + + function getNewThreatModelKey() + { + var newKey = 0; + var keys = _.keys(models); + + if (keys.length > 0) { newKey = parseInt(_.max(keys)) + 1; } + + return newKey; + } + } +})(); \ No newline at end of file diff --git a/td/public/app/services/diagramming.js b/td/public/app/services/diagramming.js new file mode 100644 index 000000000..705b9e08c --- /dev/null +++ b/td/public/app/services/diagramming.js @@ -0,0 +1,213 @@ +(function () { + 'use strict'; + + // Factory name is handy for logging + var serviceId = 'diagramming'; + + // Define the factory on the module. + // Inject the dependencies. + // Point to the factory definition function. + angular.module('app').factory(serviceId, ['common', diagramming]); + + function diagramming(common) { + + var zoomScaleFactor = 1.25; + + // Define the functions and properties to reveal. + var service = { + newGraph: newGraph, + initialise: initialise, + resize: resize, + scaleContent: scaleContent, + zoom: zoom, + newProcess: newProcess, + newStore: newStore, + newActor: newActor, + newFlow: newFlow, + newBoundary: newBoundary, + getElements: getElements, + getLinks: getLinks, + clear: clear, + cellCount: cellCount, + getCellById: getCellById + }; + + return service; + + function newGraph() + { + return new joint.dia.Graph;; + } + + function initialise(graph, diagramJson) + { + graph.fromJSON(JSON.parse(diagramJson)); + graph.attributes.cells.models.forEach(function (cell) { addNameProperty(cell) }); + } + + function resize(diagram, size) + { + diagram.setDimensions(size.width, size.height); + } + + function scaleContent(diagram) + { + diagram.scaleContentToFit(); + } + + function zoom(diagram, zoomLevel) + { + var factor = Math.pow(zoomScaleFactor, zoomLevel); + diagram.scale(factor); + } + + function newProcess(graph) + { + var cell = newElement('joint.shapes.tm.Process', 50, 50, 'process ' + graph.attributes['cells'].length) + graph.addCell(cell); + + return cell; + } + + function newStore(graph) + { + var cell = newElement('joint.shapes.tm.Store', 50, 50, 'store ' + graph.attributes['cells'].length) + graph.addCell(cell); + + return cell; + } + + function newActor(graph) + { + var cell = newElement('joint.shapes.tm.Actor', 50, 50, 'actor ' + graph.attributes['cells'].length) + graph.addCell(cell); + + return cell; + } + + function newFlow(graph, source, target) + { + var cell = flow(source, target, 'flow ' + graph.attributes['cells'].length); + graph.addCell(cell); + + return cell; + } + + function newBoundary(graph) + { + var cell = boundary(); + graph.addCell(cell); + + return cell; + } + + function getElements(graph) + { + return graph.getElements(); + } + + function getLinks(graph) + { + return graph.getLinks(); + } + + function clear(graph) + { + graph.clear(true); + } + + function cellCount(graph) + { + return graph.attributes.cells.length; + } + + function getCellById(graph, id) + { + return graph.getCell(id); + } + + //private + + function newElement(type, x, y, label) { + var ShapeClass = common.utils.stringToFunction(type); + var cell = new ShapeClass({ + position: { x: x, y: y }, + attrs: { text: { text: label } } + }); + + addNameProperty(cell); + + return cell; + } + + function flow(source, target, label) { + + var newTarget = target ? { id: target.id } : { x: 110, y: 100 }; + var newSource = source ? { id: source.id } : { x: 30, y: 20 } + + var cell = new joint.shapes.tm.Flow({ + target: newTarget, + source: newSource, + vertices: [] + }); + + cell.setLabel(label); + + addNameProperty(cell); + + return cell; + } + + function boundary(source, target, label) { + + var cell = new joint.shapes.tm.Boundary({ + target: target ? target : { x: 110, y: 100 }, + source: source ? source : { x: 30, y: 20 }, + vertices: [] + }); + + if (label) { + cell.setLabel(label); + } + + addNameProperty(cell); + + return cell; + } + + function addNameProperty(element) { + if (element.isLink()) { + Object.defineProperty(element, 'name', { + get: function () { return wordUnwrap(this.attributes.labels[0].attrs.text.text) }, + set: function (value) { editNameLink(this, value) } + }); + } + else { + Object.defineProperty(element, 'name', { + get: function () { return wordUnwrap(this.attr('text/text')) }, + set: function (value) { editNameElement(this, value) } + }); + } + } + + function editNameElement(element, value) { + element.attr('text/text', wordWrap(element, value)); + } + + function editNameLink(element, value) { + element.label(0, { attrs: { text: { text: wordWrap(element, value) } } }); + } + + function wordWrap(element, text) { + + var size = element.isLink() ? { width: 140, height: 80 } : element.get('size'); + return joint.util.breakText(text, size); + } + + function wordUnwrap(text) { + return text.replace('\n', ' '); + } + + + } +})(); \ No newline at end of file diff --git a/td/public/app/services/dialogs.js b/td/public/app/services/dialogs.js new file mode 100644 index 000000000..e702b56b7 --- /dev/null +++ b/td/public/app/services/dialogs.js @@ -0,0 +1,98 @@ +(function () { + 'use strict'; + + // Factory name is handy for logging + var serviceId = 'dialogs'; + + // Define the factory on the module. + // Inject the dependencies. + // Point to the factory definition function. + angular.module('app').factory(serviceId, ['$rootScope', '$location', '$modal', dialogs]); + + function dialogs($rootScope, $location, $modal) { + + // Define the functions and properties to reveal. + var service = { + confirm: confirm, + stucturedExit: stucturedExit + }; + + return service; + + function stucturedExit(event, cancelNavigation, continueNavigation) { + + var exitModal = $modal.open({ + templateUrl: './app/layout/structuredExit.html', + controller: structuredExitModal, + keyboard: false, + backdrop: 'static', + resolve: { + destination: function () { return $location.path(); }, + cancel: function () { return cancelNavigation; }, + ok: function () { return continueNavigation; } + } + }); + + event.preventDefault(); + } + + function structuredExitModal($scope, $modalInstance, $location, destination, cancel, ok) { + $scope.onCancel = onCancel; + $scope.onOK = onOK; + + function onCancel() { + cancel(destination); + $modalInstance.close(); + } + + function onOK() { + ok(destination); + $modalInstance.close(); + $location.path(destination); + } + } + + function confirm(template, onOkPreClose, getParameter, onCancelPreClose, windowClass) { + + var options = { + templateUrl: template, + controller: confirmModal, + keyboard: false, + backdrop: 'static', + resolve: { + ok: function () { return onOkPreClose; }, + cancel: function () { return onCancelPreClose; }, + parameter: function () { return getParameter; } + } + } + + if (windowClass) { + + options.windowClass = windowClass; + + } + + var modal = $modal.open(options); + } + + function confirmModal($scope, $modalInstance, ok, cancel, parameter) { + $scope.onCancel = onCancel; + $scope.onOK = onOK; + + if (parameter) + { + $scope.parameter = parameter(); + } + + function onCancel() { + if (angular.isDefined(cancel)) { cancel(); } + $modalInstance.close(); + } + + function onOK() { + if (angular.isDefined(ok)) { ok(); } + $modalInstance.close(); + } + } + } +})(); \ No newline at end of file diff --git a/td/public/app/services/file.js b/td/public/app/services/file.js new file mode 100644 index 000000000..d160bf080 --- /dev/null +++ b/td/public/app/services/file.js @@ -0,0 +1,60 @@ +(function () { + 'use strict'; + + // Factory name is handy for logging + var serviceId = 'file'; + + // Define the factory on the module. + // Inject the dependencies. + // Point to the factory definition function. + angular.module('app').factory(serviceId, ['$window', file]); + + function file($window) { + + // Define the functions and properties to reveal. + var service = { + saveToFile: saveToFile + }; + + return service; + + function saveToFile(fileName, content, contentType) { + + //based on SeaSponge (https://github.com/mozilla/seasponge) + + //defaults + var contentType = contentType || 'text/plain'; + var fileName = fileName || 'download.txt'; + var content = content || ''; + + //Create Blob + var blob; + + if (content instanceof Blob) { + blob = content; + } + else { + blob = new Blob([content], { type: contentType }); + } + + //need handle differently for IE + var isIE = false; + if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { + isIE = true; + } + + if (isIE) { + window.navigator.msSaveOrOpenBlob(blob, fileName); + } + else { + var url = $window.URL.createObjectURL(blob); + + //Create link + var link = $('<a>', { download: fileName, href: url }).append('body')[0]; + var event; + event = new MouseEvent('click'); + link.dispatchEvent(event); + } + } + } +})(); \ No newline at end of file diff --git a/td/public/app/services/routemediator.js b/td/public/app/services/routemediator.js new file mode 100644 index 000000000..51be1c4cd --- /dev/null +++ b/td/public/app/services/routemediator.js @@ -0,0 +1,52 @@ +(function () { + 'use strict'; + + // Factory name is handy for logging + var serviceId = 'routemediator'; + + // Define the factory on the module. + // Inject the dependencies. + // Point to the factory definition function. + angular.module('app').factory(serviceId, ['$rootScope', '$location', 'config', 'logger' , routemediator]); + + function routemediator($rootScope, $location, config, logger) { + + // Define the functions and properties to reveal. + var handleRouteChangeError = false; + var service = { + setRoutingHandlers: setRoutingHandlers, + }; + + return service; + + function setRoutingHandlers() { + updateDocTitle(); + handleRoutingErrors(); + } + + function handleRoutingErrors() { + $rootScope.$on('$routeChangeError', + function (event, current, previous, rejection) { + + if (handleRouteChangeError) + { + return; + } + + handleRouteChangeError = true; + var msg = 'Error routing: ' + (current && current.name); + logger.logWarning(msg, current, serviceId, true); + $location.path('/'); + }); + } + + function updateDocTitle() { + $rootScope.$on('$routeChangeSuccess', + function (event, current, previous) { + handleRouteChangeError = false; + var title = config.docTitle + ' ' + (current.title || ''); + $rootScope.title = title; + }); + } + } +})(); \ No newline at end of file diff --git a/td/public/app/services/threatengine.js b/td/public/app/services/threatengine.js new file mode 100644 index 000000000..940cacc12 --- /dev/null +++ b/td/public/app/services/threatengine.js @@ -0,0 +1,127 @@ +(function () { + 'use strict'; + + // Factory name is handy for logging + var serviceId = 'threatengine'; + + // Define the factory on the module. + // Inject the dependencies. + // Point to the factory definition function. + angular.module('app').factory(serviceId, ['$q', threatengine]); + + function threatengine($q) { + + // Define the functions and properties to reveal. + var service = { + generateForElement: generateForElement, + generateForElementInContext: generateForElementInContext, + generateForGraph: generateForElement + }; + + var Threats = function () + { + this.collection = []; + } + + var Element = function (element) + { + this.type = element.attributes.type; + } + + var flow = initialiseFlow(); + + return service; + + function generateForElement(element) + { + //todo: implement proper rule engine, probably rete based + + var threats = new Threats(); + var el = new Element(element); + + return flow.getSession(threats, el).match().then(function () { return $q.when(threats.collection) }); + } + + function generateForElementInContext(element) + { + //todo + return []; + } + + function generateForGraph(graph) + { + //todo + return []; + } + + function initialiseFlow() + { + return nools.flow('Element threat generation', function (flow) { + + flow.rule('Generic Spoofing Threat Rule', [ + ['or', + [Element, 'el', 'el.type == "tm.Process"'], + [Element, 'el', 'el.type == "tm.Actor"'] + ], + [Threats, 'threats'] + ], function (facts) { + facts.threats.collection.push({ title: 'Generic spoofing threat', type: 'Spoofing', status: 'Open', severity: 'Medium', description: 'A generic spoofing threat' }); + }); + + flow.rule('Generic Tampering Threat Rule', [ + ['or', + [Element, 'el', 'el.type == "tm.Process"'], + [Element, 'el', 'el.type == "tm.Store"'], + [Element, 'el', 'el.type == "tm.Flow"'] + ], + [Threats, 'threats'] + ], function (facts) { + facts.threats.collection.push({ title: 'Generic tampering threat', type: 'Tampering', status: 'Open', severity: 'Medium', description: 'A generic tampering threat' }); + }); + + flow.rule('Generic Repudiation Threat Rule', [ + ['or', + [Element, 'el', 'el.type == "tm.Process"'], + [Element, 'el', 'el.type == "tm.Store"'], + [Element, 'el', 'el.type == "tm.Actor"'] + ], + [Threats, 'threats'] + ], function (facts) { + facts.threats.collection.push({ title: 'Generic repudiation threat', type: 'Repudiation', status: 'Open', severity: 'Medium', description: 'A generic repudiation threat' }); + }); + + flow.rule('Generic Information Disclosure Threat Rule', [ + ['or', + [Element, 'el', 'el.type == "tm.Process"'], + [Element, 'el', 'el.type == "tm.Store"'], + [Element, 'el', 'el.type == "tm.Flow"'] + ], + [Threats, 'threats'] + ], function (facts) { + facts.threats.collection.push({ title: 'Generic information disclosure threat', type: 'Information disclosure', status: 'Open', severity: 'Medium', description: 'A generic information disclosure threat' }); + }); + + flow.rule('Generic Denial of Service Threat Rule', [ + ['or', + [Element, 'el', 'el.type == "tm.Process"'], + [Element, 'el', 'el.type == "tm.Store"'], + [Element, 'el', 'el.type == "tm.Flow"'] + ], + [Threats, 'threats'] + ], function (facts) { + facts.threats.collection.push({ title: 'Generic DoS threat', type: 'Denial of service', status: 'Open', severity: 'Medium', description: 'A generic DoS threat' }); + }); + + flow.rule('Generic Elevation of Privilege Rule', [ + ['or', + [Element, 'el', 'el.type == "tm.Process"'] + ], + [Threats, 'threats'] + ], function (facts) { + facts.threats.collection.push({ title: 'Generic elevation threat', type: 'Elevation of privilege', status: 'Open', severity: 'Medium', description: 'A generic elevation threat' }); + }); + + }); + } + } +})(); \ No newline at end of file diff --git a/td/public/app/threatmodels/confirmReloadOnDirty.html b/td/public/app/threatmodels/confirmReloadOnDirty.html new file mode 100644 index 000000000..cf8e64d33 --- /dev/null +++ b/td/public/app/threatmodels/confirmReloadOnDirty.html @@ -0,0 +1,13 @@ +<div> + <div class="modal-header"> + <h3>Are you sure?</h3> + </div> + <div class="modal-body"> + Your threat model has unsaved changes and if you reload they will be lost! + Press Cancel to keep the unsaved changes, or press OK to reload the threat model and lose the unsaved changes. + </div> + <div class="modal-footer"> + <button class="btn btn-default" ng-click="onOK()">OK</button> + <button class="btn btn-primary" ng-click="onCancel()">Cancel</button> + </div> +</div> diff --git a/td/public/app/threatmodels/threatmodel.js b/td/public/app/threatmodels/threatmodel.js new file mode 100644 index 000000000..8014d3698 --- /dev/null +++ b/td/public/app/threatmodels/threatmodel.js @@ -0,0 +1,181 @@ +(function () +{ + 'use strict'; + + // Controller name is handy for logging + var controllerId = 'threatmodel'; + + // Define the controller on the module. + // Inject the dependencies. + // Point to the controller definition function. + angular.module('app').controller(controllerId, + ['$rootScope','$scope', '$location','$routeParams', 'dialogs', 'common', 'datacontext', threatModel]); + + function threatModel($rootScope, $scope, $location, $routeParams, dialogs, common, datacontext) + { + // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel). + var vm = this; + var getLogFn = common.logger.getLogFn; + var log = getLogFn(controllerId); + var logError = getLogFn(controllerId, 'error'); + + // Bindable properties and functions are placed on vm. + vm.title = 'ThreatModelDetail'; + vm.threatModel = {}; + vm.removeContributor = removeContributor; + vm.addContributor = addContributor; + vm.removeDiagram = removeDiagram; + vm.addDiagram = addDiagram; + vm.save = save; + vm.reload = reload, + vm.delete = deleteThreatModel; + vm.cancel = cancel; + vm.newContributor = ''; + vm.addingContributor = false; + vm.cancelAddingContributor = cancelAddingContributor; + vm.startAddingContributor = startAddingContributor; + vm.newDiagram = emptyDiagram(); + vm.addingDiagram = false; + vm.cancelAddingDiagram = cancelAddingDiagram; + vm.startAddingDiagram = startAddingDiagram; + + //structured exit + $scope.$watch(function () { if (angular.isDefined(vm.threatModelEditForm)) { return vm.threatModelEditForm.$dirty}}, function (dirty) { + if (angular.isDefined(dirty)) { vm.dirty = dirty} + }); + + $scope.$on('$locationChangeStart', + function (event, current, previous) + { + if (vm.dirty) { + dialogs.stucturedExit(event, function () { }, function () { vm.dirty = false; }); + } + }); + + activate(); + + function activate() + { + common.activateController([getThreatModel()], controllerId) + .then(function () { log('Activated Threat Model Detail View'); }); + } + + function getThreatModel() + { + if ($routeParams.threatModelId === 'new') + { + return vm.threatModel = { summary: {}, detail: { contributors: [], diagrams: [] }}; + } + + return datacontext.getThreatModelDetail($routeParams.threatModelId).then(function (data) { + + if (vm.threatModelEditForm) + { + vm.threatModelEditForm.$setPristine(); + } + else { + vm.dirty = false; + } + + return vm.threatModel = data; + }); + } + + function save() + { + datacontext.saveThreatModel(vm.threatModel).then(function () { + vm.dirty = false; //prevents structured exit + $location.path('/threatmodels'); + }); + } + + function reload() + { + if (vm.dirty) + { + dialogs.confirm('./app/threatmodels/confirmReloadOnDirty.html', getThreatModel, function () { return null }, function () { }); + } + else + { + getThreatModel(); + } + } + + function deleteThreatModel() + { + datacontext.deleteThreatModel(vm.threatModel).then( onDelete, logError ) + } + + function onDelete() + { + vm.dirty = false; + $location.path('/threatmodels'); + } + + function cancel() + { + if (vm.threatModel.summary.id) + { + $location.path('/threatmodel/' + vm.threatModel.summary.id); + } + else + { + $location.path('/threatmodels'); + } + } + + function removeContributor(index) + { + vm.threatModel.detail.contributors.splice(index, 1); + vm.dirty = true; + } + + function removeDiagram(index) + { + vm.threatModel.detail.diagrams.splice(index, 1); + vm.dirty = true; + } + + function addContributor() + { + vm.threatModel.detail.contributors.push({ name: vm.newContributor }); + vm.newContributor = ''; + vm.addingContributor = false; + vm.dirty = true; + } + + function cancelAddingContributor() { + vm.addingContributor = false; + vm.newContributor = ''; + } + + function startAddingContributor() { + vm.addingContributor = true; + } + + function addDiagram() + { + vm.newDiagram.id = vm.threatModel.detail.diagrams.length; + vm.threatModel.detail.diagrams.push(vm.newDiagram); + vm.newDiagram = emptyDiagram(); + vm.addingDiagram = false; + vm.dirty = true; + } + + function cancelAddingDiagram() + { + vm.addingDiagram = false; + vm.newDiagram = emptyDiagram(); + } + + function startAddingDiagram() + { + vm.addingDiagram = true; + } + + function emptyDiagram() + { + return { title: '', thumbnail: "../../content/images/thumbnail.jpg" }; + } + } +})(); diff --git a/td/public/app/threatmodels/threatmodeldetail.html b/td/public/app/threatmodels/threatmodeldetail.html new file mode 100644 index 000000000..b85ee96db --- /dev/null +++ b/td/public/app/threatmodels/threatmodeldetail.html @@ -0,0 +1,89 @@ +<div data-ng-controller="threatmodel as vm" class="container-fluid"> + <p> + <a href="#/">Home </a><span class="glyphicon glyphicon-chevron-right"></span> + <a href="#/threatmodels"> Threat models</a><span class="glyphicon glyphicon-chevron-right"></span> + Threat model details + </p> + <div ng-if="vm.threatModel.summary"> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <a href="#/threatmodel/edit/{{vm.threatModel.summary.id}}"><h4>{{vm.threatModel.summary.title}}</h4></a> + </div> + <div class="panel-body"> + <div class="col-md-2"> + <div><strong>Owner: </strong></div> + <div>{{vm.threatModel.summary.owner}}</div> + </div> + <div class="col-md-2"> + <div><strong>Reviewer: </strong></div> + <div>{{vm.threatModel.detail.reviewer}}</div> + </div> + <div class="col-md-8"> + <div><strong>Contributors: </strong></div> + <div> + <span ng-repeat="contributor in vm.threatModel.detail.contributors"> {{contributor.name}}<span ng-show=" ! $last ">;</span></span> + </div> + </div> + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <h4>High level system description</h4> + </div> + <div class="panel-body"> + <div class="col-md-12">{{vm.threatModel.summary.description}}</div> + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <h4>Threat Model Diagrams</h4> + </div> + <div class="panel-body"> + <div ng-repeat-start="diagram in vm.threatModel.detail.diagrams"> + <div class="col-md-3"> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <a href="#/threatmodel/{{vm.threatModel.summary.id}}/diagram/{{diagram.id}}"><h6>{{diagram.title}}</h6></a> + </div> + <div class="panel-body"> + <a href="#/threatmodel/{{vm.threatModel.summary.id}}/diagram/{{diagram.id}}"> + <img src="{{diagram.thumbnail}}" class="img-thumbnail center-block" alt="Thumbnail of {{diagram.title}}" /> + </a> + </div> + </div> + </div> + </div> + <div ng-if="(($index+1) % 5) == 0" class="clearfix visible-lg-block"></div> + <div ng-repeat-end ng-hide></div> + </div> + </div> + <div class="row"> + <div class="col-md-12"> + <div class="btn-group pull-right" role="group"> + <a class="btn btn-primary" href="#/threatmodel/edit/{{vm.threatModel.summary.id}}" role="button" data-toggle="tooltip" data-placement="top" title="Edit This Threat Model"> + <span class="glyphicon glyphicon-edit"></span> Edit + </a> + <a class="btn btn-default" href="#/threatmodel/report/{{vm.threatModel.summary.id}}/?suppressbanner=true" target="_blank" role="button" data-toggle="tooltip" data-placement="top" title="EView and Print Threat Model Report"> + <span class="glyphicon glyphicon-print"></span> Print + </a> + <button class="btn btn-default" role="button" ng-click="vm.delete()" data-toggle="tooltip" data-placement="top" title="Delete This Threat Model"> + <span class="glyphicon glyphicon-remove"></span> Delete + </button> + </div> + </div> + </div> + </div> + <div ng-if="!vm.threatModel.summary"> + <div class="jumbotron"> + <h1>oooops!</h1> + <p> + It looks like you tried to view a threat model that doesn't exist. Maybe you typed the + address wrong? Or if you clicked a link to get here, the threat model might have been + deleted since you made the link <span class="fa fa-frown-o"></span> + </p> + <p> + <a href="#/threatmodels">Take me back to the list of threat models</a> + </p> + </div> + </div> +</div> \ No newline at end of file diff --git a/td/public/app/threatmodels/threatmodeledit.html b/td/public/app/threatmodels/threatmodeledit.html new file mode 100644 index 000000000..49c634720 --- /dev/null +++ b/td/public/app/threatmodels/threatmodeledit.html @@ -0,0 +1,179 @@ + +<div data-ng-controller="threatmodel as vm" class="container-fluid"> + <!--breadcrumbs--> + <p> + <a href="/#/">Home </a><span class="glyphicon glyphicon-chevron-right"></span> + <a href="/#/threatmodels"> Threat models</a><span class="glyphicon glyphicon-chevron-right"></span> + <a href="/#/threatmodel/{{vm.threatModel.summary.id}}"> Threat model detail</a><span class="glyphicon glyphicon-chevron-right"></span> + Edit threat model + </p> + <div class="panel panel-default" ng-if="vm.threatModel.summary"> + <!--heading--> + <div class="panel panel-heading"> + <h4>Editing: {{vm.threatModel.summary.title}}</h4> + </div> + <div class="panel panel-body"> + <form name="vm.threatModelEditForm"> + <!--title--> + <div class="form-group col-md-12"> + <label>Title</label> + <input name="threatModelTitle" class="form-control" type="text" ng-model="vm.threatModel.summary.title" ng-required="true" placeholder="Threat model title" /> + <div ng-show="vm.threatModelEditForm.threatModelTitle.$dirty && !vm.threatModelEditForm.threatModelTitle.$valid"> + <p> + <div class="alert alert-danger" role="alert"> + <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> + <span class="sr-only">Error:</span> + The threat model title cannot be empty. + </div> + </p> + </div> + </div> + <!--Owner--> + <div class="form-group col-md-6"> + <label>Owner</label> + <input class="form-control" type="text" ng-model="vm.threatModel.summary.owner" placeholder="The owner of the threat model" /> + </div> + <!--reviewer--> + <div class="form-group col-md-6"> + <label>Reviewer</label> + <input class="form-control" type="text" ng-model="vm.threatModel.detail.reviewer" placeholder="The reviewer of the threat model" /> + </div> + <!--description--> + <div class="form-group col-md-12"> + <label>High level system description</label> + <textarea rows="5" class="form-control" ng-model="vm.threatModel.summary.description" placeholder="A high level description of the system"></textarea> + </div> + <!--contributors--> + <div class="form-group col-md-12"> + <label>Contributors</label> + <div ng-repeat="contributor in vm.threatModel.detail.contributors" ng-form="contributorSubForm"> + <div class="col-md-6"> + <p> + <div class="input-group"> + <input name="contributorName" class="form-control" type="text" ng-model="contributor.name" required placeholder="The name of a contributor to the threat model" /> + <span class="input-group-btn"> + <button class="btn btn-default" data-toggle="tooltip" ng-click="vm.removeContributor($index)" data-placement="top" title="Remove This Contributor" aria-hidden="true" type="button"> + <span class="glyphicon glyphicon-remove"></span> Remove + </button> + </span> + </div> + </p> + <div ng-show="contributorSubForm.contributorName.$dirty && !contributorSubForm.contributorName.$valid"> + <p> + <div class="alert alert-danger" role="alert"> + <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> + <span class="sr-only">Error:</span> + The contributor name cannot be empty. + </div> + </p> + </div> + </div> + </div> + <div ng-repeat-end> + <div class="col-md-6"> + <p> + <div class="input-group" ng-show="vm.addingContributor"> + <input class="form-control" name="newContributorNameInput" type="text" ng-model="vm.newContributor" placeholder="The name of a contributor" /> + <span class="input-group-btn"> + <button class="btn btn-default" ng-disabled="vm.newContributor.length == 0" data-toggle="tooltip" ng-click="vm.addContributor()" data-placement="top" title="Add this contributor" aria-hidden="true" type="button"> + <span class="glyphicon glyphicon-plus"></span> Add + </button> + </span> + <span class="input-group-btn"> + <button class="btn btn-link" data-toggle="tooltip" ng-click="vm.cancelAddingContributor()" data-placement="top" title="Cancel adding this contributor" aria-hidden="true" type="button"> + <span class="glyphicon glyphicon-remove"></span> Cancel + </button> + </span> + </div> + <div ng-hide="vm.addingContributor"> + <button class="btn btn-link" ng-click="vm.startAddingContributor()"> + <span class="glyphicon glyphicon-plus"></span> Add a new contributor... + </button> + </div> + </p> + </div> + </div> + </div> + <!--diagrams--> + <div class="form-group col-md-12"> + <label>Diagrams</label> + <div ng-repeat="diagram in vm.threatModel.detail.diagrams" ng-form="diagramSubForm"> + <div class="col-md-6"> + <p> + <div class="input-group"> + <input name="diagramTitle" class="form-control" type="text" ng-model="diagram.title" required placeholder="Diagram title" /> + <span class="input-group-btn"> + <button class="btn btn-default" data-toggle="tooltip" ng-click="vm.removeDiagram($index)" data-placement="top" title="Remove This Diagram" aria-hidden="true" type="button"> + <span class="glyphicon glyphicon-remove"></span> Remove + </button> + </span> + </div> + </p> + <div ng-show="diagramSubForm.diagramTitle.$dirty && !diagramSubForm.diagramTitle.$valid"> + <p> + <div class="alert alert-danger" role="alert"> + <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> + <span class="sr-only">Error:</span> + The diagram title cannot be empty. + </div> + </p> + </div> + </div> + </div> + <div ng-repeat-end> + <div class="col-md-6"> + <p> + <div class="input-group" ng-show="vm.addingDiagram"> + <input class="form-control" type="text" ng-model="vm.newDiagram.title" placeholder="Diagram title" /> + <span class="input-group-btn"> + <button class="btn btn-default" ng-disabled="vm.newDiagram.title.length == 0" data-toggle="tooltip" ng-click="vm.addDiagram()" data-placement="top" title="Add this diagram" aria-hidden="true" type="button"> + <span class="glyphicon glyphicon-plus"></span> Add + </button> + </span> + <span class="input-group-btn"> + <button class="btn btn-link" data-toggle="tooltip" ng-click="vm.cancelAddingDiagram()" data-placement="top" title="Cancel adding this diagram" aria-hidden="true" type="button"> + <span class="glyphicon glyphicon-remove"></span> Cancel + </button> + </span> + </div> + <div ng-hide="vm.addingDiagram"> + <button class="btn btn-link" ng-click="vm.startAddingDiagram()"> + <span class="glyphicon glyphicon-plus"></span> Add a new diagram... + </button> + </div> + </p> + </div> + </div> + </div> + <!--buttons--> + <div class="col-md-3 col-md-offset-9"> + <div class="btn-group pull-right" role="group"> + <button class="btn btn-default" ng-click="vm.cancel()" data-toggle="tooltip" data-placement="top" title="Cancel Editing" type="button"> + <span class="glyphicon glyphicon-remove"></span> Cancel + </button> + <button class="btn btn-default" ng-disabled="!vm.dirty" ng-click="vm.reload()" data-toggle="tooltip" data-placement="top" title="Reset Form" type="button"> + <span class="fa fa-undo"></span> Reload + </button> + <button class="btn btn-primary" ng-disabled="!vm.dirty || !vm.threatModelEditForm.$valid" ng-click="vm.save()" data-toggle="tooltip" data-placement="top" title="Save Changes" type="button"> + <span class="glyphicon glyphicon-save"></span> Save + </button> + </div> + </div> + </form> + </div> + </div> + <!--oops--> + <div ng-if="!vm.threatModel.summary"> + <div class="jumbotron"> + <h1>oooops!</h1> + <p> + It looks like you tried to edit a threat model that doesn't exist. Maybe you typed the + address wrong? Or if you clicked a link to get here, the threat model might have been + deleted since you made the link <span class="fa fa-frown-o"></span> + </p> + <p> + <a href="#/threatmodels">Take me back to the list of threat models</a> + </p> + </div> + </div> +</div> \ No newline at end of file diff --git a/td/public/app/threatmodels/threatmodels.html b/td/public/app/threatmodels/threatmodels.html new file mode 100644 index 000000000..a4fedd3f6 --- /dev/null +++ b/td/public/app/threatmodels/threatmodels.html @@ -0,0 +1,75 @@ +<div data-ng-controller="threatmodels as vm" class="container-fluid"> + <p> + <a href="#/">Home </a><span class="glyphicon glyphicon-chevron-right"></span> + Threat models + </p> + <div ng-repeat-start="threatModel in vm.threatModels"> + <div class="col-md-4"> + <div class="panel panel-default"> + <div class="panel-heading panel-title"> + <a href="#/threatmodel/{{threatModel.summary.id}}"><h4>{{threatModel.summary.title}}</h4></a> + </div> + <div class="panel-body"> + <div> + <strong>Owner: </strong> {{threatModel.summary.owner}} + </div> + <div> + <p><small>{{threatModel.summary.description}}</small></p> + </div> + <div> + <strong>Diagrams</strong> + </div> + <div ng-repeat="diagram in threatModel.detail.diagrams"> + <a href="#/threatmodel/{{threatModel.summary.id}}/diagram/{{diagram.id}}"> + <div class="text-overflow"> + <small> + <span class="fa fa-sitemap"> + </span> {{diagram.title}} + </small> + </div> + </a> + </div> + </div> + <div class="panel-footer"> + <div class="row"> + <div class="col-md-12"> + <div class="btn-group pull-right" role="group"> + <a class="btn btn-primary btn-sm" href="#/threatmodel/{{threatModel.summary.id}}" role="button" data-toggle="tooltip" data-placement="top" title="Edit this threat model"> + <span class="fa fa-caret-right"></span> Details + </a> + <a class="btn btn-default btn-sm" href="#/threatmodel/edit/{{threatModel.summary.id}}" role="button" data-toggle="tooltip" data-placement="top" title="Edit this threat model"> + <span class="glyphicon glyphicon-edit"></span> Edit + </a> + <button class="btn btn-default btn-sm" role="button" ng-click="vm.saveThreatModelToFile($index)" data-toggle="tooltip" data-placement="top" title="Save this threat model as a local file"> + <span class="glyphicon glyphicon-file"></span> Save To File + </button> + <a class="btn btn-default btn-sm" href="#/threatmodel/report/{{threatModel.summary.id}}/?suppressbanner=true" target="_blank" role="button" data-toggle="tooltip" data-placement="top" title="View and print threat model report"> + <span class="glyphicon glyphicon-print"></span> Print + </a> + <button class="btn btn-default btn-sm" role="button" ng-click="vm.deleteThreatModel($index)" data-toggle="tooltip" data-placement="top" title="Delete this threat model"> + <span class="glyphicon glyphicon-remove"></span> Delete + </button> + </div> + </div> + </div> + <div> + </div> + </div> + </div> + </div> + </div> + <div ng-if="(($index+1) % 3) == 0" class="clearfix visible-lg-block"></div> + <div ng-repeat-end ng-hide></div> + <div class="col-lg-4"> + <div> + <a href="#/threatmodel/edit/new"> + <h4><span class="glyphicon glyphicon-plus"></span> Create new threat model...</h4> + </a> + </div> + <div> + <h4><tmt-file-read-string label-text="Load a threat model from a file..." action="vm.loadThreatModelFromFile(content)"></tmt-file-read-string></h4> + </div> + </div> +</div> + + diff --git a/td/public/app/threatmodels/threatmodels.js b/td/public/app/threatmodels/threatmodels.js new file mode 100644 index 000000000..896eea225 --- /dev/null +++ b/td/public/app/threatmodels/threatmodels.js @@ -0,0 +1,72 @@ +(function () { + 'use strict'; + + // Controller name is handy for logging + var controllerId = 'threatmodels'; + + // Define the controller on the module. + // Inject the dependencies. + // Point to the controller definition function. + angular.module('app').controller(controllerId, + ['common', 'datacontext', 'file', threatModels]); + + function threatModels(common, datacontext, file) { + // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel). + var vm = this; + var getLogFn = common.logger.getLogFn; + var log = getLogFn(controllerId); + var logError = getLogFn(controllerId, 'error'); + + // Bindable properties and functions are placed on vm. + vm.threatModels = []; + vm.title = 'ThreatModels'; + vm.deleteThreatModel = deleteThreatModel; + vm.saveThreatModelToFile = saveThreatModelToFile; + vm.loadThreatModelFromFile = loadThreatModelFromFile; + + activate(); + + function activate() + { + common.activateController([getThreatModels()], controllerId) + .then(function () { log('Activated Threat Models View'); }); + } + + function getThreatModels() + { + return datacontext.getAllThreatModelDetails().then(function (data) { + return vm.threatModels = data; + }); + } + + function deleteThreatModel(index) + { + var threatModel = vm.threatModels[index]; + datacontext.deleteThreatModel(threatModel).then(function () { vm.threatModels.splice(index, 1); }, logError ); + } + function saveThreatModelToFile(index) + { + var threatModel = vm.threatModels[index]; + var fileName = threatModel.summary.title.replace(' ', '_') + '.dragon'; + var content = JSON.stringify(threatModel); + file.saveToFile(fileName, content, 'application/json'); + } + + function loadThreatModelFromFile(content) + { + //firefox appear to serialise differently so content is an array..? + + var deserialisedContent = JSON.parse(content); + var threatModel = deserialisedContent[0]; + + if (angular.isUndefined(threatModel)) { + + threatModel = deserialisedContent + + } + + delete threatModel.summary.id; + datacontext.saveThreatModel(threatModel).then(null); + } + } +})(); diff --git a/td/public/app/welcome/confirmClearLocalStorage.html b/td/public/app/welcome/confirmClearLocalStorage.html new file mode 100644 index 000000000..1a2d62d58 --- /dev/null +++ b/td/public/app/welcome/confirmClearLocalStorage.html @@ -0,0 +1,14 @@ +<div> + <div class="modal-header"> + <h3>Are you sure?</h3> + </div> + <div class="modal-body"> + Are you sure you want to clear your local storage? You have + {{parameter}} threat {{parameter > 1 ? 'models' : 'model'}} saved locally. {{parameter > 1 ? 'These' : 'This'}} + will be permanently deleted. This is not reversible! + </div> + <div class="modal-footer"> + <button class="btn btn-default" ng-click="onOK()">OK</button> + <button class="btn btn-primary" ng-click="onCancel()">Cancel</button> + </div> +</div> diff --git a/td/public/app/welcome/welcome.html b/td/public/app/welcome/welcome.html new file mode 100644 index 000000000..c2a49fc69 --- /dev/null +++ b/td/public/app/welcome/welcome.html @@ -0,0 +1,26 @@ +<div data-ng-controller="welcome as vm" class="container-fluid"> + <row> + <div class="col-lg-6-offset-3"> + <div class="welcome jumbotron" height="420"> + <h1>Welcome!</h1> + <p> + Welcome to OWASP Threat Dragon, an open-source threat modelling tool from OWASP. To use Threat Dragon, + you don't need to sign-up or sign-in + and it is completely free. All your models are stored on your local device, so none of your data is ever + sent to anyone else or stored at some unknown location on the cloud. Threat Dragon is currently in the early + stages of development (an OWASP incubator project) so there might be some bugs and the data storage model might change and leave you + unable load your models. If you make a model that you want to keep, you can print it to a file or hard copy. + You can also save the raw model data as a file to share with friends or move between your devices or browsers. + </p> + <p> + <a class="btn btn-lg btn-default" href="{{vm.threatModelCount > 0 ? '#/threatmodels' : '#/threatmodel/edit/new'}}" role="button"> + <span class="glyphicon glyphicon-open"></span> {{vm.threatModelCount > 0 ? 'Open Local Model' : 'Create Local Model'}} + </a> + <button ng-disabled="vm.threatModelCount == 0" class="btn btn-lg btn-default" role="button" ng-click="vm.clearLocalStorage()"> + <span class="glyphicon glyphicon-remove"></span> Clear Local Storage + </button> + </p> + </div> + </div> + </row> +</div> \ No newline at end of file diff --git a/td/public/app/welcome/welcome.js b/td/public/app/welcome/welcome.js new file mode 100644 index 000000000..9619330ff --- /dev/null +++ b/td/public/app/welcome/welcome.js @@ -0,0 +1,51 @@ +(function () { + 'use strict'; + + // Controller name is handy for logging. + var controllerId = 'welcome'; + + // Define the controller on the module. + // Inject the dependencies. + // Point to the controller definition function. + angular.module('app').controller(controllerId, + ['dialogs', 'common', 'datacontext', welcome]); + + function welcome(dialogs, common, datacontext) { + // Using 'Controller As' syntax, so we assign this to the vm variable (for viewmodel). + var vm = this; + var getLogFn = common.logger.getLogFn; + var log = getLogFn(controllerId); + + // Bindable properties and functions are placed on vm + vm.title = 'Welcome'; + vm.clearLocalStorage = clearLocalStorage; + vm.threatModelCount = 0; + + activate(); + + function activate() + { + common.activateController([welcome()], controllerId).then(function () { log('Activated Welcome View'); }); + } + + function welcome() + { + getThreatModelCount(); + } + + function clearLocalStorage() + { + dialogs.confirm('./app/welcome/confirmClearLocalStorage.html', executeClearLocalStorage, function () { return vm.threatModelCount; }, function () { }); + } + + function executeClearLocalStorage() + { + datacontext.clearStorage().then(function () { getThreatModelCount(); }); + } + + function getThreatModelCount() + { + datacontext.getThreatModelCount().then(function (count) { vm.threatModelCount = count; }); + } + } +})(); diff --git a/td/public/content/bootstrap-custom.css b/td/public/content/bootstrap-custom.css new file mode 100644 index 000000000..9de5be8ca --- /dev/null +++ b/td/public/content/bootstrap-custom.css @@ -0,0 +1,82 @@ +.diagram-container { + margin-right: auto; + margin-left: auto; + min-width: 970px; +} + +.welcome .jumbotron { + height: 420px; +} + +.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/*severity icon colors*/ + +.severity-low { + color: green; + cursor: pointer; +} + +.severity-medium { + color: orange; + cursor: pointer; +} + +.severity-high { + color: red; + cursor: pointer; +} + +textarea { + resize: none; +} + +/*modals*/ + +.fade { + opacity: 0; + -webkit-transition: opacity 0.3s linear; + -o-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; +} + +.modal.fade-right .modal-dialog { + -webkit-transform: translate(100%, 0); + -ms-transform: translate(100%, 0); + -o-transform: translate(100%, 0); + transform: translate(100%, 0); + -webkit-transition: -webkit-transform 0.3s ease; + -o-transition: -o-transform 0.3s ease; + transition: transform 0.3s ease; +} + +.modal.fade-left .modal-dialog { + -webkit-transform: translate(-100%, 0); + -ms-transform: translate(-100%, 0); + -o-transform: translate(-100%, 0); + transform: translate(-100%, 0); + -webkit-transition: -webkit-transform 0.3s ease; + -o-transition: -o-transform 0.3s ease; + transition: transform 0.3s ease; +} + +.modal.fade-down .modal-dialog { + -webkit-transform: translate(0, 100%); + -ms-transform: translate(0, 100%); + -o-transform: translate(0, 100%); + transform: translate(0, 100%); + -webkit-transition: -webkit-transform 0.3s ease; + -o-transition: -o-transform 0.3s ease; + transition: transform 0.3s ease; +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} \ No newline at end of file diff --git a/td/public/content/bootstrap-theme.min.css b/td/public/content/bootstrap-theme.min.css new file mode 100644 index 000000000..ac8dd5505 --- /dev/null +++ b/td/public/content/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/td/public/content/images/owasp.png b/td/public/content/images/owasp.png new file mode 100644 index 000000000..1cd45aff6 Binary files /dev/null and b/td/public/content/images/owasp.png differ diff --git a/td/public/content/images/thumbnail.jpg b/td/public/content/images/thumbnail.jpg new file mode 100644 index 000000000..8905207b5 Binary files /dev/null and b/td/public/content/images/thumbnail.jpg differ diff --git a/td/public/content/joint-custom.css b/td/public/content/joint-custom.css new file mode 100644 index 000000000..685b44cfa --- /dev/null +++ b/td/public/content/joint-custom.css @@ -0,0 +1,71 @@ +/*threat model element highlighting*/ + +.element.highlighted rect { + stroke-width: 3 +} + +.element.highlighted circle { + stroke-width: 3 +} + +.element.highlighted path { + stroke-width: 3 +} + +.link.highlighted path { + stroke-width: 3 +} + +/*threat model element tools*/ + +.element .element-tools { + display: none; + cursor: pointer +} + +.element.highlighted .element-tools { + display: inline; +} + +.element-tool-link circle { + fill: grey; +} + +.element-tool-link.linking circle { + fill: green; +} + +/*threat model link tools*/ + +.tm.Flow .link-tools .tool-options { + display: inline; +} + +.tm.Flow .labels .label text { + font-weight: 400; + font-size: small +} + + +/* responsive paper */ + +.tmt-diagram-container { + height: 100%; + width: 100%; + overflow-x: auto; + overflow-y: auto; +} + +/*stencil*/ + +.stencil .element, .stencil .link, .stencil .connection-wrap, .stencil .marker-arrowheads { + cursor: pointer; +} + +.stencil .link-tool, .stencil .marker-arrowheads { + visibility: hidden; +} + +.stencil .link:hover, .stencil .element:hover path, .stencil .element:hover rect, .stencil .element:hover circle { + stroke-width: 3; +} \ No newline at end of file diff --git a/td/public/content/logo-nav.css b/td/public/content/logo-nav.css new file mode 100644 index 000000000..5fe7e7aea --- /dev/null +++ b/td/public/content/logo-nav.css @@ -0,0 +1,27 @@ +/*! + * Start Bootstrap - Logo Nav HTML Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +body { + padding-top: 70px; /* Required padding for .navbar-fixed-top. Change if height of navigation changes. */ +} + +.navbar-fixed-top .nav { + padding: 15px 0; +} + +.navbar-fixed-top .navbar-brand { + padding: 0 15px; +} + +@media(min-width:768px) { + body { + padding-top: 100px; /* Required padding for .navbar-fixed-top. Change if height of navigation changes. */ + } + + .navbar-fixed-top .navbar-brand { + padding: 15px 0; + } +} \ No newline at end of file diff --git a/td/public/content/themes/sandstone/bootstrap-theme.css b/td/public/content/themes/sandstone/bootstrap-theme.css new file mode 100644 index 000000000..e536ef251 --- /dev/null +++ b/td/public/content/themes/sandstone/bootstrap-theme.css @@ -0,0 +1,6733 @@ +@import url("//fonts.googleapis.com/css?family=Roboto:400,500"); +/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #93c54b; + text-decoration: none; +} +a:hover, +a:focus { + color: #79a736; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #f8f5f0; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 400; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #98978b; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #98978b; +} +.text-primary { + color: #325d88; +} +a.text-primary:hover { + color: #244363; +} +.text-success { + color: #93c54b; +} +a.text-success:hover { + color: #79a736; +} +.text-info { + color: #29abe0; +} +a.text-info:hover { + color: #1b8dbb; +} +.text-warning { + color: #f47c3c; +} +a.text-warning:hover { + color: #ef5c0e; +} +.text-danger { + color: #d9534f; +} +a.text-danger:hover { + color: #c9302c; +} +.bg-primary { + color: #fff; + background-color: #325d88; +} +a.bg-primary:hover { + background-color: #244363; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #f8f5f0; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #98978b; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #dfd7ca; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #3e3f3a; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dfd7ca; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #8e8c84; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #98978b; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #dfd7ca; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dfd7ca; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dfd7ca; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dfd7ca; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dfd7ca; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f8f5f0; +} +.table-hover > tbody > tr:hover { + background-color: #f8f5f0; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f8f5f0; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #f0e9df; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dfd7ca; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: inherit; + border: 0; + border-bottom: 1px solid transparent; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 13px; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; +} +.form-control { + display: block; + width: 100%; + height: 46px; + padding: 12px 16px; + font-size: 14px; + line-height: 1.42857143; + color: #3e3f3a; + background-color: #ffffff; + background-image: none; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-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; +} +.form-control:focus { + border-color: transparent; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0, 0.6); +} +.form-control::-moz-placeholder { + color: #dfd7ca; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #dfd7ca; +} +.form-control::-webkit-input-placeholder { + color: #dfd7ca; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #f8f5f0; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 46px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 66px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 13px; + padding-bottom: 13px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + min-height: 32px; +} +.input-lg { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 66px; + line-height: 66px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 66px; + line-height: 66px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + min-height: 38px; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 57.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 46px; + height: 46px; + line-height: 46px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 66px; + height: 66px; + line-height: 66px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #93c54b; +} +.has-success .form-control { + border-color: #93c54b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #79a736; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c1de98; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c1de98; +} +.has-success .input-group-addon { + color: #93c54b; + border-color: #93c54b; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #93c54b; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #f47c3c; +} +.has-warning .form-control { + border-color: #f47c3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #ef5c0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f9bd9d; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f9bd9d; +} +.has-warning .input-group-addon { + color: #f47c3c; + border-color: #f47c3c; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #f47c3c; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #d9534f; +} +.has-error .form-control { + border-color: #d9534f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #c9302c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #eba5a3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #eba5a3; +} +.has-error .input-group-addon { + color: #d9534f; + border-color: #d9534f; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #d9534f; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #7f8177; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 13px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 33px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 13px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 27.666666px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 12px 16px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #ffffff; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #ffffff; + background-color: #3e3f3a; + border-color: transparent; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #ffffff; + background-color: #242422; + border-color: rgba(0, 0, 0, 0); +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #3e3f3a; + border-color: transparent; +} +.btn-default .badge { + color: #3e3f3a; + background-color: #ffffff; +} +.btn-primary { + color: #ffffff; + background-color: #325d88; + border-color: transparent; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #244363; + border-color: rgba(0, 0, 0, 0); +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #325d88; + border-color: transparent; +} +.btn-primary .badge { + color: #325d88; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #93c54b; + border-color: transparent; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #79a736; + border-color: rgba(0, 0, 0, 0); +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #93c54b; + border-color: transparent; +} +.btn-success .badge { + color: #93c54b; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #29abe0; + border-color: transparent; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #1b8dbb; + border-color: rgba(0, 0, 0, 0); +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #29abe0; + border-color: transparent; +} +.btn-info .badge { + color: #29abe0; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f47c3c; + border-color: transparent; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ef5c0e; + border-color: rgba(0, 0, 0, 0); +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f47c3c; + border-color: transparent; +} +.btn-warning .badge { + color: #f47c3c; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: transparent; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: rgba(0, 0, 0, 0); +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: transparent; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #93c54b; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #79a736; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #dfd7ca; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #f8f5f0; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #98978b; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #98978b; + background-color: #f8f5f0; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #98978b; + text-decoration: none; + outline: 0; + background-color: #f8f5f0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #dfd7ca; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #dfd7ca; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-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-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 66px; + padding: 20px 30px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 66px; + line-height: 66px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 12px 16px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #3e3f3a; + text-align: center; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 20px 30px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #f8f5f0; +} +.nav > li.disabled > a { + color: #dfd7ca; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #dfd7ca; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #f8f5f0; + border-color: #93c54b; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dfd7ca; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #dfd7ca #dfd7ca #dfd7ca; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #98978b; + background-color: #ffffff; + border: 1px solid #dfd7ca; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dfd7ca; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dfd7ca; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #98978b; + background-color: #f8f5f0; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dfd7ca; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dfd7ca; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 60px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 20px 15px; + font-size: 18px; + line-height: 20px; + height: 60px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 13px; + margin-bottom: 13px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 10px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 20px; + padding-bottom: 20px; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 7px; + margin-bottom: 7px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 7px; + margin-bottom: 7px; +} +.navbar-btn.btn-sm { + margin-top: 15px; + margin-bottom: 15px; +} +.navbar-btn.btn-xs { + margin-top: 19px; + margin-bottom: 19px; +} +.navbar-text { + margin-top: 20px; + margin-bottom: 20px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #3e3f3a; + border-color: #3e3f3a; +} +.navbar-default .navbar-brand { + color: #ffffff; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #8e8c84; +} +.navbar-default .navbar-nav > li > a { + color: #98978b; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #393a35; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: transparent; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #393a35; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #98978b; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #3e3f3a; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #393a35; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #98978b; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #393a35; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #98978b; +} +.navbar-default .navbar-link:hover { + color: #ffffff; +} +.navbar-default .btn-link { + color: #98978b; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #ffffff; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; +} +.navbar-inverse { + background-color: #93c54b; + border-color: #93c54b; +} +.navbar-inverse .navbar-brand { + color: #ffffff; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #dfd7ca; +} +.navbar-inverse .navbar-nav > li > a { + color: #6b9430; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #89be3d; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: transparent; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #89be3d; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #6b9430; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #81b33a; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #89be3d; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #93c54b; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #93c54b; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #6b9430; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #89be3d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #6b9430; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.navbar-inverse .btn-link { + color: #6b9430; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #ffffff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f8f5f0; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #dfd7ca; +} +.breadcrumb > .active { + color: #98978b; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 12px 16px; + line-height: 1.42857143; + text-decoration: none; + color: #98978b; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #8e8c84; + background-color: #dfd7ca; + border-color: #dfd7ca; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #8e8c84; + background-color: #dfd7ca; + border-color: #dfd7ca; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #dfd7ca; + background-color: #f8f5f0; + border-color: #dfd7ca; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 20px 30px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #dfd7ca; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #dfd7ca; + background-color: #f8f5f0; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #3e3f3a; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #242422; +} +.label-primary { + background-color: #325d88; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #244363; +} +.label-success { + background-color: #93c54b; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #79a736; +} +.label-info { + background-color: #29abe0; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #1b8dbb; +} +.label-warning { + background-color: #f47c3c; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ef5c0e; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: normal; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #93c54b; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #ffffff; + background-color: #93c54b; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #f8f5f0; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #e8decd; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #f8f5f0; + border: 1px solid #dfd7ca; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #93c54b; +} +.thumbnail .caption { + padding: 9px; + color: #3e3f3a; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #93c54b; + border-color: transparent; + color: #ffffff; +} +.alert-success hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-success .alert-link { + color: #e6e6e6; +} +.alert-info { + background-color: #29abe0; + border-color: transparent; + color: #ffffff; +} +.alert-info hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-info .alert-link { + color: #e6e6e6; +} +.alert-warning { + background-color: #f47c3c; + border-color: transparent; + color: #ffffff; +} +.alert-warning hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-warning .alert-link { + color: #e6e6e6; +} +.alert-danger { + background-color: #d9534f; + border-color: transparent; + color: #ffffff; +} +.alert-danger hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-danger .alert-link { + color: #e6e6e6; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #325d88; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #93c54b; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #29abe0; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f47c3c; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + zoom: 1; + overflow: hidden; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dfd7ca; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #3e3f3a; +} +a.list-group-item .list-group-item-heading { + color: inherit; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + color: #3e3f3a; + background-color: #f8f5f0; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #f8f5f0; + color: #dfd7ca; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #dfd7ca; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #3e3f3a; + background-color: #f8f5f0; + border-color: #dfd7ca; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #3e3f3a; +} +.list-group-item-success { + color: #93c54b; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #93c54b; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #93c54b; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #93c54b; + border-color: #93c54b; +} +.list-group-item-info { + color: #29abe0; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #29abe0; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #29abe0; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #29abe0; + border-color: #29abe0; +} +.list-group-item-warning { + color: #f47c3c; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #f47c3c; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #f47c3c; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #f47c3c; + border-color: #f47c3c; +} +.list-group-item-danger { + color: #d9534f; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #d9534f; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #d9534f; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #d9534f; + border-color: #d9534f; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f8f5f0; + border-top: 1px solid #dfd7ca; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #dfd7ca; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #dfd7ca; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dfd7ca; +} +.panel-default { + border-color: #dfd7ca; +} +.panel-default > .panel-heading { + color: #3e3f3a; + background-color: #f8f5f0; + border-color: #dfd7ca; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dfd7ca; +} +.panel-default > .panel-heading .badge { + color: #f8f5f0; + background-color: #3e3f3a; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dfd7ca; +} +.panel-primary { + border-color: #325d88; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #325d88; + border-color: #325d88; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #325d88; +} +.panel-primary > .panel-heading .badge { + color: #325d88; + background-color: #ffffff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #325d88; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #93c54b; + background-color: #93c54b; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #93c54b; + background-color: #93c54b; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #29abe0; + background-color: #29abe0; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #29abe0; + background-color: #29abe0; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #f47c3c; + background-color: #f47c3c; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #f47c3c; + background-color: #f47c3c; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #d9534f; + background-color: #d9534f; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #d9534f; + background-color: #d9534f; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f8f5f0; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 0 0 transparent; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #f8f5f0; + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #f8f5f0; + min-height: 16.42857143px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #f8f5f0; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 1; + filter: alpha(opacity=100); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #3e3f3a; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #3e3f3a; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #3e3f3a; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #3e3f3a; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #3e3f3a; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #3e3f3a; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #3e3f3a; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #3e3f3a; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #3e3f3a; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + background-color: #ffffff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #dfd7ca; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f8f5f0; + border-bottom: 1px solid #f0e9df; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #b9a78a; + border-top-color: #dfd7ca; + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #b9a78a; + border-right-color: #dfd7ca; +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #b9a78a; + border-bottom-color: #dfd7ca; + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #b9a78a; + border-left-color: #dfd7ca; +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.sandstone { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.navbar .nav > li > a { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.navbar-form input, +.navbar-form .form-control { + border: none; +} +.btn { + border: none; + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.btn:hover { + border-color: transparent; +} +.btn-lg { + line-height: 26px; +} +.btn-default:hover { + background-color: #393a35; +} +input, +.form-control { + -webkit-box-shadow: none; + box-shadow: none; +} +input:focus, +.form-control:focus { + border-color: #dfd7ca; + -webkit-box-shadow: none; + box-shadow: none; +} +.nav { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: #dfd7ca; +} +.nav-tabs > li > a { + background-color: #f8f5f0; + border-color: #dfd7ca; + color: #98978b; +} +.nav-tabs > li.disabled > a:hover { + background-color: #f8f5f0; +} +.nav-pills a { + color: #98978b; +} +.nav-pills li > a { + border: 1px solid transparent; +} +.nav-pills li.active > a, +.nav-pills li > a:hover { + border-color: #dfd7ca; +} +.nav-pills li.disabled > a { + border-color: transparent; +} +.breadcrumb { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; + border: 1px solid #dfd7ca; +} +.breadcrumb a { + color: #98978b; +} +.pagination { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.pager { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.pager li > a { + color: #98978b; +} +.dropdown-menu > li > a { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.alert a, +.alert .alert-link { + color: #fff; +} +.tooltip { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.progress { + border-radius: 10px; + background-color: #dfd7ca; + -webkit-box-shadow: none; + box-shadow: none; +} +.progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.list-group-item { + padding: 16px 24px; +} +.well { + -webkit-box-shadow: none; + box-shadow: none; +} +.panel { + -webkit-box-shadow: none; + box-shadow: none; +} +.panel .panel-heading, +.panel .panel-title { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; + color: #fff; +} +.panel .panel-footer { + font-size: 11px; + line-height: 22px; + font-weight: 500; + text-transform: uppercase; +} +.panel-default .panel-heading, +.panel-default .panel-title, +.panel-default .panel-footer { + color: #98978b; +} diff --git a/td/public/content/themes/sandstone/bootstrap-theme.min.css b/td/public/content/themes/sandstone/bootstrap-theme.min.css new file mode 100644 index 000000000..af9e2e6c3 --- /dev/null +++ b/td/public/content/themes/sandstone/bootstrap-theme.min.css @@ -0,0 +1,7 @@ +@import url("//fonts.googleapis.com/css?family=Roboto:400,500");/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#3e3f3a;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#93c54b;text-decoration:none}a:hover,a:focus{color:#79a736;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #f8f5f0}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#98978b}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#98978b}.text-primary{color:#325d88}a.text-primary:hover{color:#244363}.text-success{color:#93c54b}a.text-success:hover{color:#79a736}.text-info{color:#29abe0}a.text-info:hover{color:#1b8dbb}.text-warning{color:#f47c3c}a.text-warning:hover{color:#ef5c0e}.text-danger{color:#d9534f}a.text-danger:hover{color:#c9302c}.bg-primary{color:#fff;background-color:#325d88}a.bg-primary:hover{background-color:#244363}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #f8f5f0}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #98978b}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #dfd7ca}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#3e3f3a}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #dfd7ca;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#8e8c84;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#98978b;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dfd7ca}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dfd7ca}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dfd7ca}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dfd7ca}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dfd7ca}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f8f5f0}.table-hover>tbody>tr:hover{background-color:#f8f5f0}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f8f5f0}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#f0e9df}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dfd7ca}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:inherit;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:13px;font-size:14px;line-height:1.42857143;color:#3e3f3a}.form-control{display:block;width:100%;height:46px;padding:12px 16px;font-size:14px;line-height:1.42857143;color:#3e3f3a;background-color:#ffffff;background-image:none;border:1px solid #dfd7ca;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:transparent;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6)}.form-control::-moz-placeholder{color:#dfd7ca;opacity:1}.form-control:-ms-input-placeholder{color:#dfd7ca}.form-control::-webkit-input-placeholder{color:#dfd7ca}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f8f5f0;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:46px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:13px;padding-bottom:13px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;min-height:32px}.input-lg{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:66px;line-height:66px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;min-height:38px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:57.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:46px;height:46px;line-height:46px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#93c54b}.has-success .form-control{border-color:#93c54b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#79a736;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c1de98;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c1de98}.has-success .input-group-addon{color:#93c54b;border-color:#93c54b;background-color:#dff0d8}.has-success .form-control-feedback{color:#93c54b}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#f47c3c}.has-warning .form-control{border-color:#f47c3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#ef5c0e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f9bd9d;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f9bd9d}.has-warning .input-group-addon{color:#f47c3c;border-color:#f47c3c;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#f47c3c}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#d9534f}.has-error .form-control{border-color:#d9534f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#c9302c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3}.has-error .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#f2dede}.has-error .form-control-feedback{color:#d9534f}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#7f8177}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:13px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:33px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:13px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:27.666666px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:12px 16px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#ffffff;background-color:#3e3f3a;border-color:transparent}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#242422;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#3e3f3a;border-color:transparent}.btn-default .badge{color:#3e3f3a;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#325d88;border-color:transparent}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#244363;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#325d88;border-color:transparent}.btn-primary .badge{color:#325d88;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#93c54b;border-color:transparent}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#79a736;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#93c54b;border-color:transparent}.btn-success .badge{color:#93c54b;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#29abe0;border-color:transparent}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#1b8dbb;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#29abe0;border-color:transparent}.btn-info .badge{color:#29abe0;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f47c3c;border-color:transparent}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ef5c0e;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f47c3c;border-color:transparent}.btn-warning .badge{color:#f47c3c;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#d9534f;border-color:transparent}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:transparent}.btn-danger .badge{color:#d9534f;background-color:#ffffff}.btn-link{color:#93c54b;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#79a736;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#dfd7ca;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #dfd7ca;border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#f8f5f0}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#98978b;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#98978b;background-color:#f8f5f0}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#98978b;text-decoration:none;outline:0;background-color:#f8f5f0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#dfd7ca}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#dfd7ca;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:20px 30px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:12px 16px;font-size:14px;font-weight:normal;line-height:1;color:#3e3f3a;text-align:center;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:20px 30px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f8f5f0}.nav>li.disabled>a{color:#dfd7ca}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#dfd7ca;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#f8f5f0;border-color:#93c54b}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dfd7ca}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#dfd7ca #dfd7ca #dfd7ca}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#98978b;background-color:#ffffff;border:1px solid #dfd7ca;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dfd7ca}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dfd7ca;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#98978b;background-color:#f8f5f0}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dfd7ca}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dfd7ca;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:20px 15px;font-size:18px;line-height:20px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:10px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:20px;padding-bottom:20px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7px;margin-bottom:7px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7px;margin-bottom:7px}.navbar-btn.btn-sm{margin-top:15px;margin-bottom:15px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:20px;margin-bottom:20px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#3e3f3a;border-color:#3e3f3a}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-text{color:#8e8c84}.navbar-default .navbar-nav>li>a{color:#98978b}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#393a35}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#393a35}.navbar-default .navbar-toggle .icon-bar{background-color:#98978b}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#3e3f3a}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#393a35;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#98978b}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#393a35}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#98978b}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#98978b}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#93c54b;border-color:#93c54b}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#dfd7ca}.navbar-inverse .navbar-nav>li>a{color:#6b9430}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#89be3d}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#89be3d}.navbar-inverse .navbar-toggle .icon-bar{background-color:#6b9430}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#81b33a}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#89be3d;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#93c54b}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#93c54b}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#6b9430}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#89be3d}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#6b9430}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#6b9430}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f8f5f0;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#dfd7ca}.breadcrumb>.active{color:#98978b}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:12px 16px;line-height:1.42857143;text-decoration:none;color:#98978b;background-color:#f8f5f0;border:1px solid #dfd7ca;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#8e8c84;background-color:#dfd7ca;border-color:#dfd7ca}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#8e8c84;background-color:#dfd7ca;border-color:#dfd7ca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#dfd7ca;background-color:#f8f5f0;border-color:#dfd7ca;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:20px 30px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#dfd7ca}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#dfd7ca;background-color:#f8f5f0;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#3e3f3a}.label-default[href]:hover,.label-default[href]:focus{background-color:#242422}.label-primary{background-color:#325d88}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#244363}.label-success{background-color:#93c54b}.label-success[href]:hover,.label-success[href]:focus{background-color:#79a736}.label-info{background-color:#29abe0}.label-info[href]:hover,.label-info[href]:focus{background-color:#1b8dbb}.label-warning{background-color:#f47c3c}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ef5c0e}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:normal;color:#ffffff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#93c54b;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#ffffff;background-color:#93c54b}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#f8f5f0}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#e8decd}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#f8f5f0;border:1px solid #dfd7ca;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#93c54b}.thumbnail .caption{padding:9px;color:#3e3f3a}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#93c54b;border-color:transparent;color:#ffffff}.alert-success hr{border-top-color:rgba(0,0,0,0)}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#29abe0;border-color:transparent;color:#ffffff}.alert-info hr{border-top-color:rgba(0,0,0,0)}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f47c3c;border-color:transparent;color:#ffffff}.alert-warning hr{border-top-color:rgba(0,0,0,0)}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#d9534f;border-color:transparent;color:#ffffff}.alert-danger hr{border-top-color:rgba(0,0,0,0)}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#325d88;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#93c54b}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#29abe0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f47c3c}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dfd7ca}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#3e3f3a}a.list-group-item .list-group-item-heading{color:inherit}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#3e3f3a;background-color:#f8f5f0}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#f8f5f0;color:#dfd7ca;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#dfd7ca}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#3e3f3a;background-color:#f8f5f0;border-color:#dfd7ca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#3e3f3a}.list-group-item-success{color:#93c54b;background-color:#dff0d8}a.list-group-item-success{color:#93c54b}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#93c54b;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#93c54b;border-color:#93c54b}.list-group-item-info{color:#29abe0;background-color:#d9edf7}a.list-group-item-info{color:#29abe0}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#29abe0;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#29abe0;border-color:#29abe0}.list-group-item-warning{color:#f47c3c;background-color:#fcf8e3}a.list-group-item-warning{color:#f47c3c}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#f47c3c;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#f47c3c;border-color:#f47c3c}.list-group-item-danger{color:#d9534f;background-color:#f2dede}a.list-group-item-danger{color:#d9534f}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#d9534f;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#d9534f;border-color:#d9534f}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f8f5f0;border-top:1px solid #dfd7ca;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dfd7ca}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dfd7ca}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dfd7ca}.panel-default{border-color:#dfd7ca}.panel-default>.panel-heading{color:#3e3f3a;background-color:#f8f5f0;border-color:#dfd7ca}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dfd7ca}.panel-default>.panel-heading .badge{color:#f8f5f0;background-color:#3e3f3a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dfd7ca}.panel-primary{border-color:#325d88}.panel-primary>.panel-heading{color:#ffffff;background-color:#325d88;border-color:#325d88}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#325d88}.panel-primary>.panel-heading .badge{color:#325d88;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#325d88}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#93c54b;background-color:#93c54b;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#93c54b;background-color:#93c54b}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#29abe0;background-color:#29abe0;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#29abe0;background-color:#29abe0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#f47c3c;background-color:#f47c3c;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#f47c3c;background-color:#f47c3c}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#d9534f;background-color:#d9534f;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#d9534f;background-color:#d9534f}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f8f5f0;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 0 0 transparent;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #f8f5f0;border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #f8f5f0;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #f8f5f0}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#3e3f3a;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#3e3f3a}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#3e3f3a}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#3e3f3a}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3e3f3a}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3e3f3a}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3e3f3a}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#3e3f3a}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#3e3f3a}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:normal;line-height:1.42857143;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dfd7ca;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f8f5f0;border-bottom:1px solid #f0e9df;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#b9a78a;border-top-color:#dfd7ca;bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#b9a78a;border-right-color:#dfd7ca}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#b9a78a;border-bottom-color:#dfd7ca;top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#b9a78a;border-left-color:#dfd7ca}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.sandstone{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.navbar .nav>li>a{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.navbar-form input,.navbar-form .form-control{border:none}.btn{border:none;font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.btn:hover{border-color:transparent}.btn-lg{line-height:26px}.btn-default:hover{background-color:#393a35}input,.form-control{-webkit-box-shadow:none;box-shadow:none}input:focus,.form-control:focus{border-color:#dfd7ca;-webkit-box-shadow:none;box-shadow:none}.nav{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#dfd7ca}.nav-tabs>li>a{background-color:#f8f5f0;border-color:#dfd7ca;color:#98978b}.nav-tabs>li.disabled>a:hover{background-color:#f8f5f0}.nav-pills a{color:#98978b}.nav-pills li>a{border:1px solid transparent}.nav-pills li.active>a,.nav-pills li>a:hover{border-color:#dfd7ca}.nav-pills li.disabled>a{border-color:transparent}.breadcrumb{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase;border:1px solid #dfd7ca}.breadcrumb a{color:#98978b}.pagination{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.pager{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.pager li>a{color:#98978b}.dropdown-menu>li>a{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.alert a,.alert .alert-link{color:#fff}.tooltip{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.progress{border-radius:10px;background-color:#dfd7ca;-webkit-box-shadow:none;box-shadow:none}.progress-bar{-webkit-box-shadow:none;box-shadow:none}.list-group-item{padding:16px 24px}.well{-webkit-box-shadow:none;box-shadow:none}.panel{-webkit-box-shadow:none;box-shadow:none}.panel .panel-heading,.panel .panel-title{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase;color:#fff}.panel .panel-footer{font-size:11px;line-height:22px;font-weight:500;text-transform:uppercase}.panel-default .panel-heading,.panel-default .panel-title,.panel-default .panel-footer{color:#98978b} \ No newline at end of file diff --git a/td/public/content/themes/superhero/bootstrap-theme.css b/td/public/content/themes/superhero/bootstrap-theme.css new file mode 100644 index 000000000..a34d425bd --- /dev/null +++ b/td/public/content/themes/superhero/bootstrap-theme.css @@ -0,0 +1,6804 @@ +@import url("//fonts.googleapis.com/css?family=Lato:300,400,700"); +/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.42857143; + color: #ebebeb; + background-color: #2b3e50; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #df691a; + text-decoration: none; +} +a:hover, +a:focus { + color: #df691a; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 0; +} +.img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #2b3e50; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #596a7b; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 300; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #ebebeb; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10.5px; + margin-bottom: 10.5px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 39px; +} +h2, +.h2 { + font-size: 32px; +} +h3, +.h3 { + font-size: 26px; +} +h4, +.h4 { + font-size: 19px; +} +h5, +.h5 { + font-size: 15px; +} +h6, +.h6 { + font-size: 13px; +} +p { + margin: 0 0 10.5px; +} +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 22.5px; + } +} +small, +.small { + font-size: 86%; +} +mark, +.mark { + background-color: #f0ad4e; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #4e5d6c; +} +.text-primary { + color: #df691a; +} +a.text-primary:hover { + color: #b15315; +} +.text-success { + color: #ebebeb; +} +a.text-success:hover { + color: #d2d2d2; +} +.text-info { + color: #ebebeb; +} +a.text-info:hover { + color: #d2d2d2; +} +.text-warning { + color: #ebebeb; +} +a.text-warning:hover { + color: #d2d2d2; +} +.text-danger { + color: #ebebeb; +} +a.text-danger:hover { + color: #d2d2d2; +} +.bg-primary { + color: #fff; + background-color: #df691a; +} +a.bg-primary:hover { + background-color: #b15315; +} +.bg-success { + background-color: #5cb85c; +} +a.bg-success:hover { + background-color: #449d44; +} +.bg-info { + background-color: #5bc0de; +} +a.bg-info:hover { + background-color: #31b0d5; +} +.bg-warning { + background-color: #f0ad4e; +} +a.bg-warning:hover { + background-color: #ec971f; +} +.bg-danger { + background-color: #d9534f; +} +a.bg-danger:hover { + background-color: #c9302c; +} +.page-header { + padding-bottom: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #ebebeb; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10.5px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 21px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #4e5d6c; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #4e5d6c; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #ebebeb; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #4e5d6c; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 21px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 0; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 6px; + padding-bottom: 6px; + color: #4e5d6c; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 6px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #4e5d6c; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #4e5d6c; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #4e5d6c; +} +.table .table { + background-color: #2b3e50; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 3px; +} +.table-bordered { + border: 1px solid #4e5d6c; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #4e5d6c; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #4e5d6c; +} +.table-hover > tbody > tr:hover { + background-color: #485563; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #485563; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #3d4954; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #5cb85c; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #4cae4c; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #5bc0de; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #46b8da; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #f0ad4e; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #eea236; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #d9534f; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #d43f3a; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #4e5d6c; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #ebebeb; + border: 0; + border-bottom: 1px solid #4e5d6c; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 9px; + font-size: 15px; + line-height: 1.42857143; + color: #2b3e50; +} +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 16px; + font-size: 15px; + line-height: 1.42857143; + color: #2b3e50; + background-color: #ffffff; + background-image: none; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-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; +} +.form-control:focus { + border-color: transparent; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(0, 0, 0, 0.6); +} +.form-control::-moz-placeholder { + color: #cccccc; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #cccccc; +} +.form-control::-webkit-input-placeholder { + color: #cccccc; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #ebebeb; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 39px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 31px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 52px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 21px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; +} +select.input-sm { + height: 31px; + line-height: 31px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; +} +select.form-group-sm .form-control { + height: 31px; + line-height: 31px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + min-height: 34px; +} +.input-lg { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.input-lg { + height: 52px; + line-height: 52px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.form-group-lg .form-control { + height: 52px; + line-height: 52px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + min-height: 40px; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 48.75px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 52px; + height: 52px; + line-height: 52px; +} +.input-sm + .form-control-feedback { + width: 31px; + height: 31px; + line-height: 31px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #ebebeb; +} +.has-success .form-control { + border-color: #ebebeb; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #d2d2d2; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; +} +.has-success .input-group-addon { + color: #ebebeb; + border-color: #ebebeb; + background-color: #5cb85c; +} +.has-success .form-control-feedback { + color: #ebebeb; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #ebebeb; +} +.has-warning .form-control { + border-color: #ebebeb; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #d2d2d2; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; +} +.has-warning .input-group-addon { + color: #ebebeb; + border-color: #ebebeb; + background-color: #f0ad4e; +} +.has-warning .form-control-feedback { + color: #ebebeb; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #ebebeb; +} +.has-error .form-control { + border-color: #ebebeb; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #d2d2d2; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; +} +.has-error .input-group-addon { + color: #ebebeb; + border-color: #ebebeb; + background-color: #d9534f; +} +.has-error .form-control-feedback { + color: #ebebeb; +} +.has-feedback label ~ .form-control-feedback { + top: 26px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #ffffff; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 30px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 16.9999996px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 16px; + font-size: 15px; + line-height: 1.42857143; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #ffffff; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #ffffff; + background-color: #4e5d6c; + border-color: transparent; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #ffffff; + background-color: #39444e; + border-color: rgba(0, 0, 0, 0); +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #4e5d6c; + border-color: transparent; +} +.btn-default .badge { + color: #4e5d6c; + background-color: #ffffff; +} +.btn-primary { + color: #ffffff; + background-color: #df691a; + border-color: transparent; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #b15315; + border-color: rgba(0, 0, 0, 0); +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #df691a; + border-color: transparent; +} +.btn-primary .badge { + color: #df691a; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: transparent; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #449d44; + border-color: rgba(0, 0, 0, 0); +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: transparent; +} +.btn-success .badge { + color: #5cb85c; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: transparent; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #31b0d5; + border-color: rgba(0, 0, 0, 0); +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: transparent; +} +.btn-info .badge { + color: #5bc0de; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: transparent; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ec971f; + border-color: rgba(0, 0, 0, 0); +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: transparent; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: transparent; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: rgba(0, 0, 0, 0); +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: transparent; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #df691a; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #df691a; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #4e5d6c; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #4e5d6c; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #2b3e50; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #ebebeb; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #ebebeb; + background-color: #485563; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #df691a; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #2b3e50; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 13px; + line-height: 1.42857143; + color: #2b3e50; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: 0; + border-top-left-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-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 52px; + padding: 12px 24px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 52px; + line-height: 52px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 31px; + padding: 5px 10px; + font-size: 13px; + line-height: 1.5; + border-radius: 0; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 31px; + line-height: 31px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 8px 16px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #2b3e50; + text-align: center; + background-color: #4e5d6c; + border: 1px solid transparent; + border-radius: 0; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 13px; + border-radius: 0; +} +.input-group-addon.input-lg { + padding: 12px 24px; + font-size: 19px; + border-radius: 0; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #4e5d6c; +} +.nav > li.disabled > a { + color: #4e5d6c; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #4e5d6c; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #4e5d6c; + border-color: #df691a; +} +.nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid transparent; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 0 0 0 0; +} +.nav-tabs > li > a:hover { + border-color: #4e5d6c #4e5d6c transparent; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #ebebeb; + background-color: #2b3e50; + border: 1px solid #4e5d6c; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #4e5d6c; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #4e5d6c; + border-radius: 0 0 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #4e5d6c; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 0; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #df691a; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #4e5d6c; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #4e5d6c; + border-radius: 0 0 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #4e5d6c; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 40px; + margin-bottom: 21px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 0; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 9.5px 15px; + font-size: 19px; + line-height: 21px; + height: 40px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 3px; + margin-bottom: 3px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 4.75px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 21px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 9.5px; + padding-bottom: 9.5px; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 0.5px; + margin-bottom: 0.5px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 0.5px; + margin-bottom: 0.5px; +} +.navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; +} +.navbar-btn.btn-xs { + margin-top: 9px; + margin-bottom: 9px; +} +.navbar-text { + margin-top: 9.5px; + margin-bottom: 9.5px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #4e5d6c; + border-color: transparent; +} +.navbar-default .navbar-brand { + color: #ebebeb; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #ebebeb; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #ebebeb; +} +.navbar-default .navbar-nav > li > a { + color: #ebebeb; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #ebebeb; + background-color: #485563; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #ebebeb; + background-color: #485563; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: transparent; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #485563; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #ebebeb; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: transparent; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #485563; + color: #ebebeb; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ebebeb; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ebebeb; + background-color: #485563; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ebebeb; + background-color: #485563; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #ebebeb; +} +.navbar-default .navbar-link:hover { + color: #ebebeb; +} +.navbar-default .btn-link { + color: #ebebeb; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #ebebeb; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; +} +.navbar-inverse { + background-color: #df691a; + border-color: transparent; +} +.navbar-inverse .navbar-brand { + color: #ebebeb; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ebebeb; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #ebebeb; +} +.navbar-inverse .navbar-nav > li > a { + color: #ebebeb; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ebebeb; + background-color: #c85e17; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ebebeb; + background-color: #c85e17; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: transparent; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #c85e17; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ebebeb; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #bf5a16; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #c85e17; + color: #ebebeb; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ebebeb; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ebebeb; + background-color: #c85e17; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ebebeb; + background-color: #c85e17; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #ebebeb; +} +.navbar-inverse .navbar-link:hover { + color: #ebebeb; +} +.navbar-inverse .btn-link { + color: #ebebeb; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #ebebeb; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #4e5d6c; + border-radius: 0; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #ebebeb; +} +.breadcrumb > .active { + color: #ebebeb; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 8px 16px; + line-height: 1.42857143; + text-decoration: none; + color: #ebebeb; + background-color: #4e5d6c; + border: 1px solid transparent; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #ebebeb; + background-color: #485563; + border-color: transparent; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ebebeb; + background-color: #df691a; + border-color: transparent; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #323c46; + background-color: #4e5d6c; + border-color: transparent; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 12px 24px; + font-size: 19px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 13px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #4e5d6c; + border: 1px solid transparent; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #485563; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #323c46; + background-color: #4e5d6c; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #4e5d6c; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #39444e; +} +.label-primary { + background-color: #df691a; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #b15315; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 13px; + font-weight: 300; + color: #ebebeb; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #4e5d6c; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #df691a; + background-color: #ffffff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #4e5d6c; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #39444e; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 0; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 67.5px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.42857143; + background-color: #2b3e50; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #df691a; +} +.thumbnail .caption { + padding: 9px; + color: #ebebeb; +} +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #5cb85c; + border-color: transparent; + color: #ebebeb; +} +.alert-success hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-success .alert-link { + color: #d2d2d2; +} +.alert-info { + background-color: #5bc0de; + border-color: transparent; + color: #ebebeb; +} +.alert-info hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-info .alert-link { + color: #d2d2d2; +} +.alert-warning { + background-color: #f0ad4e; + border-color: transparent; + color: #ebebeb; +} +.alert-warning hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-warning .alert-link { + color: #d2d2d2; +} +.alert-danger { + background-color: #d9534f; + border-color: transparent; + color: #ebebeb; +} +.alert-danger hr { + border-top-color: rgba(0, 0, 0, 0); +} +.alert-danger .alert-link { + color: #d2d2d2; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #4e5d6c; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 13px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #df691a; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + zoom: 1; + overflow: hidden; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #4e5d6c; + border: 1px solid transparent; +} +.list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +a.list-group-item { + color: #ebebeb; +} +a.list-group-item .list-group-item-heading { + color: #ebebeb; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + color: #ebebeb; + background-color: #485563; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #ebebeb; + color: #4e5d6c; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #4e5d6c; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #df691a; + border-color: #df691a; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #f9decc; +} +.list-group-item-success { + color: #ebebeb; + background-color: #5cb85c; +} +a.list-group-item-success { + color: #ebebeb; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #ebebeb; + background-color: #4cae4c; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #ebebeb; + border-color: #ebebeb; +} +.list-group-item-info { + color: #ebebeb; + background-color: #5bc0de; +} +a.list-group-item-info { + color: #ebebeb; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #ebebeb; + background-color: #46b8da; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #ebebeb; + border-color: #ebebeb; +} +.list-group-item-warning { + color: #ebebeb; + background-color: #f0ad4e; +} +a.list-group-item-warning { + color: #ebebeb; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #ebebeb; + background-color: #eea236; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #ebebeb; + border-color: #ebebeb; +} +.list-group-item-danger { + color: #ebebeb; + background-color: #d9534f; +} +a.list-group-item-danger { + color: #ebebeb; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #ebebeb; + background-color: #d43f3a; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #ebebeb; + border-color: #ebebeb; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 21px; + background-color: #4e5d6c; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #485563; + border-top: 1px solid transparent; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: -1; + border-top-right-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: -1; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: -1; + border-bottom-right-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: -1; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #4e5d6c; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 21px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 0; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid transparent; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid transparent; +} +.panel-default { + border-color: transparent; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: transparent; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: transparent; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: transparent; +} +.panel-primary { + border-color: transparent; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #df691a; + border-color: transparent; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: transparent; +} +.panel-primary > .panel-heading .badge { + color: #df691a; + background-color: #ffffff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: transparent; +} +.panel-success { + border-color: transparent; +} +.panel-success > .panel-heading { + color: #ebebeb; + background-color: #5cb85c; + border-color: transparent; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: transparent; +} +.panel-success > .panel-heading .badge { + color: #5cb85c; + background-color: #ebebeb; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: transparent; +} +.panel-info { + border-color: transparent; +} +.panel-info > .panel-heading { + color: #ebebeb; + background-color: #5bc0de; + border-color: transparent; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: transparent; +} +.panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ebebeb; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: transparent; +} +.panel-warning { + border-color: transparent; +} +.panel-warning > .panel-heading { + color: #ebebeb; + background-color: #f0ad4e; + border-color: transparent; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: transparent; +} +.panel-warning > .panel-heading .badge { + color: #f0ad4e; + background-color: #ebebeb; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: transparent; +} +.panel-danger { + border-color: transparent; +} +.panel-danger > .panel-heading { + color: #ebebeb; + background-color: #d9534f; + border-color: transparent; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: transparent; +} +.panel-danger > .panel-heading .badge { + color: #d9534f; + background-color: #ebebeb; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: transparent; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #4e5d6c; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 0; +} +.well-sm { + padding: 9px; + border-radius: 0; +} +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ebebeb; + text-shadow: none; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #ebebeb; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #4e5d6c; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #2b3e50; + min-height: 16.42857143px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #2b3e50; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 0; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + background-color: #4e5d6c; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #485563; + border-bottom: 1px solid #3d4954; + border-radius: -1 -1 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: transparent; + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #4e5d6c; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: transparent; +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #4e5d6c; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: transparent; + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #4e5d6c; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: transparent; +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #4e5d6c; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.navbar { + -webkit-box-shadow: none; + box-shadow: none; + border: none; + font-size: 12px; +} +.navbar-default .badge { + background-color: #fff; + color: #4e5d6c; +} +.navbar-inverse .badge { + background-color: #fff; + color: #df691a; +} +.btn { + font-weight: 300; +} +.btn-default:hover { + background-color: #485563; +} +.btn-sm, +.btn-xs { + font-size: 12px; +} +body { + font-weight: 300; +} +.text-primary, +.text-primary:hover { + color: #df691a; +} +.text-success, +.text-success:hover { + color: #5cb85c; +} +.text-danger, +.text-danger:hover { + color: #d9534f; +} +.text-warning, +.text-warning:hover { + color: #f0ad4e; +} +.text-info, +.text-info:hover { + color: #5bc0de; +} +.page-header { + border-bottom-color: #4e5d6c; +} +.dropdown-menu { + border: none; + margin: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.dropdown-menu > li > a { + font-size: 12px; + font-weight: 300; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; +} +.dropdown-header { + font-size: 12px; +} +table, +.table { + font-size: 12px; +} +table a:not(.btn), +.table a:not(.btn) { + color: #fff; + text-decoration: underline; +} +table .dropdown-menu a, +.table .dropdown-menu a { + text-decoration: none; +} +table .text-muted, +.table .text-muted { + color: #4e5d6c; +} +table > thead > tr > th, +.table > thead > tr > th, +table > tbody > tr > th, +.table > tbody > tr > th, +table > tfoot > tr > th, +.table > tfoot > tr > th, +table > thead > tr > td, +.table > thead > tr > td, +table > tbody > tr > td, +.table > tbody > tr > td, +table > tfoot > tr > td, +.table > tfoot > tr > td { + border-color: transparent; +} +input, +textarea { + color: #2b3e50; +} +label, +.radio label, +.checkbox label, +.help-block { + font-size: 12px; + font-weight: 300; +} +.input-addon, +.input-group-addon { + color: #ebebeb; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .form-control-feedback { + color: #f0ad4e; +} +.has-warning .input-group-addon { + border: none; +} +.has-error .help-block, +.has-error .control-label, +.has-error .form-control-feedback { + color: #d9534f; +} +.has-error .input-group-addon { + border: none; +} +.has-success .help-block, +.has-success .control-label, +.has-success .form-control-feedback { + color: #5cb85c; +} +.has-success .input-group-addon { + border: none; +} +.form-control:focus { + -webkit-box-shadow: none; + box-shadow: none; +} +.has-warning .form-control:focus, +.has-error .form-control:focus, +.has-success .form-control:focus { + -webkit-box-shadow: none; + box-shadow: none; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} +.nav-tabs > li > a { + color: #ebebeb; +} +.nav-pills > li > a { + color: #ebebeb; +} +.pager a { + color: #ebebeb; +} +.label { + font-weight: 300; +} +.alert { + color: #fff; +} +.alert a, +.alert .alert-link { + color: #fff; +} +.close { + opacity: 0.4; +} +.close:hover, +.close:focus { + opacity: 1; +} +.well { + -webkit-box-shadow: none; + box-shadow: none; +} +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + border: none; +} +a.list-group-item-success.active { + background-color: #5cb85c; +} +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + background-color: #4cae4c; +} +a.list-group-item-warning.active { + background-color: #f0ad4e; +} +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + background-color: #eea236; +} +a.list-group-item-danger.active { + background-color: #d9534f; +} +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + background-color: #d43f3a; +} +.panel { + border: none; +} +.panel-default > .panel-heading { + background-color: #485563; + color: #ebebeb; +} +.thumbnail { + background-color: #4e5d6c; + border: none; +} +.modal { + padding: 0; +} +.modal-header, +.modal-footer { + background-color: #485563; + border: none; + border-radius: 0; +} +.popover-title { + border: none; +} diff --git a/td/public/content/themes/superhero/bootstrap-theme.min.css b/td/public/content/themes/superhero/bootstrap-theme.min.css new file mode 100644 index 000000000..05c5a6189 --- /dev/null +++ b/td/public/content/themes/superhero/bootstrap-theme.min.css @@ -0,0 +1,7 @@ +@import url("//fonts.googleapis.com/css?family=Lato:300,400,700");/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#ebebeb;background-color:#2b3e50}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#df691a;text-decoration:none}a:hover,a:focus{color:#df691a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#2b3e50;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #596a7b}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#ebebeb}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f0ad4e;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#4e5d6c}.text-primary{color:#df691a}a.text-primary:hover{color:#b15315}.text-success{color:#ebebeb}a.text-success:hover{color:#d2d2d2}.text-info{color:#ebebeb}a.text-info:hover{color:#d2d2d2}.text-warning{color:#ebebeb}a.text-warning:hover{color:#d2d2d2}.text-danger{color:#ebebeb}a.text-danger:hover{color:#d2d2d2}.bg-primary{color:#fff;background-color:#df691a}a.bg-primary:hover{background-color:#b15315}.bg-success{background-color:#5cb85c}a.bg-success:hover{background-color:#449d44}.bg-info{background-color:#5bc0de}a.bg-info:hover{background-color:#31b0d5}.bg-warning{background-color:#f0ad4e}a.bg-warning:hover{background-color:#ec971f}.bg-danger{background-color:#d9534f}a.bg-danger:hover{background-color:#c9302c}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #ebebeb}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #4e5d6c}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #4e5d6c}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#ebebeb}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #4e5d6c;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:6px;padding-bottom:6px;color:#4e5d6c;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:6px;line-height:1.42857143;vertical-align:top;border-top:1px solid #4e5d6c}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #4e5d6c}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #4e5d6c}.table .table{background-color:#2b3e50}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:3px}.table-bordered{border:1px solid #4e5d6c}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #4e5d6c}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#4e5d6c}.table-hover>tbody>tr:hover{background-color:#485563}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#485563}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#3d4954}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#5cb85c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#4cae4c}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#5bc0de}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#46b8da}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f0ad4e}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#eea236}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#d9534f}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#d43f3a}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #4e5d6c}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#ebebeb;border:0;border-bottom:1px solid #4e5d6c}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.42857143;color:#2b3e50}.form-control{display:block;width:100%;height:39px;padding:8px 16px;font-size:15px;line-height:1.42857143;color:#2b3e50;background-color:#ffffff;background-image:none;border:1px solid transparent;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:transparent;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(0,0,0,0.6)}.form-control::-moz-placeholder{color:#cccccc;opacity:1}.form-control:-ms-input-placeholder{color:#cccccc}.form-control::-webkit-input-placeholder{color:#cccccc}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebebeb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:31px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:52px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-sm{height:31px;line-height:31px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.form-group-sm .form-control{height:31px;line-height:31px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;min-height:34px}.input-lg{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:52px;line-height:52px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}select.form-group-lg .form-control{height:52px;line-height:52px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;min-height:40px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:52px;height:52px;line-height:52px}.input-sm+.form-control-feedback{width:31px;height:31px;line-height:31px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ebebeb}.has-success .form-control{border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#d2d2d2;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ebebeb;border-color:#ebebeb;background-color:#5cb85c}.has-success .form-control-feedback{color:#ebebeb}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ebebeb}.has-warning .form-control{border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#d2d2d2;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ebebeb;border-color:#ebebeb;background-color:#f0ad4e}.has-warning .form-control-feedback{color:#ebebeb}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ebebeb}.has-error .form-control{border-color:#ebebeb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#d2d2d2;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ebebeb;border-color:#ebebeb;background-color:#d9534f}.has-error .form-control-feedback{color:#ebebeb}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:16.9999996px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 16px;font-size:15px;line-height:1.42857143;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#ffffff;background-color:#4e5d6c;border-color:transparent}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#39444e;border-color:rgba(0,0,0,0)}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#4e5d6c;border-color:transparent}.btn-default .badge{color:#4e5d6c;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#df691a;border-color:transparent}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#b15315;border-color:rgba(0,0,0,0)}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#df691a;border-color:transparent}.btn-primary .badge{color:#df691a;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#5cb85c;border-color:transparent}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#449d44;border-color:rgba(0,0,0,0)}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:transparent}.btn-success .badge{color:#5cb85c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:transparent}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:rgba(0,0,0,0)}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:transparent}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f0ad4e;border-color:transparent}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#ec971f;border-color:rgba(0,0,0,0)}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:transparent}.btn-warning .badge{color:#f0ad4e;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#d9534f;border-color:transparent}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#c9302c;border-color:rgba(0,0,0,0)}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:transparent}.btn-danger .badge{color:#d9534f;background-color:#ffffff}.btn-link{color:#df691a;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#df691a;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#4e5d6c;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#2b3e50}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ebebeb;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ebebeb;background-color:#485563}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#df691a}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#2b3e50}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#2b3e50;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:52px;padding:12px 24px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:52px;line-height:52px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 16px;font-size:15px;font-weight:normal;line-height:1;color:#2b3e50;text-align:center;background-color:#4e5d6c;border:1px solid transparent;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:0}.input-group-addon.input-lg{padding:12px 24px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#4e5d6c}.nav>li.disabled>a{color:#4e5d6c}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#4e5d6c;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#4e5d6c;border-color:#df691a}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid transparent}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#4e5d6c #4e5d6c transparent}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#ebebeb;background-color:#2b3e50;border:1px solid #4e5d6c;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #4e5d6c}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #4e5d6c;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#4e5d6c}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#df691a}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #4e5d6c}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #4e5d6c;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#4e5d6c}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:40px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:9.5px 15px;font-size:19px;line-height:21px;height:40px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:3px;margin-bottom:3px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:4.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:9.5px;padding-bottom:9.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:0.5px;margin-bottom:0.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:0.5px;margin-bottom:0.5px}.navbar-btn.btn-sm{margin-top:4.5px;margin-bottom:4.5px}.navbar-btn.btn-xs{margin-top:9px;margin-bottom:9px}.navbar-text{margin-top:9.5px;margin-bottom:9.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#4e5d6c;border-color:transparent}.navbar-default .navbar-brand{color:#ebebeb}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ebebeb;background-color:transparent}.navbar-default .navbar-text{color:#ebebeb}.navbar-default .navbar-nav>li>a{color:#ebebeb}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ebebeb;background-color:#485563}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ebebeb;background-color:#485563}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#485563}.navbar-default .navbar-toggle .icon-bar{background-color:#ebebeb}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#485563;color:#ebebeb}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ebebeb}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ebebeb;background-color:#485563}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ebebeb;background-color:#485563}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ebebeb}.navbar-default .navbar-link:hover{color:#ebebeb}.navbar-default .btn-link{color:#ebebeb}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ebebeb}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#df691a;border-color:transparent}.navbar-inverse .navbar-brand{color:#ebebeb}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ebebeb;background-color:transparent}.navbar-inverse .navbar-text{color:#ebebeb}.navbar-inverse .navbar-nav>li>a{color:#ebebeb}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ebebeb;background-color:#c85e17}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ebebeb;background-color:#c85e17}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#c85e17}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ebebeb}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#bf5a16}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#c85e17;color:#ebebeb}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ebebeb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ebebeb;background-color:#c85e17}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ebebeb;background-color:#c85e17}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ebebeb}.navbar-inverse .navbar-link:hover{color:#ebebeb}.navbar-inverse .btn-link{color:#ebebeb}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ebebeb}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#4e5d6c;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ebebeb}.breadcrumb>.active{color:#ebebeb}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 16px;line-height:1.42857143;text-decoration:none;color:#ebebeb;background-color:#4e5d6c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#ebebeb;background-color:#485563;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ebebeb;background-color:#df691a;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#323c46;background-color:#4e5d6c;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px 24px;font-size:19px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#4e5d6c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#485563}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#323c46;background-color:#4e5d6c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#4e5d6c}.label-default[href]:hover,.label-default[href]:focus{background-color:#39444e}.label-primary{background-color:#df691a}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#b15315}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:300;color:#ebebeb;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#4e5d6c;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#df691a;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#4e5d6c}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#39444e}.container .jumbotron,.container-fluid .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:67.5px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.42857143;background-color:#2b3e50;border:1px solid #dddddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#df691a}.thumbnail .caption{padding:9px;color:#ebebeb}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#5cb85c;border-color:transparent;color:#ebebeb}.alert-success hr{border-top-color:rgba(0,0,0,0)}.alert-success .alert-link{color:#d2d2d2}.alert-info{background-color:#5bc0de;border-color:transparent;color:#ebebeb}.alert-info hr{border-top-color:rgba(0,0,0,0)}.alert-info .alert-link{color:#d2d2d2}.alert-warning{background-color:#f0ad4e;border-color:transparent;color:#ebebeb}.alert-warning hr{border-top-color:rgba(0,0,0,0)}.alert-warning .alert-link{color:#d2d2d2}.alert-danger{background-color:#d9534f;border-color:transparent;color:#ebebeb}.alert-danger hr{border-top-color:rgba(0,0,0,0)}.alert-danger .alert-link{color:#d2d2d2}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#4e5d6c;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#df691a;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#4e5d6c;border:1px solid transparent}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item{color:#ebebeb}a.list-group-item .list-group-item-heading{color:#ebebeb}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#ebebeb;background-color:#485563}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ebebeb;color:#4e5d6c;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#4e5d6c}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#df691a;border-color:#df691a}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#f9decc}.list-group-item-success{color:#ebebeb;background-color:#5cb85c}a.list-group-item-success{color:#ebebeb}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#ebebeb;background-color:#4cae4c}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-info{color:#ebebeb;background-color:#5bc0de}a.list-group-item-info{color:#ebebeb}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#ebebeb;background-color:#46b8da}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-warning{color:#ebebeb;background-color:#f0ad4e}a.list-group-item-warning{color:#ebebeb}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#ebebeb;background-color:#eea236}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-danger{color:#ebebeb;background-color:#d9534f}a.list-group-item-danger{color:#ebebeb}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#ebebeb;background-color:#d43f3a}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#ebebeb;border-color:#ebebeb}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#485563;border-top:1px solid transparent;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #4e5d6c}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}.panel-default{border-color:transparent}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:transparent}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-primary{border-color:transparent}.panel-primary>.panel-heading{color:#ffffff;background-color:#df691a;border-color:transparent}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-primary>.panel-heading .badge{color:#df691a;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-success{border-color:transparent}.panel-success>.panel-heading{color:#ebebeb;background-color:#5cb85c;border-color:transparent}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-success>.panel-heading .badge{color:#5cb85c;background-color:#ebebeb}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-info{border-color:transparent}.panel-info>.panel-heading{color:#ebebeb;background-color:#5bc0de;border-color:transparent}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ebebeb}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-warning{border-color:transparent}.panel-warning>.panel-heading{color:#ebebeb;background-color:#f0ad4e;border-color:transparent}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-warning>.panel-heading .badge{color:#f0ad4e;background-color:#ebebeb}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.panel-danger{border-color:transparent}.panel-danger>.panel-heading{color:#ebebeb;background-color:#d9534f;border-color:transparent}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:transparent}.panel-danger>.panel-heading .badge{color:#d9534f;background-color:#ebebeb}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:transparent}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ebebeb;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ebebeb;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#4e5d6c;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #2b3e50;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #2b3e50}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;font-weight:normal;line-height:1.42857143;text-align:left;background-color:#4e5d6c;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#485563;border-bottom:1px solid #3d4954;border-radius:-1 -1 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:transparent;bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#4e5d6c}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:transparent}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#4e5d6c}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:transparent;top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#4e5d6c}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:transparent}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#4e5d6c;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{-webkit-box-shadow:none;box-shadow:none;border:none;font-size:12px}.navbar-default .badge{background-color:#fff;color:#4e5d6c}.navbar-inverse .badge{background-color:#fff;color:#df691a}.btn{font-weight:300}.btn-default:hover{background-color:#485563}.btn-sm,.btn-xs{font-size:12px}body{font-weight:300}.text-primary,.text-primary:hover{color:#df691a}.text-success,.text-success:hover{color:#5cb85c}.text-danger,.text-danger:hover{color:#d9534f}.text-warning,.text-warning:hover{color:#f0ad4e}.text-info,.text-info:hover{color:#5bc0de}.page-header{border-bottom-color:#4e5d6c}.dropdown-menu{border:none;margin:0;-webkit-box-shadow:none;box-shadow:none}.dropdown-menu>li>a{font-size:12px;font-weight:300}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.dropdown-header{font-size:12px}table,.table{font-size:12px}table a:not(.btn),.table a:not(.btn){color:#fff;text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .text-muted,.table .text-muted{color:#4e5d6c}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border-color:transparent}input,textarea{color:#2b3e50}label,.radio label,.checkbox label,.help-block{font-size:12px;font-weight:300}.input-addon,.input-group-addon{color:#ebebeb}.has-warning .help-block,.has-warning .control-label,.has-warning .form-control-feedback{color:#f0ad4e}.has-warning .input-group-addon{border:none}.has-error .help-block,.has-error .control-label,.has-error .form-control-feedback{color:#d9534f}.has-error .input-group-addon{border:none}.has-success .help-block,.has-success .control-label,.has-success .form-control-feedback{color:#5cb85c}.has-success .input-group-addon{border:none}.form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .form-control:focus,.has-error .form-control:focus,.has-success .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{color:#ebebeb}.nav-pills>li>a{color:#ebebeb}.pager a{color:#ebebeb}.label{font-weight:300}.alert{color:#fff}.alert a,.alert .alert-link{color:#fff}.close{opacity:0.4}.close:hover,.close:focus{opacity:1}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border:none}a.list-group-item-success.active{background-color:#5cb85c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#4cae4c}a.list-group-item-warning.active{background-color:#f0ad4e}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#eea236}a.list-group-item-danger.active{background-color:#d9534f}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#d43f3a}.panel{border:none}.panel-default>.panel-heading{background-color:#485563;color:#ebebeb}.thumbnail{background-color:#4e5d6c;border:none}.modal{padding:0}.modal-header,.modal-footer{background-color:#485563;border:none;border-radius:0}.popover-title{border:none} \ No newline at end of file diff --git a/td/public/content/themes/united/bootstrap-theme.css b/td/public/content/themes/united/bootstrap-theme.css new file mode 100644 index 000000000..18f74dd54 --- /dev/null +++ b/td/public/content/themes/united/bootstrap-theme.css @@ -0,0 +1,6887 @@ +@import url("//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700"); +/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../../../fonts/glyphicons-halflings-regular.eot'); + src: url('../../../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../../../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.4; + color: #222222; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #008cba; + text-decoration: none; +} +a:hover, +a:focus { + color: #00526e; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 0; +} +.img-thumbnail { + padding: 4px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #dddddd; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10.5px; + margin-bottom: 10.5px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 39px; +} +h2, +.h2 { + font-size: 32px; +} +h3, +.h3 { + font-size: 26px; +} +h4, +.h4 { + font-size: 19px; +} +h5, +.h5 { + font-size: 15px; +} +h6, +.h6 { + font-size: 13px; +} +p { + margin: 0 0 10.5px; +} +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 22.5px; + } +} +small, +.small { + font-size: 80%; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #999999; +} +.text-primary { + color: #008cba; +} +a.text-primary:hover { + color: #006687; +} +.text-success { + color: #43ac6a; +} +a.text-success:hover { + color: #358753; +} +.text-info { + color: #5bc0de; +} +a.text-info:hover { + color: #31b0d5; +} +.text-warning { + color: #e99002; +} +a.text-warning:hover { + color: #b67102; +} +.text-danger { + color: #f04124; +} +a.text-danger:hover { + color: #d32a0e; +} +.bg-primary { + color: #fff; + background-color: #008cba; +} +a.bg-primary:hover { + background-color: #006687; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #dddddd; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10.5px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 21px; +} +dt, +dd { + line-height: 1.4; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #dddddd; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.4; + color: #6f6f6f; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dddddd; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 21px; + font-style: normal; + line-height: 1.4; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 0; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.4; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #999999; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.4; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 9px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; +} +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-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; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 39px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 36px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 60px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 21px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.input-sm { + height: 36px; + line-height: 36px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.form-group-sm .form-control { + height: 36px; + line-height: 36px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + min-height: 33px; +} +.input-lg { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.input-lg { + height: 60px; + line-height: 60px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.form-group-lg .form-control { + height: 60px; + line-height: 60px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + min-height: 40px; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 48.75px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 60px; + height: 60px; + line-height: 60px; +} +.input-sm + .form-control-feedback { + width: 36px; + height: 36px; + line-height: 36px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #43ac6a; +} +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; +} +.has-success .input-group-addon { + color: #43ac6a; + border-color: #43ac6a; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #43ac6a; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #e99002; +} +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; +} +.has-warning .input-group-addon { + color: #e99002; + border-color: #e99002; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #e99002; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #f04124; +} +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; +} +.has-error .input-group-addon { + color: #f04124; + border-color: #f04124; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #f04124; +} +.has-feedback label ~ .form-control-feedback { + top: 26px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 30px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 22.3333328px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 9px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #e7e7e7; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #cecece; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e7e7e7; + border-color: #cccccc; +} +.btn-default .badge { + color: #e7e7e7; + background-color: #333333; +} +.btn-primary { + color: #ffffff; + background-color: #008cba; + border-color: #0079a1; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #006687; + border-color: #004b63; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #008cba; + border-color: #0079a1; +} +.btn-primary .badge { + color: #008cba; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-success .badge { + color: #43ac6a; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #e99002; + border-color: #d08002; +} +.btn-warning .badge { + color: #e99002; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #f04124; + border-color: #ea2f10; +} +.btn-danger .badge { + color: #f04124; + background-color: #ffffff; +} +.btn-link { + color: #008cba; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #00526e; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 4px 6px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0, 0, 0, 0.2); +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.4; + color: #555555; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #eeeeee; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #008cba; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.4; + color: #999999; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: 0; + border-top-left-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-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 60px; + line-height: 60px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 8px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 0; +} +.input-group-addon.input-sm { + padding: 8px 12px; + font-size: 12px; + border-radius: 0; +} +.input-group-addon.input-lg { + padding: 16px 20px; + font-size: 19px; + border-radius: 0; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #999999; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #008cba; +} +.nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.4; + border: 1px solid transparent; + border-radius: 0 0 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #6f6f6f; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 0; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #008cba; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 0; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; + height: 45px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 6px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 21px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 12px; + padding-bottom: 12px; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 3px; + margin-bottom: 3px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 3px; + margin-bottom: 3px; +} +.navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; +} +.navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; +} +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #333333; + border-color: #222222; +} +.navbar-default .navbar-brand { + color: #ffffff; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #ffffff; +} +.navbar-default .navbar-nav > li > a { + color: #ffffff; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #272727; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #272727; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: transparent; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: transparent; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #222222; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #272727; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #272727; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #272727; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #ffffff; +} +.navbar-default .navbar-link:hover { + color: #ffffff; +} +.navbar-default .btn-link { + color: #ffffff; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #ffffff; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; +} +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} +.navbar-inverse .navbar-brand { + color: #ffffff; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #ffffff; +} +.navbar-inverse .navbar-nav > li > a { + color: #ffffff; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #006687; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #006687; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: transparent; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: transparent; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #007196; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #006687; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #ffffff; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.navbar-inverse .btn-link { + color: #ffffff; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #ffffff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #999999; +} +.breadcrumb > .active { + color: #333333; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 8px 12px; + line-height: 1.4; + text-decoration: none; + color: #008cba; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #00526e; + background-color: #eeeeee; + border-color: transparent; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: transparent; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: transparent; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 16px 20px; + font-size: 19px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 8px 12px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + background-color: transparent; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #999999; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} +.label-primary { + background-color: #008cba; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #006687; +} +.label-success { + background-color: #43ac6a; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #358753; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #e99002; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #b67102; +} +.label-danger { + background-color: #f04124; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #d32a0e; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #008cba; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #008cba; + background-color: #ffffff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #fafafa; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #e1e1e1; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 0; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 67.5px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #008cba; +} +.thumbnail .caption { + padding: 9px; + color: #222222; +} +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #43ac6a; + border-color: #3c9a5f; + color: #ffffff; +} +.alert-success hr { + border-top-color: #358753; +} +.alert-success .alert-link { + color: #e6e6e6; +} +.alert-info { + background-color: #5bc0de; + border-color: #3db5d8; + color: #ffffff; +} +.alert-info hr { + border-top-color: #2aabd2; +} +.alert-info .alert-link { + color: #e6e6e6; +} +.alert-warning { + background-color: #e99002; + border-color: #d08002; + color: #ffffff; +} +.alert-warning hr { + border-top-color: #b67102; +} +.alert-warning .alert-link { + color: #e6e6e6; +} +.alert-danger { + background-color: #f04124; + border-color: #ea2f10; + color: #ffffff; +} +.alert-danger hr { + border-top-color: #d32a0e; +} +.alert-danger .alert-link { + color: #e6e6e6; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #43ac6a; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #e99002; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #f04124; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + zoom: 1; + overflow: hidden; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} +.list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +a.list-group-item { + color: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + color: #555555; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #eeeeee; + color: #999999; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #999999; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #87e1ff; +} +.list-group-item-success { + color: #43ac6a; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #43ac6a; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #43ac6a; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #43ac6a; + border-color: #43ac6a; +} +.list-group-item-info { + color: #5bc0de; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #5bc0de; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #5bc0de; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de; +} +.list-group-item-warning { + color: #e99002; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #e99002; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #e99002; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #e99002; + border-color: #e99002; +} +.list-group-item-danger { + color: #f04124; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #f04124; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #f04124; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #f04124; + border-color: #f04124; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 21px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: -1; + border-top-right-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: -1; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: -1; + border-bottom-right-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: -1; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 21px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 0; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #008cba; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #008cba; +} +.panel-primary > .panel-heading .badge { + color: #008cba; + background-color: #ffffff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #008cba; +} +.panel-success { + border-color: #3c9a5f; +} +.panel-success > .panel-heading { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3c9a5f; +} +.panel-success > .panel-heading .badge { + color: #43ac6a; + background-color: #ffffff; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3c9a5f; +} +.panel-info { + border-color: #3db5d8; +} +.panel-info > .panel-heading { + color: #ffffff; + background-color: #5bc0de; + border-color: #3db5d8; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3db5d8; +} +.panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ffffff; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3db5d8; +} +.panel-warning { + border-color: #d08002; +} +.panel-warning > .panel-heading { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d08002; +} +.panel-warning > .panel-heading .badge { + color: #e99002; + background-color: #ffffff; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d08002; +} +.panel-danger { + border-color: #ea2f10; +} +.panel-danger > .panel-heading { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ea2f10; +} +.panel-danger > .panel-heading .badge { + color: #f04124; + background-color: #ffffff; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ea2f10; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 0; +} +.well-sm { + padding: 9px; + border-radius: 0; +} +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.4px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.4; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #333333; + border-radius: 0; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + font-weight: normal; + line-height: 1.4; + text-align: left; + background-color: #333333; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #333333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #333333; + border-bottom: 1px solid #262626; + border-radius: -1 -1 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #000000; + border-top-color: rgba(0, 0, 0, 0.05); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #333333; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #000000; + border-right-color: rgba(0, 0, 0, 0.05); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #333333; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #000000; + border-bottom-color: rgba(0, 0, 0, 0.05); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #333333; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #000000; + border-left-color: rgba(0, 0, 0, 0.05); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #333333; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.navbar { + border: none; + font-size: 13px; + font-weight: 300; +} +.navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; +} +.navbar-collapse { + border-top-color: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: none; + box-shadow: none; +} +.navbar .btn { + padding-top: 6px; + padding-bottom: 6px; +} +.navbar-form { + margin-top: 7px; + margin-bottom: 5px; +} +.navbar-form .form-control { + height: auto; + padding: 4px 6px; +} +.navbar .dropdown-menu { + border: none; +} +.navbar .dropdown-menu > li > a, +.navbar .dropdown-menu > li > a:focus { + background-color: transparent; + font-size: 13px; + font-weight: 300; +} +.navbar .dropdown-header { + color: rgba(255, 255, 255, 0.5); +} +.navbar-default .dropdown-menu { + background-color: #333333; +} +.navbar-default .dropdown-menu > li > a, +.navbar-default .dropdown-menu > li > a:focus { + color: #ffffff; +} +.navbar-default .dropdown-menu > li > a:hover, +.navbar-default .dropdown-menu > .active > a, +.navbar-default .dropdown-menu > .active > a:hover { + background-color: #272727; +} +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} +.navbar-inverse .dropdown-menu > li > a, +.navbar-inverse .dropdown-menu > li > a:focus { + color: #ffffff; +} +.navbar-inverse .dropdown-menu > li > a:hover, +.navbar-inverse .dropdown-menu > .active > a, +.navbar-inverse .dropdown-menu > .active > a:hover { + background-color: #006687; +} +.btn { + padding: 8px 12px; +} +.btn-lg { + padding: 16px 20px; +} +.btn-sm { + padding: 8px 12px; +} +.btn-xs { + padding: 4px 6px; +} +.btn-group .btn ~ .dropdown-toggle { + padding-left: 16px; + padding-right: 16px; +} +.btn-group .dropdown-menu { + border-top-width: 0; +} +.btn-group.dropup .dropdown-menu { + border-top-width: 1px; + border-bottom-width: 0; + margin-bottom: 0; +} +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu { + background-color: #e7e7e7; + border-color: #cccccc; +} +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a { + color: #333333; +} +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a:hover { + background-color: #d3d3d3; +} +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a:hover { + background-color: #006d91; +} +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a:hover { + background-color: #388f58; +} +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a:hover { + background-color: #39b3d7; +} +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a:hover { + background-color: #c17702; +} +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a:hover { + background-color: #dc2c0f; +} +.lead { + color: #6f6f6f; +} +cite { + font-style: italic; +} +blockquote { + border-left-width: 1px; + color: #6f6f6f; +} +blockquote.pull-right { + border-right-width: 1px; +} +blockquote small { + font-size: 12px; + font-weight: 300; +} +table { + font-size: 12px; +} +label, +.control-label, +.help-block, +.checkbox, +.radio { + font-size: 12px; + font-weight: normal; +} +input[type="radio"], +input[type="checkbox"] { + margin-top: 1px; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} +.nav-tabs > li > a { + background-color: #e7e7e7; + color: #222222; +} +.nav-tabs .caret { + border-top-color: #222222; + border-bottom-color: #222222; +} +.nav-pills { + font-weight: 300; +} +.breadcrumb { + border: 1px solid #dddddd; + border-radius: 3px; + font-size: 10px; + font-weight: 300; + text-transform: uppercase; +} +.pagination { + font-size: 12px; + font-weight: 300; + color: #999999; +} +.pagination > li > a, +.pagination > li > span { + margin-left: 4px; + color: #999999; +} +.pagination > .active > a, +.pagination > .active > span { + color: #fff; +} +.pagination > li > a, +.pagination > li:first-child > a, +.pagination > li:last-child > a, +.pagination > li > span, +.pagination > li:first-child > span, +.pagination > li:last-child > span { + border-radius: 3px; +} +.pagination-lg > li > a { + padding-left: 22px; + padding-right: 22px; +} +.pagination-sm > li > a { + padding: 0 5px; +} +.pager { + font-size: 12px; + font-weight: 300; + color: #999999; +} +.list-group { + font-size: 12px; + font-weight: 300; +} +.close { + opacity: 0.4; + text-decoration: none; + text-shadow: none; +} +.close:hover, +.close:focus { + opacity: 1; +} +.alert { + font-size: 12px; + font-weight: 300; +} +.alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; +} +.label { + padding-left: 1em; + padding-right: 1em; + border-radius: 0; + font-weight: 300; +} +.label-default { + background-color: #e7e7e7; + color: #333333; +} +.badge { + font-weight: 300; +} +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} +.dropdown-menu > li > a { + padding: 12px 15px; +} +.dropdown-header { + padding-left: 15px; + padding-right: 15px; + font-size: 9px; + text-transform: uppercase; +} +.popover { + color: #fff; + font-size: 12px; + font-weight: 300; +} +.panel-heading, +.panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel-default .close { + color: #222222; +} +.modal .close { + color: #222222; +} diff --git a/td/public/content/themes/united/bootstrap-theme.css.map b/td/public/content/themes/united/bootstrap-theme.css.map new file mode 100644 index 000000000..5a12d6317 --- /dev/null +++ b/td/public/content/themes/united/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/td/public/content/themes/united/bootstrap-theme.min.css b/td/public/content/themes/united/bootstrap-theme.min.css new file mode 100644 index 000000000..e850e140a --- /dev/null +++ b/td/public/content/themes/united/bootstrap-theme.min.css @@ -0,0 +1,7 @@ +@import url("//fonts.googleapis.com/css?family=Ubuntu");/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#dd4814;text-decoration:none}a:hover,a:focus{color:#97310e;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eeeeee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#aea79f}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#aea79f}.text-primary{color:#dd4814}a.text-primary:hover{color:#ae3910}.text-success{color:#468847}a.text-success:hover{color:#356635}.text-info{color:#3a87ad}a.text-info:hover{color:#2d6987}.text-warning{color:#c09853}a.text-warning:hover{color:#a47e3c}.text-danger{color:#b94a48}a.text-danger:hover{color:#953b39}.bg-primary{color:#fff;background-color:#dd4814}a.bg-primary:hover{background-color:#ae3910}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eeeeee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #aea79f}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eeeeee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#aea79f}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#aea79f;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:14px;line-height:1.42857143;color:#333333}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.42857143;color:#333333;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#aea79f;opacity:1}.form-control:-ms-input-placeholder{color:#aea79f}.form-control::-webkit-input-placeholder{color:#aea79f}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:38px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:54px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;min-height:32px}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:54px;line-height:54px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;min-height:38px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:47.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:54px;height:54px;line-height:54px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;border-color:#468847;background-color:#dff0d8}.has-success .form-control-feedback{color:#468847}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;border-color:#c09853;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;border-color:#b94a48;background-color:#f2dede}.has-error .form-control-feedback{color:#b94a48}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19.6666662px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#ffffff;background-color:#aea79f;border-color:#aea79f}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#978e83;border-color:#92897e}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#aea79f;border-color:#aea79f}.btn-default .badge{color:#aea79f;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#dd4814;border-color:#dd4814}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#ae3910;border-color:#a5360f}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#dd4814;border-color:#dd4814}.btn-primary .badge{color:#dd4814;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#38b44a;border-color:#38b44a}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#2c8d3a;border-color:#298537}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#38b44a;border-color:#38b44a}.btn-success .badge{color:#38b44a;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#772953;border-color:#772953}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#511c39;border-color:#491933}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#772953;border-color:#772953}.btn-info .badge{color:#772953;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#efb73e;border-color:#efb73e}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#e7a413;border-color:#dd9d12}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#efb73e;border-color:#efb73e}.btn-warning .badge{color:#efb73e;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#df382c;border-color:#df382c}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#bc271c;border-color:#b3251b}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#df382c;border-color:#df382c}.btn-danger .badge{color:#df382c;background-color:#ffffff}.btn-link{color:#dd4814;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#97310e;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#aea79f;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#dd4814}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#dd4814}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#aea79f}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#aea79f;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#333333;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#aea79f}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#aea79f;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#dd4814}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#777777;background-color:#ffffff;border:1px solid #dddddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#dd4814}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:6px;margin-bottom:6px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:6px;margin-bottom:6px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#dd4814;border-color:#bf3e11}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#97310e}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#ae3910}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#97310e}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#97310e}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#bf3e11}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#ae3910;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#97310e}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#ae3910}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#772953;border-color:#511c39}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:none}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#3e152b}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#511c39}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#3e152b}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#3e152b}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#5c2040}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#511c39;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#3e152b}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#511c39}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#cccccc}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#cccccc}.breadcrumb>.active{color:#aea79f}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.42857143;text-decoration:none;color:#dd4814;background-color:#ffffff;border:1px solid #dddddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#97310e;background-color:#eeeeee;border-color:#dddddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#aea79f;background-color:#f5f5f5;border-color:#dddddd;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#aea79f;background-color:#ffffff;border-color:#dddddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#ffffff;border:1px solid #dddddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#aea79f;background-color:#ffffff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#aea79f}.label-default[href]:hover,.label-default[href]:focus{background-color:#978e83}.label-primary{background-color:#dd4814}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#ae3910}.label-success{background-color:#38b44a}.label-success[href]:hover,.label-success[href]:focus{background-color:#2c8d3a}.label-info{background-color:#772953}.label-info[href]:hover,.label-info[href]:focus{background-color:#511c39}.label-warning{background-color:#efb73e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e7a413}.label-danger{background-color:#df382c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#bc271c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#aea79f;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#dd4814;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eeeeee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#ffffff;border:1px solid #dddddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#dd4814}.thumbnail .caption{padding:9px;color:#333333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{background-color:#fcf8e3;border-color:#fbeed5;color:#c09853}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#ffffff;text-align:center;background-color:#dd4814;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#38b44a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#772953}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#efb73e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#df382c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555555}a.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#aea79f;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#aea79f}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#dd4814;border-color:#dd4814}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#fad1c3}.list-group-item-success{color:#468847;background-color:#dff0d8}a.list-group-item-success{color:#468847}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}.list-group-item-info{color:#3a87ad;background-color:#d9edf7}a.list-group-item-info{color:#3a87ad}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}.list-group-item-warning{color:#c09853;background-color:#fcf8e3}a.list-group-item-warning{color:#c09853}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}.list-group-item-danger{color:#b94a48;background-color:#f2dede}a.list-group-item-danger{color:#b94a48}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#ffffff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#dd4814}.panel-primary>.panel-heading{color:#ffffff;background-color:#dd4814;border-color:#dd4814}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dd4814}.panel-primary>.panel-heading .badge{color:#dd4814;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dd4814}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#468847}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#3a87ad}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#fbeed5}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#c09853}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#eed3d7}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#b94a48}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#eed3d7}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:normal;line-height:1.42857143;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar-default .badge{background-color:#fff;color:#dd4814}.navbar-inverse .badge{background-color:#fff;color:#772953} \ No newline at end of file diff --git a/td/public/content/themes/yeti/bootstrap-theme.css b/td/public/content/themes/yeti/bootstrap-theme.css new file mode 100644 index 000000000..ec1b86e8f --- /dev/null +++ b/td/public/content/themes/yeti/bootstrap-theme.css @@ -0,0 +1,6887 @@ +@import url("//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700"); +/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 1.4; + color: #222222; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #008cba; + text-decoration: none; +} +a:hover, +a:focus { + color: #00526e; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 0; +} +.img-thumbnail { + padding: 4px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 21px; + margin-bottom: 21px; + border: 0; + border-top: 1px solid #dddddd; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 21px; + margin-bottom: 10.5px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10.5px; + margin-bottom: 10.5px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 39px; +} +h2, +.h2 { + font-size: 32px; +} +h3, +.h3 { + font-size: 26px; +} +h4, +.h4 { + font-size: 19px; +} +h5, +.h5 { + font-size: 15px; +} +h6, +.h6 { + font-size: 13px; +} +p { + margin: 0 0 10.5px; +} +.lead { + margin-bottom: 21px; + font-size: 17px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 22.5px; + } +} +small, +.small { + font-size: 80%; +} +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #999999; +} +.text-primary { + color: #008cba; +} +a.text-primary:hover { + color: #006687; +} +.text-success { + color: #43ac6a; +} +a.text-success:hover { + color: #358753; +} +.text-info { + color: #5bc0de; +} +a.text-info:hover { + color: #31b0d5; +} +.text-warning { + color: #e99002; +} +a.text-warning:hover { + color: #b67102; +} +.text-danger { + color: #f04124; +} +a.text-danger:hover { + color: #d32a0e; +} +.bg-primary { + color: #fff; + background-color: #008cba; +} +a.bg-primary:hover { + background-color: #006687; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9.5px; + margin: 42px 0 21px; + border-bottom: 1px solid #dddddd; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10.5px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 21px; +} +dt, +dd { + line-height: 1.4; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10.5px 21px; + margin: 0 0 21px; + font-size: 18.75px; + border-left: 5px solid #dddddd; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.4; + color: #6f6f6f; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #dddddd; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 21px; + font-style: normal; + line-height: 1.4; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 0; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 0; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 10px; + margin: 0 0 10.5px; + font-size: 14px; + line-height: 1.4; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 0; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #999999; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 21px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.4; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15.75px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 21px; + font-size: 22.5px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 9px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; +} +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + color: #6f6f6f; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-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; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 39px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 36px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 60px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 21px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 9px; + padding-bottom: 9px; + margin-bottom: 0; + min-height: 36px; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-left: 0; + padding-right: 0; +} +.input-sm { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.input-sm { + height: 36px; + line-height: 36px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.form-group-sm .form-control { + height: 36px; + line-height: 36px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + min-height: 33px; +} +.input-lg { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.input-lg { + height: 60px; + line-height: 60px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.form-group-lg .form-control { + height: 60px; + line-height: 60px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + min-height: 40px; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 48.75px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 39px; + height: 39px; + line-height: 39px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 60px; + height: 60px; + line-height: 60px; +} +.input-sm + .form-control-feedback { + width: 36px; + height: 36px; + line-height: 36px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #43ac6a; +} +.has-success .form-control { + border-color: #43ac6a; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #358753; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #85d0a1; +} +.has-success .input-group-addon { + color: #43ac6a; + border-color: #43ac6a; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #43ac6a; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #e99002; +} +.has-warning .form-control { + border-color: #e99002; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #b67102; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #febc53; +} +.has-warning .input-group-addon { + color: #e99002; + border-color: #e99002; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #e99002; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #f04124; +} +.has-error .form-control { + border-color: #f04124; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #d32a0e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f79483; +} +.has-error .input-group-addon { + color: #f04124; + border-color: #f04124; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #f04124; +} +.has-feedback label ~ .form-control-feedback { + top: 26px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #626262; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 9px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 30px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 9px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 22.3333328px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 9px; + } +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 8px 12px; + font-size: 15px; + line-height: 1.4; + border-radius: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #e7e7e7; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #cecece; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e7e7e7; + border-color: #cccccc; +} +.btn-default .badge { + color: #e7e7e7; + background-color: #333333; +} +.btn-primary { + color: #ffffff; + background-color: #008cba; + border-color: #0079a1; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #006687; + border-color: #004b63; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #008cba; + border-color: #0079a1; +} +.btn-primary .badge { + color: #008cba; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #358753; + border-color: #2b6e44; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-success .badge { + color: #43ac6a; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #b67102; + border-color: #935b01; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #e99002; + border-color: #d08002; +} +.btn-warning .badge { + color: #e99002; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d32a0e; + border-color: #b1240c; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #f04124; + border-color: #ea2f10; +} +.btn-danger .badge { + color: #f04124; + background-color: #ffffff; +} +.btn-link { + color: #008cba; + font-weight: normal; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #00526e; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 4px 6px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + -o-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 15px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: rgba(0, 0, 0, 0.2); +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.4; + color: #555555; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #eeeeee; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #008cba; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.4; + color: #999999; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 0; + border-top-right-radius: 0; + border-top-left-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-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 60px; + padding: 16px 20px; + font-size: 19px; + line-height: 1.3333333; + border-radius: 0; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 60px; + line-height: 60px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 36px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + border-radius: 0; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 8px 12px; + font-size: 15px; + font-weight: normal; + line-height: 1; + color: #6f6f6f; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 0; +} +.input-group-addon.input-sm { + padding: 8px 12px; + font-size: 12px; + border-radius: 0; +} +.input-group-addon.input-lg { + padding: 16px 20px; + font-size: 19px; + border-radius: 0; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #999999; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #008cba; +} +.nav .nav-divider { + height: 1px; + margin: 9.5px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.4; + border: 1px solid transparent; + border-radius: 0 0 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #6f6f6f; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 0; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #008cba; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 0; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 0 0 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 45px; + margin-bottom: 21px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 0; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 12px 15px; + font-size: 19px; + line-height: 21px; + height: 45px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 5.5px; + margin-bottom: 5.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 0; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 6px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 21px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 21px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 12px; + padding-bottom: 12px; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 3px; + margin-bottom: 3px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 3px; + margin-bottom: 3px; +} +.navbar-btn.btn-sm { + margin-top: 4.5px; + margin-bottom: 4.5px; +} +.navbar-btn.btn-xs { + margin-top: 11.5px; + margin-bottom: 11.5px; +} +.navbar-text { + margin-top: 12px; + margin-bottom: 12px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #333333; + border-color: #222222; +} +.navbar-default .navbar-brand { + color: #ffffff; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #ffffff; +} +.navbar-default .navbar-nav > li > a { + color: #ffffff; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #272727; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #272727; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: transparent; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: transparent; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #222222; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #272727; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #272727; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #272727; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #ffffff; +} +.navbar-default .navbar-link:hover { + color: #ffffff; +} +.navbar-default .btn-link { + color: #ffffff; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #ffffff; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; +} +.navbar-inverse { + background-color: #008cba; + border-color: #006687; +} +.navbar-inverse .navbar-brand { + color: #ffffff; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #ffffff; +} +.navbar-inverse .navbar-nav > li > a { + color: #ffffff; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: #006687; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #006687; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: transparent; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: transparent; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #007196; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #006687; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #ffffff; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #006687; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #ffffff; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.navbar-inverse .btn-link { + color: #ffffff; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #ffffff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 21px; + list-style: none; + background-color: #f5f5f5; + border-radius: 0; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #999999; +} +.breadcrumb > .active { + color: #333333; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 21px 0; + border-radius: 0; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 8px 12px; + line-height: 1.4; + text-decoration: none; + color: #008cba; + background-color: transparent; + border: 1px solid transparent; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #00526e; + background-color: #eeeeee; + border-color: transparent; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: transparent; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: transparent; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 16px 20px; + font-size: 19px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 8px 12px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pager { + padding-left: 0; + margin: 21px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: transparent; + border: 1px solid transparent; + border-radius: 3px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + background-color: transparent; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #999999; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} +.label-primary { + background-color: #008cba; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #006687; +} +.label-success { + background-color: #43ac6a; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #358753; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #e99002; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #b67102; +} +.label-danger { + background-color: #f04124; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #d32a0e; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #008cba; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #008cba; + background-color: #ffffff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #fafafa; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 23px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #e1e1e1; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 0; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 67.5px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 21px; + line-height: 1.4; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 0; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #008cba; +} +.thumbnail .caption { + padding: 9px; + color: #222222; +} +.alert { + padding: 15px; + margin-bottom: 21px; + border: 1px solid transparent; + border-radius: 0; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #43ac6a; + border-color: #3c9a5f; + color: #ffffff; +} +.alert-success hr { + border-top-color: #358753; +} +.alert-success .alert-link { + color: #e6e6e6; +} +.alert-info { + background-color: #5bc0de; + border-color: #3db5d8; + color: #ffffff; +} +.alert-info hr { + border-top-color: #2aabd2; +} +.alert-info .alert-link { + color: #e6e6e6; +} +.alert-warning { + background-color: #e99002; + border-color: #d08002; + color: #ffffff; +} +.alert-warning hr { + border-top-color: #b67102; +} +.alert-warning .alert-link { + color: #e6e6e6; +} +.alert-danger { + background-color: #f04124; + border-color: #ea2f10; + color: #ffffff; +} +.alert-danger hr { + border-top-color: #d32a0e; +} +.alert-danger .alert-link { + color: #e6e6e6; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 21px; + margin-bottom: 21px; + background-color: #f5f5f5; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 21px; + color: #ffffff; + text-align: center; + background-color: #008cba; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #43ac6a; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #e99002; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #f04124; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + zoom: 1; + overflow: hidden; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} +.list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +a.list-group-item { + color: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + color: #555555; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #eeeeee; + color: #999999; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #999999; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #87e1ff; +} +.list-group-item-success { + color: #43ac6a; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #43ac6a; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #43ac6a; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #43ac6a; + border-color: #43ac6a; +} +.list-group-item-info { + color: #5bc0de; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #5bc0de; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #5bc0de; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de; +} +.list-group-item-warning { + color: #e99002; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #e99002; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #e99002; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #e99002; + border-color: #e99002; +} +.list-group-item-danger { + color: #f04124; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #f04124; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #f04124; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #f04124; + border-color: #f04124; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 21px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 17px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: -1; + border-top-left-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: -1; + border-top-right-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: -1; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: -1; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: -1; + border-bottom-left-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: -1; + border-bottom-right-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: -1; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: -1; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 21px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 0; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #008cba; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #008cba; + border-color: #008cba; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #008cba; +} +.panel-primary > .panel-heading .badge { + color: #008cba; + background-color: #ffffff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #008cba; +} +.panel-success { + border-color: #3c9a5f; +} +.panel-success > .panel-heading { + color: #ffffff; + background-color: #43ac6a; + border-color: #3c9a5f; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3c9a5f; +} +.panel-success > .panel-heading .badge { + color: #43ac6a; + background-color: #ffffff; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3c9a5f; +} +.panel-info { + border-color: #3db5d8; +} +.panel-info > .panel-heading { + color: #ffffff; + background-color: #5bc0de; + border-color: #3db5d8; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #3db5d8; +} +.panel-info > .panel-heading .badge { + color: #5bc0de; + background-color: #ffffff; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #3db5d8; +} +.panel-warning { + border-color: #d08002; +} +.panel-warning > .panel-heading { + color: #ffffff; + background-color: #e99002; + border-color: #d08002; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d08002; +} +.panel-warning > .panel-heading .badge { + color: #e99002; + background-color: #ffffff; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d08002; +} +.panel-danger { + border-color: #ea2f10; +} +.panel-danger > .panel-heading { + color: #ffffff; + background-color: #f04124; + border-color: #ea2f10; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ea2f10; +} +.panel-danger > .panel-heading .badge { + color: #f04124; + background-color: #ffffff; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ea2f10; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-lg { + padding: 24px; + border-radius: 0; +} +.well-sm { + padding: 9px; + border-radius: 0; +} +.close { + float: right; + font-size: 22.5px; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + -webkit-background-clip: padding-box; + background-clip: padding-box; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.4px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.4; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #333333; + border-radius: 0; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + font-weight: normal; + line-height: 1.4; + text-align: left; + background-color: #333333; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #333333; + border: 1px solid transparent; + border-radius: 0; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 15px; + background-color: #333333; + border-bottom: 1px solid #262626; + border-radius: -1 -1 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #000000; + border-top-color: rgba(0, 0, 0, 0.05); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #333333; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #000000; + border-right-color: rgba(0, 0, 0, 0.05); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #333333; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #000000; + border-bottom-color: rgba(0, 0, 0, 0.05); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #333333; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #000000; + border-left-color: rgba(0, 0, 0, 0.05); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #333333; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +.navbar { + border: none; + font-size: 13px; + font-weight: 300; +} +.navbar .navbar-toggle:hover .icon-bar { + background-color: #b3b3b3; +} +.navbar-collapse { + border-top-color: rgba(0, 0, 0, 0.2); + -webkit-box-shadow: none; + box-shadow: none; +} +.navbar .btn { + padding-top: 6px; + padding-bottom: 6px; +} +.navbar-form { + margin-top: 7px; + margin-bottom: 5px; +} +.navbar-form .form-control { + height: auto; + padding: 4px 6px; +} +.navbar .dropdown-menu { + border: none; +} +.navbar .dropdown-menu > li > a, +.navbar .dropdown-menu > li > a:focus { + background-color: transparent; + font-size: 13px; + font-weight: 300; +} +.navbar .dropdown-header { + color: rgba(255, 255, 255, 0.5); +} +.navbar-default .dropdown-menu { + background-color: #333333; +} +.navbar-default .dropdown-menu > li > a, +.navbar-default .dropdown-menu > li > a:focus { + color: #ffffff; +} +.navbar-default .dropdown-menu > li > a:hover, +.navbar-default .dropdown-menu > .active > a, +.navbar-default .dropdown-menu > .active > a:hover { + background-color: #272727; +} +.navbar-inverse .dropdown-menu { + background-color: #008cba; +} +.navbar-inverse .dropdown-menu > li > a, +.navbar-inverse .dropdown-menu > li > a:focus { + color: #ffffff; +} +.navbar-inverse .dropdown-menu > li > a:hover, +.navbar-inverse .dropdown-menu > .active > a, +.navbar-inverse .dropdown-menu > .active > a:hover { + background-color: #006687; +} +.btn { + padding: 8px 12px; +} +.btn-lg { + padding: 16px 20px; +} +.btn-sm { + padding: 8px 12px; +} +.btn-xs { + padding: 4px 6px; +} +.btn-group .btn ~ .dropdown-toggle { + padding-left: 16px; + padding-right: 16px; +} +.btn-group .dropdown-menu { + border-top-width: 0; +} +.btn-group.dropup .dropdown-menu { + border-top-width: 1px; + border-bottom-width: 0; + margin-bottom: 0; +} +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu { + background-color: #e7e7e7; + border-color: #cccccc; +} +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a { + color: #333333; +} +.btn-group .dropdown-toggle.btn-default ~ .dropdown-menu > li > a:hover { + background-color: #d3d3d3; +} +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu { + background-color: #008cba; + border-color: #0079a1; +} +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-primary ~ .dropdown-menu > li > a:hover { + background-color: #006d91; +} +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu { + background-color: #43ac6a; + border-color: #3c9a5f; +} +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-success ~ .dropdown-menu > li > a:hover { + background-color: #388f58; +} +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-info ~ .dropdown-menu > li > a:hover { + background-color: #39b3d7; +} +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu { + background-color: #e99002; + border-color: #d08002; +} +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-warning ~ .dropdown-menu > li > a:hover { + background-color: #c17702; +} +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu { + background-color: #f04124; + border-color: #ea2f10; +} +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a { + color: #ffffff; +} +.btn-group .dropdown-toggle.btn-danger ~ .dropdown-menu > li > a:hover { + background-color: #dc2c0f; +} +.lead { + color: #6f6f6f; +} +cite { + font-style: italic; +} +blockquote { + border-left-width: 1px; + color: #6f6f6f; +} +blockquote.pull-right { + border-right-width: 1px; +} +blockquote small { + font-size: 12px; + font-weight: 300; +} +table { + font-size: 12px; +} +label, +.control-label, +.help-block, +.checkbox, +.radio { + font-size: 12px; + font-weight: normal; +} +input[type="radio"], +input[type="checkbox"] { + margin-top: 1px; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + border-color: transparent; +} +.nav-tabs > li > a { + background-color: #e7e7e7; + color: #222222; +} +.nav-tabs .caret { + border-top-color: #222222; + border-bottom-color: #222222; +} +.nav-pills { + font-weight: 300; +} +.breadcrumb { + border: 1px solid #dddddd; + border-radius: 3px; + font-size: 10px; + font-weight: 300; + text-transform: uppercase; +} +.pagination { + font-size: 12px; + font-weight: 300; + color: #999999; +} +.pagination > li > a, +.pagination > li > span { + margin-left: 4px; + color: #999999; +} +.pagination > .active > a, +.pagination > .active > span { + color: #fff; +} +.pagination > li > a, +.pagination > li:first-child > a, +.pagination > li:last-child > a, +.pagination > li > span, +.pagination > li:first-child > span, +.pagination > li:last-child > span { + border-radius: 3px; +} +.pagination-lg > li > a { + padding-left: 22px; + padding-right: 22px; +} +.pagination-sm > li > a { + padding: 0 5px; +} +.pager { + font-size: 12px; + font-weight: 300; + color: #999999; +} +.list-group { + font-size: 12px; + font-weight: 300; +} +.close { + opacity: 0.4; + text-decoration: none; + text-shadow: none; +} +.close:hover, +.close:focus { + opacity: 1; +} +.alert { + font-size: 12px; + font-weight: 300; +} +.alert .alert-link { + font-weight: normal; + color: #fff; + text-decoration: underline; +} +.label { + padding-left: 1em; + padding-right: 1em; + border-radius: 0; + font-weight: 300; +} +.label-default { + background-color: #e7e7e7; + color: #333333; +} +.badge { + font-weight: 300; +} +.progress { + height: 22px; + padding: 2px; + background-color: #f6f6f6; + border: 1px solid #ccc; + -webkit-box-shadow: none; + box-shadow: none; +} +.dropdown-menu { + padding: 0; + margin-top: 0; + font-size: 12px; +} +.dropdown-menu > li > a { + padding: 12px 15px; +} +.dropdown-header { + padding-left: 15px; + padding-right: 15px; + font-size: 9px; + text-transform: uppercase; +} +.popover { + color: #fff; + font-size: 12px; + font-weight: 300; +} +.panel-heading, +.panel-footer { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.panel-default .close { + color: #222222; +} +.modal .close { + color: #222222; +} diff --git a/td/public/content/themes/yeti/bootstrap-theme.min.css b/td/public/content/themes/yeti/bootstrap-theme.min.css new file mode 100644 index 000000000..573c5fe62 --- /dev/null +++ b/td/public/content/themes/yeti/bootstrap-theme.min.css @@ -0,0 +1,7 @@ +@import url("//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700");/*! + * bootswatch v3.3.4+1 + * Homepage: http://bootswatch.com + * Copyright 2012-2015 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#222222;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#008cba;text-decoration:none}a:hover,a:focus{color:#00526e;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.4;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #dddddd}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:80%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#008cba}a.text-primary:hover{color:#006687}.text-success{color:#43ac6a}a.text-success:hover{color:#358753}.text-info{color:#5bc0de}a.text-info:hover{color:#31b0d5}.text-warning{color:#e99002}a.text-warning:hover{color:#b67102}.text-danger{color:#f04124}a.text-danger:hover{color:#d32a0e}.bg-primary{color:#fff;background-color:#008cba}a.bg-primary:hover{background-color:#006687}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #dddddd}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.4}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #dddddd}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.4;color:#6f6f6f}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #dddddd;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.4}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.4;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.4;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.4;color:#6f6f6f}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:15px;line-height:1.4;color:#6f6f6f;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:36px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:60px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:36px;line-height:36px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.form-group-sm .form-control{height:36px;line-height:36px}textarea.form-group-sm .form-control,select[multiple].form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;min-height:33px}.input-lg{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:60px;line-height:60px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.form-group-lg .form-control{height:60px;line-height:60px}textarea.form-group-lg .form-control,select[multiple].form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;min-height:40px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:60px;height:60px;line-height:60px}.input-sm+.form-control-feedback{width:36px;height:36px;line-height:36px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#43ac6a}.has-success .form-control{border-color:#43ac6a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#358753;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1}.has-success .input-group-addon{color:#43ac6a;border-color:#43ac6a;background-color:#dff0d8}.has-success .form-control-feedback{color:#43ac6a}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#e99002}.has-warning .form-control{border-color:#e99002;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#b67102;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53}.has-warning .input-group-addon{color:#e99002;border-color:#e99002;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#e99002}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#f04124}.has-error .form-control{border-color:#f04124;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#d32a0e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483}.has-error .input-group-addon{color:#f04124;border-color:#f04124;background-color:#f2dede}.has-error .form-control-feedback{color:#f04124}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#626262}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:22.3333328px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:9px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:15px;line-height:1.4;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333333;background-color:#e7e7e7;border-color:#cccccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333333;background-color:#cecece;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e7e7e7;border-color:#cccccc}.btn-default .badge{color:#e7e7e7;background-color:#333333}.btn-primary{color:#ffffff;background-color:#008cba;border-color:#0079a1}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#006687;border-color:#004b63}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#008cba;border-color:#0079a1}.btn-primary .badge{color:#008cba;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#43ac6a;border-color:#3c9a5f}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#358753;border-color:#2b6e44}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#43ac6a;border-color:#3c9a5f}.btn-success .badge{color:#43ac6a;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#e99002;border-color:#d08002}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#b67102;border-color:#935b01}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#e99002;border-color:#d08002}.btn-warning .badge{color:#e99002;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#f04124;border-color:#ea2f10}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d32a0e;border-color:#b1240c}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#f04124;border-color:#ea2f10}.btn-danger .badge{color:#f04124;background-color:#ffffff}.btn-link{color:#008cba;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#00526e;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:4px 6px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:rgba(0,0,0,0.2)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.4;color:#555555;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#008cba}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.4;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-right-radius:0;border-top-left-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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:60px;line-height:60px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:36px;line-height:36px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:15px;font-weight:normal;line-height:1;color:#6f6f6f;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:0}.input-group-addon.input-sm{padding:8px 12px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:16px 20px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#008cba}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.4;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#6f6f6f;background-color:#ffffff;border:1px solid #dddddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#008cba}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:45px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:12px 15px;font-size:19px;line-height:21px;height:45px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:5.5px;margin-bottom:5.5px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:6px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:12px;padding-bottom:12px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:3px;margin-bottom:3px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:3px;margin-bottom:3px}.navbar-btn.btn-sm{margin-top:4.5px;margin-bottom:4.5px}.navbar-btn.btn-xs{margin-top:11.5px;margin-bottom:11.5px}.navbar-text{margin-top:12px;margin-bottom:12px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#333333;border-color:#222222}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#222222}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#272727;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#008cba;border-color:#006687}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#007196}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#006687;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#999999}.breadcrumb>.active{color:#333333}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.4;text-decoration:none;color:#008cba;background-color:transparent;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#00526e;background-color:#eeeeee;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#008cba;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999999;background-color:#ffffff;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:16px 20px;font-size:19px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:8px 12px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:transparent;border:1px solid transparent;border-radius:3px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:transparent;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#008cba}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#006687}.label-success{background-color:#43ac6a}.label-success[href]:hover,.label-success[href]:focus{background-color:#358753}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#e99002}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b67102}.label-danger{background-color:#f04124}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d32a0e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#008cba;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#008cba;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#fafafa}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#e1e1e1}.container .jumbotron,.container-fluid .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:67.5px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.4;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#008cba}.thumbnail .caption{padding:9px;color:#222222}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#43ac6a;border-color:#3c9a5f;color:#ffffff}.alert-success hr{border-top-color:#358753}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#5bc0de;border-color:#3db5d8;color:#ffffff}.alert-info hr{border-top-color:#2aabd2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#e99002;border-color:#d08002;color:#ffffff}.alert-warning hr{border-top-color:#b67102}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#f04124;border-color:#ea2f10;color:#ffffff}.alert-danger hr{border-top-color:#d32a0e}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#f5f5f5;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:21px;color:#ffffff;text-align:center;background-color:#008cba;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#43ac6a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#e99002}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#f04124}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item{color:#555555}a.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#008cba;border-color:#008cba}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#87e1ff}.list-group-item-success{color:#43ac6a;background-color:#dff0d8}a.list-group-item-success{color:#43ac6a}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#43ac6a;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.list-group-item-info{color:#5bc0de;background-color:#d9edf7}a.list-group-item-info{color:#5bc0de}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#5bc0de;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.list-group-item-warning{color:#e99002;background-color:#fcf8e3}a.list-group-item-warning{color:#e99002}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#e99002;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#e99002;border-color:#e99002}.list-group-item-danger{color:#f04124;background-color:#f2dede}a.list-group-item-danger{color:#f04124}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#f04124;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#f04124;border-color:#f04124}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#008cba}.panel-primary>.panel-heading{color:#ffffff;background-color:#008cba;border-color:#008cba}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#008cba}.panel-primary>.panel-heading .badge{color:#008cba;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#008cba}.panel-success{border-color:#3c9a5f}.panel-success>.panel-heading{color:#ffffff;background-color:#43ac6a;border-color:#3c9a5f}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3c9a5f}.panel-success>.panel-heading .badge{color:#43ac6a;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3c9a5f}.panel-info{border-color:#3db5d8}.panel-info>.panel-heading{color:#ffffff;background-color:#5bc0de;border-color:#3db5d8}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3db5d8}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3db5d8}.panel-warning{border-color:#d08002}.panel-warning>.panel-heading{color:#ffffff;background-color:#e99002;border-color:#d08002}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d08002}.panel-warning>.panel-heading .badge{color:#e99002;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d08002}.panel-danger{border-color:#ea2f10}.panel-danger>.panel-heading{color:#ffffff;background-color:#f04124;border-color:#ea2f10}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ea2f10}.panel-danger>.panel-heading .badge{color:#f04124;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ea2f10}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #e8e8e8;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.4px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.4}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#333333;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;font-weight:normal;line-height:1.4;text-align:left;background-color:#333333;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #333333;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#333333;border-bottom:1px solid #262626;border-radius:-1 -1 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#000000;border-top-color:rgba(0,0,0,0.05);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#333333}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#000000;border-right-color:rgba(0,0,0,0.05)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#333333}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#000000;border-bottom-color:rgba(0,0,0,0.05);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#333333}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#000000;border-left-color:rgba(0,0,0,0.05)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#333333;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;font-size:13px;font-weight:300}.navbar .navbar-toggle:hover .icon-bar{background-color:#b3b3b3}.navbar-collapse{border-top-color:rgba(0,0,0,0.2);-webkit-box-shadow:none;box-shadow:none}.navbar .btn{padding-top:6px;padding-bottom:6px}.navbar-form{margin-top:7px;margin-bottom:5px}.navbar-form .form-control{height:auto;padding:4px 6px}.navbar .dropdown-menu{border:none}.navbar .dropdown-menu>li>a,.navbar .dropdown-menu>li>a:focus{background-color:transparent;font-size:13px;font-weight:300}.navbar .dropdown-header{color:rgba(255,255,255,0.5)}.navbar-default .dropdown-menu{background-color:#333333}.navbar-default .dropdown-menu>li>a,.navbar-default .dropdown-menu>li>a:focus{color:#ffffff}.navbar-default .dropdown-menu>li>a:hover,.navbar-default .dropdown-menu>.active>a,.navbar-default .dropdown-menu>.active>a:hover{background-color:#272727}.navbar-inverse .dropdown-menu{background-color:#008cba}.navbar-inverse .dropdown-menu>li>a,.navbar-inverse .dropdown-menu>li>a:focus{color:#ffffff}.navbar-inverse .dropdown-menu>li>a:hover,.navbar-inverse .dropdown-menu>.active>a,.navbar-inverse .dropdown-menu>.active>a:hover{background-color:#006687}.btn{padding:8px 12px}.btn-lg{padding:16px 20px}.btn-sm{padding:8px 12px}.btn-xs{padding:4px 6px}.btn-group .btn~.dropdown-toggle{padding-left:16px;padding-right:16px}.btn-group .dropdown-menu{border-top-width:0}.btn-group.dropup .dropdown-menu{border-top-width:1px;border-bottom-width:0;margin-bottom:0}.btn-group .dropdown-toggle.btn-default~.dropdown-menu{background-color:#e7e7e7;border-color:#cccccc}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a{color:#333333}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a:hover{background-color:#d3d3d3}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu{background-color:#008cba;border-color:#0079a1}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a:hover{background-color:#006d91}.btn-group .dropdown-toggle.btn-success~.dropdown-menu{background-color:#43ac6a;border-color:#3c9a5f}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a:hover{background-color:#388f58}.btn-group .dropdown-toggle.btn-info~.dropdown-menu{background-color:#5bc0de;border-color:#46b8da}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a:hover{background-color:#39b3d7}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu{background-color:#e99002;border-color:#d08002}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a:hover{background-color:#c17702}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu{background-color:#f04124;border-color:#ea2f10}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a:hover{background-color:#dc2c0f}.lead{color:#6f6f6f}cite{font-style:italic}blockquote{border-left-width:1px;color:#6f6f6f}blockquote.pull-right{border-right-width:1px}blockquote small{font-size:12px;font-weight:300}table{font-size:12px}label,.control-label,.help-block,.checkbox,.radio{font-size:12px;font-weight:normal}input[type="radio"],input[type="checkbox"]{margin-top:1px}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{background-color:#e7e7e7;color:#222222}.nav-tabs .caret{border-top-color:#222222;border-bottom-color:#222222}.nav-pills{font-weight:300}.breadcrumb{border:1px solid #dddddd;border-radius:3px;font-size:10px;font-weight:300;text-transform:uppercase}.pagination{font-size:12px;font-weight:300;color:#999999}.pagination>li>a,.pagination>li>span{margin-left:4px;color:#999999}.pagination>.active>a,.pagination>.active>span{color:#fff}.pagination>li>a,.pagination>li:first-child>a,.pagination>li:last-child>a,.pagination>li>span,.pagination>li:first-child>span,.pagination>li:last-child>span{border-radius:3px}.pagination-lg>li>a{padding-left:22px;padding-right:22px}.pagination-sm>li>a{padding:0 5px}.pager{font-size:12px;font-weight:300;color:#999999}.list-group{font-size:12px;font-weight:300}.close{opacity:0.4;text-decoration:none;text-shadow:none}.close:hover,.close:focus{opacity:1}.alert{font-size:12px;font-weight:300}.alert .alert-link{font-weight:normal;color:#fff;text-decoration:underline}.label{padding-left:1em;padding-right:1em;border-radius:0;font-weight:300}.label-default{background-color:#e7e7e7;color:#333333}.badge{font-weight:300}.progress{height:22px;padding:2px;background-color:#f6f6f6;border:1px solid #ccc;-webkit-box-shadow:none;box-shadow:none}.dropdown-menu{padding:0;margin-top:0;font-size:12px}.dropdown-menu>li>a{padding:12px 15px}.dropdown-header{padding-left:15px;padding-right:15px;font-size:9px;text-transform:uppercase}.popover{color:#fff;font-size:12px;font-weight:300}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.panel-default .close{color:#222222}.modal .close{color:#222222} \ No newline at end of file diff --git a/td/public/index.html b/td/public/index.html new file mode 100644 index 000000000..108757054 --- /dev/null +++ b/td/public/index.html @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<html data-ng-app="app"> +<head> + <style> + /* This helps the ng-show/ng-hide animations start at the right place. */ + /* Since Angular has this but needs to load, this gives us the class early. */ + .ng-hide { + display: none !important; + } + </style> + <title data-ng-bind="title">Threat Modeling Tool + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/td/public/libs/angular-mocks/angular-mocks.js b/td/public/libs/angular-mocks/angular-mocks.js new file mode 100644 index 000000000..9482b702b --- /dev/null +++ b/td/public/libs/angular-mocks/angular-mocks.js @@ -0,0 +1,2436 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) { + +'use strict'; + +/** + * @ngdoc object + * @name angular.mock + * @description + * + * Namespace from 'angular-mocks.js' which contains testing related code. + */ +angular.mock = {}; + +/** + * ! This is a private undocumented service ! + * + * @name $browser + * + * @description + * This service is a mock implementation of {@link ng.$browser}. It provides fake + * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr, + * cookies, etc... + * + * The api of this service is the same as that of the real {@link ng.$browser $browser}, except + * that there are several helper methods available which can be used in tests. + */ +angular.mock.$BrowserProvider = function() { + this.$get = function() { + return new angular.mock.$Browser(); + }; +}; + +angular.mock.$Browser = function() { + var self = this; + + this.isMock = true; + self.$$url = "http://server/"; + self.$$lastUrl = self.$$url; // used by url polling fn + self.pollFns = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = angular.noop; + self.$$incOutstandingRequestCount = angular.noop; + + + // register url polling fn + + self.onUrlChange = function(listener) { + self.pollFns.push( + function() { + if (self.$$lastUrl !== self.$$url || self.$$state !== self.$$lastState) { + self.$$lastUrl = self.$$url; + self.$$lastState = self.$$state; + listener(self.$$url, self.$$state); + } + } + ); + + return listener; + }; + + self.$$applicationDestroyed = angular.noop; + self.$$checkUrlChange = angular.noop; + + self.deferredFns = []; + self.deferredNextId = 0; + + self.defer = function(fn, delay) { + delay = delay || 0; + self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId}); + self.deferredFns.sort(function(a, b) { return a.time - b.time;}); + return self.deferredNextId++; + }; + + + /** + * @name $browser#defer.now + * + * @description + * Current milliseconds mock time. + */ + self.defer.now = 0; + + + self.defer.cancel = function(deferId) { + var fnIndex; + + angular.forEach(self.deferredFns, function(fn, index) { + if (fn.id === deferId) fnIndex = index; + }); + + if (fnIndex !== undefined) { + self.deferredFns.splice(fnIndex, 1); + return true; + } + + return false; + }; + + + /** + * @name $browser#defer.flush + * + * @description + * Flushes all pending requests and executes the defer callbacks. + * + * @param {number=} number of milliseconds to flush. See {@link #defer.now} + */ + self.defer.flush = function(delay) { + if (angular.isDefined(delay)) { + self.defer.now += delay; + } else { + if (self.deferredFns.length) { + self.defer.now = self.deferredFns[self.deferredFns.length - 1].time; + } else { + throw new Error('No deferred tasks to be flushed'); + } + } + + while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) { + self.deferredFns.shift().fn(); + } + }; + + self.$$baseHref = '/'; + self.baseHref = function() { + return this.$$baseHref; + }; +}; +angular.mock.$Browser.prototype = { + +/** + * @name $browser#poll + * + * @description + * run all fns in pollFns + */ + poll: function poll() { + angular.forEach(this.pollFns, function(pollFn) { + pollFn(); + }); + }, + + url: function(url, replace, state) { + if (angular.isUndefined(state)) { + state = null; + } + if (url) { + this.$$url = url; + // Native pushState serializes & copies the object; simulate it. + this.$$state = angular.copy(state); + return this; + } + + return this.$$url; + }, + + state: function() { + return this.$$state; + }, + + notifyWhenNoOutstandingRequests: function(fn) { + fn(); + } +}; + + +/** + * @ngdoc provider + * @name $exceptionHandlerProvider + * + * @description + * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors + * passed to the `$exceptionHandler`. + */ + +/** + * @ngdoc service + * @name $exceptionHandler + * + * @description + * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed + * to it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration + * information. + * + * + * ```js + * describe('$exceptionHandlerProvider', function() { + * + * it('should capture log messages and exceptions', function() { + * + * module(function($exceptionHandlerProvider) { + * $exceptionHandlerProvider.mode('log'); + * }); + * + * inject(function($log, $exceptionHandler, $timeout) { + * $timeout(function() { $log.log(1); }); + * $timeout(function() { $log.log(2); throw 'banana peel'; }); + * $timeout(function() { $log.log(3); }); + * expect($exceptionHandler.errors).toEqual([]); + * expect($log.assertEmpty()); + * $timeout.flush(); + * expect($exceptionHandler.errors).toEqual(['banana peel']); + * expect($log.log.logs).toEqual([[1], [2], [3]]); + * }); + * }); + * }); + * ``` + */ + +angular.mock.$ExceptionHandlerProvider = function() { + var handler; + + /** + * @ngdoc method + * @name $exceptionHandlerProvider#mode + * + * @description + * Sets the logging mode. + * + * @param {string} mode Mode of operation, defaults to `rethrow`. + * + * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` + * mode stores an array of errors in `$exceptionHandler.errors`, to allow later + * assertion of them. See {@link ngMock.$log#assertEmpty assertEmpty()} and + * {@link ngMock.$log#reset reset()} + * - `rethrow`: If any errors are passed to the handler in tests, it typically means that there + * is a bug in the application or test, so this mock will make these tests fail. + * For any implementations that expect exceptions to be thrown, the `rethrow` mode + * will also maintain a log of thrown errors. + */ + this.mode = function(mode) { + + switch (mode) { + case 'log': + case 'rethrow': + var errors = []; + handler = function(e) { + if (arguments.length == 1) { + errors.push(e); + } else { + errors.push([].slice.call(arguments, 0)); + } + if (mode === "rethrow") { + throw e; + } + }; + handler.errors = errors; + break; + default: + throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!"); + } + }; + + this.$get = function() { + return handler; + }; + + this.mode('rethrow'); +}; + + +/** + * @ngdoc service + * @name $log + * + * @description + * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays + * (one array per logging level). These arrays are exposed as `logs` property of each of the + * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`. + * + */ +angular.mock.$LogProvider = function() { + var debug = true; + + function concat(array1, array2, index) { + return array1.concat(Array.prototype.slice.call(array2, index)); + } + + this.debugEnabled = function(flag) { + if (angular.isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = function() { + var $log = { + log: function() { $log.log.logs.push(concat([], arguments, 0)); }, + warn: function() { $log.warn.logs.push(concat([], arguments, 0)); }, + info: function() { $log.info.logs.push(concat([], arguments, 0)); }, + error: function() { $log.error.logs.push(concat([], arguments, 0)); }, + debug: function() { + if (debug) { + $log.debug.logs.push(concat([], arguments, 0)); + } + } + }; + + /** + * @ngdoc method + * @name $log#reset + * + * @description + * Reset all of the logging arrays to empty. + */ + $log.reset = function() { + /** + * @ngdoc property + * @name $log#log.logs + * + * @description + * Array of messages logged using {@link ng.$log#log `log()`}. + * + * @example + * ```js + * $log.log('Some Log'); + * var first = $log.log.logs.unshift(); + * ``` + */ + $log.log.logs = []; + /** + * @ngdoc property + * @name $log#info.logs + * + * @description + * Array of messages logged using {@link ng.$log#info `info()`}. + * + * @example + * ```js + * $log.info('Some Info'); + * var first = $log.info.logs.unshift(); + * ``` + */ + $log.info.logs = []; + /** + * @ngdoc property + * @name $log#warn.logs + * + * @description + * Array of messages logged using {@link ng.$log#warn `warn()`}. + * + * @example + * ```js + * $log.warn('Some Warning'); + * var first = $log.warn.logs.unshift(); + * ``` + */ + $log.warn.logs = []; + /** + * @ngdoc property + * @name $log#error.logs + * + * @description + * Array of messages logged using {@link ng.$log#error `error()`}. + * + * @example + * ```js + * $log.error('Some Error'); + * var first = $log.error.logs.unshift(); + * ``` + */ + $log.error.logs = []; + /** + * @ngdoc property + * @name $log#debug.logs + * + * @description + * Array of messages logged using {@link ng.$log#debug `debug()`}. + * + * @example + * ```js + * $log.debug('Some Error'); + * var first = $log.debug.logs.unshift(); + * ``` + */ + $log.debug.logs = []; + }; + + /** + * @ngdoc method + * @name $log#assertEmpty + * + * @description + * Assert that all of the logging methods have no logged messages. If any messages are present, + * an exception is thrown. + */ + $log.assertEmpty = function() { + var errors = []; + angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) { + angular.forEach($log[logLevel].logs, function(log) { + angular.forEach(log, function(logItem) { + errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + + (logItem.stack || '')); + }); + }); + }); + if (errors.length) { + errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " + + "an expected log message was not checked and removed:"); + errors.push(''); + throw new Error(errors.join('\n---------\n')); + } + }; + + $log.reset(); + return $log; + }; +}; + + +/** + * @ngdoc service + * @name $interval + * + * @description + * Mock implementation of the $interval service. + * + * Use {@link ngMock.$interval#flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {promise} A promise which will be notified on each iteration. + */ +angular.mock.$IntervalProvider = function() { + this.$get = ['$browser', '$rootScope', '$q', '$$q', + function($browser, $rootScope, $q, $$q) { + var repeatFns = [], + nextRepeatId = 0, + now = 0; + + var $interval = function(fn, delay, count, invokeApply) { + var hasParams = arguments.length > 4, + args = hasParams ? Array.prototype.slice.call(arguments, 4) : [], + iteration = 0, + skipApply = (angular.isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise; + + count = (angular.isDefined(count)) ? count : 0; + promise.then(null, null, (!hasParams) ? fn : function() { + fn.apply(null, args); + }); + + promise.$$intervalId = nextRepeatId; + + function tick() { + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + var fnIndex; + deferred.resolve(iteration); + + angular.forEach(repeatFns, function(fn, index) { + if (fn.id === promise.$$intervalId) fnIndex = index; + }); + + if (fnIndex !== undefined) { + repeatFns.splice(fnIndex, 1); + } + } + + if (skipApply) { + $browser.defer.flush(); + } else { + $rootScope.$apply(); + } + } + + repeatFns.push({ + nextTime:(now + delay), + delay: delay, + fn: tick, + id: nextRepeatId, + deferred: deferred + }); + repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;}); + + nextRepeatId++; + return promise; + }; + /** + * @ngdoc method + * @name $interval#cancel + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {promise} promise A promise from calling the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully cancelled. + */ + $interval.cancel = function(promise) { + if (!promise) return false; + var fnIndex; + + angular.forEach(repeatFns, function(fn, index) { + if (fn.id === promise.$$intervalId) fnIndex = index; + }); + + if (fnIndex !== undefined) { + repeatFns[fnIndex].deferred.reject('canceled'); + repeatFns.splice(fnIndex, 1); + return true; + } + + return false; + }; + + /** + * @ngdoc method + * @name $interval#flush + * @description + * + * Runs interval tasks scheduled to be run in the next `millis` milliseconds. + * + * @param {number=} millis maximum timeout amount to flush up until. + * + * @return {number} The amount of time moved forward. + */ + $interval.flush = function(millis) { + now += millis; + while (repeatFns.length && repeatFns[0].nextTime <= now) { + var task = repeatFns[0]; + task.fn(); + task.nextTime += task.delay; + repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;}); + } + return millis; + }; + + return $interval; + }]; +}; + + +/* jshint -W101 */ +/* The R_ISO8061_STR regex is never going to fit into the 100 char limit! + * This directive should go inside the anonymous function but a bug in JSHint means that it would + * not be enacted early enough to prevent the warning. + */ +var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/; + +function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8061_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0; + if (match[9]) { + tzHour = toInt(match[9] + match[10]); + tzMin = toInt(match[9] + match[11]); + } + date.setUTCFullYear(toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); + date.setUTCHours(toInt(match[4] || 0) - tzHour, + toInt(match[5] || 0) - tzMin, + toInt(match[6] || 0), + toInt(match[7] || 0)); + return date; + } + return string; +} + +function toInt(str) { + return parseInt(str, 10); +} + +function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while (num.length < digits) num = '0' + num; + if (trim) { + num = num.substr(num.length - digits); + } + return neg + num; +} + + +/** + * @ngdoc type + * @name angular.mock.TzDate + * @description + * + * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`. + * + * Mock of the Date type which has its timezone specified via constructor arg. + * + * The main purpose is to create Date-like instances with timezone fixed to the specified timezone + * offset, so that we can test code that depends on local timezone settings without dependency on + * the time zone settings of the machine where the code is running. + * + * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored) + * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC* + * + * @example + * !!!! WARNING !!!!! + * This is not a complete Date object so only methods that were implemented can be called safely. + * To make matters worse, TzDate instances inherit stuff from Date via a prototype. + * + * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is + * incomplete we might be missing some non-standard methods. This can result in errors like: + * "Date.prototype.foo called on incompatible Object". + * + * ```js + * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z'); + * newYearInBratislava.getTimezoneOffset() => -60; + * newYearInBratislava.getFullYear() => 2010; + * newYearInBratislava.getMonth() => 0; + * newYearInBratislava.getDate() => 1; + * newYearInBratislava.getHours() => 0; + * newYearInBratislava.getMinutes() => 0; + * newYearInBratislava.getSeconds() => 0; + * ``` + * + */ +angular.mock.TzDate = function(offset, timestamp) { + var self = new Date(0); + if (angular.isString(timestamp)) { + var tsStr = timestamp; + + self.origDate = jsonStringToDate(timestamp); + + timestamp = self.origDate.getTime(); + if (isNaN(timestamp)) { + throw { + name: "Illegal Argument", + message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string" + }; + } + } else { + self.origDate = new Date(timestamp); + } + + var localOffset = new Date(timestamp).getTimezoneOffset(); + self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60; + self.date = new Date(timestamp + self.offsetDiff); + + self.getTime = function() { + return self.date.getTime() - self.offsetDiff; + }; + + self.toLocaleDateString = function() { + return self.date.toLocaleDateString(); + }; + + self.getFullYear = function() { + return self.date.getFullYear(); + }; + + self.getMonth = function() { + return self.date.getMonth(); + }; + + self.getDate = function() { + return self.date.getDate(); + }; + + self.getHours = function() { + return self.date.getHours(); + }; + + self.getMinutes = function() { + return self.date.getMinutes(); + }; + + self.getSeconds = function() { + return self.date.getSeconds(); + }; + + self.getMilliseconds = function() { + return self.date.getMilliseconds(); + }; + + self.getTimezoneOffset = function() { + return offset * 60; + }; + + self.getUTCFullYear = function() { + return self.origDate.getUTCFullYear(); + }; + + self.getUTCMonth = function() { + return self.origDate.getUTCMonth(); + }; + + self.getUTCDate = function() { + return self.origDate.getUTCDate(); + }; + + self.getUTCHours = function() { + return self.origDate.getUTCHours(); + }; + + self.getUTCMinutes = function() { + return self.origDate.getUTCMinutes(); + }; + + self.getUTCSeconds = function() { + return self.origDate.getUTCSeconds(); + }; + + self.getUTCMilliseconds = function() { + return self.origDate.getUTCMilliseconds(); + }; + + self.getDay = function() { + return self.date.getDay(); + }; + + // provide this method only on browsers that already have it + if (self.toISOString) { + self.toISOString = function() { + return padNumber(self.origDate.getUTCFullYear(), 4) + '-' + + padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' + + padNumber(self.origDate.getUTCDate(), 2) + 'T' + + padNumber(self.origDate.getUTCHours(), 2) + ':' + + padNumber(self.origDate.getUTCMinutes(), 2) + ':' + + padNumber(self.origDate.getUTCSeconds(), 2) + '.' + + padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'; + }; + } + + //hide all methods not implemented in this mock that the Date prototype exposes + var unimplementedMethods = ['getUTCDay', + 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', + 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', + 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', + 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString', + 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf']; + + angular.forEach(unimplementedMethods, function(methodName) { + self[methodName] = function() { + throw new Error("Method '" + methodName + "' is not implemented in the TzDate mock"); + }; + }); + + return self; +}; + +//make "tzDateInstance instanceof Date" return true +angular.mock.TzDate.prototype = Date.prototype; +/* jshint +W101 */ + +angular.mock.animate = angular.module('ngAnimateMock', ['ng']) + + .config(['$provide', function($provide) { + + var reflowQueue = []; + $provide.value('$$animateReflow', function(fn) { + var index = reflowQueue.length; + reflowQueue.push(fn); + return function cancel() { + reflowQueue.splice(index, 1); + }; + }); + + $provide.decorator('$animate', ['$delegate', '$timeout', '$browser', '$$rAF', + function($delegate, $timeout, $browser, $$rAF) { + var animate = { + queue: [], + cancel: $delegate.cancel, + enabled: $delegate.enabled, + triggerCallbackEvents: function() { + $$rAF.flush(); + }, + triggerCallbackPromise: function() { + $timeout.flush(0); + }, + triggerCallbacks: function() { + this.triggerCallbackEvents(); + this.triggerCallbackPromise(); + }, + triggerReflow: function() { + angular.forEach(reflowQueue, function(fn) { + fn(); + }); + reflowQueue = []; + } + }; + + angular.forEach( + ['animate','enter','leave','move','addClass','removeClass','setClass'], function(method) { + animate[method] = function() { + animate.queue.push({ + event: method, + element: arguments[0], + options: arguments[arguments.length - 1], + args: arguments + }); + return $delegate[method].apply($delegate, arguments); + }; + }); + + return animate; + }]); + + }]); + + +/** + * @ngdoc function + * @name angular.mock.dump + * @description + * + * *NOTE*: this is not an injectable instance, just a globally available function. + * + * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for + * debugging. + * + * This method is also available on window, where it can be used to display objects on debug + * console. + * + * @param {*} object - any object to turn into string. + * @return {string} a serialized string of the argument + */ +angular.mock.dump = function(object) { + return serialize(object); + + function serialize(object) { + var out; + + if (angular.isElement(object)) { + object = angular.element(object); + out = angular.element('
'); + angular.forEach(object, function(element) { + out.append(angular.element(element).clone()); + }); + out = out.html(); + } else if (angular.isArray(object)) { + out = []; + angular.forEach(object, function(o) { + out.push(serialize(o)); + }); + out = '[ ' + out.join(', ') + ' ]'; + } else if (angular.isObject(object)) { + if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) { + out = serializeScope(object); + } else if (object instanceof Error) { + out = object.stack || ('' + object.name + ': ' + object.message); + } else { + // TODO(i): this prevents methods being logged, + // we should have a better way to serialize objects + out = angular.toJson(object, true); + } + } else { + out = String(object); + } + + return out; + } + + function serializeScope(scope, offset) { + offset = offset || ' '; + var log = [offset + 'Scope(' + scope.$id + '): {']; + for (var key in scope) { + if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\$|this)/)) { + log.push(' ' + key + ': ' + angular.toJson(scope[key])); + } + } + var child = scope.$$childHead; + while (child) { + log.push(serializeScope(child, offset + ' ')); + child = child.$$nextSibling; + } + log.push('}'); + return log.join('\n' + offset); + } +}; + +/** + * @ngdoc service + * @name $httpBackend + * @description + * Fake HTTP backend implementation suitable for unit testing applications that use the + * {@link ng.$http $http service}. + * + * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less + * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}. + * + * During unit testing, we want our unit tests to run quickly and have no external dependencies so + * we don’t want to send [XHR](https://developer.mozilla.org/en/xmlhttprequest) or + * [JSONP](http://en.wikipedia.org/wiki/JSONP) requests to a real server. All we really need is + * to verify whether a certain request has been sent or not, or alternatively just let the + * application make requests, respond with pre-trained responses and assert that the end result is + * what we expect it to be. + * + * This mock implementation can be used to respond with static or dynamic responses via the + * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc). + * + * When an Angular application needs some data from a server, it calls the $http service, which + * sends the request to a real server using $httpBackend service. With dependency injection, it is + * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify + * the requests and respond with some testing data without sending a request to a real server. + * + * There are two ways to specify what test data should be returned as http responses by the mock + * backend when the code under test makes http requests: + * + * - `$httpBackend.expect` - specifies a request expectation + * - `$httpBackend.when` - specifies a backend definition + * + * + * # Request Expectations vs Backend Definitions + * + * Request expectations provide a way to make assertions about requests made by the application and + * to define responses for those requests. The test will fail if the expected requests are not made + * or they are made in the wrong order. + * + * Backend definitions allow you to define a fake backend for your application which doesn't assert + * if a particular request was made or not, it just returns a trained response if a request is made. + * The test will pass whether or not the request gets made during testing. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Request expectationsBackend definitions
Syntax.expect(...).respond(...).when(...).respond(...)
Typical usagestrict unit testsloose (black-box) unit testing
Fulfills multiple requestsNOYES
Order of requests mattersYESNO
Request requiredYESNO
Response requiredoptional (see below)YES
+ * + * In cases where both backend definitions and request expectations are specified during unit + * testing, the request expectations are evaluated first. + * + * If a request expectation has no response specified, the algorithm will search your backend + * definitions for an appropriate response. + * + * If a request didn't match any expectation or if the expectation doesn't have the response + * defined, the backend definitions are evaluated in sequential order to see if any of them match + * the request. The response from the first matched definition is returned. + * + * + * # Flushing HTTP requests + * + * The $httpBackend used in production always responds to requests asynchronously. If we preserved + * this behavior in unit testing, we'd have to create async unit tests, which are hard to write, + * to follow and to maintain. But neither can the testing mock respond synchronously; that would + * change the execution of the code under test. For this reason, the mock $httpBackend has a + * `flush()` method, which allows the test to explicitly flush pending requests. This preserves + * the async api of the backend, while allowing the test to execute synchronously. + * + * + * # Unit testing with mock $httpBackend + * The following code shows how to setup and use the mock backend when unit testing a controller. + * First we create the controller under test: + * + ```js + // The module code + angular + .module('MyApp', []) + .controller('MyController', MyController); + + // The controller code + function MyController($scope, $http) { + var authToken; + + $http.get('/auth.py').success(function(data, status, headers) { + authToken = headers('A-Token'); + $scope.user = data; + }); + + $scope.saveMessage = function(message) { + var headers = { 'Authorization': authToken }; + $scope.status = 'Saving...'; + + $http.post('/add-msg.py', message, { headers: headers } ).success(function(response) { + $scope.status = ''; + }).error(function() { + $scope.status = 'ERROR!'; + }); + }; + } + ``` + * + * Now we setup the mock backend and create the test specs: + * + ```js + // testing controller + describe('MyController', function() { + var $httpBackend, $rootScope, createController, authRequestHandler; + + // Set up the module + beforeEach(module('MyApp')); + + beforeEach(inject(function($injector) { + // Set up the mock http service responses + $httpBackend = $injector.get('$httpBackend'); + // backend definition common for all tests + authRequestHandler = $httpBackend.when('GET', '/auth.py') + .respond({userId: 'userX'}, {'A-Token': 'xxx'}); + + // Get hold of a scope (i.e. the root scope) + $rootScope = $injector.get('$rootScope'); + // The $controller service is used to create instances of controllers + var $controller = $injector.get('$controller'); + + createController = function() { + return $controller('MyController', {'$scope' : $rootScope }); + }; + })); + + + afterEach(function() { + $httpBackend.verifyNoOutstandingExpectation(); + $httpBackend.verifyNoOutstandingRequest(); + }); + + + it('should fetch authentication token', function() { + $httpBackend.expectGET('/auth.py'); + var controller = createController(); + $httpBackend.flush(); + }); + + + it('should fail authentication', function() { + + // Notice how you can change the response even after it was set + authRequestHandler.respond(401, ''); + + $httpBackend.expectGET('/auth.py'); + var controller = createController(); + $httpBackend.flush(); + expect($rootScope.status).toBe('Failed...'); + }); + + + it('should send msg to server', function() { + var controller = createController(); + $httpBackend.flush(); + + // now you don’t care about the authentication, but + // the controller will still send the request and + // $httpBackend will respond without you having to + // specify the expectation and response for this request + + $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, ''); + $rootScope.saveMessage('message content'); + expect($rootScope.status).toBe('Saving...'); + $httpBackend.flush(); + expect($rootScope.status).toBe(''); + }); + + + it('should send auth header', function() { + var controller = createController(); + $httpBackend.flush(); + + $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) { + // check if the header was sent, if it wasn't the expectation won't + // match the request and the test will fail + return headers['Authorization'] == 'xxx'; + }).respond(201, ''); + + $rootScope.saveMessage('whatever'); + $httpBackend.flush(); + }); + }); + ``` + */ +angular.mock.$HttpBackendProvider = function() { + this.$get = ['$rootScope', '$timeout', createHttpBackendMock]; +}; + +/** + * General factory function for $httpBackend mock. + * Returns instance for unit testing (when no arguments specified): + * - passing through is disabled + * - auto flushing is disabled + * + * Returns instance for e2e testing (when `$delegate` and `$browser` specified): + * - passing through (delegating request to real backend) is enabled + * - auto flushing is enabled + * + * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified) + * @param {Object=} $browser Auto-flushing enabled if specified + * @return {Object} Instance of $httpBackend mock + */ +function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { + var definitions = [], + expectations = [], + responses = [], + responsesPush = angular.bind(responses, responses.push), + copy = angular.copy; + + function createResponse(status, data, headers, statusText) { + if (angular.isFunction(status)) return status; + + return function() { + return angular.isNumber(status) + ? [status, data, headers, statusText] + : [200, status, data, headers]; + }; + } + + // TODO(vojta): change params to: method, url, data, headers, callback + function $httpBackend(method, url, data, callback, headers, timeout, withCredentials) { + var xhr = new MockXhr(), + expectation = expectations[0], + wasExpected = false; + + function prettyPrint(data) { + return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp) + ? data + : angular.toJson(data); + } + + function wrapResponse(wrapped) { + if (!$browser && timeout) { + timeout.then ? timeout.then(handleTimeout) : $timeout(handleTimeout, timeout); + } + + return handleResponse; + + function handleResponse() { + var response = wrapped.response(method, url, data, headers); + xhr.$$respHeaders = response[2]; + callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(), + copy(response[3] || '')); + } + + function handleTimeout() { + for (var i = 0, ii = responses.length; i < ii; i++) { + if (responses[i] === handleResponse) { + responses.splice(i, 1); + callback(-1, undefined, ''); + break; + } + } + } + } + + if (expectation && expectation.match(method, url)) { + if (!expectation.matchData(data)) { + throw new Error('Expected ' + expectation + ' with different data\n' + + 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data); + } + + if (!expectation.matchHeaders(headers)) { + throw new Error('Expected ' + expectation + ' with different headers\n' + + 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' + + prettyPrint(headers)); + } + + expectations.shift(); + + if (expectation.response) { + responses.push(wrapResponse(expectation)); + return; + } + wasExpected = true; + } + + var i = -1, definition; + while ((definition = definitions[++i])) { + if (definition.match(method, url, data, headers || {})) { + if (definition.response) { + // if $browser specified, we do auto flush all requests + ($browser ? $browser.defer : responsesPush)(wrapResponse(definition)); + } else if (definition.passThrough) { + $delegate(method, url, data, callback, headers, timeout, withCredentials); + } else throw new Error('No response defined !'); + return; + } + } + throw wasExpected ? + new Error('No response defined !') : + new Error('Unexpected request: ' + method + ' ' + url + '\n' + + (expectation ? 'Expected ' + expectation : 'No more request expected')); + } + + /** + * @ngdoc method + * @name $httpBackend#when + * @description + * Creates a new backend definition. + * + * @param {string} method HTTP method. + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives + * data string and returns true if the data is as expected. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current definition. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + * + * - respond – + * `{function([status,] data[, headers, statusText]) + * | function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can + * return an array containing response status (number), response data (string), response + * headers (Object), and the text for the status (string). The respond method returns the + * `requestHandler` object for possible overrides. + */ + $httpBackend.when = function(method, url, data, headers) { + var definition = new MockHttpExpectation(method, url, data, headers), + chain = { + respond: function(status, data, headers, statusText) { + definition.passThrough = undefined; + definition.response = createResponse(status, data, headers, statusText); + return chain; + } + }; + + if ($browser) { + chain.passThrough = function() { + definition.response = undefined; + definition.passThrough = true; + return chain; + }; + } + + definitions.push(definition); + return chain; + }; + + /** + * @ngdoc method + * @name $httpBackend#whenGET + * @description + * Creates a new backend definition for GET requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#whenHEAD + * @description + * Creates a new backend definition for HEAD requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#whenDELETE + * @description + * Creates a new backend definition for DELETE requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#whenPOST + * @description + * Creates a new backend definition for POST requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives + * data string and returns true if the data is as expected. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#whenPUT + * @description + * Creates a new backend definition for PUT requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives + * data string and returns true if the data is as expected. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#whenJSONP + * @description + * Creates a new backend definition for JSONP requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + createShortMethods('when'); + + + /** + * @ngdoc method + * @name $httpBackend#expect + * @description + * Creates a new request expectation. + * + * @param {string} method HTTP method. + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current expectation. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + * + * - respond – + * `{function([status,] data[, headers, statusText]) + * | function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can + * return an array containing response status (number), response data (string), response + * headers (Object), and the text for the status (string). The respond method returns the + * `requestHandler` object for possible overrides. + */ + $httpBackend.expect = function(method, url, data, headers) { + var expectation = new MockHttpExpectation(method, url, data, headers), + chain = { + respond: function(status, data, headers, statusText) { + expectation.response = createResponse(status, data, headers, statusText); + return chain; + } + }; + + expectations.push(expectation); + return chain; + }; + + + /** + * @ngdoc method + * @name $httpBackend#expectGET + * @description + * Creates a new request expectation for GET requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. See #expect for more info. + */ + + /** + * @ngdoc method + * @name $httpBackend#expectHEAD + * @description + * Creates a new request expectation for HEAD requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#expectDELETE + * @description + * Creates a new request expectation for DELETE requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#expectPOST + * @description + * Creates a new request expectation for POST requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#expectPUT + * @description + * Creates a new request expectation for PUT requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#expectPATCH + * @description + * Creates a new request expectation for PATCH requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that + * receives data string and returns true if the data is as expected, or Object if request body + * is in JSON format. + * @param {Object=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + + /** + * @ngdoc method + * @name $httpBackend#expectJSONP + * @description + * Creates a new request expectation for JSONP requests. For more info see `expect()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives an url + * and returns true if the url matches the current definition. + * @returns {requestHandler} Returns an object with `respond` method that controls how a matched + * request is handled. You can save this object for later use and invoke `respond` again in + * order to change how a matched request is handled. + */ + createShortMethods('expect'); + + + /** + * @ngdoc method + * @name $httpBackend#flush + * @description + * Flushes all pending requests using the trained responses. + * + * @param {number=} count Number of responses to flush (in the order they arrived). If undefined, + * all pending requests will be flushed. If there are no pending requests when the flush method + * is called an exception is thrown (as this typically a sign of programming error). + */ + $httpBackend.flush = function(count, digest) { + if (digest !== false) $rootScope.$digest(); + if (!responses.length) throw new Error('No pending request to flush !'); + + if (angular.isDefined(count) && count !== null) { + while (count--) { + if (!responses.length) throw new Error('No more pending request to flush !'); + responses.shift()(); + } + } else { + while (responses.length) { + responses.shift()(); + } + } + $httpBackend.verifyNoOutstandingExpectation(digest); + }; + + + /** + * @ngdoc method + * @name $httpBackend#verifyNoOutstandingExpectation + * @description + * Verifies that all of the requests defined via the `expect` api were made. If any of the + * requests were not made, verifyNoOutstandingExpectation throws an exception. + * + * Typically, you would call this method following each test case that asserts requests using an + * "afterEach" clause. + * + * ```js + * afterEach($httpBackend.verifyNoOutstandingExpectation); + * ``` + */ + $httpBackend.verifyNoOutstandingExpectation = function(digest) { + if (digest !== false) $rootScope.$digest(); + if (expectations.length) { + throw new Error('Unsatisfied requests: ' + expectations.join(', ')); + } + }; + + + /** + * @ngdoc method + * @name $httpBackend#verifyNoOutstandingRequest + * @description + * Verifies that there are no outstanding requests that need to be flushed. + * + * Typically, you would call this method following each test case that asserts requests using an + * "afterEach" clause. + * + * ```js + * afterEach($httpBackend.verifyNoOutstandingRequest); + * ``` + */ + $httpBackend.verifyNoOutstandingRequest = function() { + if (responses.length) { + throw new Error('Unflushed requests: ' + responses.length); + } + }; + + + /** + * @ngdoc method + * @name $httpBackend#resetExpectations + * @description + * Resets all request expectations, but preserves all backend definitions. Typically, you would + * call resetExpectations during a multiple-phase test when you want to reuse the same instance of + * $httpBackend mock. + */ + $httpBackend.resetExpectations = function() { + expectations.length = 0; + responses.length = 0; + }; + + return $httpBackend; + + + function createShortMethods(prefix) { + angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) { + $httpBackend[prefix + method] = function(url, headers) { + return $httpBackend[prefix](method, url, undefined, headers); + }; + }); + + angular.forEach(['PUT', 'POST', 'PATCH'], function(method) { + $httpBackend[prefix + method] = function(url, data, headers) { + return $httpBackend[prefix](method, url, data, headers); + }; + }); + } +} + +function MockHttpExpectation(method, url, data, headers) { + + this.data = data; + this.headers = headers; + + this.match = function(m, u, d, h) { + if (method != m) return false; + if (!this.matchUrl(u)) return false; + if (angular.isDefined(d) && !this.matchData(d)) return false; + if (angular.isDefined(h) && !this.matchHeaders(h)) return false; + return true; + }; + + this.matchUrl = function(u) { + if (!url) return true; + if (angular.isFunction(url.test)) return url.test(u); + if (angular.isFunction(url)) return url(u); + return url == u; + }; + + this.matchHeaders = function(h) { + if (angular.isUndefined(headers)) return true; + if (angular.isFunction(headers)) return headers(h); + return angular.equals(headers, h); + }; + + this.matchData = function(d) { + if (angular.isUndefined(data)) return true; + if (data && angular.isFunction(data.test)) return data.test(d); + if (data && angular.isFunction(data)) return data(d); + if (data && !angular.isString(data)) { + return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d)); + } + return data == d; + }; + + this.toString = function() { + return method + ' ' + url; + }; +} + +function createMockXhr() { + return new MockXhr(); +} + +function MockXhr() { + + // hack for testing $http, $httpBackend + MockXhr.$$lastInstance = this; + + this.open = function(method, url, async) { + this.$$method = method; + this.$$url = url; + this.$$async = async; + this.$$reqHeaders = {}; + this.$$respHeaders = {}; + }; + + this.send = function(data) { + this.$$data = data; + }; + + this.setRequestHeader = function(key, value) { + this.$$reqHeaders[key] = value; + }; + + this.getResponseHeader = function(name) { + // the lookup must be case insensitive, + // that's why we try two quick lookups first and full scan last + var header = this.$$respHeaders[name]; + if (header) return header; + + name = angular.lowercase(name); + header = this.$$respHeaders[name]; + if (header) return header; + + header = undefined; + angular.forEach(this.$$respHeaders, function(headerVal, headerName) { + if (!header && angular.lowercase(headerName) == name) header = headerVal; + }); + return header; + }; + + this.getAllResponseHeaders = function() { + var lines = []; + + angular.forEach(this.$$respHeaders, function(value, key) { + lines.push(key + ': ' + value); + }); + return lines.join('\n'); + }; + + this.abort = angular.noop; +} + + +/** + * @ngdoc service + * @name $timeout + * @description + * + * This service is just a simple decorator for {@link ng.$timeout $timeout} service + * that adds a "flush" and "verifyNoPendingTasks" methods. + */ + +angular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $browser) { + + /** + * @ngdoc method + * @name $timeout#flush + * @description + * + * Flushes the queue of pending tasks. + * + * @param {number=} delay maximum timeout amount to flush up until + */ + $delegate.flush = function(delay) { + $browser.defer.flush(delay); + }; + + /** + * @ngdoc method + * @name $timeout#verifyNoPendingTasks + * @description + * + * Verifies that there are no pending tasks that need to be flushed. + */ + $delegate.verifyNoPendingTasks = function() { + if ($browser.deferredFns.length) { + throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + + formatPendingTasksAsString($browser.deferredFns)); + } + }; + + function formatPendingTasksAsString(tasks) { + var result = []; + angular.forEach(tasks, function(task) { + result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); + }); + + return result.join(', '); + } + + return $delegate; +}]; + +angular.mock.$RAFDecorator = ['$delegate', function($delegate) { + var queue = []; + var rafFn = function(fn) { + var index = queue.length; + queue.push(fn); + return function() { + queue.splice(index, 1); + }; + }; + + rafFn.supported = $delegate.supported; + + rafFn.flush = function() { + if (queue.length === 0) { + throw new Error('No rAF callbacks present'); + } + + var length = queue.length; + for (var i = 0; i < length; i++) { + queue[i](); + } + + queue = queue.slice(i); + }; + + return rafFn; +}]; + +/** + * + */ +angular.mock.$RootElementProvider = function() { + this.$get = function() { + return angular.element('
'); + }; +}; + +/** + * @ngdoc service + * @name $controller + * @description + * A decorator for {@link ng.$controller} with additional `bindings` parameter, useful when testing + * controllers of directives that use {@link $compile#-bindtocontroller- `bindToController`}. + * + * + * ## Example + * + * ```js + * + * // Directive definition ... + * + * myMod.directive('myDirective', { + * controller: 'MyDirectiveController', + * bindToController: { + * name: '@' + * } + * }); + * + * + * // Controller definition ... + * + * myMod.controller('MyDirectiveController', ['log', function($log) { + * $log.info(this.name); + * })]; + * + * + * // In a test ... + * + * describe('myDirectiveController', function() { + * it('should write the bound name to the log', inject(function($controller, $log) { + * var ctrl = $controller('MyDirective', { /* no locals */ }, { name: 'Clark Kent' }); + * expect(ctrl.name).toEqual('Clark Kent'); + * expect($log.info.logs).toEqual(['Clark Kent']); + * }); + * }); + * + * ``` + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global + * `window` object (not recommended) + * + * The string can use the `controller as property` syntax, where the controller instance is published + * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this + * to work correctly. + * + * @param {Object} locals Injection locals for Controller. + * @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used + * to simulate the `bindToController` feature and simplify certain kinds of tests. + * @return {Object} Instance of given controller. + */ +angular.mock.$ControllerDecorator = ['$delegate', function($delegate) { + return function(expression, locals, later, ident) { + if (later && typeof later === 'object') { + var create = $delegate(expression, locals, true, ident); + angular.extend(create.instance, later); + return create(); + } + return $delegate(expression, locals, later, ident); + }; +}]; + + +/** + * @ngdoc module + * @name ngMock + * @packageName angular-mocks + * @description + * + * # ngMock + * + * The `ngMock` module provides support to inject and mock Angular services into unit tests. + * In addition, ngMock also extends various core ng services such that they can be + * inspected and controlled in a synchronous manner within test code. + * + * + *
+ * + */ +angular.module('ngMock', ['ng']).provider({ + $browser: angular.mock.$BrowserProvider, + $exceptionHandler: angular.mock.$ExceptionHandlerProvider, + $log: angular.mock.$LogProvider, + $interval: angular.mock.$IntervalProvider, + $httpBackend: angular.mock.$HttpBackendProvider, + $rootElement: angular.mock.$RootElementProvider +}).config(['$provide', function($provide) { + $provide.decorator('$timeout', angular.mock.$TimeoutDecorator); + $provide.decorator('$$rAF', angular.mock.$RAFDecorator); + $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator); + $provide.decorator('$controller', angular.mock.$ControllerDecorator); +}]); + +/** + * @ngdoc module + * @name ngMockE2E + * @module ngMockE2E + * @packageName angular-mocks + * @description + * + * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing. + * Currently there is only one mock present in this module - + * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock. + */ +angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) { + $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator); +}]); + +/** + * @ngdoc service + * @name $httpBackend + * @module ngMockE2E + * @description + * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of + * applications that use the {@link ng.$http $http service}. + * + * *Note*: For fake http backend implementation suitable for unit testing please see + * {@link ngMock.$httpBackend unit-testing $httpBackend mock}. + * + * This implementation can be used to respond with static or dynamic responses via the `when` api + * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the + * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch + * templates from a webserver). + * + * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application + * is being developed with the real backend api replaced with a mock, it is often desirable for + * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch + * templates or static files from the webserver). To configure the backend with this behavior + * use the `passThrough` request handler of `when` instead of `respond`. + * + * Additionally, we don't want to manually have to flush mocked out requests like we do during unit + * testing. For this reason the e2e $httpBackend flushes mocked out requests + * automatically, closely simulating the behavior of the XMLHttpRequest object. + * + * To setup the application to run with this http backend, you have to create a module that depends + * on the `ngMockE2E` and your application modules and defines the fake backend: + * + * ```js + * myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']); + * myAppDev.run(function($httpBackend) { + * phones = [{name: 'phone1'}, {name: 'phone2'}]; + * + * // returns the current list of phones + * $httpBackend.whenGET('/phones').respond(phones); + * + * // adds a new phone to the phones array + * $httpBackend.whenPOST('/phones').respond(function(method, url, data) { + * var phone = angular.fromJson(data); + * phones.push(phone); + * return [200, phone, {}]; + * }); + * $httpBackend.whenGET(/^\/templates\//).passThrough(); + * //... + * }); + * ``` + * + * Afterwards, bootstrap your app with this new module. + */ + +/** + * @ngdoc method + * @name $httpBackend#when + * @module ngMockE2E + * @description + * Creates a new backend definition. + * + * @param {string} method HTTP method. + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header + * object and returns true if the headers match the current definition. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + * + * - respond – + * `{function([status,] data[, headers, statusText]) + * | function(function(method, url, data, headers)}` + * – The respond method takes a set of static data to be returned or a function that can return + * an array containing response status (number), response data (string), response headers + * (Object), and the text for the status (string). + * - passThrough – `{function()}` – Any request matching a backend definition with + * `passThrough` handler will be passed through to the real backend (an XHR request will be made + * to the server.) + * - Both methods return the `requestHandler` object for possible overrides. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenGET + * @module ngMockE2E + * @description + * Creates a new backend definition for GET requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenHEAD + * @module ngMockE2E + * @description + * Creates a new backend definition for HEAD requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenDELETE + * @module ngMockE2E + * @description + * Creates a new backend definition for DELETE requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenPOST + * @module ngMockE2E + * @description + * Creates a new backend definition for POST requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenPUT + * @module ngMockE2E + * @description + * Creates a new backend definition for PUT requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenPATCH + * @module ngMockE2E + * @description + * Creates a new backend definition for PATCH requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @param {(string|RegExp)=} data HTTP request body. + * @param {(Object|function(Object))=} headers HTTP headers. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ + +/** + * @ngdoc method + * @name $httpBackend#whenJSONP + * @module ngMockE2E + * @description + * Creates a new backend definition for JSONP requests. For more info see `when()`. + * + * @param {string|RegExp|function(string)} url HTTP url or function that receives a url + * and returns true if the url matches the current definition. + * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that + * control how a matched request is handled. You can save this object for later use and invoke + * `respond` or `passThrough` again in order to change how a matched request is handled. + */ +angular.mock.e2e = {}; +angular.mock.e2e.$httpBackendDecorator = + ['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock]; + + +/** + * @ngdoc type + * @name $rootScope.Scope + * @module ngMock + * @description + * {@link ng.$rootScope.Scope Scope} type decorated with helper methods useful for testing. These + * methods are automatically available on any {@link ng.$rootScope.Scope Scope} instance when + * `ngMock` module is loaded. + * + * In addition to all the regular `Scope` methods, the following helper methods are available: + */ +angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { + + var $rootScopePrototype = Object.getPrototypeOf($delegate); + + $rootScopePrototype.$countChildScopes = countChildScopes; + $rootScopePrototype.$countWatchers = countWatchers; + + return $delegate; + + // ------------------------------------------------------------------------------------------ // + + /** + * @ngdoc method + * @name $rootScope.Scope#$countChildScopes + * @module ngMock + * @description + * Counts all the direct and indirect child scopes of the current scope. + * + * The current scope is excluded from the count. The count includes all isolate child scopes. + * + * @returns {number} Total number of child scopes. + */ + function countChildScopes() { + // jshint validthis: true + var count = 0; // exclude the current scope + var pendingChildHeads = [this.$$childHead]; + var currentScope; + + while (pendingChildHeads.length) { + currentScope = pendingChildHeads.shift(); + + while (currentScope) { + count += 1; + pendingChildHeads.push(currentScope.$$childHead); + currentScope = currentScope.$$nextSibling; + } + } + + return count; + } + + + /** + * @ngdoc method + * @name $rootScope.Scope#$countWatchers + * @module ngMock + * @description + * Counts all the watchers of direct and indirect child scopes of the current scope. + * + * The watchers of the current scope are included in the count and so are all the watchers of + * isolate child scopes. + * + * @returns {number} Total number of watchers. + */ + function countWatchers() { + // jshint validthis: true + var count = this.$$watchers ? this.$$watchers.length : 0; // include the current scope + var pendingChildHeads = [this.$$childHead]; + var currentScope; + + while (pendingChildHeads.length) { + currentScope = pendingChildHeads.shift(); + + while (currentScope) { + count += currentScope.$$watchers ? currentScope.$$watchers.length : 0; + pendingChildHeads.push(currentScope.$$childHead); + currentScope = currentScope.$$nextSibling; + } + } + + return count; + } +}]; + + +if (window.jasmine || window.mocha) { + + var currentSpec = null, + annotatedFunctions = [], + isSpecRunning = function() { + return !!currentSpec; + }; + + angular.mock.$$annotate = angular.injector.$$annotate; + angular.injector.$$annotate = function(fn) { + if (typeof fn === 'function' && !fn.$inject) { + annotatedFunctions.push(fn); + } + return angular.mock.$$annotate.apply(this, arguments); + }; + + + (window.beforeEach || window.setup)(function() { + annotatedFunctions = []; + currentSpec = this; + }); + + (window.afterEach || window.teardown)(function() { + var injector = currentSpec.$injector; + + annotatedFunctions.forEach(function(fn) { + delete fn.$inject; + }); + + angular.forEach(currentSpec.$modules, function(module) { + if (module && module.$$hashKey) { + module.$$hashKey = undefined; + } + }); + + currentSpec.$injector = null; + currentSpec.$modules = null; + currentSpec = null; + + if (injector) { + injector.get('$rootElement').off(); + } + + // clean up jquery's fragment cache + angular.forEach(angular.element.fragments, function(val, key) { + delete angular.element.fragments[key]; + }); + + MockXhr.$$lastInstance = null; + + angular.forEach(angular.callbacks, function(val, key) { + delete angular.callbacks[key]; + }); + angular.callbacks.counter = 0; + }); + + /** + * @ngdoc function + * @name angular.mock.module + * @description + * + * *NOTE*: This function is also published on window for easy access.
+ * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha + * + * This function registers a module configuration code. It collects the configuration information + * which will be used when the injector is created by {@link angular.mock.inject inject}. + * + * See {@link angular.mock.inject inject} for usage example + * + * @param {...(string|Function|Object)} fns any number of modules which are represented as string + * aliases or as anonymous module initialization functions. The modules are used to + * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an + * object literal is passed they will be registered as values in the module, the key being + * the module name and the value being what is returned. + */ + window.module = angular.mock.module = function() { + var moduleFns = Array.prototype.slice.call(arguments, 0); + return isSpecRunning() ? workFn() : workFn; + ///////////////////// + function workFn() { + if (currentSpec.$injector) { + throw new Error('Injector already created, can not register a module!'); + } else { + var modules = currentSpec.$modules || (currentSpec.$modules = []); + angular.forEach(moduleFns, function(module) { + if (angular.isObject(module) && !angular.isArray(module)) { + modules.push(function($provide) { + angular.forEach(module, function(value, key) { + $provide.value(key, value); + }); + }); + } else { + modules.push(module); + } + }); + } + } + }; + + /** + * @ngdoc function + * @name angular.mock.inject + * @description + * + * *NOTE*: This function is also published on window for easy access.
+ * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha + * + * The inject function wraps a function into an injectable function. The inject() creates new + * instance of {@link auto.$injector $injector} per test, which is then used for + * resolving references. + * + * + * ## Resolving References (Underscore Wrapping) + * Often, we would like to inject a reference once, in a `beforeEach()` block and reuse this + * in multiple `it()` clauses. To be able to do this we must assign the reference to a variable + * that is declared in the scope of the `describe()` block. Since we would, most likely, want + * the variable to have the same name of the reference we have a problem, since the parameter + * to the `inject()` function would hide the outer variable. + * + * To help with this, the injected parameters can, optionally, be enclosed with underscores. + * These are ignored by the injector when the reference name is resolved. + * + * For example, the parameter `_myService_` would be resolved as the reference `myService`. + * Since it is available in the function body as _myService_, we can then assign it to a variable + * defined in an outer scope. + * + * ``` + * // Defined out reference variable outside + * var myService; + * + * // Wrap the parameter in underscores + * beforeEach( inject( function(_myService_){ + * myService = _myService_; + * })); + * + * // Use myService in a series of tests. + * it('makes use of myService', function() { + * myService.doStuff(); + * }); + * + * ``` + * + * See also {@link angular.mock.module angular.mock.module} + * + * ## Example + * Example of what a typical jasmine tests looks like with the inject method. + * ```js + * + * angular.module('myApplicationModule', []) + * .value('mode', 'app') + * .value('version', 'v1.0.1'); + * + * + * describe('MyApp', function() { + * + * // You need to load modules that you want to test, + * // it loads only the "ng" module by default. + * beforeEach(module('myApplicationModule')); + * + * + * // inject() is used to inject arguments of all given functions + * it('should provide a version', inject(function(mode, version) { + * expect(version).toEqual('v1.0.1'); + * expect(mode).toEqual('app'); + * })); + * + * + * // The inject and module method can also be used inside of the it or beforeEach + * it('should override a version and test the new version is injected', function() { + * // module() takes functions or strings (module aliases) + * module(function($provide) { + * $provide.value('version', 'overridden'); // override version here + * }); + * + * inject(function(version) { + * expect(version).toEqual('overridden'); + * }); + * }); + * }); + * + * ``` + * + * @param {...Function} fns any number of functions which will be injected using the injector. + */ + + + + var ErrorAddingDeclarationLocationStack = function(e, errorForStack) { + this.message = e.message; + this.name = e.name; + if (e.line) this.line = e.line; + if (e.sourceId) this.sourceId = e.sourceId; + if (e.stack && errorForStack) + this.stack = e.stack + '\n' + errorForStack.stack; + if (e.stackArray) this.stackArray = e.stackArray; + }; + ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString; + + window.inject = angular.mock.inject = function() { + var blockFns = Array.prototype.slice.call(arguments, 0); + var errorForStack = new Error('Declaration Location'); + return isSpecRunning() ? workFn.call(currentSpec) : workFn; + ///////////////////// + function workFn() { + var modules = currentSpec.$modules || []; + var strictDi = !!currentSpec.$injectorStrict; + modules.unshift('ngMock'); + modules.unshift('ng'); + var injector = currentSpec.$injector; + if (!injector) { + if (strictDi) { + // If strictDi is enabled, annotate the providerInjector blocks + angular.forEach(modules, function(moduleFn) { + if (typeof moduleFn === "function") { + angular.injector.$$annotate(moduleFn); + } + }); + } + injector = currentSpec.$injector = angular.injector(modules, strictDi); + currentSpec.$injectorStrict = strictDi; + } + for (var i = 0, ii = blockFns.length; i < ii; i++) { + if (currentSpec.$injectorStrict) { + // If the injector is strict / strictDi, and the spec wants to inject using automatic + // annotation, then annotate the function here. + injector.annotate(blockFns[i]); + } + try { + /* jshint -W040 *//* Jasmine explicitly provides a `this` object when calling functions */ + injector.invoke(blockFns[i] || angular.noop, this); + /* jshint +W040 */ + } catch (e) { + if (e.stack && errorForStack) { + throw new ErrorAddingDeclarationLocationStack(e, errorForStack); + } + throw e; + } finally { + errorForStack = null; + } + } + } + }; + + + angular.mock.inject.strictDi = function(value) { + value = arguments.length ? !!value : true; + return isSpecRunning() ? workFn() : workFn; + + function workFn() { + if (value !== currentSpec.$injectorStrict) { + if (currentSpec.$injector) { + throw new Error('Injector already created, can not modify strict annotations'); + } else { + currentSpec.$injectorStrict = value; + } + } + } + }; +} + + +})(window, window.angular); diff --git a/td/public/libs/angular-mocks/angular-mocks.min.js b/td/public/libs/angular-mocks/angular-mocks.min.js new file mode 100644 index 000000000..3c8984973 --- /dev/null +++ b/td/public/libs/angular-mocks/angular-mocks.min.js @@ -0,0 +1,4 @@ +!function(a,b,c){"use strict";function d(a){var b;if(b=a.match(j)){var c=new Date(0),d=0,f=0;return b[9]&&(d=e(b[9]+b[10]),f=e(b[9]+b[11])),c.setUTCFullYear(e(b[1]),e(b[2])-1,e(b[3])),c.setUTCHours(e(b[4]||0)-d,e(b[5]||0)-f,e(b[6]||0),e(b[7]||0)),c}return a}function e(a){return parseInt(a,10)}function f(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.lengtha;a++)if(n[a]===e){n.splice(a,1),j(-1,c,"");break}}return!f&&q&&(q.then?q.then(i):d(i,q)),e}var u=new i,v=m[0],w=!1;if(v&&v.match(a,g)){if(!v.matchData(h))throw new Error("Expected "+v+" with different data\nEXPECTED: "+s(v.data)+"\nGOT: "+h);if(!v.matchHeaders(k))throw new Error("Expected "+v+" with different headers\nEXPECTED: "+s(v.headers)+"\nGOT: "+s(k));if(m.shift(),v.response)return void n.push(t(v));w=!0}for(var x,y=-1;x=l[++y];)if(x.match(a,g,h,k||{})){if(x.response)(f?f.defer:o)(t(x));else{if(!x.passThrough)throw new Error("No response defined !");e(a,g,h,j,k,q,r)}return}throw w?new Error("No response defined !"):new Error("Unexpected request: "+a+" "+g+"\n"+(v?"Expected "+v:"No more request expected"))}function k(a){b.forEach(["GET","DELETE","JSONP","HEAD"],function(b){j[a+b]=function(d,e){return j[a](b,d,c,e)}}),b.forEach(["PUT","POST","PATCH"],function(b){j[a+b]=function(c,d,e){return j[a](b,c,d,e)}})}var l=[],m=[],n=[],o=b.bind(n,n.push),p=b.copy;return j.when=function(a,b,d,e){var i=new h(a,b,d,e),j={respond:function(a,b,d,e){return i.passThrough=c,i.response=g(a,b,d,e),j}};return f&&(j.passThrough=function(){return i.response=c,i.passThrough=!0,j}),l.push(i),j},k("when"),j.expect=function(a,b,c,d){var e=new h(a,b,c,d),f={respond:function(a,b,c,d){return e.response=g(a,b,c,d),f}};return m.push(e),f},k("expect"),j.flush=function(c,d){if(d!==!1&&a.$digest(),!n.length)throw new Error("No pending request to flush !");if(b.isDefined(c)&&null!==c)for(;c--;){if(!n.length)throw new Error("No more pending request to flush !");n.shift()()}else for(;n.length;)n.shift()();j.verifyNoOutstandingExpectation(d)},j.verifyNoOutstandingExpectation=function(b){if(b!==!1&&a.$digest(),m.length)throw new Error("Unsatisfied requests: "+m.join(", "))},j.verifyNoOutstandingRequest=function(){if(n.length)throw new Error("Unflushed requests: "+n.length)},j.resetExpectations=function(){m.length=0,n.length=0},j}function h(a,c,d,e){this.data=d,this.headers=e,this.match=function(c,d,e,f){return a!=c?!1:this.matchUrl(d)?b.isDefined(e)&&!this.matchData(e)?!1:b.isDefined(f)&&!this.matchHeaders(f)?!1:!0:!1},this.matchUrl=function(a){return c?b.isFunction(c.test)?c.test(a):b.isFunction(c)?c(a):c==a:!0},this.matchHeaders=function(a){return b.isUndefined(e)?!0:b.isFunction(e)?e(a):b.equals(e,a)},this.matchData=function(a){return b.isUndefined(d)?!0:d&&b.isFunction(d.test)?d.test(a):d&&b.isFunction(d)?d(a):d&&!b.isString(d)?b.equals(b.fromJson(b.toJson(d)),b.fromJson(a)):d==a},this.toString=function(){return a+" "+c}}function i(){i.$$lastInstance=this,this.open=function(a,b,c){this.$$method=a,this.$$url=b,this.$$async=c,this.$$reqHeaders={},this.$$respHeaders={}},this.send=function(a){this.$$data=a},this.setRequestHeader=function(a,b){this.$$reqHeaders[a]=b},this.getResponseHeader=function(a){var d=this.$$respHeaders[a];return d?d:(a=b.lowercase(a),(d=this.$$respHeaders[a])?d:(d=c,b.forEach(this.$$respHeaders,function(c,e){d||b.lowercase(e)!=a||(d=c)}),d))},this.getAllResponseHeaders=function(){var a=[];return b.forEach(this.$$respHeaders,function(b,c){a.push(c+": "+b)}),a.join("\n")},this.abort=b.noop}b.mock={},b.mock.$BrowserProvider=function(){this.$get=function(){return new b.mock.$Browser}},b.mock.$Browser=function(){var a=this;this.isMock=!0,a.$$url="http://server/",a.$$lastUrl=a.$$url,a.pollFns=[],a.$$completeOutstandingRequest=b.noop,a.$$incOutstandingRequestCount=b.noop,a.onUrlChange=function(b){return a.pollFns.push(function(){(a.$$lastUrl!==a.$$url||a.$$state!==a.$$lastState)&&(a.$$lastUrl=a.$$url,a.$$lastState=a.$$state,b(a.$$url,a.$$state))}),b},a.$$applicationDestroyed=b.noop,a.$$checkUrlChange=b.noop,a.deferredFns=[],a.deferredNextId=0,a.defer=function(b,c){return c=c||0,a.deferredFns.push({time:a.defer.now+c,fn:b,id:a.deferredNextId}),a.deferredFns.sort(function(a,b){return a.time-b.time}),a.deferredNextId++},a.defer.now=0,a.defer.cancel=function(d){var e;return b.forEach(a.deferredFns,function(a,b){a.id===d&&(e=b)}),e!==c?(a.deferredFns.splice(e,1),!0):!1},a.defer.flush=function(c){if(b.isDefined(c))a.defer.now+=c;else{if(!a.deferredFns.length)throw new Error("No deferred tasks to be flushed");a.defer.now=a.deferredFns[a.deferredFns.length-1].time}for(;a.deferredFns.length&&a.deferredFns[0].time<=a.defer.now;)a.deferredFns.shift().fn()},a.$$baseHref="/",a.baseHref=function(){return this.$$baseHref}},b.mock.$Browser.prototype={poll:function(){b.forEach(this.pollFns,function(a){a()})},url:function(a,c,d){return b.isUndefined(d)&&(d=null),a?(this.$$url=a,this.$$state=b.copy(d),this):this.$$url},state:function(){return this.$$state},notifyWhenNoOutstandingRequests:function(a){a()}},b.mock.$ExceptionHandlerProvider=function(){var a;this.mode=function(b){switch(b){case"log":case"rethrow":var c=[];a=function(a){if(1==arguments.length?c.push(a):c.push([].slice.call(arguments,0)),"rethrow"===b)throw a},a.errors=c;break;default:throw new Error("Unknown mode '"+b+"', only 'log'/'rethrow' modes are allowed!")}},this.$get=function(){return a},this.mode("rethrow")},b.mock.$LogProvider=function(){function a(a,b,c){return a.concat(Array.prototype.slice.call(b,c))}var c=!0;this.debugEnabled=function(a){return b.isDefined(a)?(c=a,this):c},this.$get=function(){var d={log:function(){d.log.logs.push(a([],arguments,0))},warn:function(){d.warn.logs.push(a([],arguments,0))},info:function(){d.info.logs.push(a([],arguments,0))},error:function(){d.error.logs.push(a([],arguments,0))},debug:function(){c&&d.debug.logs.push(a([],arguments,0))}};return d.reset=function(){d.log.logs=[],d.info.logs=[],d.warn.logs=[],d.error.logs=[],d.debug.logs=[]},d.assertEmpty=function(){var a=[];if(b.forEach(["error","warn","info","log","debug"],function(c){b.forEach(d[c].logs,function(d){b.forEach(d,function(b){a.push("MOCK $log ("+c+"): "+String(b)+"\n"+(b.stack||""))})})}),a.length)throw a.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected log message was not checked and removed:"),a.push(""),new Error(a.join("\n---------\n"))},d.reset(),d}},b.mock.$IntervalProvider=function(){this.$get=["$browser","$rootScope","$q","$$q",function(a,d,e,f){var g=[],h=0,i=0,j=function(j,k,l,m){function n(){if(s.notify(q++),l>0&&q>=l){var e;s.resolve(q),b.forEach(g,function(a,b){a.id===t.$$intervalId&&(e=b)}),e!==c&&g.splice(e,1)}r?a.defer.flush():d.$apply()}var o=arguments.length>4,p=o?Array.prototype.slice.call(arguments,4):[],q=0,r=b.isDefined(m)&&!m,s=(r?f:e).defer(),t=s.promise;return l=b.isDefined(l)?l:0,t.then(null,null,o?function(){j.apply(null,p)}:j),t.$$intervalId=h,g.push({nextTime:i+k,delay:k,fn:n,id:h,deferred:s}),g.sort(function(a,b){return a.nextTime-b.nextTime}),h++,t};return j.cancel=function(a){if(!a)return!1;var d;return b.forEach(g,function(b,c){b.id===a.$$intervalId&&(d=c)}),d!==c?(g[d].deferred.reject("canceled"),g.splice(d,1),!0):!1},j.flush=function(a){for(i+=a;g.length&&g[0].nextTime<=i;){var b=g[0];b.fn(),b.nextTime+=b.delay,g.sort(function(a,b){return a.nextTime-b.nextTime})}return a},j}]};var j=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;if(b.mock.TzDate=function(a,c){var e=new Date(0);if(b.isString(c)){var g=c;if(e.origDate=d(c),c=e.origDate.getTime(),isNaN(c))throw{name:"Illegal Argument",message:"Arg '"+g+"' passed into TzDate constructor is not a valid date string"}}else e.origDate=new Date(c);var h=new Date(c).getTimezoneOffset();e.offsetDiff=60*h*1e3-1e3*a*60*60,e.date=new Date(c+e.offsetDiff),e.getTime=function(){return e.date.getTime()-e.offsetDiff},e.toLocaleDateString=function(){return e.date.toLocaleDateString()},e.getFullYear=function(){return e.date.getFullYear()},e.getMonth=function(){return e.date.getMonth()},e.getDate=function(){return e.date.getDate()},e.getHours=function(){return e.date.getHours()},e.getMinutes=function(){return e.date.getMinutes()},e.getSeconds=function(){return e.date.getSeconds()},e.getMilliseconds=function(){return e.date.getMilliseconds()},e.getTimezoneOffset=function(){return 60*a},e.getUTCFullYear=function(){return e.origDate.getUTCFullYear()},e.getUTCMonth=function(){return e.origDate.getUTCMonth()},e.getUTCDate=function(){return e.origDate.getUTCDate()},e.getUTCHours=function(){return e.origDate.getUTCHours()},e.getUTCMinutes=function(){return e.origDate.getUTCMinutes()},e.getUTCSeconds=function(){return e.origDate.getUTCSeconds()},e.getUTCMilliseconds=function(){return e.origDate.getUTCMilliseconds()},e.getDay=function(){return e.date.getDay()},e.toISOString&&(e.toISOString=function(){return f(e.origDate.getUTCFullYear(),4)+"-"+f(e.origDate.getUTCMonth()+1,2)+"-"+f(e.origDate.getUTCDate(),2)+"T"+f(e.origDate.getUTCHours(),2)+":"+f(e.origDate.getUTCMinutes(),2)+":"+f(e.origDate.getUTCSeconds(),2)+"."+f(e.origDate.getUTCMilliseconds(),3)+"Z"});var i=["getUTCDay","getYear","setDate","setFullYear","setHours","setMilliseconds","setMinutes","setMonth","setSeconds","setTime","setUTCDate","setUTCFullYear","setUTCHours","setUTCMilliseconds","setUTCMinutes","setUTCMonth","setUTCSeconds","setYear","toDateString","toGMTString","toJSON","toLocaleFormat","toLocaleString","toLocaleTimeString","toSource","toString","toTimeString","toUTCString","valueOf"];return b.forEach(i,function(a){e[a]=function(){throw new Error("Method '"+a+"' is not implemented in the TzDate mock")}}),e},b.mock.TzDate.prototype=Date.prototype,b.mock.animate=b.module("ngAnimateMock",["ng"]).config(["$provide",function(a){var c=[];a.value("$$animateReflow",function(a){var b=c.length;return c.push(a),function(){c.splice(b,1)}}),a.decorator("$animate",["$delegate","$timeout","$browser","$$rAF",function(a,d,e,f){var g={queue:[],cancel:a.cancel,enabled:a.enabled,triggerCallbackEvents:function(){f.flush()},triggerCallbackPromise:function(){d.flush(0)},triggerCallbacks:function(){this.triggerCallbackEvents(),this.triggerCallbackPromise()},triggerReflow:function(){b.forEach(c,function(a){a()}),c=[]}};return b.forEach(["animate","enter","leave","move","addClass","removeClass","setClass"],function(b){g[b]=function(){return g.queue.push({event:b,element:arguments[0],options:arguments[arguments.length-1],args:arguments}),a[b].apply(a,arguments)}}),g}])}]),b.mock.dump=function(a){function c(a){var e;return b.isElement(a)?(a=b.element(a),e=b.element("
"),b.forEach(a,function(a){e.append(b.element(a).clone())}),e=e.html()):b.isArray(a)?(e=[],b.forEach(a,function(a){e.push(c(a))}),e="[ "+e.join(", ")+" ]"):e=b.isObject(a)?b.isFunction(a.$eval)&&b.isFunction(a.$apply)?d(a):a instanceof Error?a.stack||""+a.name+": "+a.message:b.toJson(a,!0):String(a),e}function d(a,c){c=c||" ";var e=[c+"Scope("+a.$id+"): {"];for(var f in a)Object.prototype.hasOwnProperty.call(a,f)&&!f.match(/^(\$|this)/)&&e.push(" "+f+": "+b.toJson(a[f]));for(var g=a.$$childHead;g;)e.push(d(g,c+" ")),g=g.$$nextSibling;return e.push("}"),e.join("\n"+c)}return c(a)},b.mock.$HttpBackendProvider=function(){this.$get=["$rootScope","$timeout",g]},b.mock.$TimeoutDecorator=["$delegate","$browser",function(a,c){function d(a){var c=[];return b.forEach(a,function(a){c.push("{id: "+a.id+", time: "+a.time+"}")}),c.join(", ")}return a.flush=function(a){c.defer.flush(a)},a.verifyNoPendingTasks=function(){if(c.deferredFns.length)throw new Error("Deferred tasks to flush ("+c.deferredFns.length+"): "+d(c.deferredFns))},a}],b.mock.$RAFDecorator=["$delegate",function(a){var b=[],c=function(a){var c=b.length;return b.push(a),function(){b.splice(c,1)}};return c.supported=a.supported,c.flush=function(){if(0===b.length)throw new Error("No rAF callbacks present");for(var a=b.length,c=0;a>c;c++)b[c]();b=b.slice(c)},c}],b.mock.$RootElementProvider=function(){this.$get=function(){return b.element("
")}},b.mock.$ControllerDecorator=["$delegate",function(a){return function(c,d,e,f){if(e&&"object"==typeof e){var g=a(c,d,!0,f);return b.extend(g.instance,e),g()}return a(c,d,e,f)}}],b.module("ngMock",["ng"]).provider({$browser:b.mock.$BrowserProvider,$exceptionHandler:b.mock.$ExceptionHandlerProvider,$log:b.mock.$LogProvider,$interval:b.mock.$IntervalProvider,$httpBackend:b.mock.$HttpBackendProvider,$rootElement:b.mock.$RootElementProvider}).config(["$provide",function(a){a.decorator("$timeout",b.mock.$TimeoutDecorator),a.decorator("$$rAF",b.mock.$RAFDecorator),a.decorator("$rootScope",b.mock.$RootScopeDecorator),a.decorator("$controller",b.mock.$ControllerDecorator)}]),b.module("ngMockE2E",["ng"]).config(["$provide",function(a){a.decorator("$httpBackend",b.mock.e2e.$httpBackendDecorator)}]),b.mock.e2e={},b.mock.e2e.$httpBackendDecorator=["$rootScope","$timeout","$delegate","$browser",g],b.mock.$RootScopeDecorator=["$delegate",function(a){function b(){for(var a,b=0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=1,c.push(a.$$childHead),a=a.$$nextSibling;return b}function c(){for(var a,b=this.$$watchers?this.$$watchers.length:0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=a.$$watchers?a.$$watchers.length:0,c.push(a.$$childHead),a=a.$$nextSibling;return b}var d=Object.getPrototypeOf(a);return d.$countChildScopes=b,d.$countWatchers=c,a}],a.jasmine||a.mocha){var k=null,l=[],m=function(){return!!k};b.mock.$$annotate=b.injector.$$annotate,b.injector.$$annotate=function(a){return"function"!=typeof a||a.$inject||l.push(a),b.mock.$$annotate.apply(this,arguments)},(a.beforeEach||a.setup)(function(){l=[],k=this}),(a.afterEach||a.teardown)(function(){var a=k.$injector;l.forEach(function(a){delete a.$inject}),b.forEach(k.$modules,function(a){a&&a.$$hashKey&&(a.$$hashKey=c)}),k.$injector=null,k.$modules=null,k=null,a&&a.get("$rootElement").off(),b.forEach(b.element.fragments,function(a,c){delete b.element.fragments[c]}),i.$$lastInstance=null,b.forEach(b.callbacks,function(a,c){delete b.callbacks[c]}),b.callbacks.counter=0}),a.module=b.mock.module=function(){function a(){if(k.$injector)throw new Error("Injector already created, can not register a module!");var a=k.$modules||(k.$modules=[]);b.forEach(c,function(c){b.isObject(c)&&!b.isArray(c)?a.push(function(a){b.forEach(c,function(b,c){a.value(c,b)})}):a.push(c)})}var c=Array.prototype.slice.call(arguments,0);return m()?a():a};var n=function(a,b){this.message=a.message,this.name=a.name,a.line&&(this.line=a.line),a.sourceId&&(this.sourceId=a.sourceId),a.stack&&b&&(this.stack=a.stack+"\n"+b.stack),a.stackArray&&(this.stackArray=a.stackArray)};n.prototype.toString=Error.prototype.toString,a.inject=b.mock.inject=function(){function a(){var a=k.$modules||[],e=!!k.$injectorStrict;a.unshift("ngMock"),a.unshift("ng");var f=k.$injector;f||(e&&b.forEach(a,function(a){"function"==typeof a&&b.injector.$$annotate(a)}),f=k.$injector=b.injector(a,e),k.$injectorStrict=e);for(var g=0,h=c.length;h>g;g++){k.$injectorStrict&&f.annotate(c[g]);try{f.invoke(c[g]||b.noop,this)}catch(i){if(i.stack&&d)throw new n(i,d);throw i}finally{d=null}}}var c=Array.prototype.slice.call(arguments,0),d=new Error("Declaration Location");return m()?a.call(k):a},b.mock.inject.strictDi=function(a){function b(){if(a!==k.$injectorStrict){if(k.$injector)throw new Error("Injector already created, can not modify strict annotations");k.$injectorStrict=a}}return a=arguments.length?!!a:!0,m()?b():b}}}(window,window.angular),!function(a,b,c){"use strict";function d(a){var b;if(b=a.match(j)){var c=new Date(0),d=0,f=0;return b[9]&&(d=e(b[9]+b[10]),f=e(b[9]+b[11])),c.setUTCFullYear(e(b[1]),e(b[2])-1,e(b[3])),c.setUTCHours(e(b[4]||0)-d,e(b[5]||0)-f,e(b[6]||0),e(b[7]||0)),c}return a}function e(a){return parseInt(a,10)}function f(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.lengtha;a++)if(n[a]===e){n.splice(a,1),j(-1,c,"");break}}return!f&&q&&(q.then?q.then(i):d(i,q)),e}var u=new i,v=m[0],w=!1;if(v&&v.match(a,g)){if(!v.matchData(h))throw new Error("Expected "+v+" with different data\nEXPECTED: "+s(v.data)+"\nGOT: "+h);if(!v.matchHeaders(k))throw new Error("Expected "+v+" with different headers\nEXPECTED: "+s(v.headers)+"\nGOT: "+s(k));if(m.shift(),v.response)return void n.push(t(v));w=!0}for(var x,y=-1;x=l[++y];)if(x.match(a,g,h,k||{})){if(x.response)(f?f.defer:o)(t(x));else{if(!x.passThrough)throw new Error("No response defined !");e(a,g,h,j,k,q,r)}return}throw w?new Error("No response defined !"):new Error("Unexpected request: "+a+" "+g+"\n"+(v?"Expected "+v:"No more request expected"))}function k(a){b.forEach(["GET","DELETE","JSONP","HEAD"],function(b){j[a+b]=function(d,e){return j[a](b,d,c,e)}}),b.forEach(["PUT","POST","PATCH"],function(b){j[a+b]=function(c,d,e){return j[a](b,c,d,e)}})}var l=[],m=[],n=[],o=b.bind(n,n.push),p=b.copy;return j.when=function(a,b,d,e){var i=new h(a,b,d,e),j={respond:function(a,b,d,e){return i.passThrough=c,i.response=g(a,b,d,e),j}};return f&&(j.passThrough=function(){return i.response=c,i.passThrough=!0,j}),l.push(i),j},k("when"),j.expect=function(a,b,c,d){var e=new h(a,b,c,d),f={respond:function(a,b,c,d){return e.response=g(a,b,c,d),f}};return m.push(e),f},k("expect"),j.flush=function(c,d){if(d!==!1&&a.$digest(),!n.length)throw new Error("No pending request to flush !");if(b.isDefined(c)&&null!==c)for(;c--;){if(!n.length)throw new Error("No more pending request to flush !");n.shift()()}else for(;n.length;)n.shift()();j.verifyNoOutstandingExpectation(d)},j.verifyNoOutstandingExpectation=function(b){if(b!==!1&&a.$digest(),m.length)throw new Error("Unsatisfied requests: "+m.join(", "))},j.verifyNoOutstandingRequest=function(){if(n.length)throw new Error("Unflushed requests: "+n.length)},j.resetExpectations=function(){m.length=0,n.length=0},j}function h(a,c,d,e){this.data=d,this.headers=e,this.match=function(c,d,e,f){return a!=c?!1:this.matchUrl(d)?b.isDefined(e)&&!this.matchData(e)?!1:b.isDefined(f)&&!this.matchHeaders(f)?!1:!0:!1},this.matchUrl=function(a){return c?b.isFunction(c.test)?c.test(a):b.isFunction(c)?c(a):c==a:!0},this.matchHeaders=function(a){return b.isUndefined(e)?!0:b.isFunction(e)?e(a):b.equals(e,a)},this.matchData=function(a){return b.isUndefined(d)?!0:d&&b.isFunction(d.test)?d.test(a):d&&b.isFunction(d)?d(a):d&&!b.isString(d)?b.equals(b.fromJson(b.toJson(d)),b.fromJson(a)):d==a},this.toString=function(){return a+" "+c}}function i(){i.$$lastInstance=this,this.open=function(a,b,c){this.$$method=a,this.$$url=b,this.$$async=c,this.$$reqHeaders={},this.$$respHeaders={}},this.send=function(a){this.$$data=a},this.setRequestHeader=function(a,b){this.$$reqHeaders[a]=b},this.getResponseHeader=function(a){var d=this.$$respHeaders[a];return d?d:(a=b.lowercase(a),(d=this.$$respHeaders[a])?d:(d=c,b.forEach(this.$$respHeaders,function(c,e){d||b.lowercase(e)!=a||(d=c)}),d))},this.getAllResponseHeaders=function(){var a=[];return b.forEach(this.$$respHeaders,function(b,c){a.push(c+": "+b)}),a.join("\n")},this.abort=b.noop}b.mock={},b.mock.$BrowserProvider=function(){this.$get=function(){return new b.mock.$Browser}},b.mock.$Browser=function(){var a=this;this.isMock=!0,a.$$url="http://server/",a.$$lastUrl=a.$$url,a.pollFns=[],a.$$completeOutstandingRequest=b.noop,a.$$incOutstandingRequestCount=b.noop,a.onUrlChange=function(b){return a.pollFns.push(function(){(a.$$lastUrl!==a.$$url||a.$$state!==a.$$lastState)&&(a.$$lastUrl=a.$$url,a.$$lastState=a.$$state,b(a.$$url,a.$$state))}),b},a.$$applicationDestroyed=b.noop,a.$$checkUrlChange=b.noop,a.deferredFns=[],a.deferredNextId=0,a.defer=function(b,c){return c=c||0,a.deferredFns.push({time:a.defer.now+c,fn:b,id:a.deferredNextId}),a.deferredFns.sort(function(a,b){return a.time-b.time}),a.deferredNextId++},a.defer.now=0,a.defer.cancel=function(d){var e;return b.forEach(a.deferredFns,function(a,b){a.id===d&&(e=b)}),e!==c?(a.deferredFns.splice(e,1),!0):!1},a.defer.flush=function(c){if(b.isDefined(c))a.defer.now+=c;else{if(!a.deferredFns.length)throw new Error("No deferred tasks to be flushed");a.defer.now=a.deferredFns[a.deferredFns.length-1].time}for(;a.deferredFns.length&&a.deferredFns[0].time<=a.defer.now;)a.deferredFns.shift().fn()},a.$$baseHref="/",a.baseHref=function(){return this.$$baseHref}},b.mock.$Browser.prototype={poll:function(){b.forEach(this.pollFns,function(a){a()})},url:function(a,c,d){return b.isUndefined(d)&&(d=null),a?(this.$$url=a,this.$$state=b.copy(d),this):this.$$url},state:function(){return this.$$state},notifyWhenNoOutstandingRequests:function(a){a()}},b.mock.$ExceptionHandlerProvider=function(){var a;this.mode=function(b){switch(b){case"log":case"rethrow":var c=[];a=function(a){if(1==arguments.length?c.push(a):c.push([].slice.call(arguments,0)),"rethrow"===b)throw a},a.errors=c;break;default:throw new Error("Unknown mode '"+b+"', only 'log'/'rethrow' modes are allowed!")}},this.$get=function(){return a},this.mode("rethrow")},b.mock.$LogProvider=function(){function a(a,b,c){return a.concat(Array.prototype.slice.call(b,c))}var c=!0;this.debugEnabled=function(a){return b.isDefined(a)?(c=a,this):c},this.$get=function(){var d={log:function(){d.log.logs.push(a([],arguments,0))},warn:function(){d.warn.logs.push(a([],arguments,0))},info:function(){d.info.logs.push(a([],arguments,0))},error:function(){d.error.logs.push(a([],arguments,0))},debug:function(){c&&d.debug.logs.push(a([],arguments,0))}};return d.reset=function(){d.log.logs=[],d.info.logs=[],d.warn.logs=[],d.error.logs=[],d.debug.logs=[]},d.assertEmpty=function(){var a=[];if(b.forEach(["error","warn","info","log","debug"],function(c){b.forEach(d[c].logs,function(d){b.forEach(d,function(b){a.push("MOCK $log ("+c+"): "+String(b)+"\n"+(b.stack||""))})})}),a.length)throw a.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected log message was not checked and removed:"),a.push(""),new Error(a.join("\n---------\n"))},d.reset(),d}},b.mock.$IntervalProvider=function(){this.$get=["$browser","$rootScope","$q","$$q",function(a,d,e,f){var g=[],h=0,i=0,j=function(j,k,l,m){function n(){if(s.notify(q++),l>0&&q>=l){var e;s.resolve(q),b.forEach(g,function(a,b){a.id===t.$$intervalId&&(e=b)}),e!==c&&g.splice(e,1)}r?a.defer.flush():d.$apply()}var o=arguments.length>4,p=o?Array.prototype.slice.call(arguments,4):[],q=0,r=b.isDefined(m)&&!m,s=(r?f:e).defer(),t=s.promise;return l=b.isDefined(l)?l:0,t.then(null,null,o?function(){j.apply(null,p)}:j),t.$$intervalId=h,g.push({nextTime:i+k,delay:k,fn:n,id:h,deferred:s}),g.sort(function(a,b){return a.nextTime-b.nextTime}),h++,t};return j.cancel=function(a){if(!a)return!1;var d;return b.forEach(g,function(b,c){b.id===a.$$intervalId&&(d=c)}),d!==c?(g[d].deferred.reject("canceled"),g.splice(d,1),!0):!1},j.flush=function(a){for(i+=a;g.length&&g[0].nextTime<=i;){var b=g[0];b.fn(),b.nextTime+=b.delay,g.sort(function(a,b){return a.nextTime-b.nextTime})}return a},j}]};var j=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;if(b.mock.TzDate=function(a,c){var e=new Date(0);if(b.isString(c)){var g=c;if(e.origDate=d(c),c=e.origDate.getTime(),isNaN(c))throw{name:"Illegal Argument",message:"Arg '"+g+"' passed into TzDate constructor is not a valid date string"}}else e.origDate=new Date(c);var h=new Date(c).getTimezoneOffset();e.offsetDiff=60*h*1e3-1e3*a*60*60,e.date=new Date(c+e.offsetDiff),e.getTime=function(){return e.date.getTime()-e.offsetDiff},e.toLocaleDateString=function(){return e.date.toLocaleDateString()},e.getFullYear=function(){return e.date.getFullYear()},e.getMonth=function(){return e.date.getMonth()},e.getDate=function(){return e.date.getDate()},e.getHours=function(){return e.date.getHours()},e.getMinutes=function(){return e.date.getMinutes()},e.getSeconds=function(){return e.date.getSeconds()},e.getMilliseconds=function(){return e.date.getMilliseconds()},e.getTimezoneOffset=function(){return 60*a},e.getUTCFullYear=function(){return e.origDate.getUTCFullYear()},e.getUTCMonth=function(){return e.origDate.getUTCMonth()},e.getUTCDate=function(){return e.origDate.getUTCDate()},e.getUTCHours=function(){return e.origDate.getUTCHours()},e.getUTCMinutes=function(){return e.origDate.getUTCMinutes()},e.getUTCSeconds=function(){return e.origDate.getUTCSeconds()},e.getUTCMilliseconds=function(){return e.origDate.getUTCMilliseconds()},e.getDay=function(){return e.date.getDay()},e.toISOString&&(e.toISOString=function(){return f(e.origDate.getUTCFullYear(),4)+"-"+f(e.origDate.getUTCMonth()+1,2)+"-"+f(e.origDate.getUTCDate(),2)+"T"+f(e.origDate.getUTCHours(),2)+":"+f(e.origDate.getUTCMinutes(),2)+":"+f(e.origDate.getUTCSeconds(),2)+"."+f(e.origDate.getUTCMilliseconds(),3)+"Z"});var i=["getUTCDay","getYear","setDate","setFullYear","setHours","setMilliseconds","setMinutes","setMonth","setSeconds","setTime","setUTCDate","setUTCFullYear","setUTCHours","setUTCMilliseconds","setUTCMinutes","setUTCMonth","setUTCSeconds","setYear","toDateString","toGMTString","toJSON","toLocaleFormat","toLocaleString","toLocaleTimeString","toSource","toString","toTimeString","toUTCString","valueOf"];return b.forEach(i,function(a){e[a]=function(){throw new Error("Method '"+a+"' is not implemented in the TzDate mock")}}),e},b.mock.TzDate.prototype=Date.prototype,b.mock.animate=b.module("ngAnimateMock",["ng"]).config(["$provide",function(a){var c=[];a.value("$$animateReflow",function(a){var b=c.length;return c.push(a),function(){c.splice(b,1)}}),a.decorator("$animate",["$delegate","$timeout","$browser","$$rAF",function(a,d,e,f){var g={queue:[],cancel:a.cancel,enabled:a.enabled,triggerCallbackEvents:function(){f.flush()},triggerCallbackPromise:function(){d.flush(0)},triggerCallbacks:function(){this.triggerCallbackEvents(),this.triggerCallbackPromise()},triggerReflow:function(){b.forEach(c,function(a){a()}),c=[]}};return b.forEach(["animate","enter","leave","move","addClass","removeClass","setClass"],function(b){g[b]=function(){return g.queue.push({event:b,element:arguments[0],options:arguments[arguments.length-1],args:arguments}),a[b].apply(a,arguments)}}),g}])}]),b.mock.dump=function(a){function c(a){var e;return b.isElement(a)?(a=b.element(a),e=b.element("
"),b.forEach(a,function(a){e.append(b.element(a).clone())}),e=e.html()):b.isArray(a)?(e=[],b.forEach(a,function(a){e.push(c(a))}),e="[ "+e.join(", ")+" ]"):e=b.isObject(a)?b.isFunction(a.$eval)&&b.isFunction(a.$apply)?d(a):a instanceof Error?a.stack||""+a.name+": "+a.message:b.toJson(a,!0):String(a),e}function d(a,c){c=c||" ";var e=[c+"Scope("+a.$id+"): {"];for(var f in a)Object.prototype.hasOwnProperty.call(a,f)&&!f.match(/^(\$|this)/)&&e.push(" "+f+": "+b.toJson(a[f]));for(var g=a.$$childHead;g;)e.push(d(g,c+" ")),g=g.$$nextSibling;return e.push("}"),e.join("\n"+c)}return c(a)},b.mock.$HttpBackendProvider=function(){this.$get=["$rootScope","$timeout",g]},b.mock.$TimeoutDecorator=["$delegate","$browser",function(a,c){function d(a){var c=[];return b.forEach(a,function(a){c.push("{id: "+a.id+", time: "+a.time+"}")}),c.join(", ")}return a.flush=function(a){c.defer.flush(a)},a.verifyNoPendingTasks=function(){if(c.deferredFns.length)throw new Error("Deferred tasks to flush ("+c.deferredFns.length+"): "+d(c.deferredFns))},a}],b.mock.$RAFDecorator=["$delegate",function(a){var b=[],c=function(a){var c=b.length;return b.push(a),function(){b.splice(c,1)}};return c.supported=a.supported,c.flush=function(){if(0===b.length)throw new Error("No rAF callbacks present");for(var a=b.length,c=0;a>c;c++)b[c]();b=b.slice(c)},c}],b.mock.$RootElementProvider=function(){this.$get=function(){return b.element("
")}},b.mock.$ControllerDecorator=["$delegate",function(a){return function(c,d,e,f){if(e&&"object"==typeof e){var g=a(c,d,!0,f);return b.extend(g.instance,e),g()}return a(c,d,e,f)}}],b.module("ngMock",["ng"]).provider({$browser:b.mock.$BrowserProvider,$exceptionHandler:b.mock.$ExceptionHandlerProvider,$log:b.mock.$LogProvider,$interval:b.mock.$IntervalProvider,$httpBackend:b.mock.$HttpBackendProvider,$rootElement:b.mock.$RootElementProvider}).config(["$provide",function(a){a.decorator("$timeout",b.mock.$TimeoutDecorator),a.decorator("$$rAF",b.mock.$RAFDecorator),a.decorator("$rootScope",b.mock.$RootScopeDecorator),a.decorator("$controller",b.mock.$ControllerDecorator)}]),b.module("ngMockE2E",["ng"]).config(["$provide",function(a){a.decorator("$httpBackend",b.mock.e2e.$httpBackendDecorator)}]),b.mock.e2e={},b.mock.e2e.$httpBackendDecorator=["$rootScope","$timeout","$delegate","$browser",g],b.mock.$RootScopeDecorator=["$delegate",function(a){function b(){for(var a,b=0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=1,c.push(a.$$childHead),a=a.$$nextSibling;return b}function c(){for(var a,b=this.$$watchers?this.$$watchers.length:0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=a.$$watchers?a.$$watchers.length:0,c.push(a.$$childHead),a=a.$$nextSibling;return b}var d=Object.getPrototypeOf(a);return d.$countChildScopes=b,d.$countWatchers=c,a}],a.jasmine||a.mocha){var k=null,l=[],m=function(){return!!k};b.mock.$$annotate=b.injector.$$annotate,b.injector.$$annotate=function(a){return"function"!=typeof a||a.$inject||l.push(a),b.mock.$$annotate.apply(this,arguments)},(a.beforeEach||a.setup)(function(){l=[],k=this}),(a.afterEach||a.teardown)(function(){var a=k.$injector;l.forEach(function(a){delete a.$inject}),b.forEach(k.$modules,function(a){a&&a.$$hashKey&&(a.$$hashKey=c)}),k.$injector=null,k.$modules=null,k=null,a&&a.get("$rootElement").off(),b.forEach(b.element.fragments,function(a,c){delete b.element.fragments[c]}),i.$$lastInstance=null,b.forEach(b.callbacks,function(a,c){delete b.callbacks[c]}),b.callbacks.counter=0}),a.module=b.mock.module=function(){function a(){if(k.$injector)throw new Error("Injector already created, can not register a module!");var a=k.$modules||(k.$modules=[]);b.forEach(c,function(c){b.isObject(c)&&!b.isArray(c)?a.push(function(a){b.forEach(c,function(b,c){a.value(c,b)})}):a.push(c)})}var c=Array.prototype.slice.call(arguments,0);return m()?a():a};var n=function(a,b){this.message=a.message,this.name=a.name,a.line&&(this.line=a.line),a.sourceId&&(this.sourceId=a.sourceId),a.stack&&b&&(this.stack=a.stack+"\n"+b.stack),a.stackArray&&(this.stackArray=a.stackArray)};n.prototype.toString=Error.prototype.toString,a.inject=b.mock.inject=function(){function a(){var a=k.$modules||[],e=!!k.$injectorStrict;a.unshift("ngMock"),a.unshift("ng");var f=k.$injector;f||(e&&b.forEach(a,function(a){"function"==typeof a&&b.injector.$$annotate(a)}),f=k.$injector=b.injector(a,e),k.$injectorStrict=e);for(var g=0,h=c.length;h>g;g++){k.$injectorStrict&&f.annotate(c[g]);try{f.invoke(c[g]||b.noop,this)}catch(i){if(i.stack&&d)throw new n(i,d);throw i}finally{d=null}}}var c=Array.prototype.slice.call(arguments,0),d=new Error("Declaration Location");return m()?a.call(k):a},b.mock.inject.strictDi=function(a){function b(){if(a!==k.$injectorStrict){if(k.$injector)throw new Error("Injector already created, can not modify strict annotations");k.$injectorStrict=a; +}}return a=arguments.length?!!a:!0,m()?b():b}}}(window,window.angular),!function(a,b,c){"use strict";function d(a){var b;if(b=a.match(j)){var c=new Date(0),d=0,f=0;return b[9]&&(d=e(b[9]+b[10]),f=e(b[9]+b[11])),c.setUTCFullYear(e(b[1]),e(b[2])-1,e(b[3])),c.setUTCHours(e(b[4]||0)-d,e(b[5]||0)-f,e(b[6]||0),e(b[7]||0)),c}return a}function e(a){return parseInt(a,10)}function f(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.lengtha;a++)if(n[a]===e){n.splice(a,1),j(-1,c,"");break}}return!f&&q&&(q.then?q.then(i):d(i,q)),e}var u=new i,v=m[0],w=!1;if(v&&v.match(a,g)){if(!v.matchData(h))throw new Error("Expected "+v+" with different data\nEXPECTED: "+s(v.data)+"\nGOT: "+h);if(!v.matchHeaders(k))throw new Error("Expected "+v+" with different headers\nEXPECTED: "+s(v.headers)+"\nGOT: "+s(k));if(m.shift(),v.response)return void n.push(t(v));w=!0}for(var x,y=-1;x=l[++y];)if(x.match(a,g,h,k||{})){if(x.response)(f?f.defer:o)(t(x));else{if(!x.passThrough)throw new Error("No response defined !");e(a,g,h,j,k,q,r)}return}throw w?new Error("No response defined !"):new Error("Unexpected request: "+a+" "+g+"\n"+(v?"Expected "+v:"No more request expected"))}function k(a){b.forEach(["GET","DELETE","JSONP","HEAD"],function(b){j[a+b]=function(d,e){return j[a](b,d,c,e)}}),b.forEach(["PUT","POST","PATCH"],function(b){j[a+b]=function(c,d,e){return j[a](b,c,d,e)}})}var l=[],m=[],n=[],o=b.bind(n,n.push),p=b.copy;return j.when=function(a,b,d,e){var i=new h(a,b,d,e),j={respond:function(a,b,d,e){return i.passThrough=c,i.response=g(a,b,d,e),j}};return f&&(j.passThrough=function(){return i.response=c,i.passThrough=!0,j}),l.push(i),j},k("when"),j.expect=function(a,b,c,d){var e=new h(a,b,c,d),f={respond:function(a,b,c,d){return e.response=g(a,b,c,d),f}};return m.push(e),f},k("expect"),j.flush=function(c,d){if(d!==!1&&a.$digest(),!n.length)throw new Error("No pending request to flush !");if(b.isDefined(c)&&null!==c)for(;c--;){if(!n.length)throw new Error("No more pending request to flush !");n.shift()()}else for(;n.length;)n.shift()();j.verifyNoOutstandingExpectation(d)},j.verifyNoOutstandingExpectation=function(b){if(b!==!1&&a.$digest(),m.length)throw new Error("Unsatisfied requests: "+m.join(", "))},j.verifyNoOutstandingRequest=function(){if(n.length)throw new Error("Unflushed requests: "+n.length)},j.resetExpectations=function(){m.length=0,n.length=0},j}function h(a,c,d,e){this.data=d,this.headers=e,this.match=function(c,d,e,f){return a!=c?!1:this.matchUrl(d)?b.isDefined(e)&&!this.matchData(e)?!1:b.isDefined(f)&&!this.matchHeaders(f)?!1:!0:!1},this.matchUrl=function(a){return c?b.isFunction(c.test)?c.test(a):b.isFunction(c)?c(a):c==a:!0},this.matchHeaders=function(a){return b.isUndefined(e)?!0:b.isFunction(e)?e(a):b.equals(e,a)},this.matchData=function(a){return b.isUndefined(d)?!0:d&&b.isFunction(d.test)?d.test(a):d&&b.isFunction(d)?d(a):d&&!b.isString(d)?b.equals(b.fromJson(b.toJson(d)),b.fromJson(a)):d==a},this.toString=function(){return a+" "+c}}function i(){i.$$lastInstance=this,this.open=function(a,b,c){this.$$method=a,this.$$url=b,this.$$async=c,this.$$reqHeaders={},this.$$respHeaders={}},this.send=function(a){this.$$data=a},this.setRequestHeader=function(a,b){this.$$reqHeaders[a]=b},this.getResponseHeader=function(a){var d=this.$$respHeaders[a];return d?d:(a=b.lowercase(a),(d=this.$$respHeaders[a])?d:(d=c,b.forEach(this.$$respHeaders,function(c,e){d||b.lowercase(e)!=a||(d=c)}),d))},this.getAllResponseHeaders=function(){var a=[];return b.forEach(this.$$respHeaders,function(b,c){a.push(c+": "+b)}),a.join("\n")},this.abort=b.noop}b.mock={},b.mock.$BrowserProvider=function(){this.$get=function(){return new b.mock.$Browser}},b.mock.$Browser=function(){var a=this;this.isMock=!0,a.$$url="http://server/",a.$$lastUrl=a.$$url,a.pollFns=[],a.$$completeOutstandingRequest=b.noop,a.$$incOutstandingRequestCount=b.noop,a.onUrlChange=function(b){return a.pollFns.push(function(){(a.$$lastUrl!==a.$$url||a.$$state!==a.$$lastState)&&(a.$$lastUrl=a.$$url,a.$$lastState=a.$$state,b(a.$$url,a.$$state))}),b},a.$$applicationDestroyed=b.noop,a.$$checkUrlChange=b.noop,a.deferredFns=[],a.deferredNextId=0,a.defer=function(b,c){return c=c||0,a.deferredFns.push({time:a.defer.now+c,fn:b,id:a.deferredNextId}),a.deferredFns.sort(function(a,b){return a.time-b.time}),a.deferredNextId++},a.defer.now=0,a.defer.cancel=function(d){var e;return b.forEach(a.deferredFns,function(a,b){a.id===d&&(e=b)}),e!==c?(a.deferredFns.splice(e,1),!0):!1},a.defer.flush=function(c){if(b.isDefined(c))a.defer.now+=c;else{if(!a.deferredFns.length)throw new Error("No deferred tasks to be flushed");a.defer.now=a.deferredFns[a.deferredFns.length-1].time}for(;a.deferredFns.length&&a.deferredFns[0].time<=a.defer.now;)a.deferredFns.shift().fn()},a.$$baseHref="/",a.baseHref=function(){return this.$$baseHref}},b.mock.$Browser.prototype={poll:function(){b.forEach(this.pollFns,function(a){a()})},url:function(a,c,d){return b.isUndefined(d)&&(d=null),a?(this.$$url=a,this.$$state=b.copy(d),this):this.$$url},state:function(){return this.$$state},notifyWhenNoOutstandingRequests:function(a){a()}},b.mock.$ExceptionHandlerProvider=function(){var a;this.mode=function(b){switch(b){case"log":case"rethrow":var c=[];a=function(a){if(1==arguments.length?c.push(a):c.push([].slice.call(arguments,0)),"rethrow"===b)throw a},a.errors=c;break;default:throw new Error("Unknown mode '"+b+"', only 'log'/'rethrow' modes are allowed!")}},this.$get=function(){return a},this.mode("rethrow")},b.mock.$LogProvider=function(){function a(a,b,c){return a.concat(Array.prototype.slice.call(b,c))}var c=!0;this.debugEnabled=function(a){return b.isDefined(a)?(c=a,this):c},this.$get=function(){var d={log:function(){d.log.logs.push(a([],arguments,0))},warn:function(){d.warn.logs.push(a([],arguments,0))},info:function(){d.info.logs.push(a([],arguments,0))},error:function(){d.error.logs.push(a([],arguments,0))},debug:function(){c&&d.debug.logs.push(a([],arguments,0))}};return d.reset=function(){d.log.logs=[],d.info.logs=[],d.warn.logs=[],d.error.logs=[],d.debug.logs=[]},d.assertEmpty=function(){var a=[];if(b.forEach(["error","warn","info","log","debug"],function(c){b.forEach(d[c].logs,function(d){b.forEach(d,function(b){a.push("MOCK $log ("+c+"): "+String(b)+"\n"+(b.stack||""))})})}),a.length)throw a.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected log message was not checked and removed:"),a.push(""),new Error(a.join("\n---------\n"))},d.reset(),d}},b.mock.$IntervalProvider=function(){this.$get=["$browser","$rootScope","$q","$$q",function(a,d,e,f){var g=[],h=0,i=0,j=function(j,k,l,m){function n(){if(s.notify(q++),l>0&&q>=l){var e;s.resolve(q),b.forEach(g,function(a,b){a.id===t.$$intervalId&&(e=b)}),e!==c&&g.splice(e,1)}r?a.defer.flush():d.$apply()}var o=arguments.length>4,p=o?Array.prototype.slice.call(arguments,4):[],q=0,r=b.isDefined(m)&&!m,s=(r?f:e).defer(),t=s.promise;return l=b.isDefined(l)?l:0,t.then(null,null,o?function(){j.apply(null,p)}:j),t.$$intervalId=h,g.push({nextTime:i+k,delay:k,fn:n,id:h,deferred:s}),g.sort(function(a,b){return a.nextTime-b.nextTime}),h++,t};return j.cancel=function(a){if(!a)return!1;var d;return b.forEach(g,function(b,c){b.id===a.$$intervalId&&(d=c)}),d!==c?(g[d].deferred.reject("canceled"),g.splice(d,1),!0):!1},j.flush=function(a){for(i+=a;g.length&&g[0].nextTime<=i;){var b=g[0];b.fn(),b.nextTime+=b.delay,g.sort(function(a,b){return a.nextTime-b.nextTime})}return a},j}]};var j=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;if(b.mock.TzDate=function(a,c){var e=new Date(0);if(b.isString(c)){var g=c;if(e.origDate=d(c),c=e.origDate.getTime(),isNaN(c))throw{name:"Illegal Argument",message:"Arg '"+g+"' passed into TzDate constructor is not a valid date string"}}else e.origDate=new Date(c);var h=new Date(c).getTimezoneOffset();e.offsetDiff=60*h*1e3-1e3*a*60*60,e.date=new Date(c+e.offsetDiff),e.getTime=function(){return e.date.getTime()-e.offsetDiff},e.toLocaleDateString=function(){return e.date.toLocaleDateString()},e.getFullYear=function(){return e.date.getFullYear()},e.getMonth=function(){return e.date.getMonth()},e.getDate=function(){return e.date.getDate()},e.getHours=function(){return e.date.getHours()},e.getMinutes=function(){return e.date.getMinutes()},e.getSeconds=function(){return e.date.getSeconds()},e.getMilliseconds=function(){return e.date.getMilliseconds()},e.getTimezoneOffset=function(){return 60*a},e.getUTCFullYear=function(){return e.origDate.getUTCFullYear()},e.getUTCMonth=function(){return e.origDate.getUTCMonth()},e.getUTCDate=function(){return e.origDate.getUTCDate()},e.getUTCHours=function(){return e.origDate.getUTCHours()},e.getUTCMinutes=function(){return e.origDate.getUTCMinutes()},e.getUTCSeconds=function(){return e.origDate.getUTCSeconds()},e.getUTCMilliseconds=function(){return e.origDate.getUTCMilliseconds()},e.getDay=function(){return e.date.getDay()},e.toISOString&&(e.toISOString=function(){return f(e.origDate.getUTCFullYear(),4)+"-"+f(e.origDate.getUTCMonth()+1,2)+"-"+f(e.origDate.getUTCDate(),2)+"T"+f(e.origDate.getUTCHours(),2)+":"+f(e.origDate.getUTCMinutes(),2)+":"+f(e.origDate.getUTCSeconds(),2)+"."+f(e.origDate.getUTCMilliseconds(),3)+"Z"});var i=["getUTCDay","getYear","setDate","setFullYear","setHours","setMilliseconds","setMinutes","setMonth","setSeconds","setTime","setUTCDate","setUTCFullYear","setUTCHours","setUTCMilliseconds","setUTCMinutes","setUTCMonth","setUTCSeconds","setYear","toDateString","toGMTString","toJSON","toLocaleFormat","toLocaleString","toLocaleTimeString","toSource","toString","toTimeString","toUTCString","valueOf"];return b.forEach(i,function(a){e[a]=function(){throw new Error("Method '"+a+"' is not implemented in the TzDate mock")}}),e},b.mock.TzDate.prototype=Date.prototype,b.mock.animate=b.module("ngAnimateMock",["ng"]).config(["$provide",function(a){var c=[];a.value("$$animateReflow",function(a){var b=c.length;return c.push(a),function(){c.splice(b,1)}}),a.decorator("$animate",["$delegate","$timeout","$browser","$$rAF",function(a,d,e,f){var g={queue:[],cancel:a.cancel,enabled:a.enabled,triggerCallbackEvents:function(){f.flush()},triggerCallbackPromise:function(){d.flush(0)},triggerCallbacks:function(){this.triggerCallbackEvents(),this.triggerCallbackPromise()},triggerReflow:function(){b.forEach(c,function(a){a()}),c=[]}};return b.forEach(["animate","enter","leave","move","addClass","removeClass","setClass"],function(b){g[b]=function(){return g.queue.push({event:b,element:arguments[0],options:arguments[arguments.length-1],args:arguments}),a[b].apply(a,arguments)}}),g}])}]),b.mock.dump=function(a){function c(a){var e;return b.isElement(a)?(a=b.element(a),e=b.element("
"),b.forEach(a,function(a){e.append(b.element(a).clone())}),e=e.html()):b.isArray(a)?(e=[],b.forEach(a,function(a){e.push(c(a))}),e="[ "+e.join(", ")+" ]"):e=b.isObject(a)?b.isFunction(a.$eval)&&b.isFunction(a.$apply)?d(a):a instanceof Error?a.stack||""+a.name+": "+a.message:b.toJson(a,!0):String(a),e}function d(a,c){c=c||" ";var e=[c+"Scope("+a.$id+"): {"];for(var f in a)Object.prototype.hasOwnProperty.call(a,f)&&!f.match(/^(\$|this)/)&&e.push(" "+f+": "+b.toJson(a[f]));for(var g=a.$$childHead;g;)e.push(d(g,c+" ")),g=g.$$nextSibling;return e.push("}"),e.join("\n"+c)}return c(a)},b.mock.$HttpBackendProvider=function(){this.$get=["$rootScope","$timeout",g]},b.mock.$TimeoutDecorator=["$delegate","$browser",function(a,c){function d(a){var c=[];return b.forEach(a,function(a){c.push("{id: "+a.id+", time: "+a.time+"}")}),c.join(", ")}return a.flush=function(a){c.defer.flush(a)},a.verifyNoPendingTasks=function(){if(c.deferredFns.length)throw new Error("Deferred tasks to flush ("+c.deferredFns.length+"): "+d(c.deferredFns))},a}],b.mock.$RAFDecorator=["$delegate",function(a){var b=[],c=function(a){var c=b.length;return b.push(a),function(){b.splice(c,1)}};return c.supported=a.supported,c.flush=function(){if(0===b.length)throw new Error("No rAF callbacks present");for(var a=b.length,c=0;a>c;c++)b[c]();b=b.slice(c)},c}],b.mock.$RootElementProvider=function(){this.$get=function(){return b.element("
")}},b.mock.$ControllerDecorator=["$delegate",function(a){return function(c,d,e,f){if(e&&"object"==typeof e){var g=a(c,d,!0,f);return b.extend(g.instance,e),g()}return a(c,d,e,f)}}],b.module("ngMock",["ng"]).provider({$browser:b.mock.$BrowserProvider,$exceptionHandler:b.mock.$ExceptionHandlerProvider,$log:b.mock.$LogProvider,$interval:b.mock.$IntervalProvider,$httpBackend:b.mock.$HttpBackendProvider,$rootElement:b.mock.$RootElementProvider}).config(["$provide",function(a){a.decorator("$timeout",b.mock.$TimeoutDecorator),a.decorator("$$rAF",b.mock.$RAFDecorator),a.decorator("$rootScope",b.mock.$RootScopeDecorator),a.decorator("$controller",b.mock.$ControllerDecorator)}]),b.module("ngMockE2E",["ng"]).config(["$provide",function(a){a.decorator("$httpBackend",b.mock.e2e.$httpBackendDecorator)}]),b.mock.e2e={},b.mock.e2e.$httpBackendDecorator=["$rootScope","$timeout","$delegate","$browser",g],b.mock.$RootScopeDecorator=["$delegate",function(a){function b(){for(var a,b=0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=1,c.push(a.$$childHead),a=a.$$nextSibling;return b}function c(){for(var a,b=this.$$watchers?this.$$watchers.length:0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=a.$$watchers?a.$$watchers.length:0,c.push(a.$$childHead),a=a.$$nextSibling;return b}var d=Object.getPrototypeOf(a);return d.$countChildScopes=b,d.$countWatchers=c,a}],a.jasmine||a.mocha){var k=null,l=[],m=function(){return!!k};b.mock.$$annotate=b.injector.$$annotate,b.injector.$$annotate=function(a){return"function"!=typeof a||a.$inject||l.push(a),b.mock.$$annotate.apply(this,arguments)},(a.beforeEach||a.setup)(function(){l=[],k=this}),(a.afterEach||a.teardown)(function(){var a=k.$injector;l.forEach(function(a){delete a.$inject}),b.forEach(k.$modules,function(a){a&&a.$$hashKey&&(a.$$hashKey=c)}),k.$injector=null,k.$modules=null,k=null,a&&a.get("$rootElement").off(),b.forEach(b.element.fragments,function(a,c){delete b.element.fragments[c]}),i.$$lastInstance=null,b.forEach(b.callbacks,function(a,c){delete b.callbacks[c]}),b.callbacks.counter=0}),a.module=b.mock.module=function(){function a(){if(k.$injector)throw new Error("Injector already created, can not register a module!");var a=k.$modules||(k.$modules=[]);b.forEach(c,function(c){b.isObject(c)&&!b.isArray(c)?a.push(function(a){b.forEach(c,function(b,c){a.value(c,b)})}):a.push(c)})}var c=Array.prototype.slice.call(arguments,0);return m()?a():a};var n=function(a,b){this.message=a.message,this.name=a.name,a.line&&(this.line=a.line),a.sourceId&&(this.sourceId=a.sourceId),a.stack&&b&&(this.stack=a.stack+"\n"+b.stack),a.stackArray&&(this.stackArray=a.stackArray)};n.prototype.toString=Error.prototype.toString,a.inject=b.mock.inject=function(){function a(){var a=k.$modules||[],e=!!k.$injectorStrict;a.unshift("ngMock"),a.unshift("ng");var f=k.$injector;f||(e&&b.forEach(a,function(a){"function"==typeof a&&b.injector.$$annotate(a)}),f=k.$injector=b.injector(a,e),k.$injectorStrict=e);for(var g=0,h=c.length;h>g;g++){k.$injectorStrict&&f.annotate(c[g]);try{f.invoke(c[g]||b.noop,this)}catch(i){if(i.stack&&d)throw new n(i,d);throw i}finally{d=null}}}var c=Array.prototype.slice.call(arguments,0),d=new Error("Declaration Location");return m()?a.call(k):a},b.mock.inject.strictDi=function(a){function b(){if(a!==k.$injectorStrict){if(k.$injector)throw new Error("Injector already created, can not modify strict annotations");k.$injectorStrict=a}}return a=arguments.length?!!a:!0,m()?b():b}}}(window,window.angular),!function(a,b,c){"use strict";function d(a){var b;if(b=a.match(j)){var c=new Date(0),d=0,f=0;return b[9]&&(d=e(b[9]+b[10]),f=e(b[9]+b[11])),c.setUTCFullYear(e(b[1]),e(b[2])-1,e(b[3])),c.setUTCHours(e(b[4]||0)-d,e(b[5]||0)-f,e(b[6]||0),e(b[7]||0)),c}return a}function e(a){return parseInt(a,10)}function f(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.lengtha;a++)if(n[a]===e){n.splice(a,1),j(-1,c,"");break}}return!f&&q&&(q.then?q.then(i):d(i,q)),e}var u=new i,v=m[0],w=!1;if(v&&v.match(a,g)){if(!v.matchData(h))throw new Error("Expected "+v+" with different data\nEXPECTED: "+s(v.data)+"\nGOT: "+h);if(!v.matchHeaders(k))throw new Error("Expected "+v+" with different headers\nEXPECTED: "+s(v.headers)+"\nGOT: "+s(k));if(m.shift(),v.response)return void n.push(t(v));w=!0}for(var x,y=-1;x=l[++y];)if(x.match(a,g,h,k||{})){if(x.response)(f?f.defer:o)(t(x));else{if(!x.passThrough)throw new Error("No response defined !");e(a,g,h,j,k,q,r)}return}throw w?new Error("No response defined !"):new Error("Unexpected request: "+a+" "+g+"\n"+(v?"Expected "+v:"No more request expected"))}function k(a){b.forEach(["GET","DELETE","JSONP","HEAD"],function(b){j[a+b]=function(d,e){return j[a](b,d,c,e)}}),b.forEach(["PUT","POST","PATCH"],function(b){j[a+b]=function(c,d,e){return j[a](b,c,d,e)}})}var l=[],m=[],n=[],o=b.bind(n,n.push),p=b.copy;return j.when=function(a,b,d,e){var i=new h(a,b,d,e),j={respond:function(a,b,d,e){return i.passThrough=c,i.response=g(a,b,d,e),j}};return f&&(j.passThrough=function(){return i.response=c,i.passThrough=!0,j}),l.push(i),j},k("when"),j.expect=function(a,b,c,d){var e=new h(a,b,c,d),f={respond:function(a,b,c,d){return e.response=g(a,b,c,d),f}};return m.push(e),f},k("expect"),j.flush=function(c,d){if(d!==!1&&a.$digest(),!n.length)throw new Error("No pending request to flush !");if(b.isDefined(c)&&null!==c)for(;c--;){if(!n.length)throw new Error("No more pending request to flush !");n.shift()()}else for(;n.length;)n.shift()();j.verifyNoOutstandingExpectation(d)},j.verifyNoOutstandingExpectation=function(b){if(b!==!1&&a.$digest(),m.length)throw new Error("Unsatisfied requests: "+m.join(", "))},j.verifyNoOutstandingRequest=function(){if(n.length)throw new Error("Unflushed requests: "+n.length)},j.resetExpectations=function(){m.length=0,n.length=0},j}function h(a,c,d,e){this.data=d,this.headers=e,this.match=function(c,d,e,f){return a!=c?!1:this.matchUrl(d)?b.isDefined(e)&&!this.matchData(e)?!1:b.isDefined(f)&&!this.matchHeaders(f)?!1:!0:!1},this.matchUrl=function(a){return c?b.isFunction(c.test)?c.test(a):b.isFunction(c)?c(a):c==a:!0},this.matchHeaders=function(a){return b.isUndefined(e)?!0:b.isFunction(e)?e(a):b.equals(e,a)},this.matchData=function(a){return b.isUndefined(d)?!0:d&&b.isFunction(d.test)?d.test(a):d&&b.isFunction(d)?d(a):d&&!b.isString(d)?b.equals(b.fromJson(b.toJson(d)),b.fromJson(a)):d==a},this.toString=function(){return a+" "+c}}function i(){i.$$lastInstance=this,this.open=function(a,b,c){this.$$method=a,this.$$url=b,this.$$async=c,this.$$reqHeaders={},this.$$respHeaders={}},this.send=function(a){this.$$data=a},this.setRequestHeader=function(a,b){this.$$reqHeaders[a]=b},this.getResponseHeader=function(a){var d=this.$$respHeaders[a];return d?d:(a=b.lowercase(a),(d=this.$$respHeaders[a])?d:(d=c,b.forEach(this.$$respHeaders,function(c,e){d||b.lowercase(e)!=a||(d=c)}),d))},this.getAllResponseHeaders=function(){var a=[];return b.forEach(this.$$respHeaders,function(b,c){a.push(c+": "+b)}),a.join("\n")},this.abort=b.noop}b.mock={},b.mock.$BrowserProvider=function(){this.$get=function(){return new b.mock.$Browser}},b.mock.$Browser=function(){var a=this;this.isMock=!0,a.$$url="http://server/",a.$$lastUrl=a.$$url,a.pollFns=[],a.$$completeOutstandingRequest=b.noop,a.$$incOutstandingRequestCount=b.noop,a.onUrlChange=function(b){return a.pollFns.push(function(){(a.$$lastUrl!==a.$$url||a.$$state!==a.$$lastState)&&(a.$$lastUrl=a.$$url,a.$$lastState=a.$$state,b(a.$$url,a.$$state))}),b},a.$$applicationDestroyed=b.noop,a.$$checkUrlChange=b.noop,a.deferredFns=[],a.deferredNextId=0,a.defer=function(b,c){return c=c||0,a.deferredFns.push({time:a.defer.now+c,fn:b,id:a.deferredNextId}),a.deferredFns.sort(function(a,b){return a.time-b.time}),a.deferredNextId++},a.defer.now=0,a.defer.cancel=function(d){var e;return b.forEach(a.deferredFns,function(a,b){a.id===d&&(e=b)}),e!==c?(a.deferredFns.splice(e,1),!0):!1},a.defer.flush=function(c){if(b.isDefined(c))a.defer.now+=c;else{if(!a.deferredFns.length)throw new Error("No deferred tasks to be flushed");a.defer.now=a.deferredFns[a.deferredFns.length-1].time}for(;a.deferredFns.length&&a.deferredFns[0].time<=a.defer.now;)a.deferredFns.shift().fn()},a.$$baseHref="/",a.baseHref=function(){return this.$$baseHref}},b.mock.$Browser.prototype={poll:function(){b.forEach(this.pollFns,function(a){a()})},url:function(a,c,d){return b.isUndefined(d)&&(d=null),a?(this.$$url=a,this.$$state=b.copy(d),this):this.$$url},state:function(){return this.$$state},notifyWhenNoOutstandingRequests:function(a){a()}},b.mock.$ExceptionHandlerProvider=function(){var a;this.mode=function(b){switch(b){case"log":case"rethrow":var c=[];a=function(a){if(1==arguments.length?c.push(a):c.push([].slice.call(arguments,0)),"rethrow"===b)throw a},a.errors=c;break;default:throw new Error("Unknown mode '"+b+"', only 'log'/'rethrow' modes are allowed!")}},this.$get=function(){return a},this.mode("rethrow")},b.mock.$LogProvider=function(){function a(a,b,c){return a.concat(Array.prototype.slice.call(b,c))}var c=!0;this.debugEnabled=function(a){return b.isDefined(a)?(c=a,this):c},this.$get=function(){var d={log:function(){d.log.logs.push(a([],arguments,0))},warn:function(){d.warn.logs.push(a([],arguments,0))},info:function(){d.info.logs.push(a([],arguments,0))},error:function(){d.error.logs.push(a([],arguments,0))},debug:function(){c&&d.debug.logs.push(a([],arguments,0))}};return d.reset=function(){d.log.logs=[],d.info.logs=[],d.warn.logs=[],d.error.logs=[],d.debug.logs=[]},d.assertEmpty=function(){var a=[];if(b.forEach(["error","warn","info","log","debug"],function(c){b.forEach(d[c].logs,function(d){b.forEach(d,function(b){a.push("MOCK $log ("+c+"): "+String(b)+"\n"+(b.stack||""))})})}),a.length)throw a.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected log message was not checked and removed:"),a.push(""),new Error(a.join("\n---------\n"))},d.reset(),d}},b.mock.$IntervalProvider=function(){this.$get=["$browser","$rootScope","$q","$$q",function(a,d,e,f){var g=[],h=0,i=0,j=function(j,k,l,m){function n(){if(s.notify(q++),l>0&&q>=l){var e;s.resolve(q),b.forEach(g,function(a,b){a.id===t.$$intervalId&&(e=b)}),e!==c&&g.splice(e,1)}r?a.defer.flush():d.$apply()}var o=arguments.length>4,p=o?Array.prototype.slice.call(arguments,4):[],q=0,r=b.isDefined(m)&&!m,s=(r?f:e).defer(),t=s.promise;return l=b.isDefined(l)?l:0,t.then(null,null,o?function(){j.apply(null,p)}:j),t.$$intervalId=h,g.push({nextTime:i+k,delay:k,fn:n,id:h,deferred:s}),g.sort(function(a,b){return a.nextTime-b.nextTime}),h++,t};return j.cancel=function(a){if(!a)return!1;var d;return b.forEach(g,function(b,c){b.id===a.$$intervalId&&(d=c)}),d!==c?(g[d].deferred.reject("canceled"),g.splice(d,1),!0):!1},j.flush=function(a){for(i+=a;g.length&&g[0].nextTime<=i;){var b=g[0];b.fn(),b.nextTime+=b.delay,g.sort(function(a,b){return a.nextTime-b.nextTime})}return a},j}]};var j=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;if(b.mock.TzDate=function(a,c){var e=new Date(0);if(b.isString(c)){var g=c;if(e.origDate=d(c),c=e.origDate.getTime(),isNaN(c))throw{name:"Illegal Argument",message:"Arg '"+g+"' passed into TzDate constructor is not a valid date string"}}else e.origDate=new Date(c);var h=new Date(c).getTimezoneOffset();e.offsetDiff=60*h*1e3-1e3*a*60*60,e.date=new Date(c+e.offsetDiff),e.getTime=function(){return e.date.getTime()-e.offsetDiff},e.toLocaleDateString=function(){return e.date.toLocaleDateString()},e.getFullYear=function(){return e.date.getFullYear()},e.getMonth=function(){return e.date.getMonth()},e.getDate=function(){return e.date.getDate()},e.getHours=function(){return e.date.getHours()},e.getMinutes=function(){return e.date.getMinutes()},e.getSeconds=function(){return e.date.getSeconds()},e.getMilliseconds=function(){return e.date.getMilliseconds()},e.getTimezoneOffset=function(){return 60*a},e.getUTCFullYear=function(){return e.origDate.getUTCFullYear()},e.getUTCMonth=function(){return e.origDate.getUTCMonth()},e.getUTCDate=function(){return e.origDate.getUTCDate()},e.getUTCHours=function(){return e.origDate.getUTCHours()},e.getUTCMinutes=function(){return e.origDate.getUTCMinutes()},e.getUTCSeconds=function(){return e.origDate.getUTCSeconds()},e.getUTCMilliseconds=function(){return e.origDate.getUTCMilliseconds()},e.getDay=function(){return e.date.getDay()},e.toISOString&&(e.toISOString=function(){return f(e.origDate.getUTCFullYear(),4)+"-"+f(e.origDate.getUTCMonth()+1,2)+"-"+f(e.origDate.getUTCDate(),2)+"T"+f(e.origDate.getUTCHours(),2)+":"+f(e.origDate.getUTCMinutes(),2)+":"+f(e.origDate.getUTCSeconds(),2)+"."+f(e.origDate.getUTCMilliseconds(),3)+"Z"});var i=["getUTCDay","getYear","setDate","setFullYear","setHours","setMilliseconds","setMinutes","setMonth","setSeconds","setTime","setUTCDate","setUTCFullYear","setUTCHours","setUTCMilliseconds","setUTCMinutes","setUTCMonth","setUTCSeconds","setYear","toDateString","toGMTString","toJSON","toLocaleFormat","toLocaleString","toLocaleTimeString","toSource","toString","toTimeString","toUTCString","valueOf"];return b.forEach(i,function(a){e[a]=function(){throw new Error("Method '"+a+"' is not implemented in the TzDate mock")}}),e},b.mock.TzDate.prototype=Date.prototype,b.mock.animate=b.module("ngAnimateMock",["ng"]).config(["$provide",function(a){var c=[];a.value("$$animateReflow",function(a){var b=c.length;return c.push(a),function(){c.splice(b,1)}}),a.decorator("$animate",["$delegate","$timeout","$browser","$$rAF",function(a,d,e,f){var g={queue:[],cancel:a.cancel,enabled:a.enabled,triggerCallbackEvents:function(){f.flush()},triggerCallbackPromise:function(){d.flush(0)},triggerCallbacks:function(){this.triggerCallbackEvents(),this.triggerCallbackPromise()},triggerReflow:function(){b.forEach(c,function(a){a()}),c=[]}};return b.forEach(["animate","enter","leave","move","addClass","removeClass","setClass"],function(b){g[b]=function(){return g.queue.push({event:b,element:arguments[0],options:arguments[arguments.length-1],args:arguments}),a[b].apply(a,arguments)}}),g}])}]),b.mock.dump=function(a){function c(a){var e;return b.isElement(a)?(a=b.element(a),e=b.element("
"),b.forEach(a,function(a){e.append(b.element(a).clone())}),e=e.html()):b.isArray(a)?(e=[],b.forEach(a,function(a){e.push(c(a))}),e="[ "+e.join(", ")+" ]"):e=b.isObject(a)?b.isFunction(a.$eval)&&b.isFunction(a.$apply)?d(a):a instanceof Error?a.stack||""+a.name+": "+a.message:b.toJson(a,!0):String(a),e}function d(a,c){c=c||" ";var e=[c+"Scope("+a.$id+"): {"];for(var f in a)Object.prototype.hasOwnProperty.call(a,f)&&!f.match(/^(\$|this)/)&&e.push(" "+f+": "+b.toJson(a[f]));for(var g=a.$$childHead;g;)e.push(d(g,c+" ")),g=g.$$nextSibling;return e.push("}"),e.join("\n"+c)}return c(a)},b.mock.$HttpBackendProvider=function(){this.$get=["$rootScope","$timeout",g]},b.mock.$TimeoutDecorator=["$delegate","$browser",function(a,c){function d(a){var c=[];return b.forEach(a,function(a){c.push("{id: "+a.id+", time: "+a.time+"}")}),c.join(", ")}return a.flush=function(a){c.defer.flush(a)},a.verifyNoPendingTasks=function(){if(c.deferredFns.length)throw new Error("Deferred tasks to flush ("+c.deferredFns.length+"): "+d(c.deferredFns))},a}],b.mock.$RAFDecorator=["$delegate",function(a){var b=[],c=function(a){var c=b.length;return b.push(a),function(){b.splice(c,1)}};return c.supported=a.supported,c.flush=function(){if(0===b.length)throw new Error("No rAF callbacks present");for(var a=b.length,c=0;a>c;c++)b[c]();b=b.slice(c)},c}],b.mock.$RootElementProvider=function(){this.$get=function(){return b.element("
")}},b.mock.$ControllerDecorator=["$delegate",function(a){return function(c,d,e,f){if(e&&"object"==typeof e){var g=a(c,d,!0,f);return b.extend(g.instance,e),g()}return a(c,d,e,f)}}],b.module("ngMock",["ng"]).provider({$browser:b.mock.$BrowserProvider,$exceptionHandler:b.mock.$ExceptionHandlerProvider,$log:b.mock.$LogProvider,$interval:b.mock.$IntervalProvider,$httpBackend:b.mock.$HttpBackendProvider,$rootElement:b.mock.$RootElementProvider}).config(["$provide",function(a){a.decorator("$timeout",b.mock.$TimeoutDecorator),a.decorator("$$rAF",b.mock.$RAFDecorator),a.decorator("$rootScope",b.mock.$RootScopeDecorator),a.decorator("$controller",b.mock.$ControllerDecorator)}]),b.module("ngMockE2E",["ng"]).config(["$provide",function(a){a.decorator("$httpBackend",b.mock.e2e.$httpBackendDecorator)}]),b.mock.e2e={},b.mock.e2e.$httpBackendDecorator=["$rootScope","$timeout","$delegate","$browser",g],b.mock.$RootScopeDecorator=["$delegate",function(a){function b(){for(var a,b=0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=1,c.push(a.$$childHead),a=a.$$nextSibling;return b}function c(){for(var a,b=this.$$watchers?this.$$watchers.length:0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=a.$$watchers?a.$$watchers.length:0,c.push(a.$$childHead),a=a.$$nextSibling;return b}var d=Object.getPrototypeOf(a);return d.$countChildScopes=b,d.$countWatchers=c,a}],a.jasmine||a.mocha){var k=null,l=[],m=function(){return!!k};b.mock.$$annotate=b.injector.$$annotate,b.injector.$$annotate=function(a){return"function"!=typeof a||a.$inject||l.push(a),b.mock.$$annotate.apply(this,arguments)},(a.beforeEach||a.setup)(function(){l=[],k=this}),(a.afterEach||a.teardown)(function(){var a=k.$injector;l.forEach(function(a){delete a.$inject}),b.forEach(k.$modules,function(a){a&&a.$$hashKey&&(a.$$hashKey=c)}),k.$injector=null,k.$modules=null,k=null,a&&a.get("$rootElement").off(),b.forEach(b.element.fragments,function(a,c){delete b.element.fragments[c]}),i.$$lastInstance=null,b.forEach(b.callbacks,function(a,c){delete b.callbacks[c]}),b.callbacks.counter=0}),a.module=b.mock.module=function(){function a(){if(k.$injector)throw new Error("Injector already created, can not register a module!");var a=k.$modules||(k.$modules=[]);b.forEach(c,function(c){b.isObject(c)&&!b.isArray(c)?a.push(function(a){b.forEach(c,function(b,c){a.value(c,b)})}):a.push(c)})}var c=Array.prototype.slice.call(arguments,0);return m()?a():a};var n=function(a,b){this.message=a.message,this.name=a.name,a.line&&(this.line=a.line),a.sourceId&&(this.sourceId=a.sourceId),a.stack&&b&&(this.stack=a.stack+"\n"+b.stack),a.stackArray&&(this.stackArray=a.stackArray)};n.prototype.toString=Error.prototype.toString,a.inject=b.mock.inject=function(){function a(){var a=k.$modules||[],e=!!k.$injectorStrict;a.unshift("ngMock"),a.unshift("ng");var f=k.$injector;f||(e&&b.forEach(a,function(a){"function"==typeof a&&b.injector.$$annotate(a)}),f=k.$injector=b.injector(a,e),k.$injectorStrict=e);for(var g=0,h=c.length;h>g;g++){k.$injectorStrict&&f.annotate(c[g]);try{f.invoke(c[g]||b.noop,this)}catch(i){if(i.stack&&d)throw new n(i,d);throw i}finally{d=null}}}var c=Array.prototype.slice.call(arguments,0),d=new Error("Declaration Location");return m()?a.call(k):a},b.mock.inject.strictDi=function(a){function b(){if(a!==k.$injectorStrict){if(k.$injector)throw new Error("Injector already created, can not modify strict annotations"); +k.$injectorStrict=a}}return a=arguments.length?!!a:!0,m()?b():b}}}(window,window.angular),!function(a,b,c){"use strict";function d(a){var b;if(b=a.match(j)){var c=new Date(0),d=0,f=0;return b[9]&&(d=e(b[9]+b[10]),f=e(b[9]+b[11])),c.setUTCFullYear(e(b[1]),e(b[2])-1,e(b[3])),c.setUTCHours(e(b[4]||0)-d,e(b[5]||0)-f,e(b[6]||0),e(b[7]||0)),c}return a}function e(a){return parseInt(a,10)}function f(a,b,c){var d="";for(0>a&&(d="-",a=-a),a=""+a;a.lengtha;a++)if(n[a]===e){n.splice(a,1),j(-1,c,"");break}}return!f&&q&&(q.then?q.then(i):d(i,q)),e}var u=new i,v=m[0],w=!1;if(v&&v.match(a,g)){if(!v.matchData(h))throw new Error("Expected "+v+" with different data\nEXPECTED: "+s(v.data)+"\nGOT: "+h);if(!v.matchHeaders(k))throw new Error("Expected "+v+" with different headers\nEXPECTED: "+s(v.headers)+"\nGOT: "+s(k));if(m.shift(),v.response)return void n.push(t(v));w=!0}for(var x,y=-1;x=l[++y];)if(x.match(a,g,h,k||{})){if(x.response)(f?f.defer:o)(t(x));else{if(!x.passThrough)throw new Error("No response defined !");e(a,g,h,j,k,q,r)}return}throw w?new Error("No response defined !"):new Error("Unexpected request: "+a+" "+g+"\n"+(v?"Expected "+v:"No more request expected"))}function k(a){b.forEach(["GET","DELETE","JSONP","HEAD"],function(b){j[a+b]=function(d,e){return j[a](b,d,c,e)}}),b.forEach(["PUT","POST","PATCH"],function(b){j[a+b]=function(c,d,e){return j[a](b,c,d,e)}})}var l=[],m=[],n=[],o=b.bind(n,n.push),p=b.copy;return j.when=function(a,b,d,e){var i=new h(a,b,d,e),j={respond:function(a,b,d,e){return i.passThrough=c,i.response=g(a,b,d,e),j}};return f&&(j.passThrough=function(){return i.response=c,i.passThrough=!0,j}),l.push(i),j},k("when"),j.expect=function(a,b,c,d){var e=new h(a,b,c,d),f={respond:function(a,b,c,d){return e.response=g(a,b,c,d),f}};return m.push(e),f},k("expect"),j.flush=function(c,d){if(d!==!1&&a.$digest(),!n.length)throw new Error("No pending request to flush !");if(b.isDefined(c)&&null!==c)for(;c--;){if(!n.length)throw new Error("No more pending request to flush !");n.shift()()}else for(;n.length;)n.shift()();j.verifyNoOutstandingExpectation(d)},j.verifyNoOutstandingExpectation=function(b){if(b!==!1&&a.$digest(),m.length)throw new Error("Unsatisfied requests: "+m.join(", "))},j.verifyNoOutstandingRequest=function(){if(n.length)throw new Error("Unflushed requests: "+n.length)},j.resetExpectations=function(){m.length=0,n.length=0},j}function h(a,c,d,e){this.data=d,this.headers=e,this.match=function(c,d,e,f){return a!=c?!1:this.matchUrl(d)?b.isDefined(e)&&!this.matchData(e)?!1:b.isDefined(f)&&!this.matchHeaders(f)?!1:!0:!1},this.matchUrl=function(a){return c?b.isFunction(c.test)?c.test(a):b.isFunction(c)?c(a):c==a:!0},this.matchHeaders=function(a){return b.isUndefined(e)?!0:b.isFunction(e)?e(a):b.equals(e,a)},this.matchData=function(a){return b.isUndefined(d)?!0:d&&b.isFunction(d.test)?d.test(a):d&&b.isFunction(d)?d(a):d&&!b.isString(d)?b.equals(b.fromJson(b.toJson(d)),b.fromJson(a)):d==a},this.toString=function(){return a+" "+c}}function i(){i.$$lastInstance=this,this.open=function(a,b,c){this.$$method=a,this.$$url=b,this.$$async=c,this.$$reqHeaders={},this.$$respHeaders={}},this.send=function(a){this.$$data=a},this.setRequestHeader=function(a,b){this.$$reqHeaders[a]=b},this.getResponseHeader=function(a){var d=this.$$respHeaders[a];return d?d:(a=b.lowercase(a),(d=this.$$respHeaders[a])?d:(d=c,b.forEach(this.$$respHeaders,function(c,e){d||b.lowercase(e)!=a||(d=c)}),d))},this.getAllResponseHeaders=function(){var a=[];return b.forEach(this.$$respHeaders,function(b,c){a.push(c+": "+b)}),a.join("\n")},this.abort=b.noop}b.mock={},b.mock.$BrowserProvider=function(){this.$get=function(){return new b.mock.$Browser}},b.mock.$Browser=function(){var a=this;this.isMock=!0,a.$$url="http://server/",a.$$lastUrl=a.$$url,a.pollFns=[],a.$$completeOutstandingRequest=b.noop,a.$$incOutstandingRequestCount=b.noop,a.onUrlChange=function(b){return a.pollFns.push(function(){(a.$$lastUrl!==a.$$url||a.$$state!==a.$$lastState)&&(a.$$lastUrl=a.$$url,a.$$lastState=a.$$state,b(a.$$url,a.$$state))}),b},a.$$applicationDestroyed=b.noop,a.$$checkUrlChange=b.noop,a.deferredFns=[],a.deferredNextId=0,a.defer=function(b,c){return c=c||0,a.deferredFns.push({time:a.defer.now+c,fn:b,id:a.deferredNextId}),a.deferredFns.sort(function(a,b){return a.time-b.time}),a.deferredNextId++},a.defer.now=0,a.defer.cancel=function(d){var e;return b.forEach(a.deferredFns,function(a,b){a.id===d&&(e=b)}),e!==c?(a.deferredFns.splice(e,1),!0):!1},a.defer.flush=function(c){if(b.isDefined(c))a.defer.now+=c;else{if(!a.deferredFns.length)throw new Error("No deferred tasks to be flushed");a.defer.now=a.deferredFns[a.deferredFns.length-1].time}for(;a.deferredFns.length&&a.deferredFns[0].time<=a.defer.now;)a.deferredFns.shift().fn()},a.$$baseHref="/",a.baseHref=function(){return this.$$baseHref}},b.mock.$Browser.prototype={poll:function(){b.forEach(this.pollFns,function(a){a()})},url:function(a,c,d){return b.isUndefined(d)&&(d=null),a?(this.$$url=a,this.$$state=b.copy(d),this):this.$$url},state:function(){return this.$$state},notifyWhenNoOutstandingRequests:function(a){a()}},b.mock.$ExceptionHandlerProvider=function(){var a;this.mode=function(b){switch(b){case"log":case"rethrow":var c=[];a=function(a){if(1==arguments.length?c.push(a):c.push([].slice.call(arguments,0)),"rethrow"===b)throw a},a.errors=c;break;default:throw new Error("Unknown mode '"+b+"', only 'log'/'rethrow' modes are allowed!")}},this.$get=function(){return a},this.mode("rethrow")},b.mock.$LogProvider=function(){function a(a,b,c){return a.concat(Array.prototype.slice.call(b,c))}var c=!0;this.debugEnabled=function(a){return b.isDefined(a)?(c=a,this):c},this.$get=function(){var d={log:function(){d.log.logs.push(a([],arguments,0))},warn:function(){d.warn.logs.push(a([],arguments,0))},info:function(){d.info.logs.push(a([],arguments,0))},error:function(){d.error.logs.push(a([],arguments,0))},debug:function(){c&&d.debug.logs.push(a([],arguments,0))}};return d.reset=function(){d.log.logs=[],d.info.logs=[],d.warn.logs=[],d.error.logs=[],d.debug.logs=[]},d.assertEmpty=function(){var a=[];if(b.forEach(["error","warn","info","log","debug"],function(c){b.forEach(d[c].logs,function(d){b.forEach(d,function(b){a.push("MOCK $log ("+c+"): "+String(b)+"\n"+(b.stack||""))})})}),a.length)throw a.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected log message was not checked and removed:"),a.push(""),new Error(a.join("\n---------\n"))},d.reset(),d}},b.mock.$IntervalProvider=function(){this.$get=["$browser","$rootScope","$q","$$q",function(a,d,e,f){var g=[],h=0,i=0,j=function(j,k,l,m){function n(){if(s.notify(q++),l>0&&q>=l){var e;s.resolve(q),b.forEach(g,function(a,b){a.id===t.$$intervalId&&(e=b)}),e!==c&&g.splice(e,1)}r?a.defer.flush():d.$apply()}var o=arguments.length>4,p=o?Array.prototype.slice.call(arguments,4):[],q=0,r=b.isDefined(m)&&!m,s=(r?f:e).defer(),t=s.promise;return l=b.isDefined(l)?l:0,t.then(null,null,o?function(){j.apply(null,p)}:j),t.$$intervalId=h,g.push({nextTime:i+k,delay:k,fn:n,id:h,deferred:s}),g.sort(function(a,b){return a.nextTime-b.nextTime}),h++,t};return j.cancel=function(a){if(!a)return!1;var d;return b.forEach(g,function(b,c){b.id===a.$$intervalId&&(d=c)}),d!==c?(g[d].deferred.reject("canceled"),g.splice(d,1),!0):!1},j.flush=function(a){for(i+=a;g.length&&g[0].nextTime<=i;){var b=g[0];b.fn(),b.nextTime+=b.delay,g.sort(function(a,b){return a.nextTime-b.nextTime})}return a},j}]};var j=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;if(b.mock.TzDate=function(a,c){var e=new Date(0);if(b.isString(c)){var g=c;if(e.origDate=d(c),c=e.origDate.getTime(),isNaN(c))throw{name:"Illegal Argument",message:"Arg '"+g+"' passed into TzDate constructor is not a valid date string"}}else e.origDate=new Date(c);var h=new Date(c).getTimezoneOffset();e.offsetDiff=60*h*1e3-1e3*a*60*60,e.date=new Date(c+e.offsetDiff),e.getTime=function(){return e.date.getTime()-e.offsetDiff},e.toLocaleDateString=function(){return e.date.toLocaleDateString()},e.getFullYear=function(){return e.date.getFullYear()},e.getMonth=function(){return e.date.getMonth()},e.getDate=function(){return e.date.getDate()},e.getHours=function(){return e.date.getHours()},e.getMinutes=function(){return e.date.getMinutes()},e.getSeconds=function(){return e.date.getSeconds()},e.getMilliseconds=function(){return e.date.getMilliseconds()},e.getTimezoneOffset=function(){return 60*a},e.getUTCFullYear=function(){return e.origDate.getUTCFullYear()},e.getUTCMonth=function(){return e.origDate.getUTCMonth()},e.getUTCDate=function(){return e.origDate.getUTCDate()},e.getUTCHours=function(){return e.origDate.getUTCHours()},e.getUTCMinutes=function(){return e.origDate.getUTCMinutes()},e.getUTCSeconds=function(){return e.origDate.getUTCSeconds()},e.getUTCMilliseconds=function(){return e.origDate.getUTCMilliseconds()},e.getDay=function(){return e.date.getDay()},e.toISOString&&(e.toISOString=function(){return f(e.origDate.getUTCFullYear(),4)+"-"+f(e.origDate.getUTCMonth()+1,2)+"-"+f(e.origDate.getUTCDate(),2)+"T"+f(e.origDate.getUTCHours(),2)+":"+f(e.origDate.getUTCMinutes(),2)+":"+f(e.origDate.getUTCSeconds(),2)+"."+f(e.origDate.getUTCMilliseconds(),3)+"Z"});var i=["getUTCDay","getYear","setDate","setFullYear","setHours","setMilliseconds","setMinutes","setMonth","setSeconds","setTime","setUTCDate","setUTCFullYear","setUTCHours","setUTCMilliseconds","setUTCMinutes","setUTCMonth","setUTCSeconds","setYear","toDateString","toGMTString","toJSON","toLocaleFormat","toLocaleString","toLocaleTimeString","toSource","toString","toTimeString","toUTCString","valueOf"];return b.forEach(i,function(a){e[a]=function(){throw new Error("Method '"+a+"' is not implemented in the TzDate mock")}}),e},b.mock.TzDate.prototype=Date.prototype,b.mock.animate=b.module("ngAnimateMock",["ng"]).config(["$provide",function(a){var c=[];a.value("$$animateReflow",function(a){var b=c.length;return c.push(a),function(){c.splice(b,1)}}),a.decorator("$animate",["$delegate","$timeout","$browser","$$rAF",function(a,d,e,f){var g={queue:[],cancel:a.cancel,enabled:a.enabled,triggerCallbackEvents:function(){f.flush()},triggerCallbackPromise:function(){d.flush(0)},triggerCallbacks:function(){this.triggerCallbackEvents(),this.triggerCallbackPromise()},triggerReflow:function(){b.forEach(c,function(a){a()}),c=[]}};return b.forEach(["animate","enter","leave","move","addClass","removeClass","setClass"],function(b){g[b]=function(){return g.queue.push({event:b,element:arguments[0],options:arguments[arguments.length-1],args:arguments}),a[b].apply(a,arguments)}}),g}])}]),b.mock.dump=function(a){function c(a){var e;return b.isElement(a)?(a=b.element(a),e=b.element("
"),b.forEach(a,function(a){e.append(b.element(a).clone())}),e=e.html()):b.isArray(a)?(e=[],b.forEach(a,function(a){e.push(c(a))}),e="[ "+e.join(", ")+" ]"):e=b.isObject(a)?b.isFunction(a.$eval)&&b.isFunction(a.$apply)?d(a):a instanceof Error?a.stack||""+a.name+": "+a.message:b.toJson(a,!0):String(a),e}function d(a,c){c=c||" ";var e=[c+"Scope("+a.$id+"): {"];for(var f in a)Object.prototype.hasOwnProperty.call(a,f)&&!f.match(/^(\$|this)/)&&e.push(" "+f+": "+b.toJson(a[f]));for(var g=a.$$childHead;g;)e.push(d(g,c+" ")),g=g.$$nextSibling;return e.push("}"),e.join("\n"+c)}return c(a)},b.mock.$HttpBackendProvider=function(){this.$get=["$rootScope","$timeout",g]},b.mock.$TimeoutDecorator=["$delegate","$browser",function(a,c){function d(a){var c=[];return b.forEach(a,function(a){c.push("{id: "+a.id+", time: "+a.time+"}")}),c.join(", ")}return a.flush=function(a){c.defer.flush(a)},a.verifyNoPendingTasks=function(){if(c.deferredFns.length)throw new Error("Deferred tasks to flush ("+c.deferredFns.length+"): "+d(c.deferredFns))},a}],b.mock.$RAFDecorator=["$delegate",function(a){var b=[],c=function(a){var c=b.length;return b.push(a),function(){b.splice(c,1)}};return c.supported=a.supported,c.flush=function(){if(0===b.length)throw new Error("No rAF callbacks present");for(var a=b.length,c=0;a>c;c++)b[c]();b=b.slice(c)},c}],b.mock.$RootElementProvider=function(){this.$get=function(){return b.element("
")}},b.mock.$ControllerDecorator=["$delegate",function(a){return function(c,d,e,f){if(e&&"object"==typeof e){var g=a(c,d,!0,f);return b.extend(g.instance,e),g()}return a(c,d,e,f)}}],b.module("ngMock",["ng"]).provider({$browser:b.mock.$BrowserProvider,$exceptionHandler:b.mock.$ExceptionHandlerProvider,$log:b.mock.$LogProvider,$interval:b.mock.$IntervalProvider,$httpBackend:b.mock.$HttpBackendProvider,$rootElement:b.mock.$RootElementProvider}).config(["$provide",function(a){a.decorator("$timeout",b.mock.$TimeoutDecorator),a.decorator("$$rAF",b.mock.$RAFDecorator),a.decorator("$rootScope",b.mock.$RootScopeDecorator),a.decorator("$controller",b.mock.$ControllerDecorator)}]),b.module("ngMockE2E",["ng"]).config(["$provide",function(a){a.decorator("$httpBackend",b.mock.e2e.$httpBackendDecorator)}]),b.mock.e2e={},b.mock.e2e.$httpBackendDecorator=["$rootScope","$timeout","$delegate","$browser",g],b.mock.$RootScopeDecorator=["$delegate",function(a){function b(){for(var a,b=0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=1,c.push(a.$$childHead),a=a.$$nextSibling;return b}function c(){for(var a,b=this.$$watchers?this.$$watchers.length:0,c=[this.$$childHead];c.length;)for(a=c.shift();a;)b+=a.$$watchers?a.$$watchers.length:0,c.push(a.$$childHead),a=a.$$nextSibling;return b}var d=Object.getPrototypeOf(a);return d.$countChildScopes=b,d.$countWatchers=c,a}],a.jasmine||a.mocha){var k=null,l=[],m=function(){return!!k};b.mock.$$annotate=b.injector.$$annotate,b.injector.$$annotate=function(a){return"function"!=typeof a||a.$inject||l.push(a),b.mock.$$annotate.apply(this,arguments)},(a.beforeEach||a.setup)(function(){l=[],k=this}),(a.afterEach||a.teardown)(function(){var a=k.$injector;l.forEach(function(a){delete a.$inject}),b.forEach(k.$modules,function(a){a&&a.$$hashKey&&(a.$$hashKey=c)}),k.$injector=null,k.$modules=null,k=null,a&&a.get("$rootElement").off(),b.forEach(b.element.fragments,function(a,c){delete b.element.fragments[c]}),i.$$lastInstance=null,b.forEach(b.callbacks,function(a,c){delete b.callbacks[c]}),b.callbacks.counter=0}),a.module=b.mock.module=function(){function a(){if(k.$injector)throw new Error("Injector already created, can not register a module!");var a=k.$modules||(k.$modules=[]);b.forEach(c,function(c){b.isObject(c)&&!b.isArray(c)?a.push(function(a){b.forEach(c,function(b,c){a.value(c,b)})}):a.push(c)})}var c=Array.prototype.slice.call(arguments,0);return m()?a():a};var n=function(a,b){this.message=a.message,this.name=a.name,a.line&&(this.line=a.line),a.sourceId&&(this.sourceId=a.sourceId),a.stack&&b&&(this.stack=a.stack+"\n"+b.stack),a.stackArray&&(this.stackArray=a.stackArray)};n.prototype.toString=Error.prototype.toString,a.inject=b.mock.inject=function(){function a(){var a=k.$modules||[],e=!!k.$injectorStrict;a.unshift("ngMock"),a.unshift("ng");var f=k.$injector;f||(e&&b.forEach(a,function(a){"function"==typeof a&&b.injector.$$annotate(a)}),f=k.$injector=b.injector(a,e),k.$injectorStrict=e);for(var g=0,h=c.length;h>g;g++){k.$injectorStrict&&f.annotate(c[g]);try{f.invoke(c[g]||b.noop,this)}catch(i){if(i.stack&&d)throw new n(i,d);throw i}finally{d=null}}}var c=Array.prototype.slice.call(arguments,0),d=new Error("Declaration Location");return m()?a.call(k):a},b.mock.inject.strictDi=function(a){function b(){if(a!==k.$injectorStrict){if(k.$injector)throw new Error("Injector already created, can not modify strict annotations");k.$injectorStrict=a}}return a=arguments.length?!!a:!0,m()?b():b}}}(window,window.angular); +//# sourceMappingURL=angular-mocks.min.js.map \ No newline at end of file diff --git a/td/public/libs/angular-mocks/angular-mocks.min.js.map b/td/public/libs/angular-mocks/angular-mocks.min.js.map new file mode 100644 index 000000000..8042150ed --- /dev/null +++ b/td/public/libs/angular-mocks/angular-mocks.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"angular-mocks.min.js","sources":["angular-mocks.js","angular-mocks.min.js"],"names":["window","angular","undefined","jsonStringToDate","string","match","R_ISO8061_STR","date","Date","tzHour","tzMin","toInt","setUTCFullYear","setUTCHours","str","parseInt","padNumber","num","digits","trim","neg","length","substr","createHttpBackendMock","$rootScope","$timeout","$delegate","$browser","createResponse","status","data","headers","statusText","isFunction","isNumber","$httpBackend","method","url","callback","timeout","withCredentials","prettyPrint","isString","RegExp","toJson","wrapResponse","wrapped","handleResponse","response","xhr","$$respHeaders","copy","getAllResponseHeaders","handleTimeout","i","ii","responses","splice","then","MockXhr","expectation","expectations","wasExpected","matchData","Error","matchHeaders","shift","push","definition","definitions","defer","responsesPush","passThrough","createShortMethods","prefix","forEach","bind","when","MockHttpExpectation","chain","respond","expect","flush","count","digest","$digest","isDefined","verifyNoOutstandingExpectation","join","verifyNoOutstandingRequest","resetExpectations","this","m","u","d","h","matchUrl","test","isUndefined","equals","fromJson","toString","$$lastInstance","open","async","$$method","$$url","$$async","$$reqHeaders","send","$$data","setRequestHeader","key","value","getResponseHeader","name","header","lowercase","headerVal","headerName","lines","abort","noop","mock","$BrowserProvider","$get","$Browser","self","isMock","$$lastUrl","pollFns","$$completeOutstandingRequest","$$incOutstandingRequestCount","onUrlChange","listener","$$state","$$lastState","$$applicationDestroyed","$$checkUrlChange","deferredFns","deferredNextId","fn","delay","time","now","id","sort","a","b","cancel","deferId","fnIndex","index","$$baseHref","baseHref","prototype","poll","pollFn","replace","state","notifyWhenNoOutstandingRequests","$ExceptionHandlerProvider","handler","mode","errors","e","arguments","slice","call","$LogProvider","concat","array1","array2","Array","debug","debugEnabled","flag","$log","log","logs","warn","info","error","reset","assertEmpty","logLevel","logItem","String","stack","unshift","$IntervalProvider","$q","$$q","repeatFns","nextRepeatId","$interval","invokeApply","tick","deferred","notify","iteration","resolve","promise","$$intervalId","skipApply","$apply","hasParams","args","apply","nextTime","reject","millis","task","TzDate","offset","timestamp","tsStr","origDate","getTime","isNaN","message","localOffset","getTimezoneOffset","offsetDiff","toLocaleDateString","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","getDay","toISOString","unimplementedMethods","methodName","animate","module","config","$provide","reflowQueue","decorator","$$rAF","queue","enabled","triggerCallbackEvents","triggerCallbackPromise","triggerCallbacks","triggerReflow","event","element","options","dump","object","serialize","out","isElement","append","clone","html","isArray","o","isObject","$eval","serializeScope","scope","$id","Object","hasOwnProperty","child","$$childHead","$$nextSibling","$HttpBackendProvider","$TimeoutDecorator","formatPendingTasksAsString","tasks","result","verifyNoPendingTasks","$RAFDecorator","rafFn","supported","$RootElementProvider","$ControllerDecorator","expression","locals","later","ident","create","extend","instance","provider","$exceptionHandler","$rootElement","$RootScopeDecorator","e2e","$httpBackendDecorator","countChildScopes","currentScope","pendingChildHeads","countWatchers","$$watchers","$rootScopePrototype","getPrototypeOf","$countChildScopes","$countWatchers","jasmine","mocha","currentSpec","annotatedFunctions","isSpecRunning","$$annotate","injector","$inject","beforeEach","setup","afterEach","teardown","$injector","$modules","$$hashKey","get","off","fragments","val","callbacks","counter","workFn","modules","moduleFns","ErrorAddingDeclarationLocationStack","errorForStack","line","sourceId","stackArray","inject","strictDi","$injectorStrict","moduleFn","blockFns","annotate","invoke","c","j","f","g","k","q","r","s","t","p","n","v","w","x","y","l"],"mappings":"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"} \ No newline at end of file diff --git a/td/public/libs/angular-route/angular-route.js b/td/public/libs/angular-route/angular-route.js new file mode 100644 index 000000000..40536ad26 --- /dev/null +++ b/td/public/libs/angular-route/angular-route.js @@ -0,0 +1,992 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/** + * @ngdoc module + * @name ngRoute + * @description + * + * # ngRoute + * + * The `ngRoute` module provides routing and deeplinking services and directives for angular apps. + * + * ## Example + * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`. + * + * + *
+ */ + /* global -ngRouteModule */ +var ngRouteModule = angular.module('ngRoute', ['ng']). + provider('$route', $RouteProvider), + $routeMinErr = angular.$$minErr('ngRoute'); + +/** + * @ngdoc provider + * @name $routeProvider + * + * @description + * + * Used for configuring routes. + * + * ## Example + * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`. + * + * ## Dependencies + * Requires the {@link ngRoute `ngRoute`} module to be installed. + */ +function $RouteProvider() { + function inherit(parent, extra) { + return angular.extend(Object.create(parent), extra); + } + + var routes = {}; + + /** + * @ngdoc method + * @name $routeProvider#when + * + * @param {string} path Route path (matched against `$location.path`). If `$location.path` + * contains redundant trailing slash or is missing one, the route will still match and the + * `$location.path` will be updated to add or drop the trailing slash to exactly match the + * route definition. + * + * * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up + * to the next slash are matched and stored in `$routeParams` under the given `name` + * when the route matches. + * * `path` can contain named groups starting with a colon and ending with a star: + * e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name` + * when the route matches. + * * `path` can contain optional named groups with a question mark: e.g.`:name?`. + * + * For example, routes like `/color/:color/largecode/:largecode*\/edit` will match + * `/color/brown/largecode/code/with/slashes/edit` and extract: + * + * * `color: brown` + * * `largecode: code/with/slashes`. + * + * + * @param {Object} route Mapping information to be assigned to `$route.current` on route + * match. + * + * Object properties: + * + * - `controller` – `{(string|function()=}` – Controller fn that should be associated with + * newly created scope or the name of a {@link angular.Module#controller registered + * controller} if passed as a string. + * - `controllerAs` – `{string=}` – An identifier name for a reference to the controller. + * If present, the controller will be published to scope under the `controllerAs` name. + * - `template` – `{string=|function()=}` – html template as a string or a function that + * returns an html template as a string which should be used by {@link + * ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives. + * This property takes precedence over `templateUrl`. + * + * If `template` is a function, it will be called with the following parameters: + * + * - `{Array.}` - route parameters extracted from the current + * `$location.path()` by applying the current route + * + * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html + * template that should be used by {@link ngRoute.directive:ngView ngView}. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - `{Array.}` - route parameters extracted from the current + * `$location.path()` by applying the current route + * + * - `resolve` - `{Object.=}` - An optional map of dependencies which should + * be injected into the controller. If any of these dependencies are promises, the router + * will wait for them all to be resolved or one to be rejected before the controller is + * instantiated. + * If all the promises are resolved successfully, the values of the resolved promises are + * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is + * fired. If any of the promises are rejected the + * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object + * is: + * + * - `key` – `{string}`: a name of a dependency to be injected into the controller. + * - `factory` - `{string|function}`: If `string` then it is an alias for a service. + * Otherwise if function, then it is {@link auto.$injector#invoke injected} + * and the return value is treated as the dependency. If the result is a promise, it is + * resolved before its value is injected into the controller. Be aware that + * `ngRoute.$routeParams` will still refer to the previous route within these resolve + * functions. Use `$route.current.params` to access the new route parameters, instead. + * + * - `redirectTo` – {(string|function())=} – value to update + * {@link ng.$location $location} path with and trigger route redirection. + * + * If `redirectTo` is a function, it will be called with the following parameters: + * + * - `{Object.}` - route parameters extracted from the current + * `$location.path()` by applying the current route templateUrl. + * - `{string}` - current `$location.path()` + * - `{Object}` - current `$location.search()` + * + * The custom `redirectTo` function is expected to return a string which will be used + * to update `$location.path()` and `$location.search()`. + * + * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()` + * or `$location.hash()` changes. + * + * If the option is set to `false` and url in the browser changes, then + * `$routeUpdate` event is broadcasted on the root scope. + * + * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive + * + * If the option is set to `true`, then the particular route can be matched without being + * case sensitive + * + * @returns {Object} self + * + * @description + * Adds a new route definition to the `$route` service. + */ + this.when = function(path, route) { + //copy original route object to preserve params inherited from proto chain + var routeCopy = angular.copy(route); + if (angular.isUndefined(routeCopy.reloadOnSearch)) { + routeCopy.reloadOnSearch = true; + } + if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) { + routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch; + } + routes[path] = angular.extend( + routeCopy, + path && pathRegExp(path, routeCopy) + ); + + // create redirection for trailing slashes + if (path) { + var redirectPath = (path[path.length - 1] == '/') + ? path.substr(0, path.length - 1) + : path + '/'; + + routes[redirectPath] = angular.extend( + {redirectTo: path}, + pathRegExp(redirectPath, routeCopy) + ); + } + + return this; + }; + + /** + * @ngdoc property + * @name $routeProvider#caseInsensitiveMatch + * @description + * + * A boolean property indicating if routes defined + * using this provider should be matched using a case insensitive + * algorithm. Defaults to `false`. + */ + this.caseInsensitiveMatch = false; + + /** + * @param path {string} path + * @param opts {Object} options + * @return {?Object} + * + * @description + * Normalizes the given path, returning a regular expression + * and the original path. + * + * Inspired by pathRexp in visionmedia/express/lib/utils.js. + */ + function pathRegExp(path, opts) { + var insensitive = opts.caseInsensitiveMatch, + ret = { + originalPath: path, + regexp: path + }, + keys = ret.keys = []; + + path = path + .replace(/([().])/g, '\\$1') + .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option) { + var optional = option === '?' ? option : null; + var star = option === '*' ? option : null; + keys.push({ name: key, optional: !!optional }); + slash = slash || ''; + return '' + + (optional ? '' : slash) + + '(?:' + + (optional ? slash : '') + + (star && '(.+?)' || '([^/]+)') + + (optional || '') + + ')' + + (optional || ''); + }) + .replace(/([\/$\*])/g, '\\$1'); + + ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : ''); + return ret; + } + + /** + * @ngdoc method + * @name $routeProvider#otherwise + * + * @description + * Sets route definition that will be used on route change when no other route definition + * is matched. + * + * @param {Object|string} params Mapping information to be assigned to `$route.current`. + * If called with a string, the value maps to `redirectTo`. + * @returns {Object} self + */ + this.otherwise = function(params) { + if (typeof params === 'string') { + params = {redirectTo: params}; + } + this.when(null, params); + return this; + }; + + + this.$get = ['$rootScope', + '$location', + '$routeParams', + '$q', + '$injector', + '$templateRequest', + '$sce', + function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce) { + + /** + * @ngdoc service + * @name $route + * @requires $location + * @requires $routeParams + * + * @property {Object} current Reference to the current route definition. + * The route definition contains: + * + * - `controller`: The controller constructor as define in route definition. + * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for + * controller instantiation. The `locals` contain + * the resolved values of the `resolve` map. Additionally the `locals` also contain: + * + * - `$scope` - The current route scope. + * - `$template` - The current route template HTML. + * + * @property {Object} routes Object with all route configuration Objects as its properties. + * + * @description + * `$route` is used for deep-linking URLs to controllers and views (HTML partials). + * It watches `$location.url()` and tries to map the path to an existing route definition. + * + * Requires the {@link ngRoute `ngRoute`} module to be installed. + * + * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API. + * + * The `$route` service is typically used in conjunction with the + * {@link ngRoute.directive:ngView `ngView`} directive and the + * {@link ngRoute.$routeParams `$routeParams`} service. + * + * @example + * This example shows how changing the URL hash causes the `$route` to match a route against the + * URL, and the `ngView` pulls in the partial. + * + * + * + *
+ * Choose: + * Moby | + * Moby: Ch1 | + * Gatsby | + * Gatsby: Ch4 | + * Scarlet Letter
+ * + *
+ * + *
+ * + *
$location.path() = {{$location.path()}}
+ *
$route.current.templateUrl = {{$route.current.templateUrl}}
+ *
$route.current.params = {{$route.current.params}}
+ *
$route.current.scope.name = {{$route.current.scope.name}}
+ *
$routeParams = {{$routeParams}}
+ *
+ *
+ * + * + * controller: {{name}}
+ * Book Id: {{params.bookId}}
+ *
+ * + * + * controller: {{name}}
+ * Book Id: {{params.bookId}}
+ * Chapter Id: {{params.chapterId}} + *
+ * + * + * angular.module('ngRouteExample', ['ngRoute']) + * + * .controller('MainController', function($scope, $route, $routeParams, $location) { + * $scope.$route = $route; + * $scope.$location = $location; + * $scope.$routeParams = $routeParams; + * }) + * + * .controller('BookController', function($scope, $routeParams) { + * $scope.name = "BookController"; + * $scope.params = $routeParams; + * }) + * + * .controller('ChapterController', function($scope, $routeParams) { + * $scope.name = "ChapterController"; + * $scope.params = $routeParams; + * }) + * + * .config(function($routeProvider, $locationProvider) { + * $routeProvider + * .when('/Book/:bookId', { + * templateUrl: 'book.html', + * controller: 'BookController', + * resolve: { + * // I will cause a 1 second delay + * delay: function($q, $timeout) { + * var delay = $q.defer(); + * $timeout(delay.resolve, 1000); + * return delay.promise; + * } + * } + * }) + * .when('/Book/:bookId/ch/:chapterId', { + * templateUrl: 'chapter.html', + * controller: 'ChapterController' + * }); + * + * // configure html5 to get links working on jsfiddle + * $locationProvider.html5Mode(true); + * }); + * + * + * + * + * it('should load and compile correct template', function() { + * element(by.linkText('Moby: Ch1')).click(); + * var content = element(by.css('[ng-view]')).getText(); + * expect(content).toMatch(/controller\: ChapterController/); + * expect(content).toMatch(/Book Id\: Moby/); + * expect(content).toMatch(/Chapter Id\: 1/); + * + * element(by.partialLinkText('Scarlet')).click(); + * + * content = element(by.css('[ng-view]')).getText(); + * expect(content).toMatch(/controller\: BookController/); + * expect(content).toMatch(/Book Id\: Scarlet/); + * }); + * + *
+ */ + + /** + * @ngdoc event + * @name $route#$routeChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a route change. At this point the route services starts + * resolving all of the dependencies needed for the route change to occur. + * Typically this involves fetching the view template as well as any dependencies + * defined in `resolve` route property. Once all of the dependencies are resolved + * `$routeChangeSuccess` is fired. + * + * The route change (and the `$location` change that triggered it) can be prevented + * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} + * for more details about event object. + * + * @param {Object} angularEvent Synthetic event object. + * @param {Route} next Future route information. + * @param {Route} current Current route information. + */ + + /** + * @ngdoc event + * @name $route#$routeChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a route change has happened successfully. + * The `resolve` dependencies are now available in the `current.locals` property. + * + * {@link ngRoute.directive:ngView ngView} listens for the directive + * to instantiate the controller and render the view. + * + * @param {Object} angularEvent Synthetic event object. + * @param {Route} current Current route information. + * @param {Route|Undefined} previous Previous route information, or undefined if current is + * first route entered. + */ + + /** + * @ngdoc event + * @name $route#$routeChangeError + * @eventType broadcast on root scope + * @description + * Broadcasted if any of the resolve promises are rejected. + * + * @param {Object} angularEvent Synthetic event object + * @param {Route} current Current route information. + * @param {Route} previous Previous route information. + * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise. + */ + + /** + * @ngdoc event + * @name $route#$routeUpdate + * @eventType broadcast on root scope + * @description + * The `reloadOnSearch` property has been set to false, and we are reusing the same + * instance of the Controller. + * + * @param {Object} angularEvent Synthetic event object + * @param {Route} current Current/previous route information. + */ + + var forceReload = false, + preparedRoute, + preparedRouteIsUpdateOnly, + $route = { + routes: routes, + + /** + * @ngdoc method + * @name $route#reload + * + * @description + * Causes `$route` service to reload the current route even if + * {@link ng.$location $location} hasn't changed. + * + * As a result of that, {@link ngRoute.directive:ngView ngView} + * creates new scope and reinstantiates the controller. + */ + reload: function() { + forceReload = true; + $rootScope.$evalAsync(function() { + // Don't support cancellation of a reload for now... + prepareRoute(); + commitRoute(); + }); + }, + + /** + * @ngdoc method + * @name $route#updateParams + * + * @description + * Causes `$route` service to update the current URL, replacing + * current route parameters with those specified in `newParams`. + * Provided property names that match the route's path segment + * definitions will be interpolated into the location's path, while + * remaining properties will be treated as query params. + * + * @param {!Object} newParams mapping of URL parameter names to values + */ + updateParams: function(newParams) { + if (this.current && this.current.$$route) { + newParams = angular.extend({}, this.current.params, newParams); + $location.path(interpolate(this.current.$$route.originalPath, newParams)); + // interpolate modifies newParams, only query params are left + $location.search(newParams); + } else { + throw $routeMinErr('norout', 'Tried updating route when with no current route'); + } + } + }; + + $rootScope.$on('$locationChangeStart', prepareRoute); + $rootScope.$on('$locationChangeSuccess', commitRoute); + + return $route; + + ///////////////////////////////////////////////////// + + /** + * @param on {string} current url + * @param route {Object} route regexp to match the url against + * @return {?Object} + * + * @description + * Check if the route matches the current url. + * + * Inspired by match in + * visionmedia/express/lib/router/router.js. + */ + function switchRouteMatcher(on, route) { + var keys = route.keys, + params = {}; + + if (!route.regexp) return null; + + var m = route.regexp.exec(on); + if (!m) return null; + + for (var i = 1, len = m.length; i < len; ++i) { + var key = keys[i - 1]; + + var val = m[i]; + + if (key && val) { + params[key.name] = val; + } + } + return params; + } + + function prepareRoute($locationEvent) { + var lastRoute = $route.current; + + preparedRoute = parseRoute(); + preparedRouteIsUpdateOnly = preparedRoute && lastRoute && preparedRoute.$$route === lastRoute.$$route + && angular.equals(preparedRoute.pathParams, lastRoute.pathParams) + && !preparedRoute.reloadOnSearch && !forceReload; + + if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) { + if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) { + if ($locationEvent) { + $locationEvent.preventDefault(); + } + } + } + } + + function commitRoute() { + var lastRoute = $route.current; + var nextRoute = preparedRoute; + + if (preparedRouteIsUpdateOnly) { + lastRoute.params = nextRoute.params; + angular.copy(lastRoute.params, $routeParams); + $rootScope.$broadcast('$routeUpdate', lastRoute); + } else if (nextRoute || lastRoute) { + forceReload = false; + $route.current = nextRoute; + if (nextRoute) { + if (nextRoute.redirectTo) { + if (angular.isString(nextRoute.redirectTo)) { + $location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search(nextRoute.params) + .replace(); + } else { + $location.url(nextRoute.redirectTo(nextRoute.pathParams, $location.path(), $location.search())) + .replace(); + } + } + } + + $q.when(nextRoute). + then(function() { + if (nextRoute) { + var locals = angular.extend({}, nextRoute.resolve), + template, templateUrl; + + angular.forEach(locals, function(value, key) { + locals[key] = angular.isString(value) ? + $injector.get(value) : $injector.invoke(value, null, null, key); + }); + + if (angular.isDefined(template = nextRoute.template)) { + if (angular.isFunction(template)) { + template = template(nextRoute.params); + } + } else if (angular.isDefined(templateUrl = nextRoute.templateUrl)) { + if (angular.isFunction(templateUrl)) { + templateUrl = templateUrl(nextRoute.params); + } + if (angular.isDefined(templateUrl)) { + nextRoute.loadedTemplateUrl = $sce.valueOf(templateUrl); + template = $templateRequest(templateUrl); + } + } + if (angular.isDefined(template)) { + locals['$template'] = template; + } + return $q.all(locals); + } + }). + then(function(locals) { + // after route change + if (nextRoute == $route.current) { + if (nextRoute) { + nextRoute.locals = locals; + angular.copy(nextRoute.params, $routeParams); + } + $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute); + } + }, function(error) { + if (nextRoute == $route.current) { + $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error); + } + }); + } + } + + + /** + * @returns {Object} the current active route, by matching it against the URL + */ + function parseRoute() { + // Match a route + var params, match; + angular.forEach(routes, function(route, path) { + if (!match && (params = switchRouteMatcher($location.path(), route))) { + match = inherit(route, { + params: angular.extend({}, $location.search(), params), + pathParams: params}); + match.$$route = route; + } + }); + // No route matched; fallback to "otherwise" route + return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}}); + } + + /** + * @returns {string} interpolation of the redirect path with the parameters + */ + function interpolate(string, params) { + var result = []; + angular.forEach((string || '').split(':'), function(segment, i) { + if (i === 0) { + result.push(segment); + } else { + var segmentMatch = segment.match(/(\w+)(?:[?*])?(.*)/); + var key = segmentMatch[1]; + result.push(params[key]); + result.push(segmentMatch[2] || ''); + delete params[key]; + } + }); + return result.join(''); + } + }]; +} + +ngRouteModule.provider('$routeParams', $RouteParamsProvider); + + +/** + * @ngdoc service + * @name $routeParams + * @requires $route + * + * @description + * The `$routeParams` service allows you to retrieve the current set of route parameters. + * + * Requires the {@link ngRoute `ngRoute`} module to be installed. + * + * The route parameters are a combination of {@link ng.$location `$location`}'s + * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}. + * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched. + * + * In case of parameter name collision, `path` params take precedence over `search` params. + * + * The service guarantees that the identity of the `$routeParams` object will remain unchanged + * (but its properties will likely change) even when a route change occurs. + * + * Note that the `$routeParams` are only updated *after* a route change completes successfully. + * This means that you cannot rely on `$routeParams` being correct in route resolve functions. + * Instead you can use `$route.current.params` to access the new route's parameters. + * + * @example + * ```js + * // Given: + * // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby + * // Route: /Chapter/:chapterId/Section/:sectionId + * // + * // Then + * $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'} + * ``` + */ +function $RouteParamsProvider() { + this.$get = function() { return {}; }; +} + +ngRouteModule.directive('ngView', ngViewFactory); +ngRouteModule.directive('ngView', ngViewFillContentFactory); + + +/** + * @ngdoc directive + * @name ngView + * @restrict ECA + * + * @description + * # Overview + * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by + * including the rendered template of the current route into the main layout (`index.html`) file. + * Every time the current route changes, the included view changes with it according to the + * configuration of the `$route` service. + * + * Requires the {@link ngRoute `ngRoute`} module to be installed. + * + * @animations + * enter - animation is used to bring new content into the browser. + * leave - animation is used to animate existing content away. + * + * The enter and leave animation occur concurrently. + * + * @scope + * @priority 400 + * @param {string=} onload Expression to evaluate whenever the view updates. + * + * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll + * $anchorScroll} to scroll the viewport after the view is updated. + * + * - If the attribute is not set, disable scrolling. + * - If the attribute is set without value, enable scrolling. + * - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated + * as an expression yields a truthy value. + * @example + + +
+ Choose: + Moby | + Moby: Ch1 | + Gatsby | + Gatsby: Ch4 | + Scarlet Letter
+ +
+
+
+
+ +
$location.path() = {{main.$location.path()}}
+
$route.current.templateUrl = {{main.$route.current.templateUrl}}
+
$route.current.params = {{main.$route.current.params}}
+
$routeParams = {{main.$routeParams}}
+
+
+ + +
+ controller: {{book.name}}
+ Book Id: {{book.params.bookId}}
+
+
+ + +
+ controller: {{chapter.name}}
+ Book Id: {{chapter.params.bookId}}
+ Chapter Id: {{chapter.params.chapterId}} +
+
+ + + .view-animate-container { + position:relative; + height:100px!important; + background:white; + border:1px solid black; + height:40px; + overflow:hidden; + } + + .view-animate { + padding:10px; + } + + .view-animate.ng-enter, .view-animate.ng-leave { + -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s; + + display:block; + width:100%; + border-left:1px solid black; + + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + padding:10px; + } + + .view-animate.ng-enter { + left:100%; + } + .view-animate.ng-enter.ng-enter-active { + left:0; + } + .view-animate.ng-leave.ng-leave-active { + left:-100%; + } + + + + angular.module('ngViewExample', ['ngRoute', 'ngAnimate']) + .config(['$routeProvider', '$locationProvider', + function($routeProvider, $locationProvider) { + $routeProvider + .when('/Book/:bookId', { + templateUrl: 'book.html', + controller: 'BookCtrl', + controllerAs: 'book' + }) + .when('/Book/:bookId/ch/:chapterId', { + templateUrl: 'chapter.html', + controller: 'ChapterCtrl', + controllerAs: 'chapter' + }); + + $locationProvider.html5Mode(true); + }]) + .controller('MainCtrl', ['$route', '$routeParams', '$location', + function($route, $routeParams, $location) { + this.$route = $route; + this.$location = $location; + this.$routeParams = $routeParams; + }]) + .controller('BookCtrl', ['$routeParams', function($routeParams) { + this.name = "BookCtrl"; + this.params = $routeParams; + }]) + .controller('ChapterCtrl', ['$routeParams', function($routeParams) { + this.name = "ChapterCtrl"; + this.params = $routeParams; + }]); + + + + + it('should load and compile correct template', function() { + element(by.linkText('Moby: Ch1')).click(); + var content = element(by.css('[ng-view]')).getText(); + expect(content).toMatch(/controller\: ChapterCtrl/); + expect(content).toMatch(/Book Id\: Moby/); + expect(content).toMatch(/Chapter Id\: 1/); + + element(by.partialLinkText('Scarlet')).click(); + + content = element(by.css('[ng-view]')).getText(); + expect(content).toMatch(/controller\: BookCtrl/); + expect(content).toMatch(/Book Id\: Scarlet/); + }); + +
+ */ + + +/** + * @ngdoc event + * @name ngView#$viewContentLoaded + * @eventType emit on the current ngView scope + * @description + * Emitted every time the ngView content is reloaded. + */ +ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate']; +function ngViewFactory($route, $anchorScroll, $animate) { + return { + restrict: 'ECA', + terminal: true, + priority: 400, + transclude: 'element', + link: function(scope, $element, attr, ctrl, $transclude) { + var currentScope, + currentElement, + previousLeaveAnimation, + autoScrollExp = attr.autoscroll, + onloadExp = attr.onload || ''; + + scope.$on('$routeChangeSuccess', update); + update(); + + function cleanupLastView() { + if (previousLeaveAnimation) { + $animate.cancel(previousLeaveAnimation); + previousLeaveAnimation = null; + } + + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + if (currentElement) { + previousLeaveAnimation = $animate.leave(currentElement); + previousLeaveAnimation.then(function() { + previousLeaveAnimation = null; + }); + currentElement = null; + } + } + + function update() { + var locals = $route.current && $route.current.locals, + template = locals && locals.$template; + + if (angular.isDefined(template)) { + var newScope = scope.$new(); + var current = $route.current; + + // Note: This will also link all children of ng-view that were contained in the original + // html. If that content contains controllers, ... they could pollute/change the scope. + // However, using ng-view on an element with additional content does not make sense... + // Note: We can't remove them in the cloneAttchFn of $transclude as that + // function is called before linking the content, which would apply child + // directives to non existing elements. + var clone = $transclude(newScope, function(clone) { + $animate.enter(clone, null, currentElement || $element).then(function onNgViewEnter() { + if (angular.isDefined(autoScrollExp) + && (!autoScrollExp || scope.$eval(autoScrollExp))) { + $anchorScroll(); + } + }); + cleanupLastView(); + }); + + currentElement = clone; + currentScope = current.scope = newScope; + currentScope.$emit('$viewContentLoaded'); + currentScope.$eval(onloadExp); + } else { + cleanupLastView(); + } + } + } + }; +} + +// This directive is called during the $transclude call of the first `ngView` directive. +// It will replace and compile the content of the element with the loaded template. +// We need this directive so that the element content is already filled when +// the link function of another directive on the same element as ngView +// is called. +ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route']; +function ngViewFillContentFactory($compile, $controller, $route) { + return { + restrict: 'ECA', + priority: -400, + link: function(scope, $element) { + var current = $route.current, + locals = current.locals; + + $element.html(locals.$template); + + var link = $compile($element.contents()); + + if (current.controller) { + locals.$scope = scope; + var controller = $controller(current.controller, locals); + if (current.controllerAs) { + scope[current.controllerAs] = controller; + } + $element.data('$ngControllerController', controller); + $element.children().data('$ngControllerController', controller); + } + + link(scope); + } + }; +} + + +})(window, window.angular); diff --git a/td/public/libs/angular-route/angular-route.min.js b/td/public/libs/angular-route/angular-route.min.js new file mode 100644 index 000000000..15b1ead53 --- /dev/null +++ b/td/public/libs/angular-route/angular-route.min.js @@ -0,0 +1,2 @@ +!function(a,b,c){"use strict";function d(){function a(a,c){return b.extend(Object.create(a),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){var f=b.copy(e);if(b.isUndefined(f.reloadOnSearch)&&(f.reloadOnSearch=!0),b.isUndefined(f.caseInsensitiveMatch)&&(f.caseInsensitiveMatch=this.caseInsensitiveMatch),d[a]=b.extend(f,a&&c(a,f)),a){var g="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[g]=b.extend({redirectTo:a},c(g,f))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(a){return"string"==typeof a&&(a={redirectTo:a}),this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(c,e,f,g,h,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i=e[f];h&&i&&(d[h.name]=i)}return d}function m(a){var d=t.current;q=o(),r=q&&d&&q.$$route===d.$$route&&b.equals(q.pathParams,d.pathParams)&&!q.reloadOnSearch&&!s,r||!d&&!q||c.$broadcast("$routeChangeStart",q,d).defaultPrevented&&a&&a.preventDefault()}function n(){var a=t.current,d=q;r?(a.params=d.params,b.copy(a.params,f),c.$broadcast("$routeUpdate",a)):(d||a)&&(s=!1,t.current=d,d&&d.redirectTo&&(b.isString(d.redirectTo)?e.path(p(d.redirectTo,d.params)).search(d.params).replace():e.url(d.redirectTo(d.pathParams,e.path(),e.search())).replace()),g.when(d).then(function(){if(d){var a,c,e=b.extend({},d.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a,null,null,c)}),b.isDefined(a=d.template)?b.isFunction(a)&&(a=a(d.params)):b.isDefined(c=d.templateUrl)&&(b.isFunction(c)&&(c=c(d.params)),b.isDefined(c)&&(d.loadedTemplateUrl=k.valueOf(c),a=j(c))),b.isDefined(a)&&(e.$template=a),g.all(e)}}).then(function(e){d==t.current&&(d&&(d.locals=e,b.copy(d.params,f)),c.$broadcast("$routeChangeSuccess",d,a))},function(b){d==t.current&&c.$broadcast("$routeChangeError",d,a,b)}))}function o(){var c,f;return b.forEach(d,function(d,g){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function p(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var q,r,s=!1,t={routes:d,reload:function(){s=!0,c.$evalAsync(function(){m(),n()})},updateParams:function(a){if(!this.current||!this.current.$$route)throw i("norout","Tried updating route when with no current route");a=b.extend({},this.current.params,a),e.path(p(this.current.$$route.originalPath,a)),e.search(a)}};return c.$on("$locationChangeStart",m),c.$on("$locationChangeSuccess",n),t}]}function e(){this.$get=function(){return{}}}function f(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(d.cancel(n),n=null),l&&(l.$destroy(),l=null),m&&(n=d.leave(m),n.then(function(){n=null}),m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f).then(function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function g(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var h=b.module("ngRoute",["ng"]).provider("$route",d),i=b.$$minErr("ngRoute");h.provider("$routeParams",e),h.directive("ngView",f),h.directive("ngView",g),f.$inject=["$route","$anchorScroll","$animate"],g.$inject=["$compile","$controller","$route"]}(window,window.angular),!function(a,b,c){"use strict";function d(){function a(a,c){return b.extend(Object.create(a),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){var f=b.copy(e);if(b.isUndefined(f.reloadOnSearch)&&(f.reloadOnSearch=!0),b.isUndefined(f.caseInsensitiveMatch)&&(f.caseInsensitiveMatch=this.caseInsensitiveMatch),d[a]=b.extend(f,a&&c(a,f)),a){var g="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[g]=b.extend({redirectTo:a},c(g,f))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(a){return"string"==typeof a&&(a={redirectTo:a}),this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(c,e,f,g,h,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i=e[f];h&&i&&(d[h.name]=i)}return d}function m(a){var d=t.current;q=o(),r=q&&d&&q.$$route===d.$$route&&b.equals(q.pathParams,d.pathParams)&&!q.reloadOnSearch&&!s,r||!d&&!q||c.$broadcast("$routeChangeStart",q,d).defaultPrevented&&a&&a.preventDefault()}function n(){var a=t.current,d=q;r?(a.params=d.params,b.copy(a.params,f),c.$broadcast("$routeUpdate",a)):(d||a)&&(s=!1,t.current=d,d&&d.redirectTo&&(b.isString(d.redirectTo)?e.path(p(d.redirectTo,d.params)).search(d.params).replace():e.url(d.redirectTo(d.pathParams,e.path(),e.search())).replace()),g.when(d).then(function(){if(d){var a,c,e=b.extend({},d.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a,null,null,c)}),b.isDefined(a=d.template)?b.isFunction(a)&&(a=a(d.params)):b.isDefined(c=d.templateUrl)&&(b.isFunction(c)&&(c=c(d.params)),b.isDefined(c)&&(d.loadedTemplateUrl=k.valueOf(c),a=j(c))),b.isDefined(a)&&(e.$template=a),g.all(e)}}).then(function(e){d==t.current&&(d&&(d.locals=e,b.copy(d.params,f)),c.$broadcast("$routeChangeSuccess",d,a))},function(b){d==t.current&&c.$broadcast("$routeChangeError",d,a,b)}))}function o(){var c,f;return b.forEach(d,function(d,g){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function p(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var q,r,s=!1,t={routes:d,reload:function(){s=!0,c.$evalAsync(function(){m(),n()})},updateParams:function(a){if(!this.current||!this.current.$$route)throw i("norout","Tried updating route when with no current route");a=b.extend({},this.current.params,a),e.path(p(this.current.$$route.originalPath,a)),e.search(a)}};return c.$on("$locationChangeStart",m),c.$on("$locationChangeSuccess",n),t}]}function e(){this.$get=function(){return{}}}function f(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(d.cancel(n),n=null),l&&(l.$destroy(),l=null),m&&(n=d.leave(m),n.then(function(){n=null}),m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f).then(function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function g(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var h=b.module("ngRoute",["ng"]).provider("$route",d),i=b.$$minErr("ngRoute");h.provider("$routeParams",e),h.directive("ngView",f),h.directive("ngView",g),f.$inject=["$route","$anchorScroll","$animate"],g.$inject=["$compile","$controller","$route"]}(window,window.angular),!function(a,b,c){"use strict";function d(){function a(a,c){return b.extend(Object.create(a),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){var f=b.copy(e);if(b.isUndefined(f.reloadOnSearch)&&(f.reloadOnSearch=!0),b.isUndefined(f.caseInsensitiveMatch)&&(f.caseInsensitiveMatch=this.caseInsensitiveMatch),d[a]=b.extend(f,a&&c(a,f)),a){var g="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[g]=b.extend({redirectTo:a},c(g,f))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(a){return"string"==typeof a&&(a={redirectTo:a}),this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(c,e,f,g,h,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i=e[f];h&&i&&(d[h.name]=i)}return d}function m(a){var d=t.current;q=o(),r=q&&d&&q.$$route===d.$$route&&b.equals(q.pathParams,d.pathParams)&&!q.reloadOnSearch&&!s,r||!d&&!q||c.$broadcast("$routeChangeStart",q,d).defaultPrevented&&a&&a.preventDefault()}function n(){var a=t.current,d=q;r?(a.params=d.params,b.copy(a.params,f),c.$broadcast("$routeUpdate",a)):(d||a)&&(s=!1,t.current=d,d&&d.redirectTo&&(b.isString(d.redirectTo)?e.path(p(d.redirectTo,d.params)).search(d.params).replace():e.url(d.redirectTo(d.pathParams,e.path(),e.search())).replace()),g.when(d).then(function(){if(d){var a,c,e=b.extend({},d.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a,null,null,c)}),b.isDefined(a=d.template)?b.isFunction(a)&&(a=a(d.params)):b.isDefined(c=d.templateUrl)&&(b.isFunction(c)&&(c=c(d.params)),b.isDefined(c)&&(d.loadedTemplateUrl=k.valueOf(c),a=j(c))),b.isDefined(a)&&(e.$template=a),g.all(e)}}).then(function(e){d==t.current&&(d&&(d.locals=e,b.copy(d.params,f)),c.$broadcast("$routeChangeSuccess",d,a))},function(b){d==t.current&&c.$broadcast("$routeChangeError",d,a,b)}))}function o(){var c,f;return b.forEach(d,function(d,g){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function p(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var q,r,s=!1,t={routes:d,reload:function(){s=!0,c.$evalAsync(function(){m(),n()})},updateParams:function(a){if(!this.current||!this.current.$$route)throw i("norout","Tried updating route when with no current route");a=b.extend({},this.current.params,a),e.path(p(this.current.$$route.originalPath,a)),e.search(a)}};return c.$on("$locationChangeStart",m),c.$on("$locationChangeSuccess",n),t}]}function e(){this.$get=function(){return{}}}function f(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(d.cancel(n),n=null),l&&(l.$destroy(),l=null),m&&(n=d.leave(m),n.then(function(){n=null}),m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f).then(function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function g(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var h=b.module("ngRoute",["ng"]).provider("$route",d),i=b.$$minErr("ngRoute");h.provider("$routeParams",e),h.directive("ngView",f),h.directive("ngView",g),f.$inject=["$route","$anchorScroll","$animate"],g.$inject=["$compile","$controller","$route"]}(window,window.angular),!function(a,b,c){"use strict";function d(){function a(a,c){return b.extend(Object.create(a),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){var f=b.copy(e);if(b.isUndefined(f.reloadOnSearch)&&(f.reloadOnSearch=!0),b.isUndefined(f.caseInsensitiveMatch)&&(f.caseInsensitiveMatch=this.caseInsensitiveMatch),d[a]=b.extend(f,a&&c(a,f)),a){var g="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[g]=b.extend({redirectTo:a},c(g,f))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(a){return"string"==typeof a&&(a={redirectTo:a}),this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(c,e,f,g,h,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i=e[f];h&&i&&(d[h.name]=i)}return d}function m(a){var d=t.current;q=o(),r=q&&d&&q.$$route===d.$$route&&b.equals(q.pathParams,d.pathParams)&&!q.reloadOnSearch&&!s,r||!d&&!q||c.$broadcast("$routeChangeStart",q,d).defaultPrevented&&a&&a.preventDefault()}function n(){var a=t.current,d=q;r?(a.params=d.params,b.copy(a.params,f),c.$broadcast("$routeUpdate",a)):(d||a)&&(s=!1,t.current=d,d&&d.redirectTo&&(b.isString(d.redirectTo)?e.path(p(d.redirectTo,d.params)).search(d.params).replace():e.url(d.redirectTo(d.pathParams,e.path(),e.search())).replace()),g.when(d).then(function(){if(d){var a,c,e=b.extend({},d.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a,null,null,c)}),b.isDefined(a=d.template)?b.isFunction(a)&&(a=a(d.params)):b.isDefined(c=d.templateUrl)&&(b.isFunction(c)&&(c=c(d.params)),b.isDefined(c)&&(d.loadedTemplateUrl=k.valueOf(c),a=j(c))),b.isDefined(a)&&(e.$template=a),g.all(e)}}).then(function(e){d==t.current&&(d&&(d.locals=e,b.copy(d.params,f)),c.$broadcast("$routeChangeSuccess",d,a))},function(b){d==t.current&&c.$broadcast("$routeChangeError",d,a,b)}))}function o(){var c,f;return b.forEach(d,function(d,g){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function p(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var q,r,s=!1,t={routes:d,reload:function(){s=!0,c.$evalAsync(function(){m(),n()})},updateParams:function(a){if(!this.current||!this.current.$$route)throw i("norout","Tried updating route when with no current route");a=b.extend({},this.current.params,a),e.path(p(this.current.$$route.originalPath,a)),e.search(a)}};return c.$on("$locationChangeStart",m),c.$on("$locationChangeSuccess",n),t}]}function e(){this.$get=function(){return{}}}function f(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(d.cancel(n),n=null),l&&(l.$destroy(),l=null),m&&(n=d.leave(m),n.then(function(){n=null}),m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f).then(function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function g(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var h=b.module("ngRoute",["ng"]).provider("$route",d),i=b.$$minErr("ngRoute");h.provider("$routeParams",e),h.directive("ngView",f),h.directive("ngView",g),f.$inject=["$route","$anchorScroll","$animate"],g.$inject=["$compile","$controller","$route"]}(window,window.angular),!function(a,b,c){"use strict";function d(){function a(a,c){return b.extend(Object.create(a),c)}function c(a,b){var c=b.caseInsensitiveMatch,d={originalPath:a,regexp:a},e=d.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,b,c,d){var f="?"===d?d:null,g="*"===d?d:null;return e.push({name:c,optional:!!f}),b=b||"",""+(f?"":b)+"(?:"+(f?b:"")+(g&&"(.+?)"||"([^/]+)")+(f||"")+")"+(f||"")}).replace(/([\/$\*])/g,"\\$1"),d.regexp=new RegExp("^"+a+"$",c?"i":""),d}var d={};this.when=function(a,e){var f=b.copy(e);if(b.isUndefined(f.reloadOnSearch)&&(f.reloadOnSearch=!0),b.isUndefined(f.caseInsensitiveMatch)&&(f.caseInsensitiveMatch=this.caseInsensitiveMatch),d[a]=b.extend(f,a&&c(a,f)),a){var g="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";d[g]=b.extend({redirectTo:a},c(g,f))}return this},this.caseInsensitiveMatch=!1,this.otherwise=function(a){return"string"==typeof a&&(a={redirectTo:a}),this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(c,e,f,g,h,j,k){function l(a,b){var c=b.keys,d={};if(!b.regexp)return null;var e=b.regexp.exec(a);if(!e)return null;for(var f=1,g=e.length;g>f;++f){var h=c[f-1],i=e[f];h&&i&&(d[h.name]=i)}return d}function m(a){var d=t.current;q=o(),r=q&&d&&q.$$route===d.$$route&&b.equals(q.pathParams,d.pathParams)&&!q.reloadOnSearch&&!s,r||!d&&!q||c.$broadcast("$routeChangeStart",q,d).defaultPrevented&&a&&a.preventDefault()}function n(){var a=t.current,d=q;r?(a.params=d.params,b.copy(a.params,f),c.$broadcast("$routeUpdate",a)):(d||a)&&(s=!1,t.current=d,d&&d.redirectTo&&(b.isString(d.redirectTo)?e.path(p(d.redirectTo,d.params)).search(d.params).replace():e.url(d.redirectTo(d.pathParams,e.path(),e.search())).replace()),g.when(d).then(function(){if(d){var a,c,e=b.extend({},d.resolve);return b.forEach(e,function(a,c){e[c]=b.isString(a)?h.get(a):h.invoke(a,null,null,c)}),b.isDefined(a=d.template)?b.isFunction(a)&&(a=a(d.params)):b.isDefined(c=d.templateUrl)&&(b.isFunction(c)&&(c=c(d.params)),b.isDefined(c)&&(d.loadedTemplateUrl=k.valueOf(c),a=j(c))),b.isDefined(a)&&(e.$template=a),g.all(e)}}).then(function(e){d==t.current&&(d&&(d.locals=e,b.copy(d.params,f)),c.$broadcast("$routeChangeSuccess",d,a))},function(b){d==t.current&&c.$broadcast("$routeChangeError",d,a,b)}))}function o(){var c,f;return b.forEach(d,function(d,g){!f&&(c=l(e.path(),d))&&(f=a(d,{params:b.extend({},e.search(),c),pathParams:c}),f.$$route=d)}),f||d[null]&&a(d[null],{params:{},pathParams:{}})}function p(a,c){var d=[];return b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];d.push(c[f]),d.push(e[2]||""),delete c[f]}}),d.join("")}var q,r,s=!1,t={routes:d,reload:function(){s=!0,c.$evalAsync(function(){m(),n()})},updateParams:function(a){if(!this.current||!this.current.$$route)throw i("norout","Tried updating route when with no current route");a=b.extend({},this.current.params,a),e.path(p(this.current.$$route.originalPath,a)),e.search(a)}};return c.$on("$locationChangeStart",m),c.$on("$locationChangeSuccess",n),t}]}function e(){this.$get=function(){return{}}}function f(a,c,d){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(e,f,g,h,i){function j(){n&&(d.cancel(n),n=null),l&&(l.$destroy(),l=null),m&&(n=d.leave(m),n.then(function(){n=null}),m=null)}function k(){var g=a.current&&a.current.locals,h=g&&g.$template;if(b.isDefined(h)){var k=e.$new(),n=a.current,q=i(k,function(a){d.enter(a,null,m||f).then(function(){!b.isDefined(o)||o&&!e.$eval(o)||c()}),j()});m=q,l=n.scope=k,l.$emit("$viewContentLoaded"),l.$eval(p)}else j()}var l,m,n,o=g.autoscroll,p=g.onload||"";e.$on("$routeChangeSuccess",k),k()}}}function g(a,b,c){return{restrict:"ECA",priority:-400,link:function(d,e){var f=c.current,g=f.locals;e.html(g.$template);var h=a(e.contents());if(f.controller){g.$scope=d;var i=b(f.controller,g);f.controllerAs&&(d[f.controllerAs]=i),e.data("$ngControllerController",i),e.children().data("$ngControllerController",i)}h(d)}}}var h=b.module("ngRoute",["ng"]).provider("$route",d),i=b.$$minErr("ngRoute");h.provider("$routeParams",e),h.directive("ngView",f),h.directive("ngView",g),f.$inject=["$route","$anchorScroll","$animate"],g.$inject=["$compile","$controller","$route"]}(window,window.angular); +//# sourceMappingURL=angular-route.min.js.map \ No newline at end of file diff --git a/td/public/libs/angular-route/angular-route.min.js.map b/td/public/libs/angular-route/angular-route.min.js.map new file mode 100644 index 000000000..3323bd300 --- /dev/null +++ b/td/public/libs/angular-route/angular-route.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"angular-route.min.js","sources":["angular-route.js","angular-route.min.js"],"names":["window","angular","undefined","$RouteProvider","inherit","parent","extra","extend","Object","create","pathRegExp","path","opts","insensitive","caseInsensitiveMatch","ret","originalPath","regexp","keys","replace","_","slash","key","option","optional","star","push","name","RegExp","routes","this","when","route","routeCopy","copy","isUndefined","reloadOnSearch","redirectPath","length","substr","redirectTo","otherwise","params","$get","$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce","switchRouteMatcher","on","m","exec","i","len","val","prepareRoute","$locationEvent","lastRoute","$route","current","preparedRoute","parseRoute","preparedRouteIsUpdateOnly","$$route","equals","pathParams","forceReload","$broadcast","defaultPrevented","preventDefault","commitRoute","nextRoute","isString","interpolate","search","url","then","template","templateUrl","locals","resolve","forEach","value","get","invoke","isDefined","isFunction","loadedTemplateUrl","valueOf","all","error","match","string","result","split","segment","segmentMatch","join","reload","$evalAsync","updateParams","newParams","$routeMinErr","$on","$RouteParamsProvider","ngViewFactory","$anchorScroll","$animate","restrict","terminal","priority","transclude","link","scope","$element","attr","ctrl","$transclude","cleanupLastView","previousLeaveAnimation","cancel","currentScope","$destroy","currentElement","leave","update","$template","newScope","$new","clone","enter","autoScrollExp","$eval","$emit","onloadExp","autoscroll","onload","ngViewFillContentFactory","$compile","$controller","html","contents","controller","$scope","controllerAs","data","children","ngRouteModule","module","provider","$$minErr","directive","$inject","a","b","c","d","e","f","g","h","j","k","l","t","q","o","r","s","n","p"],"mappings":"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"} \ No newline at end of file diff --git a/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js b/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js new file mode 100644 index 000000000..611966115 --- /dev/null +++ b/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js @@ -0,0 +1,4840 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.13.0 - 2015-05-02 + * License: MIT + */ +angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]); +angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]); +angular.module('ui.bootstrap.collapse', []) + + .directive('collapse', ['$animate', function ($animate) { + + return { + link: function (scope, element, attrs) { + function expand() { + element.removeClass('collapse').addClass('collapsing'); + $animate.addClass(element, 'in', { + to: { height: element[0].scrollHeight + 'px' } + }).then(expandDone); + } + + function expandDone() { + element.removeClass('collapsing'); + element.css({height: 'auto'}); + } + + function collapse() { + element + // IMPORTANT: The height must be set before adding "collapsing" class. + // Otherwise, the browser attempts to animate from height 0 (in + // collapsing class) to the given height here. + .css({height: element[0].scrollHeight + 'px'}) + // initially all panel collapse have the collapse class, this removal + // prevents the animation from jumping to collapsed state + .removeClass('collapse') + .addClass('collapsing'); + + $animate.removeClass(element, 'in', { + to: {height: '0'} + }).then(collapseDone); + } + + function collapseDone() { + element.css({height: '0'}); // Required so that collapse works when animation is disabled + element.removeClass('collapsing'); + element.addClass('collapse'); + } + + scope.$watch(attrs.collapse, function (shouldCollapse) { + if (shouldCollapse) { + collapse(); + } else { + expand(); + } + }); + } + }; + }]); + +angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) + +.constant('accordionConfig', { + closeOthers: true +}) + +.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { + + // This array keeps track of the accordion groups + this.groups = []; + + // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to + this.closeOthers = function(openGroup) { + var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; + if ( closeOthers ) { + angular.forEach(this.groups, function (group) { + if ( group !== openGroup ) { + group.isOpen = false; + } + }); + } + }; + + // This is called from the accordion-group directive to add itself to the accordion + this.addGroup = function(groupScope) { + var that = this; + this.groups.push(groupScope); + + groupScope.$on('$destroy', function (event) { + that.removeGroup(groupScope); + }); + }; + + // This is called from the accordion-group directive when to remove itself + this.removeGroup = function(group) { + var index = this.groups.indexOf(group); + if ( index !== -1 ) { + this.groups.splice(index, 1); + } + }; + +}]) + +// The accordion directive simply sets up the directive controller +// and adds an accordion CSS class to itself element. +.directive('accordion', function () { + return { + restrict:'EA', + controller:'AccordionController', + transclude: true, + replace: false, + templateUrl: 'template/accordion/accordion.html' + }; +}) + +// The accordion-group directive indicates a block of html that will expand and collapse in an accordion +.directive('accordionGroup', function() { + return { + require:'^accordion', // We need this directive to be inside an accordion + restrict:'EA', + transclude:true, // It transcludes the contents of the directive into the template + replace: true, // The element containing the directive will be replaced with the template + templateUrl:'template/accordion/accordion-group.html', + scope: { + heading: '@', // Interpolate the heading attribute onto this scope + isOpen: '=?', + isDisabled: '=?' + }, + controller: function() { + this.setHeading = function(element) { + this.heading = element; + }; + }, + link: function(scope, element, attrs, accordionCtrl) { + accordionCtrl.addGroup(scope); + + scope.$watch('isOpen', function(value) { + if ( value ) { + accordionCtrl.closeOthers(scope); + } + }); + + scope.toggleOpen = function() { + if ( !scope.isDisabled ) { + scope.isOpen = !scope.isOpen; + } + }; + } + }; +}) + +// Use accordion-heading below an accordion-group to provide a heading containing HTML +// +// Heading containing HTML - +// +.directive('accordionHeading', function() { + return { + restrict: 'EA', + transclude: true, // Grab the contents to be used as the heading + template: '', // In effect remove this element! + replace: true, + require: '^accordionGroup', + link: function(scope, element, attr, accordionGroupCtrl, transclude) { + // Pass the heading to the accordion-group controller + // so that it can be transcluded into the right place in the template + // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] + accordionGroupCtrl.setHeading(transclude(scope, angular.noop)); + } + }; +}) + +// Use in the accordion-group template to indicate where you want the heading to be transcluded +// You must provide the property on the accordion-group controller that will hold the transcluded element +//
+// +// ... +//
+.directive('accordionTransclude', function() { + return { + require: '^accordionGroup', + link: function(scope, element, attr, controller) { + scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { + if ( heading ) { + element.html(''); + element.append(heading); + } + }); + } + }; +}) + +; + +angular.module('ui.bootstrap.alert', []) + +.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { + $scope.closeable = 'close' in $attrs; + this.close = $scope.close; +}]) + +.directive('alert', function () { + return { + restrict:'EA', + controller:'AlertController', + templateUrl:'template/alert/alert.html', + transclude:true, + replace:true, + scope: { + type: '@', + close: '&' + } + }; +}) + +.directive('dismissOnTimeout', ['$timeout', function($timeout) { + return { + require: 'alert', + link: function(scope, element, attrs, alertCtrl) { + $timeout(function(){ + alertCtrl.close(); + }, parseInt(attrs.dismissOnTimeout, 10)); + } + }; +}]); + +angular.module('ui.bootstrap.bindHtml', []) + + .directive('bindHtmlUnsafe', function () { + return function (scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); + scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { + element.html(value || ''); + }); + }; + }); +angular.module('ui.bootstrap.buttons', []) + +.constant('buttonConfig', { + activeClass: 'active', + toggleEvent: 'click' +}) + +.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { + this.activeClass = buttonConfig.activeClass || 'active'; + this.toggleEvent = buttonConfig.toggleEvent || 'click'; +}]) + +.directive('btnRadio', function () { + return { + require: ['btnRadio', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + var isActive = element.hasClass(buttonsCtrl.activeClass); + + if (!isActive || angular.isDefined(attrs.uncheckable)) { + scope.$apply(function () { + ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio)); + ngModelCtrl.$render(); + }); + } + }); + } + }; +}) + +.directive('btnCheckbox', function () { + return { + require: ['btnCheckbox', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + function getTrueValue() { + return getCheckboxValue(attrs.btnCheckboxTrue, true); + } + + function getFalseValue() { + return getCheckboxValue(attrs.btnCheckboxFalse, false); + } + + function getCheckboxValue(attributeValue, defaultValue) { + var val = scope.$eval(attributeValue); + return angular.isDefined(val) ? val : defaultValue; + } + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + scope.$apply(function () { + ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); + ngModelCtrl.$render(); + }); + }); + } + }; +}); + +/** +* @ngdoc overview +* @name ui.bootstrap.carousel +* +* @description +* AngularJS version of an image carousel. +* +*/ +angular.module('ui.bootstrap.carousel', []) +.controller('CarouselController', ['$scope', '$interval', '$animate', function ($scope, $interval, $animate) { + var self = this, + slides = self.slides = $scope.slides = [], + currentIndex = -1, + currentInterval, isPlaying; + self.currentSlide = null; + + var destroyed = false; + /* direction: "prev" or "next" */ + self.select = $scope.select = function(nextSlide, direction) { + var nextIndex = self.indexOfSlide(nextSlide); + //Decide direction if it's not given + if (direction === undefined) { + direction = nextIndex > self.getCurrentIndex() ? 'next' : 'prev'; + } + if (nextSlide && nextSlide !== self.currentSlide) { + goNext(); + } + function goNext() { + // Scope has been destroyed, stop here. + if (destroyed) { return; } + + angular.extend(nextSlide, {direction: direction, active: true}); + angular.extend(self.currentSlide || {}, {direction: direction, active: false}); + if ($animate.enabled() && !$scope.noTransition && nextSlide.$element) { + $scope.$currentTransition = true; + nextSlide.$element.one('$animate:close', function closeFn() { + $scope.$currentTransition = null; + }); + } + + self.currentSlide = nextSlide; + currentIndex = nextIndex; + //every time you change slides, reset the timer + restartTimer(); + } + }; + $scope.$on('$destroy', function () { + destroyed = true; + }); + + function getSlideByIndex(index) { + if (angular.isUndefined(slides[index].index)) { + return slides[index]; + } + var i, len = slides.length; + for (i = 0; i < slides.length; ++i) { + if (slides[i].index == index) { + return slides[i]; + } + } + } + + self.getCurrentIndex = function() { + if (self.currentSlide && angular.isDefined(self.currentSlide.index)) { + return +self.currentSlide.index; + } + return currentIndex; + }; + + /* Allow outside people to call indexOf on slides array */ + self.indexOfSlide = function(slide) { + return angular.isDefined(slide.index) ? +slide.index : slides.indexOf(slide); + }; + + $scope.next = function() { + var newIndex = (self.getCurrentIndex() + 1) % slides.length; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(getSlideByIndex(newIndex), 'next'); + } + }; + + $scope.prev = function() { + var newIndex = self.getCurrentIndex() - 1 < 0 ? slides.length - 1 : self.getCurrentIndex() - 1; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(getSlideByIndex(newIndex), 'prev'); + } + }; + + $scope.isActive = function(slide) { + return self.currentSlide === slide; + }; + + $scope.$watch('interval', restartTimer); + $scope.$on('$destroy', resetTimer); + + function restartTimer() { + resetTimer(); + var interval = +$scope.interval; + if (!isNaN(interval) && interval > 0) { + currentInterval = $interval(timerFn, interval); + } + } + + function resetTimer() { + if (currentInterval) { + $interval.cancel(currentInterval); + currentInterval = null; + } + } + + function timerFn() { + var interval = +$scope.interval; + if (isPlaying && !isNaN(interval) && interval > 0) { + $scope.next(); + } else { + $scope.pause(); + } + } + + $scope.play = function() { + if (!isPlaying) { + isPlaying = true; + restartTimer(); + } + }; + $scope.pause = function() { + if (!$scope.noPause) { + isPlaying = false; + resetTimer(); + } + }; + + self.addSlide = function(slide, element) { + slide.$element = element; + slides.push(slide); + //if this is the first slide or the slide is set to active, select it + if(slides.length === 1 || slide.active) { + self.select(slides[slides.length-1]); + if (slides.length == 1) { + $scope.play(); + } + } else { + slide.active = false; + } + }; + + self.removeSlide = function(slide) { + if (angular.isDefined(slide.index)) { + slides.sort(function(a, b) { + return +a.index > +b.index; + }); + } + //get the index of the slide inside the carousel + var index = slides.indexOf(slide); + slides.splice(index, 1); + if (slides.length > 0 && slide.active) { + if (index >= slides.length) { + self.select(slides[index-1]); + } else { + self.select(slides[index]); + } + } else if (currentIndex > index) { + currentIndex--; + } + }; + +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:carousel + * @restrict EA + * + * @description + * Carousel is the outer container for a set of image 'slides' to showcase. + * + * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. + * @param {boolean=} noTransition Whether to disable transitions on the carousel. + * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). + * + * @example + + + + + + + + + + + + + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + + + */ +.directive('carousel', [function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + controller: 'CarouselController', + require: 'carousel', + templateUrl: 'template/carousel/carousel.html', + scope: { + interval: '=', + noTransition: '=', + noPause: '=' + } + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:slide + * @restrict EA + * + * @description + * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. + * + * @param {boolean=} active Model binding, whether or not this slide is currently active. + * @param {number=} index The index of the slide. The slides will be sorted by this parameter. + * + * @example + + +
+ + + + + + + Interval, in milliseconds: +
Enter a negative number to stop the interval. +
+
+ +function CarouselDemoCtrl($scope) { + $scope.myInterval = 5000; +} + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
+*/ + +.directive('slide', function() { + return { + require: '^carousel', + restrict: 'EA', + transclude: true, + replace: true, + templateUrl: 'template/carousel/slide.html', + scope: { + active: '=?', + index: '=?' + }, + link: function (scope, element, attrs, carouselCtrl) { + carouselCtrl.addSlide(scope, element); + //when the scope is destroyed then remove the slide from the current slides array + scope.$on('$destroy', function() { + carouselCtrl.removeSlide(scope); + }); + + scope.$watch('active', function(active) { + if (active) { + carouselCtrl.select(scope); + } + }); + } + }; +}) + +.animation('.item', [ + '$animate', +function ($animate) { + return { + beforeAddClass: function (element, className, done) { + // Due to transclusion, noTransition property is on parent's scope + if (className == 'active' && element.parent() && + !element.parent().scope().noTransition) { + var stopped = false; + var direction = element.isolateScope().direction; + var directionClass = direction == 'next' ? 'left' : 'right'; + element.addClass(direction); + $animate.addClass(element, directionClass).then(function () { + if (!stopped) { + element.removeClass(directionClass + ' ' + direction); + } + done(); + }); + + return function () { + stopped = true; + }; + } + done(); + }, + beforeRemoveClass: function (element, className, done) { + // Due to transclusion, noTransition property is on parent's scope + if (className == 'active' && element.parent() && + !element.parent().scope().noTransition) { + var stopped = false; + var direction = element.isolateScope().direction; + var directionClass = direction == 'next' ? 'left' : 'right'; + $animate.addClass(element, directionClass).then(function () { + if (!stopped) { + element.removeClass(directionClass); + } + done(); + }); + return function () { + stopped = true; + }; + } + done(); + } + }; + +}]) + + +; + +angular.module('ui.bootstrap.dateparser', []) + +.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) { + // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js + var SPECIAL_CHARACTERS_REGEXP = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + + this.parsers = {}; + + var formatCodeToRegex = { + 'yyyy': { + regex: '\\d{4}', + apply: function(value) { this.year = +value; } + }, + 'yy': { + regex: '\\d{2}', + apply: function(value) { this.year = +value + 2000; } + }, + 'y': { + regex: '\\d{1,4}', + apply: function(value) { this.year = +value; } + }, + 'MMMM': { + regex: $locale.DATETIME_FORMATS.MONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); } + }, + 'MMM': { + regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); } + }, + 'MM': { + regex: '0[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'M': { + regex: '[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'dd': { + regex: '[0-2][0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'd': { + regex: '[1-2]?[0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'EEEE': { + regex: $locale.DATETIME_FORMATS.DAY.join('|') + }, + 'EEE': { + regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|') + }, + 'HH': { + regex: '(?:0|1)[0-9]|2[0-3]', + apply: function(value) { this.hours = +value; } + }, + 'H': { + regex: '1?[0-9]|2[0-3]', + apply: function(value) { this.hours = +value; } + }, + 'mm': { + regex: '[0-5][0-9]', + apply: function(value) { this.minutes = +value; } + }, + 'm': { + regex: '[0-9]|[1-5][0-9]', + apply: function(value) { this.minutes = +value; } + }, + 'sss': { + regex: '[0-9][0-9][0-9]', + apply: function(value) { this.milliseconds = +value; } + }, + 'ss': { + regex: '[0-5][0-9]', + apply: function(value) { this.seconds = +value; } + }, + 's': { + regex: '[0-9]|[1-5][0-9]', + apply: function(value) { this.seconds = +value; } + } + }; + + function createParser(format) { + var map = [], regex = format.split(''); + + angular.forEach(formatCodeToRegex, function(data, code) { + var index = format.indexOf(code); + + if (index > -1) { + format = format.split(''); + + regex[index] = '(' + data.regex + ')'; + format[index] = '$'; // Custom symbol to define consumed part of format + for (var i = index + 1, n = index + code.length; i < n; i++) { + regex[i] = ''; + format[i] = '$'; + } + format = format.join(''); + + map.push({ index: index, apply: data.apply }); + } + }); + + return { + regex: new RegExp('^' + regex.join('') + '$'), + map: orderByFilter(map, 'index') + }; + } + + this.parse = function(input, format, baseDate) { + if ( !angular.isString(input) || !format ) { + return input; + } + + format = $locale.DATETIME_FORMATS[format] || format; + format = format.replace(SPECIAL_CHARACTERS_REGEXP, '\\$&'); + + if ( !this.parsers[format] ) { + this.parsers[format] = createParser(format); + } + + var parser = this.parsers[format], + regex = parser.regex, + map = parser.map, + results = input.match(regex); + + if ( results && results.length ) { + var fields, dt; + if (baseDate) { + fields = { + year: baseDate.getFullYear(), + month: baseDate.getMonth(), + date: baseDate.getDate(), + hours: baseDate.getHours(), + minutes: baseDate.getMinutes(), + seconds: baseDate.getSeconds(), + milliseconds: baseDate.getMilliseconds() + }; + } else { + fields = { year: 1900, month: 0, date: 1, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 }; + } + + for( var i = 1, n = results.length; i < n; i++ ) { + var mapper = map[i-1]; + if ( mapper.apply ) { + mapper.apply.call(fields, results[i]); + } + } + + if ( isValid(fields.year, fields.month, fields.date) ) { + dt = new Date(fields.year, fields.month, fields.date, fields.hours, fields.minutes, fields.seconds, + fields.milliseconds || 0); + } + + return dt; + } + }; + + // Check if date is valid for specific month (and year for February). + // Month: 0 = Jan, 1 = Feb, etc + function isValid(year, month, date) { + if (date < 1) { + return false; + } + + if ( month === 1 && date > 28) { + return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); + } + + if ( month === 3 || month === 5 || month === 8 || month === 10) { + return date < 31; + } + + return true; + } +}]); + +angular.module('ui.bootstrap.position', []) + +/** + * A set of utility methods that can be use to retrieve position of DOM elements. + * It is meant to be used where we need to absolute-position DOM elements in + * relation to other, existing elements (this is the case for tooltips, popovers, + * typeahead suggestions etc.). + */ + .factory('$position', ['$document', '$window', function ($document, $window) { + + function getStyle(el, cssprop) { + if (el.currentStyle) { //IE + return el.currentStyle[cssprop]; + } else if ($window.getComputedStyle) { + return $window.getComputedStyle(el)[cssprop]; + } + // finally try and get inline style + return el.style[cssprop]; + } + + /** + * Checks if a given element is statically positioned + * @param element - raw DOM element + */ + function isStaticPositioned(element) { + return (getStyle(element, 'position') || 'static' ) === 'static'; + } + + /** + * returns the closest, non-statically positioned parentOffset of a given element + * @param element + */ + var parentOffsetEl = function (element) { + var docDomEl = $document[0]; + var offsetParent = element.offsetParent || docDomEl; + while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || docDomEl; + }; + + return { + /** + * Provides read-only equivalent of jQuery's position function: + * http://api.jquery.com/position/ + */ + position: function (element) { + var elBCR = this.offset(element); + var offsetParentBCR = { top: 0, left: 0 }; + var offsetParentEl = parentOffsetEl(element[0]); + if (offsetParentEl != $document[0]) { + offsetParentBCR = this.offset(angular.element(offsetParentEl)); + offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; + offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; + } + + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: elBCR.top - offsetParentBCR.top, + left: elBCR.left - offsetParentBCR.left + }; + }, + + /** + * Provides read-only equivalent of jQuery's offset function: + * http://api.jquery.com/offset/ + */ + offset: function (element) { + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop), + left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft) + }; + }, + + /** + * Provides coordinates for the targetEl in relation to hostEl + */ + positionElements: function (hostEl, targetEl, positionStr, appendToBody) { + + var positionStrParts = positionStr.split('-'); + var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center'; + + var hostElPos, + targetElWidth, + targetElHeight, + targetElPos; + + hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl); + + targetElWidth = targetEl.prop('offsetWidth'); + targetElHeight = targetEl.prop('offsetHeight'); + + var shiftWidth = { + center: function () { + return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2; + }, + left: function () { + return hostElPos.left; + }, + right: function () { + return hostElPos.left + hostElPos.width; + } + }; + + var shiftHeight = { + center: function () { + return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2; + }, + top: function () { + return hostElPos.top; + }, + bottom: function () { + return hostElPos.top + hostElPos.height; + } + }; + + switch (pos0) { + case 'right': + targetElPos = { + top: shiftHeight[pos1](), + left: shiftWidth[pos0]() + }; + break; + case 'left': + targetElPos = { + top: shiftHeight[pos1](), + left: hostElPos.left - targetElWidth + }; + break; + case 'bottom': + targetElPos = { + top: shiftHeight[pos0](), + left: shiftWidth[pos1]() + }; + break; + default: + targetElPos = { + top: hostElPos.top - targetElHeight, + left: shiftWidth[pos1]() + }; + break; + } + + return targetElPos; + } + }; + }]); + +angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position']) + +.constant('datepickerConfig', { + formatDay: 'dd', + formatMonth: 'MMMM', + formatYear: 'yyyy', + formatDayHeader: 'EEE', + formatDayTitle: 'MMMM yyyy', + formatMonthTitle: 'yyyy', + datepickerMode: 'day', + minMode: 'day', + maxMode: 'year', + showWeeks: true, + startingDay: 0, + yearRange: 20, + minDate: null, + maxDate: null, + shortcutPropagation: false +}) + +.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl; + + // Modes chain + this.modes = ['day', 'month', 'year']; + + // Configuration attributes + angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle', + 'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange', 'shortcutPropagation'], function( key, index ) { + self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key]; + }); + + // Watchable date attributes + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( $attrs[key] ) { + $scope.$parent.$watch($parse($attrs[key]), function(value) { + self[key] = value ? new Date(value) : null; + self.refreshView(); + }); + } else { + self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null; + } + }); + + $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode; + $scope.maxMode = self.maxMode; + $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000); + + if(angular.isDefined($attrs.initDate)) { + this.activeDate = $scope.$parent.$eval($attrs.initDate) || new Date(); + $scope.$parent.$watch($attrs.initDate, function(initDate){ + if(initDate && (ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue) || ngModelCtrl.$invalid)){ + self.activeDate = initDate; + self.refreshView(); + } + }); + } else { + this.activeDate = new Date(); + } + + $scope.isActive = function(dateObject) { + if (self.compare(dateObject.date, self.activeDate) === 0) { + $scope.activeDateId = dateObject.uid; + return true; + } + return false; + }; + + this.init = function( ngModelCtrl_ ) { + ngModelCtrl = ngModelCtrl_; + + ngModelCtrl.$render = function() { + self.render(); + }; + }; + + this.render = function() { + if ( ngModelCtrl.$viewValue ) { + var date = new Date( ngModelCtrl.$viewValue ), + isValid = !isNaN(date); + + if ( isValid ) { + this.activeDate = date; + } else { + $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } + ngModelCtrl.$setValidity('date', isValid); + } + this.refreshView(); + }; + + this.refreshView = function() { + if ( this.element ) { + this._refreshView(); + + var date = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null; + ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date))); + } + }; + + this.createDateObject = function(date, format) { + var model = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null; + return { + date: date, + label: dateFilter(date, format), + selected: model && this.compare(date, model) === 0, + disabled: this.isDisabled(date), + current: this.compare(date, new Date()) === 0, + customClass: this.customClass(date) + }; + }; + + this.isDisabled = function( date ) { + return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode}))); + }; + + this.customClass = function( date ) { + return $scope.customClass({date: date, mode: $scope.datepickerMode}); + }; + + // Split array into smaller arrays + this.split = function(arr, size) { + var arrays = []; + while (arr.length > 0) { + arrays.push(arr.splice(0, size)); + } + return arrays; + }; + + $scope.select = function( date ) { + if ( $scope.datepickerMode === self.minMode ) { + var dt = ngModelCtrl.$viewValue ? new Date( ngModelCtrl.$viewValue ) : new Date(0, 0, 0, 0, 0, 0, 0); + dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); + ngModelCtrl.$setViewValue( dt ); + ngModelCtrl.$render(); + } else { + self.activeDate = date; + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ]; + } + }; + + $scope.move = function( direction ) { + var year = self.activeDate.getFullYear() + direction * (self.step.years || 0), + month = self.activeDate.getMonth() + direction * (self.step.months || 0); + self.activeDate.setFullYear(year, month, 1); + self.refreshView(); + }; + + $scope.toggleMode = function( direction ) { + direction = direction || 1; + + if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) { + return; + } + + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ]; + }; + + // Key event mapper + $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' }; + + var focusElement = function() { + $timeout(function() { + self.element[0].focus(); + }, 0 , false); + }; + + // Listen for focus requests from popup directive + $scope.$on('datepicker.focus', focusElement); + + $scope.keydown = function( evt ) { + var key = $scope.keys[evt.which]; + + if ( !key || evt.shiftKey || evt.altKey ) { + return; + } + + evt.preventDefault(); + if(!self.shortcutPropagation){ + evt.stopPropagation(); + } + + if (key === 'enter' || key === 'space') { + if ( self.isDisabled(self.activeDate)) { + return; // do nothing + } + $scope.select(self.activeDate); + focusElement(); + } else if (evt.ctrlKey && (key === 'up' || key === 'down')) { + $scope.toggleMode(key === 'up' ? 1 : -1); + focusElement(); + } else { + self.handleKeyDown(key, evt); + self.refreshView(); + } + }; +}]) + +.directive( 'datepicker', function () { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/datepicker.html', + scope: { + datepickerMode: '=?', + dateDisabled: '&', + customClass: '&', + shortcutPropagation: '&?' + }, + require: ['datepicker', '?^ngModel'], + controller: 'DatepickerController', + link: function(scope, element, attrs, ctrls) { + var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + datepickerCtrl.init( ngModelCtrl ); + } + } + }; +}) + +.directive('daypicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/day.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + scope.showWeeks = ctrl.showWeeks; + + ctrl.step = { months: 1 }; + ctrl.element = element; + + var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function getDaysInMonth( year, month ) { + return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month]; + } + + function getDates(startDate, n) { + var dates = new Array(n), current = new Date(startDate), i = 0; + current.setHours(12); // Prevent repeated dates because of timezone bug + while ( i < n ) { + dates[i++] = new Date(current); + current.setDate( current.getDate() + 1 ); + } + return dates; + } + + ctrl._refreshView = function() { + var year = ctrl.activeDate.getFullYear(), + month = ctrl.activeDate.getMonth(), + firstDayOfMonth = new Date(year, month, 1), + difference = ctrl.startingDay - firstDayOfMonth.getDay(), + numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, + firstDate = new Date(firstDayOfMonth); + + if ( numDisplayedFromPreviousMonth > 0 ) { + firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); + } + + // 42 is the number of days on a six-month calendar + var days = getDates(firstDate, 42); + for (var i = 0; i < 42; i ++) { + days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), { + secondary: days[i].getMonth() !== month, + uid: scope.uniqueId + '-' + i + }); + } + + scope.labels = new Array(7); + for (var j = 0; j < 7; j++) { + scope.labels[j] = { + abbr: dateFilter(days[j].date, ctrl.formatDayHeader), + full: dateFilter(days[j].date, 'EEEE') + }; + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle); + scope.rows = ctrl.split(days, 7); + + if ( scope.showWeeks ) { + scope.weekNumbers = []; + var thursdayIndex = (4 + 7 - ctrl.startingDay) % 7, + numWeeks = scope.rows.length; + for (var curWeek = 0; curWeek < numWeeks; curWeek++) { + scope.weekNumbers.push( + getISO8601WeekNumber( scope.rows[curWeek][thursdayIndex].date )); + } + } + }; + + ctrl.compare = function(date1, date2) { + return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); + }; + + function getISO8601WeekNumber(date) { + var checkDate = new Date(date); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + } + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getDate(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 7; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 7; + } else if (key === 'pageup' || key === 'pagedown') { + var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setMonth(month, 1); + date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date); + } else if (key === 'home') { + date = 1; + } else if (key === 'end') { + date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()); + } + ctrl.activeDate.setDate(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('monthpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/month.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + ctrl.step = { years: 1 }; + ctrl.element = element; + + ctrl._refreshView = function() { + var months = new Array(12), + year = ctrl.activeDate.getFullYear(); + + for ( var i = 0; i < 12; i++ ) { + months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle); + scope.rows = ctrl.split(months, 3); + }; + + ctrl.compare = function(date1, date2) { + return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getMonth(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 3; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 3; + } else if (key === 'pageup' || key === 'pagedown') { + var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setFullYear(year); + } else if (key === 'home') { + date = 0; + } else if (key === 'end') { + date = 11; + } + ctrl.activeDate.setMonth(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('yearpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/year.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + var range = ctrl.yearRange; + + ctrl.step = { years: range }; + ctrl.element = element; + + function getStartingYear( year ) { + return parseInt((year - 1) / range, 10) * range + 1; + } + + ctrl._refreshView = function() { + var years = new Array(range); + + for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) { + years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = [years[0].label, years[range - 1].label].join(' - '); + scope.rows = ctrl.split(years, 5); + }; + + ctrl.compare = function(date1, date2) { + return date1.getFullYear() - date2.getFullYear(); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getFullYear(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 5; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 5; + } else if (key === 'pageup' || key === 'pagedown') { + date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years; + } else if (key === 'home') { + date = getStartingYear( ctrl.activeDate.getFullYear() ); + } else if (key === 'end') { + date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1; + } + ctrl.activeDate.setFullYear(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.constant('datepickerPopupConfig', { + datepickerPopup: 'yyyy-MM-dd', + html5Types: { + date: 'yyyy-MM-dd', + 'datetime-local': 'yyyy-MM-ddTHH:mm:ss.sss', + 'month': 'yyyy-MM' + }, + currentText: 'Today', + clearText: 'Clear', + closeText: 'Done', + closeOnDateSelection: true, + appendToBody: false, + showButtonBar: true +}) + +.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', +function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) { + return { + restrict: 'EA', + require: 'ngModel', + scope: { + isOpen: '=?', + currentText: '@', + clearText: '@', + closeText: '@', + dateDisabled: '&', + customClass: '&' + }, + link: function(scope, element, attrs, ngModel) { + var dateFormat, + closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, + appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; + + scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; + + scope.getText = function( key ) { + return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text']; + }; + + var isHtml5DateInput = false; + if (datepickerPopupConfig.html5Types[attrs.type]) { + dateFormat = datepickerPopupConfig.html5Types[attrs.type]; + isHtml5DateInput = true; + } else { + dateFormat = attrs.datepickerPopup || datepickerPopupConfig.datepickerPopup; + attrs.$observe('datepickerPopup', function(value, oldValue) { + var newDateFormat = value || datepickerPopupConfig.datepickerPopup; + // Invalidate the $modelValue to ensure that formatters re-run + // FIXME: Refactor when PR is merged: https://github.com/angular/angular.js/pull/10764 + if (newDateFormat !== dateFormat) { + dateFormat = newDateFormat; + ngModel.$modelValue = null; + + if (!dateFormat) { + throw new Error('datepickerPopup must have a date format specified.'); + } + } + }); + } + + if (!dateFormat) { + throw new Error('datepickerPopup must have a date format specified.'); + } + + if (isHtml5DateInput && attrs.datepickerPopup) { + throw new Error('HTML5 date input types do not support custom formats.'); + } + + // popup element used to display calendar + var popupEl = angular.element('
'); + popupEl.attr({ + 'ng-model': 'date', + 'ng-change': 'dateSelection()' + }); + + function cameltoDash( string ){ + return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); }); + } + + // datepicker element + var datepickerEl = angular.element(popupEl.children()[0]); + if (isHtml5DateInput) { + if (attrs.type == 'month') { + datepickerEl.attr('datepicker-mode', '"month"'); + datepickerEl.attr('min-mode', 'month'); + } + } + + if ( attrs.datepickerOptions ) { + var options = scope.$parent.$eval(attrs.datepickerOptions); + if(options.initDate) { + scope.initDate = options.initDate; + datepickerEl.attr( 'init-date', 'initDate' ); + delete options.initDate; + } + angular.forEach(options, function( value, option ) { + datepickerEl.attr( cameltoDash(option), value ); + }); + } + + scope.watchData = {}; + angular.forEach(['minDate', 'maxDate', 'datepickerMode', 'initDate', 'shortcutPropagation'], function( key ) { + if ( attrs[key] ) { + var getAttribute = $parse(attrs[key]); + scope.$parent.$watch(getAttribute, function(value){ + scope.watchData[key] = value; + }); + datepickerEl.attr(cameltoDash(key), 'watchData.' + key); + + // Propagate changes from datepicker to outside + if ( key === 'datepickerMode' ) { + var setAttribute = getAttribute.assign; + scope.$watch('watchData.' + key, function(value, oldvalue) { + if ( value !== oldvalue ) { + setAttribute(scope.$parent, value); + } + }); + } + } + }); + if (attrs.dateDisabled) { + datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })'); + } + + if (attrs.showWeeks) { + datepickerEl.attr('show-weeks', attrs.showWeeks); + } + + if (attrs.customClass){ + datepickerEl.attr('custom-class', 'customClass({ date: date, mode: mode })'); + } + + function parseDate(viewValue) { + if (angular.isNumber(viewValue)) { + // presumably timestamp to date object + viewValue = new Date(viewValue); + } + + if (!viewValue) { + return null; + } else if (angular.isDate(viewValue) && !isNaN(viewValue)) { + return viewValue; + } else if (angular.isString(viewValue)) { + var date = dateParser.parse(viewValue, dateFormat, scope.date) || new Date(viewValue); + if (isNaN(date)) { + return undefined; + } else { + return date; + } + } else { + return undefined; + } + } + + function validator(modelValue, viewValue) { + var value = modelValue || viewValue; + if (angular.isNumber(value)) { + value = new Date(value); + } + if (!value) { + return true; + } else if (angular.isDate(value) && !isNaN(value)) { + return true; + } else if (angular.isString(value)) { + var date = dateParser.parse(value, dateFormat) || new Date(value); + return !isNaN(date); + } else { + return false; + } + } + + if (!isHtml5DateInput) { + // Internal API to maintain the correct ng-invalid-[key] class + ngModel.$$parserName = 'date'; + ngModel.$validators.date = validator; + ngModel.$parsers.unshift(parseDate); + ngModel.$formatters.push(function (value) { + scope.date = value; + return ngModel.$isEmpty(value) ? value : dateFilter(value, dateFormat); + }); + } + else { + ngModel.$formatters.push(function (value) { + scope.date = value; + return value; + }); + } + + // Inner change + scope.dateSelection = function(dt) { + if (angular.isDefined(dt)) { + scope.date = dt; + } + var date = scope.date ? dateFilter(scope.date, dateFormat) : ''; + element.val(date); + ngModel.$setViewValue(date); + + if ( closeOnDateSelection ) { + scope.isOpen = false; + element[0].focus(); + } + }; + + // Detect changes in the view from the text box + ngModel.$viewChangeListeners.push(function () { + scope.date = dateParser.parse(ngModel.$viewValue, dateFormat, scope.date) || new Date(ngModel.$viewValue); + }); + + var documentClickBind = function(event) { + if (scope.isOpen && event.target !== element[0]) { + scope.$apply(function() { + scope.isOpen = false; + }); + } + }; + + var keydown = function(evt, noApply) { + scope.keydown(evt); + }; + element.bind('keydown', keydown); + + scope.keydown = function(evt) { + if (evt.which === 27) { + evt.preventDefault(); + if (scope.isOpen) { + evt.stopPropagation(); + } + scope.close(); + } else if (evt.which === 40 && !scope.isOpen) { + scope.isOpen = true; + } + }; + + scope.$watch('isOpen', function(value) { + if (value) { + scope.$broadcast('datepicker.focus'); + scope.position = appendToBody ? $position.offset(element) : $position.position(element); + scope.position.top = scope.position.top + element.prop('offsetHeight'); + + $document.bind('click', documentClickBind); + } else { + $document.unbind('click', documentClickBind); + } + }); + + scope.select = function( date ) { + if (date === 'today') { + var today = new Date(); + if (angular.isDate(scope.date)) { + date = new Date(scope.date); + date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate()); + } else { + date = new Date(today.setHours(0, 0, 0, 0)); + } + } + scope.dateSelection( date ); + }; + + scope.close = function() { + scope.isOpen = false; + element[0].focus(); + }; + + var $popup = $compile(popupEl)(scope); + // Prevent jQuery cache memory leak (template is now redundant after linking) + popupEl.remove(); + + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + + scope.$on('$destroy', function() { + $popup.remove(); + element.unbind('keydown', keydown); + $document.unbind('click', documentClickBind); + }); + } + }; +}]) + +.directive('datepickerPopupWrap', function() { + return { + restrict:'EA', + replace: true, + transclude: true, + templateUrl: 'template/datepicker/popup.html', + link:function (scope, element, attrs) { + element.bind('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + }); + } + }; +}); + +angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position']) + +.constant('dropdownConfig', { + openClass: 'open' +}) + +.service('dropdownService', ['$document', '$rootScope', function($document, $rootScope) { + var openScope = null; + + this.open = function( dropdownScope ) { + if ( !openScope ) { + $document.bind('click', closeDropdown); + $document.bind('keydown', escapeKeyBind); + } + + if ( openScope && openScope !== dropdownScope ) { + openScope.isOpen = false; + } + + openScope = dropdownScope; + }; + + this.close = function( dropdownScope ) { + if ( openScope === dropdownScope ) { + openScope = null; + $document.unbind('click', closeDropdown); + $document.unbind('keydown', escapeKeyBind); + } + }; + + var closeDropdown = function( evt ) { + // This method may still be called during the same mouse event that + // unbound this event handler. So check openScope before proceeding. + if (!openScope) { return; } + + if( evt && openScope.getAutoClose() === 'disabled' ) { return ; } + + var toggleElement = openScope.getToggleElement(); + if ( evt && toggleElement && toggleElement[0].contains(evt.target) ) { + return; + } + + var $element = openScope.getElement(); + if( evt && openScope.getAutoClose() === 'outsideClick' && $element && $element[0].contains(evt.target) ) { + return; + } + + openScope.isOpen = false; + + if (!$rootScope.$$phase) { + openScope.$apply(); + } + }; + + var escapeKeyBind = function( evt ) { + if ( evt.which === 27 ) { + openScope.focusToggleElement(); + closeDropdown(); + } + }; +}]) + +.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', '$position', '$document', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate, $position, $document) { + var self = this, + scope = $scope.$new(), // create a child scope so we are not polluting original one + openClass = dropdownConfig.openClass, + getIsOpen, + setIsOpen = angular.noop, + toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop, + appendToBody = false; + + this.init = function( element ) { + self.$element = element; + + if ( $attrs.isOpen ) { + getIsOpen = $parse($attrs.isOpen); + setIsOpen = getIsOpen.assign; + + $scope.$watch(getIsOpen, function(value) { + scope.isOpen = !!value; + }); + } + + appendToBody = angular.isDefined($attrs.dropdownAppendToBody); + + if ( appendToBody && self.dropdownMenu ) { + $document.find('body').append( self.dropdownMenu ); + element.on('$destroy', function handleDestroyEvent() { + self.dropdownMenu.remove(); + }); + } + }; + + this.toggle = function( open ) { + return scope.isOpen = arguments.length ? !!open : !scope.isOpen; + }; + + // Allow other directives to watch status + this.isOpen = function() { + return scope.isOpen; + }; + + scope.getToggleElement = function() { + return self.toggleElement; + }; + + scope.getAutoClose = function() { + return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled' + }; + + scope.getElement = function() { + return self.$element; + }; + + scope.focusToggleElement = function() { + if ( self.toggleElement ) { + self.toggleElement[0].focus(); + } + }; + + scope.$watch('isOpen', function( isOpen, wasOpen ) { + if ( appendToBody && self.dropdownMenu ) { + var pos = $position.positionElements(self.$element, self.dropdownMenu, 'bottom-left', true); + self.dropdownMenu.css({ + top: pos.top + 'px', + left: pos.left + 'px', + display: isOpen ? 'block' : 'none' + }); + } + + $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass); + + if ( isOpen ) { + scope.focusToggleElement(); + dropdownService.open( scope ); + } else { + dropdownService.close( scope ); + } + + setIsOpen($scope, isOpen); + if (angular.isDefined(isOpen) && isOpen !== wasOpen) { + toggleInvoker($scope, { open: !!isOpen }); + } + }); + + $scope.$on('$locationChangeSuccess', function() { + scope.isOpen = false; + }); + + $scope.$on('$destroy', function() { + scope.$destroy(); + }); +}]) + +.directive('dropdown', function() { + return { + controller: 'DropdownController', + link: function(scope, element, attrs, dropdownCtrl) { + dropdownCtrl.init( element ); + } + }; +}) + +.directive('dropdownMenu', function() { + return { + restrict: 'AC', + require: '?^dropdown', + link: function(scope, element, attrs, dropdownCtrl) { + if ( !dropdownCtrl ) { + return; + } + dropdownCtrl.dropdownMenu = element; + } + }; +}) + +.directive('dropdownToggle', function() { + return { + require: '?^dropdown', + link: function(scope, element, attrs, dropdownCtrl) { + if ( !dropdownCtrl ) { + return; + } + + dropdownCtrl.toggleElement = element; + + var toggleDropdown = function(event) { + event.preventDefault(); + + if ( !element.hasClass('disabled') && !attrs.disabled ) { + scope.$apply(function() { + dropdownCtrl.toggle(); + }); + } + }; + + element.bind('click', toggleDropdown); + + // WAI-ARIA + element.attr({ 'aria-haspopup': true, 'aria-expanded': false }); + scope.$watch(dropdownCtrl.isOpen, function( isOpen ) { + element.attr('aria-expanded', !!isOpen); + }); + + scope.$on('$destroy', function() { + element.unbind('click', toggleDropdown); + }); + } + }; +}); + +angular.module('ui.bootstrap.modal', []) + +/** + * A helper, internal data structure that acts as a map but also allows getting / removing + * elements in the LIFO order + */ + .factory('$$stackedMap', function () { + return { + createNew: function () { + var stack = []; + + return { + add: function (key, value) { + stack.push({ + key: key, + value: value + }); + }, + get: function (key) { + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + return stack[i]; + } + } + }, + keys: function() { + var keys = []; + for (var i = 0; i < stack.length; i++) { + keys.push(stack[i].key); + } + return keys; + }, + top: function () { + return stack[stack.length - 1]; + }, + remove: function (key) { + var idx = -1; + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + idx = i; + break; + } + } + return stack.splice(idx, 1)[0]; + }, + removeTop: function () { + return stack.splice(stack.length - 1, 1)[0]; + }, + length: function () { + return stack.length; + } + }; + } + }; + }) + +/** + * A helper directive for the $modal service. It creates a backdrop element. + */ + .directive('modalBackdrop', ['$timeout', function ($timeout) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/modal/backdrop.html', + compile: function (tElement, tAttrs) { + tElement.addClass(tAttrs.backdropClass); + return linkFn; + } + }; + + function linkFn(scope, element, attrs) { + scope.animate = false; + + //trigger CSS transitions + $timeout(function () { + scope.animate = true; + }); + } + }]) + + .directive('modalWindow', ['$modalStack', '$q', function ($modalStack, $q) { + return { + restrict: 'EA', + scope: { + index: '@', + animate: '=' + }, + replace: true, + transclude: true, + templateUrl: function(tElement, tAttrs) { + return tAttrs.templateUrl || 'template/modal/window.html'; + }, + link: function (scope, element, attrs) { + element.addClass(attrs.windowClass || ''); + scope.size = attrs.size; + + scope.close = function (evt) { + var modal = $modalStack.getTop(); + if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { + evt.preventDefault(); + evt.stopPropagation(); + $modalStack.dismiss(modal.key, 'backdrop click'); + } + }; + + // This property is only added to the scope for the purpose of detecting when this directive is rendered. + // We can detect that by using this property in the template associated with this directive and then use + // {@link Attribute#$observe} on it. For more details please see {@link TableColumnResize}. + scope.$isRendered = true; + + // Deferred object that will be resolved when this modal is render. + var modalRenderDeferObj = $q.defer(); + // Observe function will be called on next digest cycle after compilation, ensuring that the DOM is ready. + // In order to use this way of finding whether DOM is ready, we need to observe a scope property used in modal's template. + attrs.$observe('modalRender', function (value) { + if (value == 'true') { + modalRenderDeferObj.resolve(); + } + }); + + modalRenderDeferObj.promise.then(function () { + // trigger CSS transitions + scope.animate = true; + + var inputsWithAutofocus = element[0].querySelectorAll('[autofocus]'); + /** + * Auto-focusing of a freshly-opened modal element causes any child elements + * with the autofocus attribute to lose focus. This is an issue on touch + * based devices which will show and then hide the onscreen keyboard. + * Attempts to refocus the autofocus element via JavaScript will not reopen + * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus + * the modal element if the modal does not contain an autofocus element. + */ + if (inputsWithAutofocus.length) { + inputsWithAutofocus[0].focus(); + } else { + element[0].focus(); + } + + // Notify {@link $modalStack} that modal is rendered. + var modal = $modalStack.getTop(); + if (modal) { + $modalStack.modalRendered(modal.key); + } + }); + } + }; + }]) + + .directive('modalAnimationClass', [ + function () { + return { + compile: function (tElement, tAttrs) { + if (tAttrs.modalAnimation) { + tElement.addClass(tAttrs.modalAnimationClass); + } + } + }; + }]) + + .directive('modalTransclude', function () { + return { + link: function($scope, $element, $attrs, controller, $transclude) { + $transclude($scope.$parent, function(clone) { + $element.empty(); + $element.append(clone); + }); + } + }; + }) + + .factory('$modalStack', ['$animate', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', + function ($animate, $timeout, $document, $compile, $rootScope, $$stackedMap) { + + var OPENED_MODAL_CLASS = 'modal-open'; + + var backdropDomEl, backdropScope; + var openedWindows = $$stackedMap.createNew(); + var $modalStack = {}; + + function backdropIndex() { + var topBackdropIndex = -1; + var opened = openedWindows.keys(); + for (var i = 0; i < opened.length; i++) { + if (openedWindows.get(opened[i]).value.backdrop) { + topBackdropIndex = i; + } + } + return topBackdropIndex; + } + + $rootScope.$watch(backdropIndex, function(newBackdropIndex){ + if (backdropScope) { + backdropScope.index = newBackdropIndex; + } + }); + + function removeModalWindow(modalInstance) { + + var body = $document.find('body').eq(0); + var modalWindow = openedWindows.get(modalInstance).value; + + //clean up the stack + openedWindows.remove(modalInstance); + + //remove window DOM element + removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function() { + body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); + checkRemoveBackdrop(); + }); + } + + function checkRemoveBackdrop() { + //remove backdrop if no longer needed + if (backdropDomEl && backdropIndex() == -1) { + var backdropScopeRef = backdropScope; + removeAfterAnimate(backdropDomEl, backdropScope, function () { + backdropScopeRef = null; + }); + backdropDomEl = undefined; + backdropScope = undefined; + } + } + + function removeAfterAnimate(domEl, scope, done) { + // Closing animation + scope.animate = false; + + if (domEl.attr('modal-animation') && $animate.enabled()) { + // transition out + domEl.one('$animate:close', function closeFn() { + $rootScope.$evalAsync(afterAnimating); + }); + } else { + // Ensure this call is async + $timeout(afterAnimating); + } + + function afterAnimating() { + if (afterAnimating.done) { + return; + } + afterAnimating.done = true; + + domEl.remove(); + scope.$destroy(); + if (done) { + done(); + } + } + } + + $document.bind('keydown', function (evt) { + var modal; + + if (evt.which === 27) { + modal = openedWindows.top(); + if (modal && modal.value.keyboard) { + evt.preventDefault(); + $rootScope.$apply(function () { + $modalStack.dismiss(modal.key, 'escape key press'); + }); + } + } + }); + + $modalStack.open = function (modalInstance, modal) { + + var modalOpener = $document[0].activeElement; + + openedWindows.add(modalInstance, { + deferred: modal.deferred, + renderDeferred: modal.renderDeferred, + modalScope: modal.scope, + backdrop: modal.backdrop, + keyboard: modal.keyboard + }); + + var body = $document.find('body').eq(0), + currBackdropIndex = backdropIndex(); + + if (currBackdropIndex >= 0 && !backdropDomEl) { + backdropScope = $rootScope.$new(true); + backdropScope.index = currBackdropIndex; + var angularBackgroundDomEl = angular.element('
'); + angularBackgroundDomEl.attr('backdrop-class', modal.backdropClass); + if (modal.animation) { + angularBackgroundDomEl.attr('modal-animation', 'true'); + } + backdropDomEl = $compile(angularBackgroundDomEl)(backdropScope); + body.append(backdropDomEl); + } + + var angularDomEl = angular.element('
'); + angularDomEl.attr({ + 'template-url': modal.windowTemplateUrl, + 'window-class': modal.windowClass, + 'size': modal.size, + 'index': openedWindows.length() - 1, + 'animate': 'animate' + }).html(modal.content); + if (modal.animation) { + angularDomEl.attr('modal-animation', 'true'); + } + + var modalDomEl = $compile(angularDomEl)(modal.scope); + openedWindows.top().value.modalDomEl = modalDomEl; + openedWindows.top().value.modalOpener = modalOpener; + body.append(modalDomEl); + body.addClass(OPENED_MODAL_CLASS); + }; + + function broadcastClosing(modalWindow, resultOrReason, closing) { + return !modalWindow.value.modalScope.$broadcast('modal.closing', resultOrReason, closing).defaultPrevented; + } + + $modalStack.close = function (modalInstance, result) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow && broadcastClosing(modalWindow, result, true)) { + modalWindow.value.deferred.resolve(result); + removeModalWindow(modalInstance); + modalWindow.value.modalOpener.focus(); + return true; + } + return !modalWindow; + }; + + $modalStack.dismiss = function (modalInstance, reason) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow && broadcastClosing(modalWindow, reason, false)) { + modalWindow.value.deferred.reject(reason); + removeModalWindow(modalInstance); + modalWindow.value.modalOpener.focus(); + return true; + } + return !modalWindow; + }; + + $modalStack.dismissAll = function (reason) { + var topModal = this.getTop(); + while (topModal && this.dismiss(topModal.key, reason)) { + topModal = this.getTop(); + } + }; + + $modalStack.getTop = function () { + return openedWindows.top(); + }; + + $modalStack.modalRendered = function (modalInstance) { + var modalWindow = openedWindows.get(modalInstance); + if (modalWindow) { + modalWindow.value.renderDeferred.resolve(); + } + }; + + return $modalStack; + }]) + + .provider('$modal', function () { + + var $modalProvider = { + options: { + animation: true, + backdrop: true, //can also be false or 'static' + keyboard: true + }, + $get: ['$injector', '$rootScope', '$q', '$templateRequest', '$controller', '$modalStack', + function ($injector, $rootScope, $q, $templateRequest, $controller, $modalStack) { + + var $modal = {}; + + function getTemplatePromise(options) { + return options.template ? $q.when(options.template) : + $templateRequest(angular.isFunction(options.templateUrl) ? (options.templateUrl)() : options.templateUrl); + } + + function getResolvePromises(resolves) { + var promisesArr = []; + angular.forEach(resolves, function (value) { + if (angular.isFunction(value) || angular.isArray(value)) { + promisesArr.push($q.when($injector.invoke(value))); + } + }); + return promisesArr; + } + + $modal.open = function (modalOptions) { + + var modalResultDeferred = $q.defer(); + var modalOpenedDeferred = $q.defer(); + var modalRenderDeferred = $q.defer(); + + //prepare an instance of a modal to be injected into controllers and returned to a caller + var modalInstance = { + result: modalResultDeferred.promise, + opened: modalOpenedDeferred.promise, + rendered: modalRenderDeferred.promise, + close: function (result) { + return $modalStack.close(modalInstance, result); + }, + dismiss: function (reason) { + return $modalStack.dismiss(modalInstance, reason); + } + }; + + //merge and clean up options + modalOptions = angular.extend({}, $modalProvider.options, modalOptions); + modalOptions.resolve = modalOptions.resolve || {}; + + //verify options + if (!modalOptions.template && !modalOptions.templateUrl) { + throw new Error('One of template or templateUrl options is required.'); + } + + var templateAndResolvePromise = + $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); + + + templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { + + var modalScope = (modalOptions.scope || $rootScope).$new(); + modalScope.$close = modalInstance.close; + modalScope.$dismiss = modalInstance.dismiss; + + var ctrlInstance, ctrlLocals = {}; + var resolveIter = 1; + + //controllers + if (modalOptions.controller) { + ctrlLocals.$scope = modalScope; + ctrlLocals.$modalInstance = modalInstance; + angular.forEach(modalOptions.resolve, function (value, key) { + ctrlLocals[key] = tplAndVars[resolveIter++]; + }); + + ctrlInstance = $controller(modalOptions.controller, ctrlLocals); + if (modalOptions.controllerAs) { + modalScope[modalOptions.controllerAs] = ctrlInstance; + } + } + + $modalStack.open(modalInstance, { + scope: modalScope, + deferred: modalResultDeferred, + renderDeferred: modalRenderDeferred, + content: tplAndVars[0], + animation: modalOptions.animation, + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + backdropClass: modalOptions.backdropClass, + windowClass: modalOptions.windowClass, + windowTemplateUrl: modalOptions.windowTemplateUrl, + size: modalOptions.size + }); + + }, function resolveError(reason) { + modalResultDeferred.reject(reason); + }); + + templateAndResolvePromise.then(function () { + modalOpenedDeferred.resolve(true); + }, function (reason) { + modalOpenedDeferred.reject(reason); + }); + + return modalInstance; + }; + + return $modal; + }] + }; + + return $modalProvider; + }); + +angular.module('ui.bootstrap.pagination', []) + +.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; + + this.init = function(ngModelCtrl_, config) { + ngModelCtrl = ngModelCtrl_; + this.config = config; + + ngModelCtrl.$render = function() { + self.render(); + }; + + if ($attrs.itemsPerPage) { + $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { + self.itemsPerPage = parseInt(value, 10); + $scope.totalPages = self.calculateTotalPages(); + }); + } else { + this.itemsPerPage = config.itemsPerPage; + } + + $scope.$watch('totalItems', function() { + $scope.totalPages = self.calculateTotalPages(); + }); + + $scope.$watch('totalPages', function(value) { + setNumPages($scope.$parent, value); // Readonly variable + + if ( $scope.page > value ) { + $scope.selectPage(value); + } else { + ngModelCtrl.$render(); + } + }); + }; + + this.calculateTotalPages = function() { + var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); + return Math.max(totalPages || 0, 1); + }; + + this.render = function() { + $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1; + }; + + $scope.selectPage = function(page, evt) { + if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) { + if (evt && evt.target) { + evt.target.blur(); + } + ngModelCtrl.$setViewValue(page); + ngModelCtrl.$render(); + } + }; + + $scope.getText = function( key ) { + return $scope[key + 'Text'] || self.config[key + 'Text']; + }; + $scope.noPrevious = function() { + return $scope.page === 1; + }; + $scope.noNext = function() { + return $scope.page === $scope.totalPages; + }; +}]) + +.constant('paginationConfig', { + itemsPerPage: 10, + boundaryLinks: false, + directionLinks: true, + firstText: 'First', + previousText: 'Previous', + nextText: 'Next', + lastText: 'Last', + rotate: true +}) + +.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + firstText: '@', + previousText: '@', + nextText: '@', + lastText: '@' + }, + require: ['pagination', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pagination.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + // Setup configuration parameters + var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize, + rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks; + + paginationCtrl.init(ngModelCtrl, paginationConfig); + + if (attrs.maxSize) { + scope.$parent.$watch($parse(attrs.maxSize), function(value) { + maxSize = parseInt(value, 10); + paginationCtrl.render(); + }); + } + + // Create page object used in template + function makePage(number, text, isActive) { + return { + number: number, + text: text, + active: isActive + }; + } + + function getPages(currentPage, totalPages) { + var pages = []; + + // Default page limits + var startPage = 1, endPage = totalPages; + var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); + + // recompute if maxSize + if ( isMaxSized ) { + if ( rotate ) { + // Current page is displayed in the middle of the visible ones + startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); + endPage = startPage + maxSize - 1; + + // Adjust if limit is exceeded + if (endPage > totalPages) { + endPage = totalPages; + startPage = endPage - maxSize + 1; + } + } else { + // Visible pages are paginated with maxSize + startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; + + // Adjust last page if limit is exceeded + endPage = Math.min(startPage + maxSize - 1, totalPages); + } + } + + // Add page number links + for (var number = startPage; number <= endPage; number++) { + var page = makePage(number, number, number === currentPage); + pages.push(page); + } + + // Add links to move between page sets + if ( isMaxSized && ! rotate ) { + if ( startPage > 1 ) { + var previousPageSet = makePage(startPage - 1, '...', false); + pages.unshift(previousPageSet); + } + + if ( endPage < totalPages ) { + var nextPageSet = makePage(endPage + 1, '...', false); + pages.push(nextPageSet); + } + } + + return pages; + } + + var originalRender = paginationCtrl.render; + paginationCtrl.render = function() { + originalRender(); + if (scope.page > 0 && scope.page <= scope.totalPages) { + scope.pages = getPages(scope.page, scope.totalPages); + } + }; + } + }; +}]) + +.constant('pagerConfig', { + itemsPerPage: 10, + previousText: '« Previous', + nextText: 'Next »', + align: true +}) + +.directive('pager', ['pagerConfig', function(pagerConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + previousText: '@', + nextText: '@' + }, + require: ['pager', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pager.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align; + paginationCtrl.init(ngModelCtrl, pagerConfig); + } + }; +}]); + +/** + * The following features are still outstanding: animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html tooltips, and selector delegation. + */ +angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) + +/** + * The $tooltip service creates tooltip- and popover-like directives as well as + * houses global options for them. + */ +.provider( '$tooltip', function () { + // The default options tooltip and popover. + var defaultOptions = { + placement: 'top', + animation: true, + popupDelay: 0, + useContentExp: false + }; + + // Default hide triggers for each show trigger + var triggerMap = { + 'mouseenter': 'mouseleave', + 'click': 'click', + 'focus': 'blur' + }; + + // The options specified to the provider globally. + var globalOptions = {}; + + /** + * `options({})` allows global configuration of all tooltips in the + * application. + * + * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { + * // place tooltips left instead of top by default + * $tooltipProvider.options( { placement: 'left' } ); + * }); + */ + this.options = function( value ) { + angular.extend( globalOptions, value ); + }; + + /** + * This allows you to extend the set of trigger mappings available. E.g.: + * + * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); + */ + this.setTriggers = function setTriggers ( triggers ) { + angular.extend( triggerMap, triggers ); + }; + + /** + * This is a helper function for translating camel-case to snake-case. + */ + function snake_case(name){ + var regexp = /[A-Z]/g; + var separator = '-'; + return name.replace(regexp, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); + } + + /** + * Returns the actual instance of the $tooltip service. + * TODO support multiple triggers + */ + this.$get = [ '$window', '$compile', '$timeout', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $document, $position, $interpolate ) { + return function $tooltip ( type, prefix, defaultTriggerShow, options ) { + options = angular.extend( {}, defaultOptions, globalOptions, options ); + + /** + * Returns an object of show and hide triggers. + * + * If a trigger is supplied, + * it is used to show the tooltip; otherwise, it will use the `trigger` + * option passed to the `$tooltipProvider.options` method; else it will + * default to the trigger supplied to this directive factory. + * + * The hide trigger is based on the show trigger. If the `trigger` option + * was passed to the `$tooltipProvider.options` method, it will use the + * mapped trigger from `triggerMap` or the passed trigger if the map is + * undefined; otherwise, it uses the `triggerMap` value of the show + * trigger; else it will just use the show trigger. + */ + function getTriggers ( trigger ) { + var show = trigger || options.trigger || defaultTriggerShow; + var hide = triggerMap[show] || show; + return { + show: show, + hide: hide + }; + } + + var directiveName = snake_case( type ); + + var startSym = $interpolate.startSymbol(); + var endSym = $interpolate.endSymbol(); + var template = + '
'+ + '
'; + + return { + restrict: 'EA', + compile: function (tElem, tAttrs) { + var tooltipLinker = $compile( template ); + + return function link ( scope, element, attrs, tooltipCtrl ) { + var tooltip; + var tooltipLinkedScope; + var transitionTimeout; + var popupTimeout; + var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; + var triggers = getTriggers( undefined ); + var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); + var ttScope = scope.$new(true); + + var positionTooltip = function () { + if (!tooltip) { return; } + + var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody); + ttPosition.top += 'px'; + ttPosition.left += 'px'; + + // Now set the calculated positioning. + tooltip.css( ttPosition ); + }; + + // Set up the correct scope to allow transclusion later + ttScope.origScope = scope; + + // By default, the tooltip is not open. + // TODO add ability to start tooltip opened + ttScope.isOpen = false; + + function toggleTooltipBind () { + if ( ! ttScope.isOpen ) { + showTooltipBind(); + } else { + hideTooltipBind(); + } + } + + // Show the tooltip with delay if specified, otherwise show it immediately + function showTooltipBind() { + if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { + return; + } + + prepareTooltip(); + + if ( ttScope.popupDelay ) { + // Do nothing if the tooltip was already scheduled to pop-up. + // This happens if show is triggered multiple times before any hide is triggered. + if (!popupTimeout) { + popupTimeout = $timeout( show, ttScope.popupDelay, false ); + popupTimeout.then(function(reposition){reposition();}); + } + } else { + show()(); + } + } + + function hideTooltipBind () { + scope.$apply(function () { + hide(); + }); + } + + // Show the tooltip popup element. + function show() { + + popupTimeout = null; + + // If there is a pending remove transition, we must cancel it, lest the + // tooltip be mysteriously removed. + if ( transitionTimeout ) { + $timeout.cancel( transitionTimeout ); + transitionTimeout = null; + } + + // Don't show empty tooltips. + if ( !(options.useContentExp ? ttScope.contentExp() : ttScope.content) ) { + return angular.noop; + } + + createTooltip(); + + // Set the initial positioning. + tooltip.css({ top: 0, left: 0, display: 'block' }); + ttScope.$digest(); + + positionTooltip(); + + // And show the tooltip. + ttScope.isOpen = true; + ttScope.$apply(); // digest required as $apply is not called + + // Return positioning function as promise callback for correct + // positioning after draw. + return positionTooltip; + } + + // Hide the tooltip popup element. + function hide() { + // First things first: we don't show it anymore. + ttScope.isOpen = false; + + //if tooltip is going to be shown after delay, we must cancel this + $timeout.cancel( popupTimeout ); + popupTimeout = null; + + // And now we remove it from the DOM. However, if we have animation, we + // need to wait for it to expire beforehand. + // FIXME: this is a placeholder for a port of the transitions library. + if ( ttScope.animation ) { + if (!transitionTimeout) { + transitionTimeout = $timeout(removeTooltip, 500); + } + } else { + removeTooltip(); + } + } + + function createTooltip() { + // There can only be one tooltip element per directive shown at once. + if (tooltip) { + removeTooltip(); + } + tooltipLinkedScope = ttScope.$new(); + tooltip = tooltipLinker(tooltipLinkedScope, function (tooltip) { + if ( appendToBody ) { + $document.find( 'body' ).append( tooltip ); + } else { + element.after( tooltip ); + } + }); + + tooltipLinkedScope.$watch(function () { + $timeout(positionTooltip, 0, false); + }); + + if (options.useContentExp) { + tooltipLinkedScope.$watch('contentExp()', function (val) { + if (!val && ttScope.isOpen ) { + hide(); + } + }); + } + } + + function removeTooltip() { + transitionTimeout = null; + if (tooltip) { + tooltip.remove(); + tooltip = null; + } + if (tooltipLinkedScope) { + tooltipLinkedScope.$destroy(); + tooltipLinkedScope = null; + } + } + + function prepareTooltip() { + prepPopupClass(); + prepPlacement(); + prepPopupDelay(); + } + + ttScope.contentExp = function () { + return scope.$eval(attrs[type]); + }; + + /** + * Observe the relevant attributes. + */ + if (!options.useContentExp) { + attrs.$observe( type, function ( val ) { + ttScope.content = val; + + if (!val && ttScope.isOpen ) { + hide(); + } + }); + } + + attrs.$observe( 'disabled', function ( val ) { + if (val && ttScope.isOpen ) { + hide(); + } + }); + + attrs.$observe( prefix+'Title', function ( val ) { + ttScope.title = val; + }); + + function prepPopupClass() { + ttScope.popupClass = attrs[prefix + 'Class']; + } + + function prepPlacement() { + var val = attrs[ prefix + 'Placement' ]; + ttScope.placement = angular.isDefined( val ) ? val : options.placement; + } + + function prepPopupDelay() { + var val = attrs[ prefix + 'PopupDelay' ]; + var delay = parseInt( val, 10 ); + ttScope.popupDelay = ! isNaN(delay) ? delay : options.popupDelay; + } + + var unregisterTriggers = function () { + element.unbind(triggers.show, showTooltipBind); + element.unbind(triggers.hide, hideTooltipBind); + }; + + function prepTriggers() { + var val = attrs[ prefix + 'Trigger' ]; + unregisterTriggers(); + + triggers = getTriggers( val ); + + if ( triggers.show === triggers.hide ) { + element.bind( triggers.show, toggleTooltipBind ); + } else { + element.bind( triggers.show, showTooltipBind ); + element.bind( triggers.hide, hideTooltipBind ); + } + } + prepTriggers(); + + var animation = scope.$eval(attrs[prefix + 'Animation']); + ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation; + + var appendToBodyVal = scope.$eval(attrs[prefix + 'AppendToBody']); + appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody; + + // if a tooltip is attached to we need to remove it on + // location change as its parent scope will probably not be destroyed + // by the change. + if ( appendToBody ) { + scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { + if ( ttScope.isOpen ) { + hide(); + } + }); + } + + // Make sure tooltip is destroyed and removed. + scope.$on('$destroy', function onDestroyTooltip() { + $timeout.cancel( transitionTimeout ); + $timeout.cancel( popupTimeout ); + unregisterTriggers(); + removeTooltip(); + ttScope = null; + }); + }; + } + }; + }; + }]; +}) + +// This is mostly ngInclude code but with a custom scope +.directive( 'tooltipTemplateTransclude', [ + '$animate', '$sce', '$compile', '$templateRequest', +function ($animate , $sce , $compile , $templateRequest) { + return { + link: function ( scope, elem, attrs ) { + var origScope = scope.$eval(attrs.tooltipTemplateTranscludeScope); + + var changeCounter = 0, + currentScope, + previousElement, + currentElement; + + var cleanupLastIncludeContent = function() { + if (previousElement) { + previousElement.remove(); + previousElement = null; + } + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + if (currentElement) { + $animate.leave(currentElement).then(function() { + previousElement = null; + }); + previousElement = currentElement; + currentElement = null; + } + }; + + scope.$watch($sce.parseAsResourceUrl(attrs.tooltipTemplateTransclude), function (src) { + var thisChangeId = ++changeCounter; + + if (src) { + //set the 2nd param to true to ignore the template request error so that the inner + //contents and scope can be cleaned up. + $templateRequest(src, true).then(function(response) { + if (thisChangeId !== changeCounter) { return; } + var newScope = origScope.$new(); + var template = response; + + var clone = $compile(template)(newScope, function(clone) { + cleanupLastIncludeContent(); + $animate.enter(clone, elem); + }); + + currentScope = newScope; + currentElement = clone; + + currentScope.$emit('$includeContentLoaded', src); + }, function() { + if (thisChangeId === changeCounter) { + cleanupLastIncludeContent(); + scope.$emit('$includeContentError', src); + } + }); + scope.$emit('$includeContentRequested', src); + } else { + cleanupLastIncludeContent(); + } + }); + + scope.$on('$destroy', cleanupLastIncludeContent); + } + }; +}]) + +/** + * Note that it's intentional that these classes are *not* applied through $animate. + * They must not be animated as they're expected to be present on the tooltip on + * initialization. + */ +.directive('tooltipClasses', function () { + return { + restrict: 'A', + link: function (scope, element, attrs) { + if (scope.placement) { + element.addClass(scope.placement); + } + if (scope.popupClass) { + element.addClass(scope.popupClass); + } + if (scope.animation()) { + element.addClass(attrs.tooltipAnimationClass); + } + } + }; +}) + +.directive( 'tooltipPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-popup.html' + }; +}) + +.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); +}]) + +.directive( 'tooltipTemplatePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&', + originScope: '&' }, + templateUrl: 'template/tooltip/tooltip-template-popup.html' + }; +}) + +.directive( 'tooltipTemplate', [ '$tooltip', function ( $tooltip ) { + return $tooltip('tooltipTemplate', 'tooltip', 'mouseenter', { + useContentExp: true + }); +}]) + +.directive( 'tooltipHtmlPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-html-popup.html' + }; +}) + +.directive( 'tooltipHtml', [ '$tooltip', function ( $tooltip ) { + return $tooltip('tooltipHtml', 'tooltip', 'mouseenter', { + useContentExp: true + }); +}]) + +/* +Deprecated +*/ +.directive( 'tooltipHtmlUnsafePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' + }; +}) + +.value('tooltipHtmlUnsafeSuppressDeprecated', false) +.directive( 'tooltipHtmlUnsafe', [ + '$tooltip', 'tooltipHtmlUnsafeSuppressDeprecated', '$log', +function ( $tooltip , tooltipHtmlUnsafeSuppressDeprecated , $log) { + if (!tooltipHtmlUnsafeSuppressDeprecated) { + $log.warn('tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead.'); + } + return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); +}]); + +/** + * The following features are still outstanding: popup delay, animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html popovers, and selector delegatation. + */ +angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) + +.directive( 'popoverTemplatePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&', + originScope: '&' }, + templateUrl: 'template/popover/popover-template.html' + }; +}) + +.directive( 'popoverTemplate', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'popoverTemplate', 'popover', 'click', { + useContentExp: true + } ); +}]) + +.directive( 'popoverPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/popover/popover.html' + }; +}) + +.directive( 'popover', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'popover', 'popover', 'click' ); +}]); + +angular.module('ui.bootstrap.progressbar', []) + +.constant('progressConfig', { + animate: true, + max: 100 +}) + +.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) { + var self = this, + animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; + + this.bars = []; + $scope.max = angular.isDefined($scope.max) ? $scope.max : progressConfig.max; + + this.addBar = function(bar, element) { + if ( !animate ) { + element.css({'transition': 'none'}); + } + + this.bars.push(bar); + + bar.$watch('value', function( value ) { + bar.percent = +(100 * value / $scope.max).toFixed(2); + }); + + bar.$on('$destroy', function() { + element = null; + self.removeBar(bar); + }); + }; + + this.removeBar = function(bar) { + this.bars.splice(this.bars.indexOf(bar), 1); + }; +}]) + +.directive('progress', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + require: 'progress', + scope: {}, + templateUrl: 'template/progressbar/progress.html' + }; +}) + +.directive('bar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + require: '^progress', + scope: { + value: '=', + max: '=?', + type: '@' + }, + templateUrl: 'template/progressbar/bar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, element); + } + }; +}) + +.directive('progressbar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + scope: { + value: '=', + max: '=?', + type: '@' + }, + templateUrl: 'template/progressbar/progressbar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, angular.element(element.children()[0])); + } + }; +}); + +angular.module('ui.bootstrap.rating', []) + +.constant('ratingConfig', { + max: 5, + stateOn: null, + stateOff: null +}) + +.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) { + var ngModelCtrl = { $setViewValue: angular.noop }; + + this.init = function(ngModelCtrl_) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + ngModelCtrl.$formatters.push(function(value) { + if (angular.isNumber(value) && value << 0 !== value) { + value = Math.round(value); + } + return value; + }); + + this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; + this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; + + var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) : + new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max ); + $scope.range = this.buildTemplateObjects(ratingStates); + }; + + this.buildTemplateObjects = function(states) { + for (var i = 0, n = states.length; i < n; i++) { + states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]); + } + return states; + }; + + $scope.rate = function(value) { + if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) { + ngModelCtrl.$setViewValue(value); + ngModelCtrl.$render(); + } + }; + + $scope.enter = function(value) { + if ( !$scope.readonly ) { + $scope.value = value; + } + $scope.onHover({value: value}); + }; + + $scope.reset = function() { + $scope.value = ngModelCtrl.$viewValue; + $scope.onLeave(); + }; + + $scope.onKeydown = function(evt) { + if (/(37|38|39|40)/.test(evt.which)) { + evt.preventDefault(); + evt.stopPropagation(); + $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) ); + } + }; + + this.render = function() { + $scope.value = ngModelCtrl.$viewValue; + }; +}]) + +.directive('rating', function() { + return { + restrict: 'EA', + require: ['rating', 'ngModel'], + scope: { + readonly: '=?', + onHover: '&', + onLeave: '&' + }, + controller: 'RatingController', + templateUrl: 'template/rating/rating.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + ratingCtrl.init( ngModelCtrl ); + } + }; +}); + +/** + * @ngdoc overview + * @name ui.bootstrap.tabs + * + * @description + * AngularJS version of the tabs directive. + */ + +angular.module('ui.bootstrap.tabs', []) + +.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { + var ctrl = this, + tabs = ctrl.tabs = $scope.tabs = []; + + ctrl.select = function(selectedTab) { + angular.forEach(tabs, function(tab) { + if (tab.active && tab !== selectedTab) { + tab.active = false; + tab.onDeselect(); + } + }); + selectedTab.active = true; + selectedTab.onSelect(); + }; + + ctrl.addTab = function addTab(tab) { + tabs.push(tab); + // we can't run the select function on the first tab + // since that would select it twice + if (tabs.length === 1 && tab.active !== false) { + tab.active = true; + } else if (tab.active) { + ctrl.select(tab); + } + else { + tab.active = false; + } + }; + + ctrl.removeTab = function removeTab(tab) { + var index = tabs.indexOf(tab); + //Select a new tab if the tab to be removed is selected and not destroyed + if (tab.active && tabs.length > 1 && !destroyed) { + //If this is the last tab, select the previous tab. else, the next tab. + var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; + ctrl.select(tabs[newActiveIndex]); + } + tabs.splice(index, 1); + }; + + var destroyed; + $scope.$on('$destroy', function() { + destroyed = true; + }); +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabset + * @restrict EA + * + * @description + * Tabset is the outer container for the tabs directive + * + * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. + * @param {boolean=} justified Whether or not to use justified styling for the tabs. + * + * @example + + + + First Content! + Second Content! + +
+ + First Vertical Content! + Second Vertical Content! + + + First Justified Content! + Second Justified Content! + +
+
+ */ +.directive('tabset', function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + scope: { + type: '@' + }, + controller: 'TabsetController', + templateUrl: 'template/tabs/tabset.html', + link: function(scope, element, attrs) { + scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; + scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; + } + }; +}) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tab + * @restrict EA + * + * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. + * @param {string=} select An expression to evaluate when the tab is selected. + * @param {boolean=} active A binding, telling whether or not this tab is selected. + * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. + * + * @description + * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. + * + * @example + + +
+ + +
+ + First Tab + + Alert me! + Second Tab, with alert callback and html heading! + + + {{item.content}} + + +
+
+ + function TabsDemoCtrl($scope) { + $scope.items = [ + { title:"Dynamic Title 1", content:"Dynamic Item 0" }, + { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } + ]; + + $scope.alertMe = function() { + setTimeout(function() { + alert("You've selected the alert tab!"); + }); + }; + }; + +
+ */ + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabHeading + * @restrict EA + * + * @description + * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. + * + * @example + + + + + HTML in my titles?! + And some content, too! + + + Icon heading?!? + That's right. + + + + + */ +.directive('tab', ['$parse', '$log', function($parse, $log) { + return { + require: '^tabset', + restrict: 'EA', + replace: true, + templateUrl: 'template/tabs/tab.html', + transclude: true, + scope: { + active: '=?', + heading: '@', + onSelect: '&select', //This callback is called in contentHeadingTransclude + //once it inserts the tab's content into the dom + onDeselect: '&deselect' + }, + controller: function() { + //Empty controller so other directives can require being 'under' a tab + }, + compile: function(elm, attrs, transclude) { + return function postLink(scope, elm, attrs, tabsetCtrl) { + scope.$watch('active', function(active) { + if (active) { + tabsetCtrl.select(scope); + } + }); + + scope.disabled = false; + if ( attrs.disable ) { + scope.$parent.$watch($parse(attrs.disable), function(value) { + scope.disabled = !! value; + }); + } + + // Deprecation support of "disabled" parameter + // fix(tab): IE9 disabled attr renders grey text on enabled tab #2677 + // This code is duplicated from the lines above to make it easy to remove once + // the feature has been completely deprecated + if ( attrs.disabled ) { + $log.warn('Use of "disabled" attribute has been deprecated, please use "disable"'); + scope.$parent.$watch($parse(attrs.disabled), function(value) { + scope.disabled = !! value; + }); + } + + scope.select = function() { + if ( !scope.disabled ) { + scope.active = true; + } + }; + + tabsetCtrl.addTab(scope); + scope.$on('$destroy', function() { + tabsetCtrl.removeTab(scope); + }); + + //We need to transclude later, once the content container is ready. + //when this link happens, we're inside a tab heading. + scope.$transcludeFn = transclude; + }; + } + }; +}]) + +.directive('tabHeadingTransclude', [function() { + return { + restrict: 'A', + require: '^tab', + link: function(scope, elm, attrs, tabCtrl) { + scope.$watch('headingElement', function updateHeadingElement(heading) { + if (heading) { + elm.html(''); + elm.append(heading); + } + }); + } + }; +}]) + +.directive('tabContentTransclude', function() { + return { + restrict: 'A', + require: '^tabset', + link: function(scope, elm, attrs) { + var tab = scope.$eval(attrs.tabContentTransclude); + + //Now our tab is ready to be transcluded: both the tab heading area + //and the tab content area are loaded. Transclude 'em both. + tab.$transcludeFn(tab.$parent, function(contents) { + angular.forEach(contents, function(node) { + if (isTabHeading(node)) { + //Let tabHeadingTransclude know. + tab.headingElement = node; + } else { + elm.append(node); + } + }); + }); + } + }; + function isTabHeading(node) { + return node.tagName && ( + node.hasAttribute('tab-heading') || + node.hasAttribute('data-tab-heading') || + node.tagName.toLowerCase() === 'tab-heading' || + node.tagName.toLowerCase() === 'data-tab-heading' + ); + } +}) + +; + +angular.module('ui.bootstrap.timepicker', []) + +.constant('timepickerConfig', { + hourStep: 1, + minuteStep: 1, + showMeridian: true, + meridians: null, + readonlyInput: false, + mousewheel: true, + arrowkeys: true +}) + +.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) { + var selected = new Date(), + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; + + this.init = function( ngModelCtrl_, inputs ) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + ngModelCtrl.$formatters.unshift(function (modelValue) { + return modelValue ? new Date( modelValue ) : null; + }); + + var hoursInputEl = inputs.eq(0), + minutesInputEl = inputs.eq(1); + + var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel; + if ( mousewheel ) { + this.setupMousewheelEvents( hoursInputEl, minutesInputEl ); + } + + var arrowkeys = angular.isDefined($attrs.arrowkeys) ? $scope.$parent.$eval($attrs.arrowkeys) : timepickerConfig.arrowkeys; + if (arrowkeys) { + this.setupArrowkeyEvents( hoursInputEl, minutesInputEl ); + } + + $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput; + this.setupInputEvents( hoursInputEl, minutesInputEl ); + }; + + var hourStep = timepickerConfig.hourStep; + if ($attrs.hourStep) { + $scope.$parent.$watch($parse($attrs.hourStep), function(value) { + hourStep = parseInt(value, 10); + }); + } + + var minuteStep = timepickerConfig.minuteStep; + if ($attrs.minuteStep) { + $scope.$parent.$watch($parse($attrs.minuteStep), function(value) { + minuteStep = parseInt(value, 10); + }); + } + + // 12H / 24H mode + $scope.showMeridian = timepickerConfig.showMeridian; + if ($attrs.showMeridian) { + $scope.$parent.$watch($parse($attrs.showMeridian), function(value) { + $scope.showMeridian = !!value; + + if ( ngModelCtrl.$error.time ) { + // Evaluate from template + var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); + if (angular.isDefined( hours ) && angular.isDefined( minutes )) { + selected.setHours( hours ); + refresh(); + } + } else { + updateTemplate(); + } + }); + } + + // Get $scope.hours in 24H mode if valid + function getHoursFromTemplate ( ) { + var hours = parseInt( $scope.hours, 10 ); + var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); + if ( !valid ) { + return undefined; + } + + if ( $scope.showMeridian ) { + if ( hours === 12 ) { + hours = 0; + } + if ( $scope.meridian === meridians[1] ) { + hours = hours + 12; + } + } + return hours; + } + + function getMinutesFromTemplate() { + var minutes = parseInt($scope.minutes, 10); + return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; + } + + function pad( value ) { + return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value.toString(); + } + + // Respond on mousewheel spin + this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) { + var isScrollingUp = function(e) { + if (e.originalEvent) { + e = e.originalEvent; + } + //pick correct delta variable depending on event + var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; + return (e.detail || delta > 0); + }; + + hoursInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() ); + e.preventDefault(); + }); + + minutesInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() ); + e.preventDefault(); + }); + + }; + + // Respond on up/down arrowkeys + this.setupArrowkeyEvents = function( hoursInputEl, minutesInputEl ) { + hoursInputEl.bind('keydown', function(e) { + if ( e.which === 38 ) { // up + e.preventDefault(); + $scope.incrementHours(); + $scope.$apply(); + } + else if ( e.which === 40 ) { // down + e.preventDefault(); + $scope.decrementHours(); + $scope.$apply(); + } + }); + + minutesInputEl.bind('keydown', function(e) { + if ( e.which === 38 ) { // up + e.preventDefault(); + $scope.incrementMinutes(); + $scope.$apply(); + } + else if ( e.which === 40 ) { // down + e.preventDefault(); + $scope.decrementMinutes(); + $scope.$apply(); + } + }); + }; + + this.setupInputEvents = function( hoursInputEl, minutesInputEl ) { + if ( $scope.readonlyInput ) { + $scope.updateHours = angular.noop; + $scope.updateMinutes = angular.noop; + return; + } + + var invalidate = function(invalidHours, invalidMinutes) { + ngModelCtrl.$setViewValue( null ); + ngModelCtrl.$setValidity('time', false); + if (angular.isDefined(invalidHours)) { + $scope.invalidHours = invalidHours; + } + if (angular.isDefined(invalidMinutes)) { + $scope.invalidMinutes = invalidMinutes; + } + }; + + $scope.updateHours = function() { + var hours = getHoursFromTemplate(); + + if ( angular.isDefined(hours) ) { + selected.setHours( hours ); + refresh( 'h' ); + } else { + invalidate(true); + } + }; + + hoursInputEl.bind('blur', function(e) { + if ( !$scope.invalidHours && $scope.hours < 10) { + $scope.$apply( function() { + $scope.hours = pad( $scope.hours ); + }); + } + }); + + $scope.updateMinutes = function() { + var minutes = getMinutesFromTemplate(); + + if ( angular.isDefined(minutes) ) { + selected.setMinutes( minutes ); + refresh( 'm' ); + } else { + invalidate(undefined, true); + } + }; + + minutesInputEl.bind('blur', function(e) { + if ( !$scope.invalidMinutes && $scope.minutes < 10 ) { + $scope.$apply( function() { + $scope.minutes = pad( $scope.minutes ); + }); + } + }); + + }; + + this.render = function() { + var date = ngModelCtrl.$viewValue; + + if ( isNaN(date) ) { + ngModelCtrl.$setValidity('time', false); + $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } else { + if ( date ) { + selected = date; + } + makeValid(); + updateTemplate(); + } + }; + + // Call internally when we know that model is valid. + function refresh( keyboardChange ) { + makeValid(); + ngModelCtrl.$setViewValue( new Date(selected) ); + updateTemplate( keyboardChange ); + } + + function makeValid() { + ngModelCtrl.$setValidity('time', true); + $scope.invalidHours = false; + $scope.invalidMinutes = false; + } + + function updateTemplate( keyboardChange ) { + var hours = selected.getHours(), minutes = selected.getMinutes(); + + if ( $scope.showMeridian ) { + hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system + } + + $scope.hours = keyboardChange === 'h' ? hours : pad(hours); + if (keyboardChange !== 'm') { + $scope.minutes = pad(minutes); + } + $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; + } + + function addMinutes( minutes ) { + var dt = new Date( selected.getTime() + minutes * 60000 ); + selected.setHours( dt.getHours(), dt.getMinutes() ); + refresh(); + } + + $scope.incrementHours = function() { + addMinutes( hourStep * 60 ); + }; + $scope.decrementHours = function() { + addMinutes( - hourStep * 60 ); + }; + $scope.incrementMinutes = function() { + addMinutes( minuteStep ); + }; + $scope.decrementMinutes = function() { + addMinutes( - minuteStep ); + }; + $scope.toggleMeridian = function() { + addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); + }; +}]) + +.directive('timepicker', function () { + return { + restrict: 'EA', + require: ['timepicker', '?^ngModel'], + controller:'TimepickerController', + replace: true, + scope: {}, + templateUrl: 'template/timepicker/timepicker.html', + link: function(scope, element, attrs, ctrls) { + var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + timepickerCtrl.init( ngModelCtrl, element.find('input') ); + } + } + }; +}); + +angular.module('ui.bootstrap.transition', []) + +.value('$transitionSuppressDeprecated', false) +/** + * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. + * @param {DOMElement} element The DOMElement that will be animated. + * @param {string|object|function} trigger The thing that will cause the transition to start: + * - As a string, it represents the css class to be added to the element. + * - As an object, it represents a hash of style attributes to be applied to the element. + * - As a function, it represents a function to be called that will cause the transition to occur. + * @return {Promise} A promise that is resolved when the transition finishes. + */ +.factory('$transition', [ + '$q', '$timeout', '$rootScope', '$log', '$transitionSuppressDeprecated', +function($q , $timeout , $rootScope , $log , $transitionSuppressDeprecated) { + + if (!$transitionSuppressDeprecated) { + $log.warn('$transition is now deprecated. Use $animate from ngAnimate instead.'); + } + + var $transition = function(element, trigger, options) { + options = options || {}; + var deferred = $q.defer(); + var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName']; + + var transitionEndHandler = function(event) { + $rootScope.$apply(function() { + element.unbind(endEventName, transitionEndHandler); + deferred.resolve(element); + }); + }; + + if (endEventName) { + element.bind(endEventName, transitionEndHandler); + } + + // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur + $timeout(function() { + if ( angular.isString(trigger) ) { + element.addClass(trigger); + } else if ( angular.isFunction(trigger) ) { + trigger(element); + } else if ( angular.isObject(trigger) ) { + element.css(trigger); + } + //If browser does not support transitions, instantly resolve + if ( !endEventName ) { + deferred.resolve(element); + } + }); + + // Add our custom cancel function to the promise that is returned + // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, + // i.e. it will therefore never raise a transitionEnd event for that transition + deferred.promise.cancel = function() { + if ( endEventName ) { + element.unbind(endEventName, transitionEndHandler); + } + deferred.reject('Transition cancelled'); + }; + + return deferred.promise; + }; + + // Work out the name of the transitionEnd event + var transElement = document.createElement('trans'); + var transitionEndEventNames = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'transition': 'transitionend' + }; + var animationEndEventNames = { + 'WebkitTransition': 'webkitAnimationEnd', + 'MozTransition': 'animationend', + 'OTransition': 'oAnimationEnd', + 'transition': 'animationend' + }; + function findEndEventName(endEventNames) { + for (var name in endEventNames){ + if (transElement.style[name] !== undefined) { + return endEventNames[name]; + } + } + } + $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); + $transition.animationEndEventName = findEndEventName(animationEndEventNames); + return $transition; +}]); + +angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) + +/** + * A helper service that can parse typeahead's syntax (string provided by users) + * Extracted to a separate service for ease of unit testing + */ + .factory('typeaheadParser', ['$parse', function ($parse) { + + // 00000111000000000000022200000000000000003333333333333330000000000044000 + var TYPEAHEAD_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/; + + return { + parse:function (input) { + + var match = input.match(TYPEAHEAD_REGEXP); + if (!match) { + throw new Error( + 'Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_"' + + ' but got "' + input + '".'); + } + + return { + itemName:match[3], + source:$parse(match[4]), + viewMapper:$parse(match[2] || match[1]), + modelMapper:$parse(match[1]) + }; + } + }; +}]) + + .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', + function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { + + var HOT_KEYS = [9, 13, 27, 38, 40]; + + return { + require:'ngModel', + link:function (originalScope, element, attrs, modelCtrl) { + + //SUPPORTED ATTRIBUTES (OPTIONS) + + //minimal no of characters that needs to be entered before typeahead kicks-in + var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; + + //minimal wait time after last character typed before typeahead kicks-in + var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; + + //should it restrict model values to the ones selected from the popup only? + var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; + + //binding to a variable that indicates if matches are being retrieved asynchronously + var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; + + //a callback executed when a match is selected + var onSelectCallback = $parse(attrs.typeaheadOnSelect); + + var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; + + var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false; + + var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false; + + //INTERNAL VARIABLES + + //model setter executed upon match selection + var $setModelValue = $parse(attrs.ngModel).assign; + + //expressions used by typeahead + var parserResult = typeaheadParser.parse(attrs.typeahead); + + var hasFocus; + + //create a child scope for the typeahead directive so we are not polluting original scope + //with typeahead-specific data (matches, query etc.) + var scope = originalScope.$new(); + originalScope.$on('$destroy', function(){ + scope.$destroy(); + }); + + // WAI-ARIA + var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000); + element.attr({ + 'aria-autocomplete': 'list', + 'aria-expanded': false, + 'aria-owns': popupId + }); + + //pop-up element used to display matches + var popUpEl = angular.element('
'); + popUpEl.attr({ + id: popupId, + matches: 'matches', + active: 'activeIdx', + select: 'select(activeIdx)', + query: 'query', + position: 'position' + }); + //custom item template + if (angular.isDefined(attrs.typeaheadTemplateUrl)) { + popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); + } + + var resetMatches = function() { + scope.matches = []; + scope.activeIdx = -1; + element.attr('aria-expanded', false); + }; + + var getMatchId = function(index) { + return popupId + '-option-' + index; + }; + + // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead. + // This attribute is added or removed automatically when the `activeIdx` changes. + scope.$watch('activeIdx', function(index) { + if (index < 0) { + element.removeAttr('aria-activedescendant'); + } else { + element.attr('aria-activedescendant', getMatchId(index)); + } + }); + + var getMatchesAsync = function(inputValue) { + + var locals = {$viewValue: inputValue}; + isLoadingSetter(originalScope, true); + $q.when(parserResult.source(originalScope, locals)).then(function(matches) { + + //it might happen that several async queries were in progress if a user were typing fast + //but we are interested only in responses that correspond to the current view value + var onCurrentRequest = (inputValue === modelCtrl.$viewValue); + if (onCurrentRequest && hasFocus) { + if (matches && matches.length > 0) { + + scope.activeIdx = focusFirst ? 0 : -1; + scope.matches.length = 0; + + //transform labels + for(var i=0; i= minSearch) { + if (waitTime > 0) { + cancelPreviousTimeout(); + scheduleSearchWithTimeout(inputValue); + } else { + getMatchesAsync(inputValue); + } + } else { + isLoadingSetter(originalScope, false); + cancelPreviousTimeout(); + resetMatches(); + } + + if (isEditable) { + return inputValue; + } else { + if (!inputValue) { + // Reset in case user had typed something previously. + modelCtrl.$setValidity('editable', true); + return inputValue; + } else { + modelCtrl.$setValidity('editable', false); + return undefined; + } + } + }); + + modelCtrl.$formatters.push(function (modelValue) { + + var candidateViewValue, emptyViewValue; + var locals = {}; + + // The validity may be set to false via $parsers (see above) if + // the model is restricted to selected values. If the model + // is set manually it is considered to be valid. + if (!isEditable) { + modelCtrl.$setValidity('editable', true); + } + + if (inputFormatter) { + + locals.$model = modelValue; + return inputFormatter(originalScope, locals); + + } else { + + //it might happen that we don't have enough info to properly render input value + //we need to check for this situation and simply return model value if we can't apply custom formatting + locals[parserResult.itemName] = modelValue; + candidateViewValue = parserResult.viewMapper(originalScope, locals); + locals[parserResult.itemName] = undefined; + emptyViewValue = parserResult.viewMapper(originalScope, locals); + + return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; + } + }); + + scope.select = function (activeIdx) { + //called from within the $digest() cycle + var locals = {}; + var model, item; + + locals[parserResult.itemName] = item = scope.matches[activeIdx].model; + model = parserResult.modelMapper(originalScope, locals); + $setModelValue(originalScope, model); + modelCtrl.$setValidity('editable', true); + modelCtrl.$setValidity('parse', true); + + onSelectCallback(originalScope, { + $item: item, + $model: model, + $label: parserResult.viewMapper(originalScope, locals) + }); + + resetMatches(); + + //return focus to the input element if a match was selected via a mouse click event + // use timeout to avoid $rootScope:inprog error + $timeout(function() { element[0].focus(); }, 0, false); + }; + + //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) + element.bind('keydown', function (evt) { + + //typeahead is open and an "interesting" key was pressed + if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { + return; + } + + // if there's nothing selected (i.e. focusFirst) and enter is hit, don't do anything + if (scope.activeIdx == -1 && (evt.which === 13 || evt.which === 9)) { + return; + } + + evt.preventDefault(); + + if (evt.which === 40) { + scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; + scope.$digest(); + + } else if (evt.which === 38) { + scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1; + scope.$digest(); + + } else if (evt.which === 13 || evt.which === 9) { + scope.$apply(function () { + scope.select(scope.activeIdx); + }); + + } else if (evt.which === 27) { + evt.stopPropagation(); + + resetMatches(); + scope.$digest(); + } + }); + + element.bind('blur', function (evt) { + hasFocus = false; + }); + + // Keep reference to click handler to unbind it. + var dismissClickHandler = function (evt) { + if (element[0] !== evt.target) { + resetMatches(); + scope.$digest(); + } + }; + + $document.bind('click', dismissClickHandler); + + originalScope.$on('$destroy', function(){ + $document.unbind('click', dismissClickHandler); + if (appendToBody) { + $popup.remove(); + } + // Prevent jQuery cache memory leak + popUpEl.remove(); + }); + + var $popup = $compile(popUpEl)(scope); + + if (appendToBody) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + } + }; + +}]) + + .directive('typeaheadPopup', function () { + return { + restrict:'EA', + scope:{ + matches:'=', + query:'=', + active:'=', + position:'=', + select:'&' + }, + replace:true, + templateUrl:'template/typeahead/typeahead-popup.html', + link:function (scope, element, attrs) { + + scope.templateUrl = attrs.templateUrl; + + scope.isOpen = function () { + return scope.matches.length > 0; + }; + + scope.isActive = function (matchIdx) { + return scope.active == matchIdx; + }; + + scope.selectActive = function (matchIdx) { + scope.active = matchIdx; + }; + + scope.selectMatch = function (activeIdx) { + scope.select({activeIdx:activeIdx}); + }; + } + }; + }) + + .directive('typeaheadMatch', ['$templateRequest', '$compile', '$parse', function ($templateRequest, $compile, $parse) { + return { + restrict:'EA', + scope:{ + index:'=', + match:'=', + query:'=' + }, + link:function (scope, element, attrs) { + var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; + $templateRequest(tplUrl).then(function(tplContent) { + $compile(tplContent.trim())(scope, function(clonedElement){ + element.replaceWith(clonedElement); + }); + }); + } + }; + }]) + + .filter('typeaheadHighlight', function() { + + function escapeRegexp(queryToEscape) { + return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + } + + return function(matchItem, query) { + return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; + }; + }); + +angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion-group.html", + "
\n" + + "
\n" + + "

\n" + + " {{heading}}\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion.html", + "
"); +}]); + +angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/alert/alert.html", + "
\n" + + " \n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/carousel.html", + "
\n" + + "
    1\">\n" + + "
  1. \n" + + "
\n" + + "
\n" + + " 1\">\n" + + " 1\">\n" + + "
\n" + + ""); +}]); + +angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/slide.html", + "
\n" + + ""); +}]); + +angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/datepicker.html", + "
\n" + + " \n" + + " \n" + + " \n" + + "
"); +}]); + +angular.module("template/datepicker/day.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/day.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
{{label.abbr}}
{{ weekNumbers[$index] }}\n" + + " \n" + + "
\n" + + ""); +}]); + +angular.module("template/datepicker/month.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/month.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + ""); +}]); + +angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/popup.html", + "
    \n" + + "
  • \n" + + "
  • \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
  • \n" + + "
\n" + + ""); +}]); + +angular.module("template/datepicker/year.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/year.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + ""); +}]); + +angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/backdrop.html", + "
\n" + + ""); +}]); + +angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/window.html", + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pager.html", + ""); +}]); + +angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pagination.html", + ""); +}]); + +angular.module("template/tooltip/tooltip-html-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-html-popup.html", + "
\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html", + "
\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-popup.html", + "
\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/tooltip/tooltip-template-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-template-popup.html", + "
\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/popover/popover-template.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/popover/popover-template.html", + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/popover/popover-window.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/popover/popover-window.html", + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/popover/popover.html", + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/bar.html", + "
\n" + + ""); +}]); + +angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progress.html", + "
"); +}]); + +angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progressbar.html", + "
\n" + + "
\n" + + "
\n" + + ""); +}]); + +angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/rating/rating.html", + "\n" + + " \n" + + " ({{ $index < value ? '*' : ' ' }})\n" + + " \n" + + ""); +}]); + +angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tab.html", + "
  • \n" + + " {{heading}}\n" + + "
  • \n" + + ""); +}]); + +angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tabset.html", + "
    \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + ""); +}]); + +angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/timepicker/timepicker.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
       
      \n" + + " \n" + + " :\n" + + " \n" + + "
       
      \n" + + ""); +}]); + +angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-match.html", + ""); +}]); + +angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-popup.html", + "
        \n" + + "
      • \n" + + "
        \n" + + "
      • \n" + + "
      \n" + + ""); +}]); +!angular.$$csp() && angular.element(document).find('head').prepend(''); \ No newline at end of file diff --git a/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js b/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js new file mode 100644 index 000000000..6a0ef272c --- /dev/null +++ b/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js @@ -0,0 +1,13 @@ +angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("collapse",["$animate",function(a){return{link:function(b,c,d){function e(){c.removeClass("collapse").addClass("collapsing"),a.addClass(c,"in",{to:{height:c[0].scrollHeight+"px"}}).then(f)}function f(){c.removeClass("collapsing"),c.css({height:"auto"})}function g(){c.css({height:c[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing"),a.removeClass(c,"in",{to:{height:"0"}}).then(h)}function h(){c.css({height:"0"}),c.removeClass("collapsing"),c.addClass("collapse")}b.$watch(d.collapse,function(a){a?g():e()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("CarouselController",["$scope","$interval","$animate",function(a,b,c){function d(a){if(angular.isUndefined(k[a].index))return k[a];var b;k.length;for(b=0;b0&&(h=b(g,c))}function f(){h&&(b.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(b,d){function f(){m||(angular.extend(b,{direction:d,active:!0}),angular.extend(j.currentSlide||{},{direction:d,active:!1}),c.enabled()&&!a.noTransition&&b.$element&&(a.$currentTransition=!0,b.$element.one("$animate:close",function(){a.$currentTransition=null})),j.currentSlide=b,l=g,e())}var g=j.indexOfSlide(b);void 0===d&&(d=g>j.getCurrentIndex()?"next":"prev"),b&&b!==j.currentSlide&&f()},a.$on("$destroy",function(){m=!0}),j.getCurrentIndex=function(){return j.currentSlide&&angular.isDefined(j.currentSlide.index)?+j.currentSlide.index:l},j.indexOfSlide=function(a){return angular.isDefined(a.index)?+a.index:k.indexOf(a)},a.next=function(){var b=(j.getCurrentIndex()+1)%k.length;return a.$currentTransition?void 0:j.select(d(b),"next")},a.prev=function(){var b=j.getCurrentIndex()-1<0?k.length-1:j.getCurrentIndex()-1;return a.$currentTransition?void 0:j.select(d(b),"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){angular.isDefined(a.index)&&k.sort(function(a,b){return+a.index>+b.index});var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?b>=k.length?j.select(k[b-1]):j.select(k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}).animation(".item",["$animate",function(a){return{beforeAddClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return b.addClass(f),a.addClass(b,g).then(function(){e||b.removeClass(g+" "+f),d()}),function(){e=!0}}d()},beforeRemoveClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return a.addClass(b,g).then(function(){e||b.removeClass(g),d()}),function(){e=!0}}d()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(f,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}var e=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.parsers={};var f={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")},HH:{regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a}},H:{regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a}},mm:{regex:"[0-5][0-9]",apply:function(a){this.minutes=+a}},m:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a}},sss:{regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a}},ss:{regex:"[0-5][0-9]",apply:function(a){this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}}};this.parse=function(b,f,g){if(!angular.isString(b)||!f)return b;f=a.DATETIME_FORMATS[f]||f,f=f.replace(e,"\\$&"),this.parsers[f]||(this.parsers[f]=c(f));var h=this.parsers[f],i=h.regex,j=h.map,k=b.match(i);if(k&&k.length){var l,m;l=g?{year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(),milliseconds:g.getMilliseconds()}:{year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0};for(var n=1,o=k.length;o>n;n++){var p=j[n-1];p.apply&&p.apply.call(l,k[n])}return d(l.year,l.month,l.date)&&(m=new Date(l.year,l.month,l.date,l.hours,l.minutes,l.seconds,l.milliseconds||0)),m}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.maxMode=i.maxMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=(11-e.startingDay)%7,p=b.rows.length,q=0;p>q;q++)b.weekNumbers.push(h(b.rows[q][o].date))}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a,b){var c=e.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(d,1),c=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(c)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a,b){var c=e.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);e.activeDate.setMonth(c)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a,b){var c=d.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=5:"right"===a?c+=1:"down"===a?c+=5:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*d.step.years:"home"===a?c=e(d.activeDate.getFullYear()):"end"===a&&(c=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(c)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(angular.isNumber(a)&&(a=new Date(a)),a){if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=f.parse(a,o,h.date)||new Date(a);return isNaN(b)?void 0:b}return void 0}return null}function n(a,b){var c=a||b;if(angular.isNumber(c)&&(c=new Date(c)),c){if(angular.isDate(c)&&!isNaN(c))return!0;if(angular.isString(c)){var d=f.parse(c,o)||new Date(c);return!isNaN(d)}return!1}return!0}var o,p=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,q=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]};var r=!1;if(g.html5Types[j.type]?(o=g.html5Types[j.type],r=!0):(o=j.datepickerPopup||g.datepickerPopup,j.$observe("datepickerPopup",function(a,b){var c=a||g.datepickerPopup;if(c!==o&&(o=c,k.$modelValue=null,!o))throw new Error("datepickerPopup must have a date format specified.")})),!o)throw new Error("datepickerPopup must have a date format specified.");if(r&&j.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");var s=angular.element("
      ");s.attr({"ng-model":"date","ng-change":"dateSelection()"});var t=angular.element(s.children()[0]);if(r&&"month"==j.type&&(t.attr("datepicker-mode",'"month"'),t.attr("min-mode","month")),j.datepickerOptions){var u=h.$parent.$eval(j.datepickerOptions);u.initDate&&(h.initDate=u.initDate,t.attr("init-date","initDate"),delete u.initDate),angular.forEach(u,function(a,b){t.attr(l(b),a)})}h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),t.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&t.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),j.showWeeks&&t.attr("show-weeks",j.showWeeks),j.customClass&&t.attr("custom-class","customClass({ date: date, mode: mode })"),r?k.$formatters.push(function(a){return h.date=a,a}):(k.$$parserName="date",k.$validators.date=n,k.$parsers.unshift(m),k.$formatters.push(function(a){return h.date=a,k.$isEmpty(a)?a:e(a,o)})),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a);var b=h.date?e(h.date,o):"";i.val(b),k.$setViewValue(b),p&&(h.isOpen=!1,i[0].focus())},k.$viewChangeListeners.push(function(){h.date=f.parse(k.$viewValue,o,h.date)||new Date(k.$viewValue)});var v=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},w=function(a,b){h.keydown(a)};i.bind("keydown",w),h.keydown=function(a){27===a.which?(a.preventDefault(),h.isOpen&&a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=q?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",v)):c.unbind("click",v)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(h.date)?(a=new Date(h.date),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var x=a(s)(h);s.remove(),q?c.find("body").append(x):i.after(x),h.$on("$destroy",function(){x.remove(),i.unbind("keydown",w),c.unbind("click",v)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b,c){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which&&(c.focusToggleElement(),d())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate","$position","$document",function(a,b,c,d,e,f,g,h){var i,j=this,k=a.$new(),l=d.openClass,m=angular.noop,n=b.onToggle?c(b.onToggle):angular.noop,o=!1;this.init=function(d){j.$element=d,b.isOpen&&(i=c(b.isOpen),m=i.assign,a.$watch(i,function(a){k.isOpen=!!a})),o=angular.isDefined(b.dropdownAppendToBody),o&&j.dropdownMenu&&(h.find("body").append(j.dropdownMenu),d.on("$destroy",function(){j.dropdownMenu.remove()}))},this.toggle=function(a){return k.isOpen=arguments.length?!!a:!k.isOpen},this.isOpen=function(){return k.isOpen},k.getToggleElement=function(){return j.toggleElement},k.getAutoClose=function(){return b.autoClose||"always"},k.getElement=function(){return j.$element},k.focusToggleElement=function(){j.toggleElement&&j.toggleElement[0].focus()},k.$watch("isOpen",function(b,c){if(o&&j.dropdownMenu){var d=g.positionElements(j.$element,j.dropdownMenu,"bottom-left",!0);j.dropdownMenu.css({top:d.top+"px",left:d.left+"px",display:b?"block":"none"})}f[b?"addClass":"removeClass"](j.$element,l),b?(k.focusToggleElement(),e.open(k)):e.close(k),m(a,b),angular.isDefined(b)&&b!==c&&n(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){k.isOpen=!1}),a.$on("$destroy",function(){k.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownMenu",function(){return{restrict:"AC",require:"?^dropdown",link:function(a,b,c,d){d&&(d.dropdownMenu=b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(l&&-1==g()){var a=m;j(l,m,function(){a=null}),l=void 0,m=void 0}}function j(c,d,f){function g(){g.done||(g.done=!0,c.remove(),d.$destroy(),f&&f())}d.animate=!1,c.attr("modal-animation")&&a.enabled()?c.one("$animate:close",function(){e.$evalAsync(g)}):b(g)}function k(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var l,m,n="modal-open",o=f.createNew(),p={};return e.$watch(g,function(a){m&&(m.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=o.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){p.dismiss(b.key,"escape key press")})))}),p.open=function(a,b){var f=c[0].activeElement;o.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var h=c.find("body").eq(0),i=g();if(i>=0&&!l){m=e.$new(!0),m.index=i;var j=angular.element('
      ');j.attr("backdrop-class",b.backdropClass),b.animation&&j.attr("modal-animation","true"),l=d(j)(m),h.append(l)}var k=angular.element('
      ');k.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:o.length()-1,animate:"animate"}).html(b.content),b.animation&&k.attr("modal-animation","true");var p=d(k)(b.scope);o.top().value.modalDomEl=p,o.top().value.modalOpener=f,h.append(p),h.addClass(n)},p.close=function(a,b){var c=o.get(a);return c&&k(c,b,!0)?(c.value.deferred.resolve(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismiss=function(a,b){var c=o.get(a);return c&&k(c,b,!1)?(c.value.deferred.reject(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},p.getTop=function(){return o.top()},p.modalRendered=function(a){var b=o.get(a);b&&b.value.renderDeferred.resolve()},p}]).provider("$modal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$modalStack",function(b,c,d,e,f,g){function h(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function i(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a))); +}),c}var j={};return j.open=function(b){var e=d.defer(),j=d.defer(),k=d.defer(),l={result:e.promise,opened:j.promise,rendered:k.promise,close:function(a){return g.close(l,a)},dismiss:function(a){return g.dismiss(l,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var m=d.all([h(b)].concat(i(b.resolve)));return m.then(function(a){var d=(b.scope||c).$new();d.$close=l.close,d.$dismiss=l.dismiss;var h,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=l,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),h=f(b.controller,i),b.controllerAs&&(d[b.controllerAs]=h)),g.open(l,{scope:d,deferred:e,renderDeferred:k,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),m.then(function(){j.resolve(!0)},function(a){j.reject(a)}),l},j}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l,m){function n(a){var b=a||m.trigger||l,d=c[b]||b;return{show:b,hide:d}}m=angular.extend({},b,d,m);var o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
      ';return{restrict:"EA",compile:function(a,b){var c=f(r);return function(a,b,d,f){function j(){F.isOpen?o():l()}function l(){(!E||a.$eval(d[k+"Enable"]))&&(t(),F.popupDelay?B||(B=g(p,F.popupDelay,!1),B.then(function(a){a()})):p()())}function o(){a.$apply(function(){q()})}function p(){return B=null,A&&(g.cancel(A),A=null),(m.useContentExp?F.contentExp():F.content)?(r(),y.css({top:0,left:0,display:"block"}),F.$digest(),G(),F.isOpen=!0,F.$apply(),G):angular.noop}function q(){F.isOpen=!1,g.cancel(B),B=null,F.animation?A||(A=g(s,500)):s()}function r(){y&&s(),z=F.$new(),y=c(z,function(a){C?h.find("body").append(a):b.after(a)}),z.$watch(function(){g(G,0,!1)}),m.useContentExp&&z.$watch("contentExp()",function(a){!a&&F.isOpen&&q()})}function s(){A=null,y&&(y.remove(),y=null),z&&(z.$destroy(),z=null)}function t(){u(),v(),w()}function u(){F.popupClass=d[k+"Class"]}function v(){var a=d[k+"Placement"];F.placement=angular.isDefined(a)?a:m.placement}function w(){var a=d[k+"PopupDelay"],b=parseInt(a,10);F.popupDelay=isNaN(b)?m.popupDelay:b}function x(){var a=d[k+"Trigger"];H(),D=n(a),D.show===D.hide?b.bind(D.show,j):(b.bind(D.show,l),b.bind(D.hide,o))}var y,z,A,B,C=angular.isDefined(m.appendToBody)?m.appendToBody:!1,D=n(void 0),E=angular.isDefined(d[k+"Enable"]),F=a.$new(!0),G=function(){if(y){var a=i.positionElements(b,y,F.placement,C);a.top+="px",a.left+="px",y.css(a)}};F.origScope=a,F.isOpen=!1,F.contentExp=function(){return a.$eval(d[e])},m.useContentExp||d.$observe(e,function(a){F.content=a,!a&&F.isOpen&&q()}),d.$observe("disabled",function(a){a&&F.isOpen&&q()}),d.$observe(k+"Title",function(a){F.title=a});var H=function(){b.unbind(D.show,l),b.unbind(D.hide,o)};x();var I=a.$eval(d[k+"Animation"]);F.animation=angular.isDefined(I)?!!I:m.animation;var J=a.$eval(d[k+"AppendToBody"]);C=angular.isDefined(J)?J:C,C&&a.$on("$locationChangeSuccess",function(){F.isOpen&&q()}),a.$on("$destroy",function(){g.cancel(A),g.cancel(B),H(),s(),F=null})}}}}}]}).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.tooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("tooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html"}}).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html"}}).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).value("tooltipHtmlUnsafeSuppressDeprecated",!1).directive("tooltipHtmlUnsafe",["$tooltip","tooltipHtmlUnsafeSuppressDeprecated","$log",function(a,b,c){return b||c.warn("tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead."),a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html"}}).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse","$log",function(a,b){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(c,d,e){return function(c,d,f,g){c.$watch("active",function(a){a&&g.select(c)}),c.disabled=!1,f.disable&&c.$parent.$watch(a(f.disable),function(a){c.disabled=!!a}),f.disabled&&(b.warn('Use of "disabled" attribute has been deprecated, please use "disable"'),c.$parent.$watch(a(f.disabled),function(a){c.disabled=!!a})),c.select=function(){c.disabled||(c.active=!0)},g.addTab(c),c.$on("$destroy",function(){g.removeTab(c)}),c.$transcludeFn=e}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b,c,d){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),"m"!==b&&(a.minutes=i(d)),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render,o.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g);var i=angular.isDefined(b.arrowkeys)?a.$parent.$eval(b.arrowkeys):f.arrowkeys;i&&this.setupArrowkeyEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(b){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(b){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$viewValue;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.transition",[]).value("$transitionSuppressDeprecated",!1).factory("$transition",["$q","$timeout","$rootScope","$log","$transitionSuppressDeprecated",function(a,b,c,d,e){function f(a){for(var b in a)if(void 0!==h.style[b])return a[b]}e||d.warn("$transition is now deprecated. Use $animate from ngAnimate instead.");var g=function(d,e,f){f=f||{};var h=a.defer(),i=g[f.animation?"animationEndEventName":"transitionEndEventName"],j=function(a){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(e)?d.addClass(e):angular.isFunction(e)?e(d):angular.isObject(e)&&d.css(e),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},h=document.createElement("trans"),i={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},j={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return g.transitionEndEventName=f(i),g.animationEndEventName=f(j),g}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
      ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c&&c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return p||l.$setValidity("editable",!0),s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),l.$setValidity("parse",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(a){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove(),z.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
      \n
      \n

      \n {{heading}}\n

      \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'
      \n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
      \n \n \n \n
      ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      {{label.abbr}}
      {{ weekNumbers[$index] }}\n \n
      \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n'); +}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-window.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
      \n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
      \n
      \n
      \n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
      \n \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
       
      \n \n :\n \n
       
      \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("collapse",["$animate",function(a){return{link:function(b,c,d){function e(){c.removeClass("collapse").addClass("collapsing"),a.addClass(c,"in",{to:{height:c[0].scrollHeight+"px"}}).then(f)}function f(){c.removeClass("collapsing"),c.css({height:"auto"})}function g(){c.css({height:c[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing"),a.removeClass(c,"in",{to:{height:"0"}}).then(h)}function h(){c.css({height:"0"}),c.removeClass("collapsing"),c.addClass("collapse")}b.$watch(d.collapse,function(a){a?g():e()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("CarouselController",["$scope","$interval","$animate",function(a,b,c){function d(a){if(angular.isUndefined(k[a].index))return k[a];var b;for(k.length,b=0;b0&&(h=b(g,c))}function f(){h&&(b.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(b,d){function f(){m||(angular.extend(b,{direction:d,active:!0}),angular.extend(j.currentSlide||{},{direction:d,active:!1}),c.enabled()&&!a.noTransition&&b.$element&&(a.$currentTransition=!0,b.$element.one("$animate:close",function(){a.$currentTransition=null})),j.currentSlide=b,l=g,e())}var g=j.indexOfSlide(b);void 0===d&&(d=g>j.getCurrentIndex()?"next":"prev"),b&&b!==j.currentSlide&&f()},a.$on("$destroy",function(){m=!0}),j.getCurrentIndex=function(){return j.currentSlide&&angular.isDefined(j.currentSlide.index)?+j.currentSlide.index:l},j.indexOfSlide=function(a){return angular.isDefined(a.index)?+a.index:k.indexOf(a)},a.next=function(){var b=(j.getCurrentIndex()+1)%k.length;return a.$currentTransition?void 0:j.select(d(b),"next")},a.prev=function(){var b=j.getCurrentIndex()-1<0?k.length-1:j.getCurrentIndex()-1;return a.$currentTransition?void 0:j.select(d(b),"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){angular.isDefined(a.index)&&k.sort(function(a,b){return+a.index>+b.index});var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?b>=k.length?j.select(k[b-1]):j.select(k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}).animation(".item",["$animate",function(a){return{beforeAddClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return b.addClass(f),a.addClass(b,g).then(function(){e||b.removeClass(g+" "+f),d()}),function(){e=!0}}d()},beforeRemoveClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return a.addClass(b,g).then(function(){e||b.removeClass(g),d()}),function(){e=!0}}d()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(f,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}var e=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.parsers={};var f={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")},HH:{regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a}},H:{regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a}},mm:{regex:"[0-5][0-9]",apply:function(a){this.minutes=+a}},m:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a}},sss:{regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a}},ss:{regex:"[0-5][0-9]",apply:function(a){this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}}};this.parse=function(b,f,g){if(!angular.isString(b)||!f)return b;f=a.DATETIME_FORMATS[f]||f,f=f.replace(e,"\\$&"),this.parsers[f]||(this.parsers[f]=c(f));var h=this.parsers[f],i=h.regex,j=h.map,k=b.match(i);if(k&&k.length){var l,m;l=g?{year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(),milliseconds:g.getMilliseconds()}:{year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0};for(var n=1,o=k.length;o>n;n++){var p=j[n-1];p.apply&&p.apply.call(l,k[n])}return d(l.year,l.month,l.date)&&(m=new Date(l.year,l.month,l.date,l.hours,l.minutes,l.seconds,l.milliseconds||0)),m}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.maxMode=i.maxMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=(11-e.startingDay)%7,p=b.rows.length,q=0;p>q;q++)b.weekNumbers.push(h(b.rows[q][o].date))}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a,b){var c=e.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(d,1),c=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(c)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a,b){var c=e.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);e.activeDate.setMonth(c)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a,b){var c=d.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=5:"right"===a?c+=1:"down"===a?c+=5:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*d.step.years:"home"===a?c=e(d.activeDate.getFullYear()):"end"===a&&(c=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(c)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(angular.isNumber(a)&&(a=new Date(a)),a){if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=f.parse(a,o,h.date)||new Date(a);return isNaN(b)?void 0:b}return void 0}return null}function n(a,b){var c=a||b;if(angular.isNumber(c)&&(c=new Date(c)),c){if(angular.isDate(c)&&!isNaN(c))return!0;if(angular.isString(c)){var d=f.parse(c,o)||new Date(c);return!isNaN(d)}return!1}return!0}var o,p=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,q=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar, +h.getText=function(a){return h[a+"Text"]||g[a+"Text"]};var r=!1;if(g.html5Types[j.type]?(o=g.html5Types[j.type],r=!0):(o=j.datepickerPopup||g.datepickerPopup,j.$observe("datepickerPopup",function(a,b){var c=a||g.datepickerPopup;if(c!==o&&(o=c,k.$modelValue=null,!o))throw new Error("datepickerPopup must have a date format specified.")})),!o)throw new Error("datepickerPopup must have a date format specified.");if(r&&j.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");var s=angular.element("
      ");s.attr({"ng-model":"date","ng-change":"dateSelection()"});var t=angular.element(s.children()[0]);if(r&&"month"==j.type&&(t.attr("datepicker-mode",'"month"'),t.attr("min-mode","month")),j.datepickerOptions){var u=h.$parent.$eval(j.datepickerOptions);u.initDate&&(h.initDate=u.initDate,t.attr("init-date","initDate"),delete u.initDate),angular.forEach(u,function(a,b){t.attr(l(b),a)})}h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),t.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&t.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),j.showWeeks&&t.attr("show-weeks",j.showWeeks),j.customClass&&t.attr("custom-class","customClass({ date: date, mode: mode })"),r?k.$formatters.push(function(a){return h.date=a,a}):(k.$$parserName="date",k.$validators.date=n,k.$parsers.unshift(m),k.$formatters.push(function(a){return h.date=a,k.$isEmpty(a)?a:e(a,o)})),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a);var b=h.date?e(h.date,o):"";i.val(b),k.$setViewValue(b),p&&(h.isOpen=!1,i[0].focus())},k.$viewChangeListeners.push(function(){h.date=f.parse(k.$viewValue,o,h.date)||new Date(k.$viewValue)});var v=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},w=function(a,b){h.keydown(a)};i.bind("keydown",w),h.keydown=function(a){27===a.which?(a.preventDefault(),h.isOpen&&a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=q?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",v)):c.unbind("click",v)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(h.date)?(a=new Date(h.date),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var x=a(s)(h);s.remove(),q?c.find("body").append(x):i.after(x),h.$on("$destroy",function(){x.remove(),i.unbind("keydown",w),c.unbind("click",v)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b,c){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which&&(c.focusToggleElement(),d())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate","$position","$document",function(a,b,c,d,e,f,g,h){var i,j=this,k=a.$new(),l=d.openClass,m=angular.noop,n=b.onToggle?c(b.onToggle):angular.noop,o=!1;this.init=function(d){j.$element=d,b.isOpen&&(i=c(b.isOpen),m=i.assign,a.$watch(i,function(a){k.isOpen=!!a})),o=angular.isDefined(b.dropdownAppendToBody),o&&j.dropdownMenu&&(h.find("body").append(j.dropdownMenu),d.on("$destroy",function(){j.dropdownMenu.remove()}))},this.toggle=function(a){return k.isOpen=arguments.length?!!a:!k.isOpen},this.isOpen=function(){return k.isOpen},k.getToggleElement=function(){return j.toggleElement},k.getAutoClose=function(){return b.autoClose||"always"},k.getElement=function(){return j.$element},k.focusToggleElement=function(){j.toggleElement&&j.toggleElement[0].focus()},k.$watch("isOpen",function(b,c){if(o&&j.dropdownMenu){var d=g.positionElements(j.$element,j.dropdownMenu,"bottom-left",!0);j.dropdownMenu.css({top:d.top+"px",left:d.left+"px",display:b?"block":"none"})}f[b?"addClass":"removeClass"](j.$element,l),b?(k.focusToggleElement(),e.open(k)):e.close(k),m(a,b),angular.isDefined(b)&&b!==c&&n(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){k.isOpen=!1}),a.$on("$destroy",function(){k.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownMenu",function(){return{restrict:"AC",require:"?^dropdown",link:function(a,b,c,d){d&&(d.dropdownMenu=b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(l&&-1==g()){var a=m;j(l,m,function(){a=null}),l=void 0,m=void 0}}function j(c,d,f){function g(){g.done||(g.done=!0,c.remove(),d.$destroy(),f&&f())}d.animate=!1,c.attr("modal-animation")&&a.enabled()?c.one("$animate:close",function(){e.$evalAsync(g)}):b(g)}function k(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var l,m,n="modal-open",o=f.createNew(),p={};return e.$watch(g,function(a){m&&(m.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=o.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){p.dismiss(b.key,"escape key press")})))}),p.open=function(a,b){var f=c[0].activeElement;o.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var h=c.find("body").eq(0),i=g();if(i>=0&&!l){m=e.$new(!0),m.index=i;var j=angular.element('
      ');j.attr("backdrop-class",b.backdropClass),b.animation&&j.attr("modal-animation","true"),l=d(j)(m),h.append(l)}var k=angular.element('
      ');k.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:o.length()-1,animate:"animate"}).html(b.content),b.animation&&k.attr("modal-animation","true");var p=d(k)(b.scope);o.top().value.modalDomEl=p,o.top().value.modalOpener=f,h.append(p),h.addClass(n)},p.close=function(a,b){var c=o.get(a);return c&&k(c,b,!0)?(c.value.deferred.resolve(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismiss=function(a,b){var c=o.get(a);return c&&k(c,b,!1)?(c.value.deferred.reject(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},p.getTop=function(){return o.top()},p.modalRendered=function(a){var b=o.get(a);b&&b.value.renderDeferred.resolve()},p}]).provider("$modal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$modalStack",function(b,c,d,e,f,g){function h(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function i(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var j={};return j.open=function(b){var e=d.defer(),j=d.defer(),k=d.defer(),l={result:e.promise,opened:j.promise,rendered:k.promise,close:function(a){return g.close(l,a)},dismiss:function(a){return g.dismiss(l,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var m=d.all([h(b)].concat(i(b.resolve)));return m.then(function(a){var d=(b.scope||c).$new();d.$close=l.close,d.$dismiss=l.dismiss;var h,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=l,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),h=f(b.controller,i),b.controllerAs&&(d[b.controllerAs]=h)),g.open(l,{scope:d,deferred:e,renderDeferred:k,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),m.then(function(){j.resolve(!0)},function(a){j.reject(a)}),l},j}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l,m){function n(a){var b=a||m.trigger||l,d=c[b]||b;return{show:b,hide:d}}m=angular.extend({},b,d,m);var o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
      ';return{restrict:"EA",compile:function(a,b){var c=f(r);return function(a,b,d,f){function j(){F.isOpen?o():l()}function l(){(!E||a.$eval(d[k+"Enable"]))&&(t(),F.popupDelay?B||(B=g(p,F.popupDelay,!1),B.then(function(a){a()})):p()())}function o(){a.$apply(function(){q()})}function p(){return B=null,A&&(g.cancel(A),A=null),(m.useContentExp?F.contentExp():F.content)?(r(),y.css({top:0,left:0,display:"block"}),F.$digest(),G(),F.isOpen=!0,F.$apply(),G):angular.noop}function q(){F.isOpen=!1,g.cancel(B),B=null,F.animation?A||(A=g(s,500)):s()}function r(){y&&s(),z=F.$new(),y=c(z,function(a){C?h.find("body").append(a):b.after(a)}),z.$watch(function(){g(G,0,!1)}),m.useContentExp&&z.$watch("contentExp()",function(a){!a&&F.isOpen&&q()})}function s(){A=null,y&&(y.remove(),y=null),z&&(z.$destroy(),z=null)}function t(){u(),v(),w()}function u(){F.popupClass=d[k+"Class"]}function v(){var a=d[k+"Placement"];F.placement=angular.isDefined(a)?a:m.placement}function w(){var a=d[k+"PopupDelay"],b=parseInt(a,10);F.popupDelay=isNaN(b)?m.popupDelay:b}function x(){var a=d[k+"Trigger"];H(),D=n(a),D.show===D.hide?b.bind(D.show,j):(b.bind(D.show,l),b.bind(D.hide,o))}var y,z,A,B,C=angular.isDefined(m.appendToBody)?m.appendToBody:!1,D=n(void 0),E=angular.isDefined(d[k+"Enable"]),F=a.$new(!0),G=function(){if(y){var a=i.positionElements(b,y,F.placement,C);a.top+="px",a.left+="px",y.css(a)}};F.origScope=a,F.isOpen=!1,F.contentExp=function(){return a.$eval(d[e])},m.useContentExp||d.$observe(e,function(a){F.content=a,!a&&F.isOpen&&q()}),d.$observe("disabled",function(a){a&&F.isOpen&&q()}),d.$observe(k+"Title",function(a){F.title=a});var H=function(){b.unbind(D.show,l),b.unbind(D.hide,o)};x();var I=a.$eval(d[k+"Animation"]);F.animation=angular.isDefined(I)?!!I:m.animation;var J=a.$eval(d[k+"AppendToBody"]);C=angular.isDefined(J)?J:C,C&&a.$on("$locationChangeSuccess",function(){F.isOpen&&q()}),a.$on("$destroy",function(){g.cancel(A),g.cancel(B),H(),s(),F=null})}}}}}]}).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.tooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("tooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html"}}).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html"}}).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).value("tooltipHtmlUnsafeSuppressDeprecated",!1).directive("tooltipHtmlUnsafe",["$tooltip","tooltipHtmlUnsafeSuppressDeprecated","$log",function(a,b,c){return b||c.warn("tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead."),a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html"}}).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse","$log",function(a,b){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(c,d,e){return function(c,d,f,g){c.$watch("active",function(a){a&&g.select(c)}),c.disabled=!1,f.disable&&c.$parent.$watch(a(f.disable),function(a){c.disabled=!!a}),f.disabled&&(b.warn('Use of "disabled" attribute has been deprecated, please use "disable"'),c.$parent.$watch(a(f.disabled),function(a){c.disabled=!!a})),c.select=function(){c.disabled||(c.active=!0)},g.addTab(c),c.$on("$destroy",function(){g.removeTab(c)}),c.$transcludeFn=e}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b,c,d){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),"m"!==b&&(a.minutes=i(d)),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render,o.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g);var i=angular.isDefined(b.arrowkeys)?a.$parent.$eval(b.arrowkeys):f.arrowkeys;i&&this.setupArrowkeyEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(b){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(b){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$viewValue;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.transition",[]).value("$transitionSuppressDeprecated",!1).factory("$transition",["$q","$timeout","$rootScope","$log","$transitionSuppressDeprecated",function(a,b,c,d,e){function f(a){for(var b in a)if(void 0!==h.style[b])return a[b]}e||d.warn("$transition is now deprecated. Use $animate from ngAnimate instead.");var g=function(d,e,f){f=f||{};var h=a.defer(),i=g[f.animation?"animationEndEventName":"transitionEndEventName"],j=function(a){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(e)?d.addClass(e):angular.isFunction(e)?e(d):angular.isObject(e)&&d.css(e),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},h=document.createElement("trans"),i={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},j={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return g.transitionEndEventName=f(i),g.animationEndEventName=f(j),g}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
      ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a; +};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c&&c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return p||l.$setValidity("editable",!0),s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),l.$setValidity("parse",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(a){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove(),z.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
      \n
      \n

      \n {{heading}}\n

      \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'
      \n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
      \n \n \n \n
      ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      {{label.abbr}}
      {{ weekNumbers[$index] }}\n \n
      \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-window.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
      \n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
      \n
      \n
      \n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
      \n \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
       
      \n \n :\n \n
       
      \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("collapse",["$animate",function(a){return{link:function(b,c,d){function e(){c.removeClass("collapse").addClass("collapsing"),a.addClass(c,"in",{to:{height:c[0].scrollHeight+"px"}}).then(f)}function f(){c.removeClass("collapsing"),c.css({height:"auto"})}function g(){c.css({height:c[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing"),a.removeClass(c,"in",{to:{height:"0"}}).then(h)}function h(){c.css({height:"0"}),c.removeClass("collapsing"),c.addClass("collapse")}b.$watch(d.collapse,function(a){a?g():e()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("CarouselController",["$scope","$interval","$animate",function(a,b,c){function d(a){if(angular.isUndefined(k[a].index))return k[a];var b;for(k.length,b=0;b0&&(h=b(g,c))}function f(){h&&(b.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(b,d){function f(){m||(angular.extend(b,{direction:d,active:!0}),angular.extend(j.currentSlide||{},{direction:d,active:!1}),c.enabled()&&!a.noTransition&&b.$element&&(a.$currentTransition=!0,b.$element.one("$animate:close",function(){a.$currentTransition=null})),j.currentSlide=b,l=g,e())}var g=j.indexOfSlide(b);void 0===d&&(d=g>j.getCurrentIndex()?"next":"prev"),b&&b!==j.currentSlide&&f()},a.$on("$destroy",function(){m=!0}),j.getCurrentIndex=function(){return j.currentSlide&&angular.isDefined(j.currentSlide.index)?+j.currentSlide.index:l},j.indexOfSlide=function(a){return angular.isDefined(a.index)?+a.index:k.indexOf(a)},a.next=function(){var b=(j.getCurrentIndex()+1)%k.length;return a.$currentTransition?void 0:j.select(d(b),"next")},a.prev=function(){var b=j.getCurrentIndex()-1<0?k.length-1:j.getCurrentIndex()-1;return a.$currentTransition?void 0:j.select(d(b),"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){angular.isDefined(a.index)&&k.sort(function(a,b){return+a.index>+b.index});var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?b>=k.length?j.select(k[b-1]):j.select(k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}).animation(".item",["$animate",function(a){return{beforeAddClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return b.addClass(f),a.addClass(b,g).then(function(){e||b.removeClass(g+" "+f),d()}),function(){e=!0}}d()},beforeRemoveClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return a.addClass(b,g).then(function(){e||b.removeClass(g),d()}),function(){e=!0}}d()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(f,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}var e=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.parsers={};var f={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")},HH:{regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a}},H:{regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a}},mm:{regex:"[0-5][0-9]",apply:function(a){this.minutes=+a}},m:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a}},sss:{regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a}},ss:{regex:"[0-5][0-9]",apply:function(a){this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}}};this.parse=function(b,f,g){if(!angular.isString(b)||!f)return b;f=a.DATETIME_FORMATS[f]||f,f=f.replace(e,"\\$&"),this.parsers[f]||(this.parsers[f]=c(f));var h=this.parsers[f],i=h.regex,j=h.map,k=b.match(i);if(k&&k.length){var l,m;l=g?{year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(), +milliseconds:g.getMilliseconds()}:{year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0};for(var n=1,o=k.length;o>n;n++){var p=j[n-1];p.apply&&p.apply.call(l,k[n])}return d(l.year,l.month,l.date)&&(m=new Date(l.year,l.month,l.date,l.hours,l.minutes,l.seconds,l.milliseconds||0)),m}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.maxMode=i.maxMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=(11-e.startingDay)%7,p=b.rows.length,q=0;p>q;q++)b.weekNumbers.push(h(b.rows[q][o].date))}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a,b){var c=e.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(d,1),c=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(c)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a,b){var c=e.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);e.activeDate.setMonth(c)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a,b){var c=d.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=5:"right"===a?c+=1:"down"===a?c+=5:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*d.step.years:"home"===a?c=e(d.activeDate.getFullYear()):"end"===a&&(c=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(c)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(angular.isNumber(a)&&(a=new Date(a)),a){if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=f.parse(a,o,h.date)||new Date(a);return isNaN(b)?void 0:b}return void 0}return null}function n(a,b){var c=a||b;if(angular.isNumber(c)&&(c=new Date(c)),c){if(angular.isDate(c)&&!isNaN(c))return!0;if(angular.isString(c)){var d=f.parse(c,o)||new Date(c);return!isNaN(d)}return!1}return!0}var o,p=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,q=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]};var r=!1;if(g.html5Types[j.type]?(o=g.html5Types[j.type],r=!0):(o=j.datepickerPopup||g.datepickerPopup,j.$observe("datepickerPopup",function(a,b){var c=a||g.datepickerPopup;if(c!==o&&(o=c,k.$modelValue=null,!o))throw new Error("datepickerPopup must have a date format specified.")})),!o)throw new Error("datepickerPopup must have a date format specified.");if(r&&j.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");var s=angular.element("
      ");s.attr({"ng-model":"date","ng-change":"dateSelection()"});var t=angular.element(s.children()[0]);if(r&&"month"==j.type&&(t.attr("datepicker-mode",'"month"'),t.attr("min-mode","month")),j.datepickerOptions){var u=h.$parent.$eval(j.datepickerOptions);u.initDate&&(h.initDate=u.initDate,t.attr("init-date","initDate"),delete u.initDate),angular.forEach(u,function(a,b){t.attr(l(b),a)})}h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),t.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&t.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),j.showWeeks&&t.attr("show-weeks",j.showWeeks),j.customClass&&t.attr("custom-class","customClass({ date: date, mode: mode })"),r?k.$formatters.push(function(a){return h.date=a,a}):(k.$$parserName="date",k.$validators.date=n,k.$parsers.unshift(m),k.$formatters.push(function(a){return h.date=a,k.$isEmpty(a)?a:e(a,o)})),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a);var b=h.date?e(h.date,o):"";i.val(b),k.$setViewValue(b),p&&(h.isOpen=!1,i[0].focus())},k.$viewChangeListeners.push(function(){h.date=f.parse(k.$viewValue,o,h.date)||new Date(k.$viewValue)});var v=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},w=function(a,b){h.keydown(a)};i.bind("keydown",w),h.keydown=function(a){27===a.which?(a.preventDefault(),h.isOpen&&a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=q?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",v)):c.unbind("click",v)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(h.date)?(a=new Date(h.date),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var x=a(s)(h);s.remove(),q?c.find("body").append(x):i.after(x),h.$on("$destroy",function(){x.remove(),i.unbind("keydown",w),c.unbind("click",v)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b,c){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which&&(c.focusToggleElement(),d())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate","$position","$document",function(a,b,c,d,e,f,g,h){var i,j=this,k=a.$new(),l=d.openClass,m=angular.noop,n=b.onToggle?c(b.onToggle):angular.noop,o=!1;this.init=function(d){j.$element=d,b.isOpen&&(i=c(b.isOpen),m=i.assign,a.$watch(i,function(a){k.isOpen=!!a})),o=angular.isDefined(b.dropdownAppendToBody),o&&j.dropdownMenu&&(h.find("body").append(j.dropdownMenu),d.on("$destroy",function(){j.dropdownMenu.remove()}))},this.toggle=function(a){return k.isOpen=arguments.length?!!a:!k.isOpen},this.isOpen=function(){return k.isOpen},k.getToggleElement=function(){return j.toggleElement},k.getAutoClose=function(){return b.autoClose||"always"},k.getElement=function(){return j.$element},k.focusToggleElement=function(){j.toggleElement&&j.toggleElement[0].focus()},k.$watch("isOpen",function(b,c){if(o&&j.dropdownMenu){var d=g.positionElements(j.$element,j.dropdownMenu,"bottom-left",!0);j.dropdownMenu.css({top:d.top+"px",left:d.left+"px",display:b?"block":"none"})}f[b?"addClass":"removeClass"](j.$element,l),b?(k.focusToggleElement(),e.open(k)):e.close(k),m(a,b),angular.isDefined(b)&&b!==c&&n(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){k.isOpen=!1}),a.$on("$destroy",function(){k.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownMenu",function(){return{restrict:"AC",require:"?^dropdown",link:function(a,b,c,d){d&&(d.dropdownMenu=b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(l&&-1==g()){var a=m;j(l,m,function(){a=null}),l=void 0,m=void 0}}function j(c,d,f){function g(){g.done||(g.done=!0,c.remove(),d.$destroy(),f&&f())}d.animate=!1,c.attr("modal-animation")&&a.enabled()?c.one("$animate:close",function(){e.$evalAsync(g)}):b(g)}function k(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var l,m,n="modal-open",o=f.createNew(),p={};return e.$watch(g,function(a){m&&(m.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=o.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){p.dismiss(b.key,"escape key press")})))}),p.open=function(a,b){var f=c[0].activeElement;o.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var h=c.find("body").eq(0),i=g();if(i>=0&&!l){m=e.$new(!0),m.index=i;var j=angular.element('
      ');j.attr("backdrop-class",b.backdropClass),b.animation&&j.attr("modal-animation","true"),l=d(j)(m),h.append(l)}var k=angular.element('
      ');k.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:o.length()-1,animate:"animate"}).html(b.content),b.animation&&k.attr("modal-animation","true");var p=d(k)(b.scope);o.top().value.modalDomEl=p,o.top().value.modalOpener=f,h.append(p),h.addClass(n)},p.close=function(a,b){var c=o.get(a);return c&&k(c,b,!0)?(c.value.deferred.resolve(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismiss=function(a,b){var c=o.get(a);return c&&k(c,b,!1)?(c.value.deferred.reject(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},p.getTop=function(){return o.top()},p.modalRendered=function(a){var b=o.get(a);b&&b.value.renderDeferred.resolve()},p}]).provider("$modal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$modalStack",function(b,c,d,e,f,g){function h(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function i(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var j={};return j.open=function(b){var e=d.defer(),j=d.defer(),k=d.defer(),l={result:e.promise,opened:j.promise,rendered:k.promise,close:function(a){return g.close(l,a)},dismiss:function(a){return g.dismiss(l,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var m=d.all([h(b)].concat(i(b.resolve)));return m.then(function(a){var d=(b.scope||c).$new();d.$close=l.close,d.$dismiss=l.dismiss;var h,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=l,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),h=f(b.controller,i),b.controllerAs&&(d[b.controllerAs]=h)),g.open(l,{scope:d,deferred:e,renderDeferred:k,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),m.then(function(){j.resolve(!0)},function(a){j.reject(a)}),l},j}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l,m){function n(a){var b=a||m.trigger||l,d=c[b]||b;return{show:b,hide:d}}m=angular.extend({},b,d,m);var o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
      ';return{restrict:"EA",compile:function(a,b){var c=f(r);return function(a,b,d,f){function j(){F.isOpen?o():l()}function l(){(!E||a.$eval(d[k+"Enable"]))&&(t(),F.popupDelay?B||(B=g(p,F.popupDelay,!1),B.then(function(a){a()})):p()())}function o(){a.$apply(function(){q()})}function p(){return B=null,A&&(g.cancel(A),A=null),(m.useContentExp?F.contentExp():F.content)?(r(),y.css({top:0,left:0,display:"block"}),F.$digest(),G(),F.isOpen=!0,F.$apply(),G):angular.noop}function q(){F.isOpen=!1,g.cancel(B),B=null,F.animation?A||(A=g(s,500)):s()}function r(){y&&s(),z=F.$new(),y=c(z,function(a){C?h.find("body").append(a):b.after(a)}),z.$watch(function(){g(G,0,!1)}),m.useContentExp&&z.$watch("contentExp()",function(a){!a&&F.isOpen&&q()})}function s(){A=null,y&&(y.remove(),y=null),z&&(z.$destroy(),z=null)}function t(){u(),v(),w()}function u(){F.popupClass=d[k+"Class"]}function v(){var a=d[k+"Placement"];F.placement=angular.isDefined(a)?a:m.placement}function w(){var a=d[k+"PopupDelay"],b=parseInt(a,10);F.popupDelay=isNaN(b)?m.popupDelay:b}function x(){var a=d[k+"Trigger"];H(),D=n(a),D.show===D.hide?b.bind(D.show,j):(b.bind(D.show,l),b.bind(D.hide,o))}var y,z,A,B,C=angular.isDefined(m.appendToBody)?m.appendToBody:!1,D=n(void 0),E=angular.isDefined(d[k+"Enable"]),F=a.$new(!0),G=function(){if(y){var a=i.positionElements(b,y,F.placement,C);a.top+="px",a.left+="px",y.css(a)}};F.origScope=a,F.isOpen=!1,F.contentExp=function(){return a.$eval(d[e])},m.useContentExp||d.$observe(e,function(a){F.content=a,!a&&F.isOpen&&q()}),d.$observe("disabled",function(a){a&&F.isOpen&&q()}),d.$observe(k+"Title",function(a){F.title=a});var H=function(){b.unbind(D.show,l),b.unbind(D.hide,o)};x();var I=a.$eval(d[k+"Animation"]);F.animation=angular.isDefined(I)?!!I:m.animation;var J=a.$eval(d[k+"AppendToBody"]);C=angular.isDefined(J)?J:C,C&&a.$on("$locationChangeSuccess",function(){F.isOpen&&q()}),a.$on("$destroy",function(){g.cancel(A),g.cancel(B),H(),s(),F=null})}}}}}]}).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.tooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("tooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html"}}).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html"}}).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).value("tooltipHtmlUnsafeSuppressDeprecated",!1).directive("tooltipHtmlUnsafe",["$tooltip","tooltipHtmlUnsafeSuppressDeprecated","$log",function(a,b,c){return b||c.warn("tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead."),a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html"}}).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html" +}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse","$log",function(a,b){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(c,d,e){return function(c,d,f,g){c.$watch("active",function(a){a&&g.select(c)}),c.disabled=!1,f.disable&&c.$parent.$watch(a(f.disable),function(a){c.disabled=!!a}),f.disabled&&(b.warn('Use of "disabled" attribute has been deprecated, please use "disable"'),c.$parent.$watch(a(f.disabled),function(a){c.disabled=!!a})),c.select=function(){c.disabled||(c.active=!0)},g.addTab(c),c.$on("$destroy",function(){g.removeTab(c)}),c.$transcludeFn=e}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b,c,d){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),"m"!==b&&(a.minutes=i(d)),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render,o.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g);var i=angular.isDefined(b.arrowkeys)?a.$parent.$eval(b.arrowkeys):f.arrowkeys;i&&this.setupArrowkeyEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(b){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(b){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$viewValue;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.transition",[]).value("$transitionSuppressDeprecated",!1).factory("$transition",["$q","$timeout","$rootScope","$log","$transitionSuppressDeprecated",function(a,b,c,d,e){function f(a){for(var b in a)if(void 0!==h.style[b])return a[b]}e||d.warn("$transition is now deprecated. Use $animate from ngAnimate instead.");var g=function(d,e,f){f=f||{};var h=a.defer(),i=g[f.animation?"animationEndEventName":"transitionEndEventName"],j=function(a){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(e)?d.addClass(e):angular.isFunction(e)?e(d):angular.isObject(e)&&d.css(e),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},h=document.createElement("trans"),i={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},j={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return g.transitionEndEventName=f(i),g.animationEndEventName=f(j),g}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
      ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c&&c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return p||l.$setValidity("editable",!0),s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),l.$setValidity("parse",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(a){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove(),z.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
      \n
      \n

      \n {{heading}}\n

      \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'
      \n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
      \n \n \n \n
      ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      {{label.abbr}}
      {{ weekNumbers[$index] }}\n \n
      \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-window.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
      \n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
      \n
      \n
      \n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
      \n \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
       
      \n \n :\n \n
       
      \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'\n'); +}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("collapse",["$animate",function(a){return{link:function(b,c,d){function e(){c.removeClass("collapse").addClass("collapsing"),a.addClass(c,"in",{to:{height:c[0].scrollHeight+"px"}}).then(f)}function f(){c.removeClass("collapsing"),c.css({height:"auto"})}function g(){c.css({height:c[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing"),a.removeClass(c,"in",{to:{height:"0"}}).then(h)}function h(){c.css({height:"0"}),c.removeClass("collapsing"),c.addClass("collapse")}b.$watch(d.collapse,function(a){a?g():e()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("CarouselController",["$scope","$interval","$animate",function(a,b,c){function d(a){if(angular.isUndefined(k[a].index))return k[a];var b;for(k.length,b=0;b0&&(h=b(g,c))}function f(){h&&(b.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(b,d){function f(){m||(angular.extend(b,{direction:d,active:!0}),angular.extend(j.currentSlide||{},{direction:d,active:!1}),c.enabled()&&!a.noTransition&&b.$element&&(a.$currentTransition=!0,b.$element.one("$animate:close",function(){a.$currentTransition=null})),j.currentSlide=b,l=g,e())}var g=j.indexOfSlide(b);void 0===d&&(d=g>j.getCurrentIndex()?"next":"prev"),b&&b!==j.currentSlide&&f()},a.$on("$destroy",function(){m=!0}),j.getCurrentIndex=function(){return j.currentSlide&&angular.isDefined(j.currentSlide.index)?+j.currentSlide.index:l},j.indexOfSlide=function(a){return angular.isDefined(a.index)?+a.index:k.indexOf(a)},a.next=function(){var b=(j.getCurrentIndex()+1)%k.length;return a.$currentTransition?void 0:j.select(d(b),"next")},a.prev=function(){var b=j.getCurrentIndex()-1<0?k.length-1:j.getCurrentIndex()-1;return a.$currentTransition?void 0:j.select(d(b),"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){angular.isDefined(a.index)&&k.sort(function(a,b){return+a.index>+b.index});var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?b>=k.length?j.select(k[b-1]):j.select(k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}).animation(".item",["$animate",function(a){return{beforeAddClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return b.addClass(f),a.addClass(b,g).then(function(){e||b.removeClass(g+" "+f),d()}),function(){e=!0}}d()},beforeRemoveClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return a.addClass(b,g).then(function(){e||b.removeClass(g),d()}),function(){e=!0}}d()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(f,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}var e=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.parsers={};var f={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")},HH:{regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a}},H:{regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a}},mm:{regex:"[0-5][0-9]",apply:function(a){this.minutes=+a}},m:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a}},sss:{regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a}},ss:{regex:"[0-5][0-9]",apply:function(a){this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}}};this.parse=function(b,f,g){if(!angular.isString(b)||!f)return b;f=a.DATETIME_FORMATS[f]||f,f=f.replace(e,"\\$&"),this.parsers[f]||(this.parsers[f]=c(f));var h=this.parsers[f],i=h.regex,j=h.map,k=b.match(i);if(k&&k.length){var l,m;l=g?{year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(),milliseconds:g.getMilliseconds()}:{year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0};for(var n=1,o=k.length;o>n;n++){var p=j[n-1];p.apply&&p.apply.call(l,k[n])}return d(l.year,l.month,l.date)&&(m=new Date(l.year,l.month,l.date,l.hours,l.minutes,l.seconds,l.milliseconds||0)),m}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.maxMode=i.maxMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=(11-e.startingDay)%7,p=b.rows.length,q=0;p>q;q++)b.weekNumbers.push(h(b.rows[q][o].date))}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a,b){var c=e.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(d,1),c=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(c)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a,b){var c=e.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);e.activeDate.setMonth(c)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a,b){var c=d.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=5:"right"===a?c+=1:"down"===a?c+=5:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*d.step.years:"home"===a?c=e(d.activeDate.getFullYear()):"end"===a&&(c=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(c)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(angular.isNumber(a)&&(a=new Date(a)),a){if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=f.parse(a,o,h.date)||new Date(a);return isNaN(b)?void 0:b}return void 0}return null}function n(a,b){var c=a||b;if(angular.isNumber(c)&&(c=new Date(c)),c){if(angular.isDate(c)&&!isNaN(c))return!0;if(angular.isString(c)){var d=f.parse(c,o)||new Date(c);return!isNaN(d)}return!1}return!0}var o,p=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,q=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]};var r=!1;if(g.html5Types[j.type]?(o=g.html5Types[j.type],r=!0):(o=j.datepickerPopup||g.datepickerPopup,j.$observe("datepickerPopup",function(a,b){var c=a||g.datepickerPopup;if(c!==o&&(o=c,k.$modelValue=null,!o))throw new Error("datepickerPopup must have a date format specified.")})),!o)throw new Error("datepickerPopup must have a date format specified.");if(r&&j.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");var s=angular.element("
      ");s.attr({"ng-model":"date","ng-change":"dateSelection()"});var t=angular.element(s.children()[0]);if(r&&"month"==j.type&&(t.attr("datepicker-mode",'"month"'),t.attr("min-mode","month")),j.datepickerOptions){var u=h.$parent.$eval(j.datepickerOptions);u.initDate&&(h.initDate=u.initDate,t.attr("init-date","initDate"),delete u.initDate),angular.forEach(u,function(a,b){t.attr(l(b),a)})}h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),t.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&t.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),j.showWeeks&&t.attr("show-weeks",j.showWeeks),j.customClass&&t.attr("custom-class","customClass({ date: date, mode: mode })"),r?k.$formatters.push(function(a){return h.date=a,a}):(k.$$parserName="date",k.$validators.date=n,k.$parsers.unshift(m),k.$formatters.push(function(a){return h.date=a,k.$isEmpty(a)?a:e(a,o)})),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a);var b=h.date?e(h.date,o):"";i.val(b),k.$setViewValue(b),p&&(h.isOpen=!1,i[0].focus())},k.$viewChangeListeners.push(function(){h.date=f.parse(k.$viewValue,o,h.date)||new Date(k.$viewValue)});var v=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},w=function(a,b){h.keydown(a)};i.bind("keydown",w),h.keydown=function(a){27===a.which?(a.preventDefault(),h.isOpen&&a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=q?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",v)):c.unbind("click",v)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(h.date)?(a=new Date(h.date),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var x=a(s)(h);s.remove(),q?c.find("body").append(x):i.after(x),h.$on("$destroy",function(){x.remove(),i.unbind("keydown",w),c.unbind("click",v)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b,c){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which&&(c.focusToggleElement(),d())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate","$position","$document",function(a,b,c,d,e,f,g,h){var i,j=this,k=a.$new(),l=d.openClass,m=angular.noop,n=b.onToggle?c(b.onToggle):angular.noop,o=!1;this.init=function(d){j.$element=d,b.isOpen&&(i=c(b.isOpen),m=i.assign,a.$watch(i,function(a){k.isOpen=!!a})),o=angular.isDefined(b.dropdownAppendToBody),o&&j.dropdownMenu&&(h.find("body").append(j.dropdownMenu),d.on("$destroy",function(){j.dropdownMenu.remove()}))},this.toggle=function(a){return k.isOpen=arguments.length?!!a:!k.isOpen},this.isOpen=function(){return k.isOpen},k.getToggleElement=function(){return j.toggleElement},k.getAutoClose=function(){return b.autoClose||"always"},k.getElement=function(){return j.$element},k.focusToggleElement=function(){j.toggleElement&&j.toggleElement[0].focus()},k.$watch("isOpen",function(b,c){if(o&&j.dropdownMenu){var d=g.positionElements(j.$element,j.dropdownMenu,"bottom-left",!0);j.dropdownMenu.css({top:d.top+"px",left:d.left+"px",display:b?"block":"none"})}f[b?"addClass":"removeClass"](j.$element,l),b?(k.focusToggleElement(),e.open(k)):e.close(k),m(a,b),angular.isDefined(b)&&b!==c&&n(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){k.isOpen=!1}),a.$on("$destroy",function(){k.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownMenu",function(){return{restrict:"AC",require:"?^dropdown",link:function(a,b,c,d){d&&(d.dropdownMenu=b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(l&&-1==g()){var a=m;j(l,m,function(){a=null}),l=void 0,m=void 0}}function j(c,d,f){function g(){g.done||(g.done=!0,c.remove(),d.$destroy(),f&&f())}d.animate=!1,c.attr("modal-animation")&&a.enabled()?c.one("$animate:close",function(){e.$evalAsync(g)}):b(g)}function k(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var l,m,n="modal-open",o=f.createNew(),p={};return e.$watch(g,function(a){m&&(m.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=o.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){p.dismiss(b.key,"escape key press")})))}),p.open=function(a,b){var f=c[0].activeElement;o.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var h=c.find("body").eq(0),i=g();if(i>=0&&!l){m=e.$new(!0),m.index=i;var j=angular.element('
      ');j.attr("backdrop-class",b.backdropClass),b.animation&&j.attr("modal-animation","true"),l=d(j)(m),h.append(l)}var k=angular.element('
      ');k.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:o.length()-1,animate:"animate"}).html(b.content),b.animation&&k.attr("modal-animation","true");var p=d(k)(b.scope);o.top().value.modalDomEl=p,o.top().value.modalOpener=f,h.append(p),h.addClass(n)},p.close=function(a,b){var c=o.get(a);return c&&k(c,b,!0)?(c.value.deferred.resolve(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismiss=function(a,b){var c=o.get(a);return c&&k(c,b,!1)?(c.value.deferred.reject(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},p.getTop=function(){return o.top()},p.modalRendered=function(a){var b=o.get(a);b&&b.value.renderDeferred.resolve()},p}]).provider("$modal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$modalStack",function(b,c,d,e,f,g){ +function h(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function i(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var j={};return j.open=function(b){var e=d.defer(),j=d.defer(),k=d.defer(),l={result:e.promise,opened:j.promise,rendered:k.promise,close:function(a){return g.close(l,a)},dismiss:function(a){return g.dismiss(l,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var m=d.all([h(b)].concat(i(b.resolve)));return m.then(function(a){var d=(b.scope||c).$new();d.$close=l.close,d.$dismiss=l.dismiss;var h,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=l,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),h=f(b.controller,i),b.controllerAs&&(d[b.controllerAs]=h)),g.open(l,{scope:d,deferred:e,renderDeferred:k,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),m.then(function(){j.resolve(!0)},function(a){j.reject(a)}),l},j}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l,m){function n(a){var b=a||m.trigger||l,d=c[b]||b;return{show:b,hide:d}}m=angular.extend({},b,d,m);var o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
      ';return{restrict:"EA",compile:function(a,b){var c=f(r);return function(a,b,d,f){function j(){F.isOpen?o():l()}function l(){(!E||a.$eval(d[k+"Enable"]))&&(t(),F.popupDelay?B||(B=g(p,F.popupDelay,!1),B.then(function(a){a()})):p()())}function o(){a.$apply(function(){q()})}function p(){return B=null,A&&(g.cancel(A),A=null),(m.useContentExp?F.contentExp():F.content)?(r(),y.css({top:0,left:0,display:"block"}),F.$digest(),G(),F.isOpen=!0,F.$apply(),G):angular.noop}function q(){F.isOpen=!1,g.cancel(B),B=null,F.animation?A||(A=g(s,500)):s()}function r(){y&&s(),z=F.$new(),y=c(z,function(a){C?h.find("body").append(a):b.after(a)}),z.$watch(function(){g(G,0,!1)}),m.useContentExp&&z.$watch("contentExp()",function(a){!a&&F.isOpen&&q()})}function s(){A=null,y&&(y.remove(),y=null),z&&(z.$destroy(),z=null)}function t(){u(),v(),w()}function u(){F.popupClass=d[k+"Class"]}function v(){var a=d[k+"Placement"];F.placement=angular.isDefined(a)?a:m.placement}function w(){var a=d[k+"PopupDelay"],b=parseInt(a,10);F.popupDelay=isNaN(b)?m.popupDelay:b}function x(){var a=d[k+"Trigger"];H(),D=n(a),D.show===D.hide?b.bind(D.show,j):(b.bind(D.show,l),b.bind(D.hide,o))}var y,z,A,B,C=angular.isDefined(m.appendToBody)?m.appendToBody:!1,D=n(void 0),E=angular.isDefined(d[k+"Enable"]),F=a.$new(!0),G=function(){if(y){var a=i.positionElements(b,y,F.placement,C);a.top+="px",a.left+="px",y.css(a)}};F.origScope=a,F.isOpen=!1,F.contentExp=function(){return a.$eval(d[e])},m.useContentExp||d.$observe(e,function(a){F.content=a,!a&&F.isOpen&&q()}),d.$observe("disabled",function(a){a&&F.isOpen&&q()}),d.$observe(k+"Title",function(a){F.title=a});var H=function(){b.unbind(D.show,l),b.unbind(D.hide,o)};x();var I=a.$eval(d[k+"Animation"]);F.animation=angular.isDefined(I)?!!I:m.animation;var J=a.$eval(d[k+"AppendToBody"]);C=angular.isDefined(J)?J:C,C&&a.$on("$locationChangeSuccess",function(){F.isOpen&&q()}),a.$on("$destroy",function(){g.cancel(A),g.cancel(B),H(),s(),F=null})}}}}}]}).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.tooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("tooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html"}}).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html"}}).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).value("tooltipHtmlUnsafeSuppressDeprecated",!1).directive("tooltipHtmlUnsafe",["$tooltip","tooltipHtmlUnsafeSuppressDeprecated","$log",function(a,b,c){return b||c.warn("tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead."),a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html"}}).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse","$log",function(a,b){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(c,d,e){return function(c,d,f,g){c.$watch("active",function(a){a&&g.select(c)}),c.disabled=!1,f.disable&&c.$parent.$watch(a(f.disable),function(a){c.disabled=!!a}),f.disabled&&(b.warn('Use of "disabled" attribute has been deprecated, please use "disable"'),c.$parent.$watch(a(f.disabled),function(a){c.disabled=!!a})),c.select=function(){c.disabled||(c.active=!0)},g.addTab(c),c.$on("$destroy",function(){g.removeTab(c)}),c.$transcludeFn=e}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b,c,d){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),"m"!==b&&(a.minutes=i(d)),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render,o.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g);var i=angular.isDefined(b.arrowkeys)?a.$parent.$eval(b.arrowkeys):f.arrowkeys;i&&this.setupArrowkeyEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(b){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(b){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$viewValue;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.transition",[]).value("$transitionSuppressDeprecated",!1).factory("$transition",["$q","$timeout","$rootScope","$log","$transitionSuppressDeprecated",function(a,b,c,d,e){function f(a){for(var b in a)if(void 0!==h.style[b])return a[b]}e||d.warn("$transition is now deprecated. Use $animate from ngAnimate instead.");var g=function(d,e,f){f=f||{};var h=a.defer(),i=g[f.animation?"animationEndEventName":"transitionEndEventName"],j=function(a){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(e)?d.addClass(e):angular.isFunction(e)?e(d):angular.isObject(e)&&d.css(e),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},h=document.createElement("trans"),i={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},j={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return g.transitionEndEventName=f(i),g.animationEndEventName=f(j),g}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
      ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c&&c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return p||l.$setValidity("editable",!0),s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),l.$setValidity("parse",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(a){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove(),z.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
      \n
      \n

      \n {{heading}}\n

      \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'
      \n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
      \n \n \n \n
      ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      {{label.abbr}}
      {{ weekNumbers[$index] }}\n \n
      \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n'); +}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-window.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
      \n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
      \n
      \n
      \n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
      \n \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
       
      \n \n :\n \n
       
      \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("collapse",["$animate",function(a){return{link:function(b,c,d){function e(){c.removeClass("collapse").addClass("collapsing"),a.addClass(c,"in",{to:{height:c[0].scrollHeight+"px"}}).then(f)}function f(){c.removeClass("collapsing"),c.css({height:"auto"})}function g(){c.css({height:c[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing"),a.removeClass(c,"in",{to:{height:"0"}}).then(h)}function h(){c.css({height:"0"}),c.removeClass("collapsing"),c.addClass("collapse")}b.$watch(d.collapse,function(a){a?g():e()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(c){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("CarouselController",["$scope","$interval","$animate",function(a,b,c){function d(a){if(angular.isUndefined(k[a].index))return k[a];var b;for(k.length,b=0;b0&&(h=b(g,c))}function f(){h&&(b.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(b,d){function f(){m||(angular.extend(b,{direction:d,active:!0}),angular.extend(j.currentSlide||{},{direction:d,active:!1}),c.enabled()&&!a.noTransition&&b.$element&&(a.$currentTransition=!0,b.$element.one("$animate:close",function(){a.$currentTransition=null})),j.currentSlide=b,l=g,e())}var g=j.indexOfSlide(b);void 0===d&&(d=g>j.getCurrentIndex()?"next":"prev"),b&&b!==j.currentSlide&&f()},a.$on("$destroy",function(){m=!0}),j.getCurrentIndex=function(){return j.currentSlide&&angular.isDefined(j.currentSlide.index)?+j.currentSlide.index:l},j.indexOfSlide=function(a){return angular.isDefined(a.index)?+a.index:k.indexOf(a)},a.next=function(){var b=(j.getCurrentIndex()+1)%k.length;return a.$currentTransition?void 0:j.select(d(b),"next")},a.prev=function(){var b=j.getCurrentIndex()-1<0?k.length-1:j.getCurrentIndex()-1;return a.$currentTransition?void 0:j.select(d(b),"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){angular.isDefined(a.index)&&k.sort(function(a,b){return+a.index>+b.index});var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?b>=k.length?j.select(k[b-1]):j.select(k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}).animation(".item",["$animate",function(a){return{beforeAddClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return b.addClass(f),a.addClass(b,g).then(function(){e||b.removeClass(g+" "+f),d()}),function(){e=!0}}d()},beforeRemoveClass:function(b,c,d){if("active"==c&&b.parent()&&!b.parent().scope().noTransition){var e=!1,f=b.isolateScope().direction,g="next"==f?"left":"right";return a.addClass(b,g).then(function(){e||b.removeClass(g),d()}),function(){e=!0}}d()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(f,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}var e=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.parsers={};var f={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")},HH:{regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a}},H:{regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a}},mm:{regex:"[0-5][0-9]",apply:function(a){this.minutes=+a}},m:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a}},sss:{regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a}},ss:{regex:"[0-5][0-9]",apply:function(a){this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}}};this.parse=function(b,f,g){if(!angular.isString(b)||!f)return b;f=a.DATETIME_FORMATS[f]||f,f=f.replace(e,"\\$&"),this.parsers[f]||(this.parsers[f]=c(f));var h=this.parsers[f],i=h.regex,j=h.map,k=b.match(i);if(k&&k.length){var l,m;l=g?{year:g.getFullYear(),month:g.getMonth(),date:g.getDate(),hours:g.getHours(),minutes:g.getMinutes(),seconds:g.getSeconds(),milliseconds:g.getMilliseconds()}:{year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0};for(var n=1,o=k.length;o>n;n++){var p=j[n-1];p.apply&&p.apply.call(l,k[n])}return d(l.year,l.month,l.date)&&(m=new Date(l.year,l.month,l.date,l.hours,l.minutes,l.seconds,l.milliseconds||0)),m}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.maxMode=i.maxMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=(11-e.startingDay)%7,p=b.rows.length,q=0;p>q;q++)b.weekNumbers.push(h(b.rows[q][o].date))}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a,b){var c=e.activeDate.getDate();if("left"===a)c-=1;else if("up"===a)c-=7;else if("right"===a)c+=1;else if("down"===a)c+=7;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(d,1),c=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),c)}else"home"===a?c=1:"end"===a&&(c=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(c)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a,b){var c=e.activeDate.getMonth();if("left"===a)c-=1;else if("up"===a)c-=3;else if("right"===a)c+=1;else if("down"===a)c+=3;else if("pageup"===a||"pagedown"===a){var d=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(d)}else"home"===a?c=0:"end"===a&&(c=11);e.activeDate.setMonth(c)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a,b){var c=d.activeDate.getFullYear();"left"===a?c-=1:"up"===a?c-=5:"right"===a?c+=1:"down"===a?c+=5:"pageup"===a||"pagedown"===a?c+=("pageup"===a?-1:1)*d.step.years:"home"===a?c=e(d.activeDate.getFullYear()):"end"===a&&(c=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(c)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(angular.isNumber(a)&&(a=new Date(a)),a){if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=f.parse(a,o,h.date)||new Date(a);return isNaN(b)?void 0:b}return void 0}return null}function n(a,b){var c=a||b;if(angular.isNumber(c)&&(c=new Date(c)),c){if(angular.isDate(c)&&!isNaN(c))return!0;if(angular.isString(c)){var d=f.parse(c,o)||new Date(c);return!isNaN(d)}return!1}return!0}var o,p=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,q=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar, +h.getText=function(a){return h[a+"Text"]||g[a+"Text"]};var r=!1;if(g.html5Types[j.type]?(o=g.html5Types[j.type],r=!0):(o=j.datepickerPopup||g.datepickerPopup,j.$observe("datepickerPopup",function(a,b){var c=a||g.datepickerPopup;if(c!==o&&(o=c,k.$modelValue=null,!o))throw new Error("datepickerPopup must have a date format specified.")})),!o)throw new Error("datepickerPopup must have a date format specified.");if(r&&j.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");var s=angular.element("
      ");s.attr({"ng-model":"date","ng-change":"dateSelection()"});var t=angular.element(s.children()[0]);if(r&&"month"==j.type&&(t.attr("datepicker-mode",'"month"'),t.attr("min-mode","month")),j.datepickerOptions){var u=h.$parent.$eval(j.datepickerOptions);u.initDate&&(h.initDate=u.initDate,t.attr("init-date","initDate"),delete u.initDate),angular.forEach(u,function(a,b){t.attr(l(b),a)})}h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),t.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&t.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),j.showWeeks&&t.attr("show-weeks",j.showWeeks),j.customClass&&t.attr("custom-class","customClass({ date: date, mode: mode })"),r?k.$formatters.push(function(a){return h.date=a,a}):(k.$$parserName="date",k.$validators.date=n,k.$parsers.unshift(m),k.$formatters.push(function(a){return h.date=a,k.$isEmpty(a)?a:e(a,o)})),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a);var b=h.date?e(h.date,o):"";i.val(b),k.$setViewValue(b),p&&(h.isOpen=!1,i[0].focus())},k.$viewChangeListeners.push(function(){h.date=f.parse(k.$viewValue,o,h.date)||new Date(k.$viewValue)});var v=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},w=function(a,b){h.keydown(a)};i.bind("keydown",w),h.keydown=function(a){27===a.which?(a.preventDefault(),h.isOpen&&a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=q?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",v)):c.unbind("click",v)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(h.date)?(a=new Date(h.date),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var x=a(s)(h);s.remove(),q?c.find("body").append(x):i.after(x),h.$on("$destroy",function(){x.remove(),i.unbind("keydown",w),c.unbind("click",v)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b,c){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which&&(c.focusToggleElement(),d())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate","$position","$document",function(a,b,c,d,e,f,g,h){var i,j=this,k=a.$new(),l=d.openClass,m=angular.noop,n=b.onToggle?c(b.onToggle):angular.noop,o=!1;this.init=function(d){j.$element=d,b.isOpen&&(i=c(b.isOpen),m=i.assign,a.$watch(i,function(a){k.isOpen=!!a})),o=angular.isDefined(b.dropdownAppendToBody),o&&j.dropdownMenu&&(h.find("body").append(j.dropdownMenu),d.on("$destroy",function(){j.dropdownMenu.remove()}))},this.toggle=function(a){return k.isOpen=arguments.length?!!a:!k.isOpen},this.isOpen=function(){return k.isOpen},k.getToggleElement=function(){return j.toggleElement},k.getAutoClose=function(){return b.autoClose||"always"},k.getElement=function(){return j.$element},k.focusToggleElement=function(){j.toggleElement&&j.toggleElement[0].focus()},k.$watch("isOpen",function(b,c){if(o&&j.dropdownMenu){var d=g.positionElements(j.$element,j.dropdownMenu,"bottom-left",!0);j.dropdownMenu.css({top:d.top+"px",left:d.left+"px",display:b?"block":"none"})}f[b?"addClass":"removeClass"](j.$element,l),b?(k.focusToggleElement(),e.open(k)):e.close(k),m(a,b),angular.isDefined(b)&&b!==c&&n(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){k.isOpen=!1}),a.$on("$destroy",function(){k.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownMenu",function(){return{restrict:"AC",require:"?^dropdown",link:function(a,b,c,d){d&&(d.dropdownMenu=b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(l&&-1==g()){var a=m;j(l,m,function(){a=null}),l=void 0,m=void 0}}function j(c,d,f){function g(){g.done||(g.done=!0,c.remove(),d.$destroy(),f&&f())}d.animate=!1,c.attr("modal-animation")&&a.enabled()?c.one("$animate:close",function(){e.$evalAsync(g)}):b(g)}function k(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var l,m,n="modal-open",o=f.createNew(),p={};return e.$watch(g,function(a){m&&(m.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=o.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){p.dismiss(b.key,"escape key press")})))}),p.open=function(a,b){var f=c[0].activeElement;o.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var h=c.find("body").eq(0),i=g();if(i>=0&&!l){m=e.$new(!0),m.index=i;var j=angular.element('
      ');j.attr("backdrop-class",b.backdropClass),b.animation&&j.attr("modal-animation","true"),l=d(j)(m),h.append(l)}var k=angular.element('
      ');k.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:o.length()-1,animate:"animate"}).html(b.content),b.animation&&k.attr("modal-animation","true");var p=d(k)(b.scope);o.top().value.modalDomEl=p,o.top().value.modalOpener=f,h.append(p),h.addClass(n)},p.close=function(a,b){var c=o.get(a);return c&&k(c,b,!0)?(c.value.deferred.resolve(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismiss=function(a,b){var c=o.get(a);return c&&k(c,b,!1)?(c.value.deferred.reject(b),h(a),c.value.modalOpener.focus(),!0):!c},p.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},p.getTop=function(){return o.top()},p.modalRendered=function(a){var b=o.get(a);b&&b.value.renderDeferred.resolve()},p}]).provider("$modal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$modalStack",function(b,c,d,e,f,g){function h(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function i(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var j={};return j.open=function(b){var e=d.defer(),j=d.defer(),k=d.defer(),l={result:e.promise,opened:j.promise,rendered:k.promise,close:function(a){return g.close(l,a)},dismiss:function(a){return g.dismiss(l,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var m=d.all([h(b)].concat(i(b.resolve)));return m.then(function(a){var d=(b.scope||c).$new();d.$close=l.close,d.$dismiss=l.dismiss;var h,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=l,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),h=f(b.controller,i),b.controllerAs&&(d[b.controllerAs]=h)),g.open(l,{scope:d,deferred:e,renderDeferred:k,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),m.then(function(){j.resolve(!0)},function(a){j.reject(a)}),l},j}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l,m){function n(a){var b=a||m.trigger||l,d=c[b]||b;return{show:b,hide:d}}m=angular.extend({},b,d,m);var o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
      ';return{restrict:"EA",compile:function(a,b){var c=f(r);return function(a,b,d,f){function j(){F.isOpen?o():l()}function l(){(!E||a.$eval(d[k+"Enable"]))&&(t(),F.popupDelay?B||(B=g(p,F.popupDelay,!1),B.then(function(a){a()})):p()())}function o(){a.$apply(function(){q()})}function p(){return B=null,A&&(g.cancel(A),A=null),(m.useContentExp?F.contentExp():F.content)?(r(),y.css({top:0,left:0,display:"block"}),F.$digest(),G(),F.isOpen=!0,F.$apply(),G):angular.noop}function q(){F.isOpen=!1,g.cancel(B),B=null,F.animation?A||(A=g(s,500)):s()}function r(){y&&s(),z=F.$new(),y=c(z,function(a){C?h.find("body").append(a):b.after(a)}),z.$watch(function(){g(G,0,!1)}),m.useContentExp&&z.$watch("contentExp()",function(a){!a&&F.isOpen&&q()})}function s(){A=null,y&&(y.remove(),y=null),z&&(z.$destroy(),z=null)}function t(){u(),v(),w()}function u(){F.popupClass=d[k+"Class"]}function v(){var a=d[k+"Placement"];F.placement=angular.isDefined(a)?a:m.placement}function w(){var a=d[k+"PopupDelay"],b=parseInt(a,10);F.popupDelay=isNaN(b)?m.popupDelay:b}function x(){var a=d[k+"Trigger"];H(),D=n(a),D.show===D.hide?b.bind(D.show,j):(b.bind(D.show,l),b.bind(D.hide,o))}var y,z,A,B,C=angular.isDefined(m.appendToBody)?m.appendToBody:!1,D=n(void 0),E=angular.isDefined(d[k+"Enable"]),F=a.$new(!0),G=function(){if(y){var a=i.positionElements(b,y,F.placement,C);a.top+="px",a.left+="px",y.css(a)}};F.origScope=a,F.isOpen=!1,F.contentExp=function(){return a.$eval(d[e])},m.useContentExp||d.$observe(e,function(a){F.content=a,!a&&F.isOpen&&q()}),d.$observe("disabled",function(a){a&&F.isOpen&&q()}),d.$observe(k+"Title",function(a){F.title=a});var H=function(){b.unbind(D.show,l),b.unbind(D.hide,o)};x();var I=a.$eval(d[k+"Animation"]);F.animation=angular.isDefined(I)?!!I:m.animation;var J=a.$eval(d[k+"AppendToBody"]);C=angular.isDefined(J)?J:C,C&&a.$on("$locationChangeSuccess",function(){F.isOpen&&q()}),a.$on("$destroy",function(){g.cancel(A),g.cancel(B),H(),s(),F=null})}}}}}]}).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.tooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("tooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html"}}).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html"}}).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).value("tooltipHtmlUnsafeSuppressDeprecated",!1).directive("tooltipHtmlUnsafe",["$tooltip","tooltipHtmlUnsafeSuppressDeprecated","$log",function(a,b,c){return b||c.warn("tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead."),a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html"}}).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse","$log",function(a,b){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(c,d,e){return function(c,d,f,g){c.$watch("active",function(a){a&&g.select(c)}),c.disabled=!1,f.disable&&c.$parent.$watch(a(f.disable),function(a){c.disabled=!!a}),f.disabled&&(b.warn('Use of "disabled" attribute has been deprecated, please use "disable"'),c.$parent.$watch(a(f.disabled),function(a){c.disabled=!!a})),c.select=function(){c.disabled||(c.active=!0)},g.addTab(c),c.$on("$destroy",function(){g.removeTab(c)}),c.$transcludeFn=e}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b,c,d){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),"m"!==b&&(a.minutes=i(d)),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render,o.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g);var i=angular.isDefined(b.arrowkeys)?a.$parent.$eval(b.arrowkeys):f.arrowkeys;i&&this.setupArrowkeyEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(b){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(b){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$viewValue;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.transition",[]).value("$transitionSuppressDeprecated",!1).factory("$transition",["$q","$timeout","$rootScope","$log","$transitionSuppressDeprecated",function(a,b,c,d,e){function f(a){for(var b in a)if(void 0!==h.style[b])return a[b]}e||d.warn("$transition is now deprecated. Use $animate from ngAnimate instead.");var g=function(d,e,f){f=f||{};var h=a.defer(),i=g[f.animation?"animationEndEventName":"transitionEndEventName"],j=function(a){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(e)?d.addClass(e):angular.isFunction(e)?e(d):angular.isObject(e)&&d.css(e),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},h=document.createElement("trans"),i={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},j={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return g.transitionEndEventName=f(i),g.animationEndEventName=f(j),g}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
      ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a; +};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c&&c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return p||l.$setValidity("editable",!0),s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),l.$setValidity("parse",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(a){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove(),z.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
      \n
      \n

      \n {{heading}}\n

      \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'
      \n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
      \n \n \n \n
      ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      {{label.abbr}}
      {{ weekNumbers[$index] }}\n \n
      \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n
      \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover-window.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-window.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
      \n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
      \n
      \n
      \n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
      \n \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
       
      \n \n :\n \n
       
      \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend(''); +//# sourceMappingURL=ui-bootstrap-tpls.min.js.map \ No newline at end of file diff --git a/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js.map b/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js.map new file mode 100644 index 000000000..9f257a94d --- /dev/null +++ b/td/public/libs/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ui-bootstrap-tpls.min.js","sources":["ui-bootstrap-tpls.js","ui-bootstrap-tpls.min.js"],"names":["angular","module","directive","$animate","link","scope","element","attrs","expand","removeClass","addClass","to","height","scrollHeight","then","expandDone","css","collapse","collapseDone","$watch","shouldCollapse","constant","closeOthers","controller","$scope","$attrs","accordionConfig","this","groups","openGroup","isDefined","$eval","forEach","group","isOpen","addGroup","groupScope","that","push","$on","event","removeGroup","index","indexOf","splice","restrict","transclude","replace","templateUrl","require","heading","isDisabled","setHeading","accordionCtrl","value","toggleOpen","template","attr","accordionGroupCtrl","noop","accordionTransclude","html","append","closeable","close","type","$timeout","alertCtrl","parseInt","dismissOnTimeout","data","bindHtmlUnsafe","activeClass","toggleEvent","buttonConfig","ctrls","buttonsCtrl","ngModelCtrl","$render","toggleClass","equals","$modelValue","btnRadio","bind","isActive","hasClass","uncheckable","$apply","$setViewValue","getTrueValue","getCheckboxValue","btnCheckboxTrue","getFalseValue","btnCheckboxFalse","attributeValue","defaultValue","val","$interval","getSlideByIndex","isUndefined","slides","i","length","restartTimer","resetTimer","interval","isNaN","currentInterval","timerFn","cancel","isPlaying","next","pause","self","currentIndex","currentSlide","destroyed","select","nextSlide","direction","goNext","extend","active","enabled","noTransition","$element","$currentTransition","one","nextIndex","indexOfSlide","undefined","getCurrentIndex","slide","newIndex","prev","play","noPause","addSlide","removeSlide","sort","a","b","carouselCtrl","animation","beforeAddClass","className","done","parent","stopped","isolateScope","directionClass","beforeRemoveClass","service","$locale","orderByFilter","createParser","format","map","regex","split","formatCodeToRegex","code","n","join","apply","RegExp","isValid","year","month","date","SPECIAL_CHARACTERS_REGEXP","parsers","yyyy","yy","y","MMMM","DATETIME_FORMATS","MONTH","MMM","SHORTMONTH","MM","M","dd","d","EEEE","DAY","EEE","SHORTDAY","HH","hours","H","mm","minutes","m","sss","milliseconds","ss","seconds","s","parse","input","baseDate","isString","parser","results","match","fields","dt","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","mapper","call","Date","factory","$document","$window","getStyle","el","cssprop","currentStyle","getComputedStyle","style","isStaticPositioned","parentOffsetEl","docDomEl","offsetParent","position","elBCR","offset","offsetParentBCR","top","left","offsetParentEl","clientTop","scrollTop","clientLeft","scrollLeft","boundingClientRect","getBoundingClientRect","width","prop","pageYOffset","documentElement","pageXOffset","positionElements","hostEl","targetEl","positionStr","appendToBody","hostElPos","targetElWidth","targetElHeight","targetElPos","positionStrParts","pos0","pos1","shiftWidth","center","right","shiftHeight","bottom","formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","datepickerMode","minMode","maxMode","showWeeks","startingDay","yearRange","minDate","maxDate","shortcutPropagation","$parse","$interpolate","$log","dateFilter","datepickerConfig","modes","key","$parent","refreshView","uniqueId","$id","Math","floor","random","initDate","activeDate","$isEmpty","$invalid","dateObject","compare","activeDateId","uid","init","ngModelCtrl_","render","$viewValue","error","$setValidity","_refreshView","createDateObject","model","label","selected","disabled","current","customClass","dateDisabled","mode","arr","size","arrays","setFullYear","move","step","years","months","toggleMode","keys",13,32,33,34,35,36,37,38,39,40,"focusElement","focus","keydown","evt","which","shiftKey","altKey","preventDefault","stopPropagation","ctrlKey","handleKeyDown","datepickerCtrl","ctrl","getDaysInMonth","DAYS_IN_MONTH","getDates","startDate","dates","Array","setHours","setDate","getISO8601WeekNumber","checkDate","getDay","time","getTime","setMonth","round","firstDayOfMonth","difference","numDisplayedFromPreviousMonth","firstDate","days","secondary","labels","j","abbr","full","title","rows","weekNumbers","thursdayIndex","numWeeks","curWeek","date1","date2","min","getStartingYear","range","start","datepickerPopup","html5Types","datetime-local","currentText","clearText","closeText","closeOnDateSelection","showButtonBar","$compile","$position","dateParser","datepickerPopupConfig","ngModel","cameltoDash","string","$1","toLowerCase","parseDate","viewValue","isNumber","isDate","dateFormat","validator","modelValue","datepickerAppendToBody","getText","isHtml5DateInput","$observe","oldValue","newDateFormat","Error","popupEl","ng-model","ng-change","datepickerEl","children","datepickerOptions","options","option","watchData","getAttribute","setAttribute","assign","oldvalue","$formatters","$$parserName","$validators","$parsers","unshift","dateSelection","$viewChangeListeners","documentClickBind","target","noApply","$broadcast","unbind","today","$popup","remove","find","after","openClass","$rootScope","openScope","open","dropdownScope","closeDropdown","escapeKeyBind","getAutoClose","toggleElement","getToggleElement","contains","getElement","$$phase","focusToggleElement","dropdownConfig","dropdownService","getIsOpen","$new","setIsOpen","toggleInvoker","onToggle","dropdownAppendToBody","dropdownMenu","on","toggle","arguments","autoClose","wasOpen","pos","display","$destroy","dropdownCtrl","toggleDropdown","aria-haspopup","aria-expanded","createNew","stack","add","get","idx","removeTop","linkFn","animate","compile","tElement","tAttrs","backdropClass","$modalStack","$q","windowClass","modal","getTop","backdrop","currentTarget","dismiss","$isRendered","modalRenderDeferObj","defer","resolve","promise","inputsWithAutofocus","querySelectorAll","modalRendered","modalAnimation","modalAnimationClass","$transclude","clone","empty","$$stackedMap","backdropIndex","topBackdropIndex","opened","openedWindows","removeModalWindow","modalInstance","body","eq","modalWindow","removeAfterAnimate","modalDomEl","modalScope","OPENED_MODAL_CLASS","checkRemoveBackdrop","backdropDomEl","backdropScopeRef","backdropScope","domEl","afterAnimating","$evalAsync","broadcastClosing","resultOrReason","closing","defaultPrevented","newBackdropIndex","keyboard","modalOpener","activeElement","deferred","renderDeferred","currBackdropIndex","angularBackgroundDomEl","angularDomEl","template-url","windowTemplateUrl","window-class","content","result","reason","reject","dismissAll","topModal","provider","$modalProvider","$get","$injector","$templateRequest","$controller","getTemplatePromise","when","isFunction","getResolvePromises","resolves","promisesArr","isArray","invoke","$modal","modalOptions","modalResultDeferred","modalOpenedDeferred","modalRenderDeferred","rendered","templateAndResolvePromise","all","concat","tplAndVars","$close","$dismiss","ctrlInstance","ctrlLocals","resolveIter","$modalInstance","controllerAs","setNumPages","numPages","config","itemsPerPage","totalPages","calculateTotalPages","page","selectPage","ceil","totalItems","max","blur","noPrevious","noNext","boundaryLinks","directionLinks","firstText","previousText","nextText","lastText","rotate","paginationConfig","makePage","number","text","getPages","currentPage","pages","startPage","endPage","isMaxSized","maxSize","previousPageSet","nextPageSet","paginationCtrl","originalRender","align","pagerConfig","snake_case","name","regexp","separator","letter","defaultOptions","placement","popupDelay","useContentExp","triggerMap","mouseenter","click","globalOptions","setTriggers","triggers","prefix","defaultTriggerShow","getTriggers","trigger","show","hide","directiveName","startSym","startSymbol","endSym","endSymbol","tElem","tooltipLinker","tooltipCtrl","toggleTooltipBind","ttScope","hideTooltipBind","showTooltipBind","hasEnableExp","prepareTooltip","popupTimeout","reposition","transitionTimeout","contentExp","createTooltip","tooltip","$digest","positionTooltip","removeTooltip","tooltipLinkedScope","prepPopupClass","prepPlacement","prepPopupDelay","popupClass","delay","prepTriggers","unregisterTriggers","ttPosition","origScope","appendToBodyVal","$sce","elem","currentScope","previousElement","currentElement","tooltipTemplateTranscludeScope","changeCounter","cleanupLastIncludeContent","leave","parseAsResourceUrl","tooltipTemplateTransclude","src","thisChangeId","response","newScope","enter","$emit","tooltipAnimationClass","$tooltip","originScope","tooltipHtmlUnsafeSuppressDeprecated","warn","progressConfig","bars","addBar","bar","transition","percent","toFixed","removeBar","progressCtrl","stateOn","stateOff","ratingConfig","ratingStates","buildTemplateObjects","states","rate","readonly","onHover","reset","onLeave","onKeydown","test","ratingCtrl","tabs","selectedTab","tab","onDeselect","onSelect","addTab","removeTab","newActiveIndex","vertical","justified","elm","tabsetCtrl","disable","$transcludeFn","tabCtrl","isTabHeading","node","tagName","hasAttribute","tabContentTransclude","contents","headingElement","hourStep","minuteStep","showMeridian","meridians","readonlyInput","mousewheel","arrowkeys","timepickerConfig","getHoursFromTemplate","valid","meridian","getMinutesFromTemplate","pad","toString","refresh","keyboardChange","makeValid","updateTemplate","invalidHours","invalidMinutes","addMinutes","AMPMS","inputs","hoursInputEl","minutesInputEl","setupMousewheelEvents","setupArrowkeyEvents","setupInputEvents","$error","isScrollingUp","e","originalEvent","delta","wheelDelta","deltaY","detail","incrementHours","decrementHours","incrementMinutes","decrementMinutes","updateHours","updateMinutes","invalidate","setMinutes","toggleMeridian","timepickerCtrl","$transitionSuppressDeprecated","findEndEventName","endEventNames","transElement","$transition","endEventName","transitionEndHandler","isObject","document","createElement","transitionEndEventNames","WebkitTransition","MozTransition","OTransition","animationEndEventNames","transitionEndEventName","animationEndEventName","TYPEAHEAD_REGEXP","itemName","source","viewMapper","modelMapper","typeaheadParser","HOT_KEYS","originalScope","modelCtrl","hasFocus","minSearch","typeaheadMinLength","waitTime","typeaheadWaitMs","isEditable","typeaheadEditable","isLoadingSetter","typeaheadLoading","onSelectCallback","typeaheadOnSelect","inputFormatter","typeaheadInputFormatter","typeaheadAppendToBody","focusFirst","typeaheadFocusFirst","$setModelValue","parserResult","typeahead","popupId","aria-autocomplete","aria-owns","popUpEl","id","matches","query","typeaheadTemplateUrl","resetMatches","activeIdx","getMatchId","removeAttr","getMatchesAsync","inputValue","locals","onCurrentRequest","timeoutPromise","scheduleSearchWithTimeout","cancelPreviousTimeout","candidateViewValue","emptyViewValue","$model","item","$item","$label","dismissClickHandler","matchIdx","selectActive","selectMatch","tplUrl","tplContent","trim","clonedElement","replaceWith","filter","escapeRegexp","queryToEscape","matchItem","run","$templateCache","put","$$csp","prepend","c","f","g","h","k","l","o","p","q","r","t","u","v","w","x","F","E","B","A","G","z","C","D","I","J"],"mappings":"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"} \ No newline at end of file diff --git a/td/public/libs/angular/angular.js b/td/public/libs/angular/angular.js new file mode 100644 index 000000000..f7442c0b0 --- /dev/null +++ b/td/public/libs/angular/angular.js @@ -0,0 +1,28364 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, document, undefined) {'use strict'; + +/** + * @description + * + * This object provides a utility for producing rich Error messages within + * Angular. It can be called as follows: + * + * var exampleMinErr = minErr('example'); + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); + * + * The above creates an instance of minErr in the example namespace. The + * resulting error will have a namespaced error code of example.one. The + * resulting error will replace {0} with the value of foo, and {1} with the + * value of bar. The object is not restricted in the number of arguments it can + * take. + * + * If fewer arguments are specified than necessary for interpolation, the extra + * interpolation markers will be preserved in the final string. + * + * Since data will be parsed statically during a build step, some restrictions + * are applied with respect to how minErr instances are created and called. + * Instances should have names of the form namespaceMinErr for a minErr created + * using minErr('namespace') . Error codes, namespaces and template strings + * should all be static strings, not variables or general expressions. + * + * @param {string} module The namespace to use for the new minErr instance. + * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning + * error from returned function, for cases when a particular type of error is useful. + * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance + */ + +function minErr(module, ErrorConstructor) { + ErrorConstructor = ErrorConstructor || Error; + return function() { + var SKIP_INDEXES = 2; + + var templateArgs = arguments, + code = templateArgs[0], + message = '[' + (module ? module + ':' : '') + code + '] ', + template = templateArgs[1], + paramPrefix, i; + + message += template.replace(/\{\d+\}/g, function(match) { + var index = +match.slice(1, -1), + shiftedIndex = index + SKIP_INDEXES; + + if (shiftedIndex < templateArgs.length) { + return toDebugString(templateArgs[shiftedIndex]); + } + + return match; + }); + + message += '\nhttp://errors.angularjs.org/1.4.3/' + + (module ? module + '/' : '') + code; + + for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') { + message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' + + encodeURIComponent(toDebugString(templateArgs[i])); + } + + return new ErrorConstructor(message); + }; +} + +/* We need to tell jshint what variables are being exported */ +/* global angular: true, + msie: true, + jqLite: true, + jQuery: true, + slice: true, + splice: true, + push: true, + toString: true, + ngMinErr: true, + angularModule: true, + uid: true, + REGEX_STRING_REGEXP: true, + VALIDITY_STATE_PROPERTY: true, + + lowercase: true, + uppercase: true, + manualLowercase: true, + manualUppercase: true, + nodeName_: true, + isArrayLike: true, + forEach: true, + forEachSorted: true, + reverseParams: true, + nextUid: true, + setHashKey: true, + extend: true, + toInt: true, + inherit: true, + merge: true, + noop: true, + identity: true, + valueFn: true, + isUndefined: true, + isDefined: true, + isObject: true, + isBlankObject: true, + isString: true, + isNumber: true, + isDate: true, + isArray: true, + isFunction: true, + isRegExp: true, + isWindow: true, + isScope: true, + isFile: true, + isFormData: true, + isBlob: true, + isBoolean: true, + isPromiseLike: true, + trim: true, + escapeForRegexp: true, + isElement: true, + makeMap: true, + includes: true, + arrayRemove: true, + copy: true, + shallowCopy: true, + equals: true, + csp: true, + jq: true, + concat: true, + sliceArgs: true, + bind: true, + toJsonReplacer: true, + toJson: true, + fromJson: true, + convertTimezoneToLocal: true, + timezoneToOffset: true, + startingTag: true, + tryDecodeURIComponent: true, + parseKeyValue: true, + toKeyValue: true, + encodeUriSegment: true, + encodeUriQuery: true, + angularInit: true, + bootstrap: true, + getTestability: true, + snake_case: true, + bindJQuery: true, + assertArg: true, + assertArgFn: true, + assertNotHasOwnProperty: true, + getter: true, + getBlockNodes: true, + hasOwnProperty: true, + createMap: true, + + NODE_TYPE_ELEMENT: true, + NODE_TYPE_ATTRIBUTE: true, + NODE_TYPE_TEXT: true, + NODE_TYPE_COMMENT: true, + NODE_TYPE_DOCUMENT: true, + NODE_TYPE_DOCUMENT_FRAGMENT: true, +*/ + +//////////////////////////////////// + +/** + * @ngdoc module + * @name ng + * @module ng + * @description + * + * # ng (core module) + * The ng module is loaded by default when an AngularJS application is started. The module itself + * contains the essential components for an AngularJS application to function. The table below + * lists a high level breakdown of each of the services/factories, filters, directives and testing + * components available within this core module. + * + *
      + */ + +var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; + +// The name of a form control's ValidityState property. +// This is used so that it's possible for internal tests to create mock ValidityStates. +var VALIDITY_STATE_PROPERTY = 'validity'; + +/** + * @ngdoc function + * @name angular.lowercase + * @module ng + * @kind function + * + * @description Converts the specified string to lowercase. + * @param {string} string String to be converted to lowercase. + * @returns {string} Lowercased string. + */ +var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * @ngdoc function + * @name angular.uppercase + * @module ng + * @kind function + * + * @description Converts the specified string to uppercase. + * @param {string} string String to be converted to uppercase. + * @returns {string} Uppercased string. + */ +var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var + msie, // holds major version number for IE, or NaN if UA is not IE. + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + splice = [].splice, + push = [].push, + toString = Object.prototype.toString, + getPrototypeOf = Object.getPrototypeOf, + ngMinErr = minErr('ng'), + + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + uid = 0; + +/** + * documentMode is an IE-only property + * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx + */ +msie = document.documentMode; + + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, + * String ...) + */ +function isArrayLike(obj) { + if (obj == null || isWindow(obj)) { + return false; + } + + // Support: iOS 8.2 (not reproducible in simulator) + // "length" in obj used to prevent JIT error (gh-11508) + var length = "length" in Object(obj) && obj.length; + + if (obj.nodeType === NODE_TYPE_ELEMENT && length) { + return true; + } + + return isString(obj) || isArray(obj) || length === 0 || + typeof length === 'number' && length > 0 && (length - 1) in obj; +} + +/** + * @ngdoc function + * @name angular.forEach + * @module ng + * @kind function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` + * is the value of an object property or an array element, `key` is the object property key or + * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. + * + * It is worth noting that `.forEach` does not iterate over inherited properties because it filters + * using the `hasOwnProperty` method. + * + * Unlike ES262's + * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18), + * Providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just + * return the value provided. + * + ```js + var values = {name: 'misko', gender: 'male'}; + var log = []; + angular.forEach(values, function(value, key) { + this.push(key + ': ' + value); + }, log); + expect(log).toEqual(['name: misko', 'gender: male']); + ``` + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ + +function forEach(obj, iterator, context) { + var key, length; + if (obj) { + if (isFunction(obj)) { + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context, obj); + } else if (isBlankObject(obj)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in obj) { + iterator.call(context, obj[key], key, obj); + } + } else if (typeof obj.hasOwnProperty === 'function') { + // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key, obj); + } + } + } else { + // Slow path for objects which do not have a method `hasOwnProperty` + for (key in obj) { + if (hasOwnProperty.call(obj, key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + } + return obj; +} + +function forEachSorted(obj, iterator, context) { + var keys = Object.keys(obj).sort(); + for (var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) { iteratorFn(key, value); }; +} + +/** + * A consistent way of creating unique IDs in angular. + * + * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before + * we hit number precision issues in JavaScript. + * + * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M + * + * @returns {number} an unique alpha-numeric string + */ +function nextUid() { + return ++uid; +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } else { + delete obj.$$hashKey; + } +} + + +function baseExtend(dst, objs, deep) { + var h = dst.$$hashKey; + + for (var i = 0, ii = objs.length; i < ii; ++i) { + var obj = objs[i]; + if (!isObject(obj) && !isFunction(obj)) continue; + var keys = Object.keys(obj); + for (var j = 0, jj = keys.length; j < jj; j++) { + var key = keys[j]; + var src = obj[key]; + + if (deep && isObject(src)) { + if (isDate(src)) { + dst[key] = new Date(src.valueOf()); + } else { + if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; + baseExtend(dst[key], [src], true); + } + } else { + dst[key] = src; + } + } + } + + setHashKey(dst, h); + return dst; +} + +/** + * @ngdoc function + * @name angular.extend + * @module ng + * @kind function + * + * @description + * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so + * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. + * + * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use + * {@link angular.merge} for this. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + return baseExtend(dst, slice.call(arguments, 1), false); +} + + +/** +* @ngdoc function +* @name angular.merge +* @module ng +* @kind function +* +* @description +* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s) +* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so +* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`. +* +* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source +* objects, performing a deep copy. +* +* @param {Object} dst Destination object. +* @param {...Object} src Source object(s). +* @returns {Object} Reference to `dst`. +*/ +function merge(dst) { + return baseExtend(dst, slice.call(arguments, 1), true); +} + + + +function toInt(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(Object.create(parent), extra); +} + +/** + * @ngdoc function + * @name angular.noop + * @module ng + * @kind function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. + ```js + function foo(callback) { + var result = calculateResult(); + (callback || angular.noop)(result); + } + ``` + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @module ng + * @kind function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * + ```js + function transformer(transformationFn, value) { + return (transformationFn || angular.identity)(value); + }; + ``` + * @param {*} value to be returned. + * @returns {*} the value passed in. + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function() {return value;};} + +function hasCustomToString(obj) { + return isFunction(obj.toString) && obj.toString !== Object.prototype.toString; +} + + +/** + * @ngdoc function + * @name angular.isUndefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value) {return typeof value === 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value) {return typeof value !== 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. Note that JavaScript arrays are objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value) { + // http://jsperf.com/isobject4 + return value !== null && typeof value === 'object'; +} + + +/** + * Determine if a value is an object with a null prototype + * + * @returns {boolean} True if `value` is an `Object` with a null prototype + */ +function isBlankObject(value) { + return value !== null && typeof value === 'object' && !getPrototypeOf(value); +} + + +/** + * @ngdoc function + * @name angular.isString + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value) {return typeof value === 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Number`. + * + * This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`. + * + * If you wish to exclude these then you can use the native + * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite) + * method. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value) {return typeof value === 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @module ng + * @kind function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value) { + return toString.call(value) === '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +var isArray = Array.isArray; + +/** + * @ngdoc function + * @name angular.isFunction + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value) {return typeof value === 'function';} + + +/** + * Determines if a value is a regular expression object. + * + * @private + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `RegExp`. + */ +function isRegExp(value) { + return toString.call(value) === '[object RegExp]'; +} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.window === obj; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.call(obj) === '[object File]'; +} + + +function isFormData(obj) { + return toString.call(obj) === '[object FormData]'; +} + + +function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; +} + + +function isBoolean(value) { + return typeof value === 'boolean'; +} + + +function isPromiseLike(obj) { + return obj && isFunction(obj.then); +} + + +var TYPED_ARRAY_REGEXP = /^\[object (Uint8(Clamped)?)|(Uint16)|(Uint32)|(Int8)|(Int16)|(Int32)|(Float(32)|(64))Array\]$/; +function isTypedArray(value) { + return TYPED_ARRAY_REGEXP.test(toString.call(value)); +} + + +var trim = function(value) { + return isString(value) ? value.trim() : value; +}; + +// Copied from: +// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021 +// Prereq: s is a string. +var escapeForRegexp = function(s) { + return s.replace(/([-()\[\]{}+?*.$\^|,:#= 0) { + array.splice(index, 1); + } + return index; +} + +/** + * @ngdoc function + * @name angular.copy + * @module ng + * @kind function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for arrays) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. + * * If `source` is identical to 'destination' an exception will be thrown. + * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + * + * @example + + +
      +
      + Name:
      + E-mail:
      + Gender: male + female
      + + +
      +
      form = {{user | json}}
      +
      master = {{master | json}}
      +
      + + +
      +
      + */ +function copy(source, destination, stackSource, stackDest) { + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + "Can't copy! Making copies of Window or Scope instances is not supported."); + } + if (isTypedArray(destination)) { + throw ngMinErr('cpta', + "Can't copy! TypedArray destination cannot be mutated."); + } + + if (!destination) { + destination = source; + if (isObject(source)) { + var index; + if (stackSource && (index = stackSource.indexOf(source)) !== -1) { + return stackDest[index]; + } + + // TypedArray, Date and RegExp have specific copy functionality and must be + // pushed onto the stack before returning. + // Array and other objects create the base object and recurse to copy child + // objects. The array/object will be pushed onto the stack when recursed. + if (isArray(source)) { + return copy(source, [], stackSource, stackDest); + } else if (isTypedArray(source)) { + destination = new source.constructor(source); + } else if (isDate(source)) { + destination = new Date(source.getTime()); + } else if (isRegExp(source)) { + destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); + destination.lastIndex = source.lastIndex; + } else { + var emptyObject = Object.create(getPrototypeOf(source)); + return copy(source, emptyObject, stackSource, stackDest); + } + + if (stackDest) { + stackSource.push(source); + stackDest.push(destination); + } + } + } else { + if (source === destination) throw ngMinErr('cpi', + "Can't copy! Source and destination are identical."); + + stackSource = stackSource || []; + stackDest = stackDest || []; + + if (isObject(source)) { + stackSource.push(source); + stackDest.push(destination); + } + + var result, key; + if (isArray(source)) { + destination.length = 0; + for (var i = 0; i < source.length; i++) { + destination.push(copy(source[i], null, stackSource, stackDest)); + } + } else { + var h = destination.$$hashKey; + if (isArray(destination)) { + destination.length = 0; + } else { + forEach(destination, function(value, key) { + delete destination[key]; + }); + } + if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } + } else { + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copy(source[key], null, stackSource, stackDest); + } + } + } + setHashKey(destination,h); + } + } + return destination; +} + +/** + * Creates a shallow copy of an object, an array or a primitive. + * + * Assumes that there are no proto properties for objects. + */ +function shallowCopy(src, dst) { + if (isArray(src)) { + dst = dst || []; + + for (var i = 0, ii = src.length; i < ii; i++) { + dst[i] = src[i]; + } + } else if (isObject(src)) { + dst = dst || {}; + + for (var key in src) { + if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { + dst[key] = src[key]; + } + } + } + + return dst || src; +} + + +/** + * @ngdoc function + * @name angular.equals + * @module ng + * @kind function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, regular + * expressions, arrays and objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties are equal by + * comparing them with `angular.equals`. + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) + * * Both values represent the same regular expression (In JavaScript, + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual + * representation matches). + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN + var t1 = typeof o1, t2 = typeof o2, length, key, keySet; + if (t1 == t2) { + if (t1 == 'object') { + if (isArray(o1)) { + if (!isArray(o2)) return false; + if ((length = o1.length) == o2.length) { + for (key = 0; key < length; key++) { + if (!equals(o1[key], o2[key])) return false; + } + return true; + } + } else if (isDate(o1)) { + if (!isDate(o2)) return false; + return equals(o1.getTime(), o2.getTime()); + } else if (isRegExp(o1)) { + return isRegExp(o2) ? o1.toString() == o2.toString() : false; + } else { + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || + isArray(o2) || isDate(o2) || isRegExp(o2)) return false; + keySet = createMap(); + for (key in o1) { + if (key.charAt(0) === '$' || isFunction(o1[key])) continue; + if (!equals(o1[key], o2[key])) return false; + keySet[key] = true; + } + for (key in o2) { + if (!(key in keySet) && + key.charAt(0) !== '$' && + o2[key] !== undefined && + !isFunction(o2[key])) return false; + } + return true; + } + } + } + return false; +} + +var csp = function() { + if (isDefined(csp.isActive_)) return csp.isActive_; + + var active = !!(document.querySelector('[ng-csp]') || + document.querySelector('[data-ng-csp]')); + + if (!active) { + try { + /* jshint -W031, -W054 */ + new Function(''); + /* jshint +W031, +W054 */ + } catch (e) { + active = true; + } + } + + return (csp.isActive_ = active); +}; + +/** + * @ngdoc directive + * @module ng + * @name ngJq + * + * @element ANY + * @param {string=} ngJq the name of the library available under `window` + * to be used for angular.element + * @description + * Use this directive to force the angular.element library. This should be + * used to force either jqLite by leaving ng-jq blank or setting the name of + * the jquery variable under window (eg. jQuery). + * + * Since angular looks for this directive when it is loaded (doesn't wait for the + * DOMContentLoaded event), it must be placed on an element that comes before the script + * which loads angular. Also, only the first instance of `ng-jq` will be used and all + * others ignored. + * + * @example + * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. + ```html + + + ... + ... + + ``` + * @example + * This example shows how to use a jQuery based library of a different name. + * The library name must be available at the top most 'window'. + ```html + + + ... + ... + + ``` + */ +var jq = function() { + if (isDefined(jq.name_)) return jq.name_; + var el; + var i, ii = ngAttrPrefixes.length, prefix, name; + for (i = 0; i < ii; ++i) { + prefix = ngAttrPrefixes[i]; + if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { + name = el.getAttribute(prefix + 'jq'); + break; + } + } + + return (jq.name_ = name); +}; + +function concat(array1, array2, index) { + return array1.concat(slice.call(array2, index)); +} + +function sliceArgs(args, startIndex) { + return slice.call(args, startIndex || 0); +} + + +/* jshint -W101 */ +/** + * @ngdoc function + * @name angular.bind + * @module ng + * @kind function + * + * @description + * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for + * `fn`). You can supply optional `args` that are prebound to the function. This feature is also + * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as + * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). + * + * @param {Object} self Context which `fn` should be evaluated in. + * @param {function()} fn Function to be bound. + * @param {...*} args Optional arguments to be prebound to the `fn` function call. + * @returns {function()} Function that wraps the `fn` with all the specified bindings. + */ +/* jshint +W101 */ +function bind(self, fn) { + var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; + if (isFunction(fn) && !(fn instanceof RegExp)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, concat(curryArgs, arguments, 0)) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @module ng + * @kind function + * + * @description + * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be + * stripped since angular uses this notation internally. + * + * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. + * If set to an integer, the JSON output will contain that many spaces per indentation. + * @returns {string|undefined} JSON-ified string representing `obj`. + */ +function toJson(obj, pretty) { + if (typeof obj === 'undefined') return undefined; + if (!isNumber(pretty)) { + pretty = pretty ? 2 : null; + } + return JSON.stringify(obj, toJsonReplacer, pretty); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @module ng + * @kind function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|string|number} Deserialized JSON string. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +function timezoneToOffset(timezone, fallback) { + var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; + return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; +} + + +function addDateMinutes(date, minutes) { + date = new Date(date.getTime()); + date.setMinutes(date.getMinutes() + minutes); + return date; +} + + +function convertTimezoneToLocal(date, timezone, reverse) { + reverse = reverse ? -1 : 1; + var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset())); +} + + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // turns out IE does not let you set .html() on elements which + // are not allowed to have children. So we just ignore it. + element.empty(); + } catch (e) {} + var elemHtml = jqLite('
      ').append(element).html(); + try { + return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : + elemHtml. + match(/^(<[^>]+>)/)[1]. + replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); + } catch (e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch (e) { + // Ignore any invalid uri component + } +} + + +/** + * Parses an escaped url query string into key-value pairs. + * @returns {Object.} + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}, key_value, key; + forEach((keyValue || "").split('&'), function(keyValue) { + if (keyValue) { + key_value = keyValue.replace(/\+/g,'%20').split('='); + key = tryDecodeURIComponent(key_value[0]); + if (isDefined(key)) { + var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; + if (!hasOwnProperty.call(obj, key)) { + obj[key] = val; + } else if (isArray(obj[key])) { + obj[key].push(val); + } else { + obj[key] = [obj[key],val]; + } + } + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } else { + parts.push(encodeUriQuery(key, true) + + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%3B/gi, ';'). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + +var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; + +function getNgAttribute(element, ngAttr) { + var attr, i, ii = ngAttrPrefixes.length; + for (i = 0; i < ii; ++i) { + attr = ngAttrPrefixes[i] + ngAttr; + if (isString(attr = element.getAttribute(attr))) { + return attr; + } + } + return null; +} + +/** + * @ngdoc directive + * @name ngApp + * @module ng + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be + * created in "strict-di" mode. This means that the application will fail to invoke functions which + * do not use explicit function annotation (and are thus unsuitable for minification), as described + * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in + * tracking down the root of these bugs. + * + * @description + * + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive + * designates the **root element** of the application and is typically placed near the root element + * of the page - e.g. on the `` or `` tags. + * + * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` + * found in the document will be used to define the root element to auto-bootstrap as an + * application. To run multiple applications in an HTML document you must manually bootstrap them using + * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. + * + * You can specify an **AngularJS module** to be used as the root module for the application. This + * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It + * should contain the application code needed or have dependencies on other modules that will + * contain the code. See {@link angular.module} for more information. + * + * In the example below if the `ngApp` directive were not placed on the `html` element then the + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` + * would not be resolved to `3`. + * + * `ngApp` is the easiest, and most common way to bootstrap an application. + * + + +
      + I can add: {{a}} + {{b}} = {{ a+b }} +
      +
      + + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }); + +
      + * + * Using `ngStrictDi`, you would see something like this: + * + + +
      +
      + I can add: {{a}} + {{b}} = {{ a+b }} + +

      This renders because the controller does not fail to + instantiate, by using explicit annotation style (see + script.js for details) +

      +
      + +
      + Name:
      + Hello, {{name}}! + +

      This renders because the controller does not fail to + instantiate, by using explicit annotation style + (see script.js for details) +

      +
      + +
      + I can add: {{a}} + {{b}} = {{ a+b }} + +

      The controller could not be instantiated, due to relying + on automatic function annotations (which are disabled in + strict mode). As such, the content of this section is not + interpolated, and there should be an error in your web console. +

      +
      +
      +
      + + angular.module('ngAppStrictDemo', []) + // BadController will fail to instantiate, due to relying on automatic function annotation, + // rather than an explicit annotation + .controller('BadController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }) + // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, + // due to using explicit annotations using the array style and $inject property, respectively. + .controller('GoodController1', ['$scope', function($scope) { + $scope.a = 1; + $scope.b = 2; + }]) + .controller('GoodController2', GoodController2); + function GoodController2($scope) { + $scope.name = "World"; + } + GoodController2.$inject = ['$scope']; + + + div[ng-controller] { + margin-bottom: 1em; + -webkit-border-radius: 4px; + border-radius: 4px; + border: 1px solid; + padding: .5em; + } + div[ng-controller^=Good] { + border-color: #d6e9c6; + background-color: #dff0d8; + color: #3c763d; + } + div[ng-controller^=Bad] { + border-color: #ebccd1; + background-color: #f2dede; + color: #a94442; + margin-bottom: 0; + } + +
      + */ +function angularInit(element, bootstrap) { + var appElement, + module, + config = {}; + + // The element `element` has priority over any other element + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + + if (!appElement && element.hasAttribute && element.hasAttribute(name)) { + appElement = element; + module = element.getAttribute(name); + } + }); + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + var candidate; + + if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { + appElement = candidate; + module = candidate.getAttribute(name); + } + }); + if (appElement) { + config.strictDi = getNgAttribute(appElement, "strict-di") !== null; + bootstrap(appElement, module ? [module] : [], config); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @module ng + * @description + * Use this function to manually start up angular application. + * + * See: {@link guide/bootstrap Bootstrap} + * + * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link ng.directive:ngApp ngApp}. + * + * Angular will detect if it has been loaded into the browser more than once and only allow the + * first loaded script to be bootstrapped and will report a warning to the browser console for + * each of the subsequent scripts. This prevents strange results in applications, where otherwise + * multiple instances of Angular try to work on the DOM. + * + * ```html + * + * + * + *
      + * {{greeting}} + *
      + * + * + * + * + * + * ``` + * + * @param {DOMElement} element DOM element which is the root of angular application. + * @param {Array=} modules an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a `config` block. + * See: {@link angular.module modules} + * @param {Object=} config an object for defining configuration options for the application. The + * following keys are supported: + * + * * `strictDi` - disable automatic function annotation for the application. This is meant to + * assist in finding bugs which break minified code. Defaults to `false`. + * + * @returns {auto.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules, config) { + if (!isObject(config)) config = {}; + var defaultConfig = { + strictDi: false + }; + config = extend(defaultConfig, config); + var doBootstrap = function() { + element = jqLite(element); + + if (element.injector()) { + var tag = (element[0] === document) ? 'document' : startingTag(element); + //Encode angle brackets to prevent input from being sanitized to empty string #8683 + throw ngMinErr( + 'btstrpd', + "App Already Bootstrapped with this Element '{0}'", + tag.replace(//,'>')); + } + + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + + if (config.debugInfoEnabled) { + // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. + modules.push(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }]); + } + + modules.unshift('ng'); + var injector = createInjector(modules, config.strictDi); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', + function bootstrapApply(scope, element, compile, injector) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + }] + ); + return injector; + }; + + var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { + config.debugInfoEnabled = true; + window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); + } + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return doBootstrap(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + return doBootstrap(); + }; + + if (isFunction(angular.resumeDeferredBootstrap)) { + angular.resumeDeferredBootstrap(); + } +} + +/** + * @ngdoc function + * @name angular.reloadWithDebugInfo + * @module ng + * @description + * Use this function to reload the current application with debug information turned on. + * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. + * + * See {@link ng.$compileProvider#debugInfoEnabled} for more. + */ +function reloadWithDebugInfo() { + window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; + window.location.reload(); +} + +/** + * @name angular.getTestability + * @module ng + * @description + * Get the testability service for the instance of Angular on the given + * element. + * @param {DOMElement} element DOM element which is the root of angular application. + */ +function getTestability(rootElement) { + var injector = angular.element(rootElement).injector(); + if (!injector) { + throw ngMinErr('test', + 'no injector found for element argument to getTestability'); + } + return injector.get('$$testability'); +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator) { + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +var bindJQueryFired = false; +var skipDestroyOnNextJQueryCleanData; +function bindJQuery() { + var originalCleanData; + + if (bindJQueryFired) { + return; + } + + // bind to jQuery if present; + var jqName = jq(); + jQuery = window.jQuery; // use default jQuery. + if (isDefined(jqName)) { // `ngJq` present + jQuery = jqName === null ? undefined : window[jqName]; // if empty; use jqLite. if not empty, use jQuery specified by `ngJq`. + } + + // Use jQuery if it exists with proper functionality, otherwise default to us. + // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. + // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older + // versions. It will not work for sure with jQuery <1.7, though. + if (jQuery && jQuery.fn.on) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + isolateScope: JQLitePrototype.isolateScope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + + // All nodes removed from the DOM via various jQuery APIs like .remove() + // are passed through jQuery.cleanData. Monkey-patch this method to fire + // the $destroy event on all removed nodes. + originalCleanData = jQuery.cleanData; + jQuery.cleanData = function(elems) { + var events; + if (!skipDestroyOnNextJQueryCleanData) { + for (var i = 0, elem; (elem = elems[i]) != null; i++) { + events = jQuery._data(elem, "events"); + if (events && events.$destroy) { + jQuery(elem).triggerHandler('$destroy'); + } + } + } else { + skipDestroyOnNextJQueryCleanData = false; + } + originalCleanData(elems); + }; + } else { + jqLite = JQLite; + } + + angular.element = jqLite; + + // Prevent double-proxying. + bindJQueryFired = true; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * throw error if the name given is hasOwnProperty + * @param {String} name the name to test + * @param {String} context the context in which the name is used, such as module or directive + */ +function assertNotHasOwnProperty(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); + } +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {String} path path to traverse + * @param {boolean} [bindFnToScope=true] + * @returns {Object} value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +/** + * Return the DOM siblings between the first and last node in the given array. + * @param {Array} array like object + * @returns {jqLite} jqLite collection containing the nodes + */ +function getBlockNodes(nodes) { + // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original + // collection, otherwise update the original collection. + var node = nodes[0]; + var endNode = nodes[nodes.length - 1]; + var blockNodes = [node]; + + do { + node = node.nextSibling; + if (!node) break; + blockNodes.push(node); + } while (node !== endNode); + + return jqLite(blockNodes); +} + + +/** + * Creates a new object without a prototype. This object is useful for lookup without having to + * guard against prototypically inherited properties via hasOwnProperty. + * + * Related micro-benchmarks: + * - http://jsperf.com/object-create2 + * - http://jsperf.com/proto-map-lookup/2 + * - http://jsperf.com/for-in-vs-object-keys2 + * + * @returns {Object} + */ +function createMap() { + return Object.create(null); +} + +var NODE_TYPE_ELEMENT = 1; +var NODE_TYPE_ATTRIBUTE = 2; +var NODE_TYPE_TEXT = 3; +var NODE_TYPE_COMMENT = 8; +var NODE_TYPE_DOCUMENT = 9; +var NODE_TYPE_DOCUMENT_FRAGMENT = 11; + +/** + * @ngdoc type + * @name angular.Module + * @module ng + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + var $injectorMinErr = minErr('$injector'); + var ngMinErr = minErr('ng'); + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + var angular = ensure(window, 'angular', Object); + + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap + angular.$$minErr = angular.$$minErr || minErr; + + return ensure(angular, 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @module ng + * @description + * + * The `angular.module` is a global place for creating, registering and retrieving Angular + * modules. + * All modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * When passed two or more arguments, a new module is created. If passed only one argument, an + * existing module (the name passed as the first argument to `module`) is retrieved. + * + * + * # Module + * + * A module is a collection of services, directives, controllers, filters, and configuration information. + * `angular.module` is used to configure the {@link auto.$injector $injector}. + * + * ```js + * // Create a new module + * var myModule = angular.module('myModule', []); + * + * // register a new service + * myModule.value('appName', 'MyCoolApp'); + * + * // configure existing services inside initialization blocks. + * myModule.config(['$locationProvider', function($locationProvider) { + * // Configure existing providers + * $locationProvider.hashPrefix('!'); + * }]); + * ``` + * + * Then you can create an injector and load your modules like this: + * + * ```js + * var injector = angular.injector(['ng', 'myModule']) + * ``` + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {!Array.=} requires If specified then new module is being created. If + * unspecified then the module is being retrieved for further configuration. + * @param {Function=} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + var assertNotHasOwnProperty = function(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); + } + }; + + assertNotHasOwnProperty(name, 'module'); + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + + "the module name or forgot to load it. If registering a module ensure that you " + + "specify the dependencies as the second argument.", name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var configBlocks = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke', 'push', configBlocks); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _configBlocks: configBlocks, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @module ng + * + * @description + * Holds the list of modules which the injector will load before the current module is + * loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @module ng + * + * @description + * Name of the module. + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @module ng + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the + * service. + * @description + * See {@link auto.$provide#provider $provide.provider()}. + */ + provider: invokeLaterAndSetModuleName('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @module ng + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link auto.$provide#factory $provide.factory()}. + */ + factory: invokeLaterAndSetModuleName('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @module ng + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link auto.$provide#service $provide.service()}. + */ + service: invokeLaterAndSetModuleName('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @module ng + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link auto.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @module ng + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constant are fixed, they get applied before other provide methods. + * See {@link auto.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#decorator + * @module ng + * @param {string} The name of the service to decorate. + * @param {Function} This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. + * @description + * See {@link auto.$provide#decorator $provide.decorator()}. + */ + decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @module ng + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an + * animation. + * @description + * + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. + * + * + * Defines an animation hook that can be later used with + * {@link $animate $animate} service and directives that use this service. + * + * ```js + * module.animation('.animation-name', function($inject1, $inject2) { + * return { + * eventName : function(element, done) { + * //code to run the animation + * //once complete, then run done() + * return function cancellationFunction(element) { + * //code to cancel the animation + * } + * } + * } + * }) + * ``` + * + * See {@link ng.$animateProvider#register $animateProvider.register()} and + * {@link ngAnimate ngAnimate module} for more information. + */ + animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @module ng + * @param {string} name Filter name - this must be a valid angular expression identifier + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + * + *
      + * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
      + */ + filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @module ng + * @param {string|Object} name Controller name, or an object map of controllers where the + * keys are the names and the values are the constructors. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @module ng + * @param {string|Object} name Directive name, or an object map of directives where the + * keys are the names and the values are the factories. + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#config + * @module ng + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + * For more about how to configure services, see + * {@link providers#provider-recipe Provider Recipe}. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @module ng + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod, queue) { + if (!queue) queue = invokeQueue; + return function() { + queue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + }; + } + + /** + * @param {string} provider + * @param {string} method + * @returns {angular.Module} + */ + function invokeLaterAndSetModuleName(provider, method) { + return function(recipeName, factoryFunction) { + if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; + invokeQueue.push([provider, method, arguments]); + return moduleInstance; + }; + } + }); + }; + }); + +} + +/* global: toDebugString: true */ + +function serializeObject(obj) { + var seen = []; + + return JSON.stringify(obj, function(key, val) { + val = toJsonReplacer(key, val); + if (isObject(val)) { + + if (seen.indexOf(val) >= 0) return '<>'; + + seen.push(val); + } + return val; + }); +} + +function toDebugString(obj) { + if (typeof obj === 'function') { + return obj.toString().replace(/ \{[\s\S]*$/, ''); + } else if (typeof obj === 'undefined') { + return 'undefined'; + } else if (typeof obj !== 'string') { + return serializeObject(obj); + } + return obj; +} + +/* global angularModule: true, + version: true, + + $LocaleProvider, + $CompileProvider, + + htmlAnchorDirective, + inputDirective, + inputDirective, + formDirective, + scriptDirective, + selectDirective, + styleDirective, + optionDirective, + ngBindDirective, + ngBindHtmlDirective, + ngBindTemplateDirective, + ngClassDirective, + ngClassEvenDirective, + ngClassOddDirective, + ngCspDirective, + ngCloakDirective, + ngControllerDirective, + ngFormDirective, + ngHideDirective, + ngIfDirective, + ngIncludeDirective, + ngIncludeFillContentDirective, + ngInitDirective, + ngNonBindableDirective, + ngPluralizeDirective, + ngRepeatDirective, + ngShowDirective, + ngStyleDirective, + ngSwitchDirective, + ngSwitchWhenDirective, + ngSwitchDefaultDirective, + ngOptionsDirective, + ngTranscludeDirective, + ngModelDirective, + ngListDirective, + ngChangeDirective, + patternDirective, + patternDirective, + requiredDirective, + requiredDirective, + minlengthDirective, + minlengthDirective, + maxlengthDirective, + maxlengthDirective, + ngValueDirective, + ngModelOptionsDirective, + ngAttributeAliasDirectives, + ngEventDirectives, + + $AnchorScrollProvider, + $AnimateProvider, + $$CoreAnimateQueueProvider, + $$CoreAnimateRunnerProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $DocumentProvider, + $ExceptionHandlerProvider, + $FilterProvider, + $InterpolateProvider, + $IntervalProvider, + $$HashMapProvider, + $HttpProvider, + $HttpParamSerializerProvider, + $HttpParamSerializerJQLikeProvider, + $HttpBackendProvider, + $LocationProvider, + $LogProvider, + $ParseProvider, + $RootScopeProvider, + $QProvider, + $$QProvider, + $$SanitizeUriProvider, + $SceProvider, + $SceDelegateProvider, + $SnifferProvider, + $TemplateCacheProvider, + $TemplateRequestProvider, + $$TestabilityProvider, + $TimeoutProvider, + $$RAFProvider, + $WindowProvider, + $$jqLiteProvider, + $$CookieReaderProvider +*/ + + +/** + * @ngdoc object + * @name angular.version + * @module ng + * @description + * An object that contains information about the current AngularJS version. This object has the + * following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.4.3', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 4, + dot: 3, + codeName: 'foam-acceleration' +}; + + +function publishExternalAPI(angular) { + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'merge': merge, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop': noop, + 'bind': bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity': identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {counter: 0}, + 'getTestability': getTestability, + '$$minErr': minErr, + '$$csp': csp, + 'reloadWithDebugInfo': reloadWithDebugInfo + }); + + angularModule = setupModuleLoader(window); + try { + angularModule('ngLocale'); + } catch (e) { + angularModule('ngLocale', []).provider('$locale', $LocaleProvider); + } + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. + $provide.provider({ + $$sanitizeUri: $$SanitizeUriProvider + }); + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + option: optionDirective, + ngBind: ngBindDirective, + ngBindHtml: ngBindHtmlDirective, + ngBindTemplate: ngBindTemplateDirective, + ngClass: ngClassDirective, + ngClassEven: ngClassEvenDirective, + ngClassOdd: ngClassOddDirective, + ngCloak: ngCloakDirective, + ngController: ngControllerDirective, + ngForm: ngFormDirective, + ngHide: ngHideDirective, + ngIf: ngIfDirective, + ngInclude: ngIncludeDirective, + ngInit: ngInitDirective, + ngNonBindable: ngNonBindableDirective, + ngPluralize: ngPluralizeDirective, + ngRepeat: ngRepeatDirective, + ngShow: ngShowDirective, + ngStyle: ngStyleDirective, + ngSwitch: ngSwitchDirective, + ngSwitchWhen: ngSwitchWhenDirective, + ngSwitchDefault: ngSwitchDefaultDirective, + ngOptions: ngOptionsDirective, + ngTransclude: ngTranscludeDirective, + ngModel: ngModelDirective, + ngList: ngListDirective, + ngChange: ngChangeDirective, + pattern: patternDirective, + ngPattern: patternDirective, + required: requiredDirective, + ngRequired: requiredDirective, + minlength: minlengthDirective, + ngMinlength: minlengthDirective, + maxlength: maxlengthDirective, + ngMaxlength: maxlengthDirective, + ngValue: ngValueDirective, + ngModelOptions: ngModelOptionsDirective + }). + directive({ + ngInclude: ngIncludeFillContentDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animate: $AnimateProvider, + $$animateQueue: $$CoreAnimateQueueProvider, + $$AnimateRunner: $$CoreAnimateRunnerProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $interpolate: $InterpolateProvider, + $interval: $IntervalProvider, + $http: $HttpProvider, + $httpParamSerializer: $HttpParamSerializerProvider, + $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, + $httpBackend: $HttpBackendProvider, + $location: $LocationProvider, + $log: $LogProvider, + $parse: $ParseProvider, + $rootScope: $RootScopeProvider, + $q: $QProvider, + $$q: $$QProvider, + $sce: $SceProvider, + $sceDelegate: $SceDelegateProvider, + $sniffer: $SnifferProvider, + $templateCache: $TemplateCacheProvider, + $templateRequest: $TemplateRequestProvider, + $$testability: $$TestabilityProvider, + $timeout: $TimeoutProvider, + $window: $WindowProvider, + $$rAF: $$RAFProvider, + $$jqLite: $$jqLiteProvider, + $$HashMap: $$HashMapProvider, + $$cookieReader: $$CookieReaderProvider + }); + } + ]); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* global JQLitePrototype: true, + addEventListenerFn: true, + removeEventListenerFn: true, + BOOLEAN_ATTR: true, + ALIASED_ATTR: true, +*/ + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @module ng + * @kind function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * + * If jQuery is available, `angular.element` is an alias for the + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." + * + *
      jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most + * commonly needed functionality with the goal of having a very small footprint.
      + * + * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. + * + *
      **Note:** all element references in Angular are always wrapped with jQuery or + * jqLite; they are never raw DOM references.
      + * + * ## Angular's jqLite + * jqLite provides only the following jQuery methods: + * + * - [`addClass()`](http://api.jquery.com/addClass/) + * - [`after()`](http://api.jquery.com/after/) + * - [`append()`](http://api.jquery.com/append/) + * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters + * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors + * - [`clone()`](http://api.jquery.com/clone/) + * - [`contents()`](http://api.jquery.com/contents/) + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. As a setter, does not convert numbers to strings or append 'px'. + * - [`data()`](http://api.jquery.com/data/) + * - [`detach()`](http://api.jquery.com/detach/) + * - [`empty()`](http://api.jquery.com/empty/) + * - [`eq()`](http://api.jquery.com/eq/) + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [`hasClass()`](http://api.jquery.com/hasClass/) + * - [`html()`](http://api.jquery.com/html/) + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors + * - [`prepend()`](http://api.jquery.com/prepend/) + * - [`prop()`](http://api.jquery.com/prop/) + * - [`ready()`](http://api.jquery.com/ready/) + * - [`remove()`](http://api.jquery.com/remove/) + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) + * - [`removeClass()`](http://api.jquery.com/removeClass/) + * - [`removeData()`](http://api.jquery.com/removeData/) + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) + * - [`text()`](http://api.jquery.com/text/) + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. + * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces + * - [`val()`](http://api.jquery.com/val/) + * - [`wrap()`](http://api.jquery.com/wrap/) + * + * ## jQuery/jqLite Extras + * Angular also provides the following additional methods and events to both jQuery and jqLite: + * + * ### Events + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM + * element before it is removed. + * + * ### Methods + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current + * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to + * be enabled. + * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the + * current element. This getter should be used only on elements that contain a directive which starts a new isolate + * scope. Calling `scope()` on this element always returns the original non-isolate scope. + * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +JQLite.expando = 'ng339'; + +var jqCache = JQLite.cache = {}, + jqId = 1, + addEventListenerFn = function(element, type, fn) { + element.addEventListener(type, fn, false); + }, + removeEventListenerFn = function(element, type, fn) { + element.removeEventListener(type, fn, false); + }; + +/* + * !!! This is an undocumented "private" function !!! + */ +JQLite._data = function(node) { + //jQuery always returns an object on cache miss + return this.cache[node[this.expando]] || {}; +}; + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; +var jqLiteMinErr = minErr('jqLite'); + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; +var HTML_REGEXP = /<|&#?\w+;/; +var TAG_NAME_REGEXP = /<([\w:]+)/; +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi; + +var wrapMap = { + 'option': [1, ''], + + 'thead': [1, '', '
      '], + 'col': [2, '', '
      '], + 'tr': [2, '', '
      '], + 'td': [3, '', '
      '], + '_default': [0, "", ""] +}; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function jqLiteIsTextNode(html) { + return !HTML_REGEXP.test(html); +} + +function jqLiteAcceptsData(node) { + // The window object can accept data but has no nodeType + // Otherwise we are only interested in elements (1) and documents (9) + var nodeType = node.nodeType; + return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; +} + +function jqLiteHasData(node) { + for (var key in jqCache[node.ng339]) { + return true; + } + return false; +} + +function jqLiteBuildFragment(html, context) { + var tmp, tag, wrap, + fragment = context.createDocumentFragment(), + nodes = [], i; + + if (jqLiteIsTextNode(html)) { + // Convert non-html into a text node + nodes.push(context.createTextNode(html)); + } else { + // Convert html into DOM nodes + tmp = tmp || fragment.appendChild(context.createElement("div")); + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + + // Descend through wrappers to the right content + i = wrap[0]; + while (i--) { + tmp = tmp.lastChild; + } + + nodes = concat(nodes, tmp.childNodes); + + tmp = fragment.firstChild; + tmp.textContent = ""; + } + + // Remove wrapper from fragment + fragment.textContent = ""; + fragment.innerHTML = ""; // Clear inner HTML + forEach(nodes, function(node) { + fragment.appendChild(node); + }); + + return fragment; +} + +function jqLiteParseHTML(html, context) { + context = context || document; + var parsed; + + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { + return [context.createElement(parsed[1])]; + } + + if ((parsed = jqLiteBuildFragment(html, context))) { + return parsed.childNodes; + } + + return []; +} + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + + var argIsString; + + if (isString(element)) { + element = trim(element); + argIsString = true; + } + if (!(this instanceof JQLite)) { + if (argIsString && element.charAt(0) != '<') { + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); + } + return new JQLite(element); + } + + if (argIsString) { + jqLiteAddNodes(this, jqLiteParseHTML(element)); + } else { + jqLiteAddNodes(this, element); + } +} + +function jqLiteClone(element) { + return element.cloneNode(true); +} + +function jqLiteDealoc(element, onlyDescendants) { + if (!onlyDescendants) jqLiteRemoveData(element); + + if (element.querySelectorAll) { + var descendants = element.querySelectorAll('*'); + for (var i = 0, l = descendants.length; i < l; i++) { + jqLiteRemoveData(descendants[i]); + } + } +} + +function jqLiteOff(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); + + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var handle = expandoStore && expandoStore.handle; + + if (!handle) return; //no listeners registered + + if (!type) { + for (type in events) { + if (type !== '$destroy') { + removeEventListenerFn(element, type, handle); + } + delete events[type]; + } + } else { + forEach(type.split(' '), function(type) { + if (isDefined(fn)) { + var listenerFns = events[type]; + arrayRemove(listenerFns || [], fn); + if (listenerFns && listenerFns.length > 0) { + return; + } + } + + removeEventListenerFn(element, type, handle); + delete events[type]; + }); + } +} + +function jqLiteRemoveData(element, name) { + var expandoId = element.ng339; + var expandoStore = expandoId && jqCache[expandoId]; + + if (expandoStore) { + if (name) { + delete expandoStore.data[name]; + return; + } + + if (expandoStore.handle) { + if (expandoStore.events.$destroy) { + expandoStore.handle({}, '$destroy'); + } + jqLiteOff(element); + } + delete jqCache[expandoId]; + element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it + } +} + + +function jqLiteExpandoStore(element, createIfNecessary) { + var expandoId = element.ng339, + expandoStore = expandoId && jqCache[expandoId]; + + if (createIfNecessary && !expandoStore) { + element.ng339 = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; + } + + return expandoStore; +} + + +function jqLiteData(element, key, value) { + if (jqLiteAcceptsData(element)) { + + var isSimpleSetter = isDefined(value); + var isSimpleGetter = !isSimpleSetter && key && !isObject(key); + var massGetter = !key; + var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); + var data = expandoStore && expandoStore.data; + + if (isSimpleSetter) { // data('key', value) + data[key] = value; + } else { + if (massGetter) { // data() + return data; + } else { + if (isSimpleGetter) { // data('key') + // don't force creation of expandoStore if it doesn't exist yet + return data && data[key]; + } else { // mass-setter: data({key1: val1, key2: val2}) + extend(data, key); + } + } + } + } +} + +function jqLiteHasClass(element, selector) { + if (!element.getAttribute) return false; + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). + indexOf(" " + selector + " ") > -1); +} + +function jqLiteRemoveClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + forEach(cssClasses.split(' '), function(cssClass) { + element.setAttribute('class', trim( + (" " + (element.getAttribute('class') || '') + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ")) + ); + }); + } +} + +function jqLiteAddClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, " "); + + forEach(cssClasses.split(' '), function(cssClass) { + cssClass = trim(cssClass); + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { + existingClasses += cssClass + ' '; + } + }); + + element.setAttribute('class', trim(existingClasses)); + } +} + + +function jqLiteAddNodes(root, elements) { + // THIS CODE IS VERY HOT. Don't make changes without benchmarking. + + if (elements) { + + // if a Node (the most common case) + if (elements.nodeType) { + root[root.length++] = elements; + } else { + var length = elements.length; + + // if an Array or NodeList and not a Window + if (typeof length === 'number' && elements.window !== elements) { + if (length) { + for (var i = 0; i < length; i++) { + root[root.length++] = elements[i]; + } + } + } else { + root[root.length++] = elements; + } + } + } +} + + +function jqLiteController(element, name) { + return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); +} + +function jqLiteInheritedData(element, name, value) { + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if (element.nodeType == NODE_TYPE_DOCUMENT) { + element = element.documentElement; + } + var names = isArray(name) ? name : [name]; + + while (element) { + for (var i = 0, ii = names.length; i < ii; i++) { + if ((value = jqLite.data(element, names[i])) !== undefined) return value; + } + + // If dealing with a document fragment node with a host element, and no parent, use the host + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM + // to lookup parent controllers. + element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); + } +} + +function jqLiteEmpty(element) { + jqLiteDealoc(element, true); + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +function jqLiteRemove(element, keepData) { + if (!keepData) jqLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); +} + + +function jqLiteDocumentLoaded(action, win) { + win = win || window; + if (win.document.readyState === 'complete') { + // Force the action to be run async for consistent behaviour + // from the action's point of view + // i.e. it will definitely not be in a $apply + win.setTimeout(action); + } else { + // No need to unbind this handler as load is only ever called once + jqLite(win).on('load', action); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded + if (document.readyState === 'complete') { + setTimeout(trigger); + } else { + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + } + }, + toString: function() { + var value = []; + forEach(this, function(e) { value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[value] = true; +}); +var ALIASED_ATTR = { + 'ngMinlength': 'minlength', + 'ngMaxlength': 'maxlength', + 'ngMin': 'min', + 'ngMax': 'max', + 'ngPattern': 'pattern' +}; + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; +} + +function getAliasedAttrName(element, name) { + var nodeName = element.nodeName; + return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name]; +} + +forEach({ + data: jqLiteData, + removeData: jqLiteRemoveData, + hasData: jqLiteHasData +}, function(fn, name) { + JQLite[name] = fn; +}); + +forEach({ + data: jqLiteData, + inheritedData: jqLiteInheritedData, + + scope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); + }, + + isolateScope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); + }, + + controller: jqLiteController, + + injector: function(element) { + return jqLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element, name) { + element.removeAttribute(name); + }, + + hasClass: jqLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + return element.style[name]; + } + }, + + attr: function(element, name, value) { + var nodeType = element.nodeType; + if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { + return; + } + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name) || noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: (function() { + getText.$dv = ''; + return getText; + + function getText(element, value) { + if (isUndefined(value)) { + var nodeType = element.nodeType; + return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; + } + element.textContent = value; + } + })(), + + val: function(element, value) { + if (isUndefined(value)) { + if (element.multiple && nodeName_(element) === 'select') { + var result = []; + forEach(element.options, function(option) { + if (option.selected) { + result.push(option.value || option.text); + } + }); + return result.length === 0 ? null : result; + } + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + jqLiteDealoc(element, true); + element.innerHTML = value; + }, + + empty: jqLiteEmpty +}, function(fn, name) { + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + var nodeCount = this.length; + + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + // jqLiteEmpty takes no arguments but is a setter. + if (fn !== jqLiteEmpty && + (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for (i = 0; i < nodeCount; i++) { + if (fn === jqLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + // TODO: do we still need this? + var value = fn.$dv; + // Only if we have $dv do we iterate over all, otherwise it is just the first element. + var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount; + for (var j = 0; j < jj; j++) { + var nodeValue = fn(this[j], arg1, arg2); + value = value ? value + nodeValue : nodeValue; + } + return value; + } + } else { + // we are a write, so apply to all children + for (i = 0; i < nodeCount; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function(event, type) { + // jQuery specific api + event.isDefaultPrevented = function() { + return event.defaultPrevented; + }; + + var eventFns = events[type || event.type]; + var eventFnsLength = eventFns ? eventFns.length : 0; + + if (!eventFnsLength) return; + + if (isUndefined(event.immediatePropagationStopped)) { + var originalStopImmediatePropagation = event.stopImmediatePropagation; + event.stopImmediatePropagation = function() { + event.immediatePropagationStopped = true; + + if (event.stopPropagation) { + event.stopPropagation(); + } + + if (originalStopImmediatePropagation) { + originalStopImmediatePropagation.call(event); + } + }; + } + + event.isImmediatePropagationStopped = function() { + return event.immediatePropagationStopped === true; + }; + + // Copy event handlers in case event handlers array is modified during execution. + if ((eventFnsLength > 1)) { + eventFns = shallowCopy(eventFns); + } + + for (var i = 0; i < eventFnsLength; i++) { + if (!event.isImmediatePropagationStopped()) { + eventFns[i].call(element, event); + } + } + }; + + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all + // events on `element` + eventHandler.elem = element; + return eventHandler; +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: jqLiteRemoveData, + + on: function jqLiteOn(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); + + // Do not add event handlers to non-elements because they will not be cleaned up. + if (!jqLiteAcceptsData(element)) { + return; + } + + var expandoStore = jqLiteExpandoStore(element, true); + var events = expandoStore.events; + var handle = expandoStore.handle; + + if (!handle) { + handle = expandoStore.handle = createEventHandler(element, events); + } + + // http://jsperf.com/string-indexof-vs-split + var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; + var i = types.length; + + while (i--) { + type = types[i]; + var eventFns = events[type]; + + if (!eventFns) { + events[type] = []; + + if (type === 'mouseenter' || type === 'mouseleave') { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + + jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { + var target = this, related = event.relatedTarget; + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !target.contains(related))) { + handle(event, type); + } + }); + + } else { + if (type !== '$destroy') { + addEventListenerFn(element, type, handle); + } + } + eventFns = events[type]; + } + eventFns.push(fn); + } + }, + + off: jqLiteOff, + + one: function(element, type, fn) { + element = jqLite(element); + + //add the listener twice so that when it is called + //you can remove the original function and still be + //able to call element.off(ev, fn) normally + element.on(type, function onFn() { + element.off(type, fn); + element.off(type, onFn); + }); + element.on(type, fn); + }, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + jqLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node) { + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + children.push(element); + } + }); + return children; + }, + + contents: function(element) { + return element.contentDocument || element.childNodes || []; + }, + + append: function(element, node) { + var nodeType = element.nodeType; + if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; + + node = new JQLite(node); + + for (var i = 0, ii = node.length; i < ii; i++) { + var child = node[i]; + element.appendChild(child); + } + }, + + prepend: function(element, node) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + var index = element.firstChild; + forEach(new JQLite(node), function(child) { + element.insertBefore(child, index); + }); + } + }, + + wrap: function(element, wrapNode) { + wrapNode = jqLite(wrapNode).eq(0).clone()[0]; + var parent = element.parentNode; + if (parent) { + parent.replaceChild(wrapNode, element); + } + wrapNode.appendChild(element); + }, + + remove: jqLiteRemove, + + detach: function(element) { + jqLiteRemove(element, true); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + newElement = new JQLite(newElement); + + for (var i = 0, ii = newElement.length; i < ii; i++) { + var node = newElement[i]; + parent.insertBefore(node, index.nextSibling); + index = node; + } + }, + + addClass: jqLiteAddClass, + removeClass: jqLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (selector) { + forEach(selector.split(' '), function(className) { + var classCondition = condition; + if (isUndefined(classCondition)) { + classCondition = !jqLiteHasClass(element, className); + } + (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); + }); + } + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; + }, + + next: function(element) { + return element.nextElementSibling; + }, + + find: function(element, selector) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(selector); + } else { + return []; + } + }, + + clone: jqLiteClone, + + triggerHandler: function(element, event, extraParameters) { + + var dummyEvent, eventFnsCopy, handlerArgs; + var eventName = event.type || event; + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var eventFns = events && events[eventName]; + + if (eventFns) { + // Create a dummy event to pass to the handlers + dummyEvent = { + preventDefault: function() { this.defaultPrevented = true; }, + isDefaultPrevented: function() { return this.defaultPrevented === true; }, + stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, + isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, + stopPropagation: noop, + type: eventName, + target: element + }; + + // If a custom event was provided then extend our dummy event with it + if (event.type) { + dummyEvent = extend(dummyEvent, event); + } + + // Copy event handlers in case event handlers array is modified during execution. + eventFnsCopy = shallowCopy(eventFns); + handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; + + forEach(eventFnsCopy, function(fn) { + if (!dummyEvent.isImmediatePropagationStopped()) { + fn.apply(element, handlerArgs); + } + }); + } + } +}, function(fn, name) { + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2, arg3) { + var value; + + for (var i = 0, ii = this.length; i < ii; i++) { + if (isUndefined(value)) { + value = fn(this[i], arg1, arg2, arg3); + if (isDefined(value)) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); + } + } + return isDefined(value) ? value : this; + }; + + // bind legacy bind/unbind to on/off + JQLite.prototype.bind = JQLite.prototype.on; + JQLite.prototype.unbind = JQLite.prototype.off; +}); + + +// Provider for private $$jqLite service +function $$jqLiteProvider() { + this.$get = function $$jqLite() { + return extend(JQLite, { + hasClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteHasClass(node, classes); + }, + addClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteAddClass(node, classes); + }, + removeClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteRemoveClass(node, classes); + } + }); + }; +} + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj, nextUidFn) { + var key = obj && obj.$$hashKey; + + if (key) { + if (typeof key === 'function') { + key = obj.$$hashKey(); + } + return key; + } + + var objType = typeof obj; + if (objType == 'function' || (objType == 'object' && obj !== null)) { + key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); + } else { + key = objType + ':' + obj; + } + + return key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array, isolatedUid) { + if (isolatedUid) { + var uid = 0; + this.nextUid = function() { + return ++uid; + }; + } + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key, this.nextUid)] = value; + }, + + /** + * @param key + * @returns {Object} the value for the key + */ + get: function(key) { + return this[hashKey(key, this.nextUid)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key, this.nextUid)]; + delete this[key]; + return value; + } +}; + +var $$HashMapProvider = [function() { + this.$get = [function() { + return HashMap; + }]; +}]; + +/** + * @ngdoc function + * @module ng + * @name angular.injector + * @kind function + * + * @description + * Creates an injector object that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which + * disallows argument name annotation inference. + * @returns {injector} Injector object. See {@link auto.$injector $injector}. + * + * @example + * Typical usage + * ```js + * // create an injector + * var $injector = angular.injector(['ng']); + * + * // use the injector to kick off your application + * // use the type inference to auto inject arguments, or use implicit injection + * $injector.invoke(function($rootScope, $compile, $document) { + * $compile($document)($rootScope); + * $rootScope.$digest(); + * }); + * ``` + * + * Sometimes you want to get access to the injector of a currently running Angular app + * from outside Angular. Perhaps, you want to inject and compile some markup after the + * application has been bootstrapped. You can do this using the extra `injector()` added + * to JQuery/jqLite elements. See {@link angular.element}. + * + * *This is fairly rare but could be the case if a third party library is injecting the + * markup.* + * + * In the following example a new block of HTML containing a `ng-controller` + * directive is added to the end of the document body by JQuery. We then compile and link + * it into the current AngularJS scope. + * + * ```js + * var $div = $('
      {{content.label}}
      '); + * $(document.body).append($div); + * + * angular.element(document).injector().invoke(function($compile) { + * var scope = angular.element($div).scope(); + * $compile($div)(scope); + * }); + * ``` + */ + + +/** + * @ngdoc module + * @name auto + * @description + * + * Implicit module which gets automatically added to each {@link auto.$injector $injector}. + */ + +var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +var $injectorMinErr = minErr('$injector'); + +function anonFn(fn) { + // For anonymous functions, showing at the very least the function signature can help in + // debugging. + var fnText = fn.toString().replace(STRIP_COMMENTS, ''), + args = fnText.match(FN_ARGS); + if (args) { + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; + } + return 'fn'; +} + +function annotate(fn, strictDi, name) { + var $inject, + fnText, + argDecl, + last; + + if (typeof fn === 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + if (fn.length) { + if (strictDi) { + if (!isString(name) || !name) { + name = fn.name || anonFn(fn); + } + throw $injectorMinErr('strictdi', + '{0} is not using explicit annotation and cannot be invoked in strict mode', name); + } + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { + arg.replace(FN_ARG, function(all, underscore, name) { + $inject.push(name); + }); + }); + } + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc service + * @name $injector + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link auto.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + * ```js + * var $injector = angular.injector(); + * expect($injector.get('$injector')).toBe($injector); + * expect($injector.invoke(function($injector) { + * return $injector; + * })).toBe($injector); + * ``` + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + * ```js + * // inferred (only works if code not minified/obfuscated) + * $injector.invoke(function(serviceA){}); + * + * // annotated + * function explicit(serviceA) {}; + * explicit.$inject = ['serviceA']; + * $injector.invoke(explicit); + * + * // inline + * $injector.invoke(['serviceA', function(serviceA){}]); + * ``` + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition + * can then be parsed and the function arguments can be extracted. This method of discovering + * annotations is disallowed when the injector is in strict mode. + * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the + * argument names. + * + * ## `$inject` Annotation + * By adding an `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name $injector#get + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @param {string=} caller An optional string to provide the origin of the function call for error messages. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name $injector#invoke + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {Function|Array.} fn The injectable function to invoke. Function parameters are + * injected according to the {@link guide/di $inject Annotation} rules. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name $injector#has + * + * @description + * Allows the user to query if the particular service exists. + * + * @param {string} name Name of the service to query. + * @returns {boolean} `true` if injector has given service. + */ + +/** + * @ngdoc method + * @name $injector#instantiate + * @description + * Create a new instance of JS type. The method takes a constructor function, invokes the new + * operator, and supplies all of the arguments to the constructor function as specified by the + * constructor annotation. + * + * @param {Function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name $injector#annotate + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is + * used by the injector to determine which services need to be injected into the function when the + * function is invoked. There are three ways in which the function can be annotated with the needed + * dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done + * by converting the function into a string using `toString()` method and extracting the argument + * names. + * ```js + * // Given + * function MyController($scope, $route) { + * // ... + * } + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * You can disallow this method by using strict injection mode. + * + * This method does not work with code minification / obfuscation. For this reason the following + * annotation strategies are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings + * represent names of services to be injected into the function. + * ```js + * // Given + * var MyController = function(obfuscatedScope, obfuscatedRoute) { + * // ... + * } + * // Define function dependencies + * MyController['$inject'] = ['$scope', '$route']; + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property + * is very inconvenient. In these situations using the array notation to specify the dependencies in + * a way that survives minification is a better choice: + * + * ```js + * // We wish to write this (not minification / obfuscation safe) + * injector.invoke(function($compile, $rootScope) { + * // ... + * }); + * + * // We are forced to write break inlining + * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { + * // ... + * }; + * tmpFn.$inject = ['$compile', '$rootScope']; + * injector.invoke(tmpFn); + * + * // To better support inline function the inline annotation is supported + * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { + * // ... + * }]); + * + * // Therefore + * expect(injector.annotate( + * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) + * ).toEqual(['$compile', '$rootScope']); + * ``` + * + * @param {Function|Array.} fn Function for which dependent service names need to + * be retrieved as described above. + * + * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc service + * @name $provide + * + * @description + * + * The {@link auto.$provide $provide} service has a number of methods for registering components + * with the {@link auto.$injector $injector}. Many of these functions are also exposed on + * {@link angular.Module}. + * + * An Angular **service** is a singleton object created by a **service factory**. These **service + * factories** are functions which, in turn, are created by a **service provider**. + * The **service providers** are constructor functions. When instantiated they must contain a + * property called `$get`, which holds the **service factory** function. + * + * When you request a service, the {@link auto.$injector $injector} is responsible for finding the + * correct **service provider**, instantiating it and then calling its `$get` **service factory** + * function to get the instance of the **service**. + * + * Often services have no configuration options and there is no need to add methods to the service + * provider. The provider will be no more than a constructor function with a `$get` property. For + * these cases the {@link auto.$provide $provide} service has additional helper methods to register + * services without specifying a provider. + * + * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the + * {@link auto.$injector $injector} + * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by + * providers and services. + * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by + * services, not providers. + * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, + * that will be wrapped in a **service provider** object, whose `$get` property will contain the + * given factory function. + * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate + * a new object using the given constructor function. + * + * See the individual methods for more information and examples. + */ + +/** + * @ngdoc method + * @name $provide#provider + * @description + * + * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions + * are constructor functions, whose instances are responsible for "providing" a factory for a + * service. + * + * Service provider names start with the name of the service they provide followed by `Provider`. + * For example, the {@link ng.$log $log} service has a provider called + * {@link ng.$logProvider $logProvider}. + * + * Service provider objects can have additional methods which allow configuration of the provider + * and its service. Importantly, you can configure what kind of service is created by the `$get` + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a + * method {@link ng.$logProvider#debugEnabled debugEnabled} + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the + * console or not. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. + * - `Constructor`: a new instance of the provider will be created using + * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. + * + * @returns {Object} registered provider instance + + * @example + * + * The following example shows how to create a simple event tracking service and register it using + * {@link auto.$provide#provider $provide.provider()}. + * + * ```js + * // Define the eventTracker provider + * function EventTrackerProvider() { + * var trackingUrl = '/track'; + * + * // A provider method for configuring where the tracked events should been saved + * this.setTrackingUrl = function(url) { + * trackingUrl = url; + * }; + * + * // The service factory function + * this.$get = ['$http', function($http) { + * var trackedEvents = {}; + * return { + * // Call this to track an event + * event: function(event) { + * var count = trackedEvents[event] || 0; + * count += 1; + * trackedEvents[event] = count; + * return count; + * }, + * // Call this to save the tracked events to the trackingUrl + * save: function() { + * $http.post(trackingUrl, trackedEvents); + * } + * }; + * }]; + * } + * + * describe('eventTracker', function() { + * var postSpy; + * + * beforeEach(module(function($provide) { + * // Register the eventTracker provider + * $provide.provider('eventTracker', EventTrackerProvider); + * })); + * + * beforeEach(module(function(eventTrackerProvider) { + * // Configure eventTracker provider + * eventTrackerProvider.setTrackingUrl('/custom-track'); + * })); + * + * it('tracks events', inject(function(eventTracker) { + * expect(eventTracker.event('login')).toEqual(1); + * expect(eventTracker.event('login')).toEqual(2); + * })); + * + * it('saves to the tracking url', inject(function(eventTracker, $http) { + * postSpy = spyOn($http, 'post'); + * eventTracker.event('login'); + * eventTracker.save(); + * expect(postSpy).toHaveBeenCalled(); + * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); + * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); + * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); + * })); + * }); + * ``` + */ + +/** + * @ngdoc method + * @name $provide#factory + * @description + * + * Register a **service factory**, which will be called to return the service instance. + * This is short for registering a service where its provider consists of only a `$get` property, + * which is the given service factory function. + * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to + * configure your service in a provider. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. + * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service + * ```js + * $provide.factory('ping', ['$http', function($http) { + * return function ping() { + * return $http.send('/ping'); + * }; + * }]); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#service + * @description + * + * Register a **service constructor**, which will be invoked with `new` to create the service + * instance. + * This is short for registering a service where its provider's `$get` property is the service + * constructor function that will be used to instantiate the service instance. + * + * You should use {@link auto.$provide#service $provide.service(class)} if you define your service + * as a type/class. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} constructor An injectable class (constructor function) + * that will be instantiated. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service using + * {@link auto.$provide#service $provide.service(class)}. + * ```js + * var Ping = function($http) { + * this.$http = $http; + * }; + * + * Ping.$inject = ['$http']; + * + * Ping.prototype.send = function() { + * return this.$http.get('/ping'); + * }; + * $provide.service('ping', Ping); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping.send(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#value + * @description + * + * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a + * number, an array, an object or a function. This is short for registering a service where its + * provider's `$get` property is a factory function that takes no arguments and returns the **value + * service**. + * + * Value services are similar to constant services, except that they cannot be injected into a + * module configuration function (see {@link angular.Module#config}) but they can be overridden by + * an Angular + * {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + * + * @example + * Here are some examples of creating value services. + * ```js + * $provide.value('ADMIN_USER', 'admin'); + * + * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); + * + * $provide.value('halfOf', function(value) { + * return value / 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#constant + * @description + * + * Register a **constant service**, such as a string, a number, an array, an object or a function, + * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot + * be overridden by an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + * + * @example + * Here a some examples of creating constants: + * ```js + * $provide.constant('SHARD_HEIGHT', 306); + * + * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); + * + * $provide.constant('double', function(value) { + * return value * 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#decorator + * @description + * + * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator + * intercepts the creation of a service, allowing it to override or modify the behaviour of the + * service. The object returned by the decorator may be the original service, or a new service + * object which replaces or wraps and delegates to the original service. + * + * @param {string} name The name of the service to decorate. + * @param {Function|Array.} decorator This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. The function is called using + * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. + * Local injection arguments: + * + * * `$delegate` - The original service instance, which can be monkey patched, configured, + * decorated or delegated to. + * + * @example + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting + * calls to {@link ng.$log#error $log.warn()}. + * ```js + * $provide.decorator('$log', ['$delegate', function($delegate) { + * $delegate.warn = $delegate.error; + * return $delegate; + * }]); + * ``` + */ + + +function createInjector(modulesToLoad, strictDi) { + strictDi = (strictDi === true); + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap([], true), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function(serviceName, caller) { + if (angular.isString(caller)) { + path.push(caller); + } + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); + })), + instanceCache = {}, + instanceInjector = (instanceCache.$injector = + createInternalInjector(instanceCache, function(serviceName, caller) { + var provider = providerInjector.get(serviceName + providerSuffix, caller); + return instanceInjector.invoke(provider.$get, provider, undefined, serviceName); + })); + + + forEach(loadModules(modulesToLoad), function(fn) { if (fn) instanceInjector.invoke(fn); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + }; + } + + function provider(name, provider_) { + assertNotHasOwnProperty(name, 'service'); + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); + } + return providerCache[name + providerSuffix] = provider_; + } + + function enforceReturnValue(name, factory) { + return function enforcedReturnValue() { + var result = instanceInjector.invoke(factory, this); + if (isUndefined(result)) { + throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); + } + return result; + }; + } + + function factory(name, factoryFn, enforce) { + return provider(name, { + $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn + }); + } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, val) { return factory(name, valueFn(val), false); } + + function constant(name, value) { + assertNotHasOwnProperty(name, 'constant'); + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad) { + var runBlocks = [], moduleFn; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + + function runInvokeQueue(queue) { + var i, ii; + for (i = 0, ii = queue.length; i < ii; i++) { + var invokeArgs = queue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } + + try { + if (isString(module)) { + moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + runInvokeQueue(moduleFn._invokeQueue); + runInvokeQueue(moduleFn._configBlocks); + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); + } + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; + } + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content + // unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + /* jshint -W022 */ + e = e.message + '\n' + e.stack; + } + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", + module, e.stack || e.message || e); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName, caller) { + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', + serviceName + ' <- ' + path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName, caller); + } catch (err) { + if (cache[serviceName] === INSTANTIATING) { + delete cache[serviceName]; + } + throw err; + } finally { + path.shift(); + } + } + } + + function invoke(fn, self, locals, serviceName) { + if (typeof locals === 'string') { + serviceName = locals; + locals = null; + } + + var args = [], + $inject = createInjector.$$annotate(fn, strictDi, serviceName), + length, i, + key; + + for (i = 0, length = $inject.length; i < length; i++) { + key = $inject[i]; + if (typeof key !== 'string') { + throw $injectorMinErr('itkn', + 'Incorrect injection token! Expected service name as string, got {0}', key); + } + args.push( + locals && locals.hasOwnProperty(key) + ? locals[key] + : getService(key, serviceName) + ); + } + if (isArray(fn)) { + fn = fn[length]; + } + + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, args); + } + + function instantiate(Type, locals, serviceName) { + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + // Object creation: http://jsperf.com/create-constructor/2 + var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null); + var returnedValue = invoke(Type, instance, locals, serviceName); + + return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; + } + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: createInjector.$$annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +createInjector.$$annotate = annotate; + +/** + * @ngdoc provider + * @name $anchorScrollProvider + * + * @description + * Use `$anchorScrollProvider` to disable automatic scrolling whenever + * {@link ng.$location#hash $location.hash()} changes. + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + /** + * @ngdoc method + * @name $anchorScrollProvider#disableAutoScrolling + * + * @description + * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to + * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
      + * Use this method to disable automatic scrolling. + * + * If automatic scrolling is disabled, one must explicitly call + * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the + * current hash. + */ + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + /** + * @ngdoc service + * @name $anchorScroll + * @kind function + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the + * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified + * in the + * [HTML5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). + * + * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to + * match any anchor whenever it changes. This can be disabled by calling + * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. + * + * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a + * vertical scroll-offset (either fixed or dynamic). + * + * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of + * {@link ng.$location#hash $location.hash()} will be used. + * + * @property {(number|function|jqLite)} yOffset + * If set, specifies a vertical scroll-offset. This is often useful when there are fixed + * positioned elements at the top of the page, such as navbars, headers etc. + * + * `yOffset` can be specified in various ways: + * - **number**: A fixed number of pixels to be used as offset.

      + * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return + * a number representing the offset (in pixels).

      + * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from + * the top of the page to the element's bottom will be used as offset.
      + * **Note**: The element will be taken into account only as long as its `position` is set to + * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust + * their height and/or positioning according to the viewport's size. + * + *
      + *
      + * In order for `yOffset` to work properly, scrolling should take place on the document's root and + * not some child element. + *
      + * + * @example + + +
      + Go to bottom + You're at the bottom! +
      +
      + + angular.module('anchorScrollExample', []) + .controller('ScrollController', ['$scope', '$location', '$anchorScroll', + function ($scope, $location, $anchorScroll) { + $scope.gotoBottom = function() { + // set the location.hash to the id of + // the element you wish to scroll to. + $location.hash('bottom'); + + // call $anchorScroll() + $anchorScroll(); + }; + }]); + + + #scrollArea { + height: 280px; + overflow: auto; + } + + #bottom { + display: block; + margin-top: 2000px; + } + +
      + * + *
      + * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). + * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. + * + * @example + + + +
      + Anchor {{x}} of 5 +
      +
      + + angular.module('anchorScrollOffsetExample', []) + .run(['$anchorScroll', function($anchorScroll) { + $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels + }]) + .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', + function ($anchorScroll, $location, $scope) { + $scope.gotoAnchor = function(x) { + var newHash = 'anchor' + x; + if ($location.hash() !== newHash) { + // set the $location.hash to `newHash` and + // $anchorScroll will automatically scroll to it + $location.hash('anchor' + x); + } else { + // call $anchorScroll() explicitly, + // since $location.hash hasn't changed + $anchorScroll(); + } + }; + } + ]); + + + body { + padding-top: 50px; + } + + .anchor { + border: 2px dashed DarkOrchid; + padding: 10px 10px 200px 10px; + } + + .fixed-header { + background-color: rgba(0, 0, 0, 0.2); + height: 50px; + position: fixed; + top: 0; left: 0; right: 0; + } + + .fixed-header > a { + display: inline-block; + margin: 5px 15px; + } + +
      + */ + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // Helper function to get first anchor from a NodeList + // (using `Array#some()` instead of `angular#forEach()` since it's more performant + // and working in all supported browsers.) + function getFirstAnchor(list) { + var result = null; + Array.prototype.some.call(list, function(element) { + if (nodeName_(element) === 'a') { + result = element; + return true; + } + }); + return result; + } + + function getYOffset() { + + var offset = scroll.yOffset; + + if (isFunction(offset)) { + offset = offset(); + } else if (isElement(offset)) { + var elem = offset[0]; + var style = $window.getComputedStyle(elem); + if (style.position !== 'fixed') { + offset = 0; + } else { + offset = elem.getBoundingClientRect().bottom; + } + } else if (!isNumber(offset)) { + offset = 0; + } + + return offset; + } + + function scrollTo(elem) { + if (elem) { + elem.scrollIntoView(); + + var offset = getYOffset(); + + if (offset) { + // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. + // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the + // top of the viewport. + // + // IF the number of pixels from the top of `elem` to the end of the page's content is less + // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some + // way down the page. + // + // This is often the case for elements near the bottom of the page. + // + // In such cases we do not need to scroll the whole `offset` up, just the difference between + // the top of the element and the offset, which is enough to align the top of `elem` at the + // desired position. + var elemTop = elem.getBoundingClientRect().top; + $window.scrollBy(0, elemTop - offset); + } + } else { + $window.scrollTo(0, 0); + } + } + + function scroll(hash) { + hash = isString(hash) ? hash : $location.hash(); + var elm; + + // empty hash, scroll to the top of the page + if (!hash) scrollTo(null); + + // element with given id + else if ((elm = document.getElementById(hash))) scrollTo(elm); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') scrollTo(null); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction(newVal, oldVal) { + // skip the initial scroll if $location.hash is empty + if (newVal === oldVal && newVal === '') return; + + jqLiteDocumentLoaded(function() { + $rootScope.$evalAsync(scroll); + }); + }); + } + + return scroll; + }]; +} + +var $animateMinErr = minErr('$animate'); +var ELEMENT_NODE = 1; +var NG_ANIMATE_CLASSNAME = 'ng-animate'; + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType === ELEMENT_NODE) { + return elm; + } + } +} + +function splitClasses(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + // Use createMap() to prevent class assumptions involving property names in + // Object.prototype + var obj = createMap(); + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; +} + +// if any other type of options value besides an Object value is +// passed into the $animate.method() animation then this helper code +// will be run which will ignore it. While this patch is not the +// greatest solution to this, a lot of existing plugins depend on +// $animate to either call the callback (< 1.2) or return a promise +// that can be changed. This helper function ensures that the options +// are wiped clean incase a callback function is provided. +function prepareAnimateOptions(options) { + return isObject(options) + ? options + : {}; +} + +var $$CoreAnimateRunnerProvider = function() { + this.$get = ['$q', '$$rAF', function($q, $$rAF) { + function AnimateRunner() {} + AnimateRunner.all = noop; + AnimateRunner.chain = noop; + AnimateRunner.prototype = { + end: noop, + cancel: noop, + resume: noop, + pause: noop, + complete: noop, + then: function(pass, fail) { + return $q(function(resolve) { + $$rAF(function() { + resolve(); + }); + }).then(pass, fail); + } + }; + return AnimateRunner; + }]; +}; + +// this is prefixed with Core since it conflicts with +// the animateQueueProvider defined in ngAnimate/animateQueue.js +var $$CoreAnimateQueueProvider = function() { + var postDigestQueue = new HashMap(); + var postDigestElements = []; + + this.$get = ['$$AnimateRunner', '$rootScope', + function($$AnimateRunner, $rootScope) { + return { + enabled: noop, + on: noop, + off: noop, + pin: noop, + + push: function(element, event, options, domOperation) { + domOperation && domOperation(); + + options = options || {}; + options.from && element.css(options.from); + options.to && element.css(options.to); + + if (options.addClass || options.removeClass) { + addRemoveClassesPostDigest(element, options.addClass, options.removeClass); + } + + return new $$AnimateRunner(); // jshint ignore:line + } + }; + + function addRemoveClassesPostDigest(element, add, remove) { + var data = postDigestQueue.get(element); + var classVal; + + if (!data) { + postDigestQueue.put(element, data = {}); + postDigestElements.push(element); + } + + if (add) { + forEach(add.split(' '), function(className) { + if (className) { + data[className] = true; + } + }); + } + + if (remove) { + forEach(remove.split(' '), function(className) { + if (className) { + data[className] = false; + } + }); + } + + if (postDigestElements.length > 1) return; + + $rootScope.$$postDigest(function() { + forEach(postDigestElements, function(element) { + var data = postDigestQueue.get(element); + if (data) { + var existing = splitClasses(element.attr('class')); + var toAdd = ''; + var toRemove = ''; + forEach(data, function(status, className) { + var hasClass = !!existing[className]; + if (status !== hasClass) { + if (status) { + toAdd += (toAdd.length ? ' ' : '') + className; + } else { + toRemove += (toRemove.length ? ' ' : '') + className; + } + } + }); + + forEach(element, function(elm) { + toAdd && jqLiteAddClass(elm, toAdd); + toRemove && jqLiteRemoveClass(elm, toRemove); + }); + postDigestQueue.remove(element); + } + }); + + postDigestElements.length = 0; + }); + } + }]; +}; + +/** + * @ngdoc provider + * @name $animateProvider + * + * @description + * Default implementation of $animate that doesn't perform any animations, instead just + * synchronously performs DOM updates and resolves the returned runner promise. + * + * In order to enable animations the `ngAnimate` module has to be loaded. + * + * To see the functional implementation check out `src/ngAnimate/animate.js`. + */ +var $AnimateProvider = ['$provide', function($provide) { + var provider = this; + + this.$$registeredAnimations = Object.create(null); + + /** + * @ngdoc method + * @name $animateProvider#register + * + * @description + * Registers a new injectable animation factory function. The factory function produces the + * animation object which contains callback functions for each event that is expected to be + * animated. + * + * * `eventFn`: `function(element, ... , doneFunction, options)` + * The element to animate, the `doneFunction` and the options fed into the animation. Depending + * on the type of animation additional arguments will be injected into the animation function. The + * list below explains the function signatures for the different animation methods: + * + * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) + * - addClass: function(element, addedClasses, doneFunction, options) + * - removeClass: function(element, removedClasses, doneFunction, options) + * - enter, leave, move: function(element, doneFunction, options) + * - animate: function(element, fromStyles, toStyles, doneFunction, options) + * + * Make sure to trigger the `doneFunction` once the animation is fully complete. + * + * ```js + * return { + * //enter, leave, move signature + * eventFn : function(element, done, options) { + * //code to run the animation + * //once complete, then run done() + * return function endFunction(wasCancelled) { + * //code to cancel the animation + * } + * } + * } + * ``` + * + * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). + * @param {Function} factory The factory function that will be executed to return the animation + * object. + */ + this.register = function(name, factory) { + if (name && name.charAt(0) !== '.') { + throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); + } + + var key = name + '-animation'; + provider.$$registeredAnimations[name.substr(1)] = key; + $provide.factory(key, factory); + }; + + /** + * @ngdoc method + * @name $animateProvider#classNameFilter + * + * @description + * Sets and/or returns the CSS class regular expression that is checked when performing + * an animation. Upon bootstrap the classNameFilter value is not set at all and will + * therefore enable $animate to attempt to perform an animation on any element that is triggered. + * When setting the `classNameFilter` value, animations will only be performed on elements + * that successfully match the filter expression. This in turn can boost performance + * for low-powered devices as well as applications containing a lot of structural operations. + * @param {RegExp=} expression The className expression which will be checked against all animations + * @return {RegExp} The current CSS className expression value. If null then there is no expression value + */ + this.classNameFilter = function(expression) { + if (arguments.length === 1) { + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; + if (this.$$classNameFilter) { + var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); + if (reservedRegex.test(this.$$classNameFilter.toString())) { + throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); + + } + } + } + return this.$$classNameFilter; + }; + + this.$get = ['$$animateQueue', function($$animateQueue) { + function domInsert(element, parentElement, afterElement) { + // if for some reason the previous element was removed + // from the dom sometime before this code runs then let's + // just stick to using the parent element as the anchor + if (afterElement) { + var afterNode = extractElementNode(afterElement); + if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { + afterElement = null; + } + } + afterElement ? afterElement.after(element) : parentElement.prepend(element); + } + + /** + * @ngdoc service + * @name $animate + * @description The $animate service exposes a series of DOM utility methods that provide support + * for animation hooks. The default behavior is the application of DOM operations, however, + * when an animation is detected (and animations are enabled), $animate will do the heavy lifting + * to ensure that animation runs with the triggered DOM operation. + * + * By default $animate doesn't trigger an animations. This is because the `ngAnimate` module isn't + * included and only when it is active then the animation hooks that `$animate` triggers will be + * functional. Once active then all structural `ng-` directives will trigger animations as they perform + * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, + * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. + * + * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. + * + * To learn more about enabling animation support, click here to visit the + * {@link ngAnimate ngAnimate module page}. + */ + return { + // we don't call it directly since non-existant arguments may + // be interpreted as null within the sub enabled function + + /** + * + * @ngdoc method + * @name $animate#on + * @kind function + * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) + * has fired on the given element or among any of its children. Once the listener is fired, the provided callback + * is fired with the following params: + * + * ```js + * $animate.on('enter', container, + * function callback(element, phase) { + * // cool we detected an enter animation within the container + * } + * ); + * ``` + * + * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself + * as well as among its children + * @param {Function} callback the callback function that will be fired when the listener is triggered + * + * The arguments present in the callback function are: + * * `element` - The captured DOM element that the animation was fired on. + * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). + */ + on: $$animateQueue.on, + + /** + * + * @ngdoc method + * @name $animate#off + * @kind function + * @description Deregisters an event listener based on the event which has been associated with the provided element. This method + * can be used in three different ways depending on the arguments: + * + * ```js + * // remove all the animation event listeners listening for `enter` + * $animate.off('enter'); + * + * // remove all the animation event listeners listening for `enter` on the given element and its children + * $animate.off('enter', container); + * + * // remove the event listener function provided by `listenerFn` that is set + * // to listen for `enter` on the given `element` as well as its children + * $animate.off('enter', container, callback); + * ``` + * + * @param {string} event the animation event (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement=} container the container element the event listener was placed on + * @param {Function=} callback the callback function that was registered as the listener + */ + off: $$animateQueue.off, + + /** + * @ngdoc method + * @name $animate#pin + * @kind function + * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists + * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the + * element despite being outside the realm of the application or within another application. Say for example if the application + * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated + * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind + * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. + * + * Note that this feature is only active when the `ngAnimate` module is used. + * + * @param {DOMElement} element the external element that will be pinned + * @param {DOMElement} parentElement the host parent element that will be associated with the external element + */ + pin: $$animateQueue.pin, + + /** + * + * @ngdoc method + * @name $animate#enabled + * @kind function + * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This + * function can be called in four ways: + * + * ```js + * // returns true or false + * $animate.enabled(); + * + * // changes the enabled state for all animations + * $animate.enabled(false); + * $animate.enabled(true); + * + * // returns true or false if animations are enabled for an element + * $animate.enabled(element); + * + * // changes the enabled state for an element and its children + * $animate.enabled(element, true); + * $animate.enabled(element, false); + * ``` + * + * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state + * @param {boolean=} enabled whether or not the animations will be enabled for the element + * + * @return {boolean} whether or not animations are enabled + */ + enabled: $$animateQueue.enabled, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * @description Cancels the provided animation. + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + */ + cancel: function(runner) { + runner.end && runner.end(); + }, + + /** + * + * @ngdoc method + * @name $animate#enter + * @kind function + * @description Inserts the element into the DOM either after the `after` element (if provided) or + * as the first child within the `parent` element and then triggers an animation. + * A promise is returned that will be resolved during the next digest once the animation + * has completed. + * + * @param {DOMElement} element the element which will be inserted into the DOM + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + enter: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); + }, + + /** + * + * @ngdoc method + * @name $animate#move + * @kind function + * @description Inserts (moves) the element into its new position in the DOM either after + * the `after` element (if provided) or as the first child within the `parent` element + * and then triggers an animation. A promise is returned that will be resolved + * during the next digest once the animation has completed. + * + * @param {DOMElement} element the element which will be moved into the new DOM position + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + move: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * @description Triggers an animation and then removes the element from the DOM. + * When the function is called a promise is returned that will be resolved during the next + * digest once the animation has completed. + * + * @param {DOMElement} element the element which will be removed from the DOM + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { + element.remove(); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * @kind function + * + * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon + * execution, the addClass operation will only be handled after the next digest and it will not trigger an + * animation if element already contains the CSS class or if the class is removed at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addclass, className); + return $$animateQueue.push(element, 'addClass', options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * @kind function + * + * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon + * execution, the removeClass operation will only be handled after the next digest and it will not trigger an + * animation if element does not contain the CSS class or if the class is added at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.removeClass = mergeClasses(options.removeClass, className); + return $$animateQueue.push(element, 'removeClass', options); + }, + + /** + * @ngdoc method + * @name $animate#setClass + * @kind function + * + * @description Performs both the addition and removal of a CSS classes on an element and (during the process) + * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and + * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has + * passed. Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addClass, add); + options.removeClass = mergeClasses(options.removeClass, remove); + return $$animateQueue.push(element, 'setClass', options); + }, + + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided className value then the animation will take + * on the provided styles. For example, if a transition animation is set for the given className then the provided from and + * to styles will be applied alongside the given transition. If a JavaScript animation is detected then the provided styles + * will be given in as function paramters into the `animate` method (or as apart of the `options` parameter). + * + * @param {DOMElement} element the element which the CSS styles will be applied to + * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. + * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. + * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If + * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. + * (Note that if no animation is detected then this value will not be appplied to the element.) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + options = prepareAnimateOptions(options); + options.from = options.from ? extend(options.from, from) : from; + options.to = options.to ? extend(options.to, to) : to; + + className = className || 'ng-inline-animate'; + options.tempClasses = mergeClasses(options.tempClasses, className); + return $$animateQueue.push(element, 'animate', options); + } + }; + }]; +}]; + +function $$AsyncCallbackProvider() { + this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) { + return $$rAF.supported + ? function(fn) { return $$rAF(fn); } + : function(fn) { + return $timeout(fn, 0, false); + }; + }]; +} + +/* global stripHash: true */ + +/** + * ! This is a private undocumented service ! + * + * @name $browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {object} $log window.console or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + rawDocument = document[0], + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while (outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + function getHash(url) { + var index = url.indexOf('#'); + return index === -1 ? '' : url.substr(index); + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var cachedState, lastHistoryState, + lastBrowserUrl = location.href, + baseElement = document.find('base'), + reloadLocation = null; + + cacheState(); + lastHistoryState = cachedState; + + /** + * @name $browser#url + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record? + * @param {object=} state object to use with pushState/replaceState + */ + self.url = function(url, replace, state) { + // In modern browsers `history.state` is `null` by default; treating it separately + // from `undefined` would cause `$browser.url('/foo')` to change `history.state` + // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. + if (isUndefined(state)) { + state = null; + } + + // Android Browser BFCache causes location, history reference to become stale. + if (location !== window.location) location = window.location; + if (history !== window.history) history = window.history; + + // setter + if (url) { + var sameState = lastHistoryState === state; + + // Don't change anything if previous and current URLs and states match. This also prevents + // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. + // See https://github.com/angular/angular.js/commit/ffb2701 + if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { + return self; + } + var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); + lastBrowserUrl = url; + lastHistoryState = state; + // Don't use history API if only the hash changed + // due to a bug in IE10/IE11 which leads + // to not firing a `hashchange` nor `popstate` event + // in some cases (see #9143). + if ($sniffer.history && (!sameBase || !sameState)) { + history[replace ? 'replaceState' : 'pushState'](state, '', url); + cacheState(); + // Do the assignment again so that those two variables are referentially identical. + lastHistoryState = cachedState; + } else { + if (!sameBase || reloadLocation) { + reloadLocation = url; + } + if (replace) { + location.replace(url); + } else if (!sameBase) { + location.href = url; + } else { + location.hash = getHash(url); + } + } + return self; + // getter + } else { + // - reloadLocation is needed as browsers don't allow to read out + // the new location.href if a reload happened. + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return reloadLocation || location.href.replace(/%27/g,"'"); + } + }; + + /** + * @name $browser#state + * + * @description + * This method is a getter. + * + * Return history.state or null if history.state is undefined. + * + * @returns {object} state + */ + self.state = function() { + return cachedState; + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function cacheStateAndFireUrlChange() { + cacheState(); + fireUrlChange(); + } + + function getCurrentState() { + try { + return history.state; + } catch (e) { + // MSIE can reportedly throw when there is no state (UNCONFIRMED). + } + } + + // This variable should be used *only* inside the cacheState function. + var lastCachedState = null; + function cacheState() { + // This should be the only place in $browser where `history.state` is read. + cachedState = getCurrentState(); + cachedState = isUndefined(cachedState) ? null : cachedState; + + // Prevent callbacks fo fire twice if both hashchange & popstate were fired. + if (equals(cachedState, lastCachedState)) { + cachedState = lastCachedState; + } + lastCachedState = cachedState; + } + + function fireUrlChange() { + if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { + return; + } + + lastBrowserUrl = self.url(); + lastHistoryState = cachedState; + forEach(urlChangeListeners, function(listener) { + listener(self.url(), cachedState); + }); + } + + /** + * @name $browser#onUrlChange + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed from outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + // TODO(vojta): refactor to use node's syntax for events + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); + // hashchange event + jqLite(window).on('hashchange', cacheStateAndFireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + /** + * @private + * Remove popstate and hashchange handler from window. + * + * NOTE: this api is intended for use only by $rootScope. + */ + self.$$applicationDestroyed = function() { + jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); + }; + + /** + * Checks whether the url has changed outside of Angular. + * Needs to be exported to be able to check for changes that have been done in sync, + * as hashchange/popstate events fire in async. + */ + self.$$checkUrlChange = fireUrlChange; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * @name $browser#baseHref + * + * @description + * Returns current + * (always relative - without domain) + * + * @returns {string} The current base href + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; + }; + + /** + * @name $browser#defer + * @param {function()} fn A function, who's execution should be deferred. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name $browser#defer.cancel + * + * @description + * Cancels a deferred task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider() { + this.$get = ['$window', '$log', '$sniffer', '$document', + function($window, $log, $sniffer, $document) { + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc service + * @name $cacheFactory + * + * @description + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to + * them. + * + * ```js + * + * var cache = $cacheFactory('cacheId'); + * expect($cacheFactory.get('cacheId')).toBe(cache); + * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); + * + * cache.put("key", "value"); + * cache.put("another key", "another value"); + * + * // We've specified no options on creation + * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); + * + * ``` + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns + * it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + * @example + + +
      + + + + +

      Cached Values

      +
      + + : + +
      + +

      Cache Info

      +
      + + : + +
      +
      +
      + + angular.module('cacheExampleApp', []). + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { + $scope.keys = []; + $scope.cache = $cacheFactory('cacheId'); + $scope.put = function(key, value) { + if ($scope.cache.get(key) === undefined) { + $scope.keys.push(key); + } + $scope.cache.put(key, value === undefined ? null : value); + }; + }]); + + + p { + margin: 10px 0 3px; + } + +
      + */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = {}, + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = {}, + freshEnd = null, + staleEnd = null; + + /** + * @ngdoc type + * @name $cacheFactory.Cache + * + * @description + * A cache object used to store and retrieve data, primarily used by + * {@link $http $http} and the {@link ng.directive:script script} directive to cache + * templates and other data. + * + * ```js + * angular.module('superCache') + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { + * return $cacheFactory('super-cache'); + * }]); + * ``` + * + * Example test: + * + * ```js + * it('should behave like a cache', inject(function(superCache) { + * superCache.put('key', 'value'); + * superCache.put('another key', 'another value'); + * + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 2 + * }); + * + * superCache.remove('another key'); + * expect(superCache.get('another key')).toBeUndefined(); + * + * superCache.removeAll(); + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 0 + * }); + * })); + * ``` + */ + return caches[cacheId] = { + + /** + * @ngdoc method + * @name $cacheFactory.Cache#put + * @kind function + * + * @description + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be + * retrieved later, and incrementing the size of the cache if the key was not already + * present in the cache. If behaving like an LRU cache, it will also remove stale + * entries from the set. + * + * It will not insert undefined values into the cache. + * + * @param {string} key the key under which the cached data is stored. + * @param {*} value the value to store alongside the key. If it is undefined, the key + * will not be stored. + * @returns {*} the value stored. + */ + put: function(key, value) { + if (isUndefined(value)) return; + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + } + + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + /** + * @ngdoc method + * @name $cacheFactory.Cache#get + * @kind function + * + * @description + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the data to be retrieved + * @returns {*} the value stored. + */ + get: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + } + + return data[key]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#remove + * @kind function + * + * @description + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the entry to be removed + */ + remove: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + } + + delete data[key]; + size--; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @kind function + * + * @description + * Clears the cache object of any entries. + */ + removeAll: function() { + data = {}; + size = 0; + lruHash = {}; + freshEnd = staleEnd = null; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#destroy + * @kind function + * + * @description + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, + * removing it from the {@link $cacheFactory $cacheFactory} set. + */ + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#info + * @kind function + * + * @description + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. + * + * @returns {object} an object with the following properties: + *
        + *
      • **id**: the id of the cache instance
      • + *
      • **size**: the number of entries kept in the cache instance
      • + *
      • **...**: any additional properties from the options object when creating the + * cache.
      • + *
      + */ + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + /** + * @ngdoc method + * @name $cacheFactory#info + * + * @description + * Get information about all the caches that have been created + * + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` + */ + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + /** + * @ngdoc method + * @name $cacheFactory#get + * + * @description + * Get access to a cache object by the `cacheId` used when it was created. + * + * @param {string} cacheId Name or id of a cache to access. + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. + */ + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc service + * @name $templateCache + * + * @description + * The first time a template is used, it is loaded in the template cache for quick retrieval. You + * can load templates directly into the cache in a `script` tag, or by consuming the + * `$templateCache` service directly. + * + * Adding via the `script` tag: + * + * ```html + * + * ``` + * + * **Note:** the `script` tag containing the template does not need to be included in the `head` of + * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, + * element with ng-app attribute), otherwise the template will be ignored. + * + * Adding via the `$templateCache` service: + * + * ```js + * var myApp = angular.module('myApp', []); + * myApp.run(function($templateCache) { + * $templateCache.put('templateId.html', 'This is the content of the template'); + * }); + * ``` + * + * To retrieve the template later, simply use it in your HTML: + * ```html + *
      + * ``` + * + * or get it via Javascript: + * ```js + * $templateCache.get('templateId.html') + * ``` + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +/** + * @ngdoc service + * @name $compile + * @kind function + * + * @description + * Compiles an HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. + * + * The compilation is a process of walking the DOM tree and matching DOM elements to + * {@link ng.$compileProvider#directive directives}. + * + *
      + * **Note:** This document is an in-depth reference of all directive options. + * For a gentle introduction to directives with examples of common use cases, + * see the {@link guide/directive directive guide}. + *
      + * + * ## Comprehensive Directive API + * + * There are many different options for a directive. + * + * The difference resides in the return value of the factory function. + * You can either return a "Directive Definition Object" (see below) that defines the directive properties, + * or just the `postLink` function (all other properties will have the default values). + * + *
      + * **Best Practice:** It's recommended to use the "directive definition object" form. + *
      + * + * Here's an example directive declared with a Directive Definition Object: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * priority: 0, + * template: '
      ', // or // function(tElement, tAttrs) { ... }, + * // or + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * transclude: false, + * restrict: 'A', + * templateNamespace: 'html', + * scope: false, + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * controllerAs: 'stringIdentifier', + * bindToController: false, + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * compile: function compile(tElement, tAttrs, transclude) { + * return { + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * } + * // or + * // return function postLink( ... ) { ... } + * }, + * // or + * // link: { + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // } + * // or + * // link: function postLink( ... ) { ... } + * }; + * return directiveDefinitionObject; + * }); + * ``` + * + *
      + * **Note:** Any unspecified options will use the default value. You can see the default values below. + *
      + * + * Therefore the above can be simplified as: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * link: function postLink(scope, iElement, iAttrs) { ... } + * }; + * return directiveDefinitionObject; + * // or + * // return function postLink(scope, iElement, iAttrs) { ... } + * }); + * ``` + * + * + * + * ### Directive Definition Object + * + * The directive definition object provides instructions to the {@link ng.$compile + * compiler}. The attributes are: + * + * #### `multiElement` + * When this property is set to true, the HTML compiler will collect DOM nodes between + * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them + * together as the directive elements. It is recommended that this feature be used on directives + * which are not strictly behavioural (such as {@link ngClick}), and which + * do not manipulate or replace child nodes (such as {@link ngInclude}). + * + * #### `priority` + * When there are multiple directives defined on a single DOM element, sometimes it + * is necessary to specify the order in which the directives are applied. The `priority` is used + * to sort the directives before their `compile` functions get called. Priority is defined as a + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions + * are also run in priority order, but post-link functions are run in reverse order. The order + * of directives with the same priority is undefined. The default priority is `0`. + * + * #### `terminal` + * If set to true then the current `priority` will be the last set of directives + * which will execute (any directives at the current priority will still execute + * as the order of execution on same `priority` is undefined). Note that expressions + * and other directives used in the directive's template will also be excluded from execution. + * + * #### `scope` + * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the + * same element request a new scope, only one new scope is created. The new scope rule does not + * apply for the root of the template since the root of the template always gets a new scope. + * + * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from + * normal scope in that it does not prototypically inherit from the parent scope. This is useful + * when creating reusable components, which should not accidentally read or modify data in the + * parent scope. + * + * The 'isolate' scope takes an object hash which defines a set of local scope properties + * derived from the parent scope. These local properties are useful for aliasing values for + * templates. Locals definition is a hash of local scope property to its source: + * + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is + * always a string since DOM attributes are strings. If no `attr` name is specified then the + * attribute name is assumed to be the same as the local name. + * Given `` and widget definition + * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect + * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the + * `localName` property on the widget scope. The `name` is read from the parent scope (not + * component scope). + * + * * `=` or `=attr` - set up bi-directional binding between a local scope property and the + * parent scope property of name defined via the value of the `attr` attribute. If no `attr` + * name is specified then the attribute name is assumed to be the same as the local name. + * Given `` and widget definition of + * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the + * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected + * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent + * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You + * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If + * you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use + * `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional). + * + * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. + * If no `attr` name is specified then the attribute name is assumed to be the same as the + * local name. Given `` and widget definition of + * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to + * a function wrapper for the `count = count + value` expression. Often it's desirable to + * pass data from the isolated scope via an expression to the parent scope, this can be + * done by passing a map of local variable names and values into the expression wrapper fn. + * For example, if the expression is `increment(amount)` then we can specify the amount value + * by calling the `localFn` as `localFn({amount: 22})`. + * + * + * #### `bindToController` + * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will + * allow a component to have its properties bound to the controller, rather than to scope. When the controller + * is instantiated, the initial values of the isolate scope bindings are already available. + * + * #### `controller` + * Controller constructor function. The controller is instantiated before the + * pre-linking phase and it is shared with other directives (see + * `require` attribute). This allows the directives to communicate with each other and augment + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: + * + * * `$scope` - Current scope associated with the element + * * `$element` - Current element + * * `$attrs` - Current attributes object for the element + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: + * `function([scope], cloneLinkingFn, futureParentElement)`. + * * `scope`: optional argument to override the scope. + * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content. + * * `futureParentElement`: + * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. + * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. + * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) + * and when the `cloneLinkinFn` is passed, + * as those elements need to created and cloned in a special way when they are defined outside their + * usual containers (e.g. like ``). + * * See also the `directive.templateNamespace` property. + * + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the + * injected argument will be an array in corresponding order. If no such directive can be + * found, or if the directive does not have a controller, then an error is raised (unless no link function + * is specified, in which case error checking is skipped). The name can be prefixed with: + * + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. + * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. + * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. + * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass + * `null` to the `link` fn if not found. + * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass + * `null` to the `link` fn if not found. + * + * + * #### `controllerAs` + * Identifier name for a reference to the controller in the directive's scope. + * This allows the controller to be referenced from the directive template. The directive + * needs to define a scope for this configuration to be used. Useful in the case when + * directive is used as component. + * + * + * #### `restrict` + * String of subset of `EACM` which restricts the directive to a specific directive + * declaration style. If omitted, the defaults (elements and attributes) are used. + * + * * `E` - Element name (default): `` + * * `A` - Attribute (default): `
      ` + * * `C` - Class: `
      ` + * * `M` - Comment: `` + * + * + * #### `templateNamespace` + * String representing the document type used by the markup in the template. + * AngularJS needs this information as those elements need to be created and cloned + * in a special way when they are defined outside their usual containers like `` and ``. + * + * * `html` - All root nodes in the template are HTML. Root nodes may also be + * top-level elements such as `` or ``. + * * `svg` - The root nodes in the template are SVG elements (excluding ``). + * * `math` - The root nodes in the template are MathML elements (excluding ``). + * + * If no `templateNamespace` is specified, then the namespace is considered to be `html`. + * + * #### `template` + * HTML markup that may: + * * Replace the contents of the directive's element (default). + * * Replace the directive's element itself (if `replace` is true - DEPRECATED). + * * Wrap the contents of the directive's element (if `transclude` is true). + * + * Value may be: + * + * * A string. For example `
      {{delete_str}}
      `. + * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` + * function api below) and returns a string value. + * + * + * #### `templateUrl` + * This is similar to `template` but the template is loaded from the specified URL, asynchronously. + * + * Because template loading is asynchronous the compiler will suspend compilation of directives on that element + * for later when the template has been resolved. In the meantime it will continue to compile and link + * sibling and parent elements as though this element had not contained any directives. + * + * The compiler does not suspend the entire compilation to wait for templates to be loaded because this + * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the + * case when only one deeply nested directive has `templateUrl`. + * + * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} + * + * You can specify `templateUrl` as a string representing the URL or as a function which takes two + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns + * a string value representing the url. In either case, the template URL is passed through {@link + * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. + * + * + * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) + * specify what the template should replace. Defaults to `false`. + * + * * `true` - the template will replace the directive's element. + * * `false` - the template will replace the contents of the directive's element. + * + * The replacement process migrates all of the attributes / classes from the old element to the new + * one. See the {@link guide/directive#template-expanding-directive + * Directives Guide} for an example. + * + * There are very few scenarios where element replacement is required for the application function, + * the main one being reusable custom components that are used within SVG contexts + * (because SVG doesn't work with custom elements in the DOM tree). + * + * #### `transclude` + * Extract the contents of the element where the directive appears and make it available to the directive. + * The contents are compiled and provided to the directive as a **transclusion function**. See the + * {@link $compile#transclusion Transclusion} section below. + * + * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the + * directive's element or the entire element: + * + * * `true` - transclude the content (i.e. the child nodes) of the directive's element. + * * `'element'` - transclude the whole of the directive's element including any directives on this + * element that defined at a lower priority than this directive. When used, the `template` + * property is ignored. + * + * + * #### `compile` + * + * ```js + * function compile(tElement, tAttrs, transclude) { ... } + * ``` + * + * The compile function deals with transforming the template DOM. Since most directives do not do + * template transformation, it is not used often. The compile function takes the following arguments: + * + * * `tElement` - template element - The element where the directive has been declared. It is + * safe to do template transformation on the element and child elements only. + * + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared + * between all directive compile functions. + * + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` + * + *
      + * **Note:** The template instance and the link instance may be different objects if the template has + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration + * should be done in a linking function rather than in a compile function. + *
      + + *
      + * **Note:** The compile function cannot handle directives that recursively use themselves in their + * own templates or compile functions. Compiling these directives results in an infinite loop and a + * stack overflow errors. + * + * This can be avoided by manually using $compile in the postLink function to imperatively compile + * a directive's template instead of relying on automatic template compilation via `template` or + * `templateUrl` declaration or manual compilation inside the compile function. + *
      + * + *
      + * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it + * e.g. does not know about the right outer scope. Please use the transclude function that is passed + * to the link function instead. + *
      + + * A compile function can have a return value which can be either a function or an object. + * + * * returning a (post-link) function - is equivalent to registering the linking function via the + * `link` property of the config object when the compile function is empty. + * + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to + * control when a linking function should be called during the linking phase. See info about + * pre-linking and post-linking functions below. + * + * + * #### `link` + * This property is used only if the `compile` property is not defined. + * + * ```js + * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } + * ``` + * + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is + * executed after the template has been cloned. This is where most of the directive logic will be + * put. + * + * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the + * directive for registering {@link ng.$rootScope.Scope#$watch watches}. + * + * * `iElement` - instance element - The element where the directive is to be used. It is safe to + * manipulate the children of the element only in `postLink` function since the children have + * already been linked. + * + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared + * between all directive linking functions. + * + * * `controller` - the directive's required controller instance(s) - Instances are shared + * among all directives, which allows the directives to use the controllers as a communication + * channel. The exact value depends on the directive's `require` property: + * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one + * * `string`: the controller instance + * * `array`: array of controller instances + * + * If a required controller cannot be found, and it is optional, the instance is `null`, + * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. + * + * Note that you can also require the directive's own controller - it will be made available like + * like any other controller. + * + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. + * This is the same as the `$transclude` + * parameter of directive controllers, see there for details. + * `function([scope], cloneLinkingFn, futureParentElement)`. + * + * #### Pre-linking function + * + * Executed before the child elements are linked. Not safe to do DOM transformation since the + * compiler linking function will fail to locate the correct elements for linking. + * + * #### Post-linking function + * + * Executed after the child elements are linked. + * + * Note that child elements that contain `templateUrl` directives will not have been compiled + * and linked since they are waiting for their template to load asynchronously and their own + * compilation and linking has been suspended until that occurs. + * + * It is safe to do DOM transformation in the post-linking function on elements that are not waiting + * for their async templates to be resolved. + * + * + * ### Transclusion + * + * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and + * copying them to another part of the DOM, while maintaining their connection to the original AngularJS + * scope from where they were taken. + * + * Transclusion is used (often with {@link ngTransclude}) to insert the + * original contents of a directive's element into a specified place in the template of the directive. + * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded + * content has access to the properties on the scope from which it was taken, even if the directive + * has isolated scope. + * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. + * + * This makes it possible for the widget to have private state for its template, while the transcluded + * content has access to its originating scope. + * + *
      + * **Note:** When testing an element transclude directive you must not place the directive at the root of the + * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives + * Testing Transclusion Directives}. + *
      + * + * #### Transclusion Functions + * + * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion + * function** to the directive's `link` function and `controller`. This transclusion function is a special + * **linking function** that will return the compiled contents linked to a new transclusion scope. + * + *
      + * If you are just using {@link ngTransclude} then you don't need to worry about this function, since + * ngTransclude will deal with it for us. + *
      + * + * If you want to manually control the insertion and removal of the transcluded content in your directive + * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery + * object that contains the compiled DOM, which is linked to the correct transclusion scope. + * + * When you call a transclusion function you can pass in a **clone attach function**. This function accepts + * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded + * content and the `scope` is the newly created transclusion scope, to which the clone is bound. + * + *
      + * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function + * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. + *
      + * + * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone + * attach function**: + * + * ```js + * var transcludedContent, transclusionScope; + * + * $transclude(function(clone, scope) { + * element.append(clone); + * transcludedContent = clone; + * transclusionScope = scope; + * }); + * ``` + * + * Later, if you want to remove the transcluded content from your DOM then you should also destroy the + * associated transclusion scope: + * + * ```js + * transcludedContent.remove(); + * transclusionScope.$destroy(); + * ``` + * + *
      + * **Best Practice**: if you intend to add and remove transcluded content manually in your directive + * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), + * then you are also responsible for calling `$destroy` on the transclusion scope. + *
      + * + * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} + * automatically destroy their transluded clones as necessary so you do not need to worry about this if + * you are simply using {@link ngTransclude} to inject the transclusion into your directive. + * + * + * #### Transclusion Scopes + * + * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion + * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed + * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it + * was taken. + * + * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look + * like this: + * + * ```html + *
      + *
      + *
      + *
      + *
      + *
      + * ``` + * + * The `$parent` scope hierarchy will look like this: + * + * ``` + * - $rootScope + * - isolate + * - transclusion + * ``` + * + * but the scopes will inherit prototypically from different scopes to their `$parent`. + * + * ``` + * - $rootScope + * - transclusion + * - isolate + * ``` + * + * + * ### Attributes + * + * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the + * `link()` or `compile()` functions. It has a variety of uses. + * + * accessing *Normalized attribute names:* + * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. + * the attributes object allows for normalized access to + * the attributes. + * + * * *Directive inter-communication:* All directives share the same instance of the attributes + * object which allows the directives to use the attributes object as inter directive + * communication. + * + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object + * allowing other directives to read the interpolated value. + * + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also + * the only way to easily get the actual value because during the linking phase the interpolation + * hasn't been evaluated yet and so the value is at this time set to `undefined`. + * + * ```js + * function linkingFn(scope, elm, attrs, ctrl) { + * // get the attribute value + * console.log(attrs.ngModel); + * + * // change the attribute + * attrs.$set('ngModel', 'new value'); + * + * // observe changes to interpolated attribute + * attrs.$observe('ngModel', function(value) { + * console.log('ngModel has changed value to ' + value); + * }); + * } + * ``` + * + * ## Example + * + *
      + * **Note**: Typically directives are registered with `module.directive`. The example below is + * to illustrate how `$compile` works. + *
      + * + + + +
      +
      +
      +
      +
      +
      + + it('should auto compile', function() { + var textarea = $('textarea'); + var output = $('div[compile]'); + // The initial state reads 'Hello Angular'. + expect(output.getText()).toBe('Hello Angular'); + textarea.clear(); + textarea.sendKeys('{{name}}!'); + expect(output.getText()).toBe('Angular!'); + }); + +
      + + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. + * + *
      + * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it + * e.g. will not use the right outer scope. Please pass the transclude function as a + * `parentBoundTranscludeFn` to the link function instead. + *
      + * + * @param {number} maxPriority only apply directives lower than given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
      `cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * * `options` - An optional object hash with linking options. If `options` is provided, then the following + * keys may be used to control linking behavior: + * + * * `parentBoundTranscludeFn` - the transclude function made available to + * directives; if given, it will be passed through to the link functions of + * directives found in `element` during compilation. + * * `transcludeControllers` - an object hash with keys that map controller names + * to controller instances; if given, it will make the controllers + * available to directives. + * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add + * the cloned elements; only needed for transcludes that are allowed to contain non html + * elements (e.g. SVG elements). See also the directive.controller property. + * + * Calling the linking function returns the element of the template. It is either the original + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + * ```js + * var element = $compile('

      {{total}}

      ')(scope); + * ``` + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + * ```js + * var templateElement = angular.element('

      {{total}}

      '), + * scope = ....; + * + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clonedElement` + * ``` + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc provider + * @name $compileProvider + * + * @description + */ +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, + ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), + REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; + + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes + // The assumption is that future DOM event attribute names will begin with + // 'on' and be composed of only English letters. + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; + + function parseIsolateBindings(scope, directiveName, isController) { + var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/; + + var bindings = {}; + + forEach(scope, function(definition, scopeName) { + var match = definition.match(LOCAL_REGEXP); + + if (!match) { + throw $compileMinErr('iscp', + "Invalid {3} for directive '{0}'." + + " Definition: {... {1}: '{2}' ...}", + directiveName, scopeName, definition, + (isController ? "controller bindings definition" : + "isolate scope definition")); + } + + bindings[scopeName] = { + mode: match[1][0], + collection: match[2] === '*', + optional: match[3] === '?', + attrName: match[4] || scopeName + }; + }); + + return bindings; + } + + function parseDirectiveBindings(directive, directiveName) { + var bindings = { + isolateScope: null, + bindToController: null + }; + if (isObject(directive.scope)) { + if (directive.bindToController === true) { + bindings.bindToController = parseIsolateBindings(directive.scope, + directiveName, true); + bindings.isolateScope = {}; + } else { + bindings.isolateScope = parseIsolateBindings(directive.scope, + directiveName, false); + } + } + if (isObject(directive.bindToController)) { + bindings.bindToController = + parseIsolateBindings(directive.bindToController, directiveName, true); + } + if (isObject(bindings.bindToController)) { + var controller = directive.controller; + var controllerAs = directive.controllerAs; + if (!controller) { + // There is no controller, there may or may not be a controllerAs property + throw $compileMinErr('noctrl', + "Cannot bind to controller without directive '{0}'s controller.", + directiveName); + } else if (!identifierForController(controller, controllerAs)) { + // There is a controller, but no identifier or controllerAs property + throw $compileMinErr('noident', + "Cannot bind to controller without identifier for directive '{0}'.", + directiveName); + } + } + return bindings; + } + + function assertValidDirectiveName(name) { + var letter = name.charAt(0); + if (!letter || letter !== lowercase(letter)) { + throw $compileMinErr('baddir', "Directive name '{0}' is invalid. The first character must be a lowercase letter", name); + } + if (name !== name.trim()) { + throw $compileMinErr('baddir', + "Directive name '{0}' is invalid. The name should not contain leading or trailing whitespaces", + name); + } + } + + /** + * @ngdoc method + * @name $compileProvider#directive + * @kind function + * + * @description + * Register a new directive with the compiler. + * + * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which + * will match as ng-bind), or an object map of directives where the keys are the + * names and the values are the factories. + * @param {Function|Array} directiveFactory An injectable directive factory function. See + * {@link guide/directive} for more info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + assertNotHasOwnProperty(name, 'directive'); + if (isString(name)) { + assertValidDirectiveName(name); + assertArg(directiveFactory, 'directiveFactory'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory, index) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.index = index; + directive.name = directive.name || name; + directive.require = directive.require || (directive.controller && directive.name); + directive.restrict = directive.restrict || 'EA'; + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; + } + directive.$$moduleName = directiveFactory.$$moduleName; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + + /** + * @ngdoc method + * @name $compileProvider#aHrefSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at preventing XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); + } + }; + + + /** + * @ngdoc method + * @name $compileProvider#imgSrcSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); + } + }; + + /** + * @ngdoc method + * @name $compileProvider#debugInfoEnabled + * + * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the + * current debugInfoEnabled state + * @returns {*} current value if used as getter or itself (chaining) if used as setter + * + * @kind function + * + * @description + * Call this method to enable/disable various debug runtime information in the compiler such as adding + * binding information and a reference to the current scope on to DOM elements. + * If enabled, the compiler will add the following to DOM elements that have been bound to the scope + * * `ng-binding` CSS class + * * `$binding` data property containing an array of the binding expressions + * + * You may want to disable this in production for a significant performance boost. See + * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. + * + * The default value is true. + */ + var debugInfoEnabled = true; + this.debugInfoEnabled = function(enabled) { + if (isDefined(enabled)) { + debugInfoEnabled = enabled; + return this; + } + return debugInfoEnabled; + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', + '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, + $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { + + var Attributes = function(element, attributesToCopy) { + if (attributesToCopy) { + var keys = Object.keys(attributesToCopy); + var i, l, key; + + for (i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + this[key] = attributesToCopy[key]; + } + } else { + this.$attr = {}; + } + + this.$$element = element; + }; + + Attributes.prototype = { + /** + * @ngdoc method + * @name $compile.directive.Attributes#$normalize + * @kind function + * + * @description + * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or + * `data-`) to its normalized, camelCase form. + * + * Also there is special case for Moz prefix starting with upper case letter. + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * @param {string} name Name to normalize + */ + $normalize: directiveNormalize, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$addClass + * @kind function + * + * @description + * Adds the CSS class value specified by the classVal parameter to the element. If animations + * are enabled then an animation will be triggered for the class addition. + * + * @param {string} classVal The className value that will be added to the element + */ + $addClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.addClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$removeClass + * @kind function + * + * @description + * Removes the CSS class value specified by the classVal parameter from the element. If + * animations are enabled then an animation will be triggered for the class removal. + * + * @param {string} classVal The className value that will be removed from the element + */ + $removeClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.removeClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$updateClass + * @kind function + * + * @description + * Adds and removes the appropriate CSS class values to the element based on the difference + * between the new and old CSS class values (specified as newClasses and oldClasses). + * + * @param {string} newClasses The current CSS className value + * @param {string} oldClasses The former CSS className value + */ + $updateClass: function(newClasses, oldClasses) { + var toAdd = tokenDifference(newClasses, oldClasses); + if (toAdd && toAdd.length) { + $animate.addClass(this.$$element, toAdd); + } + + var toRemove = tokenDifference(oldClasses, newClasses); + if (toRemove && toRemove.length) { + $animate.removeClass(this.$$element, toRemove); + } + }, + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + // TODO: decide whether or not to throw an error if "class" + //is set through this function since it may cause $updateClass to + //become unstable. + + var node = this.$$element[0], + booleanKey = getBooleanAttrName(node, key), + aliasedKey = getAliasedAttrName(node, key), + observer = key, + nodeName; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } else if (aliasedKey) { + this[aliasedKey] = value; + observer = aliasedKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + nodeName = nodeName_(this.$$element); + + if ((nodeName === 'a' && key === 'href') || + (nodeName === 'img' && key === 'src')) { + // sanitize a[href] and img[src] values + this[key] = value = $$sanitizeUri(value, key === 'src'); + } else if (nodeName === 'img' && key === 'srcset') { + // sanitize img[srcset] values + var result = ""; + + // first check if there are spaces because it's not the same pattern + var trimmedSrcset = trim(value); + // ( 999x ,| 999w ,| ,|, ) + var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; + var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; + + // split srcset into tuple of uri and descriptor except for the last item + var rawUris = trimmedSrcset.split(pattern); + + // for each tuples + var nbrUrisWith2parts = Math.floor(rawUris.length / 2); + for (var i = 0; i < nbrUrisWith2parts; i++) { + var innerIdx = i * 2; + // sanitize the uri + result += $$sanitizeUri(trim(rawUris[innerIdx]), true); + // add the descriptor + result += (" " + trim(rawUris[innerIdx + 1])); + } + + // split the last item into uri and descriptor + var lastTuple = trim(rawUris[i * 2]).split(/\s/); + + // sanitize the last uri + result += $$sanitizeUri(trim(lastTuple[0]), true); + + // and add the last descriptor if any + if (lastTuple.length === 2) { + result += (" " + trim(lastTuple[1])); + } + this[key] = value = result; + } + + if (writeAttr !== false) { + if (value === null || value === undefined) { + this.$$element.removeAttr(attrName); + } else { + this.$$element.attr(attrName, value); + } + } + + // fire observers + var $$observers = this.$$observers; + $$observers && forEach($$observers[observer], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$observe + * @kind function + * + * @description + * Observes an interpolated attribute. + * + * The observer function will be invoked once during the next `$digest` following + * compilation. The observer is then invoked whenever the interpolated value + * changes. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(interpolatedValue)} fn Function that will be called whenever + the interpolated value of the attribute changes. + * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info. + * @returns {function()} Returns a deregistration function for this observer. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter && attrs.hasOwnProperty(key)) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + + return function() { + arrayRemove(listeners, fn); + }; + } + }; + + + function safeAddClass($element, className) { + try { + $element.addClass(className); + } catch (e) { + // ignore, since it means that we are trying to set class on + // SVG element, where class name is read-only. + } + } + + + var startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + + compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { + var bindings = $element.data('$binding') || []; + + if (isArray(binding)) { + bindings = bindings.concat(binding); + } else { + bindings.push(binding); + } + + $element.data('$binding', bindings); + } : noop; + + compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { + safeAddClass($element, 'ng-binding'); + } : noop; + + compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { + var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; + $element.data(dataName, scope); + } : noop; + + compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { + safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); + } : noop; + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, + previousCompileContext) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can + // modify it. + $compileNodes = jqLite($compileNodes); + } + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + forEach($compileNodes, function(node, index) { + if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) { + $compileNodes[index] = jqLite(node).wrap('').parent()[0]; + } + }); + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + compile.$$addScopeClass($compileNodes); + var namespace = null; + return function publicLinkFn(scope, cloneConnectFn, options) { + assertArg(scope, 'scope'); + + options = options || {}; + var parentBoundTranscludeFn = options.parentBoundTranscludeFn, + transcludeControllers = options.transcludeControllers, + futureParentElement = options.futureParentElement; + + // When `parentBoundTranscludeFn` is passed, it is a + // `controllersBoundTransclude` function (it was previously passed + // as `transclude` to directive.link) so we must unwrap it to get + // its `boundTranscludeFn` + if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { + parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; + } + + if (!namespace) { + namespace = detectNamespaceForChildElements(futureParentElement); + } + var $linkNode; + if (namespace !== 'html') { + // When using a directive with replace:true and templateUrl the $compileNodes + // (or a child element inside of them) + // might change, so we need to recreate the namespace adapted compileNodes + // for call to the link function. + // Note: This will already clone the nodes... + $linkNode = jqLite( + wrapTemplate(namespace, jqLite('
      ').append($compileNodes).html()) + ); + } else if (cloneConnectFn) { + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + $linkNode = JQLitePrototype.clone.call($compileNodes); + } else { + $linkNode = $compileNodes; + } + + if (transcludeControllers) { + for (var controllerName in transcludeControllers) { + $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); + } + } + + compile.$$addScopeInfo($linkNode, scope); + + if (cloneConnectFn) cloneConnectFn($linkNode, scope); + if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); + return $linkNode; + }; + } + + function detectNamespaceForChildElements(parentElement) { + // TODO: Make this detect MathML as well... + var node = parentElement && parentElement[0]; + if (!node) { + return 'html'; + } else { + return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html'; + } + } + + /** + * Compile function matches each node in nodeList against the directives. Once all directives + * for a particular node are collected their compile functions are executed. The compile + * functions return values - the linking functions - are combined into a composite linking + * function, which is the a linking function for the node. + * + * @param {NodeList} nodeList an array of nodes or NodeList to compile + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new child of the transcluded parent scope. + * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then + * the rootElement must be set the jqLite collection of the compile root. This is + * needed so that the jqLite collection items can be replaced with widgets. + * @param {number=} maxPriority Max directive priority. + * @returns {Function} A composite linking function of all of the matched directives or null. + */ + function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, + previousCompileContext) { + var linkFns = [], + attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; + + for (var i = 0; i < nodeList.length; i++) { + attrs = new Attributes(); + + // we must always refer to nodeList[i] since the nodes can be replaced underneath us. + directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, + ignoreDirective); + + nodeLinkFn = (directives.length) + ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, + null, [], [], previousCompileContext) + : null; + + if (nodeLinkFn && nodeLinkFn.scope) { + compile.$$addScopeClass(attrs.$$element); + } + + childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || + !(childNodes = nodeList[i].childNodes) || + !childNodes.length) + ? null + : compileNodes(childNodes, + nodeLinkFn ? ( + (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) + && nodeLinkFn.transclude) : transcludeFn); + + if (nodeLinkFn || childLinkFn) { + linkFns.push(i, nodeLinkFn, childLinkFn); + linkFnFound = true; + nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; + } + + //use the previous context only for the first element in the virtual group + previousCompileContext = null; + } + + // return a linking function if we have found anything, null otherwise + return linkFnFound ? compositeLinkFn : null; + + function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { + var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; + var stableNodeList; + + + if (nodeLinkFnFound) { + // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our + // offsets don't get screwed up + var nodeListLength = nodeList.length; + stableNodeList = new Array(nodeListLength); + + // create a sparse array by only copying the elements which have a linkFn + for (i = 0; i < linkFns.length; i+=3) { + idx = linkFns[i]; + stableNodeList[idx] = nodeList[idx]; + } + } else { + stableNodeList = nodeList; + } + + for (i = 0, ii = linkFns.length; i < ii;) { + node = stableNodeList[linkFns[i++]]; + nodeLinkFn = linkFns[i++]; + childLinkFn = linkFns[i++]; + + if (nodeLinkFn) { + if (nodeLinkFn.scope) { + childScope = scope.$new(); + compile.$$addScopeInfo(jqLite(node), childScope); + var destroyBindings = nodeLinkFn.$$destroyBindings; + if (destroyBindings) { + nodeLinkFn.$$destroyBindings = null; + childScope.$on('$destroyed', destroyBindings); + } + } else { + childScope = scope; + } + + if (nodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn( + scope, nodeLinkFn.transclude, parentBoundTranscludeFn); + + } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { + childBoundTranscludeFn = parentBoundTranscludeFn; + + } else if (!parentBoundTranscludeFn && transcludeFn) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); + + } else { + childBoundTranscludeFn = null; + } + + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn, + nodeLinkFn); + + } else if (childLinkFn) { + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); + } + } + } + } + + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { + + var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { + + if (!transcludedScope) { + transcludedScope = scope.$new(false, containingScope); + transcludedScope.$$transcluded = true; + } + + return transcludeFn(transcludedScope, cloneFn, { + parentBoundTranscludeFn: previousBoundTranscludeFn, + transcludeControllers: controllers, + futureParentElement: futureParentElement + }); + }; + + return boundTranscludeFn; + } + + /** + * Looks for directives on the given node and adds them to the directive collection which is + * sorted. + * + * @param node Node to search. + * @param directives An array to which the directives are added to. This array is sorted before + * the function returns. + * @param attrs The shared attrs object which is used to populate the normalized attributes. + * @param {number=} maxPriority Max directive priority. + */ + function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + var nodeType = node.nodeType, + attrsMap = attrs.$attr, + match, + className; + + switch (nodeType) { + case NODE_TYPE_ELEMENT: /* Element */ + // use the node name: + addDirective(directives, + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + var attrStartName = false; + var attrEndName = false; + + attr = nAttrs[j]; + name = attr.name; + value = trim(attr.value); + + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { + name = name.replace(PREFIX_REGEXP, '') + .substr(8).replace(/_(.)/g, function(match, letter) { + return letter.toUpperCase(); + }); + } + + var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); + if (directiveIsMultiElement(directiveNName)) { + if (ngAttrName === directiveNName + 'Start') { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); + } + } + + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + if (isNgAttr || !attrs.hasOwnProperty(nName)) { + attrs[nName] = value; + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + } + addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, + attrEndName); + } + + // use class as directive + className = node.className; + if (isObject(className)) { + // Maybe SVGAnimatedString + className = className.animVal; + } + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case NODE_TYPE_TEXT: /* Text Node */ + if (msie === 11) { + // Workaround for #11781 + while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { + node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } + addTextInterpolateDirective(directives, node.nodeValue); + break; + case NODE_TYPE_COMMENT: /* Comment */ + try { + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + break; + } + + directives.sort(byPriority); + return directives; + } + + /** + * Given a node with an directive-start it collects all of the siblings until it finds + * directive-end. + * @param node + * @param attrStart + * @param attrEnd + * @returns {*} + */ + function groupScan(node, attrStart, attrEnd) { + var nodes = []; + var depth = 0; + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { + do { + if (!node) { + throw $compileMinErr('uterdir', + "Unterminated attribute, found '{0}' but no matching '{1}' found.", + attrStart, attrEnd); + } + if (node.nodeType == NODE_TYPE_ELEMENT) { + if (node.hasAttribute(attrStart)) depth++; + if (node.hasAttribute(attrEnd)) depth--; + } + nodes.push(node); + node = node.nextSibling; + } while (depth > 0); + } else { + nodes.push(node); + } + + return jqLite(nodes); + } + + /** + * Wrapper for linking function which converts normal linking function into a grouped + * linking function. + * @param linkFn + * @param attrStart + * @param attrEnd + * @returns {Function} + */ + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { + return function(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new + * child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes + * on it. + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when + * compiling the transclusion. + * @param {Array.} preLinkFns + * @param {Array.} postLinkFns + * @param {Object} previousCompileContext Context used for previous compilation of the current + * node + * @returns {Function} linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, + previousCompileContext) { + previousCompileContext = previousCompileContext || {}; + + var terminalPriority = -Number.MAX_VALUE, + newScopeDirective = previousCompileContext.newScopeDirective, + controllerDirectives = previousCompileContext.controllerDirectives, + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, + templateDirective = previousCompileContext.templateDirective, + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, + hasTranscludeDirective = false, + hasTemplate = false, + hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + replaceDirective = originalReplaceDirective, + childTranscludeFn = transcludeFn, + linkFn, + directiveValue; + + // executes all directives on the current element + for (var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + var attrStart = directive.$$start; + var attrEnd = directive.$$end; + + // collect multiblock sections + if (attrStart) { + $compileNode = groupScan(compileNode, attrStart, attrEnd); + } + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + + // skip the check for directives with async templates, we'll check the derived sync + // directive when the template arrives + if (!directive.templateUrl) { + if (isObject(directiveValue)) { + // This directive is trying to add an isolated scope. + // Check that there is no scope of any kind already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, + directive, $compileNode); + newIsolateScopeDirective = directive; + } else { + // This directive is trying to add a child scope. + // Check that there is no isolated scope already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, + $compileNode); + } + } + + newScopeDirective = newScopeDirective || directive; + } + + directiveName = directive.name; + + if (!directive.templateUrl && directive.controller) { + directiveValue = directive.controller; + controllerDirectives = controllerDirectives || createMap(); + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + hasTranscludeDirective = true; + + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. + // This option should only be used by directives that know how to safely handle element transclusion, + // where the transcluded nodes are added or replaced after linking. + if (!directive.$$tlb) { + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); + nonTlbTranscludeDirective = directive; + } + + if (directiveValue == 'element') { + hasElementTranscludeDirective = true; + terminalPriority = directive.priority; + $template = $compileNode; + $compileNode = templateAttrs.$$element = + jqLite(document.createComment(' ' + directiveName + ': ' + + templateAttrs[directiveName] + ' ')); + compileNode = $compileNode[0]; + replaceWith(jqCollection, sliceArgs($template), compileNode); + + childTranscludeFn = compile($template, transcludeFn, terminalPriority, + replaceDirective && replaceDirective.name, { + // Don't pass in: + // - controllerDirectives - otherwise we'll create duplicates controllers + // - newIsolateScopeDirective or templateDirective - combining templates with + // element transclusion doesn't make sense. + // + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion + // on the same element more than once. + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + } else { + $template = jqLite(jqLiteClone(compileNode)).contents(); + $compileNode.empty(); // clear contents + childTranscludeFn = compile($template, transcludeFn); + } + } + + if (directive.template) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + replaceDirective = directive; + if (jqLiteIsTextNode(directiveValue)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + directiveName, ''); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) + // - collect directives from the template and sort them by priority + // - combine directives as: processed + template + unprocessed + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); + + if (newIsolateScopeDirective) { + markDirectivesAsIsolate(templateDirectives); + } + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + if (directive.replace) { + replaceDirective = directive; + } + + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, + templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { + controllerDirectives: controllerDirectives, + newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, + newIsolateScopeDirective: newIsolateScopeDirective, + templateDirective: templateDirective, + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + if (isFunction(linkFn)) { + addLinkFns(null, linkFn, attrStart, attrEnd); + } else if (linkFn) { + addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; + nodeLinkFn.templateOnThisElement = hasTemplate; + nodeLinkFn.transclude = childTranscludeFn; + + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post, attrStart, attrEnd) { + if (pre) { + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); + pre.require = directive.require; + pre.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); + } + preLinkFns.push(pre); + } + if (post) { + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); + post.require = directive.require; + post.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + post = cloneAndAnnotateFn(post, {isolateScope: true}); + } + postLinkFns.push(post); + } + } + + + function getControllers(directiveName, require, $element, elementControllers) { + var value; + + if (isString(require)) { + var match = require.match(REQUIRE_PREFIX_REGEXP); + var name = require.substring(match[0].length); + var inheritType = match[1] || match[3]; + var optional = match[2] === '?'; + + //If only parents then start at the parent element + if (inheritType === '^^') { + $element = $element.parent(); + //Otherwise attempt getting the controller from elementControllers in case + //the element is transcluded (and has no data) and to avoid .data if possible + } else { + value = elementControllers && elementControllers[name]; + value = value && value.instance; + } + + if (!value) { + var dataName = '$' + name + 'Controller'; + value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + } + + if (!value && !optional) { + throw $compileMinErr('ctreq', + "Controller '{0}', required by directive '{1}', can't be found!", + name, directiveName); + } + } else if (isArray(require)) { + value = []; + for (var i = 0, ii = require.length; i < ii; i++) { + value[i] = getControllers(directiveName, require[i], $element, elementControllers); + } + } + + return value || null; + } + + function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope) { + var elementControllers = createMap(); + for (var controllerKey in controllerDirectives) { + var directive = controllerDirectives[controllerKey]; + var locals = { + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, + $element: $element, + $attrs: attrs, + $transclude: transcludeFn + }; + + var controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + var controllerInstance = $controller(controller, locals, true, directive.controllerAs); + + // For directives with element transclusion the element is a comment, + // but jQuery .data doesn't support attaching data to comment nodes as it's hard to + // clean up (http://bugs.jquery.com/ticket/8335). + // Instead, we save the controllers for the element in a local hash and attach to .data + // later, once we have the actual element. + elementControllers[directive.name] = controllerInstance; + if (!hasElementTranscludeDirective) { + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); + } + } + return elementControllers; + } + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn, + thisLinkFn) { + var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, + attrs; + + if (compileNode === linkNode) { + attrs = templateAttrs; + $element = templateAttrs.$$element; + } else { + $element = jqLite(linkNode); + attrs = new Attributes($element, templateAttrs); + } + + if (newIsolateScopeDirective) { + isolateScope = scope.$new(true); + } + + if (boundTranscludeFn) { + // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` + // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` + transcludeFn = controllersBoundTransclude; + transcludeFn.$$boundTransclude = boundTranscludeFn; + } + + if (controllerDirectives) { + elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope); + } + + if (newIsolateScopeDirective) { + // Initialize isolate scope bindings for new isolate scope directive. + compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || + templateDirective === newIsolateScopeDirective.$$originalDirective))); + compile.$$addScopeClass($element, true); + isolateScope.$$isolateBindings = + newIsolateScopeDirective.$$isolateBindings; + initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective, isolateScope); + } + if (elementControllers) { + // Initialize bindToController bindings for new/isolate scopes + var scopeDirective = newIsolateScopeDirective || newScopeDirective; + var bindings; + var controllerForBindings; + if (scopeDirective && elementControllers[scopeDirective.name]) { + bindings = scopeDirective.$$bindings.bindToController; + controller = elementControllers[scopeDirective.name]; + + if (controller && controller.identifier && bindings) { + controllerForBindings = controller; + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controller.instance, + bindings, scopeDirective); + } + } + for (i in elementControllers) { + controller = elementControllers[i]; + var controllerResult = controller(); + + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers and update the element data + controller.instance = controllerResult; + $element.data('$' + i + 'Controller', controllerResult); + if (controller === controllerForBindings) { + // Remove and re-install bindToController bindings + thisLinkFn.$$destroyBindings(); + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controllerResult, bindings, scopeDirective); + } + } + } + } + + // PRELINKING + for (i = 0, ii = preLinkFns.length; i < ii; i++) { + linkFn = preLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // RECURSION + // We only pass the isolate scope, if the isolate directive has a template, + // otherwise the child elements do not belong to the isolate directive. + var scopeToChild = scope; + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { + scopeToChild = isolateScope; + } + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for (i = postLinkFns.length - 1; i >= 0; i--) { + linkFn = postLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // This is the function that is injected as `$transclude`. + // Note: all arguments are optional! + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { + var transcludeControllers; + + // No scope passed in: + if (!isScope(scope)) { + futureParentElement = cloneAttachFn; + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + if (!futureParentElement) { + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; + } + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } + } + } + + function markDirectivesAsIsolate(directives) { + // mark all directives as needing isolate scope. + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: true}); + } + } + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns {boolean} true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, + endAttrName) { + if (name === ignoreDirective) return null; + var match = null; + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + try { + directive = directives[i]; + if ((maxPriority === undefined || maxPriority > directive.priority) && + directive.restrict.indexOf(location) != -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + tDirectives.push(directive); + match = directive; + } + } catch (e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * looks up the directive and returns true if it is a multi-element directive, + * and therefore requires DOM nodes between -start and -end markers to be grouped + * together. + * + * @param {string} name name of the directive to look up. + * @returns true if directive was registered as multi-element. + */ + function directiveIsMultiElement(name) { + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + if (directive.multiElement) { + return true; + } + } + } + return false; + } + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key] && src[key] !== value) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + if (key == 'class') { + safeAddClass($element, value); + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; + } else if (key == 'style') { + $element.attr('style', $element.attr('style') + ';' + value); + dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; + // `dst` will never contain hasOwnProperty as DOM parser won't let it. + // You will get an "InvalidCharacterError: DOM Exception 5" error if you + // have an attribute like "has-own-property" or "data-has-own-property", etc. + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { + dst[key] = value; + dstAttr[key] = srcAttr[key]; + } + }); + } + + + function compileTemplateUrl(directives, $compileNode, tAttrs, + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + derivedSyncDirective = inherit(origAsyncDirective, { + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl, + templateNamespace = origAsyncDirective.templateNamespace; + + $compileNode.empty(); + + $templateRequest(templateUrl) + .then(function(content) { + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; + + content = denormalizeTemplate(content); + + if (origAsyncDirective.replace) { + if (jqLiteIsTextNode(content)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(templateNamespace, trim(content))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + origAsyncDirective.name, templateUrl); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); + + if (isObject(origAsyncDirective.scope)) { + markDirectivesAsIsolate(templateDirectives); + } + directives = templateDirectives.concat(directives); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, + previousCompileContext); + forEach($rootElement, function(node, i) { + if (node == compileNode) { + $rootElement[i] = $compileNode[0]; + } + }); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + while (linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + boundTranscludeFn = linkQueue.shift(), + linkNode = $compileNode[0]; + + if (scope.$$destroyed) continue; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + var oldClasses = beforeTemplateLinkNode.className; + + if (!(previousCompileContext.hasElementTranscludeDirective && + origAsyncDirective.replace)) { + // it was cloned therefore we have to clone as well. + linkNode = jqLiteClone(compileNode); + } + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + + // Copy in CSS classes from original node + safeAddClass(jqLite(linkNode), oldClasses); + } + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } else { + childBoundTranscludeFn = boundTranscludeFn; + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, + childBoundTranscludeFn, afterTemplateNodeLinkFn); + } + linkQueue = null; + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + var childBoundTranscludeFn = boundTranscludeFn; + if (scope.$$destroyed) return; + if (linkQueue) { + linkQueue.push(scope, + node, + rootElement, + childBoundTranscludeFn); + } else { + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn, + afterTemplateNodeLinkFn); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + var diff = b.priority - a.priority; + if (diff !== 0) return diff; + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; + return a.index - b.index; + } + + function assertNoDuplicate(what, previousDirective, directive, element) { + + function wrapModuleNameIfDefined(moduleName) { + return moduleName ? + (' (module: ' + moduleName + ')') : + ''; + } + + if (previousDirective) { + throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', + previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), + directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: function textInterpolateCompileFn(templateNode) { + var templateNodeParent = templateNode.parent(), + hasCompileParent = !!templateNodeParent.length; + + // When transcluding a template that has bindings in the root + // we don't have a parent and thus need to add the class during linking fn. + if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); + + return function textInterpolateLinkFn(scope, node) { + var parent = node.parent(); + if (!hasCompileParent) compile.$$addBindingClass(parent); + compile.$$addBindingInfo(parent, interpolateFn.expressions); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }; + } + }); + } + } + + + function wrapTemplate(type, template) { + type = lowercase(type || 'html'); + switch (type) { + case 'svg': + case 'math': + var wrapper = document.createElement('div'); + wrapper.innerHTML = '<' + type + '>' + template + ''; + return wrapper.childNodes[0].childNodes; + default: + return template; + } + } + + + function getTrustedContext(node, attrNormalizedName) { + if (attrNormalizedName == "srcdoc") { + return $sce.HTML; + } + var tag = nodeName_(node); + // maction[xlink:href] can source SVG. It's not limited to . + if (attrNormalizedName == "xlinkHref" || + (tag == "form" && attrNormalizedName == "action") || + (tag != "img" && (attrNormalizedName == "src" || + attrNormalizedName == "ngSrc"))) { + return $sce.RESOURCE_URL; + } + } + + + function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { + var trustedContext = getTrustedContext(node, name); + allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; + + var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + if (name === "multiple" && nodeName_(node) === "select") { + throw $compileMinErr("selmulti", + "Binding to the 'multiple' attribute is not supported. Element: {0}", + startingTag(node)); + } + + directives.push({ + priority: 100, + compile: function() { + return { + pre: function attrInterpolatePreLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = {})); + + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { + throw $compileMinErr('nodomevents', + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + + "ng- versions (such as ng-click instead of onclick) instead."); + } + + // If the attribute has changed since last $interpolate()ed + var newValue = attr[name]; + if (newValue !== value) { + // we need to interpolate again since the attribute value has been updated + // (e.g. by another directive's compile function) + // ensure unset/empty values make interpolateFn falsy + interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); + value = newValue; + } + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + // initialize attr object so that it's ready in case we need the value for isolate + // scope initialization, otherwise the value would not be available from isolate + // directive's linking fn during linking phase + attr[name] = interpolateFn(scope); + + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { + //special case for class attribute addition + removal + //so that class changes can tap into the animation + //hooks provided by the $animate service. Be sure to + //skip animations when the first digest occurs (when + //both the new and the old values are the same) since + //the CSS classes are the non-interpolated values + if (name === 'class' && newValue != oldValue) { + attr.$updateClass(newValue, oldValue); + } else { + attr.$set(name, newValue); + } + }); + } + }; + } + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep + * the shell, but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, elementsToRemove, newNode) { + var firstElementToRemove = elementsToRemove[0], + removeCount = elementsToRemove.length, + parent = firstElementToRemove.parentNode, + i, ii; + + if ($rootElement) { + for (i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == firstElementToRemove) { + $rootElement[i++] = newNode; + for (var j = i, j2 = j + removeCount - 1, + jj = $rootElement.length; + j < jj; j++, j2++) { + if (j2 < jj) { + $rootElement[j] = $rootElement[j2]; + } else { + delete $rootElement[j]; + } + } + $rootElement.length -= removeCount - 1; + + // If the replaced element is also the jQuery .context then replace it + // .context is a deprecated jQuery api, so we should set it only when jQuery set it + // http://api.jquery.com/context/ + if ($rootElement.context === firstElementToRemove) { + $rootElement.context = newNode; + } + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, firstElementToRemove); + } + + // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it? + var fragment = document.createDocumentFragment(); + fragment.appendChild(firstElementToRemove); + + if (jqLite.hasData(firstElementToRemove)) { + // Copy over user data (that includes Angular's $scope etc.). Don't copy private + // data here because there's no public interface in jQuery to do that and copying over + // event listeners (which is the main use of private data) wouldn't work anyway. + jqLite(newNode).data(jqLite(firstElementToRemove).data()); + + // Remove data of the replaced element. We cannot just call .remove() + // on the element it since that would deallocate scope that is needed + // for the new node. Instead, remove the data "manually". + if (!jQuery) { + delete jqLite.cache[firstElementToRemove[jqLite.expando]]; + } else { + // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after + // the replaced element. The cleanData version monkey-patched by Angular would cause + // the scope to be trashed and we do need the very same scope to work with the new + // element. However, we cannot just cache the non-patched version and use it here as + // that would break if another library patches the method after Angular does (one + // example is jQuery UI). Instead, set a flag indicating scope destroying should be + // skipped this one time. + skipDestroyOnNextJQueryCleanData = true; + jQuery.cleanData([firstElementToRemove]); + } + } + + for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { + var element = elementsToRemove[k]; + jqLite(element).remove(); // must do this way to clean up expando + fragment.appendChild(element); + delete elementsToRemove[k]; + } + + elementsToRemove[0] = newNode; + elementsToRemove.length = 1; + } + + + function cloneAndAnnotateFn(fn, annotation) { + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); + } + + + function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { + try { + linkFn(scope, $element, attrs, controllers, transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + + // Set up $watches for isolate scope and controller bindings. This process + // only occurs for isolate scopes and new scopes with controllerAs. + function initializeDirectiveBindings(scope, attrs, destination, bindings, + directive, newScope) { + var onNewScopeDestroyed; + forEach(bindings, function(definition, scopeName) { + var attrName = definition.attrName, + optional = definition.optional, + mode = definition.mode, // @, =, or & + lastValue, + parentGet, parentSet, compare; + + if (!hasOwnProperty.call(attrs, attrName)) { + // In the case of user defined a binding with the same name as a method in Object.prototype but didn't set + // the corresponding attribute. We need to make sure subsequent code won't access to the prototype function + attrs[attrName] = undefined; + } + + switch (mode) { + + case '@': + if (!attrs[attrName] && !optional) { + destination[scopeName] = undefined; + } + + attrs.$observe(attrName, function(value) { + destination[scopeName] = value; + }); + attrs.$$observers[attrName].$$scope = scope; + if (attrs[attrName]) { + // If the attribute has been provided then we trigger an interpolation to ensure + // the value is there for use in the link fn + destination[scopeName] = $interpolate(attrs[attrName])(scope); + } + break; + + case '=': + if (optional && !attrs[attrName]) { + return; + } + parentGet = $parse(attrs[attrName]); + + if (parentGet.literal) { + compare = equals; + } else { + compare = function(a, b) { return a === b || (a !== a && b !== b); }; + } + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = destination[scopeName] = parentGet(scope); + throw $compileMinErr('nonassign', + "Expression '{0}' used with directive '{1}' is non-assignable!", + attrs[attrName], directive.name); + }; + lastValue = destination[scopeName] = parentGet(scope); + var parentValueWatch = function parentValueWatch(parentValue) { + if (!compare(parentValue, destination[scopeName])) { + // we are out of sync and need to copy + if (!compare(parentValue, lastValue)) { + // parent changed and it has precedence + destination[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(scope, parentValue = destination[scopeName]); + } + } + return lastValue = parentValue; + }; + parentValueWatch.$stateful = true; + var unwatch; + if (definition.collection) { + unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + } else { + unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + } + onNewScopeDestroyed = (onNewScopeDestroyed || []); + onNewScopeDestroyed.push(unwatch); + break; + + case '&': + parentGet = $parse(attrs[attrName]); + + // Don't assign noop to destination if expression is not valid + if (parentGet === noop && optional) break; + + destination[scopeName] = function(locals) { + return parentGet(scope, locals); + }; + break; + } + }); + var destroyBindings = onNewScopeDestroyed ? function destroyBindings() { + for (var i = 0, ii = onNewScopeDestroyed.length; i < ii; ++i) { + onNewScopeDestroyed[i](); + } + } : noop; + if (newScope && destroyBindings !== noop) { + newScope.$on('$destroy', destroyBindings); + return noop; + } + return destroyBindings; + } + }]; +} + +var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc type + * @name $compile.directive.Attributes + * + * @description + * A shared object between directive compile / linking functions which contains normalized DOM + * element attributes. The values reflect current binding state `{{ }}`. The normalization is + * needed since all of these are treated as equivalent in Angular: + * + * ``` + * + * ``` + */ + +/** + * @ngdoc property + * @name $compile.directive.Attributes#$attr + * + * @description + * A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc method + * @name $compile.directive.Attributes#$set + * @kind function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function tokenDifference(str1, str2) { + var values = '', + tokens1 = str1.split(/\s+/), + tokens2 = str2.split(/\s+/); + + outer: + for (var i = 0; i < tokens1.length; i++) { + var token = tokens1[i]; + for (var j = 0; j < tokens2.length; j++) { + if (token == tokens2[j]) continue outer; + } + values += (values.length > 0 ? ' ' : '') + token; + } + return values; +} + +function removeComments(jqNodes) { + jqNodes = jqLite(jqNodes); + var i = jqNodes.length; + + if (i <= 1) { + return jqNodes; + } + + while (i--) { + var node = jqNodes[i]; + if (node.nodeType === NODE_TYPE_COMMENT) { + splice.call(jqNodes, i, 1); + } + } + return jqNodes; +} + +var $controllerMinErr = minErr('$controller'); + + +var CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; +function identifierForController(controller, ident) { + if (ident && isString(ident)) return ident; + if (isString(controller)) { + var match = CNTRL_REG.exec(controller); + if (match) return match[3]; + } +} + + +/** + * @ngdoc provider + * @name $controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + globals = false; + + /** + * @ngdoc method + * @name $controllerProvider#register + * @param {string|Object} name Controller name, or an object map of controllers where the keys are + * the names and the values are the constructors. + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + assertNotHasOwnProperty(name, 'controller'); + if (isObject(name)) { + extend(controllers, name); + } else { + controllers[name] = constructor; + } + }; + + /** + * @ngdoc method + * @name $controllerProvider#allowGlobals + * @description If called, allows `$controller` to find controller constructors on `window` + */ + this.allowGlobals = function() { + globals = true; + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc service + * @name $controller + * @requires $injector + * + * @param {Function|string} constructor If called with a function then it's considered to be the + * controller constructor function. Otherwise it's considered to be a string which is used + * to retrieve the controller constructor using the following steps: + * + * * check if a controller with given name is registered via `$controllerProvider` + * * check if evaluating the string on the current scope returns a constructor + * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global + * `window` object (not recommended) + * + * The string can use the `controller as property` syntax, where the controller instance is published + * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this + * to work correctly. + * + * @param {Object} locals Injection locals for Controller. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link auto.$injector $injector}, but extracted into + * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). + */ + return function(expression, locals, later, ident) { + // PRIVATE API: + // param `later` --- indicates that the controller's constructor is invoked at a later time. + // If true, $controller will allocate the object with the correct + // prototype chain, but will not invoke the controller until a returned + // callback is invoked. + // param `ident` --- An optional label which overrides the label parsed from the controller + // expression, if any. + var instance, match, constructor, identifier; + later = later === true; + if (ident && isString(ident)) { + identifier = ident; + } + + if (isString(expression)) { + match = expression.match(CNTRL_REG); + if (!match) { + throw $controllerMinErr('ctrlfmt', + "Badly formed controller string '{0}'. " + + "Must match `__name__ as __id__` or `__name__`.", expression); + } + constructor = match[1], + identifier = identifier || match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || + (globals ? getter($window, constructor, true) : undefined); + + assertArgFn(expression, constructor, true); + } + + if (later) { + // Instantiate controller later: + // This machinery is used to create an instance of the object before calling the + // controller's constructor itself. + // + // This allows properties to be added to the controller before the constructor is + // invoked. Primarily, this is used for isolate scope bindings in $compile. + // + // This feature is not intended for use by applications, and is thus not documented + // publicly. + // Object creation: http://jsperf.com/create-constructor/2 + var controllerPrototype = (isArray(expression) ? + expression[expression.length - 1] : expression).prototype; + instance = Object.create(controllerPrototype || null); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + var instantiate; + return instantiate = extend(function() { + var result = $injector.invoke(expression, instance, locals, constructor); + if (result !== instance && (isObject(result) || isFunction(result))) { + instance = result; + if (identifier) { + // If result changed, re-assign controllerAs value to scope. + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + } + return instance; + }, { + instance: instance, + identifier: identifier + }); + } + + instance = $injector.instantiate(expression, locals, constructor); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + return instance; + }; + + function addIdentifier(locals, identifier, instance, name) { + if (!(locals && isObject(locals.$scope))) { + throw minErr('$controller')('noscp', + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + name, identifier); + } + + locals.$scope[identifier] = instance; + } + }]; +} + +/** + * @ngdoc service + * @name $document + * @requires $window + * + * @description + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + * + * @example + + +
      +

      $document title:

      +

      window.document title:

      +
      +
      + + angular.module('documentExample', []) + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + }]); + +
      + */ +function $DocumentProvider() { + this.$get = ['$window', function(window) { + return jqLite(window.document); + }]; +} + +/** + * @ngdoc service + * @name $exceptionHandler + * @requires ng.$log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * ## Example: + * + * ```js + * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() { + * return function(exception, cause) { + * exception.message += ' (caused by "' + cause + '")'; + * throw exception; + * }; + * }); + * ``` + * + * This example will override the normal action of `$exceptionHandler`, to make angular + * exceptions fail hard when they happen, instead of just logging to the console. + * + *
      + * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` + * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} + * (unless executed during a digest). + * + * If you wish, you can manually delegate exceptions, e.g. + * `try { ... } catch(e) { $exceptionHandler(e); }` + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +var APPLICATION_JSON = 'application/json'; +var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; +var JSON_START = /^\[|^\{(?!\{)/; +var JSON_ENDS = { + '[': /]$/, + '{': /}$/ +}; +var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; + +function serializeValue(v) { + if (isObject(v)) { + return isDate(v) ? v.toISOString() : toJson(v); + } + return v; +} + + +function $HttpParamSerializerProvider() { + /** + * @ngdoc service + * @name $httpParamSerializer + * @description + * + * Default {@link $http `$http`} params serializer that converts objects to strings + * according to the following rules: + * + * * `{'foo': 'bar'}` results in `foo=bar` + * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) + * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) + * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) + * + * Note that serializer will sort the request parameters alphabetically. + * */ + + this.$get = function() { + return function ngParamSerializer(params) { + if (!params) return ''; + var parts = []; + forEachSorted(params, function(value, key) { + if (value === null || isUndefined(value)) return; + if (isArray(value)) { + forEach(value, function(v, k) { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); + }); + } else { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); + } + }); + + return parts.join('&'); + }; + }; +} + +function $HttpParamSerializerJQLikeProvider() { + /** + * @ngdoc service + * @name $httpParamSerializerJQLike + * @description + * + * Alternative {@link $http `$http`} params serializer that follows + * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. + * The serializer will also sort the params alphabetically. + * + * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: + * + * ```js + * $http({ + * url: myUrl, + * method: 'GET', + * params: myParams, + * paramSerializer: '$httpParamSerializerJQLike' + * }); + * ``` + * + * It is also possible to set it as the default `paramSerializer` in the + * {@link $httpProvider#defaults `$httpProvider`}. + * + * Additionally, you can inject the serializer and use it explicitly, for example to serialize + * form data for submission: + * + * ```js + * .controller(function($http, $httpParamSerializerJQLike) { + * //... + * + * $http({ + * url: myUrl, + * method: 'POST', + * data: $httpParamSerializerJQLike(myData), + * headers: { + * 'Content-Type': 'application/x-www-form-urlencoded' + * } + * }); + * + * }); + * ``` + * + * */ + this.$get = function() { + return function jQueryLikeParamSerializer(params) { + if (!params) return ''; + var parts = []; + serialize(params, '', true); + return parts.join('&'); + + function serialize(toSerialize, prefix, topLevel) { + if (toSerialize === null || isUndefined(toSerialize)) return; + if (isArray(toSerialize)) { + forEach(toSerialize, function(value) { + serialize(value, prefix + '[]'); + }); + } else if (isObject(toSerialize) && !isDate(toSerialize)) { + forEachSorted(toSerialize, function(value, key) { + serialize(value, prefix + + (topLevel ? '' : '[') + + key + + (topLevel ? '' : ']')); + }); + } else { + parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); + } + } + }; + }; +} + +function defaultHttpResponseTransform(data, headers) { + if (isString(data)) { + // Strip json vulnerability protection prefix and trim whitespace + var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); + + if (tempData) { + var contentType = headers('Content-Type'); + if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { + data = fromJson(tempData); + } + } + } + + return data; +} + +function isJsonLike(str) { + var jsonStart = str.match(JSON_START); + return jsonStart && JSON_ENDS[jsonStart[0]].test(str); +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = createMap(), i; + + function fillInParsed(key, val) { + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + + if (isString(headers)) { + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); + }); + } else if (isObject(headers)) { + forEach(headers, function(headerVal, headerKey) { + fillInParsed(lowercase(headerKey), trim(headerVal)); + }); + } + + return parsed; +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + var value = headersObj[lowercase(name)]; + if (value === void 0) { + value = null; + } + return value; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers HTTP headers getter fn. + * @param {number} status HTTP status code of the response. + * @param {(Function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, status, fns) { + if (isFunction(fns)) { + return fns(data, headers, status); + } + + forEach(fns, function(fn) { + data = fn(data, headers, status); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +/** + * @ngdoc provider + * @name $httpProvider + * @description + * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. + * */ +function $HttpProvider() { + /** + * @ngdoc property + * @name $httpProvider#defaults + * @description + * + * Object containing default values for all {@link ng.$http $http} requests. + * + * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`} + * that will provide the cache for all requests who set their `cache` property to `true`. + * If you set the `defaults.cache = false` then only requests that specify their own custom + * cache object will be cached. See {@link $http#caching $http Caching} for more information. + * + * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. + * Defaults value is `'XSRF-TOKEN'`. + * + * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the + * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. + * + * - **`defaults.headers`** - {Object} - Default headers for all $http requests. + * Refer to {@link ng.$http#setting-http-headers $http} for documentation on + * setting default headers. + * - **`defaults.headers.common`** + * - **`defaults.headers.post`** + * - **`defaults.headers.put`** + * - **`defaults.headers.patch`** + * + * + * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function + * used to the prepare string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. + * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. + * + **/ + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [defaultHttpResponseTransform], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + paramSerializer: '$httpParamSerializer' + }; + + var useApplyAsync = false; + /** + * @ngdoc method + * @name $httpProvider#useApplyAsync + * @description + * + * Configure $http service to combine processing of multiple http responses received at around + * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in + * significant performance improvement for bigger applications that make many HTTP requests + * concurrently (common during application bootstrap). + * + * Defaults to false. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred + * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window + * to load and share the same digest cycle. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useApplyAsync = function(value) { + if (isDefined(value)) { + useApplyAsync = !!value; + return this; + } + return useApplyAsync; + }; + + /** + * @ngdoc property + * @name $httpProvider#interceptors + * @description + * + * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} + * pre-processing of request or postprocessing of responses. + * + * These service factories are ordered by request, i.e. they are applied in the same order as the + * array, on request, but reverse order, on response. + * + * {@link ng.$http#interceptors Interceptors detailed info} + **/ + var interceptorFactories = this.interceptors = []; + + this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Make sure that default param serializer is exposed as a function + */ + defaults.paramSerializer = isString(defaults.paramSerializer) ? + $injector.get(defaults.paramSerializer) : defaults.paramSerializer; + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + /** + * @ngdoc service + * @kind function + * @name $http + * @requires ng.$httpBackend + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) + * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * ## General usage + * The `$http` service is a function which takes a single argument — a configuration object — + * that is used to generate an HTTP request and returns a {@link ng.$q promise} + * with two $http specific methods: `success` and `error`. + * + * ```js + * // Simple GET request example : + * $http.get('/someUrl'). + * success(function(data, status, headers, config) { + * // this callback will be called asynchronously + * // when the response is available + * }). + * error(function(data, status, headers, config) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * ```js + * // Simple POST request example (passing data) : + * $http.post('/someUrl', {msg:'hello word!'}). + * success(function(data, status, headers, config) { + * // this callback will be called asynchronously + * // when the response is available + * }). + * error(function(data, status, headers, config) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * + * Since the returned value of calling the $http function is a `promise`, you can also use + * the `then` method to register callbacks, and these callbacks will receive a single argument – + * an object representing the response. See the API signature and type info below for more + * details. + * + * A response status code between 200 and 299 is considered a success status and + * will result in the success callback being called. Note that if the response is a redirect, + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be + * called for such responses. + * + * ## Writing Unit Tests that use $http + * When unit testing (using {@link ngMock ngMock}), it is necessary to call + * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending + * request using trained responses. + * + * ``` + * $httpBackend.expectGET(...); + * $http.get(...); + * $httpBackend.flush(); + * ``` + * + * ## Shortcut methods + * + * Shortcut methods are also available. All shortcut methods require passing in the URL, and + * request data must be passed in for POST/PUT requests. + * + * ```js + * $http.get('/someUrl').success(successCallback); + * $http.post('/someUrl', data).success(successCallback); + * ``` + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#get $http.get} + * - {@link ng.$http#head $http.head} + * - {@link ng.$http#post $http.post} + * - {@link ng.$http#put $http.put} + * - {@link ng.$http#delete $http.delete} + * - {@link ng.$http#jsonp $http.jsonp} + * - {@link ng.$http#patch $http.patch} + * + * + * ## Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. + * + * The defaults can also be set at runtime via the `$http.defaults` object in the same + * fashion. For example: + * + * ``` + * module.run(function($http) { + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' + * }); + * ``` + * + * In addition, you can supply a `headers` property in the config object passed when + * calling `$http(config)`, which overrides the defaults without changing them globally. + * + * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, + * Use the `headers` property, setting the desired header to `undefined`. For example: + * + * ```js + * var req = { + * method: 'POST', + * url: 'http://example.com', + * headers: { + * 'Content-Type': undefined + * }, + * data: { test: 'test' } + * } + * + * $http(req).success(function(){...}).error(function(){...}); + * ``` + * + * ## Transforming Requests and Responses + * + * Both requests and responses can be transformed using transformation functions: `transformRequest` + * and `transformResponse`. These properties can be a single function that returns + * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, + * which allows you to `push` or `unshift` a new transformation function into the transformation chain. + * + * ### Default Transformations + * + * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and + * `defaults.transformResponse` properties. If a request does not provide its own transformations + * then these will be applied. + * + * You can augment or replace the default transformations by modifying these properties by adding to or + * replacing the array. + * + * Angular provides the following default transformations: + * + * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): + * + * - If the `data` property of the request configuration object contains an object, serialize it + * into JSON format. + * + * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * + * ### Overriding the Default Transformations Per Request + * + * If you wish override the request/response transformations only for a single request then provide + * `transformRequest` and/or `transformResponse` properties on the configuration object passed + * into `$http`. + * + * Note that if you provide these properties on the config object the default transformations will be + * overwritten. If you wish to augment the default transformations then you must include them in your + * local transformation array. + * + * The following code demonstrates adding a new response transformation to be run after the default response + * transformations have been run. + * + * ```js + * function appendTransform(defaults, transform) { + * + * // We can't guarantee that the default transformation is an array + * defaults = angular.isArray(defaults) ? defaults : [defaults]; + * + * // Append the new transformation to the defaults + * return defaults.concat(transform); + * } + * + * $http({ + * url: '...', + * method: 'GET', + * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { + * return doTransform(value); + * }) + * }); + * ``` + * + * + * ## Caching + * + * To enable caching, set the request configuration `cache` property to `true` (to use default + * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). + * When the cache is enabled, `$http` stores the response from the server in the specified + * cache. The next time the same request is made, the response is served from the cache without + * sending a request to the server. + * + * Note that even if the response is served from cache, delivery of the data is asynchronous in + * the same way that real requests are. + * + * If there are multiple GET requests for the same URL that should be cached using the same + * cache, but the cache is not populated yet, only one request to the server will be made and + * the remaining requests will be fulfilled using the response from the first request. + * + * You can change the default cache to a new object (built with + * {@link ng.$cacheFactory `$cacheFactory`}) by updating the + * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set + * their `cache` property to `true` will now use this cache object. + * + * If you set the default cache to `false` then only requests that specify their own custom + * cache object will be cached. + * + * ## Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with a http `config` object. The function is free to + * modify the `config` object or create a new one. The function needs to return the `config` + * object directly, or a promise containing the `config` or a new `config` object. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to + * modify the `response` object or create a new one. The function needs to return the `response` + * object directly, or as a promise containing the `response` or a new `response` object. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * + * + * ```js + * // register the interceptor as a service + * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { + * return { + * // optional method + * 'request': function(config) { + * // do something on success + * return config; + * }, + * + * // optional method + * 'requestError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * }, + * + * + * + * // optional method + * 'response': function(response) { + * // do something on success + * return response; + * }, + * + * // optional method + * 'responseError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * } + * }; + * }); + * + * $httpProvider.interceptors.push('myHttpInterceptor'); + * + * + * // alternatively, register the interceptor via an anonymous factory + * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { + * return { + * 'request': function(config) { + * // same as above + * }, + * + * 'response': function(response) { + * // same as above + * } + * }; + * }); + * ``` + * + * ## Security Considerations + * + * When designing web applications, consider security threats from: + * + * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ### JSON Vulnerability Protection + * + * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * allows third party website to turn your JSON resource URL into + * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + * ```js + * ['one','two'] + * ``` + * + * which is vulnerable to attack, your server can return: + * ```js + * )]}', + * ['one','two'] + * ``` + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ### Cross Site Request Forgery (XSRF) Protection + * + * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which + * an unauthorized site can gain your user's private data. Angular provides a mechanism + * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie + * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only + * JavaScript that runs on your domain could read the cookie, your server can be assured that + * the XHR came from JavaScript running on your domain. The header will not be set for + * cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from + * making up its own tokens). We recommend that the token is a digest of your site's + * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) + * for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, + * or the per-request config object. + * + * In order to prevent collisions in environments where multiple Angular apps share the + * same domain or subdomain, we recommend that each application uses unique cookie name. + * + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be serialized + * with the `paramSerializer` and appended as GET parameters. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the + * header will not be sent. Functions accept a config object as an argument. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **transformResponse** – + * `{function(data, headersGetter, status)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body, headers and status and returns its transformed (typically deserialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default TransformationjqLiks} + * - **paramSerializer** - `{string|function(Object):string}` - A function used to + * prepare the string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as function registered with the + * {@link $injector $injector}, which means you can create your own serializer + * by registering it as a {@link auto.$provide#service service}. + * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; + * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} + * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) + * for more information. + * - **responseType** - `{string}` - see + * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). + * + * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the + * standard `then` method and two http specific methods: `success` and `error`. The `then` + * method takes two arguments a success and an error callback which will be called with a + * response object. The `success` and `error` methods take a single argument - a function that + * will be called when the request succeeds or fails respectively. The arguments passed into + * these functions are destructured representation of the response object passed into the + * `then` method. The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform + * functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * - **statusText** – `{string}` – HTTP status text of the response. + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
      + + +
      + + + +
      http status code: {{status}}
      +
      http response data: {{data}}
      +
      +
      + + angular.module('httpExample', []) + .controller('FetchController', ['$scope', '$http', '$templateCache', + function($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + success(function(data, status) { + $scope.status = status; + $scope.data = data; + }). + error(function(data, status) { + $scope.data = data || "Request failed"; + $scope.status = status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + }]); + + + Hello, $http! + + + var status = element(by.binding('status')); + var data = element(by.binding('data')); + var fetchBtn = element(by.id('fetchbtn')); + var sampleGetBtn = element(by.id('samplegetbtn')); + var sampleJsonpBtn = element(by.id('samplejsonpbtn')); + var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); + + it('should make an xhr GET request', function() { + sampleGetBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('200'); + expect(data.getText()).toMatch(/Hello, \$http!/); + }); + +// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 +// it('should make a JSONP request to angularjs.org', function() { +// sampleJsonpBtn.click(); +// fetchBtn.click(); +// expect(status.getText()).toMatch('200'); +// expect(data.getText()).toMatch(/Super Hero!/); +// }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + invalidJsonpBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('0'); + expect(data.getText()).toMatch('Request failed'); + }); + +
      + */ + function $http(requestConfig) { + + if (!angular.isObject(requestConfig)) { + throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); + } + + var config = extend({ + method: 'get', + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse, + paramSerializer: defaults.paramSerializer + }, requestConfig); + + config.headers = mergeHeaders(requestConfig); + config.method = uppercase(config.method); + config.paramSerializer = isString(config.paramSerializer) ? + $injector.get(config.paramSerializer) : config.paramSerializer; + + var serverRequest = function(config) { + var headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(reqData)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData).then(transformResponse, transformResponse); + }; + + var chain = [serverRequest, undefined]; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + chain.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + chain.push(interceptor.response, interceptor.responseError); + } + }); + + while (chain.length) { + var thenFn = chain.shift(); + var rejectFn = chain.shift(); + + promise = promise.then(thenFn, rejectFn); + } + + promise.success = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + return promise; + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response); + if (!response.data) { + resp.data = response.data; + } else { + resp.data = transformData(response.data, response.headers, response.status, config.transformResponse); + } + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + + function executeHeaderFns(headers, config) { + var headerContent, processedHeaders = {}; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(config); + if (headerContent != null) { + processedHeaders[header] = headerContent; + } + } else { + processedHeaders[header] = headerFn; + } + }); + + return processedHeaders; + } + + function mergeHeaders(config) { + var defHeaders = defaults.headers, + reqHeaders = extend({}, config.headers), + defHeaderName, lowercaseDefHeaderName, reqHeaderName; + + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + + // using for-in instead of forEach to avoid unecessary iteration after header has been found + defaultHeadersIteration: + for (defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + + for (reqHeaderName in reqHeaders) { + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + + // execute if header value is a function for merged headers + return executeHeaderFns(reqHeaders, shallowCopy(config)); + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name $http#get + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#delete + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#head + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#jsonp + * + * @description + * Shortcut method to perform `JSONP` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * The name of the callback should be the string `JSON_CALLBACK`. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name $http#post + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#put + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#patch + * + * @description + * Shortcut method to perform `PATCH` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put', 'patch'); + + /** + * @ngdoc property + * @name $http#defaults + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend({}, config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend({}, config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + reqHeaders = config.headers, + url = buildUrl(config.url, config.paramSerializer(config.params)); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && + (config.method === 'GET' || config.method === 'JSONP')) { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (isDefined(cachedResp)) { + if (isPromiseLike(cachedResp)) { + // cached request has already been sent, but there is no response yet + cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); + } else { + resolvePromise(cachedResp, 200, {}, 'OK'); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + + // if we won't have the response in cache, set the xsrf headers and + // send the request to the backend + if (isUndefined(cachedResp)) { + var xsrfValue = urlIsSameOrigin(config.url) + ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType); + } + + return promise; + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString, statusText) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString), statusText]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + function resolveHttpPromise() { + resolvePromise(response, status, headersString, statusText); + } + + if (useApplyAsync) { + $rootScope.$applyAsync(resolveHttpPromise); + } else { + resolveHttpPromise(); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers, statusText) { + // normalize internal statuses to 0 + status = Math.max(status, 0); + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config, + statusText: statusText + }); + } + + function resolvePromiseWithResult(result) { + resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); + } + + function removePendingReq() { + var idx = $http.pendingRequests.indexOf(config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, serializedParams) { + if (serializedParams.length > 0) { + url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; + } + return url; + } + }]; +} + +function createXhr() { + return new window.XMLHttpRequest(); +} + +/** + * @ngdoc service + * @name $httpBackend + * @requires $window + * @requires $document + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { + return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); + }]; +} + +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) == 'jsonp') { + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; + callbacks[callbackId].called = true; + }; + + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + callbackId, function(status, text) { + completeRequest(callback, status, callbacks[callbackId].data, "", text); + callbacks[callbackId] = noop; + }); + } else { + + var xhr = createXhr(); + + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (isDefined(value)) { + xhr.setRequestHeader(key, value); + } + }); + + xhr.onload = function requestLoaded() { + var statusText = xhr.statusText || ''; + + // responseText is the old-school way of retrieving response (supported by IE8 & 9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + var response = ('response' in xhr) ? xhr.response : xhr.responseText; + + // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) + var status = xhr.status === 1223 ? 204 : xhr.status; + + // fix status code when it is 0 (0 status is undocumented). + // Occurs when accessing file resources or on Android 4.1 stock browser + // while retrieving files from application cache. + if (status === 0) { + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; + } + + completeRequest(callback, + status, + response, + xhr.getAllResponseHeaders(), + statusText); + }; + + var requestError = function() { + // The response is always empty + // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error + completeRequest(callback, -1, null, null, ''); + }; + + xhr.onerror = requestError; + xhr.onabort = requestError; + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + try { + xhr.responseType = responseType; + } catch (e) { + // WebKit added support for the json responseType value on 09/03/2013 + // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are + // known to throw when setting the value "json" as the response type. Other older + // browsers implementing the responseType + // + // The json response type can be ignored if not supported, because JSON payloads are + // parsed on the client-side regardless. + if (responseType !== 'json') { + throw e; + } + } + } + + xhr.send(post); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (isPromiseLike(timeout)) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString, statusText) { + // cancel timeout and subsequent timeout promise resolution + if (timeoutId !== undefined) { + $browserDefer.cancel(timeoutId); + } + jsonpDone = xhr = null; + + callback(status, response, headersString, statusText); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, callbackId, done) { + // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), callback = null; + script.type = "text/javascript"; + script.src = url; + script.async = true; + + callback = function(event) { + removeEventListenerFn(script, "load", callback); + removeEventListenerFn(script, "error", callback); + rawDocument.body.removeChild(script); + script = null; + var status = -1; + var text = "unknown"; + + if (event) { + if (event.type === "load" && !callbacks[callbackId].called) { + event = { type: "error" }; + } + text = event.type; + status = event.type === "error" ? 404 : 200; + } + + if (done) { + done(status, text); + } + }; + + addEventListenerFn(script, "load", callback); + addEventListenerFn(script, "error", callback); + rawDocument.body.appendChild(script); + return callback; + } +} + +var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); +$interpolateMinErr.throwNoconcat = function(text) { + throw $interpolateMinErr('noconcat', + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + + "interpolations that concatenate multiple expressions when a trusted value is " + + "required. See http://docs.angularjs.org/api/ng.$sce", text); +}; + +$interpolateMinErr.interr = function(text, err) { + return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); +}; + +/** + * @ngdoc provider + * @name $interpolateProvider + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + * + * @example + + + +
      + //demo.label// +
      +
      + + it('should interpolate binding with custom symbols', function() { + expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); + }); + +
      + */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name $interpolateProvider#startSymbol + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value) { + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name $interpolateProvider#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value) { + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length, + escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), + escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); + + function escape(ch) { + return '\\\\\\' + ch; + } + + function unescapeText(text) { + return text.replace(escapedStartRegexp, startSymbol). + replace(escapedEndRegexp, endSymbol); + } + + function stringify(value) { + if (value == null) { // null || undefined + return ''; + } + switch (typeof value) { + case 'string': + break; + case 'number': + value = '' + value; + break; + default: + value = toJson(value); + } + + return value; + } + + /** + * @ngdoc service + * @name $interpolate + * @kind function + * + * @requires $parse + * @requires $sce + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * + * ```js + * var $interpolate = ...; // injected + * var exp = $interpolate('Hello {{name | uppercase}}!'); + * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!'); + * ``` + * + * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is + * `true`, the interpolation function will return `undefined` unless all embedded expressions + * evaluate to a value other than `undefined`. + * + * ```js + * var $interpolate = ...; // injected + * var context = {greeting: 'Hello', name: undefined }; + * + * // default "forgiving" mode + * var exp = $interpolate('{{greeting}} {{name}}!'); + * expect(exp(context)).toEqual('Hello !'); + * + * // "allOrNothing" mode + * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); + * expect(exp(context)).toBeUndefined(); + * context.name = 'Angular'; + * expect(exp(context)).toEqual('Hello Angular!'); + * ``` + * + * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. + * + * ####Escaped Interpolation + * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers + * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). + * It will be rendered as a regular start/end marker, and will not be interpreted as an expression + * or binding. + * + * This enables web-servers to prevent script injection attacks and defacing attacks, to some + * degree, while also enabling code examples to work without relying on the + * {@link ng.directive:ngNonBindable ngNonBindable} directive. + * + * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, + * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all + * interpolation start/end markers with their escaped counterparts.** + * + * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered + * output when the $interpolate service processes the text. So, for HTML elements interpolated + * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter + * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, + * this is typically useful only when user-data is used in rendering a template from the server, or + * when otherwise untrusted data is used by a directive. + * + * + * + *
      + *

      {{apptitle}}: \{\{ username = "defaced value"; \}\} + *

      + *

      {{username}} attempts to inject code which will deface the + * application, but fails to accomplish their task, because the server has correctly + * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) + * characters.

      + *

      Instead, the result of the attempted script injection is visible, and can be removed + * from the database by an administrator.

      + *
      + *
      + *
      + * + * @param {string} text The text with markup to interpolate. + * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have + * embedded expression in order to return an interpolation function. Strings with no + * embedded expression will return null for the interpolation function. + * @param {string=} trustedContext when provided, the returned function passes the interpolated + * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that + * provides Strict Contextual Escaping for details. + * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined + * unless all embedded expressions evaluate to a value other than `undefined`. + * @returns {function(context)} an interpolation function which is used to compute the + * interpolated string. The function has these parameters: + * + * - `context`: evaluation context for all expressions embedded in the interpolated text + */ + function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { + allOrNothing = !!allOrNothing; + var startIndex, + endIndex, + index = 0, + expressions = [], + parseFns = [], + textLength = text.length, + exp, + concat = [], + expressionPositions = []; + + while (index < textLength) { + if (((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { + if (index !== startIndex) { + concat.push(unescapeText(text.substring(index, startIndex))); + } + exp = text.substring(startIndex + startSymbolLength, endIndex); + expressions.push(exp); + parseFns.push($parse(exp, parseStringifyInterceptor)); + index = endIndex + endSymbolLength; + expressionPositions.push(concat.length); + concat.push(''); + } else { + // we did not find an interpolation, so we have to add the remainder to the separators array + if (index !== textLength) { + concat.push(unescapeText(text.substring(index))); + } + break; + } + } + + // Concatenating expressions makes it hard to reason about whether some combination of + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a + // single expression be used for iframe[src], object[src], etc., we ensure that the value + // that's used is assigned or constructed by some JS code somewhere that is more testable or + // make it obvious that you bound the value to some user controlled value. This helps reduce + // the load when auditing for XSS issues. + if (trustedContext && concat.length > 1) { + $interpolateMinErr.throwNoconcat(text); + } + + if (!mustHaveExpression || expressions.length) { + var compute = function(values) { + for (var i = 0, ii = expressions.length; i < ii; i++) { + if (allOrNothing && isUndefined(values[i])) return; + concat[expressionPositions[i]] = values[i]; + } + return concat.join(''); + }; + + var getValue = function(value) { + return trustedContext ? + $sce.getTrusted(trustedContext, value) : + $sce.valueOf(value); + }; + + return extend(function interpolationFn(context) { + var i = 0; + var ii = expressions.length; + var values = new Array(ii); + + try { + for (; i < ii; i++) { + values[i] = parseFns[i](context); + } + + return compute(values); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + + }, { + // all of these properties are undocumented for now + exp: text, //just for compatibility with regular watchers created via $watch + expressions: expressions, + $$watchDelegate: function(scope, listener) { + var lastValue; + return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { + var currValue = compute(values); + if (isFunction(listener)) { + listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); + } + lastValue = currValue; + }); + } + }); + } + + function parseStringifyInterceptor(value) { + try { + value = getValue(value); + return allOrNothing && !isDefined(value) ? value : stringify(value); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + } + } + + + /** + * @ngdoc method + * @name $interpolate#startSymbol + * @description + * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. + * + * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change + * the symbol. + * + * @returns {string} start symbol. + */ + $interpolate.startSymbol = function() { + return startSymbol; + }; + + + /** + * @ngdoc method + * @name $interpolate#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change + * the symbol. + * + * @returns {string} end symbol. + */ + $interpolate.endSymbol = function() { + return endSymbol; + }; + + return $interpolate; + }]; +} + +function $IntervalProvider() { + this.$get = ['$rootScope', '$window', '$q', '$$q', + function($rootScope, $window, $q, $$q) { + var intervals = {}; + + + /** + * @ngdoc service + * @name $interval + * + * @description + * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` + * milliseconds. + * + * The return value of registering an interval function is a promise. This promise will be + * notified upon each tick of the interval, and will be resolved after `count` iterations, or + * run indefinitely if `count` is not defined. The value of the notification will be the + * number of iterations that have run. + * To cancel an interval, call `$interval.cancel(promise)`. + * + * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + *
      + * **Note**: Intervals created by this service must be explicitly destroyed when you are finished + * with them. In particular they are not automatically destroyed when a controller's scope or a + * directive's element are destroyed. + * You should take this into consideration and make sure to always cancel the interval at the + * appropriate moment. See the example below for more details on how and when to do this. + *
      + * + * @param {function()} fn A function that should be called repeatedly. + * @param {number} delay Number of milliseconds between each function call. + * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat + * indefinitely. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {promise} A promise which will be notified on each iteration. + * + * @example + * + * + * + * + *
      + *
      + *
      + * Current time is: + *
      + * Blood 1 : {{blood_1}} + * Blood 2 : {{blood_2}} + * + * + * + *
      + *
      + * + *
      + *
      + */ + function interval(fn, delay, count, invokeApply) { + var hasParams = arguments.length > 4, + args = hasParams ? sliceArgs(arguments, 4) : [], + setInterval = $window.setInterval, + clearInterval = $window.clearInterval, + iteration = 0, + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise; + + count = isDefined(count) ? count : 0; + + promise.then(null, null, (!hasParams) ? fn : function() { + fn.apply(null, args); + }); + + promise.$$intervalId = setInterval(function tick() { + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + deferred.resolve(iteration); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + } + + if (!skipApply) $rootScope.$apply(); + + }, delay); + + intervals[promise.$$intervalId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $interval#cancel + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {promise} promise returned by the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully canceled. + */ + interval.cancel = function(promise) { + if (promise && promise.$$intervalId in intervals) { + intervals[promise.$$intervalId].reject('canceled'); + $window.clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + return true; + } + return false; + }; + + return interval; + }]; +} + +/** + * @ngdoc service + * @name $locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ +function $LocaleProvider() { + this.$get = function() { + return { + id: 'en-us', + + NUMBER_FORMATS: { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PATTERNS: [ + { // Decimal Pattern + minInt: 1, + minFrac: 0, + maxFrac: 3, + posPre: '', + posSuf: '', + negPre: '-', + negSuf: '', + gSize: 3, + lgSize: 3 + },{ //Currency Pattern + minInt: 1, + minFrac: 2, + maxFrac: 2, + posPre: '\u00A4', + posSuf: '', + negPre: '(\u00A4', + negSuf: ')', + gSize: 3, + lgSize: 3 + } + ], + CURRENCY_SYM: '$' + }, + + DATETIME_FORMATS: { + MONTH: + 'January,February,March,April,May,June,July,August,September,October,November,December' + .split(','), + SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), + DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), + SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), + AMPMS: ['AM','PM'], + medium: 'MMM d, y h:mm:ss a', + 'short': 'M/d/yy h:mm a', + fullDate: 'EEEE, MMMM d, y', + longDate: 'MMMM d, y', + mediumDate: 'MMM d, y', + shortDate: 'M/d/yy', + mediumTime: 'h:mm:ss a', + shortTime: 'h:mm a', + ERANAMES: [ + "Before Christ", + "Anno Domini" + ], + ERAS: [ + "BC", + "AD" + ] + }, + + pluralCat: function(num) { + if (num === 1) { + return 'one'; + } + return 'other'; + } + }; + }; +} + +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; +var $locationMinErr = minErr('$location'); + + +/** + * Encode path using encodeUriSegment, ignoring forward slashes + * + * @param {string} path Path to encode + * @returns {string} + */ +function encodePath(path) { + var segments = path.split('/'), + i = segments.length; + + while (i--) { + segments[i] = encodeUriSegment(segments[i]); + } + + return segments.join('/'); +} + +function parseAbsoluteUrl(absoluteUrl, locationObj) { + var parsedUrl = urlResolve(absoluteUrl); + + locationObj.$$protocol = parsedUrl.protocol; + locationObj.$$host = parsedUrl.hostname; + locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; +} + + +function parseAppUrl(relativeUrl, locationObj) { + var prefixed = (relativeUrl.charAt(0) !== '/'); + if (prefixed) { + relativeUrl = '/' + relativeUrl; + } + var match = urlResolve(relativeUrl); + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? + match.pathname.substring(1) : match.pathname); + locationObj.$$search = parseKeyValue(match.search); + locationObj.$$hash = decodeURIComponent(match.hash); + + // make sure path starts with '/'; + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { + locationObj.$$path = '/' + locationObj.$$path; + } +} + + +/** + * + * @param {string} begin + * @param {string} whole + * @returns {string} returns text from whole after begin or undefined if it does not begin with + * expected string. + */ +function beginsWith(begin, whole) { + if (whole.indexOf(begin) === 0) { + return whole.substr(begin.length); + } +} + + +function stripHash(url) { + var index = url.indexOf('#'); + return index == -1 ? url : url.substr(0, index); +} + +function trimEmptyHash(url) { + return url.replace(/(#.+)|#$/, '$1'); +} + + +function stripFile(url) { + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); +} + +/* return the server only (scheme://host:port) */ +function serverBase(url) { + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); +} + + +/** + * LocationHtml5Url represents an url + * This object is exposed as $location service when HTML5 mode is enabled and supported + * + * @constructor + * @param {string} appBase application base URL + * @param {string} basePrefix url path prefix + */ +function LocationHtml5Url(appBase, basePrefix) { + this.$$html5 = true; + basePrefix = basePrefix || ''; + var appBaseNoFile = stripFile(appBase); + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given html5 (regular) url string into properties + * @param {string} url HTML5 url + * @private + */ + this.$$parse = function(url) { + var pathUrl = beginsWith(appBaseNoFile, url); + if (!isString(pathUrl)) { + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, + appBaseNoFile); + } + + parseAppUrl(pathUrl, this); + + if (!this.$$path) { + this.$$path = '/'; + } + + this.$$compose(); + }; + + /** + * Compose url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + var appUrl, prevAppUrl; + var rewrittenUrl; + + if ((appUrl = beginsWith(appBase, url)) !== undefined) { + prevAppUrl = appUrl; + if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) { + rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); + } else { + rewrittenUrl = appBase + prevAppUrl; + } + } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) { + rewrittenUrl = appBaseNoFile + appUrl; + } else if (appBaseNoFile == url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when developer doesn't opt into html5 mode. + * It also serves as the base class for html5 mode fallback on legacy browsers. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangUrl(appBase, hashPrefix) { + var appBaseNoFile = stripFile(appBase); + + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given hashbang url into properties + * @param {string} url Hashbang url + * @private + */ + this.$$parse = function(url) { + var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); + var withoutHashUrl; + + if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { + + // The rest of the url starts with a hash so we have + // got either a hashbang path or a plain hash fragment + withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl); + if (isUndefined(withoutHashUrl)) { + // There was no hashbang prefix so we just have a hash fragment + withoutHashUrl = withoutBaseUrl; + } + + } else { + // There was no hashbang path nor hash fragment: + // If we are in HTML5 mode we use what is left as the path; + // Otherwise we ignore what is left + if (this.$$html5) { + withoutHashUrl = withoutBaseUrl; + } else { + withoutHashUrl = ''; + if (isUndefined(withoutBaseUrl)) { + appBase = url; + this.replace(); + } + } + } + + parseAppUrl(withoutHashUrl, this); + + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); + + this.$$compose(); + + /* + * In Windows, on an anchor node on documents loaded from + * the filesystem, the browser will return a pathname + * prefixed with the drive name ('/C:/path') when a + * pathname without a drive is set: + * * a.setAttribute('href', '/foo') + * * a.pathname === '/C:/foo' //true + * + * Inside of Angular, we're always using pathnames that + * do not include drive names for routing. + */ + function removeWindowsDriveName(path, url, base) { + /* + Matches paths for file protocol on windows, + such as /C:/foo/bar, and captures only /foo/bar. + */ + var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; + + var firstPathSegmentMatch; + + //Get the relative path from the input URL. + if (url.indexOf(base) === 0) { + url = url.replace(base, ''); + } + + // The input URL intentionally contains a first path segment that ends with a colon. + if (windowsFilePathExp.exec(url)) { + return path; + } + + firstPathSegmentMatch = windowsFilePathExp.exec(path); + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; + } + }; + + /** + * Compose hashbang url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (stripHash(appBase) == stripHash(url)) { + this.$$parse(url); + return true; + } + return false; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when html5 history api is enabled but the browser + * does not support it. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangInHtml5Url(appBase, hashPrefix) { + this.$$html5 = true; + LocationHashbangUrl.apply(this, arguments); + + var appBaseNoFile = stripFile(appBase); + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + + var rewrittenUrl; + var appUrl; + + if (appBase == stripHash(url)) { + rewrittenUrl = url; + } else if ((appUrl = beginsWith(appBaseNoFile, url))) { + rewrittenUrl = appBase + hashPrefix + appUrl; + } else if (appBaseNoFile === url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; + + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#' + this.$$absUrl = appBase + hashPrefix + this.$$url; + }; + +} + + +var locationPrototype = { + + /** + * Are we in html5 mode? + * @private + */ + $$html5: false, + + /** + * Has any change been replacing? + * @private + */ + $$replace: false, + + /** + * @ngdoc method + * @name $location#absUrl + * + * @description + * This method is getter only. + * + * Return full url representation with all segments encoded according to rules specified in + * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var absUrl = $location.absUrl(); + * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" + * ``` + * + * @return {string} full url + */ + absUrl: locationGetter('$$absUrl'), + + /** + * @ngdoc method + * @name $location#url + * + * @description + * This method is getter / setter. + * + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * + * Change path, search and hash, when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var url = $location.url(); + * // => "/some/path?foo=bar&baz=xoxo" + * ``` + * + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @return {string} url + */ + url: function(url) { + if (isUndefined(url)) { + return this.$$url; + } + + var match = PATH_MATCH.exec(url); + if (match[1] || url === '') this.path(decodeURIComponent(match[1])); + if (match[2] || match[1] || url === '') this.search(match[3] || ''); + this.hash(match[5] || ''); + + return this; + }, + + /** + * @ngdoc method + * @name $location#protocol + * + * @description + * This method is getter only. + * + * Return protocol of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var protocol = $location.protocol(); + * // => "http" + * ``` + * + * @return {string} protocol of current url + */ + protocol: locationGetter('$$protocol'), + + /** + * @ngdoc method + * @name $location#host + * + * @description + * This method is getter only. + * + * Return host of current url. + * + * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var host = $location.host(); + * // => "example.com" + * + * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo + * host = $location.host(); + * // => "example.com" + * host = location.host; + * // => "example.com:8080" + * ``` + * + * @return {string} host of current url. + */ + host: locationGetter('$$host'), + + /** + * @ngdoc method + * @name $location#port + * + * @description + * This method is getter only. + * + * Return port of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var port = $location.port(); + * // => 80 + * ``` + * + * @return {Number} port + */ + port: locationGetter('$$port'), + + /** + * @ngdoc method + * @name $location#path + * + * @description + * This method is getter / setter. + * + * Return path of current url when called without any parameter. + * + * Change path when called with parameter and return `$location`. + * + * Note: Path should always begin with forward slash (/), this method will add the forward slash + * if it is missing. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var path = $location.path(); + * // => "/some/path" + * ``` + * + * @param {(string|number)=} path New path + * @return {string} path + */ + path: locationGetterSetter('$$path', function(path) { + path = path !== null ? path.toString() : ''; + return path.charAt(0) == '/' ? path : '/' + path; + }), + + /** + * @ngdoc method + * @name $location#search + * + * @description + * This method is getter / setter. + * + * Return search part (as object) of current url when called without any parameter. + * + * Change search part when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var searchObject = $location.search(); + * // => {foo: 'bar', baz: 'xoxo'} + * + * // set foo to 'yipee' + * $location.search('foo', 'yipee'); + * // $location.search() => {foo: 'yipee', baz: 'xoxo'} + * ``` + * + * @param {string|Object.|Object.>} search New search params - string or + * hash object. + * + * When called with a single argument the method acts as a setter, setting the `search` component + * of `$location` to the specified value. + * + * If the argument is a hash object containing an array of values, these values will be encoded + * as duplicate search parameters in the url. + * + * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` + * will override only a single search property. + * + * If `paramValue` is an array, it will override the property of the `search` component of + * `$location` specified via the first argument. + * + * If `paramValue` is `null`, the property specified via the first argument will be deleted. + * + * If `paramValue` is `true`, the property specified via the first argument will be added with no + * value nor trailing equal sign. + * + * @return {Object} If called with no arguments returns the parsed `search` object. If called with + * one or more arguments returns `$location` object itself. + */ + search: function(search, paramValue) { + switch (arguments.length) { + case 0: + return this.$$search; + case 1: + if (isString(search) || isNumber(search)) { + search = search.toString(); + this.$$search = parseKeyValue(search); + } else if (isObject(search)) { + search = copy(search, {}); + // remove object undefined or null properties + forEach(search, function(value, key) { + if (value == null) delete search[key]; + }); + + this.$$search = search; + } else { + throw $locationMinErr('isrcharg', + 'The first argument of the `$location#search()` call must be a string or an object.'); + } + break; + default: + if (isUndefined(paramValue) || paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name $location#hash + * + * @description + * This method is getter / setter. + * + * Return hash fragment when called without any parameter. + * + * Change hash fragment when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue + * var hash = $location.hash(); + * // => "hashValue" + * ``` + * + * @param {(string|number)=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', function(hash) { + return hash !== null ? hash.toString() : ''; + }), + + /** + * @ngdoc method + * @name $location#replace + * + * @description + * If called, all changes to $location during current `$digest` will be replacing current history + * record, instead of adding new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { + Location.prototype = Object.create(locationPrototype); + + /** + * @ngdoc method + * @name $location#state + * + * @description + * This method is getter / setter. + * + * Return the history state object when called without any parameter. + * + * Change the history state object when called with one parameter and return `$location`. + * The state object is later passed to `pushState` or `replaceState`. + * + * NOTE: This method is supported only in HTML5 mode and only in browsers supporting + * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support + * older browsers (like IE9 or Android < 4.0), don't use this method. + * + * @param {object=} state State object for pushState or replaceState + * @return {object} state + */ + Location.prototype.state = function(state) { + if (!arguments.length) { + return this.$$state; + } + + if (Location !== LocationHtml5Url || !this.$$html5) { + throw $locationMinErr('nostate', 'History API state support is available only ' + + 'in HTML5 mode and only in browsers supporting HTML5 History API'); + } + // The user might modify `stateObject` after invoking `$location.state(stateObject)` + // but we're changing the $$state reference to $browser.state() during the $digest + // so the modification window is narrow. + this.$$state = isUndefined(state) ? null : state; + + return this; + }; +}); + + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) { + return this[property]; + } + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc service + * @name $location + * + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/$location Developer Guide: Using $location} + */ + +/** + * @ngdoc provider + * @name $locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider() { + var hashPrefix = '', + html5Mode = { + enabled: false, + requireBase: true, + rewriteLinks: true + }; + + /** + * @ngdoc method + * @name $locationProvider#hashPrefix + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc method + * @name $locationProvider#html5Mode + * @description + * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. + * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported + * properties: + * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to + * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not + * support `pushState`. + * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies + * whether or not a tag is required to be present. If `enabled` and `requireBase` are + * true, and a base tag is not present, an error will be thrown when `$location` is injected. + * See the {@link guide/$location $location guide for more information} + * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, + * enables/disables url rewriting for relative links. + * + * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isBoolean(mode)) { + html5Mode.enabled = mode; + return this; + } else if (isObject(mode)) { + + if (isBoolean(mode.enabled)) { + html5Mode.enabled = mode.enabled; + } + + if (isBoolean(mode.requireBase)) { + html5Mode.requireBase = mode.requireBase; + } + + if (isBoolean(mode.rewriteLinks)) { + html5Mode.rewriteLinks = mode.rewriteLinks; + } + + return this; + } else { + return html5Mode; + } + }; + + /** + * @ngdoc event + * @name $location#$locationChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a URL will change. + * + * This change can be prevented by calling + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more + * details about event object. Upon successful change + * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + /** + * @ngdoc event + * @name $location#$locationChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a URL was changed. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', + function($rootScope, $browser, $sniffer, $rootElement, $window) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' + initialUrl = $browser.url(), + appBase; + + if (html5Mode.enabled) { + if (!baseHref && html5Mode.requireBase) { + throw $locationMinErr('nobase', + "$location in HTML5 mode requires a tag to be present!"); + } + appBase = serverBase(initialUrl) + (baseHref || '/'); + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + $location = new LocationMode(appBase, '#' + hashPrefix); + $location.$$parseLinkUrl(initialUrl, initialUrl); + + $location.$$state = $browser.state(); + + var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; + + function setBrowserUrlWithFallback(url, replace, state) { + var oldUrl = $location.url(); + var oldState = $location.$$state; + try { + $browser.url(url, replace, state); + + // Make sure $location.state() returns referentially identical (not just deeply equal) + // state object; this makes possible quick checking if the state changed in the digest + // loop. Checking deep equality would be too expensive. + $location.$$state = $browser.state(); + } catch (e) { + // Restore old values if pushState fails + $location.url(oldUrl); + $location.$$state = oldState; + + throw e; + } + } + + $rootElement.on('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (nodeName_(elm[0]) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + // get the actual href attribute - see + // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx + var relHref = elm.attr('href') || elm.attr('xlink:href'); + + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during + // an animation. + absHref = urlResolve(absHref.animVal).href; + } + + // Ignore when url is started with javascript: or mailto: + if (IGNORE_URI_REGEXP.test(absHref)) return; + + if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { + if ($location.$$parseLinkUrl(absHref, relHref)) { + // We do a preventDefault for all urls that are part of the angular application, + // in html5mode and also without, so that we are able to abort navigation without + // getting double entries in the location history. + event.preventDefault(); + // update location manually + if ($location.absUrl() != $browser.url()) { + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + $window.angular['ff-684208-preventDefault'] = true; + } + } + } + }); + + + // rewrite hashbang url <> html5 url + if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { + $browser.url($location.absUrl(), true); + } + + var initializing = true; + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl, newState) { + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + var oldState = $location.$$state; + var defaultPrevented; + + $location.$$parse(newUrl); + $location.$$state = newState; + + defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + newState, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + setBrowserUrlWithFallback(oldUrl, false, oldState); + } else { + initializing = false; + afterLocationChange(oldUrl, oldState); + } + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + }); + + // update browser + $rootScope.$watch(function $locationWatch() { + var oldUrl = trimEmptyHash($browser.url()); + var newUrl = trimEmptyHash($location.absUrl()); + var oldState = $browser.state(); + var currentReplace = $location.$$replace; + var urlOrStateChanged = oldUrl !== newUrl || + ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); + + if (initializing || urlOrStateChanged) { + initializing = false; + + $rootScope.$evalAsync(function() { + var newUrl = $location.absUrl(); + var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + $location.$$state, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + } else { + if (urlOrStateChanged) { + setBrowserUrlWithFallback(newUrl, currentReplace, + oldState === $location.$$state ? null : $location.$$state); + } + afterLocationChange(oldUrl, oldState); + } + }); + } + + $location.$$replace = false; + + // we don't need to return anything because $evalAsync will make the digest loop dirty when + // there is a change + }); + + return $location; + + function afterLocationChange(oldUrl, oldState) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, + $location.$$state, oldState); + } +}]; +} + +/** + * @ngdoc service + * @name $log + * @requires $window + * + * @description + * Simple service for logging. Default implementation safely writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * The default is to log `debug` messages. You can use + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. + * + * @example + + + angular.module('logExample', []) + .controller('LogController', ['$scope', '$log', function($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + }]); + + +
      +

      Reload this page with open console, enter text and hit the log button...

      + + + + + + +
      +
      +
      + */ + +/** + * @ngdoc provider + * @name $logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider() { + var debug = true, + self = this; + + /** + * @ngdoc method + * @name $logProvider#debugEnabled + * @description + * @param {boolean=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window) { + return { + /** + * @ngdoc method + * @name $log#log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name $log#info + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name $log#warn + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name $log#error + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name $log#debug + * + * @description + * Write a debug message + */ + debug: (function() { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + }; + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop, + hasApply = false; + + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. + // The reason behind this is that console.log has type "object" in IE8... + try { + hasApply = !!logFn.apply; + } catch (e) {} + + if (hasApply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2 == null ? '' : arg2); + }; + } + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $parseMinErr = minErr('$parse'); + +// Sandboxing Angular Expressions +// ------------------------------ +// Angular expressions are generally considered safe because these expressions only have direct +// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by +// obtaining a reference to native JS functions such as the Function constructor. +// +// As an example, consider the following Angular expression: +// +// {}.toString.constructor('alert("evil JS code")') +// +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits +// against the expression language, but not to prevent exploits that were enabled by exposing +// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good +// practice and therefore we are not even trying to protect against interaction with an object +// explicitly exposed in this way. +// +// In general, it is not possible to access a Window object from an angular expression unless a +// window or some DOM object that has a reference to window is published onto a Scope. +// Similarly we prevent invocations of function known to be dangerous, as well as assignments to +// native objects. +// +// See https://docs.angularjs.org/guide/security + + +function ensureSafeMemberName(name, fullExpression) { + if (name === "__defineGetter__" || name === "__defineSetter__" + || name === "__lookupGetter__" || name === "__lookupSetter__" + || name === "__proto__") { + throw $parseMinErr('isecfld', + 'Attempting to access a disallowed field in Angular expressions! ' + + 'Expression: {0}', fullExpression); + } + return name; +} + +function ensureSafeObject(obj, fullExpression) { + // nifty check if obj is Function that is fast and works across iframes and other contexts + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isWindow(obj) + obj.window === obj) { + throw $parseMinErr('isecwindow', + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isElement(obj) + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { + throw $parseMinErr('isecdom', + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// block Object so that we can't get hold of dangerous Object.* methods + obj === Object) { + throw $parseMinErr('isecobj', + 'Referencing Object in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } + return obj; +} + +var CALL = Function.prototype.call; +var APPLY = Function.prototype.apply; +var BIND = Function.prototype.bind; + +function ensureSafeFunction(obj, fullExpression) { + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (obj === CALL || obj === APPLY || obj === BIND) { + throw $parseMinErr('isecff', + 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } +} + +var OPERATORS = createMap(); +forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + + +///////////////////////////////////////// + + +/** + * @constructor + */ +var Lexer = function(options) { + this.options = options; +}; + +Lexer.prototype = { + constructor: Lexer, + + lex: function(text) { + this.text = text; + this.index = 0; + this.tokens = []; + + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (ch === '"' || ch === "'") { + this.readString(ch); + } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { + this.readNumber(); + } else if (this.isIdent(ch)) { + this.readIdent(); + } else if (this.is(ch, '(){}[].,;:?')) { + this.tokens.push({index: this.index, text: ch}); + this.index++; + } else if (this.isWhitespace(ch)) { + this.index++; + } else { + var ch2 = ch + this.peek(); + var ch3 = ch2 + this.peek(2); + var op1 = OPERATORS[ch]; + var op2 = OPERATORS[ch2]; + var op3 = OPERATORS[ch3]; + if (op1 || op2 || op3) { + var token = op3 ? ch3 : (op2 ? ch2 : ch); + this.tokens.push({index: this.index, text: token, operator: true}); + this.index += token.length; + } else { + this.throwError('Unexpected next character ', this.index, this.index + 1); + } + } + } + return this.tokens; + }, + + is: function(ch, chars) { + return chars.indexOf(ch) !== -1; + }, + + peek: function(i) { + var num = i || 1; + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; + }, + + isNumber: function(ch) { + return ('0' <= ch && ch <= '9') && typeof ch === "string"; + }, + + isWhitespace: function(ch) { + // IE treats non-breaking space as \u00A0 + return (ch === ' ' || ch === '\r' || ch === '\t' || + ch === '\n' || ch === '\v' || ch === '\u00A0'); + }, + + isIdent: function(ch) { + return ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' === ch || ch === '$'); + }, + + isExpOperator: function(ch) { + return (ch === '-' || ch === '+' || this.isNumber(ch)); + }, + + throwError: function(error, start, end) { + end = end || this.index; + var colStr = (isDefined(start) + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' + : ' ' + end); + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', + error, colStr, this.text); + }, + + readNumber: function() { + var number = ''; + var start = this.index; + while (this.index < this.text.length) { + var ch = lowercase(this.text.charAt(this.index)); + if (ch == '.' || this.isNumber(ch)) { + number += ch; + } else { + var peekCh = this.peek(); + if (ch == 'e' && this.isExpOperator(peekCh)) { + number += ch; + } else if (this.isExpOperator(ch) && + peekCh && this.isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (this.isExpOperator(ch) && + (!peekCh || !this.isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + this.throwError('Invalid exponent'); + } else { + break; + } + } + this.index++; + } + this.tokens.push({ + index: start, + text: number, + constant: true, + value: Number(number) + }); + }, + + readIdent: function() { + var start = this.index; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (!(this.isIdent(ch) || this.isNumber(ch))) { + break; + } + this.index++; + } + this.tokens.push({ + index: start, + text: this.text.slice(start, this.index), + identifier: true + }); + }, + + readString: function(quote) { + var start = this.index; + this.index++; + var string = ''; + var rawString = quote; + var escape = false; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + rawString += ch; + if (escape) { + if (ch === 'u') { + var hex = this.text.substring(this.index + 1, this.index + 5); + if (!hex.match(/[\da-f]{4}/i)) { + this.throwError('Invalid unicode escape [\\u' + hex + ']'); + } + this.index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + string = string + (rep || ch); + } + escape = false; + } else if (ch === '\\') { + escape = true; + } else if (ch === quote) { + this.index++; + this.tokens.push({ + index: start, + text: rawString, + constant: true, + value: string + }); + return; + } else { + string += ch; + } + this.index++; + } + this.throwError('Unterminated quote', start); + } +}; + +var AST = function(lexer, options) { + this.lexer = lexer; + this.options = options; +}; + +AST.Program = 'Program'; +AST.ExpressionStatement = 'ExpressionStatement'; +AST.AssignmentExpression = 'AssignmentExpression'; +AST.ConditionalExpression = 'ConditionalExpression'; +AST.LogicalExpression = 'LogicalExpression'; +AST.BinaryExpression = 'BinaryExpression'; +AST.UnaryExpression = 'UnaryExpression'; +AST.CallExpression = 'CallExpression'; +AST.MemberExpression = 'MemberExpression'; +AST.Identifier = 'Identifier'; +AST.Literal = 'Literal'; +AST.ArrayExpression = 'ArrayExpression'; +AST.Property = 'Property'; +AST.ObjectExpression = 'ObjectExpression'; +AST.ThisExpression = 'ThisExpression'; + +// Internal use only +AST.NGValueParameter = 'NGValueParameter'; + +AST.prototype = { + ast: function(text) { + this.text = text; + this.tokens = this.lexer.lex(text); + + var value = this.program(); + + if (this.tokens.length !== 0) { + this.throwError('is an unexpected token', this.tokens[0]); + } + + return value; + }, + + program: function() { + var body = []; + while (true) { + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) + body.push(this.expressionStatement()); + if (!this.expect(';')) { + return { type: AST.Program, body: body}; + } + } + }, + + expressionStatement: function() { + return { type: AST.ExpressionStatement, expression: this.filterChain() }; + }, + + filterChain: function() { + var left = this.expression(); + var token; + while ((token = this.expect('|'))) { + left = this.filter(left); + } + return left; + }, + + expression: function() { + return this.assignment(); + }, + + assignment: function() { + var result = this.ternary(); + if (this.expect('=')) { + result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; + } + return result; + }, + + ternary: function() { + var test = this.logicalOR(); + var alternate; + var consequent; + if (this.expect('?')) { + alternate = this.expression(); + if (this.consume(':')) { + consequent = this.expression(); + return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; + } + } + return test; + }, + + logicalOR: function() { + var left = this.logicalAND(); + while (this.expect('||')) { + left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; + } + return left; + }, + + logicalAND: function() { + var left = this.equality(); + while (this.expect('&&')) { + left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; + } + return left; + }, + + equality: function() { + var left = this.relational(); + var token; + while ((token = this.expect('==','!=','===','!=='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; + } + return left; + }, + + relational: function() { + var left = this.additive(); + var token; + while ((token = this.expect('<', '>', '<=', '>='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; + } + return left; + }, + + additive: function() { + var left = this.multiplicative(); + var token; + while ((token = this.expect('+','-'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; + } + return left; + }, + + multiplicative: function() { + var left = this.unary(); + var token; + while ((token = this.expect('*','/','%'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; + } + return left; + }, + + unary: function() { + var token; + if ((token = this.expect('+', '-', '!'))) { + return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; + } else { + return this.primary(); + } + }, + + primary: function() { + var primary; + if (this.expect('(')) { + primary = this.filterChain(); + this.consume(')'); + } else if (this.expect('[')) { + primary = this.arrayDeclaration(); + } else if (this.expect('{')) { + primary = this.object(); + } else if (this.constants.hasOwnProperty(this.peek().text)) { + primary = copy(this.constants[this.consume().text]); + } else if (this.peek().identifier) { + primary = this.identifier(); + } else if (this.peek().constant) { + primary = this.constant(); + } else { + this.throwError('not a primary expression', this.peek()); + } + + var next; + while ((next = this.expect('(', '[', '.'))) { + if (next.text === '(') { + primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; + this.consume(')'); + } else if (next.text === '[') { + primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; + this.consume(']'); + } else if (next.text === '.') { + primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; + } else { + this.throwError('IMPOSSIBLE'); + } + } + return primary; + }, + + filter: function(baseExpression) { + var args = [baseExpression]; + var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; + + while (this.expect(':')) { + args.push(this.expression()); + } + + return result; + }, + + parseArguments: function() { + var args = []; + if (this.peekToken().text !== ')') { + do { + args.push(this.expression()); + } while (this.expect(',')); + } + return args; + }, + + identifier: function() { + var token = this.consume(); + if (!token.identifier) { + this.throwError('is not a valid identifier', token); + } + return { type: AST.Identifier, name: token.text }; + }, + + constant: function() { + // TODO check that it is a constant + return { type: AST.Literal, value: this.consume().value }; + }, + + arrayDeclaration: function() { + var elements = []; + if (this.peekToken().text !== ']') { + do { + if (this.peek(']')) { + // Support trailing commas per ES5.1. + break; + } + elements.push(this.expression()); + } while (this.expect(',')); + } + this.consume(']'); + + return { type: AST.ArrayExpression, elements: elements }; + }, + + object: function() { + var properties = [], property; + if (this.peekToken().text !== '}') { + do { + if (this.peek('}')) { + // Support trailing commas per ES5.1. + break; + } + property = {type: AST.Property, kind: 'init'}; + if (this.peek().constant) { + property.key = this.constant(); + } else if (this.peek().identifier) { + property.key = this.identifier(); + } else { + this.throwError("invalid key", this.peek()); + } + this.consume(':'); + property.value = this.expression(); + properties.push(property); + } while (this.expect(',')); + } + this.consume('}'); + + return {type: AST.ObjectExpression, properties: properties }; + }, + + throwError: function(msg, token) { + throw $parseMinErr('syntax', + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); + }, + + consume: function(e1) { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + + var token = this.expect(e1); + if (!token) { + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); + } + return token; + }, + + peekToken: function() { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + return this.tokens[0]; + }, + + peek: function(e1, e2, e3, e4) { + return this.peekAhead(0, e1, e2, e3, e4); + }, + + peekAhead: function(i, e1, e2, e3, e4) { + if (this.tokens.length > i) { + var token = this.tokens[i]; + var t = token.text; + if (t === e1 || t === e2 || t === e3 || t === e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + }, + + expect: function(e1, e2, e3, e4) { + var token = this.peek(e1, e2, e3, e4); + if (token) { + this.tokens.shift(); + return token; + } + return false; + }, + + + /* `undefined` is not a constant, it is an identifier, + * but using it as an identifier is not supported + */ + constants: { + 'true': { type: AST.Literal, value: true }, + 'false': { type: AST.Literal, value: false }, + 'null': { type: AST.Literal, value: null }, + 'undefined': {type: AST.Literal, value: undefined }, + 'this': {type: AST.ThisExpression } + } +}; + +function ifDefined(v, d) { + return typeof v !== 'undefined' ? v : d; +} + +function plusFn(l, r) { + if (typeof l === 'undefined') return r; + if (typeof r === 'undefined') return l; + return l + r; +} + +function isStateless($filter, filterName) { + var fn = $filter(filterName); + return !fn.$stateful; +} + +function findConstantAndWatchExpressions(ast, $filter) { + var allConstants; + var argsToWatch; + switch (ast.type) { + case AST.Program: + allConstants = true; + forEach(ast.body, function(expr) { + findConstantAndWatchExpressions(expr.expression, $filter); + allConstants = allConstants && expr.expression.constant; + }); + ast.constant = allConstants; + break; + case AST.Literal: + ast.constant = true; + ast.toWatch = []; + break; + case AST.UnaryExpression: + findConstantAndWatchExpressions(ast.argument, $filter); + ast.constant = ast.argument.constant; + ast.toWatch = ast.argument.toWatch; + break; + case AST.BinaryExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); + break; + case AST.LogicalExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.ConditionalExpression: + findConstantAndWatchExpressions(ast.test, $filter); + findConstantAndWatchExpressions(ast.alternate, $filter); + findConstantAndWatchExpressions(ast.consequent, $filter); + ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.Identifier: + ast.constant = false; + ast.toWatch = [ast]; + break; + case AST.MemberExpression: + findConstantAndWatchExpressions(ast.object, $filter); + if (ast.computed) { + findConstantAndWatchExpressions(ast.property, $filter); + } + ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); + ast.toWatch = [ast]; + break; + case AST.CallExpression: + allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; + argsToWatch = []; + forEach(ast.arguments, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; + break; + case AST.AssignmentExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = [ast]; + break; + case AST.ArrayExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.elements, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ObjectExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.properties, function(property) { + findConstantAndWatchExpressions(property.value, $filter); + allConstants = allConstants && property.value.constant; + if (!property.value.constant) { + argsToWatch.push.apply(argsToWatch, property.value.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ThisExpression: + ast.constant = false; + ast.toWatch = []; + break; + } +} + +function getInputs(body) { + if (body.length != 1) return; + var lastExpression = body[0].expression; + var candidate = lastExpression.toWatch; + if (candidate.length !== 1) return candidate; + return candidate[0] !== lastExpression ? candidate : undefined; +} + +function isAssignable(ast) { + return ast.type === AST.Identifier || ast.type === AST.MemberExpression; +} + +function assignableAST(ast) { + if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { + return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; + } +} + +function isLiteral(ast) { + return ast.body.length === 0 || + ast.body.length === 1 && ( + ast.body[0].expression.type === AST.Literal || + ast.body[0].expression.type === AST.ArrayExpression || + ast.body[0].expression.type === AST.ObjectExpression); +} + +function isConstant(ast) { + return ast.constant; +} + +function ASTCompiler(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTCompiler.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.state = { + nextId: 0, + filters: {}, + expensiveChecks: expensiveChecks, + fn: {vars: [], body: [], own: {}}, + assign: {vars: [], body: [], own: {}}, + inputs: [] + }; + findConstantAndWatchExpressions(ast, self.$filter); + var extra = ''; + var assignable; + this.stage = 'assign'; + if ((assignable = assignableAST(ast))) { + this.state.computing = 'assign'; + var result = this.nextId(); + this.recurse(assignable, result); + extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); + } + var toWatch = getInputs(ast.body); + self.stage = 'inputs'; + forEach(toWatch, function(watch, key) { + var fnKey = 'fn' + key; + self.state[fnKey] = {vars: [], body: [], own: {}}; + self.state.computing = fnKey; + var intoId = self.nextId(); + self.recurse(watch, intoId); + self.return_(intoId); + self.state.inputs.push(fnKey); + watch.watchId = key; + }); + this.state.computing = 'fn'; + this.stage = 'main'; + this.recurse(ast); + var fnString = + // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. + // This is a workaround for this until we do a better job at only removing the prefix only when we should. + '"' + this.USE + ' ' + this.STRICT + '";\n' + + this.filterPrefix() + + 'var fn=' + this.generateFunction('fn', 's,l,a,i') + + extra + + this.watchFns() + + 'return fn;'; + + /* jshint -W054 */ + var fn = (new Function('$filter', + 'ensureSafeMemberName', + 'ensureSafeObject', + 'ensureSafeFunction', + 'ifDefined', + 'plus', + 'text', + fnString))( + this.$filter, + ensureSafeMemberName, + ensureSafeObject, + ensureSafeFunction, + ifDefined, + plusFn, + expression); + /* jshint +W054 */ + this.state = this.stage = undefined; + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + USE: 'use', + + STRICT: 'strict', + + watchFns: function() { + var result = []; + var fns = this.state.inputs; + var self = this; + forEach(fns, function(name) { + result.push('var ' + name + '=' + self.generateFunction(name, 's')); + }); + if (fns.length) { + result.push('fn.inputs=[' + fns.join(',') + '];'); + } + return result.join(''); + }, + + generateFunction: function(name, params) { + return 'function(' + params + '){' + + this.varsPrefix(name) + + this.body(name) + + '};'; + }, + + filterPrefix: function() { + var parts = []; + var self = this; + forEach(this.state.filters, function(id, filter) { + parts.push(id + '=$filter(' + self.escape(filter) + ')'); + }); + if (parts.length) return 'var ' + parts.join(',') + ';'; + return ''; + }, + + varsPrefix: function(section) { + return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; + }, + + body: function(section) { + return this.state[section].body.join(''); + }, + + recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var left, right, self = this, args, expression; + recursionFn = recursionFn || noop; + if (!skipWatchIdCheck && isDefined(ast.watchId)) { + intoId = intoId || this.nextId(); + this.if_('i', + this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), + this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) + ); + return; + } + switch (ast.type) { + case AST.Program: + forEach(ast.body, function(expression, pos) { + self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); + if (pos !== ast.body.length - 1) { + self.current().body.push(right, ';'); + } else { + self.return_(right); + } + }); + break; + case AST.Literal: + expression = this.escape(ast.value); + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.UnaryExpression: + this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); + expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.BinaryExpression: + this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); + this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); + if (ast.operator === '+') { + expression = this.plus(left, right); + } else if (ast.operator === '-') { + expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); + } else { + expression = '(' + left + ')' + ast.operator + '(' + right + ')'; + } + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.LogicalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.left, intoId); + self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); + recursionFn(intoId); + break; + case AST.ConditionalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.test, intoId); + self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); + recursionFn(intoId); + break; + case AST.Identifier: + intoId = intoId || this.nextId(); + if (nameId) { + nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); + nameId.computed = false; + nameId.name = ast.name; + } + ensureSafeMemberName(ast.name); + self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), + function() { + self.if_(self.stage === 'inputs' || 's', function() { + if (create && create !== 1) { + self.if_( + self.not(self.nonComputedMember('s', ast.name)), + self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); + } + self.assign(intoId, self.nonComputedMember('s', ast.name)); + }); + }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) + ); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { + self.addEnsureSafeObject(intoId); + } + recursionFn(intoId); + break; + case AST.MemberExpression: + left = nameId && (nameId.context = this.nextId()) || this.nextId(); + intoId = intoId || this.nextId(); + self.recurse(ast.object, left, undefined, function() { + self.if_(self.notNull(left), function() { + if (ast.computed) { + right = self.nextId(); + self.recurse(ast.property, right); + self.addEnsureSafeMemberName(right); + if (create && create !== 1) { + self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); + } + expression = self.ensureSafeObject(self.computedMember(left, right)); + self.assign(intoId, expression); + if (nameId) { + nameId.computed = true; + nameId.name = right; + } + } else { + ensureSafeMemberName(ast.property.name); + if (create && create !== 1) { + self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); + } + expression = self.nonComputedMember(left, ast.property.name); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { + expression = self.ensureSafeObject(expression); + } + self.assign(intoId, expression); + if (nameId) { + nameId.computed = false; + nameId.name = ast.property.name; + } + } + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }, !!create); + break; + case AST.CallExpression: + intoId = intoId || this.nextId(); + if (ast.filter) { + right = self.filter(ast.callee.name); + args = []; + forEach(ast.arguments, function(expr) { + var argument = self.nextId(); + self.recurse(expr, argument); + args.push(argument); + }); + expression = right + '(' + args.join(',') + ')'; + self.assign(intoId, expression); + recursionFn(intoId); + } else { + right = self.nextId(); + left = {}; + args = []; + self.recurse(ast.callee, right, left, function() { + self.if_(self.notNull(right), function() { + self.addEnsureSafeFunction(right); + forEach(ast.arguments, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(self.ensureSafeObject(argument)); + }); + }); + if (left.name) { + if (!self.state.expensiveChecks) { + self.addEnsureSafeObject(left.context); + } + expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; + } else { + expression = right + '(' + args.join(',') + ')'; + } + expression = self.ensureSafeObject(expression); + self.assign(intoId, expression); + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }); + } + break; + case AST.AssignmentExpression: + right = this.nextId(); + left = {}; + if (!isAssignable(ast.left)) { + throw $parseMinErr('lval', 'Trying to assing a value to a non l-value'); + } + this.recurse(ast.left, undefined, left, function() { + self.if_(self.notNull(left.context), function() { + self.recurse(ast.right, right); + self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); + expression = self.member(left.context, left.name, left.computed) + ast.operator + right; + self.assign(intoId, expression); + recursionFn(intoId || expression); + }); + }, 1); + break; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(argument); + }); + }); + expression = '[' + args.join(',') + ']'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + self.recurse(property.value, self.nextId(), undefined, function(expr) { + args.push(self.escape( + property.key.type === AST.Identifier ? property.key.name : + ('' + property.key.value)) + + ':' + expr); + }); + }); + expression = '{' + args.join(',') + '}'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ThisExpression: + this.assign(intoId, 's'); + recursionFn('s'); + break; + case AST.NGValueParameter: + this.assign(intoId, 'v'); + recursionFn('v'); + break; + } + }, + + getHasOwnProperty: function(element, property) { + var key = element + '.' + property; + var own = this.current().own; + if (!own.hasOwnProperty(key)) { + own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); + } + return own[key]; + }, + + assign: function(id, value) { + if (!id) return; + this.current().body.push(id, '=', value, ';'); + return id; + }, + + filter: function(filterName) { + if (!this.state.filters.hasOwnProperty(filterName)) { + this.state.filters[filterName] = this.nextId(true); + } + return this.state.filters[filterName]; + }, + + ifDefined: function(id, defaultValue) { + return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; + }, + + plus: function(left, right) { + return 'plus(' + left + ',' + right + ')'; + }, + + return_: function(id) { + this.current().body.push('return ', id, ';'); + }, + + if_: function(test, alternate, consequent) { + if (test === true) { + alternate(); + } else { + var body = this.current().body; + body.push('if(', test, '){'); + alternate(); + body.push('}'); + if (consequent) { + body.push('else{'); + consequent(); + body.push('}'); + } + } + }, + + not: function(expression) { + return '!(' + expression + ')'; + }, + + notNull: function(expression) { + return expression + '!=null'; + }, + + nonComputedMember: function(left, right) { + return left + '.' + right; + }, + + computedMember: function(left, right) { + return left + '[' + right + ']'; + }, + + member: function(left, right, computed) { + if (computed) return this.computedMember(left, right); + return this.nonComputedMember(left, right); + }, + + addEnsureSafeObject: function(item) { + this.current().body.push(this.ensureSafeObject(item), ';'); + }, + + addEnsureSafeMemberName: function(item) { + this.current().body.push(this.ensureSafeMemberName(item), ';'); + }, + + addEnsureSafeFunction: function(item) { + this.current().body.push(this.ensureSafeFunction(item), ';'); + }, + + ensureSafeObject: function(item) { + return 'ensureSafeObject(' + item + ',text)'; + }, + + ensureSafeMemberName: function(item) { + return 'ensureSafeMemberName(' + item + ',text)'; + }, + + ensureSafeFunction: function(item) { + return 'ensureSafeFunction(' + item + ',text)'; + }, + + lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var self = this; + return function() { + self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); + }; + }, + + lazyAssign: function(id, value) { + var self = this; + return function() { + self.assign(id, value); + }; + }, + + stringEscapeRegex: /[^ a-zA-Z0-9]/g, + + stringEscapeFn: function(c) { + return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); + }, + + escape: function(value) { + if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; + if (isNumber(value)) return value.toString(); + if (value === true) return 'true'; + if (value === false) return 'false'; + if (value === null) return 'null'; + if (typeof value === 'undefined') return 'undefined'; + + throw $parseMinErr('esc', 'IMPOSSIBLE'); + }, + + nextId: function(skip, init) { + var id = 'v' + (this.state.nextId++); + if (!skip) { + this.current().vars.push(id + (init ? '=' + init : '')); + } + return id; + }, + + current: function() { + return this.state[this.state.computing]; + } +}; + + +function ASTInterpreter(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTInterpreter.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.expression = expression; + this.expensiveChecks = expensiveChecks; + findConstantAndWatchExpressions(ast, self.$filter); + var assignable; + var assign; + if ((assignable = assignableAST(ast))) { + assign = this.recurse(assignable); + } + var toWatch = getInputs(ast.body); + var inputs; + if (toWatch) { + inputs = []; + forEach(toWatch, function(watch, key) { + var input = self.recurse(watch); + watch.input = input; + inputs.push(input); + watch.watchId = key; + }); + } + var expressions = []; + forEach(ast.body, function(expression) { + expressions.push(self.recurse(expression.expression)); + }); + var fn = ast.body.length === 0 ? function() {} : + ast.body.length === 1 ? expressions[0] : + function(scope, locals) { + var lastValue; + forEach(expressions, function(exp) { + lastValue = exp(scope, locals); + }); + return lastValue; + }; + if (assign) { + fn.assign = function(scope, value, locals) { + return assign(scope, locals, value); + }; + } + if (inputs) { + fn.inputs = inputs; + } + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + recurse: function(ast, context, create) { + var left, right, self = this, args, expression; + if (ast.input) { + return this.inputs(ast.input, ast.watchId); + } + switch (ast.type) { + case AST.Literal: + return this.value(ast.value, context); + case AST.UnaryExpression: + right = this.recurse(ast.argument); + return this['unary' + ast.operator](right, context); + case AST.BinaryExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.LogicalExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.ConditionalExpression: + return this['ternary?:']( + this.recurse(ast.test), + this.recurse(ast.alternate), + this.recurse(ast.consequent), + context + ); + case AST.Identifier: + ensureSafeMemberName(ast.name, self.expression); + return self.identifier(ast.name, + self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), + context, create, self.expression); + case AST.MemberExpression: + left = this.recurse(ast.object, false, !!create); + if (!ast.computed) { + ensureSafeMemberName(ast.property.name, self.expression); + right = ast.property.name; + } + if (ast.computed) right = this.recurse(ast.property); + return ast.computed ? + this.computedMember(left, right, context, create, self.expression) : + this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); + case AST.CallExpression: + args = []; + forEach(ast.arguments, function(expr) { + args.push(self.recurse(expr)); + }); + if (ast.filter) right = this.$filter(ast.callee.name); + if (!ast.filter) right = this.recurse(ast.callee, true); + return ast.filter ? + function(scope, locals, assign, inputs) { + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(args[i](scope, locals, assign, inputs)); + } + var value = right.apply(undefined, values, inputs); + return context ? {context: undefined, name: undefined, value: value} : value; + } : + function(scope, locals, assign, inputs) { + var rhs = right(scope, locals, assign, inputs); + var value; + if (rhs.value != null) { + ensureSafeObject(rhs.context, self.expression); + ensureSafeFunction(rhs.value, self.expression); + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); + } + value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); + } + return context ? {value: value} : value; + }; + case AST.AssignmentExpression: + left = this.recurse(ast.left, true, 1); + right = this.recurse(ast.right); + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + ensureSafeObject(lhs.value, self.expression); + lhs.context[lhs.name] = rhs; + return context ? {value: rhs} : rhs; + }; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + args.push(self.recurse(expr)); + }); + return function(scope, locals, assign, inputs) { + var value = []; + for (var i = 0; i < args.length; ++i) { + value.push(args[i](scope, locals, assign, inputs)); + } + return context ? {value: value} : value; + }; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + args.push({key: property.key.type === AST.Identifier ? + property.key.name : + ('' + property.key.value), + value: self.recurse(property.value) + }); + }); + return function(scope, locals, assign, inputs) { + var value = {}; + for (var i = 0; i < args.length; ++i) { + value[args[i].key] = args[i].value(scope, locals, assign, inputs); + } + return context ? {value: value} : value; + }; + case AST.ThisExpression: + return function(scope) { + return context ? {value: scope} : scope; + }; + case AST.NGValueParameter: + return function(scope, locals, assign, inputs) { + return context ? {value: assign} : assign; + }; + } + }, + + 'unary+': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = +arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary-': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = -arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary!': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = !argument(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary+': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = plusFn(lhs, rhs); + return context ? {value: arg} : arg; + }; + }, + 'binary-': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); + return context ? {value: arg} : arg; + }; + }, + 'binary*': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary/': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary%': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary===': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary&&': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary||': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'ternary?:': function(test, alternate, consequent, context) { + return function(scope, locals, assign, inputs) { + var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + value: function(value, context) { + return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; + }, + identifier: function(name, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var base = locals && (name in locals) ? locals : scope; + if (create && create !== 1 && base && !(base[name])) { + base[name] = {}; + } + var value = base ? base[name] : undefined; + if (expensiveChecks) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: base, name: name, value: value}; + } else { + return value; + } + }; + }, + computedMember: function(left, right, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs; + var value; + if (lhs != null) { + rhs = right(scope, locals, assign, inputs); + ensureSafeMemberName(rhs, expression); + if (create && create !== 1 && lhs && !(lhs[rhs])) { + lhs[rhs] = {}; + } + value = lhs[rhs]; + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: rhs, value: value}; + } else { + return value; + } + }; + }, + nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + if (create && create !== 1 && lhs && !(lhs[right])) { + lhs[right] = {}; + } + var value = lhs != null ? lhs[right] : undefined; + if (expensiveChecks || isPossiblyDangerousMemberName(right)) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: right, value: value}; + } else { + return value; + } + }; + }, + inputs: function(input, watchId) { + return function(scope, value, locals, inputs) { + if (inputs) return inputs[watchId]; + return input(scope, value, locals); + }; + } +}; + +/** + * @constructor + */ +var Parser = function(lexer, $filter, options) { + this.lexer = lexer; + this.$filter = $filter; + this.options = options; + this.ast = new AST(this.lexer); + this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : + new ASTCompiler(this.ast, $filter); +}; + +Parser.prototype = { + constructor: Parser, + + parse: function(text) { + return this.astCompiler.compile(text, this.options.expensiveChecks); + } +}; + +////////////////////////////////////////////////// +// Parser helper functions +////////////////////////////////////////////////// + +function setter(obj, path, setValue, fullExp) { + ensureSafeObject(obj, fullExp); + + var element = path.split('.'), key; + for (var i = 0; element.length > 1; i++) { + key = ensureSafeMemberName(element.shift(), fullExp); + var propertyObj = ensureSafeObject(obj[key], fullExp); + if (!propertyObj) { + propertyObj = {}; + obj[key] = propertyObj; + } + obj = propertyObj; + } + key = ensureSafeMemberName(element.shift(), fullExp); + ensureSafeObject(obj[key], fullExp); + obj[key] = setValue; + return setValue; +} + +var getterFnCacheDefault = createMap(); +var getterFnCacheExpensive = createMap(); + +function isPossiblyDangerousMemberName(name) { + return name == 'constructor'; +} + +var objectValueOf = Object.prototype.valueOf; + +function getValueOf(value) { + return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); +} + +/////////////////////////////////// + +/** + * @ngdoc service + * @name $parse + * @kind function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + * ```js + * var getter = $parse('user.name'); + * var setter = getter.assign; + * var context = {user:{name:'angular'}}; + * var locals = {user:{name:'local'}}; + * + * expect(getter(context)).toEqual('angular'); + * setter(context, 'newValue'); + * expect(context.user.name).toEqual('newValue'); + * expect(getter(context, locals)).toEqual('local'); + * ``` + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ + + +/** + * @ngdoc provider + * @name $parseProvider + * + * @description + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} + * service. + */ +function $ParseProvider() { + var cacheDefault = createMap(); + var cacheExpensive = createMap(); + + this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { + var $parseOptions = { + csp: $sniffer.csp, + expensiveChecks: false + }, + $parseOptionsExpensive = { + csp: $sniffer.csp, + expensiveChecks: true + }; + + return function $parse(exp, interceptorFn, expensiveChecks) { + var parsedExpression, oneTime, cacheKey; + + switch (typeof exp) { + case 'string': + exp = exp.trim(); + cacheKey = exp; + + var cache = (expensiveChecks ? cacheExpensive : cacheDefault); + parsedExpression = cache[cacheKey]; + + if (!parsedExpression) { + if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { + oneTime = true; + exp = exp.substring(2); + } + var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; + var lexer = new Lexer(parseOptions); + var parser = new Parser(lexer, $filter, parseOptions); + parsedExpression = parser.parse(exp); + if (parsedExpression.constant) { + parsedExpression.$$watchDelegate = constantWatchDelegate; + } else if (oneTime) { + parsedExpression.$$watchDelegate = parsedExpression.literal ? + oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; + } else if (parsedExpression.inputs) { + parsedExpression.$$watchDelegate = inputsWatchDelegate; + } + cache[cacheKey] = parsedExpression; + } + return addInterceptor(parsedExpression, interceptorFn); + + case 'function': + return addInterceptor(exp, interceptorFn); + + default: + return noop; + } + }; + + function expressionInputDirtyCheck(newValue, oldValueOfValue) { + + if (newValue == null || oldValueOfValue == null) { // null/undefined + return newValue === oldValueOfValue; + } + + if (typeof newValue === 'object') { + + // attempt to convert the value to a primitive type + // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can + // be cheaply dirty-checked + newValue = getValueOf(newValue); + + if (typeof newValue === 'object') { + // objects/arrays are not supported - deep-watching them would be too expensive + return false; + } + + // fall-through to the primitive equality check + } + + //Primitive or NaN + return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); + } + + function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { + var inputExpressions = parsedExpression.inputs; + var lastResult; + + if (inputExpressions.length === 1) { + var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails + inputExpressions = inputExpressions[0]; + return scope.$watch(function expressionInputWatch(scope) { + var newInputValue = inputExpressions(scope); + if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { + lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); + oldInputValueOf = newInputValue && getValueOf(newInputValue); + } + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + var oldInputValueOfValues = []; + var oldInputValues = []; + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails + oldInputValues[i] = null; + } + + return scope.$watch(function expressionInputsWatch(scope) { + var changed = false; + + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + var newInputValue = inputExpressions[i](scope); + if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { + oldInputValues[i] = newInputValue; + oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); + } + } + + if (changed) { + lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); + } + + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.apply(this, arguments); + } + if (isDefined(value)) { + scope.$$postDigest(function() { + if (isDefined(lastValue)) { + unwatch(); + } + }); + } + }, objectEquality); + } + + function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.call(this, value, old, scope); + } + if (isAllDefined(value)) { + scope.$$postDigest(function() { + if (isAllDefined(lastValue)) unwatch(); + }); + } + }, objectEquality); + + function isAllDefined(value) { + var allDefined = true; + forEach(value, function(val) { + if (!isDefined(val)) allDefined = false; + }); + return allDefined; + } + } + + function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch; + return unwatch = scope.$watch(function constantWatch(scope) { + return parsedExpression(scope); + }, function constantListener(value, old, scope) { + if (isFunction(listener)) { + listener.apply(this, arguments); + } + unwatch(); + }, objectEquality); + } + + function addInterceptor(parsedExpression, interceptorFn) { + if (!interceptorFn) return parsedExpression; + var watchDelegate = parsedExpression.$$watchDelegate; + + var regularWatch = + watchDelegate !== oneTimeLiteralWatchDelegate && + watchDelegate !== oneTimeWatchDelegate; + + var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + return interceptorFn(value, scope, locals); + } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + var result = interceptorFn(value, scope, locals); + // we only return the interceptor's result if the + // initial value is defined (for bind-once) + return isDefined(value) ? result : value; + }; + + // Propagate $$watchDelegates other then inputsWatchDelegate + if (parsedExpression.$$watchDelegate && + parsedExpression.$$watchDelegate !== inputsWatchDelegate) { + fn.$$watchDelegate = parsedExpression.$$watchDelegate; + } else if (!interceptorFn.$stateful) { + // If there is an interceptor, but no watchDelegate then treat the interceptor like + // we treat filters - it is assumed to be a pure function unless flagged with $stateful + fn.$$watchDelegate = inputsWatchDelegate; + fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; + } + + return fn; + } + }]; +} + +/** + * @ngdoc service + * @name $q + * @requires $rootScope + * + * @description + * A service that helps you run functions asynchronously, and use their return values (or exceptions) + * when they are done processing. + * + * This is an implementation of promises/deferred objects inspired by + * [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred + * implementations, and the other which resembles ES6 promises to some degree. + * + * # $q constructor + * + * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` + * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony, + * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). + * + * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are + * available yet. + * + * It can be used like so: + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * // perform some asynchronous operation, resolve or reject the promise when appropriate. + * return $q(function(resolve, reject) { + * setTimeout(function() { + * if (okToGreet(name)) { + * resolve('Hello, ' + name + '!'); + * } else { + * reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * }); + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }); + * ``` + * + * Note: progress/notify callbacks are not currently supported via the ES6-style interface. + * + * However, the more traditional CommonJS-style usage is still available, and documented below. + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * var deferred = $q.defer(); + * + * setTimeout(function() { + * deferred.notify('About to greet ' + name + '.'); + * + * if (okToGreet(name)) { + * deferred.resolve('Hello, ' + name + '!'); + * } else { + * deferred.reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * + * return deferred.promise; + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }, function(update) { + * alert('Got notification: ' + update); + * }); + * ``` + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of guarantees that promise and deferred APIs make, see + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion, as well as the status + * of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * - `notify(value)` - provides updates on the status of the promise's execution. This may be called + * multiple times before the promise is either resolved or rejected. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously + * as soon as the result is available. The callbacks are called with a single argument: the result + * or rejection reason. Additionally, the notify callback may be called zero or more times to + * provide a progress indication, before the promise is resolved or rejected. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved + * with the value which is resolved in that promise using + * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). + * It also notifies via the return value of the `notifyCallback` method. The promise cannot be + * resolved or rejected from the notifyCallback method. + * + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` + * + * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * # Chaining promises + * + * Because calling the `then` method of a promise returns a new derived promise, it is easily + * possible to create a chain of promises: + * + * ```js + * promiseB = promiseA.then(function(result) { + * return result + 1; + * }); + * + * // promiseB will be resolved immediately after promiseA is resolved and its value + * // will be the result of promiseA incremented by 1 + * ``` + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful APIs like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are two main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + * ```js + * it('should simulate promise', inject(function($q, $rootScope) { + * var deferred = $q.defer(); + * var promise = deferred.promise; + * var resolvedValue; + * + * promise.then(function(value) { resolvedValue = value; }); + * expect(resolvedValue).toBeUndefined(); + * + * // Simulate resolving of promise + * deferred.resolve(123); + * // Note that the 'then' function does not get called synchronously. + * // This is because we want the promise API to always be async, whether or not + * // it got called synchronously or asynchronously. + * expect(resolvedValue).toBeUndefined(); + * + * // Propagate promise resolution to 'then' functions using $apply(). + * $rootScope.$apply(); + * expect(resolvedValue).toEqual(123); + * })); + * ``` + * + * @param {function(function, function)} resolver Function which is responsible for resolving or + * rejecting the newly created promise. The first parameter is a function which resolves the + * promise, the second parameter is a function which rejects the promise. + * + * @returns {Promise} The newly created promise. + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + +function $$QProvider() { + this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { + return qFactory(function(callback) { + $browser.defer(callback); + }, $exceptionHandler); + }]; +} + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + var $qMinErr = minErr('$q', TypeError); + function callOnce(self, resolveFn, rejectFn) { + var called = false; + function wrap(fn) { + return function(value) { + if (called) return; + called = true; + fn.call(self, value); + }; + } + + return [wrap(resolveFn), wrap(rejectFn)]; + } + + /** + * @ngdoc method + * @name ng.$q#defer + * @kind function + * + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + return new Deferred(); + }; + + function Promise() { + this.$$state = { status: 0 }; + } + + Promise.prototype = { + then: function(onFulfilled, onRejected, progressBack) { + var result = new Deferred(); + + this.$$state.pending = this.$$state.pending || []; + this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); + if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); + + return result.promise; + }, + + "catch": function(callback) { + return this.then(null, callback); + }, + + "finally": function(callback, progressBack) { + return this.then(function(value) { + return handleCallback(value, true, callback); + }, function(error) { + return handleCallback(error, false, callback); + }, progressBack); + } + }; + + //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native + function simpleBind(context, fn) { + return function(value) { + fn.call(context, value); + }; + } + + function processQueue(state) { + var fn, deferred, pending; + + pending = state.pending; + state.processScheduled = false; + state.pending = undefined; + for (var i = 0, ii = pending.length; i < ii; ++i) { + deferred = pending[i][0]; + fn = pending[i][state.status]; + try { + if (isFunction(fn)) { + deferred.resolve(fn(state.value)); + } else if (state.status === 1) { + deferred.resolve(state.value); + } else { + deferred.reject(state.value); + } + } catch (e) { + deferred.reject(e); + exceptionHandler(e); + } + } + } + + function scheduleProcessQueue(state) { + if (state.processScheduled || !state.pending) return; + state.processScheduled = true; + nextTick(function() { processQueue(state); }); + } + + function Deferred() { + this.promise = new Promise(); + //Necessary to support unbound execution :/ + this.resolve = simpleBind(this, this.resolve); + this.reject = simpleBind(this, this.reject); + this.notify = simpleBind(this, this.notify); + } + + Deferred.prototype = { + resolve: function(val) { + if (this.promise.$$state.status) return; + if (val === this.promise) { + this.$$reject($qMinErr( + 'qcycle', + "Expected promise to be resolved with value other than itself '{0}'", + val)); + } else { + this.$$resolve(val); + } + + }, + + $$resolve: function(val) { + var then, fns; + + fns = callOnce(this, this.$$resolve, this.$$reject); + try { + if ((isObject(val) || isFunction(val))) then = val && val.then; + if (isFunction(then)) { + this.promise.$$state.status = -1; + then.call(val, fns[0], fns[1], this.notify); + } else { + this.promise.$$state.value = val; + this.promise.$$state.status = 1; + scheduleProcessQueue(this.promise.$$state); + } + } catch (e) { + fns[1](e); + exceptionHandler(e); + } + }, + + reject: function(reason) { + if (this.promise.$$state.status) return; + this.$$reject(reason); + }, + + $$reject: function(reason) { + this.promise.$$state.value = reason; + this.promise.$$state.status = 2; + scheduleProcessQueue(this.promise.$$state); + }, + + notify: function(progress) { + var callbacks = this.promise.$$state.pending; + + if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { + nextTick(function() { + var callback, result; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + result = callbacks[i][0]; + callback = callbacks[i][3]; + try { + result.notify(isFunction(callback) ? callback(progress) : progress); + } catch (e) { + exceptionHandler(e); + } + } + }); + } + } + }; + + /** + * @ngdoc method + * @name $q#reject + * @kind function + * + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + * ```js + * promiseB = promiseA.then(function(result) { + * // success: do something and resolve promiseB + * // with the old or a new result + * return result; + * }, function(reason) { + * // error: handle the error if possible and + * // resolve promiseB with newPromiseOrValue, + * // otherwise forward the rejection to promiseB + * if (canHandle(reason)) { + * // handle the error and recover + * return newPromiseOrValue; + * } + * return $q.reject(reason); + * }); + * ``` + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + var result = new Deferred(); + result.reject(reason); + return result.promise; + }; + + var makePromise = function makePromise(value, resolved) { + var result = new Deferred(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + }; + + var handleCallback = function handleCallback(value, isResolved, callback) { + var callbackOutput = null; + try { + if (isFunction(callback)) callbackOutput = callback(); + } catch (e) { + return makePromise(e, false); + } + if (isPromiseLike(callbackOutput)) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + }; + + /** + * @ngdoc method + * @name $q#when + * @kind function + * + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + + + var when = function(value, callback, errback, progressBack) { + var result = new Deferred(); + result.resolve(value); + return result.promise.then(callback, errback, progressBack); + }; + + /** + * @ngdoc method + * @name $q#resolve + * @kind function + * + * @description + * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + var resolve = when; + + /** + * @ngdoc method + * @name $q#all + * @kind function + * + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved with a rejection, this resulting promise will be rejected + * with the same rejection value. + */ + + function all(promises) { + var deferred = new Deferred(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + when(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + var $Q = function Q(resolver) { + if (!isFunction(resolver)) { + throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); + } + + if (!(this instanceof Q)) { + // More useful when $Q is the Promise itself. + return new Q(resolver); + } + + var deferred = new Deferred(); + + function resolveFn(value) { + deferred.resolve(value); + } + + function rejectFn(reason) { + deferred.reject(reason); + } + + resolver(resolveFn, rejectFn); + + return deferred.promise; + }; + + $Q.defer = defer; + $Q.reject = reject; + $Q.when = when; + $Q.resolve = resolve; + $Q.all = all; + + return $Q; +} + +function $$RAFProvider() { //rAF + this.$get = ['$window', '$timeout', function($window, $timeout) { + var requestAnimationFrame = $window.requestAnimationFrame || + $window.webkitRequestAnimationFrame; + + var cancelAnimationFrame = $window.cancelAnimationFrame || + $window.webkitCancelAnimationFrame || + $window.webkitCancelRequestAnimationFrame; + + var rafSupported = !!requestAnimationFrame; + var rafFn = rafSupported + ? function(fn) { + var id = requestAnimationFrame(fn); + return function() { + cancelAnimationFrame(id); + }; + } + : function(fn) { + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 + return function() { + $timeout.cancel(timer); + }; + }; + + queueFn.supported = rafSupported; + + var cancelLastRAF; + var taskCount = 0; + var taskQueue = []; + return queueFn; + + function flush() { + for (var i = 0; i < taskQueue.length; i++) { + var task = taskQueue[i]; + if (task) { + taskQueue[i] = null; + task(); + } + } + taskCount = taskQueue.length = 0; + } + + function queueFn(asyncFn) { + var index = taskQueue.length; + + taskCount++; + taskQueue.push(asyncFn); + + if (index === 0) { + cancelLastRAF = rafFn(flush); + } + + return function cancelQueueFn() { + if (index >= 0) { + taskQueue[index] = null; + index = null; + + if (--taskCount === 0 && cancelLastRAF) { + cancelLastRAF(); + cancelLastRAF = null; + taskQueue.length = 0; + } + } + }; + } + }]; +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - this means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (unshift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in middle are expensive so we use linked list + * + * There are few watches then a lot of observers. This is why you don't want the observer to be + * implemented in the same way as watch. Watch requires return of initialization function which + * are expensive to construct. + */ + + +/** + * @ngdoc provider + * @name $rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc method + * @name $rootScopeProvider#digestTtl + * @description + * + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that the dependencies between `$watch`s will result in + * several digest iterations. However if an application needs more than the default 10 digest + * iterations for its model to stabilize then you should investigate what is causing the model to + * continuously change during the digest. + * + * Increasing the TTL could have performance implications, so you should not change it without + * proper justification. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc service + * @name $rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are descendant scopes of the root scope. Scopes provide separation + * between the model and the view, via a mechanism for watching the model for changes. + * They also provide an event emission/broadcast and subscription facility. See the + * {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider() { + var TTL = 10; + var $rootScopeMinErr = minErr('$rootScope'); + var lastDirtyWatch = null; + var applyAsyncId = null; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + function createChildScopeClass(parent) { + function ChildScope() { + this.$$watchers = this.$$nextSibling = + this.$$childHead = this.$$childTail = null; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$id = nextUid(); + this.$$ChildScope = null; + } + ChildScope.prototype = parent; + return ChildScope; + } + + this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', + function($injector, $exceptionHandler, $parse, $browser) { + + function destroyChildScope($event) { + $event.currentScope.$$destroyed = true; + } + + /** + * @ngdoc type + * @name $rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link auto.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) + * + * Here is a simple scope snippet to show how you can interact with the scope. + * ```html + * + * ``` + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + * ```js + var parent = $rootScope; + var child = parent.$new(); + + parent.salutation = "Hello"; + expect(child.salutation).toEqual('Hello'); + + child.salutation = "Welcome"; + expect(child.salutation).toEqual('Welcome'); + expect(parent.salutation).toEqual('Hello'); + * ``` + * + * When interacting with `Scope` in tests, additional helper methods are available on the + * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional + * details. + * + * + * @param {Object.=} providers Map of service factory which need to be + * provided for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy + * when unit-testing and having the need to override a default + * service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this.$root = this; + this.$$destroyed = false; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$$isolateBindings = null; + } + + /** + * @ngdoc property + * @name $rootScope.Scope#$id + * + * @description + * Unique scope ID (monotonically increasing) useful for debugging. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$parent + * + * @description + * Reference to the parent scope. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$root + * + * @description + * Reference to the root scope. + */ + + Scope.prototype = { + constructor: Scope, + /** + * @ngdoc method + * @name $rootScope.Scope#$new + * @kind function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. + * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is + * desired for the scope and its child scopes to be permanently detached from the parent and + * thus stop participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets, it is useful for the widget to not accidentally read parent + * state. + * + * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` + * of the newly created scope. Defaults to `this` scope if not provided. + * This is used when creating a transclude scope to correctly place it + * in the scope hierarchy while maintaining the correct prototypical + * inheritance. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate, parent) { + var child; + + parent = parent || this; + + if (isolate) { + child = new Scope(); + child.$root = this.$root; + } else { + // Only create a child scope class if somebody asks for one, + // but cache it to allow the VM to optimize lookups. + if (!this.$$ChildScope) { + this.$$ChildScope = createChildScopeClass(this); + } + child = new this.$$ChildScope(); + } + child.$parent = parent; + child.$$prevSibling = parent.$$childTail; + if (parent.$$childHead) { + parent.$$childTail.$$nextSibling = child; + parent.$$childTail = child; + } else { + parent.$$childHead = parent.$$childTail = child; + } + + // When the new scope is not isolated or we inherit from `this`, and + // the parent scope is destroyed, the property `$$destroyed` is inherited + // prototypically. In all other cases, this property needs to be set + // when the parent scope is destroyed. + // The listener needs to be added after the parent is set + if (isolate || parent != this) child.$on('$destroy', destroyChildScope); + + return child; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watch + * @kind function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest + * $digest()} and should return the value that will be watched. (Since + * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the + * `watchExpression` can execute multiple times per + * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). Inequality is determined according to reference inequality, + * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) + * via the `!==` Javascript operator, unless `objectEquality == true` + * (see next point) + * - When `objectEquality == true`, inequality of the `watchExpression` is determined + * according to the {@link angular.equals} function. To save the value of the object for + * later comparison, the {@link angular.copy} function is used. This therefore means that + * watching complex objects will have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. + * This is achieved by rerunning the watchers until no changes are detected. The rerun + * iteration limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` + * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a + * change is detected, be prepared for multiple calls to your listener.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * + * + * # Example + * ```js + // let's assume that scope was dependency injected as the $rootScope + var scope = $rootScope; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + + + + // Using a function as a watchExpression + var food; + scope.foodCounter = 0; + expect(scope.foodCounter).toEqual(0); + scope.$watch( + // This function returns the value being watched. It is called for each turn of the $digest loop + function() { return food; }, + // This is the change listener, called when the value returned from the above function changes + function(newValue, oldValue) { + if ( newValue !== oldValue ) { + // Only increment the counter if the value changed + scope.foodCounter = scope.foodCounter + 1; + } + } + ); + // No digest has been run so the counter will be zero + expect(scope.foodCounter).toEqual(0); + + // Run the digest but since food has not changed count will still be zero + scope.$digest(); + expect(scope.foodCounter).toEqual(0); + + // Update food and run digest. Now the counter will increment + food = 'cheeseburger'; + scope.$digest(); + expect(scope.foodCounter).toEqual(1); + + * ``` + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers + * a call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value + * of `watchExpression` changes. + * + * - `newVal` contains the current value of the `watchExpression` + * - `oldVal` contains the previous value of the `watchExpression` + * - `scope` refers to the current scope + * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of + * comparing for reference equality. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { + var get = $parse(watchExp); + + if (get.$$watchDelegate) { + return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); + } + var scope = this, + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: prettyPrintExpression || watchExp, + eq: !!objectEquality + }; + + lastDirtyWatch = null; + + if (!isFunction(listener)) { + watcher.fn = noop; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + incrementWatchersCount(this, 1); + + return function deregisterWatch() { + if (arrayRemove(array, watcher) >= 0) { + incrementWatchersCount(scope, -1); + } + lastDirtyWatch = null; + }; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchGroup + * @kind function + * + * @description + * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. + * If any one expression in the collection changes the `listener` is executed. + * + * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every + * call to $digest() to see if any items changes. + * - The `listener` is called whenever any expression in the `watchExpressions` array changes. + * + * @param {Array.} watchExpressions Array of expressions that will be individually + * watched using {@link ng.$rootScope.Scope#$watch $watch()} + * + * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any + * expression in `watchExpressions` changes + * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * The `scope` refers to the current scope. + * @returns {function()} Returns a de-registration function for all listeners. + */ + $watchGroup: function(watchExpressions, listener) { + var oldValues = new Array(watchExpressions.length); + var newValues = new Array(watchExpressions.length); + var deregisterFns = []; + var self = this; + var changeReactionScheduled = false; + var firstRun = true; + + if (!watchExpressions.length) { + // No expressions means we call the listener ASAP + var shouldCall = true; + self.$evalAsync(function() { + if (shouldCall) listener(newValues, newValues, self); + }); + return function deregisterWatchGroup() { + shouldCall = false; + }; + } + + if (watchExpressions.length === 1) { + // Special case size of one + return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { + newValues[0] = value; + oldValues[0] = oldValue; + listener(newValues, (value === oldValue) ? newValues : oldValues, scope); + }); + } + + forEach(watchExpressions, function(expr, i) { + var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { + newValues[i] = value; + oldValues[i] = oldValue; + if (!changeReactionScheduled) { + changeReactionScheduled = true; + self.$evalAsync(watchGroupAction); + } + }); + deregisterFns.push(unwatchFn); + }); + + function watchGroupAction() { + changeReactionScheduled = false; + + if (firstRun) { + firstRun = false; + listener(newValues, newValues, self); + } else { + listener(newValues, oldValues, self); + } + } + + return function deregisterWatchGroup() { + while (deregisterFns.length) { + deregisterFns.shift()(); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchCollection + * @kind function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays, this implies watching the array items; for object maps, this implies watching + * the properties). If a change is detected, the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every + * call to $digest() to see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include + * adding, removing, and moving items belonging to an object or array. + * + * + * # Example + * ```js + $scope.names = ['igor', 'matias', 'misko', 'james']; + $scope.dataCount = 4; + + $scope.$watchCollection('names', function(newNames, oldNames) { + $scope.dataCount = newNames.length; + }); + + expect($scope.dataCount).toEqual(4); + $scope.$digest(); + + //still at 4 ... no changes + expect($scope.dataCount).toEqual(4); + + $scope.names.pop(); + $scope.$digest(); + + //now there's been a change + expect($scope.dataCount).toEqual(3); + * ``` + * + * + * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The + * expression value should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the + * collection will trigger a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function called + * when a change is detected. + * - The `newCollection` object is the newly modified data obtained from the `obj` expression + * - The `oldCollection` object is a copy of the former collection data. + * Due to performance considerations, the`oldCollection` value is computed only if the + * `listener` function declares two or more arguments. + * - The `scope` argument refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the + * de-registration function is executed, the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + $watchCollectionInterceptor.$stateful = true; + + var self = this; + // the current value, updated on each dirty-check run + var newValue; + // a shallow copy of the newValue from the last dirty-check run, + // updated to match newValue during dirty-check run + var oldValue; + // a shallow copy of the newValue from when the last change happened + var veryOldValue; + // only track veryOldValue if the listener is asking for it + var trackVeryOldValue = (listener.length > 1); + var changeDetected = 0; + var changeDetector = $parse(obj, $watchCollectionInterceptor); + var internalArray = []; + var internalObject = {}; + var initRun = true; + var oldLength = 0; + + function $watchCollectionInterceptor(_value) { + newValue = _value; + var newLength, key, bothNaN, newItem, oldItem; + + // If the new value is undefined, then return undefined as the watch may be a one-time watch + if (isUndefined(newValue)) return; + + if (!isObject(newValue)) { // if primitive + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + oldItem = oldValue[i]; + newItem = newValue[i]; + + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[i] = newItem; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (newValue.hasOwnProperty(key)) { + newLength++; + newItem = newValue[key]; + oldItem = oldValue[key]; + + if (key in oldValue) { + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[key] = newItem; + } + } else { + oldLength++; + oldValue[key] = newItem; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for (key in oldValue) { + if (!newValue.hasOwnProperty(key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + if (initRun) { + initRun = false; + listener(newValue, newValue, self); + } else { + listener(newValue, veryOldValue, self); + } + + // make a copy for the next time a collection is changed + if (trackVeryOldValue) { + if (!isObject(newValue)) { + //primitive + veryOldValue = newValue; + } else if (isArrayLike(newValue)) { + veryOldValue = new Array(newValue.length); + for (var i = 0; i < newValue.length; i++) { + veryOldValue[i] = newValue[i]; + } + } else { // if object + veryOldValue = {}; + for (var key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + veryOldValue[key] = newValue[key]; + } + } + } + } + } + + return this.$watch(changeDetector, $watchCollectionAction); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$digest + * @kind function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and + * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} + * until no more listeners are firing. This means that it is possible to get into an infinite + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of + * iterations exceeds 10. + * + * Usually, you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#directive directives}. + * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within + * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with + * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. + * + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. + * + * # Example + * ```js + var scope = ...; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + * ``` + * + */ + $digest: function() { + var watch, value, last, + watchers, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, logMsg, asyncTask; + + beginPhase('$digest'); + // Check for changes to browser url that happened in sync before the call to $digest + $browser.$$checkUrlChange(); + + if (this === $rootScope && applyAsyncId !== null) { + // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then + // cancel the scheduled $apply and flush the queue of expressions to be evaluated. + $browser.defer.cancel(applyAsyncId); + flushApplyAsync(); + } + + lastDirtyWatch = null; + + do { // "while dirty" loop + dirty = false; + current = target; + + while (asyncQueue.length) { + try { + asyncTask = asyncQueue.shift(); + asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); + } catch (e) { + $exceptionHandler(e); + } + lastDirtyWatch = null; + } + + traverseScopesLoop: + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if (watch) { + if ((value = watch.get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value === 'number' && typeof last === 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + lastDirtyWatch = watch; + watch.last = watch.eq ? copy(value, null) : value; + watch.fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + watchLog[logIdx].push({ + msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, + newVal: value, + oldVal: last + }); + } + } else if (watch === lastDirtyWatch) { + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers + // have already been tested. + dirty = false; + break traverseScopesLoop; + } + } + } catch (e) { + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = ((current.$$watchersCount && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + // `break traverseScopesLoop;` takes us to here + + if ((dirty || asyncQueue.length) && !(ttl--)) { + clearPhase(); + throw $rootScopeMinErr('infdig', + '{0} $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: {1}', + TTL, watchLog); + } + + } while (dirty || asyncQueue.length); + + clearPhase(); + + while (postDigestQueue.length) { + try { + postDigestQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + }, + + + /** + * @ngdoc event + * @name $rootScope.Scope#$destroy + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + + /** + * @ngdoc method + * @name $rootScope.Scope#$destroy + * @kind function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it a chance to + * perform any necessary cleanup. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + $destroy: function() { + // We can't destroy a scope that has been already destroyed. + if (this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + + if (this === $rootScope) { + //Remove handlers attached to window when $rootScope is removed + $browser.$$applicationDestroyed(); + } + + incrementWatchersCount(this, -this.$$watchersCount); + for (var eventName in this.$$listenerCount) { + decrementListenerCount(this, this.$$listenerCount[eventName], eventName); + } + + // sever all the references to parent scopes (after this cleanup, the current scope should + // not be retained by any of our references and should be eligible for garbage collection) + if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // Disable listeners, watchers and apply/digest methods + this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; + this.$on = this.$watch = this.$watchGroup = function() { return noop; }; + this.$$listeners = {}; + + // All of the code below is bogus code that works around V8's memory leak via optimized code + // and inline caches. + // + // see: + // - https://code.google.com/p/v8/issues/detail?id=2073#c26 + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = this.$root = this.$$watchers = null; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$eval + * @kind function + * + * @description + * Executes the `expression` on the current scope and returns the result. Any exceptions in + * the expression are propagated (uncaught). This is useful when evaluating Angular + * expressions. + * + * # Example + * ```js + var scope = ng.$rootScope.Scope(); + scope.a = 1; + scope.b = 2; + + expect(scope.$eval('a+b')).toEqual(3); + expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); + * ``` + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$evalAsync + * @kind function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only + * that: + * + * - it will execute after the function that scheduled the evaluation (preferably before DOM + * rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle + * will be scheduled. However, it is encouraged to always call code that changes the model + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + */ + $evalAsync: function(expr, locals) { + // if we are outside of an $digest loop and this is the first time we are scheduling async + // task also schedule async auto-flush + if (!$rootScope.$$phase && !asyncQueue.length) { + $browser.defer(function() { + if (asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + + asyncQueue.push({scope: this, expression: expr, locals: locals}); + }, + + $$postDigest: function(fn) { + postDigestQueue.push(fn); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$apply + * @kind function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life + * cycle of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + * ```js + function $apply(expr) { + try { + return $eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + $root.$digest(); + } + } + * ``` + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the + * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + return this.$eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + clearPhase(); + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$applyAsync + * @kind function + * + * @description + * Schedule the invocation of $apply to occur at a later time. The actual time difference + * varies across browsers, but is typically around ~10 milliseconds. + * + * This can be used to queue up multiple expressions which need to be evaluated in the same + * digest. + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + */ + $applyAsync: function(expr) { + var scope = this; + expr && applyAsyncQueue.push($applyAsyncExpression); + scheduleApplyAsync(); + + function $applyAsyncExpression() { + scope.$eval(expr); + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$on + * @kind function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for + * discussion of event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or + * `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the + * event propagates through the scope hierarchy, this property is set to null. + * - `name` - `{string}`: name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel + * further event propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag + * to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, ...args)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + var current = this; + do { + if (!current.$$listenerCount[name]) { + current.$$listenerCount[name] = 0; + } + current.$$listenerCount[name]++; + } while ((current = current.$parent)); + + var self = this; + return function() { + var indexOfListener = namedListeners.indexOf(listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$emit + * @kind function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event traverses upwards toward the root scope and calls all + * registered listeners along the way. The event will stop propagating if one of the listeners + * cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i = 0, length = namedListeners.length; i < length; i++) { + + // if listeners were deregistered, defragment the array + if (!namedListeners[i]) { + namedListeners.splice(i, 1); + i--; + length--; + continue; + } + try { + //allow all listeners attached to the current scope to run + namedListeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + //if any listener on the current scope stops propagation, prevent bubbling + if (stopPropagation) { + event.currentScope = null; + return event; + } + //traverse upwards + scope = scope.$parent; + } while (scope); + + event.currentScope = null; + + return event; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$broadcast + * @kind function + * + * @description + * Dispatches an event `name` downwards to all child scopes (and their children) notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$broadcast` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event propagates to all direct and indirect scopes of the current + * scope and calls all registered listeners along the way. The event cannot be canceled. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to broadcast. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} + */ + $broadcast: function(name, args) { + var target = this, + current = target, + next = target, + event = { + name: name, + targetScope: target, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }; + + if (!target.$$listenerCount[name]) return event; + + var listenerArgs = concat([event], arguments, 1), + listeners, i, length; + + //down while you can, then up and next sibling or up and next sibling until back at root + while ((current = next)) { + event.currentScope = current; + listeners = current.$$listeners[name] || []; + for (i = 0, length = listeners.length; i < length; i++) { + // if listeners were deregistered, defragment the array + if (!listeners[i]) { + listeners.splice(i, 1); + i--; + length--; + continue; + } + + try { + listeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $digest + // (though it differs due to having the extra check for $$listenerCount) + if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } + + event.currentScope = null; + return event; + } + }; + + var $rootScope = new Scope(); + + //The internal queues. Expose them on the $rootScope for debugging/testing purposes. + var asyncQueue = $rootScope.$$asyncQueue = []; + var postDigestQueue = $rootScope.$$postDigestQueue = []; + var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; + + return $rootScope; + + + function beginPhase(phase) { + if ($rootScope.$$phase) { + throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); + } + + $rootScope.$$phase = phase; + } + + function clearPhase() { + $rootScope.$$phase = null; + } + + function incrementWatchersCount(current, count) { + do { + current.$$watchersCount += count; + } while ((current = current.$parent)); + } + + function decrementListenerCount(current, count, name) { + do { + current.$$listenerCount[name] -= count; + + if (current.$$listenerCount[name] === 0) { + delete current.$$listenerCount[name]; + } + } while ((current = current.$parent)); + } + + /** + * function used as an initial value for watchers. + * because it's unique we can easily tell it apart from other values + */ + function initWatchVal() {} + + function flushApplyAsync() { + while (applyAsyncQueue.length) { + try { + applyAsyncQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + applyAsyncId = null; + } + + function scheduleApplyAsync() { + if (applyAsyncId === null) { + applyAsyncId = $browser.defer(function() { + $rootScope.$apply(flushApplyAsync); + }); + } + } + }]; +} + +/** + * @description + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. + */ +function $$SanitizeUriProvider() { + var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, + imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + aHrefSanitizationWhitelist = regexp; + return this; + } + return aHrefSanitizationWhitelist; + }; + + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + imgSrcSanitizationWhitelist = regexp; + return this; + } + return imgSrcSanitizationWhitelist; + }; + + this.$get = function() { + return function sanitizeUri(uri, isImage) { + var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; + var normalizedVal; + normalizedVal = urlResolve(uri).href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return 'unsafe:' + normalizedVal; + } + return uri; + }; + }; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sceMinErr = minErr('$sce'); + +var SCE_CONTEXTS = { + HTML: 'html', + CSS: 'css', + URL: 'url', + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a + // url. (e.g. ng-include, script src, templateUrl) + RESOURCE_URL: 'resourceUrl', + JS: 'js' +}; + +// Helper functions follow. + +function adjustMatcher(matcher) { + if (matcher === 'self') { + return matcher; + } else if (isString(matcher)) { + // Strings match exactly except for 2 wildcards - '*' and '**'. + // '*' matches any character except those from the set ':/.?&'. + // '**' matches any character (like .* in a RegExp). + // More than 2 *'s raises an error as it's ill defined. + if (matcher.indexOf('***') > -1) { + throw $sceMinErr('iwcard', + 'Illegal sequence *** in string matcher. String: {0}', matcher); + } + matcher = escapeForRegexp(matcher). + replace('\\*\\*', '.*'). + replace('\\*', '[^:/.?&;]*'); + return new RegExp('^' + matcher + '$'); + } else if (isRegExp(matcher)) { + // The only other type of matcher allowed is a Regexp. + // Match entire URL / disallow partial matches. + // Flags are reset (i.e. no global, ignoreCase or multiline) + return new RegExp('^' + matcher.source + '$'); + } else { + throw $sceMinErr('imatcher', + 'Matchers may only be "self", string patterns or RegExp objects'); + } +} + + +function adjustMatchers(matchers) { + var adjustedMatchers = []; + if (isDefined(matchers)) { + forEach(matchers, function(matcher) { + adjustedMatchers.push(adjustMatcher(matcher)); + }); + } + return adjustedMatchers; +} + + +/** + * @ngdoc service + * @name $sceDelegate + * @kind function + * + * @description + * + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict + * Contextual Escaping (SCE)} services to AngularJS. + * + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things + * work because `$sce` delegates to `$sceDelegate` for these operations. + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. + * + * The default instance of `$sceDelegate` should work out of the box with little pain. While you + * can override it completely to change the behavior of `$sce`, the common case would + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as + * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist + * $sceDelegateProvider.resourceUrlWhitelist} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + */ + +/** + * @ngdoc provider + * @name $sceDelegateProvider + * @description + * + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure + * that the URLs used for sourcing Angular templates are safe. Refer {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and + * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + * + * For the general details about this service in Angular, read the main page for {@link ng.$sce + * Strict Contextual Escaping (SCE)}. + * + * **Example**: Consider the following case. + * + * - your app is hosted at url `http://myapp.example.com/` + * - but some of your templates are hosted on other domains you control such as + * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. + * + * Here is what a secure configuration for this scenario might look like: + * + * ``` + * angular.module('myApp', []).config(function($sceDelegateProvider) { + * $sceDelegateProvider.resourceUrlWhitelist([ + * // Allow same origin resource loads. + * 'self', + * // Allow loading from our assets domain. Notice the difference between * and **. + * 'http://srv*.assets.example.com/**' + * ]); + * + * // The blacklist overrides the whitelist so the open redirect here is blocked. + * $sceDelegateProvider.resourceUrlBlacklist([ + * 'http://myapp.example.com/clickThru**' + * ]); + * }); + * ``` + */ + +function $SceDelegateProvider() { + this.SCE_CONTEXTS = SCE_CONTEXTS; + + // Resource URLs can also be trusted by policy. + var resourceUrlWhitelist = ['self'], + resourceUrlBlacklist = []; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlWhitelist + * @kind function + * + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * Note: **an empty whitelist array will block all URLs**! + * + * @return {Array} the currently set whitelist array. + * + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only + * same origin resource requests. + * + * @description + * Sets/Gets the whitelist of trusted resource URLs. + */ + this.resourceUrlWhitelist = function(value) { + if (arguments.length) { + resourceUrlWhitelist = adjustMatchers(value); + } + return resourceUrlWhitelist; + }; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlBlacklist + * @kind function + * + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * The typical usage for the blacklist is to **block + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as + * these would otherwise be trusted but actually return content from the redirected domain. + * + * Finally, **the blacklist overrides the whitelist** and has the final say. + * + * @return {Array} the currently set blacklist array. + * + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there + * is no blacklist.) + * + * @description + * Sets/Gets the blacklist of trusted resource URLs. + */ + + this.resourceUrlBlacklist = function(value) { + if (arguments.length) { + resourceUrlBlacklist = adjustMatchers(value); + } + return resourceUrlBlacklist; + }; + + this.$get = ['$injector', function($injector) { + + var htmlSanitizer = function htmlSanitizer(html) { + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + }; + + if ($injector.has('$sanitize')) { + htmlSanitizer = $injector.get('$sanitize'); + } + + + function matchUrl(matcher, parsedUrl) { + if (matcher === 'self') { + return urlIsSameOrigin(parsedUrl); + } else { + // definitely a regex. See adjustMatchers() + return !!matcher.exec(parsedUrl.href); + } + } + + function isResourceUrlAllowedByPolicy(url) { + var parsedUrl = urlResolve(url.toString()); + var i, n, allowed = false; + // Ensure that at least one item from the whitelist allows this url. + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { + allowed = true; + break; + } + } + if (allowed) { + // Ensure that no item from the blacklist blocked this url. + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { + allowed = false; + break; + } + } + } + return allowed; + } + + function generateHolderType(Base) { + var holderType = function TrustedValueHolderType(trustedValue) { + this.$$unwrapTrustedValue = function() { + return trustedValue; + }; + }; + if (Base) { + holderType.prototype = new Base(); + } + holderType.prototype.valueOf = function sceValueOf() { + return this.$$unwrapTrustedValue(); + }; + holderType.prototype.toString = function sceToString() { + return this.$$unwrapTrustedValue().toString(); + }; + return holderType; + } + + var trustedValueHolderBase = generateHolderType(), + byType = {}; + + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); + + /** + * @ngdoc method + * @name $sceDelegate#trustAs + * + * @description + * Returns an object that is trusted by angular for use in specified strict + * contextual escaping contexts (such as ng-bind-html, ng-include, any src + * attribute interpolation, any dom event binding attribute interpolation + * such as for onclick, etc.) that uses the provided value. + * See {@link ng.$sce $sce} for enabling strict contextual escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + function trustAs(type, trustedValue) { + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (!Constructor) { + throw $sceMinErr('icontext', + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', + type, trustedValue); + } + if (trustedValue === null || trustedValue === undefined || trustedValue === '') { + return trustedValue; + } + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting + // mutable objects, we ensure here that the value passed in is actually a string. + if (typeof trustedValue !== 'string') { + throw $sceMinErr('itype', + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', + type); + } + return new Constructor(trustedValue); + } + + /** + * @ngdoc method + * @name $sceDelegate#valueOf + * + * @description + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. + * + * If the passed parameter is not a value that had been returned by {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. + * + * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} + * call or anything else. + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns + * `value` unchanged. + */ + function valueOf(maybeTrusted) { + if (maybeTrusted instanceof trustedValueHolderBase) { + return maybeTrusted.$$unwrapTrustedValue(); + } else { + return maybeTrusted; + } + } + + /** + * @ngdoc method + * @name $sceDelegate#getTrusted + * + * @description + * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and + * returns the originally supplied value if the queried context type is a supertype of the + * created type. If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} call. + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. + */ + function getTrusted(type, maybeTrusted) { + if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { + return maybeTrusted; + } + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (constructor && maybeTrusted instanceof constructor) { + return maybeTrusted.$$unwrapTrustedValue(); + } + // If we get here, then we may only take one of two actions. + // 1. sanitize the value for the requested type, or + // 2. throw an exception. + if (type === SCE_CONTEXTS.RESOURCE_URL) { + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { + return maybeTrusted; + } else { + throw $sceMinErr('insecurl', + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', + maybeTrusted.toString()); + } + } else if (type === SCE_CONTEXTS.HTML) { + return htmlSanitizer(maybeTrusted); + } + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + } + + return { trustAs: trustAs, + getTrusted: getTrusted, + valueOf: valueOf }; + }]; +} + + +/** + * @ngdoc provider + * @name $sceProvider + * @description + * + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. + * - enable/disable Strict Contextual Escaping (SCE) in a module + * - override the default implementation with a custom delegate + * + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. + */ + +/* jshint maxlen: false*/ + +/** + * @ngdoc service + * @name $sce + * @kind function + * + * @description + * + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. + * + * # Strict Contextual Escaping + * + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain + * contexts to result in a value that is marked as safe to use for that context. One example of + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer + * to these contexts as privileged or SCE contexts. + * + * As of version 1.2, Angular ships with SCE enabled by default. + * + * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow + * one to execute arbitrary javascript by the use of the expression() syntax. Refer + * to learn more about them. + * You can ensure your document is in standards mode and not quirks mode by adding `` + * to the top of your HTML document. + * + * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. + * + * Here's an example of a binding in a privileged context: + * + * ``` + * + *
      + * ``` + * + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE + * disabled, this application allows the user to render arbitrary HTML into the DIV. + * In a more realistic example, one may be rendering user comments, blog articles, etc. via + * bindings. (HTML is just one example of a context where rendering user controlled input creates + * security vulnerabilities.) + * + * For the case of HTML, you might use a library, either on the client side, or on the server side, + * to sanitize unsafe HTML before binding to the value and rendering it in the document. + * + * How would you ensure that every place that used these types of bindings was bound to a value that + * was sanitized by your library (or returned as safe for rendering by your server?) How can you + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some + * properties/fields and forgot to update the binding to the sanitized value? + * + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can + * determine that something explicitly says it's safe to use a value for binding in that + * context. You can then audit your code (a simple grep would do) to ensure that this is only done + * for those values that you can easily tell are safe - because they were received from your server, + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps + * allowing only the files in a specific directory to do this. Ensuring that the internal API + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. + * + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} + * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to + * obtain values that will be accepted by SCE / privileged contexts. + * + * + * ## How does it work? + * + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link + * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the + * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. + * + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link + * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly + * simplified): + * + * ``` + * var ngBindHtmlDirective = ['$sce', function($sce) { + * return function(scope, element, attr) { + * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { + * element.html(value || ''); + * }); + * }; + * }]; + * ``` + * + * ## Impact on loading templates + * + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as + * `templateUrl`'s specified by {@link guide/directive directives}. + * + * By default, Angular only loads templates from the same domain and protocol as the application + * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or + * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist + * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. + * + * *Please note*: + * The browser's + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) + * policy apply in addition to this and may further restrict whether the template is successfully + * loaded. This means that without the right CORS policy, loading templates from a different domain + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some + * browsers. + * + * ## This feels like too much overhead + * + * It's important to remember that SCE only applies to interpolation expressions. + * + * If your expressions are constant literals, they're automatically trusted and you don't need to + * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. + * `
      `) just works. + * + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them + * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. + * + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load + * templates in `ng-include` from your application's domain without having to even know about SCE. + * It blocks loading templates from other domains or loading templates over http from an https + * served document. You can change these by setting your own custom {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. + * + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an + * application that's secure and can be audited to verify that with much more ease than bolting + * security onto an application later. + * + * + * ## What trusted context types are supported? + * + * | Context | Notes | + * |---------------------|----------------| + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
      Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | + * + * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
      + * + * Each element in these arrays must be one of the following: + * + * - **'self'** + * - The special **string**, `'self'`, can be used to match against all URLs of the **same + * domain** as the application document using the **same protocol**. + * - **String** (except the special value `'self'`) + * - The string is matched against the full *normalized / absolute URL* of the resource + * being tested (substring matches are not good enough.) + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters + * match themselves. + * - `*`: matches zero or more occurrences of any character other than one of the following 6 + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use + * in a whitelist. + * - `**`: matches zero or more occurrences of *any* character. As such, it's not + * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g. + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might + * not have been the intention.) Its usage at the very end of the path is ok. (e.g. + * http://foo.example.com/templates/**). + * - **RegExp** (*see caveat below*) + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should + * have good test coverage.). For instance, the use of `.` in the regex is correct only in a + * small number of cases. A `.` character in the regex used when matching the scheme or a + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It + * is highly recommended to use the string patterns and only fall back to regular expressions + * if they as a last resort. + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is + * matched against the **entire** *normalized / absolute URL* of the resource being tested + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. + * - If you are generating your JavaScript from some other templating engine (not + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), + * remember to escape your regular expression (and be aware that you might need more than + * one level of escaping depending on your templating engine and the way you interpolated + * the value.) Do make use of your platform's escaping mechanism as it might be good + * enough before coding your own. e.g. Ruby has + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). + * Javascript lacks a similar built in function for escaping. Take a look at Google + * Closure library's [goog.string.regExpEscape(s)]( + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. + * + * ## Show me an example using SCE. + * + * + * + *
      + *

      + * User comments
      + * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when + * $sanitize is available. If $sanitize isn't available, this results in an error instead of an + * exploit. + *
      + *
      + * {{userComment.name}}: + * + *
      + *
      + *
      + *
      + *
      + * + * + * angular.module('mySceApp', ['ngSanitize']) + * .controller('AppController', ['$http', '$templateCache', '$sce', + * function($http, $templateCache, $sce) { + * var self = this; + * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + * self.userComments = userComments; + * }); + * self.explicitlyTrustedHtml = $sce.trustAsHtml( + * 'Hover over this text.'); + * }]); + * + * + * + * [ + * { "name": "Alice", + * "htmlComment": + * "Is anyone reading this?" + * }, + * { "name": "Bob", + * "htmlComment": "Yes! Am I the only other one?" + * } + * ] + * + * + * + * describe('SCE doc demo', function() { + * it('should sanitize untrusted values', function() { + * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) + * .toBe('Is anyone reading this?'); + * }); + * + * it('should NOT sanitize explicitly trusted values', function() { + * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( + * 'Hover over this text.'); + * }); + * }); + * + *
      + * + * + * + * ## Can I disable SCE completely? + * + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits + * for little coding overhead. It will be much harder to take an SCE disabled application and + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE + * for cases where you have a lot of existing code that was written before SCE was introduced and + * you're migrating them a module at a time. + * + * That said, here's how you can completely disable SCE: + * + * ``` + * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { + * // Completely disable SCE. For demonstration purposes only! + * // Do not use in new projects. + * $sceProvider.enabled(false); + * }); + * ``` + * + */ +/* jshint maxlen: 100 */ + +function $SceProvider() { + var enabled = true; + + /** + * @ngdoc method + * @name $sceProvider#enabled + * @kind function + * + * @param {boolean=} value If provided, then enables/disables SCE. + * @return {boolean} true if SCE is enabled, false otherwise. + * + * @description + * Enables/disables SCE and returns the current value. + */ + this.enabled = function(value) { + if (arguments.length) { + enabled = !!value; + } + return enabled; + }; + + + /* Design notes on the default implementation for SCE. + * + * The API contract for the SCE delegate + * ------------------------------------- + * The SCE delegate object must provide the following 3 methods: + * + * - trustAs(contextEnum, value) + * This method is used to tell the SCE service that the provided value is OK to use in the + * contexts specified by contextEnum. It must return an object that will be accepted by + * getTrusted() for a compatible contextEnum and return this value. + * + * - valueOf(value) + * For values that were not produced by trustAs(), return them as is. For values that were + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if + * trustAs is wrapping the given values into some type, this operation unwraps it when given + * such a value. + * + * - getTrusted(contextEnum, value) + * This function should return the a value that is safe to use in the context specified by + * contextEnum or throw and exception otherwise. + * + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be + * opaque or wrapped in some holder object. That happens to be an implementation detail. For + * instance, an implementation could maintain a registry of all trusted objects by context. In + * such a case, trustAs() would return the same object that was passed in. getTrusted() would + * return the same object passed in if it was found in the registry under a compatible context or + * throw an exception otherwise. An implementation might only wrap values some of the time based + * on some criteria. getTrusted() might return a value and not throw an exception for special + * constants or objects even if not wrapped. All such implementations fulfill this contract. + * + * + * A note on the inheritance model for SCE contexts + * ------------------------------------------------ + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This + * is purely an implementation details. + * + * The contract is simply this: + * + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) + * will also succeed. + * + * Inheritance happens to capture this in a natural way. In some future, we + * may not use inheritance anymore. That is OK because no code outside of + * sce.js and sceSpecs.js would need to be aware of this detail. + */ + + this.$get = ['$parse', '$sceDelegate', function( + $parse, $sceDelegate) { + // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow + // the "expression(javascript expression)" syntax which is insecure. + if (enabled && msie < 8) { + throw $sceMinErr('iequirks', + 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + + 'mode. You can fix this by adding the text to the top of your HTML ' + + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); + } + + var sce = shallowCopy(SCE_CONTEXTS); + + /** + * @ngdoc method + * @name $sce#isEnabled + * @kind function + * + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. + * + * @description + * Returns a boolean indicating if SCE is enabled. + */ + sce.isEnabled = function() { + return enabled; + }; + sce.trustAs = $sceDelegate.trustAs; + sce.getTrusted = $sceDelegate.getTrusted; + sce.valueOf = $sceDelegate.valueOf; + + if (!enabled) { + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; + sce.valueOf = identity; + } + + /** + * @ngdoc method + * @name $sce#parseAs + * + * @description + * Converts Angular {@link guide/expression expression} into a function. This is like {@link + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it + * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, + * *result*)} + * + * @param {string} type The kind of SCE context in which this result will be used. + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + sce.parseAs = function sceParseAs(type, expr) { + var parsed = $parse(expr); + if (parsed.literal && parsed.constant) { + return parsed; + } else { + return $parse(expr, function(value) { + return sce.getTrusted(type, value); + }); + } + }; + + /** + * @ngdoc method + * @name $sce#trustAs + * + * @description + * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, + * returns an object that is trusted by angular for use in specified strict contextual + * escaping contexts (such as ng-bind-html, ng-include, any src attribute + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual + * escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + + /** + * @ngdoc method + * @name $sce#trustAsHtml + * + * @description + * Shorthand method. `$sce.trustAsHtml(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsUrl + * + * @description + * Shorthand method. `$sce.trustAsUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsResourceUrl + * + * @description + * Shorthand method. `$sce.trustAsResourceUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the return + * value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsJs + * + * @description + * Shorthand method. `$sce.trustAsJs(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#getTrusted + * + * @description + * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, + * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the + * originally supplied value if the queried context type is a supertype of the created type. + * If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} + * call. + * @returns {*} The value the was originally provided to + * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. + * Otherwise, throws an exception. + */ + + /** + * @ngdoc method + * @name $sce#getTrustedHtml + * + * @description + * Shorthand method. `$sce.getTrustedHtml(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedCss + * + * @description + * Shorthand method. `$sce.getTrustedCss(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedUrl + * + * @description + * Shorthand method. `$sce.getTrustedUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedResourceUrl + * + * @description + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedJs + * + * @description + * Shorthand method. `$sce.getTrustedJs(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` + */ + + /** + * @ngdoc method + * @name $sce#parseAsHtml + * + * @description + * Shorthand method. `$sce.parseAsHtml(expression string)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsCss + * + * @description + * Shorthand method. `$sce.parseAsCss(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsUrl + * + * @description + * Shorthand method. `$sce.parseAsUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsResourceUrl + * + * @description + * Shorthand method. `$sce.parseAsResourceUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsJs + * + * @description + * Shorthand method. `$sce.parseAsJs(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + // Shorthand delegations. + var parse = sce.parseAs, + getTrusted = sce.getTrusted, + trustAs = sce.trustAs; + + forEach(SCE_CONTEXTS, function(enumValue, name) { + var lName = lowercase(name); + sce[camelCase("parse_as_" + lName)] = function(expr) { + return parse(enumValue, expr); + }; + sce[camelCase("get_trusted_" + lName)] = function(value) { + return getTrusted(enumValue, value); + }; + sce[camelCase("trust_as_" + lName)] = function(value) { + return trustAs(enumValue, value); + }; + }); + + return sce; + }]; +} + +/** + * !!! This is an undocumented "private" service !!! + * + * @name $sniffer + * @requires $window + * @requires $document + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} transitions Does the browser support CSS transition events ? + * @property {boolean} animations Does the browser support CSS animation events ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +function $SnifferProvider() { + this.$get = ['$window', '$document', function($window, $document) { + var eventSupport = {}, + android = + toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), + document = $document[0] || {}, + vendorPrefix, + vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, + bodyStyle = document.body && document.body.style, + transitions = false, + animations = false, + match; + + if (bodyStyle) { + for (var prop in bodyStyle) { + if (match = vendorRegex.exec(prop)) { + vendorPrefix = match[0]; + vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); + break; + } + } + + if (!vendorPrefix) { + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; + } + + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); + + if (android && (!transitions || !animations)) { + transitions = isString(bodyStyle.webkitTransition); + animations = isString(bodyStyle.webkitAnimation); + } + } + + + return { + // Android has history.pushState, but it does not update location correctly + // so let's not use the history API at all. + // http://code.google.com/p/android/issues/detail?id=17471 + // https://github.com/angular/angular.js/issues/904 + + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has + // so let's not use the history API also + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined + // jshint -W018 + history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), + // jshint +W018 + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + // IE10+ implements 'input' event but it erroneously fires under various situations, + // e.g. when placeholder changes, or a form is focused. + if (event === 'input' && msie <= 11) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: csp(), + vendorPrefix: vendorPrefix, + transitions: transitions, + animations: animations, + android: android + }; + }]; +} + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc service + * @name $templateRequest + * + * @description + * The `$templateRequest` service runs security checks then downloads the provided template using + * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request + * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the + * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the + * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted + * when `tpl` is of type string and `$templateCache` has the matching entry. + * + * @param {string|TrustedResourceUrl} tpl The HTTP request template URL + * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty + * + * @return {Promise} a promise for the HTTP response data of the given URL. + * + * @property {number} totalPendingRequests total amount of pending template requests being downloaded. + */ +function $TemplateRequestProvider() { + this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { + function handleRequestFn(tpl, ignoreRequestError) { + handleRequestFn.totalPendingRequests++; + + // We consider the template cache holds only trusted templates, so + // there's no need to go through whitelisting again for keys that already + // are included in there. This also makes Angular accept any script + // directive, no matter its name. However, we still need to unwrap trusted + // types. + if (!isString(tpl) || !$templateCache.get(tpl)) { + tpl = $sce.getTrustedResourceUrl(tpl); + } + + var transformResponse = $http.defaults && $http.defaults.transformResponse; + + if (isArray(transformResponse)) { + transformResponse = transformResponse.filter(function(transformer) { + return transformer !== defaultHttpResponseTransform; + }); + } else if (transformResponse === defaultHttpResponseTransform) { + transformResponse = null; + } + + var httpOptions = { + cache: $templateCache, + transformResponse: transformResponse + }; + + return $http.get(tpl, httpOptions) + ['finally'](function() { + handleRequestFn.totalPendingRequests--; + }) + .then(function(response) { + $templateCache.put(tpl, response.data); + return response.data; + }, handleError); + + function handleError(resp) { + if (!ignoreRequestError) { + throw $compileMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})', + tpl, resp.status, resp.statusText); + } + return $q.reject(resp); + } + } + + handleRequestFn.totalPendingRequests = 0; + + return handleRequestFn; + }]; +} + +function $$TestabilityProvider() { + this.$get = ['$rootScope', '$browser', '$location', + function($rootScope, $browser, $location) { + + /** + * @name $testability + * + * @description + * The private $$testability service provides a collection of methods for use when debugging + * or by automated test and debugging tools. + */ + var testability = {}; + + /** + * @name $$testability#findBindings + * + * @description + * Returns an array of elements that are bound (via ng-bind or {{}}) + * to expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The binding expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. Filters and whitespace are ignored. + */ + testability.findBindings = function(element, expression, opt_exactMatch) { + var bindings = element.getElementsByClassName('ng-binding'); + var matches = []; + forEach(bindings, function(binding) { + var dataBinding = angular.element(binding).data('$binding'); + if (dataBinding) { + forEach(dataBinding, function(bindingName) { + if (opt_exactMatch) { + var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); + if (matcher.test(bindingName)) { + matches.push(binding); + } + } else { + if (bindingName.indexOf(expression) != -1) { + matches.push(binding); + } + } + }); + } + }); + return matches; + }; + + /** + * @name $$testability#findModels + * + * @description + * Returns an array of elements that are two-way found via ng-model to + * expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The model expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. + */ + testability.findModels = function(element, expression, opt_exactMatch) { + var prefixes = ['ng-', 'data-ng-', 'ng\\:']; + for (var p = 0; p < prefixes.length; ++p) { + var attributeEquals = opt_exactMatch ? '=' : '*='; + var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; + var elements = element.querySelectorAll(selector); + if (elements.length) { + return elements; + } + } + }; + + /** + * @name $$testability#getLocation + * + * @description + * Shortcut for getting the location in a browser agnostic way. Returns + * the path, search, and hash. (e.g. /path?a=b#hash) + */ + testability.getLocation = function() { + return $location.url(); + }; + + /** + * @name $$testability#setLocation + * + * @description + * Shortcut for navigating to a location without doing a full page reload. + * + * @param {string} url The location url (path, search and hash, + * e.g. /path?a=b#hash) to go to. + */ + testability.setLocation = function(url) { + if (url !== $location.url()) { + $location.url(url); + $rootScope.$digest(); + } + }; + + /** + * @name $$testability#whenStable + * + * @description + * Calls the callback when $timeout and $http requests are completed. + * + * @param {function} callback + */ + testability.whenStable = function(callback) { + $browser.notifyWhenNoOutstandingRequests(callback); + }; + + return testability; + }]; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', + function($rootScope, $browser, $q, $$q, $exceptionHandler) { + + var deferreds = {}; + + + /** + * @ngdoc service + * @name $timeout + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of calling `$timeout` is a promise, which will be resolved when + * the delay has passed and the timeout function, if provided, is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * If you only want a promise that will be resolved after some specified delay + * then you can call `$timeout` without the `fn` function. + * + * @param {function()=} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise + * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. + * @param {...*=} Pass additional parameters to the executed function. + * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this + * promise will be resolved with is the return value of the `fn` function. + * + */ + function timeout(fn, delay, invokeApply) { + if (!isFunction(fn)) { + invokeApply = delay; + delay = fn; + fn = noop; + } + + var args = sliceArgs(arguments, 3), + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise, + timeoutId; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn.apply(null, args)); + } catch (e) { + deferred.reject(e); + $exceptionHandler(e); + } + finally { + delete deferreds[promise.$$timeoutId]; + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $timeout#cancel + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + delete deferreds[promise.$$timeoutId]; + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +// NOTE: The usage of window and document instead of $window and $document here is +// deliberate. This service depends on the specific behavior of anchor nodes created by the +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it +// doesn't know about mocked locations and resolves URLs to the real document - which is +// exactly the behavior needed here. There is little value is mocking these out for this +// service. +var urlParsingNode = document.createElement("a"); +var originUrl = urlResolve(window.location.href); + + +/** + * + * Implementation Notes for non-IE browsers + * ---------------------------------------- + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, + * results both in the normalizing and parsing of the URL. Normalizing means that a relative + * URL will be resolved into an absolute URL in the context of the application document. + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related + * properties are all populated to reflect the normalized URL. This approach has wide + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * + * Implementation Notes for IE + * --------------------------- + * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other + * browsers. However, the parsed components will not be set if the URL assigned did not specify + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We + * work around that by performing the parsing in a 2nd step by taking a previously normalized + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the + * properties such as protocol, hostname, port, etc. + * + * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one + * uses the inner HTML approach to assign the URL as part of an HTML snippet - + * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL. + * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception. + * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that + * method and IE < 8 is unsupported. + * + * References: + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * http://url.spec.whatwg.org/#urlutils + * https://github.com/angular/angular.js/pull/2902 + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ + * + * @kind function + * @param {string} url The URL to be parsed. + * @description Normalizes and parses a URL. + * @returns {object} Returns the normalized URL as a dictionary. + * + * | member name | Description | + * |---------------|----------------| + * | href | A normalized version of the provided URL if it was not an absolute URL | + * | protocol | The protocol including the trailing colon | + * | host | The host and port (if the port is non-default) of the normalizedUrl | + * | search | The search params, minus the question mark | + * | hash | The hash string, minus the hash symbol + * | hostname | The hostname + * | port | The port, without ":" + * | pathname | The pathname, beginning with "/" + * + */ +function urlResolve(url) { + var href = url; + + if (msie) { + // Normalize before parse. Refer Implementation Notes on why this is + // done in two steps on IE. + urlParsingNode.setAttribute("href", href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') + ? urlParsingNode.pathname + : '/' + urlParsingNode.pathname + }; +} + +/** + * Parse a request URL and determine whether this is a same-origin request as the application document. + * + * @param {string|object} requestUrl The url of the request as a string that will be resolved + * or a parsed URL object. + * @returns {boolean} Whether the request is for the same origin as the application document. + */ +function urlIsSameOrigin(requestUrl) { + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; + return (parsed.protocol === originUrl.protocol && + parsed.host === originUrl.host); +} + +/** + * @ngdoc service + * @name $window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * Expressions, like the one defined for the `ngClick` directive in the example + * below, are evaluated with respect to the current scope. Therefore, there is + * no risk of inadvertently coding in a dependency on a global value in such an + * expression. + * + * @example + + + +
      + + +
      +
      + + it('should display the greeting in the input box', function() { + element(by.model('greeting')).sendKeys('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
      + */ +function $WindowProvider() { + this.$get = valueFn(window); +} + +/** + * @name $$cookieReader + * @requires $document + * + * @description + * This is a private service for reading cookies used by $http and ngCookies + * + * @return {Object} a key/value map of the current cookies + */ +function $$CookieReader($document) { + var rawDocument = $document[0] || {}; + var lastCookies = {}; + var lastCookieString = ''; + + function safeDecodeURIComponent(str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + + return function() { + var cookieArray, cookie, i, index, name; + var currentCookieString = rawDocument.cookie || ''; + + if (currentCookieString !== lastCookieString) { + lastCookieString = currentCookieString; + cookieArray = lastCookieString.split('; '); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + name = safeDecodeURIComponent(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (lastCookies[name] === undefined) { + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + }; +} + +$$CookieReader.$inject = ['$document']; + +function $$CookieReaderProvider() { + this.$get = $$CookieReader; +} + +/* global currencyFilter: true, + dateFilter: true, + filterFilter: true, + jsonFilter: true, + limitToFilter: true, + lowercaseFilter: true, + numberFilter: true, + orderByFilter: true, + uppercaseFilter: true, + */ + +/** + * @ngdoc provider + * @name $filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be + * Dependency Injected. To achieve this a filter definition consists of a factory function which is + * annotated with dependencies and is responsible for creating a filter function. + * + *
      + * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
      + * + * ```js + * // Filter registration + * function MyModule($provide, $filterProvider) { + * // create a service to demonstrate injection (not always needed) + * $provide.value('greet', function(name){ + * return 'Hello ' + name + '!'; + * }); + * + * // register a filter factory which uses the + * // greet service to demonstrate DI. + * $filterProvider.register('greet', function(greet){ + * // return the filter function which uses the greet service + * // to generate salutation + * return function(text) { + * // filters need to be forgiving so check input validity + * return text && greet(text) || text; + * }; + * }); + * } + * ``` + * + * The filter function is registered with the `$injector` under the filter name suffix with + * `Filter`. + * + * ```js + * it('should be the same instance', inject( + * function($filterProvider) { + * $filterProvider.register('reverse', function(){ + * return ...; + * }); + * }, + * function($filter, reverseFilter) { + * expect($filter('reverse')).toBe(reverseFilter); + * }); + * ``` + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/filter Filters} in the Angular Developer Guide. + */ + +/** + * @ngdoc service + * @name $filter + * @kind function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + * @example + + +
      +

      {{ originalText }}

      +

      {{ filteredText }}

      +
      +
      + + + angular.module('filterExample', []) + .controller('MainCtrl', function($scope, $filter) { + $scope.originalText = 'hello'; + $scope.filteredText = $filter('uppercase')($scope.originalText); + }); + +
      + */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + /** + * @ngdoc method + * @name $filterProvider#register + * @param {string|Object} name Name of the filter function, or an object map of filters where + * the keys are the filter names and the values are the filter factories. + * + *
      + * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
      + * @returns {Object} Registered filter instance, or if a map of filters was provided then a map + * of the registered filter instances. + */ + function register(name, factory) { + if (isObject(name)) { + var filters = {}; + forEach(name, function(filter, key) { + filters[key] = register(key, filter); + }); + return filters; + } else { + return $provide.factory(name + suffix, factory); + } + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + }; + }]; + + //////////////////////////////////////// + + /* global + currencyFilter: false, + dateFilter: false, + filterFilter: false, + jsonFilter: false, + limitToFilter: false, + lowercaseFilter: false, + numberFilter: false, + orderByFilter: false, + uppercaseFilter: false, + */ + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name filter + * @kind function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: The string is used for matching against the contents of the `array`. All strings or + * objects with string properties in `array` that match this string will be returned. This also + * applies to nested object properties. + * The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any + * property of the object or its nested object properties. That's equivalent to the simple + * substring match with a `string` as described above. The predicate can be negated by prefixing + * the string with `!`. + * For example `{name: "!M"}` predicate will return an array of items which have property `name` + * not containing "M". + * + * Note that a named property will match properties on the same level only, while the special + * `$` property will match properties on the same level or deeper. E.g. an array item like + * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but + * **will** be matched by `{$: 'John'}`. + * + * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. + * The function is called for each element of the array, with the element, its index, and + * the entire array itself as arguments. + * + * The final result is an array of those elements that the predicate returned true for. + * + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if both values should be considered equal. + * + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. + * This is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * Primitive values are converted to strings. Objects are not compared against primitives, + * unless they have a custom `toString` method (e.g. `Date` objects). + * + * @example + + +
      + + + + + + + + +
      NamePhone
      {{friend.name}}{{friend.phone}}
      +
      +
      +
      +
      +
      + + + + + + +
      NamePhone
      {{friendObj.name}}{{friendObj.phone}}
      +
      + + var expectFriendNames = function(expectedNames, key) { + element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { + arr.forEach(function(wd, i) { + expect(wd.getText()).toMatch(expectedNames[i]); + }); + }); + }; + + it('should search across all fields when filtering with a string', function() { + var searchText = element(by.model('searchText')); + searchText.clear(); + searchText.sendKeys('m'); + expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); + + searchText.clear(); + searchText.sendKeys('76'); + expectFriendNames(['John', 'Julie'], 'friend'); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + var searchAny = element(by.model('search.$')); + searchAny.clear(); + searchAny.sendKeys('i'); + expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); + }); + it('should use a equal comparison when comparator is true', function() { + var searchName = element(by.model('search.name')); + var strict = element(by.model('strict')); + searchName.clear(); + searchName.sendKeys('Julie'); + strict.click(); + expectFriendNames(['Julie'], 'friendObj'); + }); + +
      + */ +function filterFilter() { + return function(array, expression, comparator) { + if (!isArrayLike(array)) { + if (array == null) { + return array; + } else { + throw minErr('filter')('notarray', 'Expected array but received: {0}', array); + } + } + + var expressionType = getTypeForFilter(expression); + var predicateFn; + var matchAgainstAnyProp; + + switch (expressionType) { + case 'function': + predicateFn = expression; + break; + case 'boolean': + case 'null': + case 'number': + case 'string': + matchAgainstAnyProp = true; + //jshint -W086 + case 'object': + //jshint +W086 + predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); + break; + default: + return array; + } + + return Array.prototype.filter.call(array, predicateFn); + }; +} + +// Helper functions for `filterFilter` +function createPredicateFn(expression, comparator, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && ('$' in expression); + var predicateFn; + + if (comparator === true) { + comparator = equals; + } else if (!isFunction(comparator)) { + comparator = function(actual, expected) { + if (isUndefined(actual)) { + // No substring matching against `undefined` + return false; + } + if ((actual === null) || (expected === null)) { + // No substring matching against `null`; only match against `null` + return actual === expected; + } + if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { + // Should not compare primitives against objects, unless they have custom `toString` method + return false; + } + + actual = lowercase('' + actual); + expected = lowercase('' + expected); + return actual.indexOf(expected) !== -1; + }; + } + + predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression.$, comparator, false); + } + return deepCompare(item, expression, comparator, matchAgainstAnyProp); + }; + + return predicateFn; +} + +function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { + var actualType = getTypeForFilter(actual); + var expectedType = getTypeForFilter(expected); + + if ((expectedType === 'string') && (expected.charAt(0) === '!')) { + return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); + } else if (isArray(actual)) { + // In case `actual` is an array, consider it a match + // if ANY of it's items matches `expected` + return actual.some(function(item) { + return deepCompare(item, expected, comparator, matchAgainstAnyProp); + }); + } + + switch (actualType) { + case 'object': + var key; + if (matchAgainstAnyProp) { + for (key in actual) { + if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { + return true; + } + } + return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); + } else if (expectedType === 'object') { + for (key in expected) { + var expectedVal = expected[key]; + if (isFunction(expectedVal) || isUndefined(expectedVal)) { + continue; + } + + var matchAnyProperty = key === '$'; + var actualVal = matchAnyProperty ? actual : actual[key]; + if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { + return false; + } + } + return true; + } else { + return comparator(actual, expected); + } + break; + case 'function': + return false; + default: + return comparator(actual, expected); + } +} + +// Used for easily differentiating between `null` and actual `object` +function getTypeForFilter(val) { + return (val === null) ? 'null' : typeof val; +} + +/** + * @ngdoc filter + * @name currency + * @kind function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale + * @returns {string} Formatted number. + * + * + * @example + + + +
      +
      + default currency symbol ($): {{amount | currency}}
      + custom currency identifier (USD$): {{amount | currency:"USD$"}} + no fractions (0): {{amount | currency:"USD$":0}} +
      +
      + + it('should init with 1234.56', function() { + expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); + expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); + }); + it('should update', function() { + if (browser.params.browser == 'safari') { + // Safari does not understand the minus key. See + // https://github.com/angular/protractor/issues/481 + return; + } + element(by.model('amount')).clear(); + element(by.model('amount')).sendKeys('-1234'); + expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)'); + expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)'); + }); + +
      + */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol, fractionSize) { + if (isUndefined(currencySymbol)) { + currencySymbol = formats.CURRENCY_SYM; + } + + if (isUndefined(fractionSize)) { + fractionSize = formats.PATTERNS[1].maxFrac; + } + + // if null or undefined pass it through + return (amount == null) + ? amount + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name number + * @kind function + * + * @description + * Formats a number as text. + * + * If the input is null or undefined, it will just be returned. + * If the input is infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned. + * If the input is not a number an empty string is returned. + * + * + * @param {number|string} number Number to format. + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. + * If this is not provided then the fraction size is computed from the current locale's number + * formatting pattern. In the case of the default locale, it will be 3. + * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. + * + * @example + + + +
      +
      + Default formatting: {{val | number}}
      + No fractions: {{val | number:0}}
      + Negative number: {{-val | number:4}} +
      +
      + + it('should format numbers', function() { + expect(element(by.id('number-default')).getText()).toBe('1,234.568'); + expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); + }); + + it('should update', function() { + element(by.model('val')).clear(); + element(by.model('val')).sendKeys('3374.333'); + expect(element(by.id('number-default')).getText()).toBe('3,374.333'); + expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); + }); + +
      + */ + + +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + + // if null or undefined pass it through + return (number == null) + ? number + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +var DECIMAL_SEP = '.'; +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + if (isObject(number)) return ''; + + var isNegative = number < 0; + number = Math.abs(number); + + var isInfinity = number === Infinity; + if (!isInfinity && !isFinite(number)) return ''; + + var numStr = number + '', + formatedText = '', + hasExponent = false, + parts = []; + + if (isInfinity) formatedText = '\u221e'; + + if (!isInfinity && numStr.indexOf('e') !== -1) { + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); + if (match && match[2] == '-' && match[3] > fractionSize + 1) { + number = 0; + } else { + formatedText = numStr; + hasExponent = true; + } + } + + if (!isInfinity && !hasExponent) { + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; + + // determine fractionSize if it is not specified + if (isUndefined(fractionSize)) { + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); + } + + // safely round numbers in JS without hitting imprecisions of floating-point arithmetics + // inspired by: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round + number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); + + var fraction = ('' + number).split(DECIMAL_SEP); + var whole = fraction[0]; + fraction = fraction[1] || ''; + + var i, pos = 0, + lgroup = pattern.lgSize, + group = pattern.gSize; + + if (whole.length >= (lgroup + group)) { + pos = whole.length - lgroup; + for (i = 0; i < pos; i++) { + if ((pos - i) % group === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + } + + for (i = pos; i < whole.length; i++) { + if ((whole.length - i) % lgroup === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + + // format fraction part. + while (fraction.length < fractionSize) { + fraction += '0'; + } + + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); + } else { + if (fractionSize > 0 && number < 1) { + formatedText = number.toFixed(fractionSize); + number = parseFloat(formatedText); + } + } + + if (number === 0) { + isNegative = false; + } + + parts.push(isNegative ? pattern.negPre : pattern.posPre, + formatedText, + isNegative ? pattern.negSuf : pattern.posSuf); + return parts.join(''); +} + +function padNumber(num, digits, trim) { + var neg = ''; + if (num < 0) { + neg = '-'; + num = -num; + } + num = '' + num; + while (num.length < digits) num = '0' + num; + if (trim) { + num = num.substr(num.length - digits); + } + return neg + num; +} + + +function dateGetter(name, size, offset, trim) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) { + value += offset; + } + if (value === 0 && offset == -12) value = 12; + return padNumber(value, size, trim); + }; +} + +function dateStrGetter(name, shortForm) { + return function(date, formats) { + var value = date['get' + name](); + var get = uppercase(shortForm ? ('SHORT' + name) : name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date, formats, offset) { + var zone = -1 * offset; + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function getFirstThursdayOfYear(year) { + // 0 = index of January + var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); + // 4 = index of Thursday (+1 to account for 1st = 5) + // 11 = index of *next* Thursday (+1 account for 1st = 12) + return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); +} + +function getThursdayThisWeek(datetime) { + return new Date(datetime.getFullYear(), datetime.getMonth(), + // 4 = index of Thursday + datetime.getDate() + (4 - datetime.getDay())); +} + +function weekGetter(size) { + return function(date) { + var firstThurs = getFirstThursdayOfYear(date.getFullYear()), + thisThurs = getThursdayThisWeek(date); + + var diff = +thisThurs - +firstThurs, + result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week + + return padNumber(result, size); + }; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +function eraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; +} + +function longEraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4), + yy: dateGetter('FullYear', 2, 0, true), + y: dateGetter('FullYear', 1), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter, + ww: weekGetter(2), + w: weekGetter(1), + G: eraGetter, + GG: eraGetter, + GGG: eraGetter, + GGGG: longEraGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, + NUMBER_STRING = /^\-?\d+$/; + +/** + * @ngdoc filter + * @name date + * @kind function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in AM/PM, padded (01-12) + * * `'h'`: Hour in AM/PM, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'sss'`: Millisecond in second, padded (000-999) + * * `'a'`: AM/PM marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year + * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year + * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') + * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 PM) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) + * + * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. + * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence + * (e.g. `"h 'o''clock'"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the + * continental US time zone abbreviations, but for general use, use a time zone offset, for + * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) + * If not specified, the timezone of the browser will be used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
      + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
      + {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
      + {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: + {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
      +
      + + it('should format date', function() { + expect(element(by.binding("1288323623006 | date:'medium'")).getText()). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). + toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); + }); + +
      + */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = toInt(match[9] + match[10]); + tzMin = toInt(match[9] + match[11]); + } + dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); + var h = toInt(match[4] || 0) - tzHour; + var m = toInt(match[5] || 0) - tzMin; + var s = toInt(match[6] || 0); + var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format, timezone) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date) || !isFinite(date.getTime())) { + return date; + } + + while (format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + var dateTimezoneOffset = date.getTimezoneOffset(); + if (timezone) { + dateTimezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + date = convertTimezoneToLocal(date, timezone, true); + } + forEach(parts, function(value) { + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) + : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name json + * @kind function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. + * @returns {string} JSON string. + * + * + * @example + + +
      {{ {'name':'value'} | json }}
      +
      {{ {'name':'value'} | json:4 }}
      +
      + + it('should jsonify filtered objects', function() { + expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
      + * + */ +function jsonFilter() { + return function(object, spacing) { + if (isUndefined(spacing)) { + spacing = 2; + } + return toJson(object, spacing); + }; +} + + +/** + * @ngdoc filter + * @name lowercase + * @kind function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name uppercase + * @kind function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc filter + * @name limitTo + * @kind function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements + * are taken from either the beginning or the end of the source array, string or number, as specified by + * the value and sign (positive or negative) of `limit`. If a number is used as input, it is + * converted to a string. + * + * @param {Array|string|number} input Source array, string or number to be limited. + * @param {string|number} limit The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, + * the input will be returned unchanged. + * @param {(string|number)=} begin Index at which to begin limitation. As a negative index, `begin` + * indicates an offset from the end of `input`. Defaults to `0`. + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array + * had less than `limit` elements. + * + * @example + + + +
      + +

      Output numbers: {{ numbers | limitTo:numLimit }}

      + +

      Output letters: {{ letters | limitTo:letterLimit }}

      + +

      Output long number: {{ longNumber | limitTo:longNumberLimit }}

      +
      +
      + + var numLimitInput = element(by.model('numLimit')); + var letterLimitInput = element(by.model('letterLimit')); + var longNumberLimitInput = element(by.model('longNumberLimit')); + var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); + var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); + var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); + + it('should limit the number array to first three items', function() { + expect(numLimitInput.getAttribute('value')).toBe('3'); + expect(letterLimitInput.getAttribute('value')).toBe('3'); + expect(longNumberLimitInput.getAttribute('value')).toBe('3'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); + expect(limitedLetters.getText()).toEqual('Output letters: abc'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); + }); + + // There is a bug in safari and protractor that doesn't like the minus key + // it('should update the output when -3 is entered', function() { + // numLimitInput.clear(); + // numLimitInput.sendKeys('-3'); + // letterLimitInput.clear(); + // letterLimitInput.sendKeys('-3'); + // longNumberLimitInput.clear(); + // longNumberLimitInput.sendKeys('-3'); + // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); + // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); + // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); + // }); + + it('should not exceed the maximum size of input array', function() { + numLimitInput.clear(); + numLimitInput.sendKeys('100'); + letterLimitInput.clear(); + letterLimitInput.sendKeys('100'); + longNumberLimitInput.clear(); + longNumberLimitInput.sendKeys('100'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); + expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); + }); + +
      +*/ +function limitToFilter() { + return function(input, limit, begin) { + if (Math.abs(Number(limit)) === Infinity) { + limit = Number(limit); + } else { + limit = toInt(limit); + } + if (isNaN(limit)) return input; + + if (isNumber(input)) input = input.toString(); + if (!isArray(input) && !isString(input)) return input; + + begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); + begin = (begin < 0 && begin >= -input.length) ? input.length + begin : begin; + + if (limit >= 0) { + return input.slice(begin, begin + limit); + } else { + if (begin === 0) { + return input.slice(limit, input.length); + } else { + return input.slice(Math.max(0, begin + limit), begin); + } + } + }; +} + +/** + * @ngdoc filter + * @name orderBy + * @kind function + * + * @description + * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically + * for strings and numerically for numbers. Note: if you notice numbers are not being sorted + * as expected, make sure they are actually being saved as numbers and not strings. + * + * @param {Array} array The array to sort. + * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be + * used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `===`, `>` operator. + * - `string`: An Angular expression. The result of this expression is used to compare elements + * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by + * 3 first characters of a property called `name`). The result of a constant expression + * is interpreted as a property name to be used in comparisons (for example `"special name"` + * to sort object by the value of their `special name` property). An expression can be + * optionally prefixed with `+` or `-` to control ascending or descending sort order + * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array + * element itself is used to compare where sorting. + * - `Array`: An array of function or string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + * + * If the predicate is missing or empty then it defaults to `'+'`. + * + * @param {boolean=} reverse Reverse the order of the array. + * @returns {Array} Sorted copy of the source array. + * + * + * @example + * The example below demonstrates a simple ngRepeat, where the data is sorted + * by age in descending order (predicate is set to `'-age'`). + * `reverse` is not set, which means it defaults to `false`. + + + +
      + + + + + + + + + + + +
      NamePhone NumberAge
      {{friend.name}}{{friend.phone}}{{friend.age}}
      +
      +
      +
      + * + * The predicate and reverse parameters can be controlled dynamically through scope properties, + * as shown in the next example. + * @example + + + + +
      +
      Sorting predicate = {{predicate}}; reverse = {{reverse}}
      +
      + [ unsorted ] + + + + + + + + + + + +
      + Name + + + Phone Number + + + Age + +
      {{friend.name}}{{friend.phone}}{{friend.age}}
      +
      +
      +
      + * + * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the + * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the + * desired parameters. + * + * Example: + * + * @example + + +
      + + + + + + + + + + + +
      Name + (^)Phone NumberAge
      {{friend.name}}{{friend.phone}}{{friend.age}}
      +
      +
      + + + angular.module('orderByExample', []) + .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { + var orderBy = $filter('orderBy'); + $scope.friends = [ + { name: 'John', phone: '555-1212', age: 10 }, + { name: 'Mary', phone: '555-9876', age: 19 }, + { name: 'Mike', phone: '555-4321', age: 21 }, + { name: 'Adam', phone: '555-5678', age: 35 }, + { name: 'Julie', phone: '555-8765', age: 29 } + ]; + $scope.order = function(predicate, reverse) { + $scope.friends = orderBy($scope.friends, predicate, reverse); + }; + $scope.order('-age',false); + }]); + +
      + */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse) { + return function(array, sortPredicate, reverseOrder) { + + if (!(isArrayLike(array))) return array; + + if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } + if (sortPredicate.length === 0) { sortPredicate = ['+']; } + + var predicates = processPredicates(sortPredicate, reverseOrder); + + // The next three lines are a version of a Swartzian Transform idiom from Perl + // (sometimes called the Decorate-Sort-Undecorate idiom) + // See https://en.wikipedia.org/wiki/Schwartzian_transform + var compareValues = Array.prototype.map.call(array, getComparisonObject); + compareValues.sort(doComparison); + array = compareValues.map(function(item) { return item.value; }); + + return array; + + function getComparisonObject(value, index) { + return { + value: value, + predicateValues: predicates.map(function(predicate) { + return getPredicateValue(predicate.get(value), index); + }) + }; + } + + function doComparison(v1, v2) { + var result = 0; + for (var index=0, length = predicates.length; index < length; ++index) { + result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending; + if (result) break; + } + return result; + } + }; + + function processPredicates(sortPredicate, reverseOrder) { + reverseOrder = reverseOrder ? -1 : 1; + return sortPredicate.map(function(predicate) { + var descending = 1, get = identity; + + if (isFunction(predicate)) { + get = predicate; + } else if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-' ? -1 : 1; + predicate = predicate.substring(1); + } + if (predicate !== '') { + get = $parse(predicate); + if (get.constant) { + var key = get(); + get = function(value) { return value[key]; }; + } + } + } + return { get: get, descending: descending * reverseOrder }; + }); + } + + function isPrimitive(value) { + switch (typeof value) { + case 'number': /* falls through */ + case 'boolean': /* falls through */ + case 'string': + return true; + default: + return false; + } + } + + function objectValue(value, index) { + // If `valueOf` is a valid function use that + if (typeof value.valueOf === 'function') { + value = value.valueOf(); + if (isPrimitive(value)) return value; + } + // If `toString` is a valid function and not the one from `Object.prototype` use that + if (hasCustomToString(value)) { + value = value.toString(); + if (isPrimitive(value)) return value; + } + // We have a basic object so we use the position of the object in the collection + return index; + } + + function getPredicateValue(value, index) { + var type = typeof value; + if (value === null) { + type = 'string'; + value = 'null'; + } else if (type === 'string') { + value = value.toLowerCase(); + } else if (type === 'object') { + value = objectValue(value, index); + } + return { value: value, type: type }; + } + + function compare(v1, v2) { + var result = 0; + if (v1.type === v2.type) { + if (v1.value !== v2.value) { + result = v1.value < v2.value ? -1 : 1; + } + } else { + result = v1.type < v2.type ? -1 : 1; + } + return result; + } +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + }; + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name a + * @restrict E + * + * @description + * Modifies the default behavior of the html A tag so that the default action is prevented when + * the href attribute is empty. + * + * This change permits the easy creation of action links with the `ngClick` directive + * without changing the location or causing page reloads, e.g.: + * `Add Item` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + if (!attr.href && !attr.xlinkHref) { + return function(scope, element) { + // If the linked element is not an anchor tag anymore, do nothing + if (element[0].nodeName.toLowerCase() !== 'a') return; + + // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. + var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? + 'xlink:href' : 'href'; + element.on('click', function(event) { + // if we have no href url, then don't navigate anywhere. + if (!element.attr(href)) { + event.preventDefault(); + } + }); + }; + } + } +}); + +/** + * @ngdoc directive + * @name ngHref + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in an href attribute will + * make the link go to the wrong URL if the user clicks it before + * Angular has a chance to replace the `{{hash}}` markup with its + * value. Until Angular replaces the markup the link will be broken + * and will most likely return a 404 error. The `ngHref` directive + * solves this problem. + * + * The wrong way to write it: + * ```html + * link1 + * ``` + * + * The correct way to write it: + * ```html + * link1 + * ``` + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @example + * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes + * in links and their different behaviors: + + +
      + link 1 (link, don't reload)
      + link 2 (link, don't reload)
      + link 3 (link, reload!)
      + anchor (link, don't reload)
      + anchor (no link)
      + link (link, change location) +
      + + it('should execute ng-click but not reload when href without value', function() { + element(by.id('link-1')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('1'); + expect(element(by.id('link-1')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element(by.id('link-2')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('2'); + expect(element(by.id('link-2')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); + + element(by.id('link-3')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/123$/); + }); + }, 5000, 'page should navigate to /123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element(by.id('link-4')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('4'); + expect(element(by.id('link-4')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element(by.id('link-5')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('5'); + expect(element(by.id('link-5')).getAttribute('href')).toBe(null); + }); + + it('should only change url when only ng-href', function() { + element(by.model('value')).clear(); + element(by.model('value')).sendKeys('6'); + expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); + + element(by.id('link-6')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/6$/); + }); + }, 5000, 'page should navigate to /6'); + }); + +
      + */ + +/** + * @ngdoc directive + * @name ngSrc + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngSrcset + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngDisabled + * @restrict A + * @priority 100 + * + * @description + * + * This directive sets the `disabled` attribute on the element if the + * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `disabled` + * attribute. The following example would make the button enabled on Chrome/Firefox + * but not on older IEs: + * + * ```html + * + *
      + * + *
      + * ``` + * + * This is because the HTML specification does not require browsers to preserve the values of + * boolean attributes such as `disabled` (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * + * @example + + +
      + +
      + + it('should toggle button', function() { + expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); + }); + +
      + * + * @element INPUT + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, + * then the `disabled` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngChecked + * @restrict A + * @priority 100 + * + * @description + * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. + * + * Note that this directive should not be used together with {@link ngModel `ngModel`}, + * as this can lead to unexpected behavior. + * + * ### Why do we need `ngChecked`? + * + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as checked. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngChecked` directive solves this problem for the `checked` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
      + +
      + + it('should check both checkBoxes', function() { + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); + element(by.model('master')).click(); + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); + }); + +
      + * + * @element INPUT + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, + * then the `checked` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngReadonly + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as readonly. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngReadonly` directive solves this problem for the `readonly` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
      + +
      + + it('should toggle readonly attr', function() { + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); + }); + +
      + * + * @element INPUT + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, + * then special attribute "readonly" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngSelected + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as selected. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngSelected` directive solves this problem for the `selected` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * + * @example + + +
      + +
      + + it('should select Greetings!', function() { + expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); + element(by.model('selected')).click(); + expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); + }); + +
      + * + * @element OPTION + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, + * then special attribute "selected" will be set on the element + */ + +/** + * @ngdoc directive + * @name ngOpen + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as open. (Their presence means true and their absence means false.) + * If we put an Angular interpolation expression into such an attribute then the + * binding information would be lost when the browser removes the attribute. + * The `ngOpen` directive solves this problem for the `open` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
      +
      + Show/Hide me +
      +
      + + it('should toggle open', function() { + expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); + element(by.model('open')).click(); + expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); + }); + +
      + * + * @element DETAILS + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, + * then special attribute "open" will be set on the element + */ + +var ngAttributeAliasDirectives = {}; + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + // binding to multiple is not supported + if (propName == "multiple") return; + + function defaultLinkFn(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + } + + var normalized = directiveNormalize('ng-' + attrName); + var linkFn = defaultLinkFn; + + if (propName === 'checked') { + linkFn = function(scope, element, attr) { + // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input + if (attr.ngModel !== attr[normalized]) { + defaultLinkFn(scope, element, attr); + } + }; + } + + ngAttributeAliasDirectives[normalized] = function() { + return { + restrict: 'A', + priority: 100, + link: linkFn + }; + }; +}); + +// aliased input attrs are evaluated +forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { + ngAttributeAliasDirectives[ngAttr] = function() { + return { + priority: 100, + link: function(scope, element, attr) { + //special case ngPattern when a literal regular expression value + //is used as the expression (this way we don't have to watch anything). + if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { + var match = attr.ngPattern.match(REGEX_STRING_REGEXP); + if (match) { + attr.$set("ngPattern", new RegExp(match[1], match[2])); + return; + } + } + + scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { + attr.$set(ngAttr, value); + }); + } + }; + }; +}); + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + var propName = attrName, + name = attrName; + + if (attrName === 'href' && + toString.call(element.prop('href')) === '[object SVGAnimatedString]') { + name = 'xlinkHref'; + attr.$attr[name] = 'xlink:href'; + propName = null; + } + + attr.$observe(normalized, function(value) { + if (!value) { + if (attrName === 'href') { + attr.$set(name, null); + } + return; + } + + attr.$set(name, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie && propName) element.prop(propName, attr[name]); + }); + } + }; + }; +}); + +/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true + */ +var nullFormCtrl = { + $addControl: noop, + $$renameControl: nullFormRenameControl, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop, + $setSubmitted: noop +}, +SUBMITTED_CLASS = 'ng-submitted'; + +function nullFormRenameControl(control, name) { + control.$name = name; +} + +/** + * @ngdoc type + * @name form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * @property {boolean} $submitted True if user has submitted the form even if its invalid. + * + * @property {Object} $error Is an object hash, containing references to controls or + * forms with failing validators, where: + * + * - keys are validation tokens (error names), + * - values are arrays of controls or forms that have a failing validator for given error name. + * + * Built-in validation tokens: + * + * - `email` + * - `max` + * - `maxlength` + * - `min` + * - `minlength` + * - `number` + * - `pattern` + * - `required` + * - `url` + * - `date` + * - `datetimelocal` + * - `time` + * - `week` + * - `month` + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as the state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; +function FormController(element, attrs, $scope, $animate, $interpolate) { + var form = this, + controls = []; + + var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl; + + // init state + form.$error = {}; + form.$$success = {}; + form.$pending = undefined; + form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + form.$submitted = false; + + parentForm.$addControl(form); + + /** + * @ngdoc method + * @name form.FormController#$rollbackViewValue + * + * @description + * Rollback all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is typically needed by the reset button of + * a form that uses `ng-model-options` to pend updates. + */ + form.$rollbackViewValue = function() { + forEach(controls, function(control) { + control.$rollbackViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$commitViewValue + * + * @description + * Commit all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` + * usually handles calling this in response to input events. + */ + form.$commitViewValue = function() { + forEach(controls, function(control) { + control.$commitViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$addControl + * + * @description + * Register a control with the form. + * + * Input elements using ngModelController do this automatically when they are linked. + */ + form.$addControl = function(control) { + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored + // and not added to the scope. Now we throw an error. + assertNotHasOwnProperty(control.$name, 'input'); + controls.push(control); + + if (control.$name) { + form[control.$name] = control; + } + }; + + // Private API: rename a form control + form.$$renameControl = function(control, newName) { + var oldName = control.$name; + + if (form[oldName] === control) { + delete form[oldName]; + } + form[newName] = control; + control.$name = newName; + }; + + /** + * @ngdoc method + * @name form.FormController#$removeControl + * + * @description + * Deregister a control from the form. + * + * Input elements using ngModelController do this automatically when they are destroyed. + */ + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(form.$pending, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$error, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$$success, function(value, name) { + form.$setValidity(name, null, control); + }); + + arrayRemove(controls, control); + }; + + + /** + * @ngdoc method + * @name form.FormController#$setValidity + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ + addSetValidityMethod({ + ctrl: this, + $element: element, + set: function(object, property, controller) { + var list = object[property]; + if (!list) { + object[property] = [controller]; + } else { + var index = list.indexOf(controller); + if (index === -1) { + list.push(controller); + } + } + }, + unset: function(object, property, controller) { + var list = object[property]; + if (!list) { + return; + } + arrayRemove(list, controller); + if (list.length === 0) { + delete object[property]; + } + }, + parentForm: parentForm, + $animate: $animate + }); + + /** + * @ngdoc method + * @name form.FormController#$setDirty + * + * @description + * Sets the form to a dirty state. + * + * This method can be called to add the 'ng-dirty' class and set the form to a dirty + * state (ng-dirty class). This method will also propagate to parent forms. + */ + form.$setDirty = function() { + $animate.removeClass(element, PRISTINE_CLASS); + $animate.addClass(element, DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + parentForm.$setDirty(); + }; + + /** + * @ngdoc method + * @name form.FormController#$setPristine + * + * @description + * Sets the form to its pristine state. + * + * This method can be called to remove the 'ng-dirty' class and set the form to its pristine + * state (ng-pristine class). This method will also propagate to all the controls contained + * in this form. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function() { + $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); + form.$dirty = false; + form.$pristine = true; + form.$submitted = false; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setUntouched + * + * @description + * Sets the form to its untouched state. + * + * This method can be called to remove the 'ng-touched' class and set the form controls to their + * untouched state (ng-untouched class). + * + * Setting a form controls back to their untouched state is often useful when setting the form + * back to its pristine state. + */ + form.$setUntouched = function() { + forEach(controls, function(control) { + control.$setUntouched(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setSubmitted + * + * @description + * Sets the form to its submitted state. + */ + form.$setSubmitted = function() { + $animate.addClass(element, SUBMITTED_CLASS); + form.$submitted = true; + parentForm.$setSubmitted(); + }; +} + +/** + * @ngdoc directive + * @name ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * Note: the purpose of `ngForm` is to group controls, + * but not to be a replacement for the `
      ` tag with all of its capabilities + * (e.g. posting to the server, ...). + * + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name form + * @restrict E + * + * @description + * Directive that instantiates + * {@link form.FormController FormController}. + * + * If the `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * In Angular, forms can be nested. This means that the outer form is valid when all of the child + * forms are valid as well. However, browsers do not allow nesting of `` elements, so + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to + * `` but can be nested. This allows you to have nested forms, which is very useful when + * using Angular validation directives in forms that are dynamically generated using the + * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` + * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an + * `ngForm` directive and nest these in an outer `form` element. + * + * + * # CSS classes + * - `ng-valid` is set if the form is valid. + * - `ng-invalid` is set if the form is invalid. + * - `ng-pristine` is set if the form is pristine. + * - `ng-dirty` is set if the form is dirty. + * - `ng-submitted` is set if the form was submitted. + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * + * # Submitting a form and preventing the default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in an application-specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} + * or {@link ng.directive:ngClick ngClick} directives. + * This is because of the following form submission rules in the HTML specification: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is + * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` + * to have access to the updated model. + * + * ## Animation Hooks + * + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. + * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any + * other validations that are performed within the form. Animations in ngForm are similar to how + * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well + * as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style a form element + * that has been rendered as invalid after it has been validated: + * + *
      + * //be sure to include ngAnimate as a module to hook into more
      + * //advanced animations
      + * .my-form {
      + *   transition:0.5s linear all;
      + *   background: white;
      + * }
      + * .my-form.ng-invalid {
      + *   background: red;
      + *   color:white;
      + * }
      + * 
      + * + * @example + + + + + + userType: + Required!
      + userType = {{userType}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      + +
      + + it('should initialize to model', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + + expect(userType.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + var userInput = element(by.model('userType')); + + userInput.clear(); + userInput.sendKeys(''); + + expect(userType.getText()).toEqual('userType ='); + expect(valid.getText()).toContain('false'); + }); + +
      + * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', function($timeout) { + var formDirective = { + name: 'form', + restrict: isNgForm ? 'EAC' : 'E', + controller: FormController, + compile: function ngFormCompile(formElement, attr) { + // Setup initial state of the control + formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); + + var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); + + return { + pre: function ngFormPreLink(scope, formElement, attr, controller) { + // if `action` attr is not present on the form, prevent the default action (submission) + if (!('action' in attr)) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var handleFormSubmission = function(event) { + scope.$apply(function() { + controller.$commitViewValue(); + controller.$setSubmitted(); + }); + + event.preventDefault(); + }; + + addEventListenerFn(formElement[0], 'submit', handleFormSubmission); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.on('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); + }, 0, false); + }); + } + + var parentFormCtrl = controller.$$parentForm; + + if (nameAttr) { + setter(scope, controller.$name, controller, controller.$name); + attr.$observe(nameAttr, function(newValue) { + if (controller.$name === newValue) return; + setter(scope, controller.$name, undefined, controller.$name); + parentFormCtrl.$$renameControl(controller, newValue); + setter(scope, controller.$name, controller, controller.$name); + }); + } + formElement.on('$destroy', function() { + parentFormCtrl.$removeControl(controller); + if (nameAttr) { + setter(scope, attr[nameAttr], undefined, controller.$name); + } + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + }; + } + }; + + return formDirective; + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +/* global VALID_CLASS: false, + INVALID_CLASS: false, + PRISTINE_CLASS: false, + DIRTY_CLASS: false, + UNTOUCHED_CLASS: false, + TOUCHED_CLASS: false, + $ngModelMinErr: false, +*/ + +// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 +var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; +var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; +var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; +var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; +var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/; +var MONTH_REGEXP = /^(\d{4})-(\d\d)$/; +var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; + +var inputType = { + + /** + * @ngdoc input + * @name input[text] + * + * @description + * Standard HTML text input with angular data binding, inherited by most of the `input` elements. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
      + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
      + +
      + + Required! + + Single word only! +
      + text = {{example.text}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var text = element(by.binding('example.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if multi word', function() { + input.clear(); + input.sendKeys('hello world'); + + expect(valid.getText()).toContain('false'); + }); + +
      + */ + 'text': textInputType, + + /** + * @ngdoc input + * @name input[date] + * + * @description + * Input with date validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 + * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many + * modern browsers do not yet support this input type, it is important to provide cues to users on the + * expected input format via a placeholder or label. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO date string (yyyy-MM-dd). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO date string (yyyy-MM-dd). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + + +
      + + Required! + + Not a valid date! +
      + value = {{example.value | date: "yyyy-MM-dd"}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (see https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10-22'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
      + */ + 'date': createDateInputType('date', DATE_REGEXP, + createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), + 'yyyy-MM-dd'), + + /** + * @ngdoc input + * @name input[datetime-local] + * + * @description + * Input with datetime validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + + +
      + + Required! + + Not a valid date! +
      + value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2010-12-28T14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01T23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
      + */ + 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, + createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), + 'yyyy-MM-ddTHH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[time] + * + * @description + * Input with time validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a + * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO time format (HH:mm:ss). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a + * valid ISO time format (HH:mm:ss). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + + +
      + + Required! + + Not a valid date! +
      + value = {{example.value | date: "HH:mm:ss"}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var value = element(by.binding('example.value | date: "HH:mm:ss"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
      + */ + 'time': createDateInputType('time', TIME_REGEXP, + createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), + 'HH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[week] + * + * @description + * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support + * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * week format (yyyy-W##), for example: `2013-W02`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a + * valid ISO week format (yyyy-W##). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO week format (yyyy-W##). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + +
      + + Required! + + Not a valid date! +
      + value = {{example.value | date: "yyyy-Www"}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var value = element(by.binding('example.value | date: "yyyy-Www"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-W01'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-W01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
      + */ + 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), + + /** + * @ngdoc input + * @name input[month] + * + * @description + * Input with month validation and transformation. In browsers that do not yet support + * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * month format (yyyy-MM), for example: `2009-01`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * If the model is not set to the first of the month, the next view to model update will set it + * to the first of the month. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be + * a valid ISO month format (yyyy-MM). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must + * be a valid ISO month format (yyyy-MM). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + + +
      + + Required! + + Not a valid month! +
      + value = {{example.value | date: "yyyy-MM"}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var value = element(by.binding('example.value | date: "yyyy-MM"')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + // currently protractor/webdriver does not support + // sending keys to all known HTML5 input controls + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
      + */ + 'month': createDateInputType('month', MONTH_REGEXP, + createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), + 'yyyy-MM'), + + /** + * @ngdoc input + * @name input[number] + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + *
      + * The model must always be of type `number` otherwise Angular will throw an error. + * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} + * error docs for more information and an example of how to convert your model if necessary. + *
      + * + * ## Issues with HTML5 constraint validation + * + * In browsers that follow the + * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), + * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. + * If a non-number is entered in the input, the browser will report the value as an empty string, + * which means the view / model values in `ngModel` and subsequently the scope value + * will also be an empty string. + * + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
      + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + +
      + + Required! + + Not valid number! +
      + value = {{example.value}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      +
      +
      + + var value = element(by.binding('example.value')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + it('should initialize to model', function() { + expect(value.getText()).toContain('12'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if over max', function() { + input.clear(); + input.sendKeys('123'); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + +
      + */ + 'number': numberInputType, + + + /** + * @ngdoc input + * @name input[url] + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + *
      + * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex + * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify + * the built-in validators (see the {@link guide/forms Forms guide}) + *
      + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
      + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      +
      + + var text = element(by.binding('url.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('url.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('http://google.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not url', function() { + input.clear(); + input.sendKeys('box'); + + expect(valid.getText()).toContain('false'); + }); + +
      + */ + 'url': urlInputType, + + + /** + * @ngdoc input + * @name input[email] + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + *
      + * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex + * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can + * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) + *
      + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of + * any length. + * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string + * that contains the regular expression body that will be converted to a regular expression + * as in the ngPattern directive. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
      + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      + +
      + + Required! + + Not valid email! +
      + text = {{email.text}}
      + myForm.input.$valid = {{myForm.input.$valid}}
      + myForm.input.$error = {{myForm.input.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      + myForm.$error.email = {{!!myForm.$error.email}}
      +
      +
      + + var text = element(by.binding('email.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('email.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('me@example.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not email', function() { + input.clear(); + input.sendKeys('xxx'); + + expect(valid.getText()).toContain('false'); + }); + +
      + */ + 'email': emailInputType, + + + /** + * @ngdoc input + * @name input[radio] + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the `ngModel` expression should be set when selected. + * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, + * too. Use `ngValue` if you need complex models (`number`, `object`, ...). + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio + * is selected. Should be used instead of the `value` attribute if you need + * a non-string `ngModel` (`boolean`, `array`, ...). + * + * @example + + + +
      +
      +
      +
      + color = {{color.name | json}}
      +
      + Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. +
      + + it('should change state', function() { + var color = element(by.binding('color.name')); + + expect(color.getText()).toContain('blue'); + + element.all(by.model('color.name')).get(0).click(); + + expect(color.getText()).toContain('red'); + }); + +
      + */ + 'radio': radioInputType, + + + /** + * @ngdoc input + * @name input[checkbox] + * + * @description + * HTML checkbox. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {expression=} ngTrueValue The value to which the expression should be set when selected. + * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
      +
      +
      + value1 = {{checkboxModel.value1}}
      + value2 = {{checkboxModel.value2}}
      +
      +
      + + it('should change state', function() { + var value1 = element(by.binding('checkboxModel.value1')); + var value2 = element(by.binding('checkboxModel.value2')); + + expect(value1.getText()).toContain('true'); + expect(value2.getText()).toContain('YES'); + + element(by.model('checkboxModel.value1')).click(); + element(by.model('checkboxModel.value2')).click(); + + expect(value1.getText()).toContain('false'); + expect(value2.getText()).toContain('NO'); + }); + +
      + */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop, + 'file': noop +}; + +function stringBasedInputType(ctrl) { + ctrl.$formatters.push(function(value) { + return ctrl.$isEmpty(value) ? value : value.toString(); + }); +} + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); +} + +function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { + var type = lowercase(element[0].type); + + // In composition mode, users are still inputing intermediate text buffer, + // hold the listener until composition is done. + // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent + if (!$sniffer.android) { + var composing = false; + + element.on('compositionstart', function(data) { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + listener(); + }); + } + + var listener = function(ev) { + if (timeout) { + $browser.defer.cancel(timeout); + timeout = null; + } + if (composing) return; + var value = element.val(), + event = ev && ev.type; + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // If input type is 'password', the value is never trimmed + if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { + value = trim(value); + } + + // If a control is suffering from bad input (due to native validators), browsers discard its + // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the + // control's value is the same empty value twice in a row. + if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { + ctrl.$setViewValue(value, event); + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.on('input', listener); + } else { + var timeout; + + var deferListener = function(ev, input, origValue) { + if (!timeout) { + timeout = $browser.defer(function() { + timeout = null; + if (!input || input.value !== origValue) { + listener(ev); + } + }); + } + }; + + element.on('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(event, this, this.value); + }); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.on('paste cut', deferListener); + } + } + + // if user paste into input using mouse on older browser + // or form autocomplete on newer browser, we need "change" event to catch it + element.on('change', listener); + + ctrl.$render = function() { + element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); + }; +} + +function weekParser(isoWeek, existingDate) { + if (isDate(isoWeek)) { + return isoWeek; + } + + if (isString(isoWeek)) { + WEEK_REGEXP.lastIndex = 0; + var parts = WEEK_REGEXP.exec(isoWeek); + if (parts) { + var year = +parts[1], + week = +parts[2], + hours = 0, + minutes = 0, + seconds = 0, + milliseconds = 0, + firstThurs = getFirstThursdayOfYear(year), + addDays = (week - 1) * 7; + + if (existingDate) { + hours = existingDate.getHours(); + minutes = existingDate.getMinutes(); + seconds = existingDate.getSeconds(); + milliseconds = existingDate.getMilliseconds(); + } + + return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); + } + } + + return NaN; +} + +function createDateParser(regexp, mapping) { + return function(iso, date) { + var parts, map; + + if (isDate(iso)) { + return iso; + } + + if (isString(iso)) { + // When a date is JSON'ified to wraps itself inside of an extra + // set of double quotes. This makes the date parsing code unable + // to match the date string and parse it as a date. + if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { + iso = iso.substring(1, iso.length - 1); + } + if (ISO_DATE_REGEXP.test(iso)) { + return new Date(iso); + } + regexp.lastIndex = 0; + parts = regexp.exec(iso); + + if (parts) { + parts.shift(); + if (date) { + map = { + yyyy: date.getFullYear(), + MM: date.getMonth() + 1, + dd: date.getDate(), + HH: date.getHours(), + mm: date.getMinutes(), + ss: date.getSeconds(), + sss: date.getMilliseconds() / 1000 + }; + } else { + map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; + } + + forEach(parts, function(part, index) { + if (index < mapping.length) { + map[mapping[index]] = +part; + } + }); + return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); + } + } + + return NaN; + }; +} + +function createDateInputType(type, regexp, parseDate, format) { + return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; + var previousDate; + + ctrl.$$parserName = type; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (regexp.test(value)) { + // Note: We cannot read ctrl.$modelValue, as there might be a different + // parser/formatter in the processing chain so that the model + // contains some different data format! + var parsedDate = parseDate(value, previousDate); + if (timezone) { + parsedDate = convertTimezoneToLocal(parsedDate, timezone); + } + return parsedDate; + } + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (value && !isDate(value)) { + throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); + } + if (isValidDate(value)) { + previousDate = value; + if (previousDate && timezone) { + previousDate = convertTimezoneToLocal(previousDate, timezone, true); + } + return $filter('date')(value, format, timezone); + } else { + previousDate = null; + return ''; + } + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; + }; + attr.$observe('min', function(val) { + minVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; + }; + attr.$observe('max', function(val) { + maxVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + function isValidDate(value) { + // Invalid Date: getTime() returns NaN + return value && !(value.getTime && value.getTime() !== value.getTime()); + } + + function parseObservedDateValue(val) { + return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined; + } + }; +} + +function badInputChecker(scope, element, attr, ctrl) { + var node = element[0]; + var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); + if (nativeValidation) { + ctrl.$parsers.push(function(value) { + var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; + // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430): + // - also sets validity.badInput (should only be validity.typeMismatch). + // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email) + // - can ignore this case as we can still read out the erroneous email... + return validity.badInput && !validity.typeMismatch ? undefined : value; + }); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$$parserName = 'number'; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (NUMBER_REGEXP.test(value)) return parseFloat(value); + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (!ctrl.$isEmpty(value)) { + if (!isNumber(value)) { + throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); + } + value = value.toString(); + } + return value; + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; + }; + + attr.$observe('min', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val, 10); + } + minVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; + }; + + attr.$observe('max', function(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val, 10); + } + maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + }); + } +} + +function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'url'; + ctrl.$validators.url = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || URL_REGEXP.test(value); + }; +} + +function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { + // Note: no badInputChecker here by purpose as `url` is only a validation + // in browsers, i.e. we can always read out input.value even if it is not valid! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'email'; + ctrl.$validators.email = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); + }; +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + var listener = function(ev) { + if (element[0].checked) { + ctrl.$setViewValue(attr.value, ev && ev.type); + } + }; + + element.on('click', listener); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function parseConstantExpr($parse, context, name, expression, fallback) { + var parseFn; + if (isDefined(expression)) { + parseFn = $parse(expression); + if (!parseFn.constant) { + throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' + + '`{1}`.', name, expression); + } + return parseFn(context); + } + return fallback; +} + +function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { + var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); + var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); + + var listener = function(ev) { + ctrl.$setViewValue(element[0].checked, ev && ev.type); + }; + + element.on('click', listener); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` + // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert + // it to a boolean. + ctrl.$isEmpty = function(value) { + return value === false; + }; + + ctrl.$formatters.push(function(value) { + return equals(value, trueValue); + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
      + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + */ + + +/** + * @ngdoc directive + * @name input + * @restrict E + * + * @description + * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, + * input state control, and validation. + * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. + * + *
      + * **Note:** Not every feature offered is available for all input types. + * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. + *
      + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than + * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any + * length. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match + * a RegExp found by evaluating the Angular expression given in the attribute value. + * If the expression evaluates to a RegExp object, then this is used directly. + * If the expression evaluates to a string, then it will be converted to a RegExp + * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to + * `new RegExp('^abc$')`.
      + * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
      +
      + +
      + + Required! +
      + +
      + + Too short! + + Too long! +
      +
      +
      + user = {{user}}
      + myForm.userName.$valid = {{myForm.userName.$valid}}
      + myForm.userName.$error = {{myForm.userName.$error}}
      + myForm.lastName.$valid = {{myForm.lastName.$valid}}
      + myForm.lastName.$error = {{myForm.lastName.$error}}
      + myForm.$valid = {{myForm.$valid}}
      + myForm.$error.required = {{!!myForm.$error.required}}
      + myForm.$error.minlength = {{!!myForm.$error.minlength}}
      + myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
      +
      +
      + + var user = element(by.exactBinding('user')); + var userNameValid = element(by.binding('myForm.userName.$valid')); + var lastNameValid = element(by.binding('myForm.lastName.$valid')); + var lastNameError = element(by.binding('myForm.lastName.$error')); + var formValid = element(by.binding('myForm.$valid')); + var userNameInput = element(by.model('user.name')); + var userLastInput = element(by.model('user.last')); + + it('should initialize to model', function() { + expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); + expect(userNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if empty when required', function() { + userNameInput.clear(); + userNameInput.sendKeys(''); + + expect(user.getText()).toContain('{"last":"visitor"}'); + expect(userNameValid.getText()).toContain('false'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be valid if empty when min length is set', function() { + userLastInput.clear(); + userLastInput.sendKeys(''); + + expect(user.getText()).toContain('{"name":"guest","last":""}'); + expect(lastNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if less than required min length', function() { + userLastInput.clear(); + userLastInput.sendKeys('xx'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('minlength'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be invalid if longer than max length', function() { + userLastInput.clear(); + userLastInput.sendKeys('some ridiculously long name'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('maxlength'); + expect(formValid.getText()).toContain('false'); + }); + +
      + */ +var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', + function($browser, $sniffer, $filter, $parse) { + return { + restrict: 'E', + require: ['?ngModel'], + link: { + pre: function(scope, element, attr, ctrls) { + if (ctrls[0]) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, + $browser, $filter, $parse); + } + } + } + }; +}]; + + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; +/** + * @ngdoc directive + * @name ngValue + * + * @description + * Binds the given expression to the value of `
      + + it('should check ng-options', function() { + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red'); + element.all(by.model('myColor')).first().click(); + element.all(by.css('select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black'); + element(by.css('.nullable select[ng-model="myColor"]')).click(); + element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null'); + }); + + + */ + +// jshint maxlen: false +// //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555550000000006666666666666660000000777777777777777000000000000000888888888800000000000000000009999999999 +var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/; + // 1: value expression (valueFn) + // 2: label expression (displayFn) + // 3: group by expression (groupByFn) + // 4: disable when expression (disableWhenFn) + // 5: array item variable name + // 6: object item key variable name + // 7: object item value variable name + // 8: collection expression + // 9: track by expression +// jshint maxlen: 100 + + +var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) { + + function parseOptionsExpression(optionsExp, selectElement, scope) { + + var match = optionsExp.match(NG_OPTIONS_REGEXP); + if (!(match)) { + throw ngOptionsMinErr('iexp', + "Expected expression in form of " + + "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" + + " but got '{0}'. Element: {1}", + optionsExp, startingTag(selectElement)); + } + + // Extract the parts from the ngOptions expression + + // The variable name for the value of the item in the collection + var valueName = match[5] || match[7]; + // The variable name for the key of the item in the collection + var keyName = match[6]; + + // An expression that generates the viewValue for an option if there is a label expression + var selectAs = / as /.test(match[0]) && match[1]; + // An expression that is used to track the id of each object in the options collection + var trackBy = match[9]; + // An expression that generates the viewValue for an option if there is no label expression + var valueFn = $parse(match[2] ? match[1] : valueName); + var selectAsFn = selectAs && $parse(selectAs); + var viewValueFn = selectAsFn || valueFn; + var trackByFn = trackBy && $parse(trackBy); + + // Get the value by which we are going to track the option + // if we have a trackFn then use that (passing scope and locals) + // otherwise just hash the given viewValue + var getTrackByValueFn = trackBy ? + function(value, locals) { return trackByFn(scope, locals); } : + function getHashOfValue(value) { return hashKey(value); }; + var getTrackByValue = function(value, key) { + return getTrackByValueFn(value, getLocals(value, key)); + }; + + var displayFn = $parse(match[2] || match[1]); + var groupByFn = $parse(match[3] || ''); + var disableWhenFn = $parse(match[4] || ''); + var valuesFn = $parse(match[8]); + + var locals = {}; + var getLocals = keyName ? function(value, key) { + locals[keyName] = key; + locals[valueName] = value; + return locals; + } : function(value) { + locals[valueName] = value; + return locals; + }; + + + function Option(selectValue, viewValue, label, group, disabled) { + this.selectValue = selectValue; + this.viewValue = viewValue; + this.label = label; + this.group = group; + this.disabled = disabled; + } + + function getOptionValuesKeys(optionValues) { + var optionValuesKeys; + + if (!keyName && isArrayLike(optionValues)) { + optionValuesKeys = optionValues; + } else { + // if object, extract keys, in enumeration order, unsorted + optionValuesKeys = []; + for (var itemKey in optionValues) { + if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') { + optionValuesKeys.push(itemKey); + } + } + } + return optionValuesKeys; + } + + return { + trackBy: trackBy, + getTrackByValue: getTrackByValue, + getWatchables: $parse(valuesFn, function(optionValues) { + // Create a collection of things that we would like to watch (watchedArray) + // so that they can all be watched using a single $watchCollection + // that only runs the handler once if anything changes + var watchedArray = []; + optionValues = optionValues || []; + + var optionValuesKeys = getOptionValuesKeys(optionValues); + var optionValuesLength = optionValuesKeys.length; + for (var index = 0; index < optionValuesLength; index++) { + var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index]; + var value = optionValues[key]; + + var locals = getLocals(optionValues[key], key); + var selectValue = getTrackByValueFn(optionValues[key], locals); + watchedArray.push(selectValue); + + // Only need to watch the displayFn if there is a specific label expression + if (match[2] || match[1]) { + var label = displayFn(scope, locals); + watchedArray.push(label); + } + + // Only need to watch the disableWhenFn if there is a specific disable expression + if (match[4]) { + var disableWhen = disableWhenFn(scope, locals); + watchedArray.push(disableWhen); + } + } + return watchedArray; + }), + + getOptions: function() { + + var optionItems = []; + var selectValueMap = {}; + + // The option values were already computed in the `getWatchables` fn, + // which must have been called to trigger `getOptions` + var optionValues = valuesFn(scope) || []; + var optionValuesKeys = getOptionValuesKeys(optionValues); + var optionValuesLength = optionValuesKeys.length; + + for (var index = 0; index < optionValuesLength; index++) { + var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index]; + var value = optionValues[key]; + var locals = getLocals(value, key); + var viewValue = viewValueFn(scope, locals); + var selectValue = getTrackByValueFn(viewValue, locals); + var label = displayFn(scope, locals); + var group = groupByFn(scope, locals); + var disabled = disableWhenFn(scope, locals); + var optionItem = new Option(selectValue, viewValue, label, group, disabled); + + optionItems.push(optionItem); + selectValueMap[selectValue] = optionItem; + } + + return { + items: optionItems, + selectValueMap: selectValueMap, + getOptionFromViewValue: function(value) { + return selectValueMap[getTrackByValue(value)]; + }, + getViewValueFromOption: function(option) { + // If the viewValue could be an object that may be mutated by the application, + // we need to make a copy and not return the reference to the value on the option. + return trackBy ? angular.copy(option.viewValue) : option.viewValue; + } + }; + } + }; + } + + + // we can't just jqLite(' + * + * + * + * {{ model }} + * + * + * angular.module('nonStringSelect', []) + * .run(function($rootScope) { + * $rootScope.model = { id: 2 }; + * }) + * .directive('convertToNumber', function() { + * return { + * require: 'ngModel', + * link: function(scope, element, attrs, ngModel) { + * ngModel.$parsers.push(function(val) { + * return parseInt(val, 10); + * }); + * ngModel.$formatters.push(function(val) { + * return '' + val; + * }); + * } + * }; + * }); + * + * + * it('should initialize to model', function() { + * var select = element(by.css('select')); + * expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two'); + * }); + * + * + * + */ +var selectDirective = function() { + + return { + restrict: 'E', + require: ['select', '?ngModel'], + controller: SelectController, + link: function(scope, element, attr, ctrls) { + + // if ngModel is not defined, we don't need to do anything + var ngModelCtrl = ctrls[1]; + if (!ngModelCtrl) return; + + var selectCtrl = ctrls[0]; + + selectCtrl.ngModelCtrl = ngModelCtrl; + + // We delegate rendering to the `writeValue` method, which can be changed + // if the select can have multiple selected values or if the options are being + // generated by `ngOptions` + ngModelCtrl.$render = function() { + selectCtrl.writeValue(ngModelCtrl.$viewValue); + }; + + // When the selected item(s) changes we delegate getting the value of the select control + // to the `readValue` method, which can be changed if the select can have multiple + // selected values or if the options are being generated by `ngOptions` + element.on('change', function() { + scope.$apply(function() { + ngModelCtrl.$setViewValue(selectCtrl.readValue()); + }); + }); + + // If the select allows multiple values then we need to modify how we read and write + // values from and to the control; also what it means for the value to be empty and + // we have to add an extra watch since ngModel doesn't work well with arrays - it + // doesn't trigger rendering if only an item in the array changes. + if (attr.multiple) { + + // Read value now needs to check each option to see if it is selected + selectCtrl.readValue = function readMultipleValue() { + var array = []; + forEach(element.find('option'), function(option) { + if (option.selected) { + array.push(option.value); + } + }); + return array; + }; + + // Write value now needs to set the selected property of each matching option + selectCtrl.writeValue = function writeMultipleValue(value) { + var items = new HashMap(value); + forEach(element.find('option'), function(option) { + option.selected = isDefined(items.get(option.value)); + }); + }; + + // we have to do it on each watch since ngModel watches reference, but + // we need to work of an array, so we need to see if anything was inserted/removed + var lastView, lastViewRef = NaN; + scope.$watch(function selectMultipleWatch() { + if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) { + lastView = shallowCopy(ngModelCtrl.$viewValue); + ngModelCtrl.$render(); + } + lastViewRef = ngModelCtrl.$viewValue; + }); + + // If we are a multiple select then value is now a collection + // so the meaning of $isEmpty changes + ngModelCtrl.$isEmpty = function(value) { + return !value || value.length === 0; + }; + + } + } + }; +}; + + +// The option directive is purely designed to communicate the existence (or lack of) +// of dynamically created (and destroyed) option elements to their containing select +// directive via its controller. +var optionDirective = ['$interpolate', function($interpolate) { + + function chromeHack(optionElement) { + // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459 + // Adding an