Commit 8eaabc83 authored by Liam's avatar Liam Committed by Robert Lyon
Browse files

Bug #1743286: styling changes for behat html report

- moved custom styling files to
htdocs/testing/frameworks/behat/html-formatter
- added code to copy files to formatter after composer updates
- added Behat2Renderer

behatnotneeded

Change-Id: Ifa5bea8477d1e55b147d58bb509d2b33b69f643b
parent 97867ed0
......@@ -139,6 +139,9 @@ try {
// Update behat and dependencies using composer
testing_update_dependencies();
}
//now composer is updated, apply custom styling to the html report
set_report_styling();
BehatConfigManager::update_config_file();
// Other possible actions we may need to take.
switch ($statuscode) {
......
<?php
/**
* Behat2 renderer for Behat report
* @author DaSayan <glennwall@free.fr>
*/
namespace emuse\BehatHTMLFormatter\Renderer ;
class Behat2Renderer
{
public function __construct() {
}
/**
* Renders before an exercice.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderBeforeExercise($obj) {
$print = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns ='http://www.w3.org/1999/xhtml'>
<head>
<meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<!-- Bootstrap -->
<!-- Latest compiled and minified CSS -->
<link rel='stylesheet' href='assets/Twig/css/bootstrap.min.css'>
" . $this->getCSS() . "
<!-- Optional theme -->
<link rel='stylesheet' href='assets/Twig/css/style.css'>
<script src='assets/Twig/js/Chart.min.js'></script>
<title>Behat Test Suite</title>
</head>
<body>
<div id='behat'>" ;
return $print ;
}
/**
* Renders after an exercice.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderAfterExercise($obj) {
//--> features results
$strFeatPassed = '' ;
if (count($obj->getPassedFeatures()) > 0) {
$strFeatPassed = ' <strong class="passed">'.count($obj->getPassedFeatures()).' success</strong>';
}
$strFeatFailed = '' ;
$sumRes = 'passed' ;
if (count($obj->getFailedFeatures()) > 0) {
$strFeatFailed = ' <strong class="failed">'.count($obj->getFailedFeatures()).' fail</strong>';
$sumRes = 'failed' ;
}
//--> scenarios results
$strScePassed = '' ;
if (count($obj->getPassedScenarios()) > 0) {
$strScePassed = ' <strong class="passed">'.count($obj->getPassedScenarios()).' success</strong>';
}
$strSceFailed = '' ;
if (count($obj->getFailedScenarios()) > 0) {
$strSceFailed = ' <strong class="failed">'.count($obj->getFailedScenarios()).' fail</strong>';
}
//--> steps results
$strStepsPassed = '' ;
if (count($obj->getPassedSteps()) > 0) {
$strStepsPassed = ' <strong class="passed">'.count($obj->getPassedSteps()).' success</strong>';
}
$strStepsPending = '' ;
if (count($obj->getPendingSteps()) > 0) {
$strStepsPending = ' <strong class="pending">'.count($obj->getPendingSteps()).' pending</strong>';
}
$strStepsSkipped = '' ;
if (count($obj->getSkippedSteps()) > 0) {
$strStepsSkipped = ' <strong class="skipped">'.count($obj->getSkippedSteps()).' skipped</strong>';
}
$strStepsFailed = '' ;
if (count($obj->getFailedSteps()) > 0) {
$strStepsFailed = ' <strong class="failed">'.count($obj->getFailedSteps()).' fail</strong>';
}
//totals
$featTotal = (count($obj->getFailedFeatures()) + count($obj->getPassedFeatures()));
$sceTotal = (count($obj->getFailedScenarios()) + count($obj->getPassedScenarios())) ;
$stepsTotal = (count($obj->getFailedSteps()) + count($obj->getPassedSteps()) + count($obj->getSkippedSteps()) + count($obj->getPendingSteps())) ;
//list of pending steps to display
$strPendingList = '' ;
if (count($obj->getPendingSteps()) > 0) {
foreach($obj->getPendingSteps() as $pendingStep) {
$strPendingList .= '
<li>' . $pendingStep->getKeyword() . ' ' . $pendingStep->getText() . '</li>' ;
}
$strPendingList = '
<div class="pending">Pending steps :
<ul>' . $strPendingList . '
</ul>
</div>';
}
$print = '
<div class="summary '.$sumRes.'">
<div class="counters">
<p class="features">
'.$featTotal.' features ('.$strFeatPassed.$strFeatFailed.' )
</p>
<p class="scenarios">
'.$sceTotal.' scenarios ('.$strScePassed.$strSceFailed.' )
</p>
<p class="steps">
'.$stepsTotal.' steps ('.$strStepsPassed.$strStepsPending.$strStepsSkipped.$strStepsFailed.' )
</p>
<p class="time">
'.$obj->getTimer().' - '.$obj->getMemory().'
</p>
</div>
<div class="switchers">
<a href="javascript:void(0)" id="behat_show_all">
<span class="icon icon-chevron-down"></span>
<span class="sr-only">Show all tests</span>
</a>
<a href="javascript:void(0)" id="behat_hide_all">
<span class="icon icon-chevron-up"></span>
<span class="sr-only">Hide all tests</span>
</a>
</div>
</div> ' .$strPendingList. '
</div>' . $this->getJS() . '
</body>
</html>' ;
return $print ;
}
/**
* Renders before a suite.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderBeforeSuite($obj) {
$print = '
<div class="suite">Suite : ' . $obj->getCurrentSuite()->getName() . '</div>';
return $print ;
}
/**
* Renders after a suite.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderAfterSuite($obj) {
return '' ;
}
/**
* Renders before a feature.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderBeforeFeature($obj) {
//feature head
$print = '
<div class="feature">
<h2>
<span id="feat'.$obj->getCurrentFeature()->getId().'" class="keyword"> Feature: </span>
<span class="title">' . $obj->getCurrentFeature()->getName() . '</span>
</h2>
<p>' . $obj->getCurrentFeature()->getDescription() . '</p>
<ul class="tags">' ;
foreach($obj->getCurrentFeature()->getTags() as $tag) {
$print .= '
<li>@' . $tag .'</li>' ;
}
$print .= '
</ul>' ;
//TODO path is missing (?)
return $print ;
}
/**
* Renders after a feature.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderAfterFeature($obj) {
//list of results
$print = '
<div class="featureResult '.$obj->getCurrentFeature()->getPassedClass().'">Feature has ' . $obj->getCurrentFeature()->getPassedClass() ;
//percent only if failed scenarios
if ($obj->getCurrentFeature()->getTotalAmountOfScenarios() > 0 && $obj->getCurrentFeature()->getPassedClass() === 'failed') {
$print .= '
<span>Scenarios passed : ' . round($obj->getCurrentFeature()->getPercentPassed(), 2) . '%,
Scenarios failed : ' . round($obj->getCurrentFeature()->getPercentFailed(), 2) . '%</span>' ;
}
$print .= '
</div>
</div>';
return $print ;
}
/**
* Renders before a scenario.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderBeforeScenario($obj) {
//scenario head
$print = '
<div class="scenario">
<ul class="tags">' ;
foreach($obj->getCurrentScenario()->getTags() as $tag) {
$print .= '
<li>@' . $tag .'</li>';
}
$print .= '
</ul>';
$print .= '
<h3>
<span class="keyword">' . $obj->getCurrentScenario()->getId() . ' Scenario: </span>
<span class="title">' . $obj->getCurrentScenario()->getName() . '</span>
</h3>
<ol>' ;
//TODO path is missing
return $print ;
}
/**
* Renders after a scenario.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderAfterScenario($obj) {
$print = '
</ol>
</div>';
return $print ;
}
/**
* Renders before an outline.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderBeforeOutline($obj) {
return '' ;
}
/**
* Renders after an outline.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderAfterOutline($obj) {
return '' ;
}
/**
* Renders before a step.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderBeforeStep($obj) {
return '' ;
}
/**
* Renders after a step.
*
* @param object : BehatHTMLFormatter object
* @return string : HTML generated
*/
public function renderAfterStep($obj) {
$steps = $obj->getCurrentScenario()->getSteps() ;
$step = end($steps) ; //needed because of strict standards
//path displayed only if available (it's not available in undefined steps)
$strPath = '' ;
if ($step->getDefinition() !== NULL ) {
$strPath = $step->getDefinition()->getPath() ;
}
$stepResultClass = '' ;
if ($step->isPassed()) {
$stepResultClass = 'passed' ;
}
if ($step->isFailed()) {
$stepResultClass = 'failed' ;
}
if ($step->isSkipped()) {
$stepResultClass = 'skipped' ;
}
if ($step->isPending()) {
$stepResultClass = 'pending' ;
}
$print = '
<li class="'.$stepResultClass.'">
<div class="step">
<span class="keyword">' . $step->getKeyWord() . ' </span>
<span class="text">' . $step->getText() . ' </span>
<span class="path">' . $strPath . '</span>
</div>' ;
if (!empty($step->getException())) {
$print .= '
<pre class="backtrace">' . $step->getException() . '</pre>' ;
}
$print .= '
</li>';
return $print ;
}
/**
* To include CSS
*
* @return string : HTML generated
*/
public function getCSS() {
return "<style type='text/css'>
</style>
<style type='text/css' media='print'>
body {
padding:0px;
}
#behat {
font-size:11px;
}
#behat .jq-toggle > .scenario,
#behat .jq-toggle > .scenario .examples,
#behat .jq-toggle > ol {
display:block;
}
#behat .summary {
position:relative;
}
#behat .summary .counters {
border:none;
}
#behat .summary .switchers {
display:none;
}
#behat .step .path {
display:none;
}
#behat .jq-toggle > h2:after,
#behat .jq-toggle > h3:after {
content:'';
font-weight:bold;
}
#behat .jq-toggle-opened > h2:after,
#behat .jq-toggle-opened > h3:after {
content:'';
font-weight:bold;
}
#behat .scenario > ol li,
#behat .scenario .examples > ol li {
border-left:none;
}
</style>" ;
}
/**
* To include JS
*
* @return string : HTML generated
*/
public function getJS() {
return "<script type='text/javascript' src='assets/Twig/js/jquery.js'></script>
<script type='text/javascript'>
$(document).ready(function(){
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
$('#behat .feature h2').click(function(){
$(this).parent().toggleClass('jq-toggle-opened');
}).parent().addClass('jq-toggle');
$('#behat .scenario h3').click(function(){
$(this).parent().toggleClass('jq-toggle-opened');
}).parent().addClass('jq-toggle');
$('#behat_show_all').click(function(){
$('#behat .feature').addClass('jq-toggle-opened');
$('#behat .scenario').addClass('jq-toggle-opened');
});
$('#behat_hide_all').click(function(){
$('#behat .feature').removeClass('jq-toggle-opened');
$('#behat .scenario').removeClass('jq-toggle-opened');
});
$('#behat .summary .counters .scenarios .passed')
.addClass('switcher')
.click(function(){
var scenario = $('.feature .scenario:not(:has(.failed, .pending))');
var feature = scenario.parent();
$('#behat_hide_all').click();
scenario.addClass('jq-toggle-opened');
feature.addClass('jq-toggle-opened');
});
$('#behat .summary .counters .scenarios .failed')
.addClass('switcher')
.click(function(){
var scenario = $('.feature .scenario:has(.failed, .pending)');
var feature = scenario.parent();
$('#behat_hide_all').click();
scenario.addClass('jq-toggle-opened');
feature.addClass('jq-toggle-opened');
});
$('#behat .summary .counters .steps .passed')
.addClass('switcher')
.click(function(){
var scenario = $('.feature .scenario:has(.passed)');
var feature = scenario.parent();
$('#behat_hide_all').click();
scenario.addClass('jq-toggle-opened');
feature.addClass('jq-toggle-opened');
});
$('#behat .summary .counters .steps .failed')
.addClass('switcher')
.click(function(){
var scenario = $('.feature .scenario:has(.failed)');
var feature = scenario.parent();
$('#behat_hide_all').click();
scenario.addClass('jq-toggle-opened');
feature.addClass('jq-toggle-opened');
});
$('#behat .summary .counters .steps .skipped')
.addClass('switcher')
.click(function(){
var scenario = $('.feature .scenario:has(.skipped)');
var feature = scenario.parent();
$('#behat_hide_all').click();
scenario.addClass('jq-toggle-opened');
feature.addClass('jq-toggle-opened');
});
$('#behat .summary .counters .steps .pending')
.addClass('switcher')
.click(function(){
var scenario = $('.feature .scenario:has(.pending)');
var feature = scenario.parent();
$('#behat_hide_all').click();
scenario.addClass('jq-toggle-opened');
feature.addClass('jq-toggle-opened');
});
});
</script>" ;
}
}
/*!
* Bootstrap v3.3.1 (http://getbootstrap.com)
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-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.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:400;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"}*{-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:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;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{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;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:400;line-height:1;color:#777}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<